Skip to content

Instantly share code, notes, and snippets.

@kumavis
Created October 1, 2015 18:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kumavis/a781c62be5db9acd26a2 to your computer and use it in GitHub Desktop.
Save kumavis/a781c62be5db9acd26a2 to your computer and use it in GitHub Desktop.
requirebin sketch
var createGame = require('voxel-engine');
var texturePath = require('programmerart-textures')('');
var game = createGame({
texturePath: texturePath,
materials: [
['blocks/grass_top', 'blocks/dirt', 'blocks/grass_side'],
'blocks/stone',
'blocks/dirt']
});
var createPlayer = require('voxel-player')(game);
var container = document.body;
game.appendTo(container);
var player = createPlayer('player.png');
player.possess();
player.yaw.position.set(0,100,0);
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){var result=splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir};exports.basename=function(path,ext){var f=splitPath(path)[2];if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){return splitPath(path)[3]};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:2}],2:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canMutationObserver=typeof window!=="undefined"&&window.MutationObserver;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}var queue=[];if(canMutationObserver){var hiddenDiv=document.createElement("div");var observer=new MutationObserver(function(){var queueList=queue.slice();queue.length=0;queueList.forEach(function(fn){fn()})});observer.observe(hiddenDiv,{attributes:true});return function nextTick(fn){if(!queue.length){hiddenDiv.setAttribute("yes","no")}queue.push(fn)}}if(canPost){window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],"programmerart-textures":[function(require,module,exports){(function(__dirname){var path=require("path");var texturePath=__dirname+"/textures";module.exports=function(dir){return path.relative(dir,texturePath)+"/"}}).call(this,"/")},{path:1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var THREE;module.exports=function(three,image,sizeRatio){return new Skin(three,image,sizeRatio)};function Skin(three,image,opts){if(opts)opts.image=opts.image||image;else opts={image:image};if(typeof image==="object"&&!(image instanceof HTMLElement))opts=image;THREE=three;this.sizeRatio=opts.sizeRatio||8;this.scale=opts.scale||new three.Vector3(1,1,1);this.fallbackImage=opts.fallbackImage||"skin.png";this.createCanvases();this.charMaterial=this.getMaterial(this.skin,false);this.charMaterialTrans=this.getMaterial(this.skin,true);if(typeof opts.image==="string")this.fetchImage(opts.image);if(opts.image instanceof HTMLElement)this.setImage(opts.image);this.mesh=this.createPlayerObject()}Skin.prototype.createCanvases=function(){this.skinBig=document.createElement("canvas");this.skinBigContext=this.skinBig.getContext("2d");this.skinBig.width=64*this.sizeRatio;this.skinBig.height=32*this.sizeRatio;this.skin=document.createElement("canvas");this.skinContext=this.skin.getContext("2d");this.skin.width=64;this.skin.height=32};Skin.prototype.fetchImage=function(imageURL){var self=this;this.image=new Image;this.image.crossOrigin="anonymous";this.image.src=imageURL;this.image.onload=function(){self.setImage(self.image)}};Skin.prototype.setImage=function(skin){this.image=skin;this.skinContext.clearRect(0,0,64,32);this.skinContext.drawImage(skin,0,0);var imgdata=this.skinContext.getImageData(0,0,64,32);var pixels=imgdata.data;this.skinBigContext.clearRect(0,0,this.skinBig.width,this.skinBig.height);this.skinBigContext.save();var isOnecolor=true;var colorCheckAgainst=[40,0];var colorIndex=(colorCheckAgainst[0]+colorCheckAgainst[1]*64)*4;var isPixelDifferent=function(x,y){if(pixels[(x+y*64)*4+0]!==pixels[colorIndex+0]||pixels[(x+y*64)*4+1]!==pixels[colorIndex+1]||pixels[(x+y*64)*4+2]!==pixels[colorIndex+2]||pixels[(x+y*64)*4+3]!==pixels[colorIndex+3]){return true}return false};for(var i=32;i<64;i+=1){for(var j=8;j<16;j+=1){if(isPixelDifferent(i,j)){isOnecolor=false;break}}if(!isOnecolor){break}}if(!isOnecolor){for(var i=40;i<56;i+=1){for(var j=0;j<8;j+=1){if(isPixelDifferent(i,j)){isOnecolor=false;break}}if(!isOnecolor){break}}}for(var i=0;i<64;i+=1){for(var j=0;j<32;j+=1){if(isOnecolor&&(i>=32&&i<64&&j>=8&&j<16||i>=40&&i<56&&j>=0&&j<8)){pixels[(i+j*64)*4+3]=0}this.skinBigContext.fillStyle="rgba("+pixels[(i+j*64)*4+0]+", "+pixels[(i+j*64)*4+1]+", "+pixels[(i+j*64)*4+2]+", "+pixels[(i+j*64)*4+3]/255+")";this.skinBigContext.fillRect(i*this.sizeRatio,j*this.sizeRatio,this.sizeRatio,this.sizeRatio)}}this.skinBigContext.restore();this.skinContext.putImageData(imgdata,0,0);this.charMaterial.map.needsUpdate=true;this.charMaterialTrans.map.needsUpdate=true};Skin.prototype.getMaterial=function(img,transparent){var texture=new THREE.Texture(img);texture.magFilter=THREE.NearestFilter;texture.minFilter=THREE.NearestFilter;texture.format=transparent?THREE.RGBAFormat:THREE.RGBFormat;texture.needsUpdate=true;var material=new THREE.MeshBasicMaterial({map:texture,transparent:transparent?true:false});return material};Skin.prototype.UVMap=function(mesh,face,x,y,w,h,rotateBy){if(!rotateBy)rotateBy=0;var uvs=mesh.geometry.faceVertexUvs[0][face];var tileU=x;var tileV=y;var tileUvWidth=1/64;var tileUvHeight=1/32;uvs[(0+rotateBy)%4].x=tileU*tileUvWidth;uvs[(0+rotateBy)%4].y=1-tileV*tileUvHeight;uvs[(1+rotateBy)%4].x=tileU*tileUvWidth;uvs[(1+rotateBy)%4].y=1-(tileV*tileUvHeight+h*tileUvHeight);uvs[(2+rotateBy)%4].x=tileU*tileUvWidth+w*tileUvWidth;uvs[(2+rotateBy)%4].y=1-(tileV*tileUvHeight+h*tileUvHeight);uvs[(3+rotateBy)%4].x=tileU*tileUvWidth+w*tileUvWidth;uvs[(3+rotateBy)%4].y=1-tileV*tileUvHeight};Skin.prototype.cubeFromPlanes=function(size,mat){var cube=new THREE.Object3D;var meshes=[];for(var i=0;i<6;i++){var mesh=new THREE.Mesh(new THREE.PlaneGeometry(size,size),mat);mesh.doubleSided=true;cube.add(mesh);meshes.push(mesh)}meshes[0].rotation.x=Math.PI/2;meshes[0].rotation.z=-Math.PI/2;meshes[0].position.x=size/2;meshes[1].rotation.x=Math.PI/2;meshes[1].rotation.z=Math.PI/2;meshes[1].position.x=-size/2;meshes[2].position.y=size/2;meshes[3].rotation.y=Math.PI;meshes[3].rotation.z=Math.PI;meshes[3].position.y=-size/2;meshes[4].rotation.x=Math.PI/2;meshes[4].position.z=size/2;meshes[5].rotation.x=-Math.PI/2;meshes[5].rotation.y=Math.PI;meshes[5].position.z=-size/2;return cube};Skin.prototype.createPlayerObject=function(scene){var headgroup=new THREE.Object3D;var upperbody=this.upperbody=new THREE.Object3D;var leftleggeo=new THREE.CubeGeometry(4,12,4);for(var i=0;i<8;i+=1){leftleggeo.vertices[i].y-=6}var leftleg=this.leftLeg=new THREE.Mesh(leftleggeo,this.charMaterial);leftleg.position.z=-2;leftleg.position.y=-6;this.UVMap(leftleg,0,8,20,-4,12);this.UVMap(leftleg,1,16,20,-4,12);this.UVMap(leftleg,2,4,16,4,4,3);this.UVMap(leftleg,3,8,20,4,-4,1);this.UVMap(leftleg,4,12,20,-4,12);this.UVMap(leftleg,5,4,20,-4,12);var rightleggeo=new THREE.CubeGeometry(4,12,4);for(var i=0;i<8;i+=1){rightleggeo.vertices[i].y-=6}var rightleg=this.rightLeg=new THREE.Mesh(rightleggeo,this.charMaterial);rightleg.position.z=2;rightleg.position.y=-6;this.UVMap(rightleg,0,4,20,4,12);this.UVMap(rightleg,1,12,20,4,12);this.UVMap(rightleg,2,8,16,-4,4,3);this.UVMap(rightleg,3,12,20,-4,-4,1);this.UVMap(rightleg,4,0,20,4,12);this.UVMap(rightleg,5,8,20,4,12);var bodygeo=new THREE.CubeGeometry(4,12,8);var bodymesh=this.body=new THREE.Mesh(bodygeo,this.charMaterial);this.UVMap(bodymesh,0,20,20,8,12);this.UVMap(bodymesh,1,32,20,8,12);this.UVMap(bodymesh,2,20,16,8,4,1);this.UVMap(bodymesh,3,28,16,8,4,3);this.UVMap(bodymesh,4,16,20,4,12);this.UVMap(bodymesh,5,28,20,4,12);upperbody.add(bodymesh);var leftarmgeo=new THREE.CubeGeometry(4,12,4);for(var i=0;i<8;i+=1){leftarmgeo.vertices[i].y-=4}var leftarm=this.leftArm=new THREE.Mesh(leftarmgeo,this.charMaterial);leftarm.position.z=-6;leftarm.position.y=4;leftarm.rotation.x=Math.PI/32;this.UVMap(leftarm,0,48,20,-4,12);this.UVMap(leftarm,1,56,20,-4,12);this.UVMap(leftarm,2,48,16,-4,4,1);this.UVMap(leftarm,3,52,16,-4,4,3);this.UVMap(leftarm,4,52,20,-4,12);this.UVMap(leftarm,5,44,20,-4,12);upperbody.add(leftarm);var rightarmgeo=new THREE.CubeGeometry(4,12,4);for(var i=0;i<8;i+=1){rightarmgeo.vertices[i].y-=4}var rightarm=this.rightArm=new THREE.Mesh(rightarmgeo,this.charMaterial);rightarm.position.z=6;rightarm.position.y=4;rightarm.rotation.x=-Math.PI/32;this.UVMap(rightarm,0,44,20,4,12);this.UVMap(rightarm,1,52,20,4,12);this.UVMap(rightarm,2,44,16,4,4,1);this.UVMap(rightarm,3,48,16,4,4,3);this.UVMap(rightarm,4,40,20,4,12);this.UVMap(rightarm,5,48,20,4,12);upperbody.add(rightarm);var headgeo=new THREE.CubeGeometry(8,8,8);var headmesh=this.head=new THREE.Mesh(headgeo,this.charMaterial);headmesh.position.y=2;this.UVMap(headmesh,0,8,8,8,8);this.UVMap(headmesh,1,24,8,8,8);this.UVMap(headmesh,2,8,0,8,8,1);this.UVMap(headmesh,3,16,0,8,8,3);this.UVMap(headmesh,4,0,8,8,8);this.UVMap(headmesh,5,16,8,8,8);var unrotatedHeadMesh=new THREE.Object3D;unrotatedHeadMesh.rotation.y=Math.PI/2;unrotatedHeadMesh.add(headmesh);headgroup.add(unrotatedHeadMesh);var helmet=this.cubeFromPlanes(9,this.charMaterialTrans);helmet.position.y=2;this.UVMap(helmet.children[0],0,32+8,8,8,8);this.UVMap(helmet.children[1],0,32+24,8,8,8);this.UVMap(helmet.children[2],0,32+8,0,8,8,1);this.UVMap(helmet.children[3],0,32+16,0,8,8,3);this.UVMap(helmet.children[4],0,32+0,8,8,8);this.UVMap(helmet.children[5],0,32+16,8,8,8);headgroup.add(helmet);var ears=new THREE.Object3D;var eargeo=new THREE.CubeGeometry(1,9/8*6,9/8*6);var leftear=new THREE.Mesh(eargeo,this.charMaterial);var rightear=new THREE.Mesh(eargeo,this.charMaterial);leftear.position.y=2+9/8*5;rightear.position.y=2+9/8*5;leftear.position.z=-(9/8)*5;rightear.position.z=9/8*5;this.UVMap(leftear,0,25,1,6,6);this.UVMap(leftear,1,32,1,6,6);this.UVMap(leftear,2,25,0,6,1,1);this.UVMap(leftear,3,31,0,6,1,1);this.UVMap(leftear,4,24,1,1,6);this.UVMap(leftear,5,31,1,1,6);ears.add(leftear);ears.add(rightear);leftear.visible=rightear.visible=false;headgroup.add(ears);headgroup.position.y=8;var playerModel=this.playerModel=new THREE.Object3D;playerModel.add(leftleg);playerModel.add(rightleg);playerModel.add(upperbody);var playerRotation=new THREE.Object3D;playerRotation.rotation.y=Math.PI/2;playerRotation.position.y=12;playerRotation.add(playerModel);var rotatedHead=new THREE.Object3D;rotatedHead.rotation.y=-Math.PI/2;rotatedHead.add(headgroup);playerModel.add(rotatedHead);playerModel.position.y=6;var playerGroup=new THREE.Object3D;playerGroup.cameraInside=new THREE.Object3D;playerGroup.cameraOutside=new THREE.Object3D;playerGroup.cameraInside.position.x=0;playerGroup.cameraInside.position.y=2;playerGroup.cameraInside.position.z=0;playerGroup.head=headgroup;headgroup.add(playerGroup.cameraInside);playerGroup.cameraInside.add(playerGroup.cameraOutside);playerGroup.cameraOutside.position.z=100;playerGroup.add(playerRotation);playerGroup.scale=this.scale;return playerGroup}},{}],"voxel-player":[function(require,module,exports){var skin=require("minecraft-skin");module.exports=function(game){var mountPoint;var possessed;return function(img,skinOpts){if(!skinOpts){skinOpts={}}skinOpts.scale=skinOpts.scale||new game.THREE.Vector3(.04,.04,.04);var playerSkin=skin(game.THREE,img,skinOpts);var player=playerSkin.mesh;var physics=game.makePhysical(player);physics.playerSkin=playerSkin;player.position.set(0,562,-20);game.scene.add(player);game.addItem(physics);physics.yaw=player;physics.pitch=player.head;physics.subjectTo(game.gravity);physics.blocksCreation=true;game.control(physics);physics.move=function(x,y,z){var xyz=parseXYZ(x,y,z);physics.yaw.position.x+=xyz.x;physics.yaw.position.y+=xyz.y;physics.yaw.position.z+=xyz.z};physics.moveTo=function(x,y,z){var xyz=parseXYZ(x,y,z);physics.yaw.position.x=xyz.x;physics.yaw.position.y=xyz.y;physics.yaw.position.z=xyz.z};var pov=1;physics.pov=function(type){if(type==="first"||type===1){pov=1}else if(type==="third"||type===3){pov=3}physics.possess()};physics.toggle=function(){physics.pov(pov===1?3:1)};physics.possess=function(){if(possessed)possessed.remove(game.camera);var key=pov===1?"cameraInside":"cameraOutside";player[key].add(game.camera);possessed=player[key]};physics.position=physics.yaw.position;return physics}};function parseXYZ(x,y,z){if(typeof x==="object"&&Array.isArray(x)){return{x:x[0],y:x[1],z:x[2]}}else if(typeof x==="object"){return{x:x.x||0,y:x.y||0,z:x.z||0}}return{x:Number(x),y:Number(y),z:Number(z)}}},{"minecraft-skin":1}]},{},[]);require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var base64=require("base64-js");var ieee754=require("ieee754");var isArray=require("is-array");exports.Buffer=Buffer;exports.SlowBuffer=SlowBuffer;exports.INSPECT_MAX_BYTES=50;Buffer.poolSize=8192;var kMaxLength=1073741823;var rootParent={};Buffer.TYPED_ARRAY_SUPPORT=function(){try{var buf=new ArrayBuffer(0);var arr=new Uint8Array(buf);arr.foo=function(){return 42};return 42===arr.foo()&&typeof arr.subarray==="function"&&new Uint8Array(1).subarray(1,1).byteLength===0}catch(e){return false}}();function Buffer(subject,encoding,noZero){if(!(this instanceof Buffer))return new Buffer(subject,encoding,noZero);var type=typeof subject;var length;if(type==="number")length=subject>0?subject>>>0:0;else if(type==="string"){length=Buffer.byteLength(subject,encoding)}else if(type==="object"&&subject!==null){if(subject.type==="Buffer"&&isArray(subject.data))subject=subject.data;length=+subject.length>0?Math.floor(+subject.length):0}else throw new TypeError("must start with number, buffer, array or string");if(length>kMaxLength)throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+kMaxLength.toString(16)+" bytes");var buf;if(Buffer.TYPED_ARRAY_SUPPORT){buf=Buffer._augment(new Uint8Array(length))}else{buf=this;buf.length=length;buf._isBuffer=true}var i;if(Buffer.TYPED_ARRAY_SUPPORT&&typeof subject.byteLength==="number"){buf._set(subject)}else if(isArrayish(subject)){if(Buffer.isBuffer(subject)){for(i=0;i<length;i++)buf[i]=subject.readUInt8(i)}else{for(i=0;i<length;i++)buf[i]=(subject[i]%256+256)%256}}else if(type==="string"){buf.write(subject,0,encoding)}else if(type==="number"&&!Buffer.TYPED_ARRAY_SUPPORT&&!noZero){for(i=0;i<length;i++){buf[i]=0}}if(length>0&&length<=Buffer.poolSize)buf.parent=rootParent;return buf}function SlowBuffer(subject,encoding,noZero){if(!(this instanceof SlowBuffer))return new SlowBuffer(subject,encoding,noZero);var buf=new Buffer(subject,encoding,noZero);delete buf.parent;return buf}Buffer.isBuffer=function(b){return!!(b!=null&&b._isBuffer)};Buffer.compare=function(a,b){if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b))throw new TypeError("Arguments must be Buffers");var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i<len&&a[i]===b[i];i++){}if(i!==len){x=a[i];y=b[i]}if(x<y)return-1;if(y<x)return 1;return 0};Buffer.isEncoding=function(encoding){switch(String(encoding).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"raw":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return true;default:return false}};Buffer.concat=function(list,totalLength){if(!isArray(list))throw new TypeError("Usage: Buffer.concat(list[, length])");if(list.length===0){return new Buffer(0)}else if(list.length===1){return list[0]}var i;if(totalLength===undefined){totalLength=0;for(i=0;i<list.length;i++){totalLength+=list[i].length}}var buf=new Buffer(totalLength);var pos=0;for(i=0;i<list.length;i++){var item=list[i];item.copy(buf,pos);pos+=item.length}return buf};Buffer.byteLength=function(str,encoding){var ret;str=str+"";switch(encoding||"utf8"){case"ascii":case"binary":case"raw":ret=str.length;break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":ret=str.length*2;break;case"hex":ret=str.length>>>1;break;case"utf8":case"utf-8":ret=utf8ToBytes(str).length;break;case"base64":ret=base64ToBytes(str).length;break;default:ret=str.length}return ret};Buffer.prototype.length=undefined;Buffer.prototype.parent=undefined;Buffer.prototype.toString=function(encoding,start,end){var loweredCase=false;start=start>>>0;end=end===undefined||end===Infinity?this.length:end>>>0;if(!encoding)encoding="utf8";if(start<0)start=0;if(end>this.length)end=this.length;if(end<=start)return"";while(true){switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"binary":return binarySlice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase();loweredCase=true}}};Buffer.prototype.equals=function(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return Buffer.compare(this,b)===0};Buffer.prototype.inspect=function(){var str="";var max=exports.INSPECT_MAX_BYTES;if(this.length>0){str=this.toString("hex",0,max).match(/.{2}/g).join(" ");if(this.length>max)str+=" ... "}return"<Buffer "+str+">"};Buffer.prototype.compare=function(b){if(!Buffer.isBuffer(b))throw new TypeError("Argument must be a Buffer");return Buffer.compare(this,b)};Buffer.prototype.get=function(offset){console.log(".get() is deprecated. Access using array indexes instead.");return this.readUInt8(offset)};Buffer.prototype.set=function(v,offset){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(v,offset)};function hexWrite(buf,string,offset,length){offset=Number(offset)||0;var remaining=buf.length-offset;if(!length){length=remaining}else{length=Number(length);if(length>remaining){length=remaining}}var strLen=string.length;if(strLen%2!==0)throw new Error("Invalid hex string");if(length>strLen/2){length=strLen/2}for(var i=0;i<length;i++){var byte=parseInt(string.substr(i*2,2),16);if(isNaN(byte))throw new Error("Invalid hex string");buf[offset+i]=byte}return i}function utf8Write(buf,string,offset,length){var charsWritten=blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length);return charsWritten}function asciiWrite(buf,string,offset,length){var charsWritten=blitBuffer(asciiToBytes(string),buf,offset,length);return charsWritten}function binaryWrite(buf,string,offset,length){return asciiWrite(buf,string,offset,length)}function base64Write(buf,string,offset,length){var charsWritten=blitBuffer(base64ToBytes(string),buf,offset,length);return charsWritten}function utf16leWrite(buf,string,offset,length){var charsWritten=blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length,2);return charsWritten}Buffer.prototype.write=function(string,offset,length,encoding){if(isFinite(offset)){if(!isFinite(length)){encoding=length;length=undefined}}else{var swap=encoding;encoding=offset;offset=length;length=swap}offset=Number(offset)||0;if(length<0||offset<0||offset>this.length)throw new RangeError("attempt to write outside buffer bounds");var remaining=this.length-offset;if(!length){length=remaining}else{length=Number(length);if(length>remaining){length=remaining}}encoding=String(encoding||"utf8").toLowerCase();var ret;switch(encoding){case"hex":ret=hexWrite(this,string,offset,length);break;case"utf8":case"utf-8":ret=utf8Write(this,string,offset,length);break;case"ascii":ret=asciiWrite(this,string,offset,length);break;case"binary":ret=binaryWrite(this,string,offset,length);break;case"base64":ret=base64Write(this,string,offset,length);break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":ret=utf16leWrite(this,string,offset,length);break;default:throw new TypeError("Unknown encoding: "+encoding)}return ret};Buffer.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){var res="";var tmp="";end=Math.min(buf.length,end);for(var i=start;i<end;i++){if(buf[i]<=127){res+=decodeUtf8Char(tmp)+String.fromCharCode(buf[i]);tmp=""}else{tmp+="%"+buf[i].toString(16)}}return res+decodeUtf8Char(tmp)}function asciiSlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;i++){ret+=String.fromCharCode(buf[i]&127)}return ret}function binarySlice(buf,start,end){var ret="";end=Math.min(buf.length,end);for(var i=start;i<end;i++){ret+=String.fromCharCode(buf[i])}return ret}function hexSlice(buf,start,end){var len=buf.length;if(!start||start<0)start=0;if(!end||end<0||end>len)end=len;var out="";for(var i=start;i<end;i++){out+=toHex(buf[i])}return out}function utf16leSlice(buf,start,end){var bytes=buf.slice(start,end);var res="";for(var i=0;i<bytes.length;i+=2){res+=String.fromCharCode(bytes[i]+bytes[i+1]*256)}return res}Buffer.prototype.slice=function(start,end){var len=this.length;start=~~start;end=end===undefined?len:~~end;if(start<0){start+=len;if(start<0)start=0}else if(start>len){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(end<start)end=start;var newBuf;if(Buffer.TYPED_ARRAY_SUPPORT){newBuf=Buffer._augment(this.subarray(start,end))}else{var sliceLen=end-start;newBuf=new Buffer(sliceLen,undefined,true);for(var i=0;i<sliceLen;i++){newBuf[i]=this[i+start]}}if(newBuf.length)newBuf.parent=this.parent||this;return newBuf};function checkOffset(offset,ext,length){if(offset%1!==0||offset<0)throw new RangeError("offset is not uint");if(offset+ext>length)throw new RangeError("Trying to access beyond buffer length")}Buffer.prototype.readUIntLE=function(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i<byteLength&&(mul*=256))val+=this[offset+i]*mul;return val};Buffer.prototype.readUIntBE=function(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset+--byteLength];var mul=1;while(byteLength>0&&(mul*=256))val+=this[offset+--byteLength]*mul;return val};Buffer.prototype.readUInt8=function(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i<byteLength&&(mul*=256))val+=this[offset+i]*mul;mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256))val+=this[offset+--i]*mul;mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function(offset,noAssert){if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function(offset,noAssert){if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function(offset,noAssert){if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function(offset,noAssert){if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError("buffer must be a Buffer instance");if(value>max||value<min)throw new RangeError("value is out of bounds");if(offset+ext>buf.length)throw new RangeError("index out of range")}Buffer.prototype.writeUIntLE=function(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkInt(this,value,offset,byteLength,Math.pow(2,8*byteLength),0);var mul=1;var i=0;this[offset]=value&255;while(++i<byteLength&&(mul*=256))this[offset+i]=value/mul>>>0&255;return offset+byteLength};Buffer.prototype.writeUIntBE=function(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkInt(this,value,offset,byteLength,Math.pow(2,8*byteLength),0);var i=byteLength-1;var mul=1;this[offset+i]=value&255;while(--i>=0&&(mul*=256))this[offset+i]=value/mul>>>0&255;return offset+byteLength};Buffer.prototype.writeUInt8=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,1,255,0);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);this[offset]=value;return offset+1};function objectWriteUInt16(buf,value,offset,littleEndian){if(value<0)value=65535+value+1;for(var i=0,j=Math.min(buf.length-offset,2);i<j;i++){buf[offset+i]=(value&255<<8*(littleEndian?i:1-i))>>>(littleEndian?i:1-i)*8}}Buffer.prototype.writeUInt16LE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value;this[offset+1]=value>>>8}else objectWriteUInt16(this,value,offset,true);return offset+2};Buffer.prototype.writeUInt16BE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,65535,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value}else objectWriteUInt16(this,value,offset,false);return offset+2};function objectWriteUInt32(buf,value,offset,littleEndian){if(value<0)value=4294967295+value+1;for(var i=0,j=Math.min(buf.length-offset,4);i<j;i++){buf[offset+i]=value>>>(littleEndian?i:3-i)*8&255}}Buffer.prototype.writeUInt32LE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value}else objectWriteUInt32(this,value,offset,true);return offset+4};Buffer.prototype.writeUInt32BE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;
this[offset+3]=value}else objectWriteUInt32(this,value,offset,false);return offset+4};Buffer.prototype.writeIntLE=function(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;if(!noAssert){checkInt(this,value,offset,byteLength,Math.pow(2,8*byteLength-1)-1,-Math.pow(2,8*byteLength-1))}var i=0;var mul=1;var sub=value<0?1:0;this[offset]=value&255;while(++i<byteLength&&(mul*=256))this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength};Buffer.prototype.writeIntBE=function(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;if(!noAssert){checkInt(this,value,offset,byteLength,Math.pow(2,8*byteLength-1)-1,-Math.pow(2,8*byteLength-1))}var i=byteLength-1;var mul=1;var sub=value<0?1:0;this[offset+i]=value&255;while(--i>=0&&(mul*=256))this[offset+i]=(value/mul>>0)-sub&255;return offset+byteLength};Buffer.prototype.writeInt8=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(!Buffer.TYPED_ARRAY_SUPPORT)value=Math.floor(value);if(value<0)value=255+value+1;this[offset]=value;return offset+1};Buffer.prototype.writeInt16LE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value;this[offset+1]=value>>>8}else objectWriteUInt16(this,value,offset,true);return offset+2};Buffer.prototype.writeInt16BE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>8;this[offset+1]=value}else objectWriteUInt16(this,value,offset,false);return offset+2};Buffer.prototype.writeInt32LE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24}else objectWriteUInt32(this,value,offset,true);return offset+4};Buffer.prototype.writeInt32BE=function(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;if(Buffer.TYPED_ARRAY_SUPPORT){this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value}else objectWriteUInt32(this,value,offset,false);return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(value>max||value<min)throw new RangeError("value is out of bounds");if(offset+ext>buf.length)throw new RangeError("index out of range");if(offset<0)throw new RangeError("index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){if(!noAssert)checkIEEE754(buf,value,offset,4,3.4028234663852886e38,-3.4028234663852886e38);ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){if(!noAssert)checkIEEE754(buf,value,offset,8,1.7976931348623157e308,-1.7976931348623157e308);ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function(target,target_start,start,end){var source=this;if(!start)start=0;if(!end&&end!==0)end=this.length;if(target_start>=target.length)target_start=target.length;if(!target_start)target_start=0;if(end>0&&end<start)end=start;if(end===start)return 0;if(target.length===0||source.length===0)return 0;if(target_start<0)throw new RangeError("targetStart out of bounds");if(start<0||start>=source.length)throw new RangeError("sourceStart out of bounds");if(end<0)throw new RangeError("sourceEnd out of bounds");if(end>this.length)end=this.length;if(target.length-target_start<end-start)end=target.length-target_start+start;var len=end-start;if(len<1e3||!Buffer.TYPED_ARRAY_SUPPORT){for(var i=0;i<len;i++){target[i+target_start]=this[i+start]}}else{target._set(this.subarray(start,start+len),target_start)}return len};Buffer.prototype.fill=function(value,start,end){if(!value)value=0;if(!start)start=0;if(!end)end=this.length;if(end<start)throw new RangeError("end < start");if(end===start)return;if(this.length===0)return;if(start<0||start>=this.length)throw new RangeError("start out of bounds");if(end<0||end>this.length)throw new RangeError("end out of bounds");var i;if(typeof value==="number"){for(i=start;i<end;i++){this[i]=value}}else{var bytes=utf8ToBytes(value.toString());var len=bytes.length;for(i=start;i<end;i++){this[i]=bytes[i%len]}}return this};Buffer.prototype.toArrayBuffer=function(){if(typeof Uint8Array!=="undefined"){if(Buffer.TYPED_ARRAY_SUPPORT){return new Buffer(this).buffer}else{var buf=new Uint8Array(this.length);for(var i=0,len=buf.length;i<len;i+=1){buf[i]=this[i]}return buf.buffer}}else{throw new TypeError("Buffer.toArrayBuffer not supported in this browser")}};var BP=Buffer.prototype;Buffer._augment=function(arr){arr.constructor=Buffer;arr._isBuffer=true;arr._get=arr.get;arr._set=arr.set;arr.get=BP.get;arr.set=BP.set;arr.write=BP.write;arr.toString=BP.toString;arr.toLocaleString=BP.toString;arr.toJSON=BP.toJSON;arr.equals=BP.equals;arr.compare=BP.compare;arr.copy=BP.copy;arr.slice=BP.slice;arr.readUIntLE=BP.readUIntLE;arr.readUIntBE=BP.readUIntBE;arr.readUInt8=BP.readUInt8;arr.readUInt16LE=BP.readUInt16LE;arr.readUInt16BE=BP.readUInt16BE;arr.readUInt32LE=BP.readUInt32LE;arr.readUInt32BE=BP.readUInt32BE;arr.readIntLE=BP.readIntLE;arr.readIntBE=BP.readIntBE;arr.readInt8=BP.readInt8;arr.readInt16LE=BP.readInt16LE;arr.readInt16BE=BP.readInt16BE;arr.readInt32LE=BP.readInt32LE;arr.readInt32BE=BP.readInt32BE;arr.readFloatLE=BP.readFloatLE;arr.readFloatBE=BP.readFloatBE;arr.readDoubleLE=BP.readDoubleLE;arr.readDoubleBE=BP.readDoubleBE;arr.writeUInt8=BP.writeUInt8;arr.writeUIntLE=BP.writeUIntLE;arr.writeUIntBE=BP.writeUIntBE;arr.writeUInt16LE=BP.writeUInt16LE;arr.writeUInt16BE=BP.writeUInt16BE;arr.writeUInt32LE=BP.writeUInt32LE;arr.writeUInt32BE=BP.writeUInt32BE;arr.writeIntLE=BP.writeIntLE;arr.writeIntBE=BP.writeIntBE;arr.writeInt8=BP.writeInt8;arr.writeInt16LE=BP.writeInt16LE;arr.writeInt16BE=BP.writeInt16BE;arr.writeInt32LE=BP.writeInt32LE;arr.writeInt32BE=BP.writeInt32BE;arr.writeFloatLE=BP.writeFloatLE;arr.writeFloatBE=BP.writeFloatBE;arr.writeDoubleLE=BP.writeDoubleLE;arr.writeDoubleBE=BP.writeDoubleBE;arr.fill=BP.fill;arr.inspect=BP.inspect;arr.toArrayBuffer=BP.toArrayBuffer;return arr};var INVALID_BASE64_RE=/[^+\/0-9A-z\-]/g;function base64clean(str){str=stringtrim(str).replace(INVALID_BASE64_RE,"");if(str.length<2)return"";while(str.length%4!==0){str=str+"="}return str}function stringtrim(str){if(str.trim)return str.trim();return str.replace(/^\s+|\s+$/g,"")}function isArrayish(subject){return isArray(subject)||Buffer.isBuffer(subject)||subject&&typeof subject==="object"&&typeof subject.length==="number"}function toHex(n){if(n<16)return"0"+n.toString(16);return n.toString(16)}function utf8ToBytes(string,units){var codePoint,length=string.length;var leadSurrogate=null;units=units||Infinity;var bytes=[];var i=0;for(;i<length;i++){codePoint=string.charCodeAt(i);if(codePoint>55295&&codePoint<57344){if(leadSurrogate){if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}else{codePoint=leadSurrogate-55296<<10|codePoint-56320|65536;leadSurrogate=null}}else{if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}else{leadSurrogate=codePoint;continue}}}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=null}if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<2097152){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i<str.length;i++){byteArray.push(str.charCodeAt(i)&255)}return byteArray}function utf16leToBytes(str,units){var c,hi,lo;var byteArray=[];for(var i=0;i<str.length;i++){if((units-=2)<0)break;c=str.charCodeAt(i);hi=c>>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length,unitSize){if(unitSize)length-=length%unitSize;for(var i=0;i<length;i++){if(i+offset>=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function decodeUtf8Char(str){try{return decodeURIComponent(str)}catch(err){return String.fromCharCode(65533)}}},{"base64-js":2,ieee754:3,"is-array":4}],2:[function(require,module,exports){var lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";(function(exports){"use strict";var Arr=typeof Uint8Array!=="undefined"?Uint8Array:Array;var PLUS="+".charCodeAt(0);var SLASH="/".charCodeAt(0);var NUMBER="0".charCodeAt(0);var LOWER="a".charCodeAt(0);var UPPER="A".charCodeAt(0);var PLUS_URL_SAFE="-".charCodeAt(0);var SLASH_URL_SAFE="_".charCodeAt(0);function decode(elt){var code=elt.charCodeAt(0);if(code===PLUS||code===PLUS_URL_SAFE)return 62;if(code===SLASH||code===SLASH_URL_SAFE)return 63;if(code<NUMBER)return-1;if(code<NUMBER+10)return code-NUMBER+26+26;if(code<UPPER+26)return code-UPPER;if(code<LOWER+26)return code-LOWER+26}function b64ToByteArray(b64){var i,j,l,tmp,placeHolders,arr;if(b64.length%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}var len=b64.length;placeHolders="="===b64.charAt(len-2)?2:"="===b64.charAt(len-1)?1:0;arr=new Arr(b64.length*3/4-placeHolders);l=placeHolders>0?b64.length-4:b64.length;var L=0;function push(v){arr[L++]=v}for(i=0,j=0;i<l;i+=4,j+=3){tmp=decode(b64.charAt(i))<<18|decode(b64.charAt(i+1))<<12|decode(b64.charAt(i+2))<<6|decode(b64.charAt(i+3));push((tmp&16711680)>>16);push((tmp&65280)>>8);push(tmp&255)}if(placeHolders===2){tmp=decode(b64.charAt(i))<<2|decode(b64.charAt(i+1))>>4;push(tmp&255)}else if(placeHolders===1){tmp=decode(b64.charAt(i))<<10|decode(b64.charAt(i+1))<<4|decode(b64.charAt(i+2))>>2;push(tmp>>8&255);push(tmp&255)}return arr}function uint8ToBase64(uint8){var i,extraBytes=uint8.length%3,output="",temp,length;function encode(num){return lookup.charAt(num)}function tripletToBase64(num){return encode(num>>18&63)+encode(num>>12&63)+encode(num>>6&63)+encode(num&63)}for(i=0,length=uint8.length-extraBytes;i<length;i+=3){temp=(uint8[i]<<16)+(uint8[i+1]<<8)+uint8[i+2];output+=tripletToBase64(temp)}switch(extraBytes){case 1:temp=uint8[uint8.length-1];output+=encode(temp>>2);output+=encode(temp<<4&63);output+="==";break;case 2:temp=(uint8[uint8.length-2]<<8)+uint8[uint8.length-1];output+=encode(temp>>10);output+=encode(temp>>4&63);output+=encode(temp<<2&63);output+="=";break}return output}exports.toByteArray=b64ToByteArray;exports.fromByteArray=uint8ToBase64})(typeof exports==="undefined"?this.base64js={}:exports)},{}],3:[function(require,module,exports){exports.read=function(buffer,offset,isLE,mLen,nBytes){var e,m,eLen=nBytes*8-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,nBits=-7,i=isLE?nBytes-1:0,d=isLE?-1:1,s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8);m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8);if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c,eLen=nBytes*8-mLen-1,eMax=(1<<eLen)-1,eBias=eMax>>1,rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0,i=isLE?0:nBytes-1,d=isLE?1:-1,s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8);e=e<<mLen|m;eLen+=mLen;for(;eLen>0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8);buffer[offset+i-d]|=s*128}},{}],4:[function(require,module,exports){var isArray=Array.isArray;var str=Object.prototype.toString;module.exports=isArray||function(val){return!!val&&"[object Array]"==str.call(val)}},{}],5:[function(require,module,exports){function EventEmitter(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;EventEmitter.defaultMaxListeners=10;EventEmitter.prototype.setMaxListeners=function(n){if(!isNumber(n)||n<0||isNaN(n))throw TypeError("n must be a positive number");this._maxListeners=n;return this};EventEmitter.prototype.emit=function(type){var er,handler,len,args,i,listeners;if(!this._events)this._events={};if(type==="error"){if(!this._events.error||isObject(this._events.error)&&!this._events.error.length){er=arguments[1];if(er instanceof Error){throw er}throw TypeError('Uncaught, unspecified "error" event.')}}handler=this._events[type];if(isUndefined(handler))return false;if(isFunction(handler)){switch(arguments.length){case 1:handler.call(this);break;case 2:handler.call(this,arguments[1]);break;case 3:handler.call(this,arguments[1],arguments[2]);break;default:len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];handler.apply(this,args)}}else if(isObject(handler)){len=arguments.length;args=new Array(len-1);for(i=1;i<len;i++)args[i-1]=arguments[i];listeners=handler.slice();len=listeners.length;for(i=0;i<len;i++)listeners[i].apply(this,args)}return true};EventEmitter.prototype.addListener=function(type,listener){var m;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events)this._events={};if(this._events.newListener)this.emit("newListener",type,isFunction(listener.listener)?listener.listener:listener);if(!this._events[type])this._events[type]=listener;else if(isObject(this._events[type]))this._events[type].push(listener);else this._events[type]=[this._events[type],listener];if(isObject(this._events[type])&&!this._events[type].warned){var m;if(!isUndefined(this._maxListeners)){m=this._maxListeners}else{m=EventEmitter.defaultMaxListeners}if(m&&m>0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-->0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else{while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.listenerCount=function(emitter,type){var ret;if(!emitter._events||!emitter._events[type])ret=0;else if(isFunction(emitter._events[type]))ret=1;else ret=emitter._events[type].length;return ret};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],6:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],7:[function(require,module,exports){module.exports=Array.isArray||function(arr){return Object.prototype.toString.call(arr)=="[object Array]"}},{}],8:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){var result=splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir};exports.basename=function(path,ext){var f=splitPath(path)[2];if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){return splitPath(path)[3]};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:9}],9:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canMutationObserver=typeof window!=="undefined"&&window.MutationObserver;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}var queue=[];if(canMutationObserver){var hiddenDiv=document.createElement("div");var observer=new MutationObserver(function(){var queueList=queue.slice();queue.length=0;queueList.forEach(function(fn){fn()})});observer.observe(hiddenDiv,{attributes:true});return function nextTick(fn){if(!queue.length){hiddenDiv.setAttribute("yes","no")}queue.push(fn)}}if(canPost){window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],10:[function(require,module,exports){module.exports=require("./lib/_stream_duplex.js")},{"./lib/_stream_duplex.js":11}],11:[function(require,module,exports){(function(process){module.exports=Duplex;var objectKeys=Object.keys||function(obj){var keys=[];for(var key in obj)keys.push(key);return keys};var util=require("core-util-is");util.inherits=require("inherits");var Readable=require("./_stream_readable");var Writable=require("./_stream_writable");util.inherits(Duplex,Readable);forEach(objectKeys(Writable.prototype),function(method){if(!Duplex.prototype[method])Duplex.prototype[method]=Writable.prototype[method]});function Duplex(options){if(!(this instanceof Duplex))return new Duplex(options);Readable.call(this,options);Writable.call(this,options);if(options&&options.readable===false)this.readable=false;if(options&&options.writable===false)this.writable=false;this.allowHalfOpen=true;if(options&&options.allowHalfOpen===false)this.allowHalfOpen=false;this.once("end",onend)}function onend(){if(this.allowHalfOpen||this._writableState.ended)return;process.nextTick(this.end.bind(this))}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++){f(xs[i],i)}}}).call(this,require("_process"))},{"./_stream_readable":13,"./_stream_writable":15,_process:9,"core-util-is":16,inherits:6}],12:[function(require,module,exports){module.exports=PassThrough;var Transform=require("./_stream_transform");var util=require("core-util-is");util.inherits=require("inherits");util.inherits(PassThrough,Transform);function PassThrough(options){if(!(this instanceof PassThrough))return new PassThrough(options);Transform.call(this,options)}PassThrough.prototype._transform=function(chunk,encoding,cb){cb(null,chunk)}},{"./_stream_transform":14,"core-util-is":16,inherits:6}],13:[function(require,module,exports){(function(process){module.exports=Readable;var isArray=require("isarray");var Buffer=require("buffer").Buffer;Readable.ReadableState=ReadableState;var EE=require("events").EventEmitter;if(!EE.listenerCount)EE.listenerCount=function(emitter,type){return emitter.listeners(type).length};var Stream=require("stream");var util=require("core-util-is");util.inherits=require("inherits");var StringDecoder;util.inherits(Readable,Stream);function ReadableState(options,stream){options=options||{};var hwm=options.highWaterMark;this.highWaterMark=hwm||hwm===0?hwm:16*1024;this.highWaterMark=~~this.highWaterMark;this.buffer=[];this.length=0;this.pipes=null;this.pipesCount=0;this.flowing=false;this.ended=false;this.endEmitted=false;this.reading=false;this.calledRead=false;this.sync=true;this.needReadable=false;this.emittedReadable=false;this.readableListening=false;this.objectMode=!!options.objectMode;this.defaultEncoding=options.defaultEncoding||"utf8";this.ranOut=false;this.awaitDrain=0;this.readingMore=false;this.decoder=null;this.encoding=null;if(options.encoding){if(!StringDecoder)StringDecoder=require("string_decoder/").StringDecoder;this.decoder=new StringDecoder(options.encoding);this.encoding=options.encoding}}function Readable(options){if(!(this instanceof Readable))return new Readable(options);this._readableState=new ReadableState(options,this);this.readable=true;Stream.call(this)}Readable.prototype.push=function(chunk,encoding){var state=this._readableState;if(typeof chunk==="string"&&!state.objectMode){encoding=encoding||state.defaultEncoding;if(encoding!==state.encoding){chunk=new Buffer(chunk,encoding);encoding=""}}return readableAddChunk(this,state,chunk,encoding,false)};Readable.prototype.unshift=function(chunk){var state=this._readableState;return readableAddChunk(this,state,chunk,"",true)};function readableAddChunk(stream,state,chunk,encoding,addToFront){var er=chunkInvalid(state,chunk);if(er){stream.emit("error",er)}else if(chunk===null||chunk===undefined){state.reading=false;if(!state.ended)onEofChunk(stream,state)}else if(state.objectMode||chunk&&chunk.length>0){if(state.ended&&!addToFront){var e=new Error("stream.push() after EOF");stream.emit("error",e)}else if(state.endEmitted&&addToFront){var e=new Error("stream.unshift() after end event");stream.emit("error",e)}else{if(state.decoder&&!addToFront&&!encoding)chunk=state.decoder.write(chunk);state.length+=state.objectMode?1:chunk.length;if(addToFront){state.buffer.unshift(chunk)}else{state.reading=false;state.buffer.push(chunk)}if(state.needReadable)emitReadable(stream);maybeReadMore(stream,state)}}else if(!addToFront){state.reading=false}return needMoreData(state)}function needMoreData(state){return!state.ended&&(state.needReadable||state.length<state.highWaterMark||state.length===0)}Readable.prototype.setEncoding=function(enc){if(!StringDecoder)StringDecoder=require("string_decoder/").StringDecoder;this._readableState.decoder=new StringDecoder(enc);this._readableState.encoding=enc};var MAX_HWM=8388608;function roundUpToNextPowerOf2(n){if(n>=MAX_HWM){n=MAX_HWM}else{n--;for(var p=1;p<32;p<<=1)n|=n>>p;n++}return n}function howMuchToRead(n,state){if(state.length===0&&state.ended)return 0;if(state.objectMode)return n===0?0:1;if(n===null||isNaN(n)){if(state.flowing&&state.buffer.length)return state.buffer[0].length;else return state.length}if(n<=0)return 0;if(n>state.highWaterMark)state.highWaterMark=roundUpToNextPowerOf2(n);if(n>state.length){if(!state.ended){state.needReadable=true;return 0}else return state.length}return n}Readable.prototype.read=function(n){var state=this._readableState;state.calledRead=true;var nOrig=n;var ret;if(typeof n!=="number"||n>0)state.emittedReadable=false;if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){emitReadable(this);return null}n=howMuchToRead(n,state);if(n===0&&state.ended){ret=null;if(state.length>0&&state.decoder){ret=fromList(n,state);state.length-=ret.length}if(state.length===0)endReadable(this);return ret}var doRead=state.needReadable;if(state.length-n<=state.highWaterMark)doRead=true;if(state.ended||state.reading)doRead=false;if(doRead){state.reading=true;state.sync=true;if(state.length===0)state.needReadable=true;this._read(state.highWaterMark);state.sync=false}if(doRead&&!state.reading)n=howMuchToRead(nOrig,state);if(n>0)ret=fromList(n,state);else ret=null;if(ret===null){state.needReadable=true;n=0}state.length-=n;if(state.length===0&&!state.ended)state.needReadable=true;if(state.ended&&!state.endEmitted&&state.length===0)endReadable(this);return ret};function chunkInvalid(state,chunk){var er=null;if(!Buffer.isBuffer(chunk)&&"string"!==typeof chunk&&chunk!==null&&chunk!==undefined&&!state.objectMode){er=new TypeError("Invalid non-string/buffer chunk")}return er}function onEofChunk(stream,state){if(state.decoder&&!state.ended){var chunk=state.decoder.end();if(chunk&&chunk.length){state.buffer.push(chunk);state.length+=state.objectMode?1:chunk.length}}state.ended=true;if(state.length>0)emitReadable(stream);else endReadable(stream)}function emitReadable(stream){var state=stream._readableState;state.needReadable=false;if(state.emittedReadable)return;state.emittedReadable=true;if(state.sync)process.nextTick(function(){emitReadable_(stream)});else emitReadable_(stream)}function emitReadable_(stream){stream.emit("readable")}function maybeReadMore(stream,state){if(!state.readingMore){state.readingMore=true;process.nextTick(function(){maybeReadMore_(stream,state)})}}function maybeReadMore_(stream,state){var len=state.length;while(!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark){stream.read(0);if(len===state.length)break;else len=state.length}state.readingMore=false}Readable.prototype._read=function(n){this.emit("error",new Error("not implemented"))};Readable.prototype.pipe=function(dest,pipeOpts){var src=this;var state=this._readableState;switch(state.pipesCount){case 0:state.pipes=dest;break;case 1:state.pipes=[state.pipes,dest];break;default:state.pipes.push(dest);break}state.pipesCount+=1;var doEnd=(!pipeOpts||pipeOpts.end!==false)&&dest!==process.stdout&&dest!==process.stderr;var endFn=doEnd?onend:cleanup;if(state.endEmitted)process.nextTick(endFn);else src.once("end",endFn);dest.on("unpipe",onunpipe);function onunpipe(readable){if(readable!==src)return;cleanup()}function onend(){dest.end()}var ondrain=pipeOnDrain(src);dest.on("drain",ondrain);function cleanup(){dest.removeListener("close",onclose);dest.removeListener("finish",onfinish);dest.removeListener("drain",ondrain);dest.removeListener("error",onerror);dest.removeListener("unpipe",onunpipe);src.removeListener("end",onend);src.removeListener("end",cleanup);if(!dest._writableState||dest._writableState.needDrain)ondrain()}function onerror(er){unpipe();dest.removeListener("error",onerror);if(EE.listenerCount(dest,"error")===0)dest.emit("error",er)}if(!dest._events||!dest._events.error)dest.on("error",onerror);else if(isArray(dest._events.error))dest._events.error.unshift(onerror);else dest._events.error=[onerror,dest._events.error];function onclose(){dest.removeListener("finish",onfinish);
unpipe()}dest.once("close",onclose);function onfinish(){dest.removeListener("close",onclose);unpipe()}dest.once("finish",onfinish);function unpipe(){src.unpipe(dest)}dest.emit("pipe",src);if(!state.flowing){this.on("readable",pipeOnReadable);state.flowing=true;process.nextTick(function(){flow(src)})}return dest};function pipeOnDrain(src){return function(){var dest=this;var state=src._readableState;state.awaitDrain--;if(state.awaitDrain===0)flow(src)}}function flow(src){var state=src._readableState;var chunk;state.awaitDrain=0;function write(dest,i,list){var written=dest.write(chunk);if(false===written){state.awaitDrain++}}while(state.pipesCount&&null!==(chunk=src.read())){if(state.pipesCount===1)write(state.pipes,0,null);else forEach(state.pipes,write);src.emit("data",chunk);if(state.awaitDrain>0)return}if(state.pipesCount===0){state.flowing=false;if(EE.listenerCount(src,"data")>0)emitDataEvents(src);return}state.ranOut=true}function pipeOnReadable(){if(this._readableState.ranOut){this._readableState.ranOut=false;flow(this)}}Readable.prototype.unpipe=function(dest){var state=this._readableState;if(state.pipesCount===0)return this;if(state.pipesCount===1){if(dest&&dest!==state.pipes)return this;if(!dest)dest=state.pipes;state.pipes=null;state.pipesCount=0;this.removeListener("readable",pipeOnReadable);state.flowing=false;if(dest)dest.emit("unpipe",this);return this}if(!dest){var dests=state.pipes;var len=state.pipesCount;state.pipes=null;state.pipesCount=0;this.removeListener("readable",pipeOnReadable);state.flowing=false;for(var i=0;i<len;i++)dests[i].emit("unpipe",this);return this}var i=indexOf(state.pipes,dest);if(i===-1)return this;state.pipes.splice(i,1);state.pipesCount-=1;if(state.pipesCount===1)state.pipes=state.pipes[0];dest.emit("unpipe",this);return this};Readable.prototype.on=function(ev,fn){var res=Stream.prototype.on.call(this,ev,fn);if(ev==="data"&&!this._readableState.flowing)emitDataEvents(this);if(ev==="readable"&&this.readable){var state=this._readableState;if(!state.readableListening){state.readableListening=true;state.emittedReadable=false;state.needReadable=true;if(!state.reading){this.read(0)}else if(state.length){emitReadable(this,state)}}}return res};Readable.prototype.addListener=Readable.prototype.on;Readable.prototype.resume=function(){emitDataEvents(this);this.read(0);this.emit("resume")};Readable.prototype.pause=function(){emitDataEvents(this,true);this.emit("pause")};function emitDataEvents(stream,startPaused){var state=stream._readableState;if(state.flowing){throw new Error("Cannot switch to old mode now.")}var paused=startPaused||false;var readable=false;stream.readable=true;stream.pipe=Stream.prototype.pipe;stream.on=stream.addListener=Stream.prototype.on;stream.on("readable",function(){readable=true;var c;while(!paused&&null!==(c=stream.read()))stream.emit("data",c);if(c===null){readable=false;stream._readableState.needReadable=true}});stream.pause=function(){paused=true;this.emit("pause")};stream.resume=function(){paused=false;if(readable)process.nextTick(function(){stream.emit("readable")});else this.read(0);this.emit("resume")};stream.emit("readable")}Readable.prototype.wrap=function(stream){var state=this._readableState;var paused=false;var self=this;stream.on("end",function(){if(state.decoder&&!state.ended){var chunk=state.decoder.end();if(chunk&&chunk.length)self.push(chunk)}self.push(null)});stream.on("data",function(chunk){if(state.decoder)chunk=state.decoder.write(chunk);if(state.objectMode&&(chunk===null||chunk===undefined))return;else if(!state.objectMode&&(!chunk||!chunk.length))return;var ret=self.push(chunk);if(!ret){paused=true;stream.pause()}});for(var i in stream){if(typeof stream[i]==="function"&&typeof this[i]==="undefined"){this[i]=function(method){return function(){return stream[method].apply(stream,arguments)}}(i)}}var events=["error","close","destroy","pause","resume"];forEach(events,function(ev){stream.on(ev,self.emit.bind(self,ev))});self._read=function(n){if(paused){paused=false;stream.resume()}};return self};Readable._fromList=fromList;function fromList(n,state){var list=state.buffer;var length=state.length;var stringMode=!!state.decoder;var objectMode=!!state.objectMode;var ret;if(list.length===0)return null;if(length===0)ret=null;else if(objectMode)ret=list.shift();else if(!n||n>=length){if(stringMode)ret=list.join("");else ret=Buffer.concat(list,length);list.length=0}else{if(n<list[0].length){var buf=list[0];ret=buf.slice(0,n);list[0]=buf.slice(n)}else if(n===list[0].length){ret=list.shift()}else{if(stringMode)ret="";else ret=new Buffer(n);var c=0;for(var i=0,l=list.length;i<l&&c<n;i++){var buf=list[0];var cpy=Math.min(n-c,buf.length);if(stringMode)ret+=buf.slice(0,cpy);else buf.copy(ret,c,0,cpy);if(cpy<buf.length)list[0]=buf.slice(cpy);else list.shift();c+=cpy}}}return ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error("endReadable called on non-empty stream");if(!state.endEmitted&&state.calledRead){state.ended=true;process.nextTick(function(){if(!state.endEmitted&&state.length===0){state.endEmitted=true;stream.readable=false;stream.emit("end")}})}}function forEach(xs,f){for(var i=0,l=xs.length;i<l;i++){f(xs[i],i)}}function indexOf(xs,x){for(var i=0,l=xs.length;i<l;i++){if(xs[i]===x)return i}return-1}}).call(this,require("_process"))},{_process:9,buffer:1,"core-util-is":16,events:5,inherits:6,isarray:7,stream:21,"string_decoder/":22}],14:[function(require,module,exports){module.exports=Transform;var Duplex=require("./_stream_duplex");var util=require("core-util-is");util.inherits=require("inherits");util.inherits(Transform,Duplex);function TransformState(options,stream){this.afterTransform=function(er,data){return afterTransform(stream,er,data)};this.needTransform=false;this.transforming=false;this.writecb=null;this.writechunk=null}function afterTransform(stream,er,data){var ts=stream._transformState;ts.transforming=false;var cb=ts.writecb;if(!cb)return stream.emit("error",new Error("no writecb in Transform class"));ts.writechunk=null;ts.writecb=null;if(data!==null&&data!==undefined)stream.push(data);if(cb)cb(er);var rs=stream._readableState;rs.reading=false;if(rs.needReadable||rs.length<rs.highWaterMark){stream._read(rs.highWaterMark)}}function Transform(options){if(!(this instanceof Transform))return new Transform(options);Duplex.call(this,options);var ts=this._transformState=new TransformState(options,this);var stream=this;this._readableState.needReadable=true;this._readableState.sync=false;this.once("finish",function(){if("function"===typeof this._flush)this._flush(function(er){done(stream,er)});else done(stream)})}Transform.prototype.push=function(chunk,encoding){this._transformState.needTransform=false;return Duplex.prototype.push.call(this,chunk,encoding)};Transform.prototype._transform=function(chunk,encoding,cb){throw new Error("not implemented")};Transform.prototype._write=function(chunk,encoding,cb){var ts=this._transformState;ts.writecb=cb;ts.writechunk=chunk;ts.writeencoding=encoding;if(!ts.transforming){var rs=this._readableState;if(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)this._read(rs.highWaterMark)}};Transform.prototype._read=function(n){var ts=this._transformState;if(ts.writechunk!==null&&ts.writecb&&!ts.transforming){ts.transforming=true;this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform)}else{ts.needTransform=true}};function done(stream,er){if(er)return stream.emit("error",er);var ws=stream._writableState;var rs=stream._readableState;var ts=stream._transformState;if(ws.length)throw new Error("calling transform done when ws.length != 0");if(ts.transforming)throw new Error("calling transform done when still transforming");return stream.push(null)}},{"./_stream_duplex":11,"core-util-is":16,inherits:6}],15:[function(require,module,exports){(function(process){module.exports=Writable;var Buffer=require("buffer").Buffer;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var Stream=require("stream");util.inherits(Writable,Stream);function WriteReq(chunk,encoding,cb){this.chunk=chunk;this.encoding=encoding;this.callback=cb}function WritableState(options,stream){options=options||{};var hwm=options.highWaterMark;this.highWaterMark=hwm||hwm===0?hwm:16*1024;this.objectMode=!!options.objectMode;this.highWaterMark=~~this.highWaterMark;this.needDrain=false;this.ending=false;this.ended=false;this.finished=false;var noDecode=options.decodeStrings===false;this.decodeStrings=!noDecode;this.defaultEncoding=options.defaultEncoding||"utf8";this.length=0;this.writing=false;this.sync=true;this.bufferProcessing=false;this.onwrite=function(er){onwrite(stream,er)};this.writecb=null;this.writelen=0;this.buffer=[];this.errorEmitted=false}function Writable(options){var Duplex=require("./_stream_duplex");if(!(this instanceof Writable)&&!(this instanceof Duplex))return new Writable(options);this._writableState=new WritableState(options,this);this.writable=true;Stream.call(this)}Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))};function writeAfterEnd(stream,state,cb){var er=new Error("write after end");stream.emit("error",er);process.nextTick(function(){cb(er)})}function validChunk(stream,state,chunk,cb){var valid=true;if(!Buffer.isBuffer(chunk)&&"string"!==typeof chunk&&chunk!==null&&chunk!==undefined&&!state.objectMode){var er=new TypeError("Invalid non-string/buffer chunk");stream.emit("error",er);process.nextTick(function(){cb(er)});valid=false}return valid}Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState;var ret=false;if(typeof encoding==="function"){cb=encoding;encoding=null}if(Buffer.isBuffer(chunk))encoding="buffer";else if(!encoding)encoding=state.defaultEncoding;if(typeof cb!=="function")cb=function(){};if(state.ended)writeAfterEnd(this,state,cb);else if(validChunk(this,state,chunk,cb))ret=writeOrBuffer(this,state,chunk,encoding,cb);return ret};function decodeChunk(state,chunk,encoding){if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==="string"){chunk=new Buffer(chunk,encoding)}return chunk}function writeOrBuffer(stream,state,chunk,encoding,cb){chunk=decodeChunk(state,chunk,encoding);if(Buffer.isBuffer(chunk))encoding="buffer";var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length<state.highWaterMark;if(!ret)state.needDrain=true;if(state.writing)state.buffer.push(new WriteReq(chunk,encoding,cb));else doWrite(stream,state,len,chunk,encoding,cb);return ret}function doWrite(stream,state,len,chunk,encoding,cb){state.writelen=len;state.writecb=cb;state.writing=true;state.sync=true;stream._write(chunk,encoding,state.onwrite);state.sync=false}function onwriteError(stream,state,sync,er,cb){if(sync)process.nextTick(function(){cb(er)});else cb(er);stream._writableState.errorEmitted=true;stream.emit("error",er)}function onwriteStateUpdate(state){state.writing=false;state.writecb=null;state.length-=state.writelen;state.writelen=0}function onwrite(stream,er){var state=stream._writableState;var sync=state.sync;var cb=state.writecb;onwriteStateUpdate(state);if(er)onwriteError(stream,state,sync,er,cb);else{var finished=needFinish(stream,state);if(!finished&&!state.bufferProcessing&&state.buffer.length)clearBuffer(stream,state);if(sync){process.nextTick(function(){afterWrite(stream,state,finished,cb)})}else{afterWrite(stream,state,finished,cb)}}}function afterWrite(stream,state,finished,cb){if(!finished)onwriteDrain(stream,state);cb();if(finished)finishMaybe(stream,state)}function onwriteDrain(stream,state){if(state.length===0&&state.needDrain){state.needDrain=false;stream.emit("drain")}}function clearBuffer(stream,state){state.bufferProcessing=true;for(var c=0;c<state.buffer.length;c++){var entry=state.buffer[c];var chunk=entry.chunk;var encoding=entry.encoding;var cb=entry.callback;var len=state.objectMode?1:chunk.length;doWrite(stream,state,len,chunk,encoding,cb);if(state.writing){c++;break}}state.bufferProcessing=false;if(c<state.buffer.length)state.buffer=state.buffer.slice(c);else state.buffer.length=0}Writable.prototype._write=function(chunk,encoding,cb){cb(new Error("not implemented"))};Writable.prototype.end=function(chunk,encoding,cb){var state=this._writableState;if(typeof chunk==="function"){cb=chunk;chunk=null;encoding=null}else if(typeof encoding==="function"){cb=encoding;encoding=null}if(typeof chunk!=="undefined"&&chunk!==null)this.write(chunk,encoding);if(!state.ending&&!state.finished)endWritable(this,state,cb)};function needFinish(stream,state){return state.ending&&state.length===0&&!state.finished&&!state.writing}function finishMaybe(stream,state){var need=needFinish(stream,state);if(need){state.finished=true;stream.emit("finish")}return need}function endWritable(stream,state,cb){state.ending=true;finishMaybe(stream,state);if(cb){if(state.finished)process.nextTick(cb);else stream.once("finish",cb)}state.ended=true}}).call(this,require("_process"))},{"./_stream_duplex":11,_process:9,buffer:1,"core-util-is":16,inherits:6,stream:21}],16:[function(require,module,exports){(function(Buffer){function isArray(ar){return Array.isArray(ar)}exports.isArray=isArray;function isBoolean(arg){return typeof arg==="boolean"}exports.isBoolean=isBoolean;function isNull(arg){return arg===null}exports.isNull=isNull;function isNullOrUndefined(arg){return arg==null}exports.isNullOrUndefined=isNullOrUndefined;function isNumber(arg){return typeof arg==="number"}exports.isNumber=isNumber;function isString(arg){return typeof arg==="string"}exports.isString=isString;function isSymbol(arg){return typeof arg==="symbol"}exports.isSymbol=isSymbol;function isUndefined(arg){return arg===void 0}exports.isUndefined=isUndefined;function isRegExp(re){return isObject(re)&&objectToString(re)==="[object RegExp]"}exports.isRegExp=isRegExp;function isObject(arg){return typeof arg==="object"&&arg!==null}exports.isObject=isObject;function isDate(d){return isObject(d)&&objectToString(d)==="[object Date]"}exports.isDate=isDate;function isError(e){return isObject(e)&&(objectToString(e)==="[object Error]"||e instanceof Error)}exports.isError=isError;function isFunction(arg){return typeof arg==="function"}exports.isFunction=isFunction;function isPrimitive(arg){return arg===null||typeof arg==="boolean"||typeof arg==="number"||typeof arg==="string"||typeof arg==="symbol"||typeof arg==="undefined"}exports.isPrimitive=isPrimitive;function isBuffer(arg){return Buffer.isBuffer(arg)}exports.isBuffer=isBuffer;function objectToString(o){return Object.prototype.toString.call(o)}}).call(this,require("buffer").Buffer)},{buffer:1}],17:[function(require,module,exports){module.exports=require("./lib/_stream_passthrough.js")},{"./lib/_stream_passthrough.js":12}],18:[function(require,module,exports){var Stream=require("stream");exports=module.exports=require("./lib/_stream_readable.js");exports.Stream=Stream;exports.Readable=exports;exports.Writable=require("./lib/_stream_writable.js");exports.Duplex=require("./lib/_stream_duplex.js");exports.Transform=require("./lib/_stream_transform.js");exports.PassThrough=require("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":11,"./lib/_stream_passthrough.js":12,"./lib/_stream_readable.js":13,"./lib/_stream_transform.js":14,"./lib/_stream_writable.js":15,stream:21}],19:[function(require,module,exports){module.exports=require("./lib/_stream_transform.js")},{"./lib/_stream_transform.js":14}],20:[function(require,module,exports){module.exports=require("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":15}],21:[function(require,module,exports){module.exports=Stream;var EE=require("events").EventEmitter;var inherits=require("inherits");inherits(Stream,EE);Stream.Readable=require("readable-stream/readable.js");Stream.Writable=require("readable-stream/writable.js");Stream.Duplex=require("readable-stream/duplex.js");Stream.Transform=require("readable-stream/transform.js");Stream.PassThrough=require("readable-stream/passthrough.js");Stream.Stream=Stream;function Stream(){EE.call(this)}Stream.prototype.pipe=function(dest,options){var source=this;function ondata(chunk){if(dest.writable){if(false===dest.write(chunk)&&source.pause){source.pause()}}}source.on("data",ondata);function ondrain(){if(source.readable&&source.resume){source.resume()}}dest.on("drain",ondrain);if(!dest._isStdio&&(!options||options.end!==false)){source.on("end",onend);source.on("close",onclose)}var didOnEnd=false;function onend(){if(didOnEnd)return;didOnEnd=true;dest.end()}function onclose(){if(didOnEnd)return;didOnEnd=true;if(typeof dest.destroy==="function")dest.destroy()}function onerror(er){cleanup();if(EE.listenerCount(this,"error")===0){throw er}}source.on("error",onerror);dest.on("error",onerror);function cleanup(){source.removeListener("data",ondata);dest.removeListener("drain",ondrain);source.removeListener("end",onend);source.removeListener("close",onclose);source.removeListener("error",onerror);dest.removeListener("error",onerror);source.removeListener("end",cleanup);source.removeListener("close",cleanup);dest.removeListener("close",cleanup)}source.on("end",cleanup);source.on("close",cleanup);dest.on("close",cleanup);dest.emit("pipe",source);return dest}},{events:5,inherits:6,"readable-stream/duplex.js":10,"readable-stream/passthrough.js":17,"readable-stream/readable.js":18,"readable-stream/transform.js":19,"readable-stream/writable.js":20}],22:[function(require,module,exports){var Buffer=require("buffer").Buffer;var isBufferEncoding=Buffer.isEncoding||function(encoding){switch(encoding&&encoding.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return true;default:return false}};function assertEncoding(encoding){if(encoding&&!isBufferEncoding(encoding)){throw new Error("Unknown encoding: "+encoding)}}var StringDecoder=exports.StringDecoder=function(encoding){this.encoding=(encoding||"utf8").toLowerCase().replace(/[-_]/,"");assertEncoding(encoding);switch(this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2;this.detectIncompleteChar=utf16DetectIncompleteChar;break;case"base64":this.surrogateSize=3;this.detectIncompleteChar=base64DetectIncompleteChar;break;default:this.write=passThroughWrite;return}this.charBuffer=new Buffer(6);this.charReceived=0;this.charLength=0};StringDecoder.prototype.write=function(buffer){var charStr="";while(this.charLength){var available=buffer.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:buffer.length;buffer.copy(this.charBuffer,this.charReceived,0,available);this.charReceived+=available;if(this.charReceived<this.charLength){return""}buffer=buffer.slice(available,buffer.length);charStr=this.charBuffer.slice(0,this.charLength).toString(this.encoding);var charCode=charStr.charCodeAt(charStr.length-1);if(charCode>=55296&&charCode<=56319){this.charLength+=this.surrogateSize;charStr="";continue}this.charReceived=this.charLength=0;if(buffer.length===0){return charStr}break}this.detectIncompleteChar(buffer);var end=buffer.length;if(this.charLength){buffer.copy(this.charBuffer,0,buffer.length-this.charReceived,end);end-=this.charReceived}charStr+=buffer.toString(this.encoding,0,end);var end=charStr.length-1;var charCode=charStr.charCodeAt(end);if(charCode>=55296&&charCode<=56319){var size=this.surrogateSize;this.charLength+=size;this.charReceived+=size;this.charBuffer.copy(this.charBuffer,size,0,size);buffer.copy(this.charBuffer,0,0,size);return charStr.substring(0,end)}return charStr};StringDecoder.prototype.detectIncompleteChar=function(buffer){var i=buffer.length>=3?3:buffer.length;for(;i>0;i--){var c=buffer[buffer.length-i];if(i==1&&c>>5==6){this.charLength=2;break}if(i<=2&&c>>4==14){this.charLength=3;break}if(i<=3&&c>>3==30){this.charLength=4;break}}this.charReceived=i};StringDecoder.prototype.end=function(buffer){var res="";if(buffer&&buffer.length)res=this.write(buffer);if(this.charReceived){var cr=this.charReceived;var buf=this.charBuffer;var enc=this.encoding;res+=buf.slice(0,cr).toString(enc)}return res};function passThroughWrite(buffer){return buffer.toString(this.encoding)}function utf16DetectIncompleteChar(buffer){this.charReceived=buffer.length%2;this.charLength=this.charReceived?2:0}function base64DetectIncompleteChar(buffer){this.charReceived=buffer.length%3;this.charLength=this.charReceived?3:0}},{buffer:1}],23:[function(require,module,exports){module.exports=function(){return{canvas:!!window.CanvasRenderingContext2D,webgl:function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(e){return false}}(),workers:!!window.Worker,fileapi:window.File&&window.FileReader&&window.FileList&&window.Blob,getWebGLErrorMessage:function(){var domElement=document.createElement("div");domElement.style.fontFamily="monospace";domElement.style.fontSize="13px";domElement.style.textAlign="center";domElement.style.background="#eee";domElement.style.color="#000";domElement.style.padding="1em";domElement.style.width="475px";domElement.style.margin="5em auto 0";if(!this.webgl){domElement.innerHTML=window.WebGLRenderingContext?['Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>.<br />','Find out how to get it <a href="http://get.webgl.org/">here</a>.'].join("\n"):['Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>.<br/>','Find out how to get it <a href="http://get.webgl.org/">here</a>.'].join("\n")}return domElement},addGetWebGLMessage:function(parameters){var parent,id,domElement;parameters=parameters||{};parent=parameters.parent!==undefined?parameters.parent:document.body;id=parameters.id!==undefined?parameters.id:"oldie";domElement=Detector.getWebGLErrorMessage();domElement.id=id;parent.appendChild(domElement)}}}},{}],24:[function(require,module,exports){var Stats=function(){var startTime=Date.now(),prevTime=startTime;var ms=0,msMin=Infinity,msMax=0;var fps=0,fpsMin=Infinity,fpsMax=0;var frames=0,mode=0;var container=document.createElement("div");container.id="stats";container.addEventListener("mousedown",function(event){event.preventDefault();setMode(++mode%2)},false);container.style.cssText="width:80px;opacity:0.9;cursor:pointer";var fpsDiv=document.createElement("div");fpsDiv.id="fps";fpsDiv.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";container.appendChild(fpsDiv);var fpsText=document.createElement("div");fpsText.id="fpsText";fpsText.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";fpsText.innerHTML="FPS";fpsDiv.appendChild(fpsText);var fpsGraph=document.createElement("div");fpsGraph.id="fpsGraph";fpsGraph.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";fpsDiv.appendChild(fpsGraph);while(fpsGraph.children.length<74){var bar=document.createElement("span");bar.style.cssText="width:1px;height:30px;float:left;background-color:#113";fpsGraph.appendChild(bar)}var msDiv=document.createElement("div");msDiv.id="ms";msDiv.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";container.appendChild(msDiv);var msText=document.createElement("div");msText.id="msText";msText.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";msText.innerHTML="MS";msDiv.appendChild(msText);var msGraph=document.createElement("div");msGraph.id="msGraph";msGraph.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";msDiv.appendChild(msGraph);while(msGraph.children.length<74){var bar=document.createElement("span");bar.style.cssText="width:1px;height:30px;float:left;background-color:#131";msGraph.appendChild(bar)}var setMode=function(value){mode=value;switch(mode){case 0:fpsDiv.style.display="block";msDiv.style.display="none";break;case 1:fpsDiv.style.display="none";msDiv.style.display="block";break}};var updateGraph=function(dom,value){var child=dom.appendChild(dom.firstChild);child.style.height=value+"px"};return{REVISION:11,domElement:container,setMode:setMode,begin:function(){startTime=Date.now()},end:function(){var time=Date.now();ms=time-startTime;msMin=Math.min(msMin,ms);msMax=Math.max(msMax,ms);msText.textContent=ms+" MS ("+msMin+"-"+msMax+")";updateGraph(msGraph,Math.min(30,30-ms/200*30));frames++;if(time>prevTime+1e3){fps=Math.round(frames*1e3/(time-prevTime));fpsMin=Math.min(fpsMin,fps);fpsMax=Math.max(fpsMax,fps);fpsText.textContent=fps+" FPS ("+fpsMin+"-"+fpsMax+")";updateGraph(fpsGraph,Math.min(30,30-fps/100*30));prevTime=time;frames=0}return time},update:function(){startTime=this.end()}}};module.exports=Stats},{}],25:[function(require,module,exports){module.exports=AABB;var vec3=require("gl-matrix").vec3;function AABB(pos,vec){if(!(this instanceof AABB)){return new AABB(pos,vec)}this.base=pos;this.vec=vec;this.mag=vec3.length(this.vec);this.max=vec3.create();vec3.add(this.max,this.base,this.vec)}var cons=AABB,proto=cons.prototype;proto.width=function(){return this.vec[0]};proto.height=function(){return this.vec[1]};proto.depth=function(){return this.vec[2]};proto.x0=function(){return this.base[0]};proto.y0=function(){return this.base[1]};proto.z0=function(){return this.base[2]};proto.x1=function(){return this.max[0]};proto.y1=function(){return this.max[1]};proto.z1=function(){return this.max[2]};proto.translate=function(by){vec3.add(this.max,this.max,by);vec3.add(this.base,this.base,by);return this};proto.expand=function(aabb){var max=vec3.create(),min=vec3.create();vec3.max(max,aabb.max,this.max);vec3.min(min,aabb.base,this.base);vec3.sub(max,max,min);return new AABB(min,max)};proto.intersects=function(aabb){if(aabb.base[0]>this.max[0])return false;if(aabb.base[1]>this.max[1])return false;if(aabb.base[2]>this.max[2])return false;if(aabb.max[0]<this.base[0])return false;if(aabb.max[1]<this.base[1])return false;if(aabb.max[2]<this.base[2])return false;return true};proto.union=function(aabb){if(!this.intersects(aabb))return null;var base_x=Math.max(aabb.base[0],this.base[0]),base_y=Math.max(aabb.base[1],this.base[1]),base_z=Math.max(aabb.base[2],this.base[2]),max_x=Math.min(aabb.max[0],this.max[0]),max_y=Math.min(aabb.max[1],this.max[1]),max_z=Math.min(aabb.max[2],this.max[2]);return new AABB([base_x,base_y,base_z],[max_x-base_x,max_y-base_y,max_z-base_z])}},{"gl-matrix":27}],26:[function(require,module,exports){module.exports=function(field,tilesize,dimensions,offset){dimensions=dimensions||[Math.sqrt(field.length)>>0,Math.sqrt(field.length)>>0,Math.sqrt(field.length)>>0];offset=offset||[0,0,0];field=typeof field==="function"?field:function(x,y,z){return this[x+y*dimensions[1]+z*dimensions[1]*dimensions[2]]}.bind(field);var coords;coords=[0,0,0];return collide;function collide(box,vec,oncollision){if(vec[0]===0&&vec[1]===0&&vec[2]===0)return;collideaxis(0);collideaxis(1);collideaxis(2);function collideaxis(i_axis){var j_axis=(i_axis+1)%3,k_axis=(i_axis+2)%3,posi=vec[i_axis]>0,leading=box[posi?"max":"base"][i_axis],dir=posi?1:-1,i_start=Math.floor(leading/tilesize),i_end=Math.floor((leading+vec[i_axis])/tilesize)+dir,j_start=Math.floor(box.base[j_axis]/tilesize),j_end=Math.ceil(box.max[j_axis]/tilesize),k_start=Math.floor(box.base[k_axis]/tilesize),k_end=Math.ceil(box.max[k_axis]/tilesize),done=false,edge_vector,edge,tile;var step=0;for(var i=i_start;!done&&i!==i_end;++step,i+=dir){if(i<offset[i_axis]||i>=dimensions[i_axis])continue;for(var j=j_start;!done&&j!==j_end;++j){if(j<offset[j_axis]||j>=dimensions[j_axis])continue;for(var k=k_start;k!==k_end;++k){if(k<offset[k_axis]||k>=dimensions[k_axis])continue;coords[i_axis]=i;coords[j_axis]=j;coords[k_axis]=k;tile=field.apply(field,coords);if(tile===undefined)continue;edge=dir>0?i*tilesize:(i+1)*tilesize;edge_vector=edge-leading;if(oncollision(i_axis,tile,coords,dir,edge_vector)){done=true;break}}}}coords[0]=coords[1]=coords[2]=0;coords[i_axis]=vec[i_axis];box.translate(coords)}}}},{}],27:[function(require,module,exports){(function(){"use strict";var shim={};if(typeof exports==="undefined"){if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){shim.exports={};define(function(){return shim.exports})}else{shim.exports=window}}else{shim.exports=exports}(function(exports){var vec2={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec2.create=function(){return new Float32Array(2)};vec2.clone=function(a){var out=new Float32Array(2);out[0]=a[0];out[1]=a[1];return out};vec2.fromValues=function(x,y){var out=new Float32Array(2);out[0]=x;out[1]=y;return out};vec2.copy=function(out,a){out[0]=a[0];out[1]=a[1];return out};vec2.set=function(out,x,y){out[0]=x;out[1]=y;return out};vec2.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];return out};vec2.sub=vec2.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];return out};vec2.mul=vec2.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];return out};vec2.div=vec2.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];return out};vec2.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);return out};vec2.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);return out};vec2.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;return out};vec2.dist=vec2.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return Math.sqrt(x*x+y*y)};vec2.sqrDist=vec2.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1];return x*x+y*y};vec2.len=vec2.length=function(a){var x=a[0],y=a[1];return Math.sqrt(x*x+y*y)};vec2.sqrLen=vec2.squaredLength=function(a){var x=a[0],y=a[1];return x*x+y*y};vec2.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];return out};vec2.normalize=function(out,a){var x=a[0],y=a[1];var len=x*x+y*y;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len}return out};vec2.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]};vec2.cross=function(out,a,b){var z=a[0]*b[1]-a[1]*b[0];out[0]=out[1]=0;out[2]=z;return out};vec2.lerp=function(out,a,b,t){var ax=a[0],ay=a[1];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);return out};vec2.transformMat2=function(out,a,m){var x=a[0],y=a[1];out[0]=x*m[0]+y*m[1];out[1]=x*m[2]+y*m[3];return out};vec2.forEach=function(){var vec=new Float32Array(2);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1]}return a}}();vec2.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};if(typeof exports!=="undefined"){exports.vec2=vec2}var vec3={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec3.create=function(){return new Float32Array(3)};vec3.clone=function(a){var out=new Float32Array(3);out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.fromValues=function(x,y,z){var out=new Float32Array(3);out[0]=x;out[1]=y;out[2]=z;return out};vec3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];return out};vec3.set=function(out,x,y,z){out[0]=x;out[1]=y;out[2]=z;return out};vec3.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];return out};vec3.sub=vec3.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];return out};vec3.mul=vec3.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];return out};vec3.div=vec3.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];return out};vec3.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);return out};vec3.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);return out};vec3.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;return out};vec3.dist=vec3.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];
return Math.sqrt(x*x+y*y+z*z)};vec3.sqrDist=vec3.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2];return x*x+y*y+z*z};vec3.len=vec3.length=function(a){var x=a[0],y=a[1],z=a[2];return Math.sqrt(x*x+y*y+z*z)};vec3.sqrLen=vec3.squaredLength=function(a){var x=a[0],y=a[1],z=a[2];return x*x+y*y+z*z};vec3.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];return out};vec3.normalize=function(out,a){var x=a[0],y=a[1],z=a[2];var len=x*x+y*y+z*z;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len}return out};vec3.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]};vec3.cross=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out};vec3.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);return out};vec3.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12];out[1]=m[1]*x+m[5]*y+m[9]*z+m[13];out[2]=m[2]*x+m[6]*y+m[10]*z+m[14];return out};vec3.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec3.forEach=function(){var vec=new Float32Array(3);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2]}return a}}();vec3.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};if(typeof exports!=="undefined"){exports.vec3=vec3}var vec4={};if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}vec4.create=function(){return new Float32Array(4)};vec4.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.fromValues=function(x,y,z,w){var out=new Float32Array(4);out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};vec4.set=function(out,x,y,z,w){out[0]=x;out[1]=y;out[2]=z;out[3]=w;return out};vec4.add=function(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out};vec4.sub=vec4.subtract=function(out,a,b){out[0]=a[0]-b[0];out[1]=a[1]-b[1];out[2]=a[2]-b[2];out[3]=a[3]-b[3];return out};vec4.mul=vec4.multiply=function(out,a,b){out[0]=a[0]*b[0];out[1]=a[1]*b[1];out[2]=a[2]*b[2];out[3]=a[3]*b[3];return out};vec4.div=vec4.divide=function(out,a,b){out[0]=a[0]/b[0];out[1]=a[1]/b[1];out[2]=a[2]/b[2];out[3]=a[3]/b[3];return out};vec4.min=function(out,a,b){out[0]=Math.min(a[0],b[0]);out[1]=Math.min(a[1],b[1]);out[2]=Math.min(a[2],b[2]);out[3]=Math.min(a[3],b[3]);return out};vec4.max=function(out,a,b){out[0]=Math.max(a[0],b[0]);out[1]=Math.max(a[1],b[1]);out[2]=Math.max(a[2],b[2]);out[3]=Math.max(a[3],b[3]);return out};vec4.scale=function(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out};vec4.dist=vec4.distance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrDist=vec4.squaredDistance=function(a,b){var x=b[0]-a[0],y=b[1]-a[1],z=b[2]-a[2],w=b[3]-a[3];return x*x+y*y+z*z+w*w};vec4.len=vec4.length=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return Math.sqrt(x*x+y*y+z*z+w*w)};vec4.sqrLen=vec4.squaredLength=function(a){var x=a[0],y=a[1],z=a[2],w=a[3];return x*x+y*y+z*z+w*w};vec4.negate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=-a[3];return out};vec4.normalize=function(out,a){var x=a[0],y=a[1],z=a[2],w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;out[3]=a[3]*len}return out};vec4.dot=function(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]};vec4.lerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out};vec4.transformMat4=function(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out};vec4.transformQuat=function(out,a,q){var x=a[0],y=a[1],z=a[2],qx=q[0],qy=q[1],qz=q[2],qw=q[3],ix=qw*x+qy*z-qz*y,iy=qw*y+qz*x-qx*z,iz=qw*z+qx*y-qy*x,iw=-qx*x-qy*y-qz*z;out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;return out};vec4.forEach=function(){var vec=new Float32Array(4);return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4}if(!offset){offset=0}if(count){l=Math.min(count*stride+offset,a.length)}else{l=a.length}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3]}return a}}();vec4.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.vec4=vec4}var mat2={};var mat2Identity=new Float32Array([1,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat2.create=function(){return new Float32Array(mat2Identity)};mat2.clone=function(a){var out=new Float32Array(4);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];return out};mat2.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=1;return out};mat2.transpose=function(out,a){if(out===a){var a1=a[1];out[1]=a[2];out[2]=a1}else{out[0]=a[0];out[1]=a[2];out[2]=a[1];out[3]=a[3]}return out};mat2.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],det=a0*a3-a2*a1;if(!det){return null}det=1/det;out[0]=a3*det;out[1]=-a1*det;out[2]=-a2*det;out[3]=a0*det;return out};mat2.adjoint=function(out,a){var a0=a[0];out[0]=a[3];out[1]=-a[1];out[2]=-a[2];out[3]=a0;return out};mat2.determinant=function(a){return a[0]*a[3]-a[2]*a[1]};mat2.mul=mat2.multiply=function(out,a,b){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=a0*b0+a1*b2;out[1]=a0*b1+a1*b3;out[2]=a2*b0+a3*b2;out[3]=a2*b1+a3*b3;return out};mat2.rotate=function(out,a,rad){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],s=Math.sin(rad),c=Math.cos(rad);out[0]=a0*c+a1*s;out[1]=a0*-s+a1*c;out[2]=a2*c+a3*s;out[3]=a2*-s+a3*c;return out};mat2.scale=function(out,a,v){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],v0=v[0],v1=v[1];out[0]=a0*v0;out[1]=a1*v1;out[2]=a2*v0;out[3]=a3*v1;return out};mat2.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.mat2=mat2}var mat3={};var mat3Identity=new Float32Array([1,0,0,0,1,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat3.create=function(){return new Float32Array(mat3Identity)};mat3.clone=function(a){var out=new Float32Array(9);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out};mat3.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=1;out[5]=0;out[6]=0;out[7]=0;out[8]=1;return out};mat3.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12}else{out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8]}return out};mat3.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b01=a22*a11-a12*a21,b11=-a22*a10+a12*a20,b21=a21*a10-a11*a20,det=a00*b01+a01*b11+a02*b21;if(!det){return null}det=1/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out};mat3.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];out[0]=a11*a22-a12*a21;out[1]=a02*a21-a01*a22;out[2]=a01*a12-a02*a11;out[3]=a12*a20-a10*a22;out[4]=a00*a22-a02*a20;out[5]=a02*a10-a00*a12;out[6]=a10*a21-a11*a20;out[7]=a01*a20-a00*a21;out[8]=a00*a11-a01*a10;return out};mat3.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20)};mat3.mul=mat3.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],b00=b[0],b01=b[1],b02=b[2],b10=b[3],b11=b[4],b12=b[5],b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out};mat3.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};if(typeof exports!=="undefined"){exports.mat3=mat3}var mat4={};var mat4Identity=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}mat4.create=function(){return new Float32Array(mat4Identity)};mat4.clone=function(a){var out=new Float32Array(16);out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.copy=function(out,a){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.identity=function(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out};mat4.transpose=function(out,a){if(out===a){var a01=a[1],a02=a[2],a03=a[3],a12=a[6],a13=a[7],a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23}else{out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15]}return out};mat4.invert=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32,det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null}det=1/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out};mat4.adjoint=function(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];out[0]=a11*(a22*a33-a23*a32)-a21*(a12*a33-a13*a32)+a31*(a12*a23-a13*a22);out[1]=-(a01*(a22*a33-a23*a32)-a21*(a02*a33-a03*a32)+a31*(a02*a23-a03*a22));out[2]=a01*(a12*a33-a13*a32)-a11*(a02*a33-a03*a32)+a31*(a02*a13-a03*a12);out[3]=-(a01*(a12*a23-a13*a22)-a11*(a02*a23-a03*a22)+a21*(a02*a13-a03*a12));out[4]=-(a10*(a22*a33-a23*a32)-a20*(a12*a33-a13*a32)+a30*(a12*a23-a13*a22));out[5]=a00*(a22*a33-a23*a32)-a20*(a02*a33-a03*a32)+a30*(a02*a23-a03*a22);out[6]=-(a00*(a12*a33-a13*a32)-a10*(a02*a33-a03*a32)+a30*(a02*a13-a03*a12));out[7]=a00*(a12*a23-a13*a22)-a10*(a02*a23-a03*a22)+a20*(a02*a13-a03*a12);out[8]=a10*(a21*a33-a23*a31)-a20*(a11*a33-a13*a31)+a30*(a11*a23-a13*a21);out[9]=-(a00*(a21*a33-a23*a31)-a20*(a01*a33-a03*a31)+a30*(a01*a23-a03*a21));out[10]=a00*(a11*a33-a13*a31)-a10*(a01*a33-a03*a31)+a30*(a01*a13-a03*a11);out[11]=-(a00*(a11*a23-a13*a21)-a10*(a01*a23-a03*a21)+a20*(a01*a13-a03*a11));out[12]=-(a10*(a21*a32-a22*a31)-a20*(a11*a32-a12*a31)+a30*(a11*a22-a12*a21));out[13]=a00*(a21*a32-a22*a31)-a20*(a01*a32-a02*a31)+a30*(a01*a22-a02*a21);out[14]=-(a00*(a11*a32-a12*a31)-a10*(a01*a32-a02*a31)+a30*(a01*a12-a02*a11));out[15]=a00*(a11*a22-a12*a21)-a10*(a01*a22-a02*a21)+a20*(a01*a12-a02*a11);return out};mat4.determinant=function(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15],b00=a00*a11-a01*a10,b01=a00*a12-a02*a10,b02=a00*a13-a03*a10,b03=a01*a12-a02*a11,b04=a01*a13-a03*a11,b05=a02*a13-a03*a12,b06=a20*a31-a21*a30,b07=a20*a32-a22*a30,b08=a20*a33-a23*a30,b09=a21*a32-a22*a31,b10=a21*a33-a23*a31,b11=a22*a33-a23*a32;return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06};mat4.mul=mat4.multiply=function(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11],a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out};mat4.translate=function(out,a,v){var x=v[0],y=v[1],z=v[2],a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15]}else{a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15]}return out};mat4.scale=function(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out};mat4.rotate=function(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2],len=Math.sqrt(x*x+y*y+z*z),s,c,t,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,b00,b01,b02,b10,b11,b12,b20,b21,b22;if(Math.abs(len)<GLMAT_EPSILON){return null}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}return out};mat4.rotateX=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a10=a[4],a11=a[5],a12=a[6],a13=a[7],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out};mat4.rotateY=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a20=a[8],a21=a[9],a22=a[10],a23=a[11];if(a!==out){out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out};mat4.rotateZ=function(out,a,rad){var s=Math.sin(rad),c=Math.cos(rad),a00=a[0],a01=a[1],a02=a[2],a03=a[3],a10=a[4],a11=a[5],a12=a[6],a13=a[7];if(a!==out){out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15]}out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out};mat4.fromRotationTranslation=function(out,q,v){var x=q[0],y=q[1],z=q[2],w=q[3],x2=x+x,y2=y+y,z2=z+z,xx=x*x2,xy=x*y2,xz=x*z2,yy=y*y2,yz=y*z2,zz=z*z2,wx=w*x2,wy=w*y2,wz=w*z2;out[0]=1-(yy+zz);out[1]=xy+wz;out[2]=xz-wy;out[3]=0;out[4]=xy-wz;out[5]=1-(xx+zz);out[6]=yz+wx;out[7]=0;out[8]=xz+wy;out[9]=yz-wx;out[10]=1-(xx+yy);out[11]=0;out[12]=v[0];out[13]=v[1];out[14]=v[2];out[15]=1;return out};mat4.frustum=function(out,left,right,bottom,top,near,far){var rl=1/(right-left),tb=1/(top-bottom),nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out};mat4.perspective=function(out,fovy,aspect,near,far){var f=1/Math.tan(fovy/2),nf=1/(near-far);out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=2*far*near*nf;out[15]=0;return out};mat4.ortho=function(out,left,right,bottom,top,near,far){var lr=1/(left-right),bt=1/(bottom-top),nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out};mat4.lookAt=function(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len,eyex=eye[0],eyey=eye[1],eyez=eye[2],upx=up[0],upy=up[1],upz=up[2],centerx=center[0],centery=center[1],centerz=center[2];if(Math.abs(eyex-centerx)<GLMAT_EPSILON&&Math.abs(eyey-centery)<GLMAT_EPSILON&&Math.abs(eyez-centerz)<GLMAT_EPSILON){return mat4.identity(out)}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.sqrt(z0*z0+z1*z1+z2*z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.sqrt(x0*x0+x1*x1+x2*x2);if(!len){x0=0;x1=0;x2=0}else{len=1/len;x0*=len;x1*=len;x2*=len}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.sqrt(y0*y0+y1*y1+y2*y2);if(!len){y0=0;y1=0;y2=0}else{len=1/len;y0*=len;y1*=len;y2*=len}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out};mat4.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};if(typeof exports!=="undefined"){exports.mat4=mat4}var quat={};var quatIdentity=new Float32Array([0,0,0,1]);if(!GLMAT_EPSILON){var GLMAT_EPSILON=1e-6}quat.create=function(){return new Float32Array(quatIdentity)};quat.clone=vec4.clone;quat.fromValues=vec4.fromValues;quat.copy=vec4.copy;quat.set=vec4.set;quat.identity=function(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out};quat.setAxisAngle=function(out,axis,rad){rad=rad*.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out};quat.add=vec4.add;quat.mul=quat.multiply=function(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out};quat.scale=vec4.scale;quat.rotateX=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out};quat.rotateY=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out};quat.rotateZ=function(out,a,rad){rad*=.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3],bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out};quat.calculateW=function(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=-Math.sqrt(Math.abs(1-x*x-y*y-z*z));return out};quat.dot=vec4.dot;quat.lerp=vec4.lerp;quat.slerp=function(out,a,b,t){var ax=a[0],ay=a[1],az=a[2],aw=a[3],bx=b[0],by=b[1],bz=b[2],bw=a[3];var cosHalfTheta=ax*bx+ay*by+az*bz+aw*bw,halfTheta,sinHalfTheta,ratioA,ratioB;if(Math.abs(cosHalfTheta)>=1){if(out!==a){out[0]=ax;out[1]=ay;out[2]=az;out[3]=aw}return out}halfTheta=Math.acos(cosHalfTheta);sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){out[0]=ax*.5+bx*.5;out[1]=ay*.5+by*.5;out[2]=az*.5+bz*.5;out[3]=aw*.5+bw*.5;return out}ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta;ratioB=Math.sin(t*halfTheta)/sinHalfTheta;out[0]=ax*ratioA+bx*ratioB;out[1]=ay*ratioA+by*ratioB;out[2]=az*ratioA+bz*ratioB;out[3]=aw*ratioA+bw*ratioB;return out};quat.invert=function(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3],dot=a0*a0+a1*a1+a2*a2+a3*a3,invDot=dot?1/dot:0;out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out};quat.conjugate=function(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out};quat.len=quat.length=vec4.length;quat.sqrLen=quat.squaredLength=vec4.squaredLength;quat.normalize=vec4.normalize;quat.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};if(typeof exports!=="undefined"){exports.quat=quat}})(shim.exports)})()},{}],28:[function(require,module,exports){module.exports=inherits;function inherits(c,p,proto){proto=proto||{};var e={};[c.prototype,proto].forEach(function(s){Object.getOwnPropertyNames(s).forEach(function(k){e[k]=Object.getOwnPropertyDescriptor(s,k)})});c.prototype=Object.create(p.prototype,e);c.super=p}},{}],29:[function(require,module,exports){var lock=require("pointer-lock"),drag=require("drag-stream"),full=require("fullscreen");var EE=require("events").EventEmitter,Stream=require("stream").Stream;module.exports=interact;function interact(el,skiplock){var ee=new EE,internal;if(!lock.available()||skiplock){internal=usedrag(el)}else{internal=uselock(el,politelydeclined)}ee.release=function(){internal.release&&internal.release()};ee.request=function(){internal.request&&internal.request()};ee.destroy=function(){internal.destroy&&internal.destroy()};ee.pointerAvailable=function(){return lock.available()};ee.fullscreenAvailable=function(){return full.available()};forward();return ee;function politelydeclined(){ee.emit("opt-out");internal.destroy();internal=usedrag(el);forward()}function forward(){internal.on("attain",function(stream){ee.emit("attain",stream)});internal.on("release",function(){ee.emit("release")})}}function uselock(el,declined){var pointer=lock(el),fs=full(el);pointer.on("needs-fullscreen",function(){fs.once("attain",function(){pointer.request()});fs.request()});pointer.on("error",declined);return pointer}function usedrag(el){var ee=new EE,d=drag(el),stream;d.paused=true;d.on("resume",function(){stream=new Stream;stream.readable=true;stream.initial=null});d.on("data",function(datum){if(!stream){stream=new Stream;stream.readable=true;stream.initial=null}if(!stream.initial){stream.initial={x:datum.dx,y:datum.dy,t:datum.dt};return ee.emit("attain",stream)}if(stream.paused){ee.emit("release");stream.emit("end");stream.readable=false;stream.emit("close");stream=null}stream.emit("data",datum)});return ee}},{"drag-stream":30,events:5,fullscreen:36,"pointer-lock":37,stream:21}],30:[function(require,module,exports){module.exports=dragstream;var Stream=require("stream"),read=require("domnode-dom").createReadStream,through=require("through");function dragstream(el){var body=el.ownerDocument.body,down=read(el,"mousedown"),up=read(body,"mouseup",false),move=read(body,"mousemove",false),anchor={x:0,y:0,t:0},drag=through(on_move);drag.pause();down.on("data",on_down);up.on("data",on_up);return move.pipe(drag);function on_move(ev){if(drag.paused)return;drag.emit("data",datum(ev.screenX-anchor.x,ev.screenY-anchor.y,+new Date));anchor.x=ev.screenX;anchor.y=ev.screenY}function on_down(ev){anchor.x=ev.screenX;anchor.y=ev.screenY;anchor.t=+new Date;drag.resume();drag.emit("data",datum(anchor.x,anchor.y,anchor.t))}function on_up(ev){drag.pause();drag.emit("data",datum(ev.screenX-anchor.x,ev.screenY-anchor.y,+new Date))}function datum(dx,dy,when){return{dx:dx,dy:dy,dt:when-anchor.t}}}},{"domnode-dom":31,stream:21,through:35}],31:[function(require,module,exports){module.exports=require("./lib/index")},{"./lib/index":32}],32:[function(require,module,exports){var WriteStream=require("./writable"),ReadStream=require("./readable"),DOMStream={};DOMStream.WriteStream=WriteStream;DOMStream.ReadStream=ReadStream;DOMStream.createAppendStream=function(el,mimetype){return new DOMStream.WriteStream(el,DOMStream.WriteStream.APPEND,mimetype)};DOMStream.createWriteStream=function(el,mimetype){return new DOMStream.WriteStream(el,DOMStream.WriteStream.WRITE,mimetype)};DOMStream.createReadStream=DOMStream.createEventStream=function(el,type,preventDefault){preventDefault=preventDefault===undefined?true:preventDefault;return new DOMStream.ReadStream(el,type,preventDefault)};module.exports=DOMStream},{"./readable":33,"./writable":34}],33:[function(require,module,exports){module.exports=DOMStream;var Stream=require("stream").Stream;var listener=function(el,type,onmsg){return el.addEventListener(type,onmsg,false)};if(typeof $!=="undefined")listener=function(el,type,onmsg){return el=$(el)[type](onmsg)};if(typeof document!=="undefined"&&!document.createElement("div").addEventListener)listener=function(el,type,onmsg){return el.attachEvent("on"+type,onmsg)};function DOMStream(el,eventType,shouldPreventDefault){this.el=el;this.eventType=eventType;this.shouldPreventDefault=shouldPreventDefault;var self=this;if(el&&this.eventType)listener(this.el,this.eventType,function(){return self.listen.apply(self,arguments)});Stream.call(this)}var cons=DOMStream,proto=cons.prototype=Object.create(Stream.prototype);proto.constructor=cons;proto.listen=function(ev){if(this.shouldPreventDefault)ev.preventDefault?ev.preventDefault():ev.returnValue=false;var collectData=this.eventType==="submit"||this.eventType==="change"||this.eventType==="keydown"||this.eventType==="keyup"||this.eventType==="input";if(collectData){if(this.el.tagName.toUpperCase()==="FORM")return this.handleFormSubmit(ev);return this.emit("data",valueFromElement(this.el))}this.emit("data",ev)};proto.handleFormSubmit=function(ev){var elements=[];if(this.el.querySelectorAll){elements=this.el.querySelectorAll("input,textarea,select")}else{var inputs={INPUT:true,TEXTAREA:true,SELECT:true};var recurse=function(el){for(var i=0,len=el.childNodes.length;i<len;++i){if(el.childNodes[i].tagName){if(inputs[el.childNodes[i].tagName.toUpperCase()]){elements.push(el)}else{recurse(el.childNodes[i])}}}};recurse(this.el)}var output={},attr,val;for(var i=0,len=elements.length;i<len;++i){attr=elements[i].getAttribute("name");val=valueFromElement(elements[i]);if(val!==null){output[attr]=val}}return this.emit("data",output)};function valueFromElement(el){switch(el.getAttribute("type")){case"radio":return el.checked?el.value:null;case"checkbox":return"data",el.checked}return el.value}},{stream:21}],34:[function(require,module,exports){module.exports=DOMStream;var Stream=require("stream").Stream;function DOMStream(el,mode,mimetype){this.el=el;this.mode=mode;this.mimetype=mimetype||"text/html";Stream.call(this)}var cons=DOMStream,proto=cons.prototype=Object.create(Stream.prototype);proto.constructor=cons;cons.APPEND=0;cons.WRITE=1;proto.writable=true;proto.setMimetype=function(mime){this.mimetype=mime};proto.write=function(data){var result=this.mode===cons.APPEND?this.append(data):this.insert(data);this.emit("data",this.el.childNodes);return result};proto.end=function(){};proto.insert=function(data){this.el.innerHTML="";return this.append(data)};proto.append=function(data){var result=this[this.resolveMimetypeHandler()](data);for(var i=0,len=result.length;i<len;++i){this.el.appendChild(result[i])}return true};proto.resolveMimetypeHandler=function(){var type=this.mimetype.replace(/(\/\w)/,function(x){return x.slice(1).toUpperCase()});type=type.charAt(0).toUpperCase()+type.slice(1);return"construct"+type};proto.constructTextHtml=function(data){var isTableFragment=/(tr|td|th)/.test(data)&&!/table/.test(data),div;if(isTableFragment){div=document.createElement("table")}div=div||document.createElement("div");div.innerHTML=data;return[].slice.call(div.childNodes)};proto.constructTextPlain=function(data){var textNode=document.createTextNode(data);return[textNode]}},{stream:21}],35:[function(require,module,exports){(function(process){var Stream=require("stream");exports=module.exports=through;through.through=through;function through(write,end){write=write||function(data){this.emit("data",data)};end=end||function(){this.emit("end")};var ended=false,destroyed=false;var stream=new Stream,buffer=[];stream.buffer=buffer;stream.readable=stream.writable=true;stream.paused=false;stream.write=function(data){write.call(this,data);return!stream.paused};function drain(){while(buffer.length&&!stream.paused){var data=buffer.shift();if(null===data)return stream.emit("end");else stream.emit("data",data)}}stream.queue=function(data){buffer.push(data);drain()};stream.on("end",function(){stream.readable=false;if(!stream.writable)process.nextTick(function(){stream.destroy()})});function _end(){stream.writable=false;end.call(stream);if(!stream.readable)stream.destroy()}stream.end=function(data){if(ended)return;ended=true;if(arguments.length)stream.write(data);_end()};stream.destroy=function(){if(destroyed)return;destroyed=true;ended=true;buffer.length=0;stream.writable=stream.readable=false;stream.emit("close")};stream.pause=function(){if(stream.paused)return;stream.paused=true;stream.emit("pause")};stream.resume=function(){if(stream.paused){stream.paused=false}drain();if(!stream.paused)stream.emit("drain")};return stream}}).call(this,require("_process"))},{_process:9,stream:21}],36:[function(require,module,exports){module.exports=fullscreen;fullscreen.available=available;var EE=require("events").EventEmitter;function available(){return!!shim(document.body)}function fullscreen(el){var ael=el.addEventListener||el.attachEvent,doc=el.ownerDocument,body=doc.body,rfs=shim(el),ee=new EE;var vendors=["","webkit","moz","ms","o"];
for(var i=0,len=vendors.length;i<len;++i){ael.call(doc,vendors[i]+"fullscreenchange",onfullscreenchange);ael.call(doc,vendors[i]+"fullscreenerror",onfullscreenerror)}ee.release=release;ee.request=request;ee.target=fullscreenelement;if(!shim){setTimeout(function(){ee.emit("error",new Error("fullscreen is not supported"))},0)}return ee;function onfullscreenchange(){if(!fullscreenelement()){return ee.emit("release")}ee.emit("attain")}function onfullscreenerror(){ee.emit("error")}function request(){return rfs.call(el)}function release(){(el.exitFullscreen||el.exitFullscreen||el.webkitExitFullScreen||el.webkitExitFullscreen||el.mozExitFullScreen||el.mozExitFullscreen||el.msExitFullScreen||el.msExitFullscreen||el.oExitFullScreen||el.oExitFullscreen).call(el)}function fullscreenelement(){return 0||doc.fullScreenElement||doc.fullscreenElement||doc.webkitFullScreenElement||doc.webkitFullscreenElement||doc.mozFullScreenElement||doc.mozFullscreenElement||doc.msFullScreenElement||doc.msFullscreenElement||doc.oFullScreenElement||doc.oFullscreenElement||null}}function shim(el){return el.requestFullscreen||el.webkitRequestFullscreen||el.webkitRequestFullScreen||el.mozRequestFullscreen||el.mozRequestFullScreen||el.msRequestFullscreen||el.msRequestFullScreen||el.oRequestFullscreen||el.oRequestFullScreen}},{events:5}],37:[function(require,module,exports){module.exports=pointer;pointer.available=available;var EE=require("events").EventEmitter,Stream=require("stream").Stream;function available(){return!!shim(document.body)}function pointer(el){var ael=el.addEventListener||el.attachEvent,rel=el.removeEventListener||el.detachEvent,doc=el.ownerDocument,body=doc.body,rpl=shim(el),out={dx:0,dy:0,dt:0},ee=new EE,stream=null,lastPageX,lastPageY,needsFullscreen=false,mouseDownMS;ael.call(el,"mousedown",onmousedown,false);ael.call(el,"mouseup",onmouseup,false);ael.call(body,"mousemove",onmove,false);var vendors=["","webkit","moz","ms","o"];for(var i=0,len=vendors.length;i<len;++i){ael.call(doc,vendors[i]+"pointerlockchange",onpointerlockchange);ael.call(doc,vendors[i]+"pointerlockerror",onpointerlockerror)}ee.release=release;ee.target=pointerlockelement;ee.request=onmousedown;ee.destroy=function(){rel.call(el,"mouseup",onmouseup,false);rel.call(el,"mousedown",onmousedown,false);rel.call(el,"mousemove",onmove,false)};if(!shim){setTimeout(function(){ee.emit("error",new Error("pointer lock is not supported"))},0)}return ee;function onmousedown(ev){if(pointerlockelement()){return}mouseDownMS=+new Date;rpl.call(el)}function onmouseup(ev){if(!needsFullscreen){return}ee.emit("needs-fullscreen");needsFullscreen=false}function onpointerlockchange(ev){if(!pointerlockelement()){if(stream)release();return}stream=new Stream;stream.readable=true;stream.initial={x:lastPageX,y:lastPageY,t:Date.now()};ee.emit("attain",stream)}function onpointerlockerror(ev){var dt=+new Date-mouseDownMS;if(dt<100){needsFullscreen=true;return}if(stream){stream.emit("error",ev);stream=null}}function release(){ee.emit("release");if(stream){stream.emit("end");stream.readable=false;stream.emit("close");stream=null}var pel=pointerlockelement();if(!pel){return}(doc.exitPointerLock||doc.mozExitPointerLock||doc.webkitExitPointerLock||doc.msExitPointerLock||doc.oExitPointerLock).call(doc)}function onmove(ev){lastPageX=ev.pageX;lastPageY=ev.pageY;if(!stream)return;out.dx=ev.movementX||ev.webkitMovementX||ev.mozMovementX||ev.msMovementX||ev.oMovementX||0;out.dy=ev.movementY||ev.webkitMovementY||ev.mozMovementY||ev.msMovementY||ev.oMovementY||0;out.dt=Date.now()-stream.initial.t;ee.emit("data",out);stream.emit("data",out)}function pointerlockelement(){return 0||doc.pointerLockElement||doc.mozPointerLockElement||doc.webkitPointerLockElement||doc.msPointerLockElement||doc.oPointerLockElement||null}}function shim(el){return el.requestPointerLock||el.webkitRequestPointerLock||el.mozRequestPointerLock||el.msRequestPointerLock||el.oRequestPointerLock||null}},{events:5,stream:21}],38:[function(require,module,exports){var ever=require("ever"),vkey=require("vkey"),max=Math.max;module.exports=function(el,bindings,state){if(bindings===undefined||!el.ownerDocument){state=bindings;bindings=el;el=this.document.body}var ee=ever(el),measured={},enabled=true;state=state||{};for(var key in bindings){if(bindings[key]==="enabled"||bindings[key]==="enable"||bindings[key]==="disable"||bindings[key]==="destroy"){throw new Error(bindings[key]+" is reserved")}state[bindings[key]]=0;measured[key]=1}ee.on("keyup",wrapped(onoff(kb,false)));ee.on("keydown",wrapped(onoff(kb,true)));ee.on("mouseup",wrapped(onoff(mouse,false)));ee.on("mousedown",wrapped(onoff(mouse,true)));state.enabled=function(){return enabled};state.enable=enable_disable(true);state.disable=enable_disable(false);state.destroy=function(){ee.removeAllListeners()};return state;function clear(){for(var key in bindings){state[bindings[key]]=0;measured[key]=1}}function enable_disable(on_or_off){return function(){clear();enabled=on_or_off;return this}}function wrapped(fn){return function(ev){if(enabled){ev.preventDefault();fn(ev)}else{return}}}function onoff(find,on_or_off){return function(ev){var key=find(ev),binding=bindings[key];if(binding){state[binding]+=on_or_off?max(measured[key]--,0):-(measured[key]=1);if(!on_or_off&&state[binding]<0){state[binding]=0}}}}function mouse(ev){return"<mouse "+ev.which+">"}function kb(ev){return vkey[ev.keyCode]||ev.char}}},{ever:39,vkey:42}],39:[function(require,module,exports){var EventEmitter=require("events").EventEmitter;module.exports=function(elem){return new Ever(elem)};function Ever(elem){this.element=elem}Ever.prototype=new EventEmitter;Ever.prototype.on=function(name,cb,useCapture){if(!this._events)this._events={};if(!this._events[name])this._events[name]=[];this._events[name].push(cb);this.element.addEventListener(name,cb,useCapture||false);return this};Ever.prototype.addListener=Ever.prototype.on;Ever.prototype.removeListener=function(type,listener,useCapture){if(!this._events)this._events={};this.element.removeEventListener(type,listener,useCapture||false);var xs=this.listeners(type);var ix=xs.indexOf(listener);if(ix>=0)xs.splice(ix,1);return this};Ever.prototype.removeAllListeners=function(type){var self=this;function removeAll(t){var xs=self.listeners(t);for(var i=0;i<xs.length;i++){self.removeListener(t,xs[i])}}if(type){removeAll(type)}else if(self._events){for(var key in self._events){if(key)removeAll(key)}}return EventEmitter.prototype.removeAllListeners.apply(self,arguments)};var initSignatures=require("./init.json");Ever.prototype.emit=function(name,ev){if(typeof name==="object"){ev=name;name=ev.type}if(!isEvent(ev)){var type=Ever.typeOf(name);var opts=ev||{};if(opts.type===undefined)opts.type=name;ev=document.createEvent(type+"s");var init=typeof ev["init"+type]==="function"?"init"+type:"initEvent";var sig=initSignatures[init];var used={};var args=[];for(var i=0;i<sig.length;i++){var key=sig[i];args.push(opts[key]);used[key]=true}ev[init].apply(ev,args);for(var key in opts){if(!used[key])ev[key]=opts[key]}}return this.element.dispatchEvent(ev)};function isEvent(ev){var s=Object.prototype.toString.call(ev);return/\[object \S+Event\]/.test(s)}Ever.types=require("./types.json");Ever.typeOf=function(){var types={};for(var key in Ever.types){var ts=Ever.types[key];for(var i=0;i<ts.length;i++){types[ts[i]]=key}}return function(name){return types[name]||"Event"}}()},{"./init.json":40,"./types.json":41,events:5}],40:[function(require,module,exports){module.exports={initEvent:["type","canBubble","cancelable"],initUIEvent:["type","canBubble","cancelable","view","detail"],initMouseEvent:["type","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget"],initMutationEvent:["type","canBubble","cancelable","relatedNode","prevValue","newValue","attrName","attrChange"]}},{}],41:[function(require,module,exports){module.exports={MouseEvent:["click","mousedown","mouseup","mouseover","mousemove","mouseout"],KeyBoardEvent:["keydown","keyup","keypress"],MutationEvent:["DOMSubtreeModified","DOMNodeInserted","DOMNodeRemoved","DOMNodeRemovedFromDocument","DOMNodeInsertedIntoDocument","DOMAttrModified","DOMCharacterDataModified"],HTMLEvent:["load","unload","abort","error","select","change","submit","reset","focus","blur","resize","scroll"],UIEvent:["DOMFocusIn","DOMFocusOut","DOMActivate"]}},{}],42:[function(require,module,exports){var ua=typeof window!=="undefined"?window.navigator.userAgent:"",isOSX=/OS X/.test(ua),isOpera=/Opera/.test(ua),maybeFirefox=!/like Gecko/.test(ua)&&!isOpera;var i,output=module.exports={0:isOSX?"<menu>":"<UNK>",1:"<mouse 1>",2:"<mouse 2>",3:"<break>",4:"<mouse 3>",5:"<mouse 4>",6:"<mouse 5>",8:"<backspace>",9:"<tab>",12:"<clear>",13:"<enter>",16:"<shift>",17:"<control>",18:"<alt>",19:"<pause>",20:"<caps-lock>",21:"<ime-hangul>",23:"<ime-junja>",24:"<ime-final>",25:"<ime-kanji>",27:"<escape>",28:"<ime-convert>",29:"<ime-nonconvert>",30:"<ime-accept>",31:"<ime-mode-change>",27:"<escape>",32:"<space>",33:"<page-up>",34:"<page-down>",35:"<end>",36:"<home>",37:"<left>",38:"<up>",39:"<right>",40:"<down>",41:"<select>",42:"<print>",43:"<execute>",44:"<snapshot>",45:"<insert>",46:"<delete>",47:"<help>",91:"<meta>",92:"<meta>",93:isOSX?"<meta>":"<menu>",95:"<sleep>",106:"<num-*>",107:"<num-+>",108:"<num-enter>",109:"<num-->",110:"<num-.>",111:"<num-/>",144:"<num-lock>",145:"<scroll-lock>",160:"<shift-left>",161:"<shift-right>",162:"<control-left>",163:"<control-right>",164:"<alt-left>",165:"<alt-right>",166:"<browser-back>",167:"<browser-forward>",168:"<browser-refresh>",169:"<browser-stop>",170:"<browser-search>",171:"<browser-favorites>",172:"<browser-home>",173:isOSX&&maybeFirefox?"-":"<volume-mute>",174:"<volume-down>",175:"<volume-up>",176:"<next-track>",177:"<prev-track>",178:"<stop>",179:"<play-pause>",180:"<launch-mail>",181:"<launch-media-select>",182:"<launch-app 1>",183:"<launch-app 2>",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",223:"<meta>",224:"<meta>",226:"<alt-gr>",229:"<ime-process>",231:isOpera?"`":"<unicode>",246:"<attention>",247:"<crsel>",248:"<exsel>",249:"<erase-eof>",250:"<play>",251:"<zoom>",252:"<no-name>",253:"<pa-1>",254:"<clear>"};for(i=58;i<65;++i){output[i]=String.fromCharCode(i)}for(i=48;i<58;++i){output[i]=i-48+""}for(i=65;i<91;++i){output[i]=String.fromCharCode(i)}for(i=96;i<106;++i){output[i]="<num-"+(i-96)+">"}for(i=112;i<136;++i){output[i]="F"+(i-111)}},{}],43:[function(require,module,exports){module.exports=pin;var pins={},stack_holder={},pin_holder;function make_pin_for(name,obj){var container=document.createElement("div"),header=document.createElement("h4"),body=document.createElement("pre");container.style.background="white";container.style.marginBottom="4px";container.appendChild(header);container.appendChild(body);header.textContents=header.innerText=obj&&obj.repr?obj.repr():name;body.style.padding="8px";if(!pin_holder){pin_holder=document.createElement("div");pin_holder.style.position="absolute";pin_holder.style.top=pin_holder.style.right="4px";document.body.appendChild(pin_holder)}pin_holder.appendChild(container);return(pins[name]=pins[name]||[]).push({body:body,last:-Infinity,for_object:obj}),pins[name]}function update_pin(item,into,retain,depth){if(!retain)into.innerHTML="";if(depth>1)return;depth=depth||0;switch(typeof item){case"number":into.innerText+=item.toFixed(3);break;case"string":into.innerText+='"'+item+'"';break;case"undefined":case"object":if(item){for(var key in item)if(item.hasOwnProperty(key)){into.innerText+=key+":";update_pin(item[key],into,true,depth+1);into.innerText+="\n"}break}case"boolean":into.innerText+=""+item;break}}function pin(item,every,obj,name){if(!name)Error.captureStackTrace(stack_holder);var location=name||stack_holder.stack.split("\n").slice(2)[0].replace(/^\s+at /g,""),target=pins[location]||make_pin_for(location,obj),now=Date.now(),every=every||0;if(arguments.length<3)target=target[0];else{for(var i=0,len=target.length;i<len;++i){if(target[i].for_object===obj){target=target[i];break}}if(i===len){pins[location].push(target=make_pin_for(location,obj))}}if(now-target.last>every){update_pin(item,target.body);target.last=now}}},{}],44:[function(require,module,exports){module.exports=raf;var EE=require("events").EventEmitter,global=typeof window==="undefined"?this:window;var _raf=global.requestAnimationFrame||global.webkitRequestAnimationFrame||global.mozRequestAnimationFrame||global.msRequestAnimationFrame||global.oRequestAnimationFrame||(global.setImmediate?function(fn,el){setImmediate(fn)}:function(fn,el){setTimeout(fn,0)});function raf(el){var now=raf.now(),ee=new EE;ee.pause=function(){ee.paused=true};ee.resume=function(){ee.paused=false};_raf(iter,el);return ee;function iter(timestamp){var _now=raf.now(),dt=_now-now;now=_now;ee.emit("data",dt);if(!ee.paused){_raf(iter,el)}}}raf.polyfill=_raf;raf.now=function(){return Date.now()}},{events:5}],45:[function(require,module,exports){module.exports=SpatialEventEmitter;var slice=[].slice,Tree=require("./tree"),aabb=require("aabb-3d");function SpatialEventEmitter(){this.root=null;this.infinites={}}var cons=SpatialEventEmitter,proto=cons.prototype;proto.size=16;proto.addListener=proto.addEventListener=proto.on=function(event,bbox,listener){if(!finite(bbox)){(this.infinites[event]=this.infinites[event]||[]).push({bbox:bbox,func:listener});return this}(this.root=this.root||this.create_root(bbox)).add(event,bbox,listener);return this};proto.once=function(event,bbox,listener){var self=this;self.on(event,bbox,function once(){listener.apply(null,arguments);self.remove(event,once)});return self};proto.removeListener=proto.removeEventListener=proto.remove=function(event,listener){if(this.root){this.root.remove(event,listener)}if(!this.infinites[event]){return this}for(var i=0,len=this.infinites[event].length;i<len;++i){if(this.infinites[event][i].func===listener){break}}if(i!==len){this.infinites[event].splice(i,1)}return this};proto.emit=function(event,bbox){var args=slice.call(arguments,2);if("0"in bbox){bbox=aabb(bbox,[0,0,0])}if(this.root){this.root.send(event,bbox,args)}if(!this.infinites[event]){return this}var list=this.infinites[event].slice();for(var i=0,len=list.length;i<len;++i){if(list[i].bbox.intersects(bbox)){list[i].func.apply(null,args)}}return this};proto.rootSize=function(size){proto.size=size};proto.create_root=function(bbox){var self=this,size=self.size,base=[Math.floor(bbox.x0()/size)*size,Math.floor(bbox.y0()/size)*size,Math.floor(bbox.z0()/size)*size],tree_bbox=new bbox.constructor(base,[size,size,size]);function OurTree(size,bbox){Tree.call(this,size,bbox,null)}OurTree.prototype=Object.create(Tree.prototype);OurTree.prototype.constructor=OurTree;OurTree.prototype.grow=function(new_root){self.root=new_root};OurTree.prototype.min_size=size;return new OurTree(size,tree_bbox)};function finite(bbox){return isFinite(bbox.x0())&&isFinite(bbox.x1())&&isFinite(bbox.y0())&&isFinite(bbox.y1())&&isFinite(bbox.z0())&&isFinite(bbox.z1())}},{"./tree":46,"aabb-3d":25}],46:[function(require,module,exports){module.exports=Tree;var aabb=require("aabb-3d");function Tree(size,bbox,parent){this.listeners={};this.size=size;this.bbox=bbox;this.parent=parent;this.children=[]}var cons=Tree,proto=cons.prototype;proto.add=function(event,bbox,listener){if(!this.parent&&!this.contains(bbox)){return this.expand(bbox).add(event,bbox,listener)}for(var i=0,len=this.children.length;i<len;++i){if(this.children[i].contains(bbox)){return this.children[i].add(event,bbox,listener)}}var size=this.size/2;if(size>this.min_size&&bbox.vec[0]<size&&bbox.vec[1]<size&&bbox.vec[2]<size){if(Math.floor(bbox.x0()/size)===Math.floor(bbox.x1()/size)&&Math.floor(bbox.y0()/size)===Math.floor(bbox.y1()/size)&&Math.floor(bbox.z0()/size)===Math.floor(bbox.z1()/size)){var inst=new this.constructor(size,aabb([Math.floor(bbox.x0()/size)*size,Math.floor(bbox.y0()/size)*size,Math.floor(bbox.z0()/size)*size],[size,size,size]),this);this.children.push(inst);return inst.add(event,bbox,listener)}}(this.listeners[event]=this.listeners[event]||[]).push({bbox:bbox,func:listener})};proto.contains=function(bbox){return bbox.x0()>=this.bbox.x0()&&bbox.y0()>=this.bbox.y0()&&bbox.z0()>=this.bbox.z0()&&bbox.x1()<=this.bbox.x1()&&bbox.y1()<=this.bbox.y1()&&bbox.z1()<=this.bbox.z1()};proto.expand=function(bbox){var size=this.size,new_size=size*2,expanded=this.bbox.expand(bbox),new_i=Math.floor(bbox.x0()/size),new_j=Math.floor(bbox.y0()/size),new_k=Math.floor(bbox.z0()/size),cur_i=Math.floor(this.bbox.x0()/size),cur_j=Math.floor(this.bbox.y0()/size),cur_k=Math.floor(this.bbox.z0()/size),new_base=[new_i-cur_i>=0?cur_i:cur_i-1,new_j-cur_j>=0?cur_j:cur_j-1,new_k-cur_k>=0?cur_k:cur_k-1].map(function(ii){return ii*size}),new_bbox=aabb(new_base,[new_size,new_size,new_size]),new_root=new this.constructor(new_size,new_bbox),self=this;this.parent=new_root;this.grow(this.parent);new_root.children.push(self);return new_root};proto.remove=function(event,listener){var list=this.listeners[event];if(list){for(var i=0,len=list.length;i<len;++i){if(list[i].func===listener)break}if(i!==len){list.splice(i,1)}}for(var i=0,len=this.children.length;i<len;++i){this.children[i].remove(event,listener)}};proto.send=function(event,bbox,args){for(var i=0,len=this.children.length;i<len;++i){if(bbox.intersects(this.children[i].bbox)){this.children[i].send(event,bbox,args)}}var list=this.listeners[event];if(!list){return}for(var i=0,len=list.length;i<len;++i){if(list[i].bbox.intersects(bbox)){list[i].func.apply(null,args)}}}},{"aabb-3d":25}],47:[function(require,module,exports){(function(process){var window=window||{};var self=self||{};if(window.performance===undefined){window.performance={}}if(window.performance.now===undefined){window.performance.now=function(){var time=process.hrtime();return(time[0]+time[1]/1e9)*1e3}}var THREE=THREE||{REVISION:"56"};self.console=self.console||{info:function(){},log:function(){},debug:function(){},warn:function(){},error:function(){}};self.Int32Array=self.Int32Array||Array;self.Float32Array=self.Float32Array||Array;String.prototype.trim=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")};THREE.extend=function(obj,source){if(Object.keys){var keys=Object.keys(source);for(var i=0,il=keys.length;i<il;i++){var prop=keys[i];Object.defineProperty(obj,prop,Object.getOwnPropertyDescriptor(source,prop))}}else{var safeHasOwnProperty={}.hasOwnProperty;for(var prop in source){if(safeHasOwnProperty.call(source,prop)){obj[prop]=source[prop]}}}return obj};(function(){var lastTime=0;var vendors=["ms","moz","webkit","o"];for(var x=0;x<vendors.length&&!window.requestAnimationFrame;++x){window.requestAnimationFrame=window[vendors[x]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[vendors[x]+"CancelAnimationFrame"]||window[vendors[x]+"CancelRequestAnimationFrame"]}if(window.requestAnimationFrame===undefined){window.requestAnimationFrame=function(callback){var currTime=Date.now(),timeToCall=Math.max(0,16-(currTime-lastTime));var id=window.setTimeout(function(){callback(currTime+timeToCall)},timeToCall);lastTime=currTime+timeToCall;return id}}window.cancelAnimationFrame=window.cancelAnimationFrame||function(id){window.clearTimeout(id)}})();THREE.CullFaceNone=0;THREE.CullFaceBack=1;THREE.CullFaceFront=2;THREE.CullFaceFrontBack=3;THREE.FrontFaceDirectionCW=0;THREE.FrontFaceDirectionCCW=1;THREE.BasicShadowMap=0;THREE.PCFShadowMap=1;THREE.PCFSoftShadowMap=2;THREE.FrontSide=0;THREE.BackSide=1;THREE.DoubleSide=2;THREE.NoShading=0;THREE.FlatShading=1;THREE.SmoothShading=2;THREE.NoColors=0;THREE.FaceColors=1;THREE.VertexColors=2;THREE.NoBlending=0;THREE.NormalBlending=1;THREE.AdditiveBlending=2;THREE.SubtractiveBlending=3;THREE.MultiplyBlending=4;THREE.CustomBlending=5;THREE.AddEquation=100;THREE.SubtractEquation=101;THREE.ReverseSubtractEquation=102;THREE.ZeroFactor=200;THREE.OneFactor=201;THREE.SrcColorFactor=202;THREE.OneMinusSrcColorFactor=203;THREE.SrcAlphaFactor=204;THREE.OneMinusSrcAlphaFactor=205;THREE.DstAlphaFactor=206;THREE.OneMinusDstAlphaFactor=207;THREE.DstColorFactor=208;THREE.OneMinusDstColorFactor=209;THREE.SrcAlphaSaturateFactor=210;THREE.MultiplyOperation=0;THREE.MixOperation=1;THREE.AddOperation=2;THREE.UVMapping=function(){};THREE.CubeReflectionMapping=function(){};THREE.CubeRefractionMapping=function(){};THREE.SphericalReflectionMapping=function(){};THREE.SphericalRefractionMapping=function(){};THREE.RepeatWrapping=1e3;THREE.ClampToEdgeWrapping=1001;THREE.MirroredRepeatWrapping=1002;THREE.NearestFilter=1003;THREE.NearestMipMapNearestFilter=1004;THREE.NearestMipMapLinearFilter=1005;THREE.LinearFilter=1006;THREE.LinearMipMapNearestFilter=1007;THREE.LinearMipMapLinearFilter=1008;THREE.UnsignedByteType=1009;THREE.ByteType=1010;THREE.ShortType=1011;THREE.UnsignedShortType=1012;THREE.IntType=1013;THREE.UnsignedIntType=1014;THREE.FloatType=1015;THREE.UnsignedShort4444Type=1016;THREE.UnsignedShort5551Type=1017;THREE.UnsignedShort565Type=1018;THREE.AlphaFormat=1019;THREE.RGBFormat=1020;THREE.RGBAFormat=1021;THREE.LuminanceFormat=1022;THREE.LuminanceAlphaFormat=1023;THREE.RGB_S3TC_DXT1_Format=2001;THREE.RGBA_S3TC_DXT1_Format=2002;THREE.RGBA_S3TC_DXT3_Format=2003;THREE.RGBA_S3TC_DXT5_Format=2004;THREE.Color=function(value){if(value!==undefined)this.set(value);return this};THREE.extend(THREE.Color.prototype,{r:1,g:1,b:1,set:function(value){switch(typeof value){case"number":this.setHex(value);break;case"string":this.setStyle(value);break}},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},setHSV:function(h,s,v){console.log("DEPRECATED: Color's .setHSV() will be removed. Use .setHSL( h, s, l ) instead.");return this.setHSL(h,s*v/((h=(2-s)*v)<1?h:2-h),h/2)},setHSL:function(h,s,l){if(s===0){this.r=this.g=this.b=l}else{var hue2rgb=function(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};var p=l<=.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){if(/^rgb\((\d+),(\d+),(\d+)\)$/i.test(style)){var color=/^rgb\((\d+),(\d+),(\d+)\)$/i.exec(style);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;return this}if(/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.test(style)){var color=/^rgb\((\d+)\%,(\d+)\%,(\d+)\%\)$/i.exec(style);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;return this}if(/^\#([0-9a-f]{6})$/i.test(style)){var color=/^\#([0-9a-f]{6})$/i.exec(style);this.setHex(parseInt(color[1],16));return this}if(/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(style)){var color=/^\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(style);this.setHex(parseInt(color[1]+color[1]+color[2]+color[2]+color[3]+color[3],16));return this}if(/^(\w+)$/i.test(style)){this.setHex(THREE.ColorKeywords[style]);return this}},copy:function(color){this.r=color.r;this.g=color.g;this.b=color.b;return this},copyGammaToLinear:function(color){this.r=color.r*color.r;this.g=color.g*color.g;this.b=color.b*color.b;return this},copyLinearToGamma:function(color){this.r=Math.sqrt(color.r);this.g=Math.sqrt(color.g);this.b=Math.sqrt(color.b);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(){var hsl={h:0,s:0,l:0};return function(){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;if(min===max){hue=0;saturation=0}else{var delta=max-min;saturation=lightness<=.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},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},clone:function(){return(new THREE.Color).setRGB(this.r,this.g,this.b)}});THREE.ColorKeywords={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};THREE.Quaternion=function(x,y,z,w){this.x=x||0;this.y=y||0;this.z=z||0;this.w=w!==undefined?w:1};THREE.extend(THREE.Quaternion.prototype,{set:function(x,y,z,w){this.x=x;this.y=y;this.z=z;this.w=w;return this},copy:function(q){this.x=q.x;this.y=q.y;this.z=q.z;this.w=q.w;return this},setFromEuler:function(v,order){var c1=Math.cos(v.x/2);var c2=Math.cos(v.y/2);var c3=Math.cos(v.z/2);var s1=Math.sin(v.x/2);var s2=Math.sin(v.y/2);var s3=Math.sin(v.z/2);if(order===undefined||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}return this},setFromAxisAngle:function(axis,angle){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);return this},setFromRotationMatrix:function(m){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=.5/Math.sqrt(trace+1);this.w=.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*Math.sqrt(1+m11-m22-m33);this.w=(m32-m23)/s;this.x=.25*s;this.y=(m12+m21)/s;this.z=(m13+m31)/s}else if(m22>m33){s=2*Math.sqrt(1+m22-m11-m33);this.w=(m13-m31)/s;this.x=(m12+m21)/s;this.y=.25*s;this.z=(m23+m32)/s}else{s=2*Math.sqrt(1+m33-m11-m22);this.w=(m21-m12)/s;this.x=(m13+m31)/s;this.y=(m23+m32)/s;this.z=.25*s}return this},inverse:function(){this.conjugate().normalize();return this},conjugate:function(){this.x*=-1;this.y*=-1;this.z*=-1;return this},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},normalize:function(){var 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}return this},multiply:function(q,p){if(p!==undefined){console.warn("DEPRECATED: Quaternion's .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.");return this.multiplyQuaternions(q,p)}return this.multiplyQuaternions(this,q)},multiplyQuaternions:function(a,b){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;return this},multiplyVector3:function(vector){console.warn("DEPRECATED: Quaternion's .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return vector.applyQuaternion(this)},slerp:function(qb,t){var x=this.x,y=this.y,z=this.z,w=this.w;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){this.w=w;this.x=x;this.y=y;this.z=z;return this}var halfTheta=Math.acos(cosHalfTheta);var sinHalfTheta=Math.sqrt(1-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<.001){this.w=.5*(w+this.w);this.x=.5*(x+this.x);this.y=.5*(y+this.y);this.z=.5*(z+this.z);return this}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;return this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w},clone:function(){return new THREE.Quaternion(this.x,this.y,this.z,this.w);
}});THREE.Quaternion.slerp=function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t)};THREE.Vector2=function(x,y){this.x=x||0;this.y=y||0};THREE.extend(THREE.Vector2.prototype,{set:function(x,y){this.x=x;this.y=y;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)}},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)}},copy:function(v){this.x=v.x;this.y=v.y;return this},add:function(v,w){if(w!==undefined){console.warn("DEPRECATED: Vector2's .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},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScalar:function(s){this.x+=s;this.y+=s;return this},sub:function(v,w){if(w!==undefined){console.warn("DEPRECATED: Vector2's .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},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiplyScalar:function(s){this.x*=s;this.y*=s;return this},divideScalar:function(s){if(s!==0){this.x/=s;this.y/=s}else{this.set(0,0)}return this},min:function(v){if(this.x>v.x){this.x=v.x}if(this.y>v.y){this.y=v.y}return this},max:function(v){if(this.x<v.x){this.x=v.x}if(this.y<v.y){this.y=v.y}return this},clamp:function(min,max){if(this.x<min.x){this.x=min.x}else if(this.x>max.x){this.x=max.x}if(this.y<min.y){this.y=min.y}else if(this.y>max.y){this.y=max.y}return this},negate:function(){return this.multiplyScalar(-1)},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)},normalize:function(){return this.divideScalar(this.length())},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},setLength:function(l){var oldLength=this.length();if(oldLength!==0&&l!==oldLength){this.multiplyScalar(l/oldLength)}return this},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;return this},equals:function(v){return v.x===this.x&&v.y===this.y},toArray:function(){return[this.x,this.y]},clone:function(){return new THREE.Vector2(this.x,this.y)}});THREE.Vector3=function(x,y,z){this.x=x||0;this.y=y||0;this.z=z||0};THREE.extend(THREE.Vector3.prototype,{set:function(x,y,z){this.x=x;this.y=y;this.z=z;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)}},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)}},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("DEPRECATED: Vector3's .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},sub:function(v,w){if(w!==undefined){console.warn("DEPRECATED: Vector3's .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},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("DEPRECATED: Vector3's .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(s){this.x*=s;this.y*=s;this.z*=s;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyMatrix3:function(m){var x=this.x;var y=this.y;var 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];return this},applyProjection:function(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;var d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d;this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d;this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d;return this},applyQuaternion:function(q){var x=this.x;var y=this.y;var z=this.z;var qx=q.x;var qy=q.y;var qz=q.z;var qw=q.w;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;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},applyEuler:function(){var q1=new THREE.Quaternion;return function(v,eulerOrder){var quaternion=q1.setFromEuler(v,eulerOrder);this.applyQuaternion(quaternion);return this}}(),applyAxisAngle:function(){var q1=new THREE.Quaternion;return function(axis,angle){var quaternion=q1.setFromAxisAngle(axis,angle);this.applyQuaternion(quaternion);return this}}(),transformDirection: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;this.y=e[1]*x+e[5]*y+e[9]*z;this.z=e[2]*x+e[6]*y+e[10]*z;this.normalize();return this},divide:function(v){this.x/=v.x;this.y/=v.y;this.z/=v.z;return this},divideScalar:function(s){if(s!==0){this.x/=s;this.y/=s;this.z/=s}else{this.x=0;this.y=0;this.z=0}return this},min:function(v){if(this.x>v.x){this.x=v.x}if(this.y>v.y){this.y=v.y}if(this.z>v.z){this.z=v.z}return this},max:function(v){if(this.x<v.x){this.x=v.x}if(this.y<v.y){this.y=v.y}if(this.z<v.z){this.z=v.z}return this},clamp:function(min,max){if(this.x<min.x){this.x=min.x}else if(this.x>max.x){this.x=max.x}if(this.y<min.y){this.y=min.y}else if(this.y>max.y){this.y=max.y}if(this.z<min.z){this.z=min.z}else if(this.z>max.z){this.z=max.z}return this},negate:function(){return this.multiplyScalar(-1)},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(l){var oldLength=this.length();if(oldLength!==0&&l!==oldLength){this.multiplyScalar(l/oldLength)}return this},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},cross:function(v,w){if(w!==undefined){console.warn("DEPRECATED: Vector3's .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){this.x=a.y*b.z-a.z*b.y;this.y=a.z*b.x-a.x*b.z;this.z=a.x*b.y-a.y*b.x;return this},projectOnVector:function(){var v1=new THREE.Vector3;return function(vector){v1.copy(vector).normalize();var d=this.dot(v1);return this.copy(v1).multiplyScalar(d)}}(),projectOnPlane:function(){var v1=new THREE.Vector3;return function(planeNormal){v1.copy(this).projectOnVector(planeNormal);return this.sub(v1)}}(),reflect:function(){var v1=new THREE.Vector3;return function(vector){v1.copy(this).projectOnVector(vector).multiplyScalar(2);return this.subVectors(v1,this)}}(),angleTo:function(v){var theta=this.dot(v)/(this.length()*v.length());return Math.acos(THREE.Math.clamp(theta,-1,1))},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v))},distanceToSquared:function(v){var dx=this.x-v.x;var dy=this.y-v.y;var dz=this.z-v.z;return dx*dx+dy*dy+dz*dz},getPositionFromMatrix:function(m){this.x=m.elements[12];this.y=m.elements[13];this.z=m.elements[14];return this},setEulerFromRotationMatrix:function(m,order){function clamp(x){return Math.min(Math.max(x,-1),1)}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];if(order===undefined||order==="XYZ"){this.y=Math.asin(clamp(m13));if(Math.abs(m13)<.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));if(Math.abs(m23)<.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));if(Math.abs(m32)<.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));if(Math.abs(m31)<.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));if(Math.abs(m21)<.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));if(Math.abs(m12)<.99999){this.x=Math.atan2(m32,m22);this.y=Math.atan2(m13,m11)}else{this.x=Math.atan2(-m23,m33);this.y=0}}return this},setEulerFromQuaternion:function(q,order){function clamp(x){return Math.min(Math.max(x,-1),1)}var sqx=q.x*q.x;var sqy=q.y*q.y;var sqz=q.z*q.z;var sqw=q.w*q.w;if(order===undefined||order==="XYZ"){this.x=Math.atan2(2*(q.x*q.w-q.y*q.z),sqw-sqx-sqy+sqz);this.y=Math.asin(clamp(2*(q.x*q.z+q.y*q.w)));this.z=Math.atan2(2*(q.z*q.w-q.x*q.y),sqw+sqx-sqy-sqz)}else if(order==="YXZ"){this.x=Math.asin(clamp(2*(q.x*q.w-q.y*q.z)));this.y=Math.atan2(2*(q.x*q.z+q.y*q.w),sqw-sqx-sqy+sqz);this.z=Math.atan2(2*(q.x*q.y+q.z*q.w),sqw-sqx+sqy-sqz)}else if(order==="ZXY"){this.x=Math.asin(clamp(2*(q.x*q.w+q.y*q.z)));this.y=Math.atan2(2*(q.y*q.w-q.z*q.x),sqw-sqx-sqy+sqz);this.z=Math.atan2(2*(q.z*q.w-q.x*q.y),sqw-sqx+sqy-sqz)}else if(order==="ZYX"){this.x=Math.atan2(2*(q.x*q.w+q.z*q.y),sqw-sqx-sqy+sqz);this.y=Math.asin(clamp(2*(q.y*q.w-q.x*q.z)));this.z=Math.atan2(2*(q.x*q.y+q.z*q.w),sqw+sqx-sqy-sqz)}else if(order==="YZX"){this.x=Math.atan2(2*(q.x*q.w-q.z*q.y),sqw-sqx+sqy-sqz);this.y=Math.atan2(2*(q.y*q.w-q.x*q.z),sqw+sqx-sqy-sqz);this.z=Math.asin(clamp(2*(q.x*q.y+q.z*q.w)))}else if(order==="XZY"){this.x=Math.atan2(2*(q.x*q.w+q.y*q.z),sqw-sqx+sqy-sqz);this.y=Math.atan2(2*(q.x*q.z+q.y*q.w),sqw+sqx-sqy-sqz);this.z=Math.asin(clamp(2*(q.z*q.w-q.x*q.y)))}return this},getScaleFromMatrix:function(m){var sx=this.set(m.elements[0],m.elements[1],m.elements[2]).length();var sy=this.set(m.elements[4],m.elements[5],m.elements[6]).length();var sz=this.set(m.elements[8],m.elements[9],m.elements[10]).length();this.x=sx;this.y=sy;this.z=sz;return this},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z},toArray:function(){return[this.x,this.y,this.z]},clone:function(){return new THREE.Vector3(this.x,this.y,this.z)}});THREE.Vector4=function(x,y,z,w){this.x=x||0;this.y=y||0;this.z=z||0;this.w=w!==undefined?w:1};THREE.extend(THREE.Vector4.prototype,{set:function(x,y,z,w){this.x=x;this.y=y;this.z=z;this.w=w;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)}},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)}},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("DEPRECATED: Vector4's .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},sub:function(v,w){if(w!==undefined){console.warn("DEPRECATED: Vector4's .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},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(s){this.x*=s;this.y*=s;this.z*=s;this.w*=s;return this},applyMatrix4:function(m){var x=this.x;var y=this.y;var z=this.z;var 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(s){if(s!==0){this.x/=s;this.y/=s;this.z/=s;this.w/=s}else{this.x=0;this.y=0;this.z=0;this.w=1}return this},setAxisAngleFromQuaternion:function(q){this.w=2*Math.acos(q.w);var s=Math.sqrt(1-q.w*q.w);if(s<1e-4){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){var angle,x,y,z,epsilon=.01,epsilon2=.1,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){if(Math.abs(m12+m21)<epsilon2&&Math.abs(m13+m31)<epsilon2&&Math.abs(m23+m32)<epsilon2&&Math.abs(m11+m22+m33-3)<epsilon2){this.set(1,0,0,0);return this}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){if(xx<epsilon){x=0;y=.707106781;z=.707106781}else{x=Math.sqrt(xx);y=xy/x;z=xz/x}}else if(yy>zz){if(yy<epsilon){x=.707106781;y=0;z=.707106781}else{y=Math.sqrt(yy);x=xy/y;z=yz/y}}else{if(zz<epsilon){x=.707106781;y=.707106781;z=0}else{z=Math.sqrt(zz);x=xz/z;y=yz/z}}this.set(x,y,z,angle);return this}var s=Math.sqrt((m32-m23)*(m32-m23)+(m13-m31)*(m13-m31)+(m21-m12)*(m21-m12));if(Math.abs(s)<.001)s=1;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){if(this.x>v.x){this.x=v.x}if(this.y>v.y){this.y=v.y}if(this.z>v.z){this.z=v.z}if(this.w>v.w){this.w=v.w}return this},max:function(v){if(this.x<v.x){this.x=v.x}if(this.y<v.y){this.y=v.y}if(this.z<v.z){this.z=v.z}if(this.w<v.w){this.w=v.w}return this},clamp:function(min,max){if(this.x<min.x){this.x=min.x}else if(this.x>max.x){this.x=max.x}if(this.y<min.y){this.y=min.y}else if(this.y>max.y){this.y=max.y}if(this.z<min.z){this.z=min.z}else if(this.z>max.z){this.z=max.z}if(this.w<min.w){this.w=min.w}else if(this.w>max.w){this.w=max.w}return this},negate:function(){return this.multiplyScalar(-1)},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(l){var oldLength=this.length();if(oldLength!==0&&l!==oldLength){this.multiplyScalar(l/oldLength)}return this},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},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w},toArray:function(){return[this.x,this.y,this.z,this.w]},clone:function(){return new THREE.Vector4(this.x,this.y,this.z,this.w)}});THREE.Box2=function(min,max){this.min=min!==undefined?min:new THREE.Vector2(Infinity,Infinity);this.max=max!==undefined?max:new THREE.Vector2(-Infinity,-Infinity)};THREE.extend(THREE.Box2.prototype,{set:function(min,max){this.min.copy(min);this.max.copy(max);return this},setFromPoints:function(points){if(points.length>0){var point=points[0];this.min.copy(point);this.max.copy(point);for(var i=1,il=points.length;i<il;i++){point=points[i];if(point.x<this.min.x){this.min.x=point.x}else if(point.x>this.max.x){this.max.x=point.x}if(point.y<this.min.y){this.min.y=point.y}else if(point.y>this.max.y){this.max.y=point.y}}}else{this.makeEmpty()}return this},setFromCenterAndSize:function(){var v1=new THREE.Vector2;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);this.min.copy(center).sub(halfSize);this.max.copy(center).add(halfSize);return 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},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},center:function(optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.addVectors(this.min,this.max).multiplyScalar(.5)},size:function(optionalTarget){var result=optionalTarget||new THREE.Vector2;return 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){if(point.x<this.min.x||point.x>this.max.x||point.y<this.min.y||point.y>this.max.y){return false}return true},containsBox:function(box){if(this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y){return true}return false},getParameter:function(point){return new THREE.Vector2((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y))},isIntersectionBox:function(box){if(box.max.x<this.min.x||box.min.x>this.max.x||box.max.y<this.min.y||box.min.y>this.max.y){return false}return true},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector2;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector2;return function(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)},clone:function(){return(new THREE.Box2).copy(this)}});THREE.Box3=function(min,max){this.min=min!==undefined?min:new THREE.Vector3(Infinity,Infinity,Infinity);this.max=max!==undefined?max:new THREE.Vector3(-Infinity,-Infinity,-Infinity)};THREE.extend(THREE.Box3.prototype,{set:function(min,max){this.min.copy(min);this.max.copy(max);return this},setFromPoints:function(points){if(points.length>0){var point=points[0];this.min.copy(point);this.max.copy(point);for(var i=1,il=points.length;i<il;i++){point=points[i];if(point.x<this.min.x){this.min.x=point.x}else if(point.x>this.max.x){this.max.x=point.x}if(point.y<this.min.y){this.min.y=point.y}else if(point.y>this.max.y){this.max.y=point.y}if(point.z<this.min.z){this.min.z=point.z}else if(point.z>this.max.z){this.max.z=point.z}}}else{this.makeEmpty()}return this},setFromCenterAndSize:function(){var v1=new THREE.Vector3;return function(center,size){var halfSize=v1.copy(size).multiplyScalar(.5);this.min.copy(center).sub(halfSize);this.max.copy(center).add(halfSize);return 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},empty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},center:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.min,this.max).multiplyScalar(.5)},size:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return 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){if(point.x<this.min.x||point.x>this.max.x||point.y<this.min.y||point.y>this.max.y||point.z<this.min.z||point.z>this.max.z){return false}return true},containsBox:function(box){if(this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y&&this.min.z<=box.min.z&&box.max.z<=this.max.z){return true}return false},getParameter:function(point){return new THREE.Vector3((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))},isIntersectionBox:function(box){if(box.max.x<this.min.x||box.min.x>this.max.x||box.max.y<this.min.y||box.min.y>this.max.y||box.max.z<this.min.z||box.min.z>this.max.z){return false}return true},clampPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(point).clamp(this.min,this.max)},distanceToPoint:function(){var v1=new THREE.Vector3;return function(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length()}}(),getBoundingSphere:function(){var v1=new THREE.Vector3;return function(optionalTarget){var result=optionalTarget||new THREE.Sphere;result.center=this.center();result.radius=this.size(v1).length()*.5;return result}}(),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},applyMatrix4:function(){var points=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];return function(matrix){points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix);points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix);points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix);points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix);points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix);points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix);points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix);points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix);this.makeEmpty();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)},clone:function(){return(new THREE.Box3).copy(this)}});THREE.Matrix3=function(n11,n12,n13,n21,n22,n23,n31,n32,n33){this.elements=new Float32Array(9);this.set(n11!==undefined?n11:1,n12||0,n13||0,n21||0,n22!==undefined?n22:1,n23||0,n31||0,n32||0,n33!==undefined?n33:1)};THREE.extend(THREE.Matrix3.prototype,{set:function(n11,n12,n13,n21,n22,n23,n31,n32,n33){var te=this.elements;te[0]=n11;te[3]=n12;te[6]=n13;te[1]=n21;te[4]=n22;te[7]=n23;te[2]=n31;te[5]=n32;te[8]=n33;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},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},multiplyVector3:function(vector){console.warn("DEPRECATED: Matrix3's .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return vector.applyMatrix3(this)},multiplyVector3Array:function(){var v1=new THREE.Vector3;return function(a){for(var i=0,il=a.length;i<il;i+=3){v1.x=a[i];v1.y=a[i+1];v1.z=a[i+2];v1.applyMatrix3(this);a[i]=v1.x;a[i+1]=v1.y;a[i+2]=v1.z}return a}}(),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,throwOnInvertible){var me=matrix.elements;var te=this.elements;te[0]=me[10]*me[5]-me[6]*me[9];te[1]=-me[10]*me[1]+me[2]*me[9];te[2]=me[6]*me[1]-me[2]*me[5];te[3]=-me[10]*me[4]+me[6]*me[8];te[4]=me[10]*me[0]-me[2]*me[8];te[5]=-me[6]*me[0]+me[2]*me[4];te[6]=me[9]*me[4]-me[5]*me[8];te[7]=-me[9]*me[0]+me[1]*me[8];te[8]=me[5]*me[0]-me[1]*me[4];var det=me[0]*te[0]+me[1]*te[3]+me[2]*te[6];if(det===0){var msg="Matrix3.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible||false){throw new Error(msg)}else{console.warn(msg)}this.identity();return this}this.multiplyScalar(1/det);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(m){this.getInverse(m).transpose();return this},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},clone:function(){var te=this.elements;return new THREE.Matrix3(te[0],te[3],te[6],te[1],te[4],te[7],te[2],te[5],te[8])}});THREE.Matrix4=function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){var te=this.elements=new Float32Array(16);te[0]=n11!==undefined?n11:1;te[4]=n12||0;te[8]=n13||0;te[12]=n14||0;te[1]=n21||0;te[5]=n22!==undefined?n22:1;te[9]=n23||0;te[13]=n24||0;te[2]=n31||0;te[6]=n32||0;te[10]=n33!==undefined?n33:1;te[14]=n34||0;te[3]=n41||0;te[7]=n42||0;te[11]=n43||0;te[15]=n44!==undefined?n44:1};THREE.extend(THREE.Matrix4.prototype,{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},copy:function(m){var me=m.elements;this.set(me[0],me[4],me[8],me[12],me[1],me[5],me[9],me[13],me[2],me[6],me[10],me[14],me[3],me[7],me[11],me[15]);return this},setRotationFromEuler:function(v,order){var te=this.elements;var x=v.x,y=v.y,z=v.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(order===undefined||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(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(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(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(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(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}return this},setRotationFromQuaternion: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);return this},lookAt:function(){var x=new THREE.Vector3;var y=new THREE.Vector3;var z=new THREE.Vector3;return function(eye,target,up){var te=this.elements;z.subVectors(eye,target).normalize();if(z.length()===0){z.z=1}x.crossVectors(up,z).normalize();if(x.length()===0){z.x+=1e-4;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("DEPRECATED: Matrix4's .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.");return this.multiplyMatrices(m,n)}return this.multiplyMatrices(this,m)},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},multiplyVector3:function(vector){console.warn("DEPRECATED: Matrix4's .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.");return vector.applyProjection(this)},multiplyVector4:function(vector){console.warn("DEPRECATED: Matrix4's .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return vector.applyMatrix4(this)},multiplyVector3Array:function(){var v1=new THREE.Vector3;return function(a){for(var i=0,il=a.length;i<il;i+=3){v1.x=a[i];v1.y=a[i+1];v1.z=a[i+2];v1.applyProjection(this);a[i]=v1.x;a[i+1]=v1.y;a[i+2]=v1.z}return a}}(),rotateAxis:function(v){var te=this.elements;var vx=v.x,vy=v.y,vz=v.z;v.x=vx*te[0]+vy*te[4]+vz*te[8];v.y=vx*te[1]+vy*te[5]+vz*te[9];v.z=vx*te[2]+vy*te[6]+vz*te[10];v.normalize();return v},crossVector:function(a){var te=this.elements;var v=new THREE.Vector4;v.x=te[0]*a.x+te[4]*a.y+te[8]*a.z+te[12]*a.w;v.y=te[1]*a.x+te[5]*a.y+te[9]*a.z+te[13]*a.w;v.z=te[2]*a.x+te[6]*a.y+te[10]*a.z+te[14]*a.w;v.w=a.w?te[3]*a.x+te[7]*a.y+te[11]*a.z+te[15]*a.w:1;return v},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];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},flattenToArray:function(flat){var te=this.elements;flat[0]=te[0];flat[1]=te[1];flat[2]=te[2];flat[3]=te[3];flat[4]=te[4];flat[5]=te[5];flat[6]=te[6];flat[7]=te[7];flat[8]=te[8];flat[9]=te[9];flat[10]=te[10];flat[11]=te[11];flat[12]=te[12];flat[13]=te[13];flat[14]=te[14];flat[15]=te[15];return flat},flattenToArrayOffset:function(flat,offset){var te=this.elements;flat[offset]=te[0];flat[offset+1]=te[1];flat[offset+2]=te[2];flat[offset+3]=te[3];flat[offset+4]=te[4];flat[offset+5]=te[5];flat[offset+6]=te[6];flat[offset+7]=te[7];flat[offset+8]=te[8];flat[offset+9]=te[9];flat[offset+10]=te[10];flat[offset+11]=te[11];flat[offset+12]=te[12];flat[offset+13]=te[13];flat[offset+14]=te[14];flat[offset+15]=te[15];return flat},getPosition:function(){var v1=new THREE.Vector3;return function(){console.warn("DEPRECATED: Matrix4's .getPosition() has been removed. Use Vector3.getPositionFromMatrix( matrix ) instead.");var te=this.elements;return v1.set(te[12],te[13],te[14])}}(),setPosition:function(v){var te=this.elements;te[12]=v.x;te[13]=v.y;te[14]=v.z;return this},getInverse:function(m,throwOnInvertible){var te=this.elements;var me=m.elements;var n11=me[0],n12=me[4],n13=me[8],n14=me[12];var n21=me[1],n22=me[5],n23=me[9],n24=me[13];var n31=me[2],n32=me[6],n33=me[10],n34=me[14];var n41=me[3],n42=me[7],n43=me[11],n44=me[15];te[0]=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44;te[4]=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44;te[8]=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44;te[12]=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34;te[1]=n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44;te[5]=n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44;te[9]=n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44;te[13]=n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34;te[2]=n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44;te[6]=n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44;te[10]=n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44;te[14]=n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34;te[3]=n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43;te[7]=n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43;te[11]=n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43;te[15]=n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33;var det=me[0]*te[0]+me[1]*te[4]+me[2]*te[8]+me[3]*te[12];if(det==0){var msg="Matrix4.getInverse(): can't invert matrix, determinant is 0";if(throwOnInvertible||false){throw new Error(msg)}else{console.warn(msg)}this.identity();return this}this.multiplyScalar(1/det);return this},compose:function(){var mRotation=new THREE.Matrix4,mScale=new THREE.Matrix4;return function(translation,rotation,scale){var te=this.elements;mRotation.identity();mRotation.setRotationFromQuaternion(rotation);mScale.makeScale(scale.x,scale.y,scale.z);this.multiplyMatrices(mRotation,mScale);te[12]=translation.x;te[13]=translation.y;te[14]=translation.z;return this}}(),decompose:function(){var x=new THREE.Vector3,y=new THREE.Vector3,z=new THREE.Vector3,matrix=new THREE.Matrix4;return function(translation,rotation,scale){var te=this.elements;x.set(te[0],te[1],te[2]);y.set(te[4],te[5],te[6]);z.set(te[8],te[9],te[10]);translation=translation instanceof THREE.Vector3?translation:new THREE.Vector3;rotation=rotation instanceof THREE.Quaternion?rotation:new THREE.Quaternion;scale=scale instanceof THREE.Vector3?scale:new THREE.Vector3;scale.x=x.length();scale.y=y.length();scale.z=z.length();translation.x=te[12];translation.y=te[13];translation.z=te[14];matrix.copy(this);matrix.elements[0]/=scale.x;matrix.elements[1]/=scale.x;matrix.elements[2]/=scale.x;matrix.elements[4]/=scale.y;matrix.elements[5]/=scale.y;matrix.elements[6]/=scale.y;matrix.elements[8]/=scale.z;matrix.elements[9]/=scale.z;matrix.elements[10]/=scale.z;rotation.setFromRotationMatrix(matrix);return[translation,rotation,scale]}}(),extractPosition:function(m){var te=this.elements;var me=m.elements;te[12]=me[12];te[13]=me[13];te[14]=me[14];return this},extractRotation:function(){var v1=new THREE.Vector3;return function(m){var te=this.elements;var me=m.elements;var scaleX=1/v1.set(me[0],me[1],me[2]).length();var scaleY=1/v1.set(me[4],me[5],me[6]).length();var scaleZ=1/v1.set(me[8],me[9],me[10]).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}}(),translate:function(v){var te=this.elements;var x=v.x,y=v.y,z=v.z;te[12]=te[0]*x+te[4]*y+te[8]*z+te[12];te[13]=te[1]*x+te[5]*y+te[9]*z+te[13];te[14]=te[2]*x+te[6]*y+te[10]*z+te[14];te[15]=te[3]*x+te[7]*y+te[11]*z+te[15];return this},rotateX:function(angle){var te=this.elements;var m12=te[4];var m22=te[5];var m32=te[6];var m42=te[7];var m13=te[8];var m23=te[9];var m33=te[10];var m43=te[11];var c=Math.cos(angle);var s=Math.sin(angle);te[4]=c*m12+s*m13;te[5]=c*m22+s*m23;te[6]=c*m32+s*m33;te[7]=c*m42+s*m43;te[8]=c*m13-s*m12;te[9]=c*m23-s*m22;te[10]=c*m33-s*m32;te[11]=c*m43-s*m42;return this},rotateY:function(angle){var te=this.elements;var m11=te[0];var m21=te[1];var m31=te[2];var m41=te[3];var m13=te[8];var m23=te[9];var m33=te[10];var m43=te[11];var c=Math.cos(angle);var s=Math.sin(angle);te[0]=c*m11-s*m13;te[1]=c*m21-s*m23;te[2]=c*m31-s*m33;te[3]=c*m41-s*m43;te[8]=c*m13+s*m11;te[9]=c*m23+s*m21;te[10]=c*m33+s*m31;te[11]=c*m43+s*m41;return this},rotateZ:function(angle){var te=this.elements;var m11=te[0];var m21=te[1];var m31=te[2];var m41=te[3];var m12=te[4];var m22=te[5];var m32=te[6];var m42=te[7];var c=Math.cos(angle);var s=Math.sin(angle);te[0]=c*m11+s*m12;te[1]=c*m21+s*m22;te[2]=c*m31+s*m32;te[3]=c*m41+s*m42;te[4]=c*m12-s*m11;te[5]=c*m22-s*m21;te[6]=c*m32-s*m31;te[7]=c*m42-s*m41;return this},rotateByAxis:function(axis,angle){var te=this.elements;if(axis.x===1&&axis.y===0&&axis.z===0){return this.rotateX(angle)}else if(axis.x===0&&axis.y===1&&axis.z===0){return this.rotateY(angle)}else if(axis.x===0&&axis.y===0&&axis.z===1){return this.rotateZ(angle)}var x=axis.x,y=axis.y,z=axis.z;var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x,yy=y*y,zz=z*z;var c=Math.cos(angle);var s=Math.sin(angle);var oneMinusCosine=1-c;var xy=x*y*oneMinusCosine;var xz=x*z*oneMinusCosine;var yz=y*z*oneMinusCosine;var xs=x*s;var ys=y*s;var zs=z*s;var r11=xx+(1-xx)*c;var r21=xy+zs;var r31=xz-ys;var r12=xy-zs;var r22=yy+(1-yy)*c;var r32=yz+xs;var r13=xz+ys;var r23=yz-xs;var r33=zz+(1-zz)*c;var m11=te[0],m21=te[1],m31=te[2],m41=te[3];var m12=te[4],m22=te[5],m32=te[6],m42=te[7];var m13=te[8],m23=te[9],m33=te[10],m43=te[11];te[0]=r11*m11+r21*m12+r31*m13;te[1]=r11*m21+r21*m22+r31*m23;te[2]=r11*m31+r21*m32+r31*m33;te[3]=r11*m41+r21*m42+r31*m43;te[4]=r12*m11+r22*m12+r32*m13;te[5]=r12*m21+r22*m22+r32*m23;te[6]=r12*m31+r22*m32+r32*m33;te[7]=r12*m41+r22*m42+r32*m43;te[8]=r13*m11+r23*m12+r33*m13;te[9]=r13*m21+r23*m22+r33*m23;te[10]=r13*m31+r23*m32+r33*m33;te[11]=r13*m41+r23*m42+r33*m43;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,Math.max(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){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},makeFrustum:function(left,right,bottom,top,near,far){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},makePerspective:function(fov,aspect,near,far){var ymax=near*Math.tan(THREE.Math.degToRad(fov*.5));var ymin=-ymax;var xmin=ymin*aspect;var xmax=ymax*aspect;return this.makeFrustum(xmin,xmax,ymin,ymax,near,far)},makeOrthographic:function(left,right,top,bottom,near,far){var te=this.elements;var w=right-left;var h=top-bottom;var p=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},clone:function(){var te=this.elements;return new THREE.Matrix4(te[0],te[4],te[8],te[12],te[1],te[5],te[9],te[13],te[2],te[6],te[10],te[14],te[3],te[7],te[11],te[15])}});THREE.Ray=function(origin,direction){this.origin=origin!==undefined?origin:new THREE.Vector3;this.direction=direction!==undefined?direction:new THREE.Vector3};THREE.extend(THREE.Ray.prototype,{set:function(origin,direction){this.origin.copy(origin);this.direction.copy(direction);return this},copy:function(ray){this.origin.copy(ray.origin);this.direction.copy(ray.direction);return this},at:function(t,optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.direction).multiplyScalar(t).add(this.origin)},recast:function(){var v1=new THREE.Vector3;return function(t){this.origin.copy(this.at(t,v1));return this}}(),closestPointToPoint:function(point,optionalTarget){var result=optionalTarget||new THREE.Vector3;result.subVectors(point,this.origin);var directionDistance=result.dot(this.direction);return result.copy(this.direction).multiplyScalar(directionDistance).add(this.origin)},distanceToPoint:function(){var v1=new THREE.Vector3;return function(point){var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);return v1.distanceTo(point)}}(),isIntersectionSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius},isIntersectionPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(denominator!=0){return true}if(plane.distanceToPoint(this.origin)==0){return true}return false},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(denominator==0){if(plane.distanceToPoint(this.origin)==0){return 0}return undefined}var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;return t},intersectPlane:function(plane,optionalTarget){var t=this.distanceToPlane(plane);if(t===undefined){return undefined}return this.at(t,optionalTarget)},applyMatrix4:function(matrix4){this.direction.add(this.origin).applyMatrix4(matrix4);this.origin.applyMatrix4(matrix4);this.direction.sub(this.origin);return this},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction)},clone:function(){return(new THREE.Ray).copy(this)}});THREE.Sphere=function(center,radius){this.center=center!==undefined?center:new THREE.Vector3;this.radius=radius!==undefined?radius:0};THREE.extend(THREE.Sphere.prototype,{set:function(center,radius){this.center.copy(center);this.radius=radius;return this},setFromCenterAndPoints:function(center,points){var maxRadiusSq=0;for(var i=0,il=points.length;i<il;i++){var radiusSq=center.distanceToSquared(points[i]);maxRadiusSq=Math.max(maxRadiusSq,radiusSq)}this.center=center;this.radius=Math.sqrt(maxRadiusSq);return 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},clampPoint:function(point,optionalTarget){var deltaLengthSq=this.center.distanceToSquared(point);var result=optionalTarget||new THREE.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 THREE.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},clone:function(){return(new THREE.Sphere).copy(this)}});THREE.Frustum=function(p0,p1,p2,p3,p4,p5){this.planes=[p0!==undefined?p0:new THREE.Plane,p1!==undefined?p1:new THREE.Plane,p2!==undefined?p2:new THREE.Plane,p3!==undefined?p3:new THREE.Plane,p4!==undefined?p4:new THREE.Plane,p5!==undefined?p5:new THREE.Plane]};THREE.extend(THREE.Frustum.prototype,{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},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 center=new THREE.Vector3;return function(object){var matrix=object.matrixWorld;var planes=this.planes;var negRadius=-object.geometry.boundingSphere.radius*matrix.getMaxScaleOnAxis();center.getPositionFromMatrix(matrix);for(var i=0;i<6;i++){var distance=planes[i].distanceToPoint(center);if(distance<negRadius){return false}}return true}}(),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},containsPoint:function(point){var planes=this.planes;for(var i=0;i<6;i++){if(planes[i].distanceToPoint(point)<0){return false}}return true},clone:function(){return(new THREE.Frustum).copy(this)}});THREE.Plane=function(normal,constant){this.normal=normal!==undefined?normal:new THREE.Vector3(1,0,0);this.constant=constant!==undefined?constant:0};THREE.extend(THREE.Plane.prototype,{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);return this},setFromCoplanarPoints:function(){var v1=new THREE.Vector3;var v2=new THREE.Vector3;return function(a,b,c){var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();this.setFromNormalAndCoplanarPoint(normal,a);return this}}(),copy:function(plane){this.normal.copy(plane.normal);this.constant=plane.constant;return this},normalize:function(){var inverseNormalLength=1/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 THREE.Vector3;return result.copy(this.normal).multiplyScalar(perpendicularMagnitude)},isIntersectionLine:function(line){var startSign=this.distanceToPoint(line.start);var endSign=this.distanceToPoint(line.end);return startSign<0&&endSign>0||endSign<0&&startSign>0},intersectLine:function(){var v1=new THREE.Vector3;return function(line,optionalTarget){var result=optionalTarget||new THREE.Vector3;var direction=line.delta(v1);var denominator=this.normal.dot(direction);if(denominator==0){if(this.distanceToPoint(line.start)==0){return result.copy(line.start)}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)}}(),coplanarPoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var v1=new THREE.Vector3;var v2=new THREE.Vector3;return function(matrix,optionalNormalMatrix){optionalNormalMatrix=optionalNormalMatrix||(new THREE.Matrix3).getInverse(matrix).transpose();var newNormal=v1.copy(this.normal).applyMatrix3(optionalNormalMatrix);var newCoplanarPoint=this.coplanarPoint(v2);newCoplanarPoint.applyMatrix4(matrix);this.setFromNormalAndCoplanarPoint(newNormal,newCoplanarPoint);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},clone:function(){return(new THREE.Plane).copy(this)}});THREE.Math={clamp:function(x,a,b){return x<a?a:x>b?b:x},clampBottom:function(x,a){return x<a?a:x},mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1)},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)},random16:function(){return(65280*Math.random()+255*Math.random())/65535},randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1))},randFloat:function(low,high){return low+Math.random()*(high-low)},randFloatSpread:function(range){return range*(.5-Math.random())},sign:function(x){return x<0?-1:x>0?1:0},degToRad:function(){var degreeToRadiansFactor=Math.PI/180;return function(degrees){return degrees*degreeToRadiansFactor}}(),radToDeg:function(){var radianToDegreesFactor=180/Math.PI;return function(radians){return radians*radianToDegreesFactor}}()};THREE.Spline=function(points){this.points=points;var c=[],v3={x:0,y:0,z:0},point,intPoint,weight,w2,w3,pa,pb,pc,pd;this.initFromArray=function(a){this.points=[];for(var i=0;i<a.length;i++){this.points[i]={x:a[i][0],y:a[i][1],z:a[i][2]}}};this.getPoint=function(k){point=(this.points.length-1)*k;intPoint=Math.floor(point);weight=point-intPoint;c[0]=intPoint===0?intPoint:intPoint-1;c[1]=intPoint;c[2]=intPoint>this.points.length-2?this.points.length-1:intPoint+1;c[3]=intPoint>this.points.length-3?this.points.length-1:intPoint+2;pa=this.points[c[0]];pb=this.points[c[1]];pc=this.points[c[2]];pd=this.points[c[3]];w2=weight*weight;w3=weight*w2;v3.x=interpolate(pa.x,pb.x,pc.x,pd.x,weight,w2,w3);v3.y=interpolate(pa.y,pb.y,pc.y,pd.y,weight,w2,w3);v3.z=interpolate(pa.z,pb.z,pc.z,pd.z,weight,w2,w3);return v3};this.getControlPointsArray=function(){var i,p,l=this.points.length,coords=[];for(i=0;i<l;i++){p=this.points[i];coords[i]=[p.x,p.y,p.z]}return coords};this.getLength=function(nSubDivisions){var i,index,nSamples,position,point=0,intPoint=0,oldIntPoint=0,oldPosition=new THREE.Vector3,tmpVec=new THREE.Vector3,chunkLengths=[],totalLength=0;chunkLengths[0]=0;if(!nSubDivisions)nSubDivisions=100;nSamples=this.points.length*nSubDivisions;oldPosition.copy(this.points[0]);for(i=1;i<nSamples;i++){index=i/nSamples;position=this.getPoint(index);tmpVec.copy(position);totalLength+=tmpVec.distanceTo(oldPosition);oldPosition.copy(position);point=(this.points.length-1)*index;intPoint=Math.floor(point);if(intPoint!=oldIntPoint){chunkLengths[intPoint]=totalLength;oldIntPoint=intPoint}}chunkLengths[chunkLengths.length]=totalLength;return{chunks:chunkLengths,total:totalLength}};this.reparametrizeByArcLength=function(samplingCoef){var i,j,index,indexCurrent,indexNext,linearDistance,realDistance,sampling,position,newpoints=[],tmpVec=new THREE.Vector3,sl=this.getLength();newpoints.push(tmpVec.copy(this.points[0]).clone());for(i=1;i<this.points.length;i++){realDistance=sl.chunks[i]-sl.chunks[i-1];sampling=Math.ceil(samplingCoef*realDistance/sl.total);indexCurrent=(i-1)/(this.points.length-1);indexNext=i/(this.points.length-1);for(j=1;j<sampling-1;j++){index=indexCurrent+j*(1/sampling)*(indexNext-indexCurrent);position=this.getPoint(index);newpoints.push(tmpVec.copy(position).clone())}newpoints.push(tmpVec.copy(this.points[i]).clone())}this.points=newpoints};function interpolate(p0,p1,p2,p3,t,t2,t3){var v0=(p2-p0)*.5,v1=(p3-p1)*.5;return(2*(p1-p2)+v0+v1)*t3+(-3*(p1-p2)-2*v0-v1)*t2+v0*t+p1}};THREE.Triangle=function(a,b,c){this.a=a!==undefined?a:new THREE.Vector3;this.b=b!==undefined?b:new THREE.Vector3;this.c=c!==undefined?c:new THREE.Vector3};THREE.Triangle.normal=function(){var v0=new THREE.Vector3;return function(a,b,c,optionalTarget){var result=optionalTarget||new THREE.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)}}();THREE.Triangle.barycoordFromPoint=function(){var v0=new THREE.Vector3,v1=new THREE.Vector3,v2=new THREE.Vector3;return function(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 THREE.Vector3;if(denom==0){return result.set(-2,-1,-1)}var invDenom=1/denom;var u=(dot11*dot02-dot01*dot12)*invDenom;var v=(dot00*dot12-dot01*dot02)*invDenom;return result.set(1-u-v,v,u)}}();THREE.Triangle.containsPoint=function(){var v1=new THREE.Vector3;return function(point,a,b,c){var result=THREE.Triangle.barycoordFromPoint(point,a,b,c,v1);return result.x>=0&&result.y>=0&&result.x+result.y<=1}}();THREE.extend(THREE.Triangle.prototype,{constructor:THREE.Triangle,set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(points,i0,i1,i2){this.a.copy(points[i0]);this.b.copy(points[i1]);this.c.copy(points[i2]);return 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 THREE.Vector3;var v1=new THREE.Vector3;return function(){v0.subVectors(this.c,this.b);v1.subVectors(this.a,this.b);return v0.cross(v1).length()*.5}}(),midpoint:function(optionalTarget){var result=optionalTarget||new THREE.Vector3;return result.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},normal:function(optionalTarget){return THREE.Triangle.normal(this.a,this.b,this.c,optionalTarget)},plane:function(optionalTarget){var result=optionalTarget||new THREE.Plane;return result.setFromCoplanarPoints(this.a,this.b,this.c)},barycoordFromPoint:function(point,optionalTarget){return THREE.Triangle.barycoordFromPoint(point,this.a,this.b,this.c,optionalTarget)},containsPoint:function(point){return THREE.Triangle.containsPoint(point,this.a,this.b,this.c)},equals:function(triangle){return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c)},clone:function(){return(new THREE.Triangle).copy(this)}});THREE.Vertex=function(v){console.warn("THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.");return v};THREE.UV=function(u,v){console.warn("THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.");return new THREE.Vector2(u,v)};THREE.Clock=function(autoStart){this.autoStart=autoStart!==undefined?autoStart:true;this.startTime=0;this.oldTime=0;this.elapsedTime=0;this.running=false};THREE.extend(THREE.Clock.prototype,{start:function(){this.startTime=window.performance!==undefined&&window.performance.now!==undefined?window.performance.now():Date.now();this.oldTime=this.startTime;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=window.performance!==undefined&&window.performance.now!==undefined?window.performance.now():Date.now();diff=.001*(newTime-this.oldTime);this.oldTime=newTime;this.elapsedTime+=diff}return diff}});THREE.EventDispatcher=function(){var listeners={};this.addEventListener=function(type,listener){if(listeners[type]===undefined){listeners[type]=[]}if(listeners[type].indexOf(listener)===-1){listeners[type].push(listener)}};this.removeEventListener=function(type,listener){var index=listeners[type].indexOf(listener);if(index!==-1){listeners[type].splice(index,1)}};this.dispatchEvent=function(event){var listenerArray=listeners[event.type];if(listenerArray!==undefined){event.target=this;for(var i=0,l=listenerArray.length;i<l;i++){listenerArray[i].call(this,event)}}}};(function(THREE){THREE.Raycaster=function(origin,direction,near,far){this.ray=new THREE.Ray(origin,direction);if(this.ray.direction.lengthSq()>0){this.ray.direction.normalize()}this.near=near||0;this.far=far||Infinity};var sphere=new THREE.Sphere;var localRay=new THREE.Ray;var facePlane=new THREE.Plane;var intersectPoint=new THREE.Vector3;var matrixPosition=new THREE.Vector3;var inverseMatrix=new THREE.Matrix4;var descSort=function(a,b){return a.distance-b.distance};var intersectObject=function(object,raycaster,intersects){if(object instanceof THREE.Particle){matrixPosition.getPositionFromMatrix(object.matrixWorld);var distance=raycaster.ray.distanceToPoint(matrixPosition);if(distance>object.scale.x){return intersects}intersects.push({distance:distance,point:object.position,face:null,object:object})}else if(object instanceof THREE.Mesh){matrixPosition.getPositionFromMatrix(object.matrixWorld);sphere.set(matrixPosition,object.geometry.boundingSphere.radius*object.matrixWorld.getMaxScaleOnAxis());if(!raycaster.ray.isIntersectionSphere(sphere)){return intersects}var geometry=object.geometry;var vertices=geometry.vertices;var isFaceMaterial=object.material instanceof THREE.MeshFaceMaterial;var objectMaterials=isFaceMaterial===true?object.material.materials:null;var side=object.material.side;var a,b,c,d;var precision=raycaster.precision;object.matrixRotationWorld.extractRotation(object.matrixWorld);inverseMatrix.getInverse(object.matrixWorld);localRay.copy(raycaster.ray).applyMatrix4(inverseMatrix);for(var f=0,fl=geometry.faces.length;f<fl;f++){var face=geometry.faces[f];var material=isFaceMaterial===true?objectMaterials[face.materialIndex]:object.material;if(material===undefined)continue;facePlane.setFromNormalAndCoplanarPoint(face.normal,vertices[face.a]);var planeDistance=localRay.distanceToPlane(facePlane);if(Math.abs(planeDistance)<precision)continue;if(planeDistance<0)continue;side=material.side;if(side!==THREE.DoubleSide){var planeSign=localRay.direction.dot(facePlane.normal);if(!(side===THREE.FrontSide?planeSign<0:planeSign>0))continue}if(planeDistance<raycaster.near||planeDistance>raycaster.far)continue;intersectPoint=localRay.at(planeDistance,intersectPoint);if(face instanceof THREE.Face3){a=vertices[face.a];b=vertices[face.b];c=vertices[face.c];if(!THREE.Triangle.containsPoint(intersectPoint,a,b,c))continue}else if(face instanceof THREE.Face4){a=vertices[face.a];b=vertices[face.b];c=vertices[face.c];d=vertices[face.d];if(!THREE.Triangle.containsPoint(intersectPoint,a,b,d)&&!THREE.Triangle.containsPoint(intersectPoint,b,c,d))continue}else{throw Error("face type not supported")}intersects.push({distance:planeDistance,point:raycaster.ray.at(planeDistance),face:face,faceIndex:f,object:object})}}};var intersectDescendants=function(object,raycaster,intersects){var descendants=object.getDescendants();for(var i=0,l=descendants.length;i<l;i++){intersectObject(descendants[i],raycaster,intersects)}};THREE.Raycaster.prototype.precision=1e-4;THREE.Raycaster.prototype.set=function(origin,direction){this.ray.set(origin,direction);if(this.ray.direction.length()>0){this.ray.direction.normalize()}};THREE.Raycaster.prototype.intersectObject=function(object,recursive){var intersects=[];if(recursive===true){intersectDescendants(object,this,intersects)}intersectObject(object,this,intersects);intersects.sort(descSort);return intersects};THREE.Raycaster.prototype.intersectObjects=function(objects,recursive){var intersects=[];for(var i=0,l=objects.length;i<l;i++){intersectObject(objects[i],this,intersects);if(recursive===true){intersectDescendants(objects[i],this,intersects)}}intersects.sort(descSort);return intersects}})(THREE);THREE.Object3D=function(){this.id=THREE.Object3DIdCount++;this.name="";this.properties={};this.parent=undefined;this.children=[];this.up=new THREE.Vector3(0,1,0);this.position=new THREE.Vector3;this.rotation=new THREE.Vector3;this.eulerOrder=THREE.Object3D.defaultEulerOrder;this.scale=new THREE.Vector3(1,1,1);this.renderDepth=null;this.rotationAutoUpdate=true;this.matrix=new THREE.Matrix4;this.matrixWorld=new THREE.Matrix4;this.matrixRotationWorld=new THREE.Matrix4;this.matrixAutoUpdate=true;this.matrixWorldNeedsUpdate=true;this.quaternion=new THREE.Quaternion;this.useQuaternion=false;this.visible=true;this.castShadow=false;this.receiveShadow=false;this.frustumCulled=true;this._vector=new THREE.Vector3};THREE.Object3D.prototype={constructor:THREE.Object3D,applyMatrix:function(matrix){this.matrix.multiplyMatrices(matrix,this.matrix);this.scale.getScaleFromMatrix(this.matrix);var mat=(new THREE.Matrix4).extractRotation(this.matrix);this.rotation.setEulerFromRotationMatrix(mat,this.eulerOrder);this.position.getPositionFromMatrix(this.matrix)},translate:function(distance,axis){this.matrix.rotateAxis(axis);this.position.add(axis.multiplyScalar(distance))},translateX:function(distance){this.translate(distance,this._vector.set(1,0,0))},translateY:function(distance){this.translate(distance,this._vector.set(0,1,0))},translateZ:function(distance){this.translate(distance,this._vector.set(0,0,1))},localToWorld:function(vector){return vector.applyMatrix4(this.matrixWorld)},worldToLocal:function(vector){return vector.applyMatrix4(THREE.Object3D.__m1.getInverse(this.matrixWorld))},lookAt:function(vector){this.matrix.lookAt(vector,this.position,this.up);
if(this.rotationAutoUpdate){if(this.useQuaternion===false){this.rotation.setEulerFromRotationMatrix(this.matrix,this.eulerOrder)}else{this.quaternion.copy(this.matrix.decompose()[1])}}},add:function(object){if(object===this){console.warn("THREE.Object3D.add: An object can't be added as a child of itself.");return}if(object instanceof THREE.Object3D){if(object.parent!==undefined){object.parent.remove(object)}object.parent=this;this.children.push(object);var scene=this;while(scene.parent!==undefined){scene=scene.parent}if(scene!==undefined&&scene instanceof THREE.Scene){scene.__addObject(object)}}},remove:function(object){var index=this.children.indexOf(object);if(index!==-1){object.parent=undefined;this.children.splice(index,1);var scene=this;while(scene.parent!==undefined){scene=scene.parent}if(scene!==undefined&&scene instanceof THREE.Scene){scene.__removeObject(object)}}},traverse:function(callback){callback(this);for(var i=0,l=this.children.length;i<l;i++){this.children[i].traverse(callback)}},getChildByName:function(name,recursive){for(var i=0,l=this.children.length;i<l;i++){var child=this.children[i];if(child.name===name){return child}if(recursive===true){child=child.getChildByName(name,recursive);if(child!==undefined){return child}}}return undefined},getDescendants:function(array){if(array===undefined)array=[];Array.prototype.push.apply(array,this.children);for(var i=0,l=this.children.length;i<l;i++){this.children[i].getDescendants(array)}return array},updateMatrix:function(){this.matrix.setPosition(this.position);if(this.useQuaternion===false){this.matrix.setRotationFromEuler(this.rotation,this.eulerOrder)}else{this.matrix.setRotationFromQuaternion(this.quaternion)}if(this.scale.x!==1||this.scale.y!==1||this.scale.z!==1){this.matrix.scale(this.scale)}this.matrixWorldNeedsUpdate=true},updateMatrixWorld:function(force){if(this.matrixAutoUpdate===true)this.updateMatrix();if(this.matrixWorldNeedsUpdate===true||force===true){if(this.parent===undefined){this.matrixWorld.copy(this.matrix)}else{this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)}this.matrixWorldNeedsUpdate=false;force=true}for(var i=0,l=this.children.length;i<l;i++){this.children[i].updateMatrixWorld(force)}},clone:function(object){if(object===undefined)object=new THREE.Object3D;object.name=this.name;object.up.copy(this.up);object.position.copy(this.position);if(object.rotation instanceof THREE.Vector3)object.rotation.copy(this.rotation);object.eulerOrder=this.eulerOrder;object.scale.copy(this.scale);object.renderDepth=this.renderDepth;object.rotationAutoUpdate=this.rotationAutoUpdate;object.matrix.copy(this.matrix);object.matrixWorld.copy(this.matrixWorld);object.matrixRotationWorld.copy(this.matrixRotationWorld);object.matrixAutoUpdate=this.matrixAutoUpdate;object.matrixWorldNeedsUpdate=this.matrixWorldNeedsUpdate;object.quaternion.copy(this.quaternion);object.useQuaternion=this.useQuaternion;object.visible=this.visible;object.castShadow=this.castShadow;object.receiveShadow=this.receiveShadow;object.frustumCulled=this.frustumCulled;for(var i=0;i<this.children.length;i++){var child=this.children[i];object.add(child.clone())}return object}};THREE.Object3D.__m1=new THREE.Matrix4;THREE.Object3D.defaultEulerOrder="XYZ",THREE.Object3DIdCount=0;THREE.Projector=function(){var _object,_objectCount,_objectPool=[],_objectPoolLength=0,_vertex,_vertexCount,_vertexPool=[],_vertexPoolLength=0,_face,_face3Count,_face3Pool=[],_face3PoolLength=0,_face4Count,_face4Pool=[],_face4PoolLength=0,_line,_lineCount,_linePool=[],_linePoolLength=0,_particle,_particleCount,_particlePool=[],_particlePoolLength=0,_renderData={objects:[],sprites:[],lights:[],elements:[]},_vector3=new THREE.Vector3,_vector4=new THREE.Vector4,_clipBox=new THREE.Box3(new THREE.Vector3(-1,-1,-1),new THREE.Vector3(1,1,1)),_boundingBox=new THREE.Box3,_points3=new Array(3),_points4=new Array(4),_viewMatrix=new THREE.Matrix4,_viewProjectionMatrix=new THREE.Matrix4,_modelMatrix,_modelViewProjectionMatrix=new THREE.Matrix4,_normalMatrix=new THREE.Matrix3,_normalViewMatrix=new THREE.Matrix3,_centroid=new THREE.Vector3,_frustum=new THREE.Frustum,_clippedVertex1PositionScreen=new THREE.Vector4,_clippedVertex2PositionScreen=new THREE.Vector4;this.projectVector=function(vector,camera){camera.matrixWorldInverse.getInverse(camera.matrixWorld);_viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);return vector.applyProjection(_viewProjectionMatrix)};this.unprojectVector=function(vector,camera){camera.projectionMatrixInverse.getInverse(camera.projectionMatrix);_viewProjectionMatrix.multiplyMatrices(camera.matrixWorld,camera.projectionMatrixInverse);return vector.applyProjection(_viewProjectionMatrix)};this.pickingRay=function(vector,camera){vector.z=-1;var end=new THREE.Vector3(vector.x,vector.y,1);this.unprojectVector(vector,camera);this.unprojectVector(end,camera);end.sub(vector).normalize();return new THREE.Raycaster(vector,end)};var projectGraph=function(root,sortObjects){_objectCount=0;_renderData.objects.length=0;_renderData.sprites.length=0;_renderData.lights.length=0;var projectObject=function(parent){for(var c=0,cl=parent.children.length;c<cl;c++){var object=parent.children[c];if(object.visible===false)continue;if(object instanceof THREE.Light){_renderData.lights.push(object)}else if(object instanceof THREE.Mesh||object instanceof THREE.Line){if(object.frustumCulled===false||_frustum.intersectsObject(object)===true){_object=getNextObjectInPool();_object.object=object;if(object.renderDepth!==null){_object.z=object.renderDepth}else{_vector3.getPositionFromMatrix(object.matrixWorld);_vector3.applyProjection(_viewProjectionMatrix);_object.z=_vector3.z}_renderData.objects.push(_object)}}else if(object instanceof THREE.Sprite||object instanceof THREE.Particle){_object=getNextObjectInPool();_object.object=object;if(object.renderDepth!==null){_object.z=object.renderDepth}else{_vector3.getPositionFromMatrix(object.matrixWorld);_vector3.applyProjection(_viewProjectionMatrix);_object.z=_vector3.z}_renderData.sprites.push(_object)}else{_object=getNextObjectInPool();_object.object=object;if(object.renderDepth!==null){_object.z=object.renderDepth}else{_vector3.getPositionFromMatrix(object.matrixWorld);_vector3.applyProjection(_viewProjectionMatrix);_object.z=_vector3.z}_renderData.objects.push(_object)}projectObject(object)}};projectObject(root);if(sortObjects===true)_renderData.objects.sort(painterSort);return _renderData};this.projectScene=function(scene,camera,sortObjects,sortElements){var visible=false,o,ol,v,vl,f,fl,n,nl,c,cl,u,ul,object,geometry,vertices,faces,face,faceVertexNormals,faceVertexUvs,uvs,v1,v2,v3,v4,isFaceMaterial,objectMaterials;_face3Count=0;_face4Count=0;_lineCount=0;_particleCount=0;_renderData.elements.length=0;scene.updateMatrixWorld();if(camera.parent===undefined)camera.updateMatrixWorld();_viewMatrix.copy(camera.matrixWorldInverse.getInverse(camera.matrixWorld));_viewProjectionMatrix.multiplyMatrices(camera.projectionMatrix,_viewMatrix);_normalViewMatrix.getInverse(_viewMatrix);_normalViewMatrix.transpose();_frustum.setFromMatrix(_viewProjectionMatrix);_renderData=projectGraph(scene,sortObjects);for(o=0,ol=_renderData.objects.length;o<ol;o++){object=_renderData.objects[o].object;_modelMatrix=object.matrixWorld;_vertexCount=0;if(object instanceof THREE.Mesh){geometry=object.geometry;vertices=geometry.vertices;faces=geometry.faces;faceVertexUvs=geometry.faceVertexUvs;_normalMatrix.getInverse(_modelMatrix);_normalMatrix.transpose();isFaceMaterial=object.material instanceof THREE.MeshFaceMaterial;objectMaterials=isFaceMaterial===true?object.material:null;for(v=0,vl=vertices.length;v<vl;v++){_vertex=getNextVertexInPool();_vertex.positionWorld.copy(vertices[v]).applyMatrix4(_modelMatrix);_vertex.positionScreen.copy(_vertex.positionWorld).applyMatrix4(_viewProjectionMatrix);_vertex.positionScreen.x/=_vertex.positionScreen.w;_vertex.positionScreen.y/=_vertex.positionScreen.w;_vertex.positionScreen.z/=_vertex.positionScreen.w;_vertex.visible=!(_vertex.positionScreen.x<-1||_vertex.positionScreen.x>1||_vertex.positionScreen.y<-1||_vertex.positionScreen.y>1||_vertex.positionScreen.z<-1||_vertex.positionScreen.z>1)}for(f=0,fl=faces.length;f<fl;f++){face=faces[f];var material=isFaceMaterial===true?objectMaterials.materials[face.materialIndex]:object.material;if(material===undefined)continue;var side=material.side;if(face instanceof THREE.Face3){v1=_vertexPool[face.a];v2=_vertexPool[face.b];v3=_vertexPool[face.c];_points3[0]=v1.positionScreen;_points3[1]=v2.positionScreen;_points3[2]=v3.positionScreen;if(v1.visible===true||v2.visible===true||v3.visible===true||_clipBox.isIntersectionBox(_boundingBox.setFromPoints(_points3))){visible=(v3.positionScreen.x-v1.positionScreen.x)*(v2.positionScreen.y-v1.positionScreen.y)-(v3.positionScreen.y-v1.positionScreen.y)*(v2.positionScreen.x-v1.positionScreen.x)<0;if(side===THREE.DoubleSide||visible===(side===THREE.FrontSide)){_face=getNextFace3InPool();_face.v1.copy(v1);_face.v2.copy(v2);_face.v3.copy(v3)}else{continue}}else{continue}}else if(face instanceof THREE.Face4){v1=_vertexPool[face.a];v2=_vertexPool[face.b];v3=_vertexPool[face.c];v4=_vertexPool[face.d];_points4[0]=v1.positionScreen;_points4[1]=v2.positionScreen;_points4[2]=v3.positionScreen;_points4[3]=v4.positionScreen;if(v1.visible===true||v2.visible===true||v3.visible===true||v4.visible===true||_clipBox.isIntersectionBox(_boundingBox.setFromPoints(_points4))){visible=(v4.positionScreen.x-v1.positionScreen.x)*(v2.positionScreen.y-v1.positionScreen.y)-(v4.positionScreen.y-v1.positionScreen.y)*(v2.positionScreen.x-v1.positionScreen.x)<0||(v2.positionScreen.x-v3.positionScreen.x)*(v4.positionScreen.y-v3.positionScreen.y)-(v2.positionScreen.y-v3.positionScreen.y)*(v4.positionScreen.x-v3.positionScreen.x)<0;if(side===THREE.DoubleSide||visible===(side===THREE.FrontSide)){_face=getNextFace4InPool();_face.v1.copy(v1);_face.v2.copy(v2);_face.v3.copy(v3);_face.v4.copy(v4)}else{continue}}else{continue}}_face.normalModel.copy(face.normal);if(visible===false&&(side===THREE.BackSide||side===THREE.DoubleSide)){_face.normalModel.negate()}_face.normalModel.applyMatrix3(_normalMatrix).normalize();_face.normalModelView.copy(_face.normalModel).applyMatrix3(_normalViewMatrix);_face.centroidModel.copy(face.centroid).applyMatrix4(_modelMatrix);faceVertexNormals=face.vertexNormals;for(n=0,nl=faceVertexNormals.length;n<nl;n++){var normalModel=_face.vertexNormalsModel[n];normalModel.copy(faceVertexNormals[n]);if(visible===false&&(side===THREE.BackSide||side===THREE.DoubleSide)){normalModel.negate()}normalModel.applyMatrix3(_normalMatrix).normalize();var normalModelView=_face.vertexNormalsModelView[n];normalModelView.copy(normalModel).applyMatrix3(_normalViewMatrix)}_face.vertexNormalsLength=faceVertexNormals.length;for(c=0,cl=faceVertexUvs.length;c<cl;c++){uvs=faceVertexUvs[c][f];if(uvs===undefined)continue;for(u=0,ul=uvs.length;u<ul;u++){_face.uvs[c][u]=uvs[u]}}_face.color=face.color;_face.material=material;_centroid.copy(_face.centroidModel).applyProjection(_viewProjectionMatrix);_face.z=_centroid.z;_renderData.elements.push(_face)}}else if(object instanceof THREE.Line){_modelViewProjectionMatrix.multiplyMatrices(_viewProjectionMatrix,_modelMatrix);vertices=object.geometry.vertices;v1=getNextVertexInPool();v1.positionScreen.copy(vertices[0]).applyMatrix4(_modelViewProjectionMatrix);var step=object.type===THREE.LinePieces?2:1;for(v=1,vl=vertices.length;v<vl;v++){v1=getNextVertexInPool();v1.positionScreen.copy(vertices[v]).applyMatrix4(_modelViewProjectionMatrix);if((v+1)%step>0)continue;v2=_vertexPool[_vertexCount-2];_clippedVertex1PositionScreen.copy(v1.positionScreen);_clippedVertex2PositionScreen.copy(v2.positionScreen);if(clipLine(_clippedVertex1PositionScreen,_clippedVertex2PositionScreen)===true){_clippedVertex1PositionScreen.multiplyScalar(1/_clippedVertex1PositionScreen.w);_clippedVertex2PositionScreen.multiplyScalar(1/_clippedVertex2PositionScreen.w);_line=getNextLineInPool();_line.v1.positionScreen.copy(_clippedVertex1PositionScreen);_line.v2.positionScreen.copy(_clippedVertex2PositionScreen);_line.z=Math.max(_clippedVertex1PositionScreen.z,_clippedVertex2PositionScreen.z);_line.material=object.material;_renderData.elements.push(_line)}}}}for(o=0,ol=_renderData.sprites.length;o<ol;o++){object=_renderData.sprites[o].object;_modelMatrix=object.matrixWorld;if(object instanceof THREE.Particle){_vector4.set(_modelMatrix.elements[12],_modelMatrix.elements[13],_modelMatrix.elements[14],1);_vector4.applyMatrix4(_viewProjectionMatrix);_vector4.z/=_vector4.w;if(_vector4.z>0&&_vector4.z<1){_particle=getNextParticleInPool();_particle.object=object;_particle.x=_vector4.x/_vector4.w;_particle.y=_vector4.y/_vector4.w;_particle.z=_vector4.z;_particle.rotation=object.rotation.z;_particle.scale.x=object.scale.x*Math.abs(_particle.x-(_vector4.x+camera.projectionMatrix.elements[0])/(_vector4.w+camera.projectionMatrix.elements[12]));_particle.scale.y=object.scale.y*Math.abs(_particle.y-(_vector4.y+camera.projectionMatrix.elements[5])/(_vector4.w+camera.projectionMatrix.elements[13]));_particle.material=object.material;_renderData.elements.push(_particle)}}}if(sortElements===true)_renderData.elements.sort(painterSort);return _renderData};function getNextObjectInPool(){if(_objectCount===_objectPoolLength){var object=new THREE.RenderableObject;_objectPool.push(object);_objectPoolLength++;_objectCount++;return object}return _objectPool[_objectCount++]}function getNextVertexInPool(){if(_vertexCount===_vertexPoolLength){var vertex=new THREE.RenderableVertex;_vertexPool.push(vertex);_vertexPoolLength++;_vertexCount++;return vertex}return _vertexPool[_vertexCount++]}function getNextFace3InPool(){if(_face3Count===_face3PoolLength){var face=new THREE.RenderableFace3;_face3Pool.push(face);_face3PoolLength++;_face3Count++;return face}return _face3Pool[_face3Count++]}function getNextFace4InPool(){if(_face4Count===_face4PoolLength){var face=new THREE.RenderableFace4;_face4Pool.push(face);_face4PoolLength++;_face4Count++;return face}return _face4Pool[_face4Count++]}function getNextLineInPool(){if(_lineCount===_linePoolLength){var line=new THREE.RenderableLine;_linePool.push(line);_linePoolLength++;_lineCount++;return line}return _linePool[_lineCount++]}function getNextParticleInPool(){if(_particleCount===_particlePoolLength){var particle=new THREE.RenderableParticle;_particlePool.push(particle);_particlePoolLength++;_particleCount++;return particle}return _particlePool[_particleCount++]}function painterSort(a,b){return b.z-a.z}function clipLine(s1,s2){var alpha1=0,alpha2=1,bc1near=s1.z+s1.w,bc2near=s2.z+s2.w,bc1far=-s1.z+s1.w,bc2far=-s2.z+s2.w;if(bc1near>=0&&bc2near>=0&&bc1far>=0&&bc2far>=0){return true}else if(bc1near<0&&bc2near<0||bc1far<0&&bc2far<0){return false}else{if(bc1near<0){alpha1=Math.max(alpha1,bc1near/(bc1near-bc2near))}else if(bc2near<0){alpha2=Math.min(alpha2,bc1near/(bc1near-bc2near))}if(bc1far<0){alpha1=Math.max(alpha1,bc1far/(bc1far-bc2far))}else if(bc2far<0){alpha2=Math.min(alpha2,bc1far/(bc1far-bc2far))}if(alpha2<alpha1){return false}else{s1.lerp(s2,alpha1);s2.lerp(s1,1-alpha2);return true}}}};THREE.Face3=function(a,b,c,normal,color,materialIndex){this.a=a;this.b=b;this.c=c;this.normal=normal instanceof THREE.Vector3?normal:new THREE.Vector3;this.vertexNormals=normal instanceof Array?normal:[];this.color=color instanceof THREE.Color?color:new THREE.Color;this.vertexColors=color instanceof Array?color:[];this.vertexTangents=[];this.materialIndex=materialIndex!==undefined?materialIndex:0;this.centroid=new THREE.Vector3};THREE.Face3.prototype={constructor:THREE.Face3,clone:function(){var face=new THREE.Face3(this.a,this.b,this.c);face.normal.copy(this.normal);face.color.copy(this.color);face.centroid.copy(this.centroid);face.materialIndex=this.materialIndex;var i,il;for(i=0,il=this.vertexNormals.length;i<il;i++)face.vertexNormals[i]=this.vertexNormals[i].clone();for(i=0,il=this.vertexColors.length;i<il;i++)face.vertexColors[i]=this.vertexColors[i].clone();for(i=0,il=this.vertexTangents.length;i<il;i++)face.vertexTangents[i]=this.vertexTangents[i].clone();return face}};THREE.Face4=function(a,b,c,d,normal,color,materialIndex){this.a=a;this.b=b;this.c=c;this.d=d;this.normal=normal instanceof THREE.Vector3?normal:new THREE.Vector3;this.vertexNormals=normal instanceof Array?normal:[];this.color=color instanceof THREE.Color?color:new THREE.Color;this.vertexColors=color instanceof Array?color:[];this.vertexTangents=[];this.materialIndex=materialIndex!==undefined?materialIndex:0;this.centroid=new THREE.Vector3};THREE.Face4.prototype={constructor:THREE.Face4,clone:function(){var face=new THREE.Face4(this.a,this.b,this.c,this.d);face.normal.copy(this.normal);face.color.copy(this.color);face.centroid.copy(this.centroid);face.materialIndex=this.materialIndex;var i,il;for(i=0,il=this.vertexNormals.length;i<il;i++)face.vertexNormals[i]=this.vertexNormals[i].clone();for(i=0,il=this.vertexColors.length;i<il;i++)face.vertexColors[i]=this.vertexColors[i].clone();for(i=0,il=this.vertexTangents.length;i<il;i++)face.vertexTangents[i]=this.vertexTangents[i].clone();return face}};THREE.Geometry=function(){THREE.EventDispatcher.call(this);this.id=THREE.GeometryIdCount++;this.name="";this.vertices=[];this.colors=[];this.normals=[];this.faces=[];this.faceUvs=[[]];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphColors=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingBox=null;this.boundingSphere=null;this.hasTangents=false;this.dynamic=true;this.verticesNeedUpdate=false;this.elementsNeedUpdate=false;this.uvsNeedUpdate=false;this.normalsNeedUpdate=false;this.tangentsNeedUpdate=false;this.colorsNeedUpdate=false;this.lineDistancesNeedUpdate=false;this.buffersNeedUpdate=false};THREE.Geometry.prototype={constructor:THREE.Geometry,applyMatrix:function(matrix){var normalMatrix=(new THREE.Matrix3).getInverse(matrix).transpose();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()}face.centroid.applyMatrix4(matrix)}},computeCentroids:function(){var f,fl,face;for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];face.centroid.set(0,0,0);if(face instanceof THREE.Face3){face.centroid.add(this.vertices[face.a]);face.centroid.add(this.vertices[face.b]);face.centroid.add(this.vertices[face.c]);face.centroid.divideScalar(3)}else if(face instanceof THREE.Face4){face.centroid.add(this.vertices[face.a]);face.centroid.add(this.vertices[face.b]);face.centroid.add(this.vertices[face.c]);face.centroid.add(this.vertices[face.d]);face.centroid.divideScalar(4)}}},computeFaceNormals:function(){var cb=new THREE.Vector3,ab=new THREE.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){var v,vl,f,fl,face,vertices;if(this.__tmpVertices===undefined){this.__tmpVertices=new Array(this.vertices.length);vertices=this.__tmpVertices;for(v=0,vl=this.vertices.length;v<vl;v++){vertices[v]=new THREE.Vector3}for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];if(face instanceof THREE.Face3){face.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}else if(face instanceof THREE.Face4){face.vertexNormals=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3]}}}else{vertices=this.__tmpVertices;for(v=0,vl=this.vertices.length;v<vl;v++){vertices[v].set(0,0,0)}}if(areaWeighted){var vA,vB,vC,vD;var cb=new THREE.Vector3,ab=new THREE.Vector3,db=new THREE.Vector3,dc=new THREE.Vector3,bc=new THREE.Vector3;for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];if(face instanceof THREE.Face3){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 if(face instanceof THREE.Face4){vA=this.vertices[face.a];vB=this.vertices[face.b];vC=this.vertices[face.c];vD=this.vertices[face.d];db.subVectors(vD,vB);ab.subVectors(vA,vB);db.cross(ab);vertices[face.a].add(db);vertices[face.b].add(db);vertices[face.d].add(db);dc.subVectors(vD,vC);bc.subVectors(vB,vC);dc.cross(bc);vertices[face.b].add(dc);vertices[face.c].add(dc);vertices[face.d].add(dc)}}}else{for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];if(face instanceof THREE.Face3){vertices[face.a].add(face.normal);vertices[face.b].add(face.normal);vertices[face.c].add(face.normal)}else if(face instanceof THREE.Face4){vertices[face.a].add(face.normal);vertices[face.b].add(face.normal);vertices[face.c].add(face.normal);vertices[face.d].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];if(face instanceof THREE.Face3){face.vertexNormals[0].copy(vertices[face.a]);face.vertexNormals[1].copy(vertices[face.b]);face.vertexNormals[2].copy(vertices[face.c])}else if(face instanceof THREE.Face4){face.vertexNormals[0].copy(vertices[face.a]);face.vertexNormals[1].copy(vertices[face.b]);face.vertexNormals[2].copy(vertices[face.c]);face.vertexNormals[3].copy(vertices[face.d])}}},computeMorphNormals:function(){var i,il,f,fl,face;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])}}}var tmpGeo=new THREE.Geometry;tmpGeo.faces=this.faces;for(i=0,il=this.morphTargets.length;i<il;i++){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++){face=this.faces[f];faceNormal=new THREE.Vector3;if(face instanceof THREE.Face3){vertexNormals={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3}}else{vertexNormals={a:new THREE.Vector3,b:new THREE.Vector3,c:new THREE.Vector3,d:new THREE.Vector3}}dstNormalsFace.push(faceNormal);dstNormalsVertex.push(vertexNormals)}}var morphNormals=this.morphNormals[i];tmpGeo.vertices=this.morphTargets[i].vertices;tmpGeo.computeFaceNormals();tmpGeo.computeVertexNormals();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);if(face instanceof THREE.Face3){vertexNormals.a.copy(face.vertexNormals[0]);vertexNormals.b.copy(face.vertexNormals[1]);vertexNormals.c.copy(face.vertexNormals[2])}else{vertexNormals.a.copy(face.vertexNormals[0]);vertexNormals.b.copy(face.vertexNormals[1]);vertexNormals.c.copy(face.vertexNormals[2]);vertexNormals.d.copy(face.vertexNormals[3])}}}for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];face.normal=face.__originalFaceNormal;face.vertexNormals=face.__originalVertexNormals}},computeTangents:function(){var f,fl,v,vl,i,il,vertexIndex,face,uv,vA,vB,vC,uvA,uvB,uvC,x1,x2,y1,y2,z1,z2,s1,s2,t1,t2,r,t,test,tan1=[],tan2=[],sdir=new THREE.Vector3,tdir=new THREE.Vector3,tmp=new THREE.Vector3,tmp2=new THREE.Vector3,n=new THREE.Vector3,w;for(v=0,vl=this.vertices.length;v<vl;v++){tan1[v]=new THREE.Vector3;tan2[v]=new THREE.Vector3}function handleTriangle(context,a,b,c,ua,ub,uc){vA=context.vertices[a];vB=context.vertices[b];vC=context.vertices[c];uvA=uv[ua];uvB=uv[ub];uvC=uv[uc];x1=vB.x-vA.x;x2=vC.x-vA.x;y1=vB.y-vA.y;y2=vC.y-vA.y;z1=vB.z-vA.z;z2=vC.z-vA.z;s1=uvB.x-uvA.x;s2=uvC.x-uvA.x;t1=uvB.y-uvA.y;t2=uvC.y-uvA.y;r=1/(s1*t2-s2*t1);sdir.set((t2*x1-t1*x2)*r,(t2*y1-t1*y2)*r,(t2*z1-t1*z2)*r);tdir.set((s1*x2-s2*x1)*r,(s1*y2-s2*y1)*r,(s1*z2-s2*z1)*r);tan1[a].add(sdir);tan1[b].add(sdir);tan1[c].add(sdir);tan2[a].add(tdir);tan2[b].add(tdir);tan2[c].add(tdir)}for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];uv=this.faceVertexUvs[0][f];if(face instanceof THREE.Face3){handleTriangle(this,face.a,face.b,face.c,0,1,2)}else if(face instanceof THREE.Face4){handleTriangle(this,face.a,face.b,face.d,0,1,3);handleTriangle(this,face.b,face.c,face.d,1,2,3)}}var faceIndex=["a","b","c","d"];for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];for(i=0;i<face.vertexNormals.length;i++){n.copy(face.vertexNormals[i]);vertexIndex=face[faceIndex[i]];t=tan1[vertexIndex];tmp.copy(t);tmp.sub(n.multiplyScalar(n.dot(t))).normalize();tmp2.crossVectors(face.vertexNormals[i],t);test=tmp2.dot(tan2[vertexIndex]);w=test<0?-1:1;face.vertexTangents[i]=new THREE.Vector4(tmp.x,tmp.y,tmp.z,w)}}this.hasTangents=true},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 THREE.Box3}this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){if(this.boundingSphere===null){this.boundingSphere=new THREE.Sphere}this.boundingSphere.setFromCenterAndPoints(this.boundingSphere.center,this.vertices)},mergeVertices:function(){var verticesMap={};var unique=[],changes=[];var v,key;var precisionPoints=4;var precision=Math.pow(10,precisionPoints);var i,il,face;var indices,k,j,jl,u;this.__tmpVertices=undefined;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)].join("_");if(verticesMap[key]===undefined){verticesMap[key]=i;unique.push(this.vertices[i]);changes[i]=unique.length-1}else{changes[i]=changes[verticesMap[key]]}}var faceIndicesToRemove=[];for(i=0,il=this.faces.length;i<il;i++){face=this.faces[i];if(face instanceof THREE.Face3){face.a=changes[face.a];face.b=changes[face.b];face.c=changes[face.c];indices=[face.a,face.b,face.c];var dupIndex=-1;for(var n=0;n<3;n++){if(indices[n]==indices[(n+1)%3]){dupIndex=n;faceIndicesToRemove.push(i);break}}}else if(face instanceof THREE.Face4){face.a=changes[face.a];face.b=changes[face.b];face.c=changes[face.c];face.d=changes[face.d];indices=[face.a,face.b,face.c,face.d];var dupIndex=-1;for(var n=0;n<4;n++){if(indices[n]==indices[(n+1)%4]){if(dupIndex>=0){faceIndicesToRemove.push(i)}dupIndex=n}}if(dupIndex>=0){indices.splice(dupIndex,1);var newFace=new THREE.Face3(indices[0],indices[1],indices[2],face.normal,face.color,face.materialIndex);for(j=0,jl=this.faceVertexUvs.length;j<jl;j++){u=this.faceVertexUvs[j][i];if(u){u.splice(dupIndex,1)}}if(face.vertexNormals&&face.vertexNormals.length>0){newFace.vertexNormals=face.vertexNormals;newFace.vertexNormals.splice(dupIndex,1)}if(face.vertexColors&&face.vertexColors.length>0){newFace.vertexColors=face.vertexColors;newFace.vertexColors.splice(dupIndex,1)}this.faces[i]=newFace}}}for(i=faceIndicesToRemove.length-1;i>=0;i--){this.faces.splice(i,1);for(j=0,jl=this.faceVertexUvs.length;j<jl;j++){this.faceVertexUvs[j].splice(i,1)}}var diff=this.vertices.length-unique.length;this.vertices=unique;return diff},clone:function(){var geometry=new THREE.Geometry;var vertices=this.vertices;for(var i=0,il=vertices.length;i<il;i++){geometry.vertices.push(vertices[i].clone())}var faces=this.faces;for(var i=0,il=faces.length;i<il;i++){geometry.faces.push(faces[i].clone())}var uvs=this.faceVertexUvs[0];for(var i=0,il=uvs.length;i<il;i++){var uv=uvs[i],uvCopy=[];for(var j=0,jl=uv.length;j<jl;j++){uvCopy.push(new THREE.Vector2(uv[j].x,uv[j].y))}geometry.faceVertexUvs[0].push(uvCopy)}return geometry},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.GeometryIdCount=0;THREE.BufferGeometry=function(){THREE.EventDispatcher.call(this);this.id=THREE.GeometryIdCount++;this.attributes={};this.dynamic=false;this.offsets=[];this.boundingBox=null;this.boundingSphere=null;this.hasTangents=false;this.morphTargets=[]};THREE.BufferGeometry.prototype={constructor:THREE.BufferGeometry,applyMatrix:function(matrix){var positionArray;var normalArray;if(this.attributes["position"])positionArray=this.attributes["position"].array;if(this.attributes["normal"])normalArray=this.attributes["normal"].array;if(positionArray!==undefined){matrix.multiplyVector3Array(positionArray);this.verticesNeedUpdate=true}if(normalArray!==undefined){var normalMatrix=new THREE.Matrix3;normalMatrix.getInverse(matrix).transpose();normalMatrix.multiplyVector3Array(normalArray);this.normalizeNormals();this.normalsNeedUpdate=true}},computeBoundingBox:function(){if(this.boundingBox===null){this.boundingBox=new THREE.Box3}var positions=this.attributes["position"].array;if(positions){var bb=this.boundingBox;var x,y,z;if(positions.length>=3){bb.min.x=bb.max.x=positions[0];bb.min.y=bb.max.y=positions[1];bb.min.z=bb.max.z=positions[2]}for(var i=3,il=positions.length;i<il;i+=3){x=positions[i];y=positions[i+1];z=positions[i+2];if(x<bb.min.x){bb.min.x=x}else if(x>bb.max.x){bb.max.x=x}if(y<bb.min.y){bb.min.y=y}else if(y>bb.max.y){bb.max.y=y}if(z<bb.min.z){bb.min.z=z}else if(z>bb.max.z){bb.max.z=z}}}if(positions===undefined||positions.length===0){this.boundingBox.min.set(0,0,0);this.boundingBox.max.set(0,0,0)}},computeBoundingSphere:function(){if(this.boundingSphere===null){this.boundingSphere=new THREE.Sphere}var positions=this.attributes["position"].array;if(positions){var radiusSq,maxRadiusSq=0;var x,y,z;for(var i=0,il=positions.length;i<il;i+=3){x=positions[i];y=positions[i+1];z=positions[i+2];radiusSq=x*x+y*y+z*z;if(radiusSq>maxRadiusSq)maxRadiusSq=radiusSq}this.boundingSphere.radius=Math.sqrt(maxRadiusSq)}},computeVertexNormals:function(){if(this.attributes["position"]){var i,il;var j,jl;var nVertexElements=this.attributes["position"].array.length;if(this.attributes["normal"]===undefined){this.attributes["normal"]={itemSize:3,array:new Float32Array(nVertexElements),numItems:nVertexElements}}else{for(i=0,il=this.attributes["normal"].array.length;i<il;i++){this.attributes["normal"].array[i]=0}}var positions=this.attributes["position"].array;var normals=this.attributes["normal"].array;var vA,vB,vC,x,y,z,pA=new THREE.Vector3,pB=new THREE.Vector3,pC=new THREE.Vector3,cb=new THREE.Vector3,ab=new THREE.Vector3;if(this.attributes["index"]){var indices=this.attributes["index"].array;var offsets=this.offsets;for(j=0,jl=offsets.length;j<jl;++j){var start=offsets[j].start;var count=offsets[j].count;var index=offsets[j].index;for(i=start,il=start+count;i<il;i+=3){vA=index+indices[i];vB=index+indices[i+1];vC=index+indices[i+2];x=positions[vA*3];y=positions[vA*3+1];z=positions[vA*3+2];pA.set(x,y,z);x=positions[vB*3];y=positions[vB*3+1];z=positions[vB*3+2];pB.set(x,y,z);x=positions[vC*3];y=positions[vC*3+1];z=positions[vC*3+2];pC.set(x,y,z);cb.subVectors(pC,pB);ab.subVectors(pA,pB);cb.cross(ab);normals[vA*3]+=cb.x;normals[vA*3+1]+=cb.y;normals[vA*3+2]+=cb.z;normals[vB*3]+=cb.x;normals[vB*3+1]+=cb.y;normals[vB*3+2]+=cb.z;normals[vC*3]+=cb.x;normals[vC*3+1]+=cb.y;normals[vC*3+2]+=cb.z}}}else{for(i=0,il=positions.length;i<il;i+=9){x=positions[i];y=positions[i+1];z=positions[i+2];pA.set(x,y,z);x=positions[i+3];y=positions[i+4];z=positions[i+5];pB.set(x,y,z);x=positions[i+6];y=positions[i+7];z=positions[i+8];pC.set(x,y,z);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();this.normalsNeedUpdate=true}},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/Math.sqrt(x*x+y*y+z*z);normals[i]*=n;normals[i+1]*=n;normals[i+2]*=n}},computeTangents:function(){if(this.attributes["index"]===undefined||this.attributes["position"]===undefined||this.attributes["normal"]===undefined||this.attributes["uv"]===undefined){console.warn("Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()");return}var indices=this.attributes["index"].array;var positions=this.attributes["position"].array;var normals=this.attributes["normal"].array;var uvs=this.attributes["uv"].array;var nVertices=positions.length/3;if(this.attributes["tangent"]===undefined){var nTangentElements=4*nVertices;this.attributes["tangent"]={itemSize:4,array:new Float32Array(nTangentElements),numItems:nTangentElements}}var tangents=this.attributes["tangent"].array;var tan1=[],tan2=[];for(var k=0;k<nVertices;k++){tan1[k]=new THREE.Vector3;tan2[k]=new THREE.Vector3}var xA,yA,zA,xB,yB,zB,xC,yC,zC,uA,vA,uB,vB,uC,vC,x1,x2,y1,y2,z1,z2,s1,s2,t1,t2,r;var sdir=new THREE.Vector3,tdir=new THREE.Vector3;function handleTriangle(a,b,c){xA=positions[a*3];yA=positions[a*3+1];zA=positions[a*3+2];xB=positions[b*3];yB=positions[b*3+1];zB=positions[b*3+2];xC=positions[c*3];yC=positions[c*3+1];zC=positions[c*3+2];uA=uvs[a*2];vA=uvs[a*2+1];uB=uvs[b*2];vB=uvs[b*2+1];uC=uvs[c*2];vC=uvs[c*2+1];x1=xB-xA;x2=xC-xA;y1=yB-yA;y2=yC-yA;z1=zB-zA;z2=zC-zA;s1=uB-uA;s2=uC-uA;t1=vB-vA;t2=vC-vA;r=1/(s1*t2-s2*t1);sdir.set((t2*x1-t1*x2)*r,(t2*y1-t1*y2)*r,(t2*z1-t1*z2)*r);tdir.set((s1*x2-s2*x1)*r,(s1*y2-s2*y1)*r,(s1*z2-s2*z1)*r);tan1[a].add(sdir);tan1[b].add(sdir);tan1[c].add(sdir);tan2[a].add(tdir);tan2[b].add(tdir);tan2[c].add(tdir)}var i,il;var j,jl;var iA,iB,iC;var offsets=this.offsets;for(j=0,jl=offsets.length;j<jl;++j){var start=offsets[j].start;var count=offsets[j].count;var index=offsets[j].index;for(i=start,il=start+count;i<il;i+=3){iA=index+indices[i];iB=index+indices[i+1];iC=index+indices[i+2];handleTriangle(iA,iB,iC)}}var tmp=new THREE.Vector3,tmp2=new THREE.Vector3;var n=new THREE.Vector3,n2=new THREE.Vector3;var w,t,test;function handleVertex(v){n.x=normals[v*3];n.y=normals[v*3+1];n.z=normals[v*3+2];n2.copy(n);t=tan1[v];tmp.copy(t);tmp.sub(n.multiplyScalar(n.dot(t))).normalize();tmp2.crossVectors(n2,t);test=tmp2.dot(tan2[v]);w=test<0?-1:1;tangents[v*4]=tmp.x;tangents[v*4+1]=tmp.y;tangents[v*4+2]=tmp.z;tangents[v*4+3]=w}for(j=0,jl=offsets.length;j<jl;++j){var start=offsets[j].start;var count=offsets[j].count;var index=offsets[j].index;for(i=start,il=start+count;i<il;i+=3){iA=index+indices[i];iB=index+indices[i+1];iC=index+indices[i+2];handleVertex(iA);handleVertex(iB);handleVertex(iC)}}this.hasTangents=true;this.tangentsNeedUpdate=true},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.Camera=function(){THREE.Object3D.call(this);this.matrixWorldInverse=new THREE.Matrix4;this.projectionMatrix=new THREE.Matrix4;this.projectionMatrixInverse=new THREE.Matrix4};THREE.Camera.prototype=Object.create(THREE.Object3D.prototype);THREE.Camera.prototype.lookAt=function(vector){this.matrix.lookAt(this.position,vector,this.up);if(this.rotationAutoUpdate===true){if(this.useQuaternion===false){this.rotation.setEulerFromRotationMatrix(this.matrix,this.eulerOrder)}else{this.quaternion.copy(this.matrix.decompose()[1])}}};THREE.OrthographicCamera=function(left,right,top,bottom,near,far){THREE.Camera.call(this);this.left=left;this.right=right;this.top=top;this.bottom=bottom;this.near=near!==undefined?near:.1;this.far=far!==undefined?far:2e3;this.updateProjectionMatrix()};THREE.OrthographicCamera.prototype=Object.create(THREE.Camera.prototype);THREE.OrthographicCamera.prototype.updateProjectionMatrix=function(){this.projectionMatrix.makeOrthographic(this.left,this.right,this.top,this.bottom,this.near,this.far)};THREE.PerspectiveCamera=function(fov,aspect,near,far){THREE.Camera.call(this);this.fov=fov!==undefined?fov:50;this.aspect=aspect!==undefined?aspect:1;this.near=near!==undefined?near:.1;this.far=far!==undefined?far:2e3;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype=Object.create(THREE.Camera.prototype);THREE.PerspectiveCamera.prototype.setLens=function(focalLength,frameHeight){if(frameHeight===undefined)frameHeight=24;this.fov=2*THREE.Math.radToDeg(Math.atan(frameHeight/(focalLength*2)));this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype.setViewOffset=function(fullWidth,fullHeight,x,y,width,height){this.fullWidth=fullWidth;this.fullHeight=fullHeight;this.x=x;this.y=y;this.width=width;this.height=height;this.updateProjectionMatrix()};THREE.PerspectiveCamera.prototype.updateProjectionMatrix=function(){if(this.fullWidth){var aspect=this.fullWidth/this.fullHeight;var top=Math.tan(THREE.Math.degToRad(this.fov*.5))*this.near;var bottom=-top;var left=aspect*bottom;var right=aspect*top;var width=Math.abs(right-left);var height=Math.abs(top-bottom);this.projectionMatrix.makeFrustum(left+this.x*width/this.fullWidth,left+(this.x+this.width)*width/this.fullWidth,top-(this.y+this.height)*height/this.fullHeight,top-this.y*height/this.fullHeight,this.near,this.far)}else{this.projectionMatrix.makePerspective(this.fov,this.aspect,this.near,this.far)}};THREE.Light=function(hex){THREE.Object3D.call(this);this.color=new THREE.Color(hex)};THREE.Light.prototype=Object.create(THREE.Object3D.prototype);THREE.AmbientLight=function(hex){THREE.Light.call(this,hex)};THREE.AmbientLight.prototype=Object.create(THREE.Light.prototype);THREE.AreaLight=function(hex,intensity){THREE.Light.call(this,hex);this.normal=new THREE.Vector3(0,-1,0);this.right=new THREE.Vector3(1,0,0);this.intensity=intensity!==undefined?intensity:1;this.width=1;this.height=1;this.constantAttenuation=1.5;this.linearAttenuation=.5;this.quadraticAttenuation=.1};THREE.AreaLight.prototype=Object.create(THREE.Light.prototype);THREE.DirectionalLight=function(hex,intensity){THREE.Light.call(this,hex);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=intensity!==undefined?intensity:1;this.castShadow=false;this.onlyShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5e3;this.shadowCameraLeft=-500;this.shadowCameraRight=500;this.shadowCameraTop=500;this.shadowCameraBottom=-500;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapWidth=512;this.shadowMapHeight=512;this.shadowCascade=false;this.shadowCascadeOffset=new THREE.Vector3(0,0,-1e3);this.shadowCascadeCount=2;this.shadowCascadeBias=[0,0,0];this.shadowCascadeWidth=[512,512,512];this.shadowCascadeHeight=[512,512,512];this.shadowCascadeNearZ=[-1,.99,.998];this.shadowCascadeFarZ=[.99,.998,1];this.shadowCascadeArray=[];this.shadowMap=null;this.shadowMapSize=null;this.shadowCamera=null;this.shadowMatrix=null};THREE.DirectionalLight.prototype=Object.create(THREE.Light.prototype);THREE.HemisphereLight=function(skyColorHex,groundColorHex,intensity){THREE.Light.call(this,skyColorHex);this.groundColor=new THREE.Color(groundColorHex);this.position=new THREE.Vector3(0,100,0);this.intensity=intensity!==undefined?intensity:1};THREE.HemisphereLight.prototype=Object.create(THREE.Light.prototype);THREE.PointLight=function(hex,intensity,distance){THREE.Light.call(this,hex);this.position=new THREE.Vector3(0,0,0);this.intensity=intensity!==undefined?intensity:1;this.distance=distance!==undefined?distance:0};THREE.PointLight.prototype=Object.create(THREE.Light.prototype);THREE.SpotLight=function(hex,intensity,distance,angle,exponent){THREE.Light.call(this,hex);this.position=new THREE.Vector3(0,1,0);this.target=new THREE.Object3D;this.intensity=intensity!==undefined?intensity:1;this.distance=distance!==undefined?distance:0;this.angle=angle!==undefined?angle:Math.PI/2;this.exponent=exponent!==undefined?exponent:10;this.castShadow=false;this.onlyShadow=false;this.shadowCameraNear=50;this.shadowCameraFar=5e3;this.shadowCameraFov=50;this.shadowCameraVisible=false;this.shadowBias=0;this.shadowDarkness=.5;this.shadowMapWidth=512;this.shadowMapHeight=512;this.shadowMap=null;this.shadowMapSize=null;this.shadowCamera=null;this.shadowMatrix=null};THREE.SpotLight.prototype=Object.create(THREE.Light.prototype);THREE.Loader=function(showStatus){this.showStatus=showStatus;this.statusDomElement=showStatus?THREE.Loader.prototype.addStatusElement():null;this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){}};THREE.Loader.prototype={constructor:THREE.Loader,crossOrigin:"anonymous",addStatusElement:function(){var e=document.createElement("div");e.style.position="absolute";e.style.right="0px";e.style.top="0px";e.style.fontSize="0.8em";e.style.textAlign="left";e.style.background="rgba(0,0,0,0.25)";e.style.color="#fff";e.style.width="120px";e.style.padding="0.5em 0.5em 0.5em 0.5em";e.style.zIndex=1e3;e.innerHTML="Loading ...";return e},updateProgress:function(progress){var message="Loaded ";if(progress.total){message+=(100*progress.loaded/progress.total).toFixed(0)+"%"}else{message+=(progress.loaded/1e3).toFixed(2)+" KB"}this.statusDomElement.innerHTML=message},extractUrlBase:function(url){var parts=url.split("/");parts.pop();return(parts.length<1?".":parts.join("/"))+"/"},initMaterials:function(materials,texturePath){var array=[];for(var i=0;i<materials.length;++i){array[i]=THREE.Loader.prototype.createMaterial(materials[i],texturePath)}return array},needsTangents:function(materials){for(var i=0,il=materials.length;i<il;i++){var m=materials[i];if(m instanceof THREE.ShaderMaterial)return true}return false},createMaterial:function(m,texturePath){var _this=this;function is_pow2(n){var l=Math.log(n)/Math.LN2;return Math.floor(l)==l}function nearest_pow2(n){var l=Math.log(n)/Math.LN2;return Math.pow(2,Math.round(l))}function load_image(where,url){var image=new Image;image.onload=function(){if(!is_pow2(this.width)||!is_pow2(this.height)){var width=nearest_pow2(this.width);var height=nearest_pow2(this.height);where.image.width=width;where.image.height=height;where.image.getContext("2d").drawImage(this,0,0,width,height)}else{where.image=this}where.needsUpdate=true};image.crossOrigin=_this.crossOrigin;image.src=url}function create_texture(where,name,sourceFile,repeat,offset,wrap,anisotropy){var isCompressed=/\.dds$/i.test(sourceFile);var fullPath=texturePath+"/"+sourceFile;if(isCompressed){var texture=THREE.ImageUtils.loadCompressedTexture(fullPath);where[name]=texture}else{var texture=document.createElement("canvas");where[name]=new THREE.Texture(texture)}where[name].sourceFile=sourceFile;if(repeat){where[name].repeat.set(repeat[0],repeat[1]);if(repeat[0]!==1)where[name].wrapS=THREE.RepeatWrapping;if(repeat[1]!==1)where[name].wrapT=THREE.RepeatWrapping}if(offset){where[name].offset.set(offset[0],offset[1])}if(wrap){var wrapMap={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(wrapMap[wrap[0]]!==undefined)where[name].wrapS=wrapMap[wrap[0]];if(wrapMap[wrap[1]]!==undefined)where[name].wrapT=wrapMap[wrap[1]]}if(anisotropy){where[name].anisotropy=anisotropy}if(!isCompressed){load_image(where[name],fullPath)}}function rgb2hex(rgb){return(rgb[0]*255<<16)+(rgb[1]*255<<8)+rgb[2]*255}var mtype="MeshLambertMaterial";var mpars={color:15658734,opacity:1,map:null,lightMap:null,normalMap:null,bumpMap:null,wireframe:false};if(m.shading){var shading=m.shading.toLowerCase();if(shading==="phong")mtype="MeshPhongMaterial";else if(shading==="basic")mtype="MeshBasicMaterial"}if(m.blending!==undefined&&THREE[m.blending]!==undefined){mpars.blending=THREE[m.blending]}if(m.transparent!==undefined||m.opacity<1){mpars.transparent=m.transparent}if(m.depthTest!==undefined){mpars.depthTest=m.depthTest}if(m.depthWrite!==undefined){mpars.depthWrite=m.depthWrite}if(m.visible!==undefined){mpars.visible=m.visible}if(m.flipSided!==undefined){mpars.side=THREE.BackSide}if(m.doubleSided!==undefined){mpars.side=THREE.DoubleSide}if(m.wireframe!==undefined){mpars.wireframe=m.wireframe}if(m.vertexColors!==undefined){if(m.vertexColors==="face"){mpars.vertexColors=THREE.FaceColors}else if(m.vertexColors){mpars.vertexColors=THREE.VertexColors}}if(m.colorDiffuse){mpars.color=rgb2hex(m.colorDiffuse)}else if(m.DbgColor){mpars.color=m.DbgColor}if(m.colorSpecular){mpars.specular=rgb2hex(m.colorSpecular)}if(m.colorAmbient){mpars.ambient=rgb2hex(m.colorAmbient)}if(m.transparency){mpars.opacity=m.transparency}if(m.specularCoef){mpars.shininess=m.specularCoef}if(m.mapDiffuse&&texturePath){create_texture(mpars,"map",m.mapDiffuse,m.mapDiffuseRepeat,m.mapDiffuseOffset,m.mapDiffuseWrap,m.mapDiffuseAnisotropy)}if(m.mapLight&&texturePath){create_texture(mpars,"lightMap",m.mapLight,m.mapLightRepeat,m.mapLightOffset,m.mapLightWrap,m.mapLightAnisotropy)}if(m.mapBump&&texturePath){create_texture(mpars,"bumpMap",m.mapBump,m.mapBumpRepeat,m.mapBumpOffset,m.mapBumpWrap,m.mapBumpAnisotropy)}if(m.mapNormal&&texturePath){create_texture(mpars,"normalMap",m.mapNormal,m.mapNormalRepeat,m.mapNormalOffset,m.mapNormalWrap,m.mapNormalAnisotropy)}if(m.mapSpecular&&texturePath){create_texture(mpars,"specularMap",m.mapSpecular,m.mapSpecularRepeat,m.mapSpecularOffset,m.mapSpecularWrap,m.mapSpecularAnisotropy)}if(m.mapBumpScale){mpars.bumpScale=m.mapBumpScale}if(m.mapNormal){var shader=THREE.ShaderLib["normalmap"];var uniforms=THREE.UniformsUtils.clone(shader.uniforms);uniforms["tNormal"].value=mpars.normalMap;if(m.mapNormalFactor){uniforms["uNormalScale"].value.set(m.mapNormalFactor,m.mapNormalFactor)}if(mpars.map){uniforms["tDiffuse"].value=mpars.map;uniforms["enableDiffuse"].value=true}if(mpars.specularMap){uniforms["tSpecular"].value=mpars.specularMap;uniforms["enableSpecular"].value=true}if(mpars.lightMap){uniforms["tAO"].value=mpars.lightMap;uniforms["enableAO"].value=true}uniforms["uDiffuseColor"].value.setHex(mpars.color);uniforms["uSpecularColor"].value.setHex(mpars.specular);uniforms["uAmbientColor"].value.setHex(mpars.ambient);uniforms["uShininess"].value=mpars.shininess;if(mpars.opacity!==undefined){uniforms["uOpacity"].value=mpars.opacity}var parameters={fragmentShader:shader.fragmentShader,vertexShader:shader.vertexShader,uniforms:uniforms,lights:true,fog:true};var material=new THREE.ShaderMaterial(parameters);if(mpars.transparent){material.transparent=true}}else{var material=new THREE[mtype](mpars)}if(m.DbgName!==undefined)material.name=m.DbgName;return material}};THREE.ImageLoader=function(){THREE.EventDispatcher.call(this);this.crossOrigin=null};THREE.ImageLoader.prototype={constructor:THREE.ImageLoader,load:function(url,image){var scope=this;if(image===undefined)image=new Image;image.addEventListener("load",function(){scope.dispatchEvent({type:"load",content:image})},false);image.addEventListener("error",function(){scope.dispatchEvent({type:"error",message:"Couldn't load URL ["+url+"]"})},false);if(scope.crossOrigin)image.crossOrigin=scope.crossOrigin;image.src=url}};THREE.JSONLoader=function(showStatus){THREE.Loader.call(this,showStatus);this.withCredentials=false};THREE.JSONLoader.prototype=Object.create(THREE.Loader.prototype);THREE.JSONLoader.prototype.load=function(url,callback,texturePath){var scope=this;texturePath=texturePath&&typeof texturePath==="string"?texturePath:this.extractUrlBase(url);this.onLoadStart();this.loadAjaxJSON(this,url,callback,texturePath)};THREE.JSONLoader.prototype.loadAjaxJSON=function(context,url,callback,texturePath,callbackProgress){var xhr=new XMLHttpRequest;var length=0;xhr.onreadystatechange=function(){if(xhr.readyState===xhr.DONE){if(xhr.status===200||xhr.status===0){if(xhr.responseText){var json=JSON.parse(xhr.responseText);context.createModel(json,callback,texturePath)}else{console.warn("THREE.JSONLoader: ["+url+"] seems to be unreachable or file there is empty")}context.onLoadComplete()}else{console.error("THREE.JSONLoader: Couldn't load ["+url+"] ["+xhr.status+"]")}}else if(xhr.readyState===xhr.LOADING){if(callbackProgress){if(length===0){length=xhr.getResponseHeader("Content-Length")}callbackProgress({total:length,loaded:xhr.responseText.length})}}else if(xhr.readyState===xhr.HEADERS_RECEIVED){length=xhr.getResponseHeader("Content-Length")}};xhr.open("GET",url,true);xhr.withCredentials=this.withCredentials;xhr.send(null)};THREE.JSONLoader.prototype.createModel=function(json,callback,texturePath){var scope=this,geometry=new THREE.Geometry,scale=json.scale!==undefined?1/json.scale:1;parseModel(scale);parseSkin();parseMorphing(scale);geometry.computeCentroids();geometry.computeFaceNormals();function parseModel(scale){function isBitSet(value,position){return value&1<<position}var i,j,fi,offset,zLength,nVertices,colorIndex,normalIndex,uvIndex,materialIndex,type,isQuad,hasMaterial,hasFaceUv,hasFaceVertexUv,hasFaceNormal,hasFaceVertexNormal,hasFaceColor,hasFaceVertexColor,vertex,face,color,normal,uvLayer,uvs,u,v,faces=json.faces,vertices=json.vertices,normals=json.normals,colors=json.colors,nUvLayers=0;for(i=0;i<json.uvs.length;i++){if(json.uvs[i].length)nUvLayers++}for(i=0;i<nUvLayers;i++){geometry.faceUvs[i]=[];geometry.faceVertexUvs[i]=[]}offset=0;zLength=vertices.length;while(offset<zLength){vertex=new THREE.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);hasFaceUv=isBitSet(type,2);hasFaceVertexUv=isBitSet(type,3);hasFaceNormal=isBitSet(type,4);hasFaceVertexNormal=isBitSet(type,5);hasFaceColor=isBitSet(type,6);hasFaceVertexColor=isBitSet(type,7);if(isQuad){face=new THREE.Face4;face.a=faces[offset++];face.b=faces[offset++];face.c=faces[offset++];face.d=faces[offset++];nVertices=4}else{face=new THREE.Face3;face.a=faces[offset++];face.b=faces[offset++];face.c=faces[offset++];nVertices=3}if(hasMaterial){materialIndex=faces[offset++];face.materialIndex=materialIndex}fi=geometry.faces.length;if(hasFaceUv){for(i=0;i<nUvLayers;i++){uvLayer=json.uvs[i];uvIndex=faces[offset++];u=uvLayer[uvIndex*2];v=uvLayer[uvIndex*2+1];geometry.faceUvs[i][fi]=new THREE.Vector2(u,v)}}if(hasFaceVertexUv){for(i=0;i<nUvLayers;i++){uvLayer=json.uvs[i];uvs=[];for(j=0;j<nVertices;j++){uvIndex=faces[offset++];u=uvLayer[uvIndex*2];v=uvLayer[uvIndex*2+1];uvs[j]=new THREE.Vector2(u,v)}geometry.faceVertexUvs[i][fi]=uvs}}if(hasFaceNormal){normalIndex=faces[offset++]*3;normal=new THREE.Vector3;normal.x=normals[normalIndex++];normal.y=normals[normalIndex++];normal.z=normals[normalIndex];face.normal=normal}if(hasFaceVertexNormal){for(i=0;i<nVertices;i++){normalIndex=faces[offset++]*3;normal=new THREE.Vector3;normal.x=normals[normalIndex++];normal.y=normals[normalIndex++];normal.z=normals[normalIndex];face.vertexNormals.push(normal)}}if(hasFaceColor){colorIndex=faces[offset++];color=new THREE.Color(colors[colorIndex]);face.color=color}if(hasFaceVertexColor){for(i=0;i<nVertices;i++){colorIndex=faces[offset++];color=new THREE.Color(colors[colorIndex]);face.vertexColors.push(color)}}geometry.faces.push(face)}}function parseSkin(){var i,l,x,y,z,w,a,b,c,d;if(json.skinWeights){for(i=0,l=json.skinWeights.length;i<l;i+=2){x=json.skinWeights[i];y=json.skinWeights[i+1];z=0;w=0;geometry.skinWeights.push(new THREE.Vector4(x,y,z,w))}}if(json.skinIndices){for(i=0,l=json.skinIndices.length;i<l;i+=2){a=json.skinIndices[i];b=json.skinIndices[i+1];c=0;d=0;geometry.skinIndices.push(new THREE.Vector4(a,b,c,d))}}geometry.bones=json.bones;geometry.animation=json.animation}function parseMorphing(scale){if(json.morphTargets!==undefined){var i,l,v,vl,dstVertices,srcVertices;for(i=0,l=json.morphTargets.length;i<l;i++){geometry.morphTargets[i]={};geometry.morphTargets[i].name=json.morphTargets[i].name;geometry.morphTargets[i].vertices=[];dstVertices=geometry.morphTargets[i].vertices;srcVertices=json.morphTargets[i].vertices;for(v=0,vl=srcVertices.length;v<vl;v+=3){var vertex=new THREE.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){var i,l,c,cl,dstColors,srcColors,color;for(i=0,l=json.morphColors.length;i<l;i++){geometry.morphColors[i]={};geometry.morphColors[i].name=json.morphColors[i].name;geometry.morphColors[i].colors=[];dstColors=geometry.morphColors[i].colors;srcColors=json.morphColors[i].colors;for(c=0,cl=srcColors.length;c<cl;c+=3){color=new THREE.Color(16755200);color.setRGB(srcColors[c],srcColors[c+1],srcColors[c+2]);dstColors.push(color)}}}}var materials=this.initMaterials(json.materials,texturePath);if(this.needsTangents(materials))geometry.computeTangents();callback(geometry,materials)};THREE.LoadingMonitor=function(){THREE.EventDispatcher.call(this);var scope=this;var loaded=0;var total=0;var onLoad=function(event){loaded++;scope.dispatchEvent({type:"progress",loaded:loaded,total:total});if(loaded===total){scope.dispatchEvent({type:"load"})}};this.add=function(loader){total++;loader.addEventListener("load",onLoad,false)}};THREE.SceneLoader=function(){this.onLoadStart=function(){};this.onLoadProgress=function(){};this.onLoadComplete=function(){};this.callbackSync=function(){};this.callbackProgress=function(){};this.geometryHandlerMap={};this.hierarchyHandlerMap={};this.addGeometryHandler("ascii",THREE.JSONLoader)};THREE.SceneLoader.prototype.constructor=THREE.SceneLoader;THREE.SceneLoader.prototype.load=function(url,callbackFinished){var scope=this;var xhr=new XMLHttpRequest;xhr.onreadystatechange=function(){if(xhr.readyState===4){if(xhr.status===200||xhr.status===0){var json=JSON.parse(xhr.responseText);scope.parse(json,callbackFinished,url)}else{console.error("THREE.SceneLoader: Couldn't load ["+url+"] ["+xhr.status+"]")}}};xhr.open("GET",url,true);xhr.send(null)};THREE.SceneLoader.prototype.addGeometryHandler=function(typeID,loaderClass){this.geometryHandlerMap[typeID]={loaderClass:loaderClass}};THREE.SceneLoader.prototype.addHierarchyHandler=function(typeID,loaderClass){this.hierarchyHandlerMap[typeID]={loaderClass:loaderClass}};THREE.SceneLoader.prototype.parse=function(json,callbackFinished,url){var scope=this;var urlBase=THREE.Loader.prototype.extractUrlBase(url);var geometry,material,camera,fog,texture,images,color,light,hex,intensity,counter_models,counter_textures,total_models,total_textures,result;var target_array=[];var data=json;for(var typeID in this.geometryHandlerMap){var loaderClass=this.geometryHandlerMap[typeID]["loaderClass"];this.geometryHandlerMap[typeID]["loaderObject"]=new loaderClass}for(var typeID in this.hierarchyHandlerMap){var loaderClass=this.hierarchyHandlerMap[typeID]["loaderClass"];this.hierarchyHandlerMap[typeID]["loaderObject"]=new loaderClass}counter_models=0;counter_textures=0;result={scene:new THREE.Scene,geometries:{},face_materials:{},materials:{},textures:{},objects:{},cameras:{},lights:{},fogs:{},empties:{},groups:{}};if(data.transform){var position=data.transform.position,rotation=data.transform.rotation,scale=data.transform.scale;if(position)result.scene.position.set(position[0],position[1],position[2]);if(rotation)result.scene.rotation.set(rotation[0],rotation[1],rotation[2]);if(scale)result.scene.scale.set(scale[0],scale[1],scale[2]);if(position||rotation||scale){result.scene.updateMatrix();result.scene.updateMatrixWorld()}}function get_url(source_url,url_type){if(url_type=="relativeToHTML"){return source_url}else{return urlBase+"/"+source_url}}function handle_objects(){handle_children(result.scene,data.objects)}function handle_children(parent,children){var mat,dst,pos,rot,scl,quat;for(var objID in children){if(result.objects[objID]===undefined){var objJSON=children[objID];var object=null;if(objJSON.type&&objJSON.type in scope.hierarchyHandlerMap){if(objJSON.loading===undefined){var reservedTypes={type:1,url:1,material:1,position:1,rotation:1,scale:1,visible:1,children:1,properties:1,skin:1,morph:1,mirroredLoop:1,duration:1};var loaderParameters={};for(var parType in objJSON){if(!(parType in reservedTypes)){loaderParameters[parType]=objJSON[parType]}}material=result.materials[objJSON.material];objJSON.loading=true;var loader=scope.hierarchyHandlerMap[objJSON.type]["loaderObject"];if(loader.options){loader.load(get_url(objJSON.url,data.urlBaseType),create_callback_hierachy(objID,parent,material,objJSON))}else{loader.load(get_url(objJSON.url,data.urlBaseType),create_callback_hierachy(objID,parent,material,objJSON),loaderParameters)}}}else if(objJSON.geometry!==undefined){geometry=result.geometries[objJSON.geometry];if(geometry){var needsTangents=false;material=result.materials[objJSON.material];needsTangents=material instanceof THREE.ShaderMaterial;pos=objJSON.position;rot=objJSON.rotation;scl=objJSON.scale;mat=objJSON.matrix;quat=objJSON.quaternion;if(!objJSON.material){material=new THREE.MeshFaceMaterial(result.face_materials[objJSON.geometry])}if(material instanceof THREE.MeshFaceMaterial&&material.materials.length===0){material=new THREE.MeshFaceMaterial(result.face_materials[objJSON.geometry])}if(material instanceof THREE.MeshFaceMaterial){for(var i=0;i<material.materials.length;i++){needsTangents=needsTangents||material.materials[i]instanceof THREE.ShaderMaterial}}if(needsTangents){geometry.computeTangents()}if(objJSON.skin){object=new THREE.SkinnedMesh(geometry,material)}else if(objJSON.morph){object=new THREE.MorphAnimMesh(geometry,material);if(objJSON.duration!==undefined){object.duration=objJSON.duration}if(objJSON.time!==undefined){object.time=objJSON.time}if(objJSON.mirroredLoop!==undefined){object.mirroredLoop=objJSON.mirroredLoop}if(material.morphNormals){geometry.computeMorphNormals()}}else{object=new THREE.Mesh(geometry,material)}object.name=objID;if(mat){object.matrixAutoUpdate=false;object.matrix.set(mat[0],mat[1],mat[2],mat[3],mat[4],mat[5],mat[6],mat[7],mat[8],mat[9],mat[10],mat[11],mat[12],mat[13],mat[14],mat[15])}else{object.position.set(pos[0],pos[1],pos[2]);if(quat){object.quaternion.set(quat[0],quat[1],quat[2],quat[3]);object.useQuaternion=true}else{object.rotation.set(rot[0],rot[1],rot[2])}object.scale.set(scl[0],scl[1],scl[2])}object.visible=objJSON.visible;object.castShadow=objJSON.castShadow;object.receiveShadow=objJSON.receiveShadow;parent.add(object);result.objects[objID]=object}}else if(objJSON.type==="DirectionalLight"||objJSON.type==="PointLight"||objJSON.type==="AmbientLight"){hex=objJSON.color!==undefined?objJSON.color:16777215;intensity=objJSON.intensity!==undefined?objJSON.intensity:1;if(objJSON.type==="DirectionalLight"){pos=objJSON.direction;light=new THREE.DirectionalLight(hex,intensity);light.position.set(pos[0],pos[1],pos[2]);if(objJSON.target){target_array.push({object:light,targetName:objJSON.target});light.target=null}}else if(objJSON.type==="PointLight"){pos=objJSON.position;dst=objJSON.distance;light=new THREE.PointLight(hex,intensity,dst);light.position.set(pos[0],pos[1],pos[2])}else if(objJSON.type==="AmbientLight"){light=new THREE.AmbientLight(hex)}parent.add(light);light.name=objID;result.lights[objID]=light;result.objects[objID]=light}else if(objJSON.type==="PerspectiveCamera"||objJSON.type==="OrthographicCamera"){if(objJSON.type==="PerspectiveCamera"){camera=new THREE.PerspectiveCamera(objJSON.fov,objJSON.aspect,objJSON.near,objJSON.far)}else if(objJSON.type==="OrthographicCamera"){camera=new THREE.OrthographicCamera(objJSON.left,objJSON.right,objJSON.top,objJSON.bottom,objJSON.near,objJSON.far)}pos=objJSON.position;camera.position.set(pos[0],pos[1],pos[2]);parent.add(camera);camera.name=objID;result.cameras[objID]=camera;result.objects[objID]=camera}else{pos=objJSON.position;rot=objJSON.rotation;scl=objJSON.scale;quat=objJSON.quaternion;object=new THREE.Object3D;object.name=objID;object.position.set(pos[0],pos[1],pos[2]);if(quat){object.quaternion.set(quat[0],quat[1],quat[2],quat[3]);object.useQuaternion=true}else{object.rotation.set(rot[0],rot[1],rot[2])}object.scale.set(scl[0],scl[1],scl[2]);object.visible=objJSON.visible!==undefined?objJSON.visible:false;parent.add(object);result.objects[objID]=object;result.empties[objID]=object}if(object){if(objJSON.properties!==undefined){for(var key in objJSON.properties){var value=objJSON.properties[key];object.properties[key]=value}}if(objJSON.groups!==undefined){for(var i=0;i<objJSON.groups.length;i++){var groupID=objJSON.groups[i];if(result.groups[groupID]===undefined){result.groups[groupID]=[]}result.groups[groupID].push(objID)}}if(objJSON.children!==undefined){handle_children(object,objJSON.children)}}}}}function handle_mesh(geo,mat,id){result.geometries[id]=geo;result.face_materials[id]=mat;handle_objects()}function handle_hierarchy(node,id,parent,material,obj){var p=obj.position;var r=obj.rotation;var q=obj.quaternion;var s=obj.scale;node.position.set(p[0],p[1],p[2]);if(q){node.quaternion.set(q[0],q[1],q[2],q[3]);node.useQuaternion=true}else{node.rotation.set(r[0],r[1],r[2])}node.scale.set(s[0],s[1],s[2]);if(material){node.traverse(function(child){child.material=material})}var visible=obj.visible!==undefined?obj.visible:true;node.traverse(function(child){child.visible=visible});parent.add(node);node.name=id;result.objects[id]=node;handle_objects()}function create_callback_geometry(id){return function(geo,mat){handle_mesh(geo,mat,id);counter_models-=1;scope.onLoadComplete();async_callback_gate()}}function create_callback_hierachy(id,parent,material,obj){return function(event){var result;if(event.content){result=event.content}else if(event.dae){result=event.scene}else{result=event}handle_hierarchy(result,id,parent,material,obj);counter_models-=1;scope.onLoadComplete();async_callback_gate()}}function create_callback_embed(id){return function(geo,mat){result.geometries[id]=geo;result.face_materials[id]=mat}}function async_callback_gate(){var progress={totalModels:total_models,totalTextures:total_textures,loadedModels:total_models-counter_models,loadedTextures:total_textures-counter_textures};scope.callbackProgress(progress,result);scope.onLoadProgress();if(counter_models===0&&counter_textures===0){finalize();callbackFinished(result)}}function finalize(){for(var i=0;i<target_array.length;i++){var ta=target_array[i];var target=result.objects[ta.targetName];if(target){ta.object.target=target}else{ta.object.target=new THREE.Object3D;result.scene.add(ta.object.target)}ta.object.target.properties.targetInverse=ta.object}}var callbackTexture=function(count){counter_textures-=count;async_callback_gate();scope.onLoadComplete()};var generateTextureCallback=function(count){return function(){callbackTexture(count)}};var fogID,fogJSON;for(fogID in data.fogs){fogJSON=data.fogs[fogID];if(fogJSON.type==="linear"){fog=new THREE.Fog(0,fogJSON.near,fogJSON.far)}else if(fogJSON.type==="exp2"){fog=new THREE.FogExp2(0,fogJSON.density)}color=fogJSON.color;fog.color.setRGB(color[0],color[1],color[2]);result.fogs[fogID]=fog}var geoID,geoJSON;for(geoID in data.geometries){geoJSON=data.geometries[geoID];if(geoJSON.type in this.geometryHandlerMap){counter_models+=1;scope.onLoadStart()}}var objID,objJSON;for(objID in data.objects){objJSON=data.objects[objID];if(objJSON.type&&objJSON.type in this.hierarchyHandlerMap){counter_models+=1;scope.onLoadStart()}}total_models=counter_models;for(geoID in data.geometries){geoJSON=data.geometries[geoID];if(geoJSON.type==="cube"){geometry=new THREE.CubeGeometry(geoJSON.width,geoJSON.height,geoJSON.depth,geoJSON.widthSegments,geoJSON.heightSegments,geoJSON.depthSegments);result.geometries[geoID]=geometry}else if(geoJSON.type==="plane"){geometry=new THREE.PlaneGeometry(geoJSON.width,geoJSON.height,geoJSON.widthSegments,geoJSON.heightSegments);result.geometries[geoID]=geometry}else if(geoJSON.type==="sphere"){geometry=new THREE.SphereGeometry(geoJSON.radius,geoJSON.widthSegments,geoJSON.heightSegments);result.geometries[geoID]=geometry}else if(geoJSON.type==="cylinder"){geometry=new THREE.CylinderGeometry(geoJSON.topRad,geoJSON.botRad,geoJSON.height,geoJSON.radSegs,geoJSON.heightSegs);
result.geometries[geoID]=geometry}else if(geoJSON.type==="torus"){geometry=new THREE.TorusGeometry(geoJSON.radius,geoJSON.tube,geoJSON.segmentsR,geoJSON.segmentsT);result.geometries[geoID]=geometry}else if(geoJSON.type==="icosahedron"){geometry=new THREE.IcosahedronGeometry(geoJSON.radius,geoJSON.subdivisions);result.geometries[geoID]=geometry}else if(geoJSON.type in this.geometryHandlerMap){var loaderParameters={};for(var parType in geoJSON){if(parType!=="type"&&parType!=="url"){loaderParameters[parType]=geoJSON[parType]}}var loader=this.geometryHandlerMap[geoJSON.type]["loaderObject"];loader.load(get_url(geoJSON.url,data.urlBaseType),create_callback_geometry(geoID),loaderParameters)}else if(geoJSON.type==="embedded"){var modelJson=data.embeds[geoJSON.id],texture_path="";modelJson.metadata=data.metadata;if(modelJson){var jsonLoader=this.geometryHandlerMap["ascii"]["loaderObject"];jsonLoader.createModel(modelJson,create_callback_embed(geoID),texture_path)}}}var textureID,textureJSON;for(textureID in data.textures){textureJSON=data.textures[textureID];if(textureJSON.url instanceof Array){counter_textures+=textureJSON.url.length;for(var n=0;n<textureJSON.url.length;n++){scope.onLoadStart()}}else{counter_textures+=1;scope.onLoadStart()}}total_textures=counter_textures;for(textureID in data.textures){textureJSON=data.textures[textureID];if(textureJSON.mapping!==undefined&&THREE[textureJSON.mapping]!==undefined){textureJSON.mapping=new THREE[textureJSON.mapping]}if(textureJSON.url instanceof Array){var count=textureJSON.url.length;var url_array=[];for(var i=0;i<count;i++){url_array[i]=get_url(textureJSON.url[i],data.urlBaseType)}var isCompressed=/\.dds$/i.test(url_array[0]);if(isCompressed){texture=THREE.ImageUtils.loadCompressedTextureCube(url_array,textureJSON.mapping,generateTextureCallback(count))}else{texture=THREE.ImageUtils.loadTextureCube(url_array,textureJSON.mapping,generateTextureCallback(count))}}else{var isCompressed=/\.dds$/i.test(textureJSON.url);var fullUrl=get_url(textureJSON.url,data.urlBaseType);var textureCallback=generateTextureCallback(1);if(isCompressed){texture=THREE.ImageUtils.loadCompressedTexture(fullUrl,textureJSON.mapping,textureCallback)}else{texture=THREE.ImageUtils.loadTexture(fullUrl,textureJSON.mapping,textureCallback)}if(THREE[textureJSON.minFilter]!==undefined)texture.minFilter=THREE[textureJSON.minFilter];if(THREE[textureJSON.magFilter]!==undefined)texture.magFilter=THREE[textureJSON.magFilter];if(textureJSON.anisotropy)texture.anisotropy=textureJSON.anisotropy;if(textureJSON.repeat){texture.repeat.set(textureJSON.repeat[0],textureJSON.repeat[1]);if(textureJSON.repeat[0]!==1)texture.wrapS=THREE.RepeatWrapping;if(textureJSON.repeat[1]!==1)texture.wrapT=THREE.RepeatWrapping}if(textureJSON.offset){texture.offset.set(textureJSON.offset[0],textureJSON.offset[1])}if(textureJSON.wrap){var wrapMap={repeat:THREE.RepeatWrapping,mirror:THREE.MirroredRepeatWrapping};if(wrapMap[textureJSON.wrap[0]]!==undefined)texture.wrapS=wrapMap[textureJSON.wrap[0]];if(wrapMap[textureJSON.wrap[1]]!==undefined)texture.wrapT=wrapMap[textureJSON.wrap[1]]}}result.textures[textureID]=texture}var matID,matJSON;var parID;for(matID in data.materials){matJSON=data.materials[matID];for(parID in matJSON.parameters){if(parID==="envMap"||parID==="map"||parID==="lightMap"||parID==="bumpMap"){matJSON.parameters[parID]=result.textures[matJSON.parameters[parID]]}else if(parID==="shading"){matJSON.parameters[parID]=matJSON.parameters[parID]==="flat"?THREE.FlatShading:THREE.SmoothShading}else if(parID==="side"){if(matJSON.parameters[parID]=="double"){matJSON.parameters[parID]=THREE.DoubleSide}else if(matJSON.parameters[parID]=="back"){matJSON.parameters[parID]=THREE.BackSide}else{matJSON.parameters[parID]=THREE.FrontSide}}else if(parID==="blending"){matJSON.parameters[parID]=matJSON.parameters[parID]in THREE?THREE[matJSON.parameters[parID]]:THREE.NormalBlending}else if(parID==="combine"){matJSON.parameters[parID]=matJSON.parameters[parID]in THREE?THREE[matJSON.parameters[parID]]:THREE.MultiplyOperation}else if(parID==="vertexColors"){if(matJSON.parameters[parID]=="face"){matJSON.parameters[parID]=THREE.FaceColors}else if(matJSON.parameters[parID]){matJSON.parameters[parID]=THREE.VertexColors}}else if(parID==="wrapRGB"){var v3=matJSON.parameters[parID];matJSON.parameters[parID]=new THREE.Vector3(v3[0],v3[1],v3[2])}}if(matJSON.parameters.opacity!==undefined&&matJSON.parameters.opacity<1){matJSON.parameters.transparent=true}if(matJSON.parameters.normalMap){var shader=THREE.ShaderLib["normalmap"];var uniforms=THREE.UniformsUtils.clone(shader.uniforms);var diffuse=matJSON.parameters.color;var specular=matJSON.parameters.specular;var ambient=matJSON.parameters.ambient;var shininess=matJSON.parameters.shininess;uniforms["tNormal"].value=result.textures[matJSON.parameters.normalMap];if(matJSON.parameters.normalScale){uniforms["uNormalScale"].value.set(matJSON.parameters.normalScale[0],matJSON.parameters.normalScale[1])}if(matJSON.parameters.map){uniforms["tDiffuse"].value=matJSON.parameters.map;uniforms["enableDiffuse"].value=true}if(matJSON.parameters.envMap){uniforms["tCube"].value=matJSON.parameters.envMap;uniforms["enableReflection"].value=true;uniforms["uReflectivity"].value=matJSON.parameters.reflectivity}if(matJSON.parameters.lightMap){uniforms["tAO"].value=matJSON.parameters.lightMap;uniforms["enableAO"].value=true}if(matJSON.parameters.specularMap){uniforms["tSpecular"].value=result.textures[matJSON.parameters.specularMap];uniforms["enableSpecular"].value=true}if(matJSON.parameters.displacementMap){uniforms["tDisplacement"].value=result.textures[matJSON.parameters.displacementMap];uniforms["enableDisplacement"].value=true;uniforms["uDisplacementBias"].value=matJSON.parameters.displacementBias;uniforms["uDisplacementScale"].value=matJSON.parameters.displacementScale}uniforms["uDiffuseColor"].value.setHex(diffuse);uniforms["uSpecularColor"].value.setHex(specular);uniforms["uAmbientColor"].value.setHex(ambient);uniforms["uShininess"].value=shininess;if(matJSON.parameters.opacity){uniforms["uOpacity"].value=matJSON.parameters.opacity}var parameters={fragmentShader:shader.fragmentShader,vertexShader:shader.vertexShader,uniforms:uniforms,lights:true,fog:true};material=new THREE.ShaderMaterial(parameters)}else{material=new THREE[matJSON.type](matJSON.parameters)}result.materials[matID]=material}for(matID in data.materials){matJSON=data.materials[matID];if(matJSON.parameters.materials){var materialArray=[];for(var i=0;i<matJSON.parameters.materials.length;i++){var label=matJSON.parameters.materials[i];materialArray.push(result.materials[label])}result.materials[matID].materials=materialArray}}handle_objects();if(result.cameras&&data.defaults.camera){result.currentCamera=result.cameras[data.defaults.camera]}if(result.fogs&&data.defaults.fog){result.scene.fog=result.fogs[data.defaults.fog]}scope.callbackSync(result);async_callback_gate()};THREE.TextureLoader=function(){THREE.EventDispatcher.call(this);this.crossOrigin=null};THREE.TextureLoader.prototype={constructor:THREE.TextureLoader,load:function(url){var scope=this;var image=new Image;image.addEventListener("load",function(){var texture=new THREE.Texture(image);texture.needsUpdate=true;scope.dispatchEvent({type:"load",content:texture})},false);image.addEventListener("error",function(){scope.dispatchEvent({type:"error",message:"Couldn't load URL ["+url+"]"})},false);if(scope.crossOrigin)image.crossOrigin=scope.crossOrigin;image.src=url}};THREE.Material=function(){THREE.EventDispatcher.call(this);this.id=THREE.MaterialIdCount++;this.name="";this.side=THREE.FrontSide;this.opacity=1;this.transparent=false;this.blending=THREE.NormalBlending;this.blendSrc=THREE.SrcAlphaFactor;this.blendDst=THREE.OneMinusSrcAlphaFactor;this.blendEquation=THREE.AddEquation;this.depthTest=true;this.depthWrite=true;this.polygonOffset=false;this.polygonOffsetFactor=0;this.polygonOffsetUnits=0;this.alphaTest=0;this.overdraw=false;this.visible=true;this.needsUpdate=true};THREE.Material.prototype.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}if(key in this){var currentValue=this[key];if(currentValue instanceof THREE.Color&&newValue instanceof THREE.Color){currentValue.copy(newValue)}else if(currentValue instanceof THREE.Color){currentValue.set(newValue)}else if(currentValue instanceof THREE.Vector3&&newValue instanceof THREE.Vector3){currentValue.copy(newValue)}else{this[key]=newValue}}}};THREE.Material.prototype.clone=function(material){if(material===undefined)material=new THREE.Material;material.name=this.name;material.side=this.side;material.opacity=this.opacity;material.transparent=this.transparent;material.blending=this.blending;material.blendSrc=this.blendSrc;material.blendDst=this.blendDst;material.blendEquation=this.blendEquation;material.depthTest=this.depthTest;material.depthWrite=this.depthWrite;material.polygonOffset=this.polygonOffset;material.polygonOffsetFactor=this.polygonOffsetFactor;material.polygonOffsetUnits=this.polygonOffsetUnits;material.alphaTest=this.alphaTest;material.overdraw=this.overdraw;material.visible=this.visible;return material};THREE.Material.prototype.dispose=function(){this.dispatchEvent({type:"dispose"})};THREE.MaterialIdCount=0;THREE.LineBasicMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.linewidth=1;this.linecap="round";this.linejoin="round";this.vertexColors=false;this.fog=true;this.setValues(parameters)};THREE.LineBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineBasicMaterial.prototype.clone=function(){var material=new THREE.LineBasicMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.linewidth=this.linewidth;material.linecap=this.linecap;material.linejoin=this.linejoin;material.vertexColors=this.vertexColors;material.fog=this.fog;return material};THREE.LineDashedMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.linewidth=1;this.scale=1;this.dashSize=3;this.gapSize=1;this.vertexColors=false;this.fog=true;this.setValues(parameters)};THREE.LineDashedMaterial.prototype=Object.create(THREE.Material.prototype);THREE.LineDashedMaterial.prototype.clone=function(){var material=new THREE.LineDashedMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.linewidth=this.linewidth;material.scale=this.scale;material.dashSize=this.dashSize;material.gapSize=this.gapSize;material.vertexColors=this.vertexColors;material.fog=this.fog;return material};THREE.MeshBasicMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.lightMap=null;this.specularMap=null;this.envMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=true;this.shading=THREE.SmoothShading;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap="round";this.wireframeLinejoin="round";this.vertexColors=THREE.NoColors;this.skinning=false;this.morphTargets=false;this.setValues(parameters)};THREE.MeshBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshBasicMaterial.prototype.clone=function(){var material=new THREE.MeshBasicMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.map=this.map;material.lightMap=this.lightMap;material.specularMap=this.specularMap;material.envMap=this.envMap;material.combine=this.combine;material.reflectivity=this.reflectivity;material.refractionRatio=this.refractionRatio;material.fog=this.fog;material.shading=this.shading;material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;material.wireframeLinecap=this.wireframeLinecap;material.wireframeLinejoin=this.wireframeLinejoin;material.vertexColors=this.vertexColors;material.skinning=this.skinning;material.morphTargets=this.morphTargets;return material};THREE.MeshLambertMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.wrapAround=false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=null;this.lightMap=null;this.specularMap=null;this.envMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=true;this.shading=THREE.SmoothShading;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap="round";this.wireframeLinejoin="round";this.vertexColors=THREE.NoColors;this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters)};THREE.MeshLambertMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshLambertMaterial.prototype.clone=function(){var material=new THREE.MeshLambertMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.ambient.copy(this.ambient);material.emissive.copy(this.emissive);material.wrapAround=this.wrapAround;material.wrapRGB.copy(this.wrapRGB);material.map=this.map;material.lightMap=this.lightMap;material.specularMap=this.specularMap;material.envMap=this.envMap;material.combine=this.combine;material.reflectivity=this.reflectivity;material.refractionRatio=this.refractionRatio;material.fog=this.fog;material.shading=this.shading;material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;material.wireframeLinecap=this.wireframeLinecap;material.wireframeLinejoin=this.wireframeLinejoin;material.vertexColors=this.vertexColors;material.skinning=this.skinning;material.morphTargets=this.morphTargets;material.morphNormals=this.morphNormals;return material};THREE.MeshPhongMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.ambient=new THREE.Color(16777215);this.emissive=new THREE.Color(0);this.specular=new THREE.Color(1118481);this.shininess=30;this.metal=false;this.perPixel=true;this.wrapAround=false;this.wrapRGB=new THREE.Vector3(1,1,1);this.map=null;this.lightMap=null;this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new THREE.Vector2(1,1);this.specularMap=null;this.envMap=null;this.combine=THREE.MultiplyOperation;this.reflectivity=1;this.refractionRatio=.98;this.fog=true;this.shading=THREE.SmoothShading;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap="round";this.wireframeLinejoin="round";this.vertexColors=THREE.NoColors;this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters)};THREE.MeshPhongMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshPhongMaterial.prototype.clone=function(){var material=new THREE.MeshPhongMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.ambient.copy(this.ambient);material.emissive.copy(this.emissive);material.specular.copy(this.specular);material.shininess=this.shininess;material.metal=this.metal;material.perPixel=this.perPixel;material.wrapAround=this.wrapAround;material.wrapRGB.copy(this.wrapRGB);material.map=this.map;material.lightMap=this.lightMap;material.bumpMap=this.bumpMap;material.bumpScale=this.bumpScale;material.normalMap=this.normalMap;material.normalScale.copy(this.normalScale);material.specularMap=this.specularMap;material.envMap=this.envMap;material.combine=this.combine;material.reflectivity=this.reflectivity;material.refractionRatio=this.refractionRatio;material.fog=this.fog;material.shading=this.shading;material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;material.wireframeLinecap=this.wireframeLinecap;material.wireframeLinejoin=this.wireframeLinejoin;material.vertexColors=this.vertexColors;material.skinning=this.skinning;material.morphTargets=this.morphTargets;material.morphNormals=this.morphNormals;return material};THREE.MeshDepthMaterial=function(parameters){THREE.Material.call(this);this.wireframe=false;this.wireframeLinewidth=1;this.setValues(parameters)};THREE.MeshDepthMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshDepthMaterial.prototype.clone=function(){var material=new THREE.LineBasicMaterial;THREE.Material.prototype.clone.call(this,material);material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;return material};THREE.MeshNormalMaterial=function(parameters){THREE.Material.call(this,parameters);this.shading=THREE.FlatShading;this.wireframe=false;this.wireframeLinewidth=1;this.setValues(parameters)};THREE.MeshNormalMaterial.prototype=Object.create(THREE.Material.prototype);THREE.MeshNormalMaterial.prototype.clone=function(){var material=new THREE.MeshNormalMaterial;THREE.Material.prototype.clone.call(this,material);material.shading=this.shading;material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;return material};THREE.MeshFaceMaterial=function(materials){this.materials=materials instanceof Array?materials:[]};THREE.MeshFaceMaterial.prototype.clone=function(){return new THREE.MeshFaceMaterial(this.materials.slice(0))};THREE.ParticleBasicMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=null;this.size=1;this.sizeAttenuation=true;this.vertexColors=false;this.fog=true;this.setValues(parameters)};THREE.ParticleBasicMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ParticleBasicMaterial.prototype.clone=function(){var material=new THREE.ParticleBasicMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.map=this.map;material.size=this.size;material.sizeAttenuation=this.sizeAttenuation;material.vertexColors=this.vertexColors;material.fog=this.fog;return material};THREE.ParticleCanvasMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.program=function(context,color){};this.setValues(parameters)};THREE.ParticleCanvasMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ParticleCanvasMaterial.prototype.clone=function(){var material=new THREE.ParticleCanvasMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.program=this.program;return material};THREE.ShaderMaterial=function(parameters){THREE.Material.call(this);this.fragmentShader="void main() {}";this.vertexShader="void main() {}";this.uniforms={};this.defines={};this.attributes=null;this.shading=THREE.SmoothShading;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.vertexColors=THREE.NoColors;this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters)};THREE.ShaderMaterial.prototype=Object.create(THREE.Material.prototype);THREE.ShaderMaterial.prototype.clone=function(){var material=new THREE.ShaderMaterial;THREE.Material.prototype.clone.call(this,material);material.fragmentShader=this.fragmentShader;material.vertexShader=this.vertexShader;material.uniforms=THREE.UniformsUtils.clone(this.uniforms);material.attributes=this.attributes;material.defines=this.defines;material.shading=this.shading;material.wireframe=this.wireframe;material.wireframeLinewidth=this.wireframeLinewidth;material.fog=this.fog;material.lights=this.lights;material.vertexColors=this.vertexColors;material.skinning=this.skinning;material.morphTargets=this.morphTargets;material.morphNormals=this.morphNormals;return material};THREE.SpriteMaterial=function(parameters){THREE.Material.call(this);this.color=new THREE.Color(16777215);this.map=new THREE.Texture;this.useScreenCoordinates=true;this.depthTest=!this.useScreenCoordinates;this.sizeAttenuation=!this.useScreenCoordinates;this.scaleByViewport=!this.sizeAttenuation;this.alignment=THREE.SpriteAlignment.center.clone();this.fog=false;this.uvOffset=new THREE.Vector2(0,0);this.uvScale=new THREE.Vector2(1,1);this.setValues(parameters);parameters=parameters||{};if(parameters.depthTest===undefined)this.depthTest=!this.useScreenCoordinates;if(parameters.sizeAttenuation===undefined)this.sizeAttenuation=!this.useScreenCoordinates;if(parameters.scaleByViewport===undefined)this.scaleByViewport=!this.sizeAttenuation};THREE.SpriteMaterial.prototype=Object.create(THREE.Material.prototype);THREE.SpriteMaterial.prototype.clone=function(){var material=new THREE.SpriteMaterial;THREE.Material.prototype.clone.call(this,material);material.color.copy(this.color);material.map=this.map;material.useScreenCoordinates=this.useScreenCoordinates;material.sizeAttenuation=this.sizeAttenuation;material.scaleByViewport=this.scaleByViewport;material.alignment.copy(this.alignment);material.uvOffset.copy(this.uvOffset);material.uvScale.copy(this.uvScale);material.fog=this.fog;return material};THREE.SpriteAlignment={};THREE.SpriteAlignment.topLeft=new THREE.Vector2(1,-1);THREE.SpriteAlignment.topCenter=new THREE.Vector2(0,-1);THREE.SpriteAlignment.topRight=new THREE.Vector2(-1,-1);THREE.SpriteAlignment.centerLeft=new THREE.Vector2(1,0);THREE.SpriteAlignment.center=new THREE.Vector2(0,0);THREE.SpriteAlignment.centerRight=new THREE.Vector2(-1,0);THREE.SpriteAlignment.bottomLeft=new THREE.Vector2(1,1);THREE.SpriteAlignment.bottomCenter=new THREE.Vector2(0,1);THREE.SpriteAlignment.bottomRight=new THREE.Vector2(-1,1);THREE.Texture=function(image,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){THREE.EventDispatcher.call(this);this.id=THREE.TextureIdCount++;this.name="";this.image=image;this.mipmaps=[];this.mapping=mapping!==undefined?mapping:new THREE.UVMapping;this.wrapS=wrapS!==undefined?wrapS:THREE.ClampToEdgeWrapping;this.wrapT=wrapT!==undefined?wrapT:THREE.ClampToEdgeWrapping;this.magFilter=magFilter!==undefined?magFilter:THREE.LinearFilter;this.minFilter=minFilter!==undefined?minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=anisotropy!==undefined?anisotropy:1;this.format=format!==undefined?format:THREE.RGBAFormat;this.type=type!==undefined?type:THREE.UnsignedByteType;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.generateMipmaps=true;this.premultiplyAlpha=false;this.flipY=true;this.unpackAlignment=4;this.needsUpdate=false;this.onUpdate=null};THREE.Texture.prototype={constructor:THREE.Texture,clone:function(texture){if(texture===undefined)texture=new THREE.Texture;texture.image=this.image;texture.mipmaps=this.mipmaps.slice(0);texture.mapping=this.mapping;texture.wrapS=this.wrapS;texture.wrapT=this.wrapT;texture.magFilter=this.magFilter;texture.minFilter=this.minFilter;texture.anisotropy=this.anisotropy;texture.format=this.format;texture.type=this.type;texture.offset.copy(this.offset);texture.repeat.copy(this.repeat);texture.generateMipmaps=this.generateMipmaps;texture.premultiplyAlpha=this.premultiplyAlpha;texture.flipY=this.flipY;texture.unpackAlignment=this.unpackAlignment;return texture},dispose:function(){this.dispatchEvent({type:"dispose"})}};THREE.TextureIdCount=0;THREE.CompressedTexture=function(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.image={width:width,height:height};this.mipmaps=mipmaps;this.generateMipmaps=false};THREE.CompressedTexture.prototype=Object.create(THREE.Texture.prototype);THREE.CompressedTexture.prototype.clone=function(){var texture=new THREE.CompressedTexture;THREE.Texture.prototype.clone.call(this,texture);return texture};THREE.DataTexture=function(data,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy){THREE.Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.image={data:data,width:width,height:height}};THREE.DataTexture.prototype=Object.create(THREE.Texture.prototype);THREE.DataTexture.prototype.clone=function(){var texture=new THREE.DataTexture;THREE.Texture.prototype.clone.call(this,texture);return texture};THREE.Particle=function(material){THREE.Object3D.call(this);this.material=material};THREE.Particle.prototype=Object.create(THREE.Object3D.prototype);THREE.Particle.prototype.clone=function(object){if(object===undefined)object=new THREE.Particle(this.material);THREE.Object3D.prototype.clone.call(this,object);return object};THREE.ParticleSystem=function(geometry,material){THREE.Object3D.call(this);this.geometry=geometry;this.material=material!==undefined?material:new THREE.ParticleBasicMaterial({color:Math.random()*16777215});this.sortParticles=false;if(this.geometry){if(this.geometry.boundingSphere===null){this.geometry.computeBoundingSphere()}}this.frustumCulled=false};THREE.ParticleSystem.prototype=Object.create(THREE.Object3D.prototype);THREE.ParticleSystem.prototype.clone=function(object){if(object===undefined)object=new THREE.ParticleSystem(this.geometry,this.material);object.sortParticles=this.sortParticles;THREE.Object3D.prototype.clone.call(this,object);return object};THREE.Line=function(geometry,material,type){THREE.Object3D.call(this);this.geometry=geometry;this.material=material!==undefined?material:new THREE.LineBasicMaterial({color:Math.random()*16777215});this.type=type!==undefined?type:THREE.LineStrip;if(this.geometry){if(!this.geometry.boundingSphere){this.geometry.computeBoundingSphere()}}};THREE.LineStrip=0;THREE.LinePieces=1;THREE.Line.prototype=Object.create(THREE.Object3D.prototype);THREE.Line.prototype.clone=function(object){if(object===undefined)object=new THREE.Line(this.geometry,this.material,this.type);THREE.Object3D.prototype.clone.call(this,object);return object};THREE.Mesh=function(geometry,material){THREE.Object3D.call(this);this.geometry=geometry;this.material=material!==undefined?material:new THREE.MeshBasicMaterial({color:Math.random()*16777215,wireframe:true});if(this.geometry!==undefined){if(this.geometry.boundingSphere===null){this.geometry.computeBoundingSphere()}this.updateMorphTargets()}};THREE.Mesh.prototype=Object.create(THREE.Object3D.prototype);THREE.Mesh.prototype.updateMorphTargets=function(){if(this.geometry.morphTargets.length>0){this.morphTargetBase=-1;this.morphTargetForcedOrder=[];this.morphTargetInfluences=[];this.morphTargetDictionary={};for(var m=0,ml=this.geometry.morphTargets.length;m<ml;m++){this.morphTargetInfluences.push(0);this.morphTargetDictionary[this.geometry.morphTargets[m].name]=m}}};THREE.Mesh.prototype.getMorphTargetIndexByName=function(name){if(this.morphTargetDictionary[name]!==undefined){return this.morphTargetDictionary[name]}console.log("THREE.Mesh.getMorphTargetIndexByName: morph target "+name+" does not exist. Returning 0.");return 0};THREE.Mesh.prototype.clone=function(object){if(object===undefined)object=new THREE.Mesh(this.geometry,this.material);THREE.Object3D.prototype.clone.call(this,object);return object};THREE.Bone=function(belongsToSkin){THREE.Object3D.call(this);this.skin=belongsToSkin;this.skinMatrix=new THREE.Matrix4};THREE.Bone.prototype=Object.create(THREE.Object3D.prototype);THREE.Bone.prototype.update=function(parentSkinMatrix,forceUpdate){if(this.matrixAutoUpdate){forceUpdate|=this.updateMatrix()}if(forceUpdate||this.matrixWorldNeedsUpdate){if(parentSkinMatrix){this.skinMatrix.multiplyMatrices(parentSkinMatrix,this.matrix)}else{this.skinMatrix.copy(this.matrix)}this.matrixWorldNeedsUpdate=false;forceUpdate=true}var child,i,l=this.children.length;for(i=0;i<l;i++){this.children[i].update(this.skinMatrix,forceUpdate)}};THREE.SkinnedMesh=function(geometry,material,useVertexTexture){THREE.Mesh.call(this,geometry,material);this.useVertexTexture=useVertexTexture!==undefined?useVertexTexture:true;this.identityMatrix=new THREE.Matrix4;this.bones=[];this.boneMatrices=[];var b,bone,gbone,p,q,s;if(this.geometry&&this.geometry.bones!==undefined){for(b=0;b<this.geometry.bones.length;b++){gbone=this.geometry.bones[b];p=gbone.pos;q=gbone.rotq;s=gbone.scl;bone=this.addBone();bone.name=gbone.name;bone.position.set(p[0],p[1],p[2]);bone.quaternion.set(q[0],q[1],q[2],q[3]);bone.useQuaternion=true;if(s!==undefined){bone.scale.set(s[0],s[1],s[2])}else{bone.scale.set(1,1,1)}}for(b=0;b<this.bones.length;b++){gbone=this.geometry.bones[b];bone=this.bones[b];if(gbone.parent===-1){this.add(bone)}else{this.bones[gbone.parent].add(bone)}}var nBones=this.bones.length;if(this.useVertexTexture){var size;if(nBones>256)size=64;else if(nBones>64)size=32;else if(nBones>16)size=16;else size=8;this.boneTextureWidth=size;this.boneTextureHeight=size;this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4);this.boneTexture=new THREE.DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,THREE.RGBAFormat,THREE.FloatType);this.boneTexture.minFilter=THREE.NearestFilter;this.boneTexture.magFilter=THREE.NearestFilter;this.boneTexture.generateMipmaps=false;this.boneTexture.flipY=false}else{this.boneMatrices=new Float32Array(16*nBones)}this.pose()}};THREE.SkinnedMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.SkinnedMesh.prototype.addBone=function(bone){if(bone===undefined){bone=new THREE.Bone(this)}this.bones.push(bone);return bone};THREE.SkinnedMesh.prototype.updateMatrixWorld=function(force){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||force){if(this.parent){this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix)}else{this.matrixWorld.copy(this.matrix)}this.matrixWorldNeedsUpdate=false;force=true}for(var i=0,l=this.children.length;i<l;i++){var child=this.children[i];if(child instanceof THREE.Bone){child.update(this.identityMatrix,false)}else{child.updateMatrixWorld(true)}}if(this.boneInverses==undefined){this.boneInverses=[];for(var b=0,bl=this.bones.length;b<bl;b++){var inverse=new THREE.Matrix4;inverse.getInverse(this.bones[b].skinMatrix);this.boneInverses.push(inverse)}}for(var b=0,bl=this.bones.length;b<bl;b++){THREE.SkinnedMesh.offsetMatrix.multiplyMatrices(this.bones[b].skinMatrix,this.boneInverses[b]);THREE.SkinnedMesh.offsetMatrix.flattenToArrayOffset(this.boneMatrices,b*16)}if(this.useVertexTexture){this.boneTexture.needsUpdate=true}};THREE.SkinnedMesh.prototype.pose=function(){this.updateMatrixWorld(true);for(var i=0;i<this.geometry.skinIndices.length;i++){var sw=this.geometry.skinWeights[i];var scale=1/sw.lengthManhattan();if(scale!==Infinity){sw.multiplyScalar(scale)}else{sw.set(1)}}};THREE.SkinnedMesh.prototype.clone=function(object){if(object===undefined)object=new THREE.SkinnedMesh(this.geometry,this.material,this.useVertexTexture);THREE.Mesh.prototype.clone.call(this,object);return object};THREE.SkinnedMesh.offsetMatrix=new THREE.Matrix4;THREE.MorphAnimMesh=function(geometry,material){THREE.Mesh.call(this,geometry,material);this.duration=1e3;this.mirroredLoop=false;this.time=0;this.lastKeyframe=0;this.currentKeyframe=0;this.direction=1;this.directionBackwards=false;this.setFrameRange(0,this.geometry.morphTargets.length-1)};THREE.MorphAnimMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.MorphAnimMesh.prototype.setFrameRange=function(start,end){this.startKeyframe=start;this.endKeyframe=end;this.length=this.endKeyframe-this.startKeyframe+1};THREE.MorphAnimMesh.prototype.setDirectionForward=function(){this.direction=1;this.directionBackwards=false};THREE.MorphAnimMesh.prototype.setDirectionBackward=function(){this.direction=-1;this.directionBackwards=true};THREE.MorphAnimMesh.prototype.parseAnimations=function(){var geometry=this.geometry;if(!geometry.animations)geometry.animations={};var firstAnimation,animations=geometry.animations;var pattern=/([a-z]+)(\d+)/;for(var i=0,il=geometry.morphTargets.length;i<il;i++){var morph=geometry.morphTargets[i];var parts=morph.name.match(pattern);if(parts&&parts.length>1){var label=parts[1];var num=parts[2];if(!animations[label])animations[label]={start:Infinity,end:-Infinity};var animation=animations[label];if(i<animation.start)animation.start=i;if(i>animation.end)animation.end=i;if(!firstAnimation)firstAnimation=label;
}}geometry.firstAnimation=firstAnimation};THREE.MorphAnimMesh.prototype.setAnimationLabel=function(label,start,end){if(!this.geometry.animations)this.geometry.animations={};this.geometry.animations[label]={start:start,end:end}};THREE.MorphAnimMesh.prototype.playAnimation=function(label,fps){var animation=this.geometry.animations[label];if(animation){this.setFrameRange(animation.start,animation.end);this.duration=1e3*((animation.end-animation.start)/fps);this.time=0}else{console.warn("animation["+label+"] undefined")}};THREE.MorphAnimMesh.prototype.updateAnimation=function(delta){var frameTime=this.duration/this.length;this.time+=this.direction*delta;if(this.mirroredLoop){if(this.time>this.duration||this.time<0){this.direction*=-1;if(this.time>this.duration){this.time=this.duration;this.directionBackwards=true}if(this.time<0){this.time=0;this.directionBackwards=false}}}else{this.time=this.time%this.duration;if(this.time<0)this.time+=this.duration}var keyframe=this.startKeyframe+THREE.Math.clamp(Math.floor(this.time/frameTime),0,this.length-1);if(keyframe!==this.currentKeyframe){this.morphTargetInfluences[this.lastKeyframe]=0;this.morphTargetInfluences[this.currentKeyframe]=1;this.morphTargetInfluences[keyframe]=0;this.lastKeyframe=this.currentKeyframe;this.currentKeyframe=keyframe}var mix=this.time%frameTime/frameTime;if(this.directionBackwards){mix=1-mix}this.morphTargetInfluences[this.currentKeyframe]=mix;this.morphTargetInfluences[this.lastKeyframe]=1-mix};THREE.MorphAnimMesh.prototype.clone=function(object){if(object===undefined)object=new THREE.MorphAnimMesh(this.geometry,this.material);object.duration=this.duration;object.mirroredLoop=this.mirroredLoop;object.time=this.time;object.lastKeyframe=this.lastKeyframe;object.currentKeyframe=this.currentKeyframe;object.direction=this.direction;object.directionBackwards=this.directionBackwards;THREE.Mesh.prototype.clone.call(this,object);return object};THREE.Ribbon=function(geometry,material){THREE.Object3D.call(this);this.geometry=geometry;this.material=material};THREE.Ribbon.prototype=Object.create(THREE.Object3D.prototype);THREE.Ribbon.prototype.clone=function(object){if(object===undefined)object=new THREE.Ribbon(this.geometry,this.material);THREE.Object3D.prototype.clone.call(this,object);return object};THREE.LOD=function(){THREE.Object3D.call(this);this.LODs=[]};THREE.LOD.prototype=Object.create(THREE.Object3D.prototype);THREE.LOD.prototype.addLevel=function(object3D,visibleAtDistance){if(visibleAtDistance===undefined){visibleAtDistance=0}visibleAtDistance=Math.abs(visibleAtDistance);for(var l=0;l<this.LODs.length;l++){if(visibleAtDistance<this.LODs[l].visibleAtDistance){break}}this.LODs.splice(l,0,{visibleAtDistance:visibleAtDistance,object3D:object3D});this.add(object3D)};THREE.LOD.prototype.update=function(camera){if(this.LODs.length>1){camera.matrixWorldInverse.getInverse(camera.matrixWorld);var inverse=camera.matrixWorldInverse;var distance=-(inverse.elements[2]*this.matrixWorld.elements[12]+inverse.elements[6]*this.matrixWorld.elements[13]+inverse.elements[10]*this.matrixWorld.elements[14]+inverse.elements[14]);this.LODs[0].object3D.visible=true;for(var l=1;l<this.LODs.length;l++){if(distance>=this.LODs[l].visibleAtDistance){this.LODs[l-1].object3D.visible=false;this.LODs[l].object3D.visible=true}else{break}}for(;l<this.LODs.length;l++){this.LODs[l].object3D.visible=false}}};THREE.LOD.prototype.clone=function(){};THREE.Sprite=function(material){THREE.Object3D.call(this);this.material=material!==undefined?material:new THREE.SpriteMaterial;this.rotation3d=this.rotation;this.rotation=0};THREE.Sprite.prototype=Object.create(THREE.Object3D.prototype);THREE.Sprite.prototype.updateMatrix=function(){this.matrix.setPosition(this.position);this.rotation3d.set(0,0,this.rotation);this.matrix.setRotationFromEuler(this.rotation3d);if(this.scale.x!==1||this.scale.y!==1){this.matrix.scale(this.scale)}this.matrixWorldNeedsUpdate=true};THREE.Sprite.prototype.clone=function(object){if(object===undefined)object=new THREE.Sprite(this.material);THREE.Object3D.prototype.clone.call(this,object);return object};THREE.Scene=function(){THREE.Object3D.call(this);this.fog=null;this.overrideMaterial=null;this.matrixAutoUpdate=false;this.__objects=[];this.__lights=[];this.__objectsAdded=[];this.__objectsRemoved=[]};THREE.Scene.prototype=Object.create(THREE.Object3D.prototype);THREE.Scene.prototype.__addObject=function(object){if(object instanceof THREE.Light){if(this.__lights.indexOf(object)===-1){this.__lights.push(object)}if(object.target&&object.target.parent===undefined){this.add(object.target)}}else if(!(object instanceof THREE.Camera||object instanceof THREE.Bone)){if(this.__objects.indexOf(object)===-1){this.__objects.push(object);this.__objectsAdded.push(object);var i=this.__objectsRemoved.indexOf(object);if(i!==-1){this.__objectsRemoved.splice(i,1)}}}for(var c=0;c<object.children.length;c++){this.__addObject(object.children[c])}};THREE.Scene.prototype.__removeObject=function(object){if(object instanceof THREE.Light){var i=this.__lights.indexOf(object);if(i!==-1){this.__lights.splice(i,1)}}else if(!(object instanceof THREE.Camera)){var i=this.__objects.indexOf(object);if(i!==-1){this.__objects.splice(i,1);this.__objectsRemoved.push(object);var ai=this.__objectsAdded.indexOf(object);if(ai!==-1){this.__objectsAdded.splice(ai,1)}}}for(var c=0;c<object.children.length;c++){this.__removeObject(object.children[c])}};THREE.Fog=function(hex,near,far){this.name="";this.color=new THREE.Color(hex);this.near=near!==undefined?near:1;this.far=far!==undefined?far:1e3};THREE.Fog.prototype.clone=function(){return new THREE.Fog(this.color.getHex(),this.near,this.far)};THREE.FogExp2=function(hex,density){this.name="";this.color=new THREE.Color(hex);this.density=density!==undefined?density:25e-5};THREE.FogExp2.prototype.clone=function(){return new THREE.FogExp2(this.color.getHex(),this.density)};THREE.CanvasRenderer=function(parameters){console.log("THREE.CanvasRenderer",THREE.REVISION);var smoothstep=THREE.Math.smoothstep;parameters=parameters||{};var _this=this,_renderData,_elements,_lights,_projector=new THREE.Projector,_canvas=parameters.canvas!==undefined?parameters.canvas:document.createElement("canvas"),_canvasWidth,_canvasHeight,_canvasWidthHalf,_canvasHeightHalf,_context=_canvas.getContext("2d"),_clearColor=new THREE.Color(0),_clearOpacity=0,_contextGlobalAlpha=1,_contextGlobalCompositeOperation=0,_contextStrokeStyle=null,_contextFillStyle=null,_contextLineWidth=null,_contextLineCap=null,_contextLineJoin=null,_contextDashSize=null,_contextGapSize=0,_v1,_v2,_v3,_v4,_v5=new THREE.RenderableVertex,_v6=new THREE.RenderableVertex,_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_v4x,_v4y,_v5x,_v5y,_v6x,_v6y,_color=new THREE.Color,_color1=new THREE.Color,_color2=new THREE.Color,_color3=new THREE.Color,_color4=new THREE.Color,_diffuseColor=new THREE.Color,_emissiveColor=new THREE.Color,_lightColor=new THREE.Color,_patterns={},_imagedatas={},_near,_far,_image,_uvs,_uv1x,_uv1y,_uv2x,_uv2y,_uv3x,_uv3y,_clipBox=new THREE.Box2,_clearBox=new THREE.Box2,_elemBox=new THREE.Box2,_enableLighting=false,_ambientLight=new THREE.Color,_directionalLights=new THREE.Color,_pointLights=new THREE.Color,_vector3=new THREE.Vector3,_pixelMap,_pixelMapContext,_pixelMapImage,_pixelMapData,_gradientMap,_gradientMapContext,_gradientMapQuality=16;_pixelMap=document.createElement("canvas");_pixelMap.width=_pixelMap.height=2;_pixelMapContext=_pixelMap.getContext("2d");_pixelMapContext.fillStyle="rgba(0,0,0,1)";_pixelMapContext.fillRect(0,0,2,2);_pixelMapImage=_pixelMapContext.getImageData(0,0,2,2);_pixelMapData=_pixelMapImage.data;_gradientMap=document.createElement("canvas");_gradientMap.width=_gradientMap.height=_gradientMapQuality;_gradientMapContext=_gradientMap.getContext("2d");_gradientMapContext.translate(-_gradientMapQuality/2,-_gradientMapQuality/2);_gradientMapContext.scale(_gradientMapQuality,_gradientMapQuality);_gradientMapQuality--;if(_context.setLineDash===undefined){if(_context.mozDash!==undefined){_context.setLineDash=function(values){_context.mozDash=values[0]!==null?values:null}}else{_context.setLineDash=function(){}}}this.domElement=_canvas;this.devicePixelRatio=parameters.devicePixelRatio!==undefined?parameters.devicePixelRatio:window.devicePixelRatio!==undefined?window.devicePixelRatio:1;this.autoClear=true;this.sortObjects=true;this.sortElements=true;this.info={render:{vertices:0,faces:0}};this.supportsVertexTextures=function(){};this.setFaceCulling=function(){};this.setSize=function(width,height){_canvasWidth=width*this.devicePixelRatio;_canvasHeight=height*this.devicePixelRatio;_canvasWidthHalf=Math.floor(_canvasWidth/2);_canvasHeightHalf=Math.floor(_canvasHeight/2);_canvas.width=_canvasWidth;_canvas.height=_canvasHeight;_canvas.style.width=width+"px";_canvas.style.height=height+"px";_clipBox.set(new THREE.Vector2(-_canvasWidthHalf,-_canvasHeightHalf),new THREE.Vector2(_canvasWidthHalf,_canvasHeightHalf));_clearBox.set(new THREE.Vector2(-_canvasWidthHalf,-_canvasHeightHalf),new THREE.Vector2(_canvasWidthHalf,_canvasHeightHalf));_contextGlobalAlpha=1;_contextGlobalCompositeOperation=0;_contextStrokeStyle=null;_contextFillStyle=null;_contextLineWidth=null;_contextLineCap=null;_contextLineJoin=null};this.setClearColor=function(color,opacity){_clearColor.copy(color);_clearOpacity=opacity!==undefined?opacity:1;_clearBox.set(new THREE.Vector2(-_canvasWidthHalf,-_canvasHeightHalf),new THREE.Vector2(_canvasWidthHalf,_canvasHeightHalf))};this.setClearColorHex=function(hex,opacity){_clearColor.setHex(hex);_clearOpacity=opacity!==undefined?opacity:1;_clearBox.set(new THREE.Vector2(-_canvasWidthHalf,-_canvasHeightHalf),new THREE.Vector2(_canvasWidthHalf,_canvasHeightHalf))};this.getMaxAnisotropy=function(){return 0};this.clear=function(){_context.setTransform(1,0,0,-1,_canvasWidthHalf,_canvasHeightHalf);if(_clearBox.empty()===false){_clearBox.intersect(_clipBox);_clearBox.expandByScalar(2);if(_clearOpacity<1){_context.clearRect(_clearBox.min.x|0,_clearBox.min.y|0,_clearBox.max.x-_clearBox.min.x|0,_clearBox.max.y-_clearBox.min.y|0)}if(_clearOpacity>0){setBlending(THREE.NormalBlending);setOpacity(1);setFillStyle("rgba("+Math.floor(_clearColor.r*255)+","+Math.floor(_clearColor.g*255)+","+Math.floor(_clearColor.b*255)+","+_clearOpacity+")");_context.fillRect(_clearBox.min.x|0,_clearBox.min.y|0,_clearBox.max.x-_clearBox.min.x|0,_clearBox.max.y-_clearBox.min.y|0)}_clearBox.makeEmpty()}};this.render=function(scene,camera){if(camera instanceof THREE.Camera===false){console.error("THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.");return}if(this.autoClear===true){this.clear()}_context.setTransform(1,0,0,-1,_canvasWidthHalf,_canvasHeightHalf);_this.info.render.vertices=0;_this.info.render.faces=0;_renderData=_projector.projectScene(scene,camera,this.sortObjects,this.sortElements);_elements=_renderData.elements;_lights=_renderData.lights;_enableLighting=_lights.length>0;if(_enableLighting===true){calculateLights()}for(var e=0,el=_elements.length;e<el;e++){var element=_elements[e];var material=element.material;if(material===undefined||material.visible===false)continue;_elemBox.makeEmpty();if(element instanceof THREE.RenderableParticle){_v1=element;_v1.x*=_canvasWidthHalf;_v1.y*=_canvasHeightHalf;renderParticle(_v1,element,material)}else if(element instanceof THREE.RenderableLine){_v1=element.v1;_v2=element.v2;_v1.positionScreen.x*=_canvasWidthHalf;_v1.positionScreen.y*=_canvasHeightHalf;_v2.positionScreen.x*=_canvasWidthHalf;_v2.positionScreen.y*=_canvasHeightHalf;_elemBox.setFromPoints([_v1.positionScreen,_v2.positionScreen]);if(_clipBox.isIntersectionBox(_elemBox)===true){renderLine(_v1,_v2,element,material)}}else if(element instanceof THREE.RenderableFace3){_v1=element.v1;_v2=element.v2;_v3=element.v3;if(_v1.positionScreen.z<-1||_v1.positionScreen.z>1)continue;if(_v2.positionScreen.z<-1||_v2.positionScreen.z>1)continue;if(_v3.positionScreen.z<-1||_v3.positionScreen.z>1)continue;_v1.positionScreen.x*=_canvasWidthHalf;_v1.positionScreen.y*=_canvasHeightHalf;_v2.positionScreen.x*=_canvasWidthHalf;_v2.positionScreen.y*=_canvasHeightHalf;_v3.positionScreen.x*=_canvasWidthHalf;_v3.positionScreen.y*=_canvasHeightHalf;if(material.overdraw===true){expand(_v1.positionScreen,_v2.positionScreen);expand(_v2.positionScreen,_v3.positionScreen);expand(_v3.positionScreen,_v1.positionScreen)}_elemBox.setFromPoints([_v1.positionScreen,_v2.positionScreen,_v3.positionScreen]);renderFace3(_v1,_v2,_v3,0,1,2,element,material)}else if(element instanceof THREE.RenderableFace4){_v1=element.v1;_v2=element.v2;_v3=element.v3;_v4=element.v4;if(_v1.positionScreen.z<-1||_v1.positionScreen.z>1)continue;if(_v2.positionScreen.z<-1||_v2.positionScreen.z>1)continue;if(_v3.positionScreen.z<-1||_v3.positionScreen.z>1)continue;if(_v4.positionScreen.z<-1||_v4.positionScreen.z>1)continue;_v1.positionScreen.x*=_canvasWidthHalf;_v1.positionScreen.y*=_canvasHeightHalf;_v2.positionScreen.x*=_canvasWidthHalf;_v2.positionScreen.y*=_canvasHeightHalf;_v3.positionScreen.x*=_canvasWidthHalf;_v3.positionScreen.y*=_canvasHeightHalf;_v4.positionScreen.x*=_canvasWidthHalf;_v4.positionScreen.y*=_canvasHeightHalf;_v5.positionScreen.copy(_v2.positionScreen);_v6.positionScreen.copy(_v4.positionScreen);if(material.overdraw===true){expand(_v1.positionScreen,_v2.positionScreen);expand(_v2.positionScreen,_v4.positionScreen);expand(_v4.positionScreen,_v1.positionScreen);expand(_v3.positionScreen,_v5.positionScreen);expand(_v3.positionScreen,_v6.positionScreen)}_elemBox.setFromPoints([_v1.positionScreen,_v2.positionScreen,_v3.positionScreen,_v4.positionScreen]);renderFace4(_v1,_v2,_v3,_v4,_v5,_v6,element,material,scene)}_clearBox.union(_elemBox)}_context.setTransform(1,0,0,1,0,0);function calculateLights(){_ambientLight.setRGB(0,0,0);_directionalLights.setRGB(0,0,0);_pointLights.setRGB(0,0,0);for(var l=0,ll=_lights.length;l<ll;l++){var light=_lights[l];var lightColor=light.color;if(light instanceof THREE.AmbientLight){_ambientLight.add(lightColor)}else if(light instanceof THREE.DirectionalLight){_directionalLights.add(lightColor)}else if(light instanceof THREE.PointLight){_pointLights.add(lightColor)}}}function calculateLight(position,normal,color){for(var l=0,ll=_lights.length;l<ll;l++){var light=_lights[l];_lightColor.copy(light.color);if(light instanceof THREE.DirectionalLight){var lightPosition=_vector3.getPositionFromMatrix(light.matrixWorld).normalize();var amount=normal.dot(lightPosition);if(amount<=0)continue;amount*=light.intensity;color.add(_lightColor.multiplyScalar(amount))}else if(light instanceof THREE.PointLight){var lightPosition=_vector3.getPositionFromMatrix(light.matrixWorld);var amount=normal.dot(_vector3.subVectors(lightPosition,position).normalize());if(amount<=0)continue;amount*=light.distance==0?1:1-Math.min(position.distanceTo(lightPosition)/light.distance,1);if(amount==0)continue;amount*=light.intensity;color.add(_lightColor.multiplyScalar(amount))}}}function renderParticle(v1,element,material){setOpacity(material.opacity);setBlending(material.blending);var width,height,scaleX,scaleY,bitmap,bitmapWidth,bitmapHeight;if(material instanceof THREE.ParticleBasicMaterial){if(material.map===null){scaleX=element.object.scale.x;scaleY=element.object.scale.y;scaleX*=element.scale.x*_canvasWidthHalf;scaleY*=element.scale.y*_canvasHeightHalf;_elemBox.min.set(v1.x-scaleX,v1.y-scaleY);_elemBox.max.set(v1.x+scaleX,v1.y+scaleY);if(_clipBox.isIntersectionBox(_elemBox)===false){return}setFillStyle(material.color.getStyle());_context.save();_context.translate(v1.x,v1.y);_context.rotate(-element.rotation);_context.scale(scaleX,scaleY);_context.fillRect(-1,-1,2,2);_context.restore()}else{bitmap=material.map.image;bitmapWidth=bitmap.width>>1;bitmapHeight=bitmap.height>>1;scaleX=element.scale.x*_canvasWidthHalf;scaleY=element.scale.y*_canvasHeightHalf;width=scaleX*bitmapWidth;height=scaleY*bitmapHeight;_elemBox.min.set(v1.x-width,v1.y-height);_elemBox.max.set(v1.x+width,v1.y+height);if(_clipBox.isIntersectionBox(_elemBox)===false){return}_context.save();_context.translate(v1.x,v1.y);_context.rotate(-element.rotation);_context.scale(scaleX,-scaleY);_context.translate(-bitmapWidth,-bitmapHeight);_context.drawImage(bitmap,0,0);_context.restore()}}else if(material instanceof THREE.ParticleCanvasMaterial){width=element.scale.x*_canvasWidthHalf;height=element.scale.y*_canvasHeightHalf;_elemBox.min.set(v1.x-width,v1.y-height);_elemBox.max.set(v1.x+width,v1.y+height);if(_clipBox.isIntersectionBox(_elemBox)===false){return}setStrokeStyle(material.color.getStyle());setFillStyle(material.color.getStyle());_context.save();_context.translate(v1.x,v1.y);_context.rotate(-element.rotation);_context.scale(width,height);material.program(_context);_context.restore()}}function renderLine(v1,v2,element,material){setOpacity(material.opacity);setBlending(material.blending);_context.beginPath();_context.moveTo(v1.positionScreen.x,v1.positionScreen.y);_context.lineTo(v2.positionScreen.x,v2.positionScreen.y);if(material instanceof THREE.LineBasicMaterial){setLineWidth(material.linewidth);setLineCap(material.linecap);setLineJoin(material.linejoin);setStrokeStyle(material.color.getStyle());setDashAndGap(null,null);_context.stroke();_elemBox.expandByScalar(material.linewidth*2)}else if(material instanceof THREE.LineDashedMaterial){setLineWidth(material.linewidth);setLineCap(material.linecap);setLineJoin(material.linejoin);setStrokeStyle(material.color.getStyle());setDashAndGap(material.dashSize,material.gapSize);_context.stroke();_elemBox.expandByScalar(material.linewidth*2)}}function renderFace3(v1,v2,v3,uv1,uv2,uv3,element,material){_this.info.render.vertices+=3;_this.info.render.faces++;setOpacity(material.opacity);setBlending(material.blending);_v1x=v1.positionScreen.x;_v1y=v1.positionScreen.y;_v2x=v2.positionScreen.x;_v2y=v2.positionScreen.y;_v3x=v3.positionScreen.x;_v3y=v3.positionScreen.y;drawTriangle(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y);if((material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial)&&material.map===null){_diffuseColor.copy(material.color);_emissiveColor.copy(material.emissive);if(material.vertexColors===THREE.FaceColors){_diffuseColor.multiply(element.color)}if(_enableLighting===true){if(material.wireframe===false&&material.shading==THREE.SmoothShading&&element.vertexNormalsLength==3){_color1.copy(_ambientLight);_color2.copy(_ambientLight);_color3.copy(_ambientLight);calculateLight(element.v1.positionWorld,element.vertexNormalsModel[0],_color1);calculateLight(element.v2.positionWorld,element.vertexNormalsModel[1],_color2);calculateLight(element.v3.positionWorld,element.vertexNormalsModel[2],_color3);_color1.multiply(_diffuseColor).add(_emissiveColor);_color2.multiply(_diffuseColor).add(_emissiveColor);_color3.multiply(_diffuseColor).add(_emissiveColor);_color4.addColors(_color2,_color3).multiplyScalar(.5);_image=getGradientTexture(_color1,_color2,_color3,_color4);clipImage(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,0,0,1,0,0,1,_image)}else{_color.copy(_ambientLight);calculateLight(element.centroidModel,element.normalModel,_color);_color.multiply(_diffuseColor).add(_emissiveColor);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}}else{material.wireframe===true?strokePath(material.color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(material.color)}}else if(material instanceof THREE.MeshBasicMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial){if(material.map!==null){if(material.map.mapping instanceof THREE.UVMapping){_uvs=element.uvs[0];patternPath(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_uvs[uv1].x,_uvs[uv1].y,_uvs[uv2].x,_uvs[uv2].y,_uvs[uv3].x,_uvs[uv3].y,material.map)}}else if(material.envMap!==null){if(material.envMap.mapping instanceof THREE.SphericalReflectionMapping){_vector3.copy(element.vertexNormalsModelView[uv1]);_uv1x=.5*_vector3.x+.5;_uv1y=.5*_vector3.y+.5;_vector3.copy(element.vertexNormalsModelView[uv2]);_uv2x=.5*_vector3.x+.5;_uv2y=.5*_vector3.y+.5;_vector3.copy(element.vertexNormalsModelView[uv3]);_uv3x=.5*_vector3.x+.5;_uv3y=.5*_vector3.y+.5;patternPath(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_uv1x,_uv1y,_uv2x,_uv2y,_uv3x,_uv3y,material.envMap)}}else{_color.copy(material.color);if(material.vertexColors===THREE.FaceColors){_color.multiply(element.color)}material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}}else if(material instanceof THREE.MeshDepthMaterial){_near=camera.near;_far=camera.far;_color1.r=_color1.g=_color1.b=1-smoothstep(v1.positionScreen.z*v1.positionScreen.w,_near,_far);_color2.r=_color2.g=_color2.b=1-smoothstep(v2.positionScreen.z*v2.positionScreen.w,_near,_far);_color3.r=_color3.g=_color3.b=1-smoothstep(v3.positionScreen.z*v3.positionScreen.w,_near,_far);_color4.addColors(_color2,_color3).multiplyScalar(.5);_image=getGradientTexture(_color1,_color2,_color3,_color4);clipImage(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,0,0,1,0,0,1,_image)}else if(material instanceof THREE.MeshNormalMaterial){var normal;if(material.shading==THREE.FlatShading){normal=element.normalModelView;_color.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}else if(material.shading==THREE.SmoothShading){normal=element.vertexNormalsModelView[uv1];_color1.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);normal=element.vertexNormalsModelView[uv2];_color2.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);normal=element.vertexNormalsModelView[uv3];_color3.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);_color4.addColors(_color2,_color3).multiplyScalar(.5);_image=getGradientTexture(_color1,_color2,_color3,_color4);clipImage(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,0,0,1,0,0,1,_image)}}}function renderFace4(v1,v2,v3,v4,v5,v6,element,material){_this.info.render.vertices+=4;_this.info.render.faces++;setOpacity(material.opacity);setBlending(material.blending);if(material.map!==undefined&&material.map!==null||material.envMap!==undefined&&material.envMap!==null){renderFace3(v1,v2,v4,0,1,3,element,material);renderFace3(v5,v3,v6,1,2,3,element,material);return}_v1x=v1.positionScreen.x;_v1y=v1.positionScreen.y;_v2x=v2.positionScreen.x;_v2y=v2.positionScreen.y;_v3x=v3.positionScreen.x;_v3y=v3.positionScreen.y;_v4x=v4.positionScreen.x;_v4y=v4.positionScreen.y;_v5x=v5.positionScreen.x;_v5y=v5.positionScreen.y;_v6x=v6.positionScreen.x;_v6y=v6.positionScreen.y;if(material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial){_diffuseColor.copy(material.color);_emissiveColor.copy(material.emissive);if(material.vertexColors===THREE.FaceColors){_diffuseColor.multiply(element.color)}if(_enableLighting===true){if(material.wireframe===false&&material.shading==THREE.SmoothShading&&element.vertexNormalsLength==4){_color1.copy(_ambientLight);_color2.copy(_ambientLight);_color3.copy(_ambientLight);_color4.copy(_ambientLight);calculateLight(element.v1.positionWorld,element.vertexNormalsModel[0],_color1);calculateLight(element.v2.positionWorld,element.vertexNormalsModel[1],_color2);calculateLight(element.v4.positionWorld,element.vertexNormalsModel[3],_color3);calculateLight(element.v3.positionWorld,element.vertexNormalsModel[2],_color4);_color1.multiply(_diffuseColor).add(_emissiveColor);_color2.multiply(_diffuseColor).add(_emissiveColor);_color3.multiply(_diffuseColor).add(_emissiveColor);_color4.multiply(_diffuseColor).add(_emissiveColor);_image=getGradientTexture(_color1,_color2,_color3,_color4);drawTriangle(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y);clipImage(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y,0,0,1,0,0,1,_image);drawTriangle(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y);clipImage(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y,1,0,1,1,0,1,_image)}else{_color.copy(_ambientLight);calculateLight(element.centroidModel,element.normalModel,_color);_color.multiply(_diffuseColor).add(_emissiveColor);drawQuad(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_v4x,_v4y);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}}else{_color.addColors(_diffuseColor,_emissiveColor);drawQuad(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_v4x,_v4y);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}}else if(material instanceof THREE.MeshBasicMaterial){_color.copy(material.color);if(material.vertexColors===THREE.FaceColors){_color.multiply(element.color)}drawQuad(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_v4x,_v4y);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}else if(material instanceof THREE.MeshNormalMaterial){var normal;if(material.shading==THREE.FlatShading){normal=element.normalModelView;_color.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);drawQuad(_v1x,_v1y,_v2x,_v2y,_v3x,_v3y,_v4x,_v4y);material.wireframe===true?strokePath(_color,material.wireframeLinewidth,material.wireframeLinecap,material.wireframeLinejoin):fillPath(_color)}else if(material.shading==THREE.SmoothShading){normal=element.vertexNormalsModelView[0];_color1.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);normal=element.vertexNormalsModelView[1];_color2.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);normal=element.vertexNormalsModelView[3];_color3.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);normal=element.vertexNormalsModelView[2];_color4.setRGB(normal.x,normal.y,normal.z).multiplyScalar(.5).addScalar(.5);_image=getGradientTexture(_color1,_color2,_color3,_color4);drawTriangle(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y);clipImage(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y,0,0,1,0,0,1,_image);drawTriangle(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y);clipImage(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y,1,0,1,1,0,1,_image)}}else if(material instanceof THREE.MeshDepthMaterial){_near=camera.near;_far=camera.far;_color1.r=_color1.g=_color1.b=1-smoothstep(v1.positionScreen.z*v1.positionScreen.w,_near,_far);_color2.r=_color2.g=_color2.b=1-smoothstep(v2.positionScreen.z*v2.positionScreen.w,_near,_far);_color3.r=_color3.g=_color3.b=1-smoothstep(v4.positionScreen.z*v4.positionScreen.w,_near,_far);_color4.r=_color4.g=_color4.b=1-smoothstep(v3.positionScreen.z*v3.positionScreen.w,_near,_far);_image=getGradientTexture(_color1,_color2,_color3,_color4);drawTriangle(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y);clipImage(_v1x,_v1y,_v2x,_v2y,_v4x,_v4y,0,0,1,0,0,1,_image);drawTriangle(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y);clipImage(_v5x,_v5y,_v3x,_v3y,_v6x,_v6y,1,0,1,1,0,1,_image)}}function drawTriangle(x0,y0,x1,y1,x2,y2){_context.beginPath();_context.moveTo(x0,y0);_context.lineTo(x1,y1);_context.lineTo(x2,y2);_context.closePath()}function drawQuad(x0,y0,x1,y1,x2,y2,x3,y3){_context.beginPath();_context.moveTo(x0,y0);_context.lineTo(x1,y1);_context.lineTo(x2,y2);_context.lineTo(x3,y3);_context.closePath()}function strokePath(color,linewidth,linecap,linejoin){setLineWidth(linewidth);setLineCap(linecap);setLineJoin(linejoin);setStrokeStyle(color.getStyle());_context.stroke();_elemBox.expandByScalar(linewidth*2)}function fillPath(color){setFillStyle(color.getStyle());_context.fill()}function patternPath(x0,y0,x1,y1,x2,y2,u0,v0,u1,v1,u2,v2,texture){if(texture instanceof THREE.DataTexture||texture.image===undefined||texture.image.width==0)return;if(texture.needsUpdate===true){var repeatX=texture.wrapS==THREE.RepeatWrapping;var repeatY=texture.wrapT==THREE.RepeatWrapping;_patterns[texture.id]=_context.createPattern(texture.image,repeatX===true&&repeatY===true?"repeat":repeatX===true&&repeatY===false?"repeat-x":repeatX===false&&repeatY===true?"repeat-y":"no-repeat");texture.needsUpdate=false}_patterns[texture.id]===undefined?setFillStyle("rgba(0,0,0,1)"):setFillStyle(_patterns[texture.id]);var a,b,c,d,e,f,det,idet,offsetX=texture.offset.x/texture.repeat.x,offsetY=texture.offset.y/texture.repeat.y,width=texture.image.width*texture.repeat.x,height=texture.image.height*texture.repeat.y;u0=(u0+offsetX)*width;v0=(1-v0+offsetY)*height;u1=(u1+offsetX)*width;v1=(1-v1+offsetY)*height;u2=(u2+offsetX)*width;v2=(1-v2+offsetY)*height;x1-=x0;y1-=y0;x2-=x0;y2-=y0;u1-=u0;v1-=v0;u2-=u0;v2-=v0;det=u1*v2-u2*v1;if(det===0){if(_imagedatas[texture.id]===undefined){var canvas=document.createElement("canvas");canvas.width=texture.image.width;canvas.height=texture.image.height;var context=canvas.getContext("2d");context.drawImage(texture.image,0,0);_imagedatas[texture.id]=context.getImageData(0,0,texture.image.width,texture.image.height).data}var data=_imagedatas[texture.id];var index=(Math.floor(u0)+Math.floor(v0)*texture.image.width)*4;_color.setRGB(data[index]/255,data[index+1]/255,data[index+2]/255);fillPath(_color);return}idet=1/det;a=(v2*x1-v1*x2)*idet;b=(v2*y1-v1*y2)*idet;c=(u1*x2-u2*x1)*idet;d=(u1*y2-u2*y1)*idet;e=x0-a*u0-c*v0;f=y0-b*u0-d*v0;_context.save();_context.transform(a,b,c,d,e,f);_context.fill();_context.restore()}function clipImage(x0,y0,x1,y1,x2,y2,u0,v0,u1,v1,u2,v2,image){var a,b,c,d,e,f,det,idet,width=image.width-1,height=image.height-1;u0*=width;v0*=height;u1*=width;v1*=height;u2*=width;v2*=height;x1-=x0;y1-=y0;x2-=x0;y2-=y0;u1-=u0;v1-=v0;u2-=u0;v2-=v0;det=u1*v2-u2*v1;idet=1/det;a=(v2*x1-v1*x2)*idet;b=(v2*y1-v1*y2)*idet;c=(u1*x2-u2*x1)*idet;d=(u1*y2-u2*y1)*idet;e=x0-a*u0-c*v0;f=y0-b*u0-d*v0;_context.save();_context.transform(a,b,c,d,e,f);_context.clip();_context.drawImage(image,0,0);_context.restore()}function getGradientTexture(color1,color2,color3,color4){_pixelMapData[0]=color1.r*255|0;_pixelMapData[1]=color1.g*255|0;_pixelMapData[2]=color1.b*255|0;_pixelMapData[4]=color2.r*255|0;_pixelMapData[5]=color2.g*255|0;_pixelMapData[6]=color2.b*255|0;_pixelMapData[8]=color3.r*255|0;_pixelMapData[9]=color3.g*255|0;_pixelMapData[10]=color3.b*255|0;_pixelMapData[12]=color4.r*255|0;_pixelMapData[13]=color4.g*255|0;_pixelMapData[14]=color4.b*255|0;_pixelMapContext.putImageData(_pixelMapImage,0,0);_gradientMapContext.drawImage(_pixelMap,0,0);return _gradientMap}function expand(v1,v2){var x=v2.x-v1.x,y=v2.y-v1.y,det=x*x+y*y,idet;if(det===0)return;idet=1/Math.sqrt(det);x*=idet;y*=idet;v2.x+=x;v2.y+=y;v1.x-=x;v1.y-=y}};function setOpacity(value){if(_contextGlobalAlpha!==value){_context.globalAlpha=value;_contextGlobalAlpha=value}}function setBlending(value){if(_contextGlobalCompositeOperation!==value){if(value===THREE.NormalBlending){_context.globalCompositeOperation="source-over"}else if(value===THREE.AdditiveBlending){_context.globalCompositeOperation="lighter"}else if(value===THREE.SubtractiveBlending){_context.globalCompositeOperation="darker"}_contextGlobalCompositeOperation=value}}function setLineWidth(value){if(_contextLineWidth!==value){_context.lineWidth=value;_contextLineWidth=value}}function setLineCap(value){if(_contextLineCap!==value){_context.lineCap=value;_contextLineCap=value}}function setLineJoin(value){if(_contextLineJoin!==value){_context.lineJoin=value;_contextLineJoin=value}}function setStrokeStyle(value){if(_contextStrokeStyle!==value){_context.strokeStyle=value;_contextStrokeStyle=value}}function setFillStyle(value){if(_contextFillStyle!==value){_context.fillStyle=value;_contextFillStyle=value}}function setDashAndGap(dashSizeValue,gapSizeValue){if(_contextDashSize!==dashSizeValue||_contextGapSize!==gapSizeValue){_context.setLineDash([dashSizeValue,gapSizeValue]);_contextDashSize=dashSizeValue;_contextGapSize=gapSizeValue}}};THREE.ShaderChunk={fog_pars_fragment:["#ifdef USE_FOG","uniform vec3 fogColor;","#ifdef FOG_EXP2","uniform float fogDensity;","#else","uniform float fogNear;","uniform float fogFar;","#endif","#endif"].join("\n"),fog_fragment:["#ifdef USE_FOG","float depth = gl_FragCoord.z / gl_FragCoord.w;","#ifdef FOG_EXP2","const float LOG2 = 1.442695;","float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );","fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );","#else","float fogFactor = smoothstep( fogNear, fogFar, depth );","#endif","gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );","#endif"].join("\n"),
envmap_pars_fragment:["#ifdef USE_ENVMAP","uniform float reflectivity;","uniform samplerCube envMap;","uniform float flipEnvMap;","uniform int combine;","#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )","uniform bool useRefract;","uniform float refractionRatio;","#else","varying vec3 vReflect;","#endif","#endif"].join("\n"),envmap_fragment:["#ifdef USE_ENVMAP","vec3 reflectVec;","#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )","vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );","if ( useRefract ) {","reflectVec = refract( cameraToVertex, normal, refractionRatio );","} else { ","reflectVec = reflect( cameraToVertex, normal );","}","#else","reflectVec = vReflect;","#endif","#ifdef DOUBLE_SIDED","float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );","vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );","#else","vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );","#endif","#ifdef GAMMA_INPUT","cubeColor.xyz *= cubeColor.xyz;","#endif","if ( combine == 1 ) {","gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );","} else if ( combine == 2 ) {","gl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;","} else {","gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );","}","#endif"].join("\n"),envmap_pars_vertex:["#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )","varying vec3 vReflect;","uniform float refractionRatio;","uniform bool useRefract;","#endif"].join("\n"),worldpos_vertex:["#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )","#ifdef USE_SKINNING","vec4 worldPosition = modelMatrix * skinned;","#endif","#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )","vec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );","#endif","#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )","vec4 worldPosition = modelMatrix * vec4( position, 1.0 );","#endif","#endif"].join("\n"),envmap_vertex:["#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )","vec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;","worldNormal = normalize( worldNormal );","vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );","if ( useRefract ) {","vReflect = refract( cameraToVertex, worldNormal, refractionRatio );","} else {","vReflect = reflect( cameraToVertex, worldNormal );","}","#endif"].join("\n"),map_particle_pars_fragment:["#ifdef USE_MAP","uniform sampler2D map;","#endif"].join("\n"),map_particle_fragment:["#ifdef USE_MAP","gl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );","#endif"].join("\n"),map_pars_vertex:["#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )","varying vec2 vUv;","uniform vec4 offsetRepeat;","#endif"].join("\n"),map_pars_fragment:["#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )","varying vec2 vUv;","#endif","#ifdef USE_MAP","uniform sampler2D map;","#endif"].join("\n"),map_vertex:["#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )","vUv = uv * offsetRepeat.zw + offsetRepeat.xy;","#endif"].join("\n"),map_fragment:["#ifdef USE_MAP","vec4 texelColor = texture2D( map, vUv );","#ifdef GAMMA_INPUT","texelColor.xyz *= texelColor.xyz;","#endif","gl_FragColor = gl_FragColor * texelColor;","#endif"].join("\n"),lightmap_pars_fragment:["#ifdef USE_LIGHTMAP","varying vec2 vUv2;","uniform sampler2D lightMap;","#endif"].join("\n"),lightmap_pars_vertex:["#ifdef USE_LIGHTMAP","varying vec2 vUv2;","#endif"].join("\n"),lightmap_fragment:["#ifdef USE_LIGHTMAP","gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );","#endif"].join("\n"),lightmap_vertex:["#ifdef USE_LIGHTMAP","vUv2 = uv2;","#endif"].join("\n"),bumpmap_pars_fragment:["#ifdef USE_BUMPMAP","uniform sampler2D bumpMap;","uniform float bumpScale;","vec2 dHdxy_fwd() {","vec2 dSTdx = dFdx( vUv );","vec2 dSTdy = dFdy( vUv );","float Hll = bumpScale * texture2D( bumpMap, vUv ).x;","float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;","float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;","return vec2( dBx, dBy );","}","vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {","vec3 vSigmaX = dFdx( surf_pos );","vec3 vSigmaY = dFdy( surf_pos );","vec3 vN = surf_norm;","vec3 R1 = cross( vSigmaY, vN );","vec3 R2 = cross( vN, vSigmaX );","float fDet = dot( vSigmaX, R1 );","vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );","return normalize( abs( fDet ) * surf_norm - vGrad );","}","#endif"].join("\n"),normalmap_pars_fragment:["#ifdef USE_NORMALMAP","uniform sampler2D normalMap;","uniform vec2 normalScale;","vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {","vec3 q0 = dFdx( eye_pos.xyz );","vec3 q1 = dFdy( eye_pos.xyz );","vec2 st0 = dFdx( vUv.st );","vec2 st1 = dFdy( vUv.st );","vec3 S = normalize( q0 * st1.t - q1 * st0.t );","vec3 T = normalize( -q0 * st1.s + q1 * st0.s );","vec3 N = normalize( surf_norm );","vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;","mapN.xy = normalScale * mapN.xy;","mat3 tsn = mat3( S, T, N );","return normalize( tsn * mapN );","}","#endif"].join("\n"),specularmap_pars_fragment:["#ifdef USE_SPECULARMAP","uniform sampler2D specularMap;","#endif"].join("\n"),specularmap_fragment:["float specularStrength;","#ifdef USE_SPECULARMAP","vec4 texelSpecular = texture2D( specularMap, vUv );","specularStrength = texelSpecular.r;","#else","specularStrength = 1.0;","#endif"].join("\n"),lights_lambert_pars_vertex:["uniform vec3 ambient;","uniform vec3 diffuse;","uniform vec3 emissive;","uniform vec3 ambientLightColor;","#if MAX_DIR_LIGHTS > 0","uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];","uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];","#endif","#if MAX_HEMI_LIGHTS > 0","uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];","#endif","#if MAX_POINT_LIGHTS > 0","uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];","uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];","uniform float pointLightDistance[ MAX_POINT_LIGHTS ];","#endif","#if MAX_SPOT_LIGHTS > 0","uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];","uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];","uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];","#endif","#ifdef WRAP_AROUND","uniform vec3 wrapRGB;","#endif"].join("\n"),lights_lambert_vertex:["vLightFront = vec3( 0.0 );","#ifdef DOUBLE_SIDED","vLightBack = vec3( 0.0 );","#endif","transformedNormal = normalize( transformedNormal );","#if MAX_DIR_LIGHTS > 0","for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {","vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );","vec3 dirVector = normalize( lDirection.xyz );","float dotProduct = dot( transformedNormal, dirVector );","vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );","#ifdef DOUBLE_SIDED","vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );","#ifdef WRAP_AROUND","vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );","#endif","#endif","#ifdef WRAP_AROUND","vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );","directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );","#ifdef DOUBLE_SIDED","directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );","#endif","#endif","vLightFront += directionalLightColor[ i ] * directionalLightWeighting;","#ifdef DOUBLE_SIDED","vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;","#endif","}","#endif","#if MAX_POINT_LIGHTS > 0","for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz - mvPosition.xyz;","float lDistance = 1.0;","if ( pointLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );","lVector = normalize( lVector );","float dotProduct = dot( transformedNormal, lVector );","vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );","#ifdef DOUBLE_SIDED","vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );","#ifdef WRAP_AROUND","vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );","#endif","#endif","#ifdef WRAP_AROUND","vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );","pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );","#ifdef DOUBLE_SIDED","pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );","#endif","#endif","vLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;","#ifdef DOUBLE_SIDED","vLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;","#endif","}","#endif","#if MAX_SPOT_LIGHTS > 0","for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz - mvPosition.xyz;","float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );","if ( spotEffect > spotLightAngleCos[ i ] ) {","spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );","float lDistance = 1.0;","if ( spotLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );","lVector = normalize( lVector );","float dotProduct = dot( transformedNormal, lVector );","vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );","#ifdef DOUBLE_SIDED","vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );","#ifdef WRAP_AROUND","vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );","#endif","#endif","#ifdef WRAP_AROUND","vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );","spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );","#ifdef DOUBLE_SIDED","spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );","#endif","#endif","vLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;","#ifdef DOUBLE_SIDED","vLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;","#endif","}","}","#endif","#if MAX_HEMI_LIGHTS > 0","for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {","vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );","vec3 lVector = normalize( lDirection.xyz );","float dotProduct = dot( transformedNormal, lVector );","float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;","float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;","vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );","#ifdef DOUBLE_SIDED","vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );","#endif","}","#endif","vLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;","#ifdef DOUBLE_SIDED","vLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;","#endif"].join("\n"),lights_phong_pars_vertex:["#ifndef PHONG_PER_PIXEL","#if MAX_POINT_LIGHTS > 0","uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];","uniform float pointLightDistance[ MAX_POINT_LIGHTS ];","varying vec4 vPointLight[ MAX_POINT_LIGHTS ];","#endif","#if MAX_SPOT_LIGHTS > 0","uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];","#endif","#endif","#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )","varying vec3 vWorldPosition;","#endif"].join("\n"),lights_phong_vertex:["#ifndef PHONG_PER_PIXEL","#if MAX_POINT_LIGHTS > 0","for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz - mvPosition.xyz;","float lDistance = 1.0;","if ( pointLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );","vPointLight[ i ] = vec4( lVector, lDistance );","}","#endif","#if MAX_SPOT_LIGHTS > 0","for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz - mvPosition.xyz;","float lDistance = 1.0;","if ( spotLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );","vSpotLight[ i ] = vec4( lVector, lDistance );","}","#endif","#endif","#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )","vWorldPosition = worldPosition.xyz;","#endif"].join("\n"),lights_phong_pars_fragment:["uniform vec3 ambientLightColor;","#if MAX_DIR_LIGHTS > 0","uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];","uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];","#endif","#if MAX_HEMI_LIGHTS > 0","uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];","#endif","#if MAX_POINT_LIGHTS > 0","uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];","#ifdef PHONG_PER_PIXEL","uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];","uniform float pointLightDistance[ MAX_POINT_LIGHTS ];","#else","varying vec4 vPointLight[ MAX_POINT_LIGHTS ];","#endif","#endif","#if MAX_SPOT_LIGHTS > 0","uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];","uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];","uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];","#ifdef PHONG_PER_PIXEL","uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","#else","varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];","#endif","#endif","#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )","varying vec3 vWorldPosition;","#endif","#ifdef WRAP_AROUND","uniform vec3 wrapRGB;","#endif","varying vec3 vViewPosition;","varying vec3 vNormal;"].join("\n"),lights_phong_fragment:["vec3 normal = normalize( vNormal );","vec3 viewPosition = normalize( vViewPosition );","#ifdef DOUBLE_SIDED","normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );","#endif","#ifdef USE_NORMALMAP","normal = perturbNormal2Arb( -viewPosition, normal );","#elif defined( USE_BUMPMAP )","normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );","#endif","#if MAX_POINT_LIGHTS > 0","vec3 pointDiffuse = vec3( 0.0 );","vec3 pointSpecular = vec3( 0.0 );","for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {","#ifdef PHONG_PER_PIXEL","vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz + vViewPosition.xyz;","float lDistance = 1.0;","if ( pointLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );","lVector = normalize( lVector );","#else","vec3 lVector = normalize( vPointLight[ i ].xyz );","float lDistance = vPointLight[ i ].w;","#endif","float dotProduct = dot( normal, lVector );","#ifdef WRAP_AROUND","float pointDiffuseWeightFull = max( dotProduct, 0.0 );","float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );","vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );","#else","float pointDiffuseWeight = max( dotProduct, 0.0 );","#endif","pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;","vec3 pointHalfVector = normalize( lVector + viewPosition );","float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );","float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( shininess + 2.0001 ) / 8.0;","vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );","pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;","#else","pointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;","#endif","}","#endif","#if MAX_SPOT_LIGHTS > 0","vec3 spotDiffuse = vec3( 0.0 );","vec3 spotSpecular = vec3( 0.0 );","for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {","#ifdef PHONG_PER_PIXEL","vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );","vec3 lVector = lPosition.xyz + vViewPosition.xyz;","float lDistance = 1.0;","if ( spotLightDistance[ i ] > 0.0 )","lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );","lVector = normalize( lVector );","#else","vec3 lVector = normalize( vSpotLight[ i ].xyz );","float lDistance = vSpotLight[ i ].w;","#endif","float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );","if ( spotEffect > spotLightAngleCos[ i ] ) {","spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );","float dotProduct = dot( normal, lVector );","#ifdef WRAP_AROUND","float spotDiffuseWeightFull = max( dotProduct, 0.0 );","float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );","vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );","#else","float spotDiffuseWeight = max( dotProduct, 0.0 );","#endif","spotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;","vec3 spotHalfVector = normalize( lVector + viewPosition );","float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );","float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( shininess + 2.0001 ) / 8.0;","vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );","spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;","#else","spotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;","#endif","}","}","#endif","#if MAX_DIR_LIGHTS > 0","vec3 dirDiffuse = vec3( 0.0 );","vec3 dirSpecular = vec3( 0.0 );","for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {","vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );","vec3 dirVector = normalize( lDirection.xyz );","float dotProduct = dot( normal, dirVector );","#ifdef WRAP_AROUND","float dirDiffuseWeightFull = max( dotProduct, 0.0 );","float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );","vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );","#else","float dirDiffuseWeight = max( dotProduct, 0.0 );","#endif","dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;","vec3 dirHalfVector = normalize( dirVector + viewPosition );","float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );","float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( shininess + 2.0001 ) / 8.0;","vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );","dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;","#else","dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;","#endif","}","#endif","#if MAX_HEMI_LIGHTS > 0","vec3 hemiDiffuse = vec3( 0.0 );","vec3 hemiSpecular = vec3( 0.0 );","for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {","vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );","vec3 lVector = normalize( lDirection.xyz );","float dotProduct = dot( normal, lVector );","float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;","vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );","hemiDiffuse += diffuse * hemiColor;","vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );","float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;","float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );","vec3 lVectorGround = -lVector;","vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );","float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;","float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float dotProductGround = dot( normal, lVectorGround );","float specularNormalization = ( shininess + 2.0001 ) / 8.0;","vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );","vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );","hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );","#else","hemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;","#endif","}","#endif","vec3 totalDiffuse = vec3( 0.0 );","vec3 totalSpecular = vec3( 0.0 );","#if MAX_DIR_LIGHTS > 0","totalDiffuse += dirDiffuse;","totalSpecular += dirSpecular;","#endif","#if MAX_HEMI_LIGHTS > 0","totalDiffuse += hemiDiffuse;","totalSpecular += hemiSpecular;","#endif","#if MAX_POINT_LIGHTS > 0","totalDiffuse += pointDiffuse;","totalSpecular += pointSpecular;","#endif","#if MAX_SPOT_LIGHTS > 0","totalDiffuse += spotDiffuse;","totalSpecular += spotSpecular;","#endif","#ifdef METAL","gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );","#else","gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;","#endif"].join("\n"),color_pars_fragment:["#ifdef USE_COLOR","varying vec3 vColor;","#endif"].join("\n"),color_fragment:["#ifdef USE_COLOR","gl_FragColor = gl_FragColor * vec4( vColor, opacity );","#endif"].join("\n"),color_pars_vertex:["#ifdef USE_COLOR","varying vec3 vColor;","#endif"].join("\n"),color_vertex:["#ifdef USE_COLOR","#ifdef GAMMA_INPUT","vColor = color * color;","#else","vColor = color;","#endif","#endif"].join("\n"),skinning_pars_vertex:["#ifdef USE_SKINNING","#ifdef BONE_TEXTURE","uniform sampler2D boneTexture;","mat4 getBoneMatrix( const in float i ) {","float j = i * 4.0;","float x = mod( j, N_BONE_PIXEL_X );","float y = floor( j / N_BONE_PIXEL_X );","const float dx = 1.0 / N_BONE_PIXEL_X;","const float dy = 1.0 / N_BONE_PIXEL_Y;","y = dy * ( y + 0.5 );","vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );","vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );","vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );","vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );","mat4 bone = mat4( v1, v2, v3, v4 );","return bone;","}","#else","uniform mat4 boneGlobalMatrices[ MAX_BONES ];","mat4 getBoneMatrix( const in float i ) {","mat4 bone = boneGlobalMatrices[ int(i) ];","return bone;","}","#endif","#endif"].join("\n"),skinbase_vertex:["#ifdef USE_SKINNING","mat4 boneMatX = getBoneMatrix( skinIndex.x );","mat4 boneMatY = getBoneMatrix( skinIndex.y );","#endif"].join("\n"),skinning_vertex:["#ifdef USE_SKINNING","#ifdef USE_MORPHTARGETS","vec4 skinVertex = vec4( morphed, 1.0 );","#else","vec4 skinVertex = vec4( position, 1.0 );","#endif","vec4 skinned = boneMatX * skinVertex * skinWeight.x;","skinned += boneMatY * skinVertex * skinWeight.y;","#endif"].join("\n"),morphtarget_pars_vertex:["#ifdef USE_MORPHTARGETS","#ifndef USE_MORPHNORMALS","uniform float morphTargetInfluences[ 8 ];","#else","uniform float morphTargetInfluences[ 4 ];","#endif","#endif"].join("\n"),morphtarget_vertex:["#ifdef USE_MORPHTARGETS","vec3 morphed = vec3( 0.0 );","morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];","morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];","morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];","morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];","#ifndef USE_MORPHNORMALS","morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];","morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];","morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];","morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];","#endif","morphed += position;","#endif"].join("\n"),default_vertex:["vec4 mvPosition;","#ifdef USE_SKINNING","mvPosition = modelViewMatrix * skinned;","#endif","#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )","mvPosition = modelViewMatrix * vec4( morphed, 1.0 );","#endif","#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )","mvPosition = modelViewMatrix * vec4( position, 1.0 );","#endif","gl_Position = projectionMatrix * mvPosition;"].join("\n"),morphnormal_vertex:["#ifdef USE_MORPHNORMALS","vec3 morphedNormal = vec3( 0.0 );","morphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];","morphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];","morphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];","morphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];","morphedNormal += normal;","#endif"].join("\n"),skinnormal_vertex:["#ifdef USE_SKINNING","mat4 skinMatrix = skinWeight.x * boneMatX;","skinMatrix += skinWeight.y * boneMatY;","#ifdef USE_MORPHNORMALS","vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );","#else","vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );","#endif","#endif"].join("\n"),defaultnormal_vertex:["vec3 objectNormal;","#ifdef USE_SKINNING","objectNormal = skinnedNormal.xyz;","#endif","#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )","objectNormal = morphedNormal;","#endif","#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )","objectNormal = normal;","#endif","#ifdef FLIP_SIDED","objectNormal = -objectNormal;","#endif","vec3 transformedNormal = normalMatrix * objectNormal;"].join("\n"),shadowmap_pars_fragment:["#ifdef USE_SHADOWMAP","uniform sampler2D shadowMap[ MAX_SHADOWS ];","uniform vec2 shadowMapSize[ MAX_SHADOWS ];","uniform float shadowDarkness[ MAX_SHADOWS ];","uniform float shadowBias[ MAX_SHADOWS ];","varying vec4 vShadowCoord[ MAX_SHADOWS ];","float unpackDepth( const in vec4 rgba_depth ) {","const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1.0 );","float depth = dot( rgba_depth, bit_shift );","return depth;","}","#endif"].join("\n"),shadowmap_fragment:["#ifdef USE_SHADOWMAP","#ifdef SHADOWMAP_DEBUG","vec3 frustumColors[3];","frustumColors[0] = vec3( 1.0, 0.5, 0.0 );","frustumColors[1] = vec3( 0.0, 1.0, 0.8 );","frustumColors[2] = vec3( 0.0, 0.5, 1.0 );","#endif","#ifdef SHADOWMAP_CASCADE","int inFrustumCount = 0;","#endif","float fDepth;","vec3 shadowColor = vec3( 1.0 );","for( int i = 0; i < MAX_SHADOWS; i ++ ) {","vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;","bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );","bool inFrustum = all( inFrustumVec );","#ifdef SHADOWMAP_CASCADE","inFrustumCount += int( inFrustum );","bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );","#else","bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );","#endif","bool frustumTest = all( frustumTestVec );","if ( frustumTest ) {","shadowCoord.z += shadowBias[ i ];","#if defined( SHADOWMAP_TYPE_PCF )","float shadow = 0.0;","const float shadowDelta = 1.0 / 9.0;","float xPixelOffset = 1.0 / shadowMapSize[ i ].x;","float yPixelOffset = 1.0 / shadowMapSize[ i ].y;","float dx0 = -1.25 * xPixelOffset;","float dy0 = -1.25 * yPixelOffset;","float dx1 = 1.25 * xPixelOffset;","float dy1 = 1.25 * yPixelOffset;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );","if ( fDepth < shadowCoord.z ) shadow += shadowDelta;","shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );","#elif defined( SHADOWMAP_TYPE_PCF_SOFT )","float shadow = 0.0;","float xPixelOffset = 1.0 / shadowMapSize[ i ].x;","float yPixelOffset = 1.0 / shadowMapSize[ i ].y;","float dx0 = -1.0 * xPixelOffset;","float dy0 = -1.0 * yPixelOffset;","float dx1 = 1.0 * xPixelOffset;","float dy1 = 1.0 * yPixelOffset;","mat3 shadowKernel;","mat3 depthKernel;","depthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );","if ( depthKernel[0][0] < shadowCoord.z ) shadowKernel[0][0] = 0.25;","else shadowKernel[0][0] = 0.0;","depthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );","if ( depthKernel[0][1] < shadowCoord.z ) shadowKernel[0][1] = 0.25;","else shadowKernel[0][1] = 0.0;","depthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i], shadowCoord.xy + vec2( dx0, dy1 ) ) );","if ( depthKernel[0][2] < shadowCoord.z ) shadowKernel[0][2] = 0.25;","else shadowKernel[0][2] = 0.0;","depthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );","if ( depthKernel[1][0] < shadowCoord.z ) shadowKernel[1][0] = 0.25;","else shadowKernel[1][0] = 0.0;","depthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );","if ( depthKernel[1][1] < shadowCoord.z ) shadowKernel[1][1] = 0.25;","else shadowKernel[1][1] = 0.0;","depthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );","if ( depthKernel[1][2] < shadowCoord.z ) shadowKernel[1][2] = 0.25;","else shadowKernel[1][2] = 0.0;","depthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );","if ( depthKernel[2][0] < shadowCoord.z ) shadowKernel[2][0] = 0.25;","else shadowKernel[2][0] = 0.0;","depthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );","if ( depthKernel[2][1] < shadowCoord.z ) shadowKernel[2][1] = 0.25;","else shadowKernel[2][1] = 0.0;","depthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );","if ( depthKernel[2][2] < shadowCoord.z ) shadowKernel[2][2] = 0.25;","else shadowKernel[2][2] = 0.0;","vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );","shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );","shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );","vec4 shadowValues;","shadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );","shadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );","shadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );","shadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );","shadow = dot( shadowValues, vec4( 1.0 ) );","shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );","#else","vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );","float fDepth = unpackDepth( rgbaDepth );","if ( fDepth < shadowCoord.z )","shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );","#endif","}","#ifdef SHADOWMAP_DEBUG","#ifdef SHADOWMAP_CASCADE","if ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];","#else","if ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];","#endif","#endif","}","#ifdef GAMMA_OUTPUT","shadowColor *= shadowColor;","#endif","gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;","#endif"].join("\n"),
shadowmap_pars_vertex:["#ifdef USE_SHADOWMAP","varying vec4 vShadowCoord[ MAX_SHADOWS ];","uniform mat4 shadowMatrix[ MAX_SHADOWS ];","#endif"].join("\n"),shadowmap_vertex:["#ifdef USE_SHADOWMAP","for( int i = 0; i < MAX_SHADOWS; i ++ ) {","vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;","}","#endif"].join("\n"),alphatest_fragment:["#ifdef ALPHATEST","if ( gl_FragColor.a < ALPHATEST ) discard;","#endif"].join("\n"),linear_to_gamma_fragment:["#ifdef GAMMA_OUTPUT","gl_FragColor.xyz = sqrt( gl_FragColor.xyz );","#endif"].join("\n")};THREE.UniformsUtils={merge:function(uniforms){var u,p,tmp,merged={};for(u=0;u<uniforms.length;u++){tmp=this.clone(uniforms[u]);for(p in tmp){merged[p]=tmp[p]}}return merged},clone:function(uniforms_src){var u,p,parameter,parameter_src,uniforms_dst={};for(u in uniforms_src){uniforms_dst[u]={};for(p in uniforms_src[u]){parameter_src=uniforms_src[u][p];if(parameter_src instanceof THREE.Color||parameter_src instanceof THREE.Vector2||parameter_src instanceof THREE.Vector3||parameter_src instanceof THREE.Vector4||parameter_src instanceof THREE.Matrix4||parameter_src instanceof THREE.Texture){uniforms_dst[u][p]=parameter_src.clone()}else if(parameter_src instanceof Array){uniforms_dst[u][p]=parameter_src.slice()}else{uniforms_dst[u][p]=parameter_src}}}return uniforms_dst}};THREE.UniformsLib={common:{diffuse:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},map:{type:"t",value:null},offsetRepeat:{type:"v4",value:new THREE.Vector4(0,0,1,1)},lightMap:{type:"t",value:null},specularMap:{type:"t",value:null},envMap:{type:"t",value:null},flipEnvMap:{type:"f",value:-1},useRefract:{type:"i",value:0},reflectivity:{type:"f",value:1},refractionRatio:{type:"f",value:.98},combine:{type:"i",value:0},morphTargetInfluences:{type:"f",value:0}},bump:{bumpMap:{type:"t",value:null},bumpScale:{type:"f",value:1}},normalmap:{normalMap:{type:"t",value:null},normalScale:{type:"v2",value:new THREE.Vector2(1,1)}},fog:{fogDensity:{type:"f",value:25e-5},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},fogColor:{type:"c",value:new THREE.Color(16777215)}},lights:{ambientLightColor:{type:"fv",value:[]},directionalLightDirection:{type:"fv",value:[]},directionalLightColor:{type:"fv",value:[]},hemisphereLightDirection:{type:"fv",value:[]},hemisphereLightSkyColor:{type:"fv",value:[]},hemisphereLightGroundColor:{type:"fv",value:[]},pointLightColor:{type:"fv",value:[]},pointLightPosition:{type:"fv",value:[]},pointLightDistance:{type:"fv1",value:[]},spotLightColor:{type:"fv",value:[]},spotLightPosition:{type:"fv",value:[]},spotLightDirection:{type:"fv",value:[]},spotLightDistance:{type:"fv1",value:[]},spotLightAngleCos:{type:"fv1",value:[]},spotLightExponent:{type:"fv1",value:[]}},particle:{psColor:{type:"c",value:new THREE.Color(15658734)},opacity:{type:"f",value:1},size:{type:"f",value:1},scale:{type:"f",value:1},map:{type:"t",value:null},fogDensity:{type:"f",value:25e-5},fogNear:{type:"f",value:1},fogFar:{type:"f",value:2e3},fogColor:{type:"c",value:new THREE.Color(16777215)}},shadowmap:{shadowMap:{type:"tv",value:[]},shadowMapSize:{type:"v2v",value:[]},shadowBias:{type:"fv1",value:[]},shadowDarkness:{type:"fv1",value:[]},shadowMatrix:{type:"m4v",value:[]}}};THREE.ShaderLib={basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["common"],THREE.UniformsLib["fog"],THREE.UniformsLib["shadowmap"]]),vertexShader:[THREE.ShaderChunk["map_pars_vertex"],THREE.ShaderChunk["lightmap_pars_vertex"],THREE.ShaderChunk["envmap_pars_vertex"],THREE.ShaderChunk["color_pars_vertex"],THREE.ShaderChunk["morphtarget_pars_vertex"],THREE.ShaderChunk["skinning_pars_vertex"],THREE.ShaderChunk["shadowmap_pars_vertex"],"void main() {",THREE.ShaderChunk["map_vertex"],THREE.ShaderChunk["lightmap_vertex"],THREE.ShaderChunk["color_vertex"],THREE.ShaderChunk["skinbase_vertex"],"#ifdef USE_ENVMAP",THREE.ShaderChunk["morphnormal_vertex"],THREE.ShaderChunk["skinnormal_vertex"],THREE.ShaderChunk["defaultnormal_vertex"],"#endif",THREE.ShaderChunk["morphtarget_vertex"],THREE.ShaderChunk["skinning_vertex"],THREE.ShaderChunk["default_vertex"],THREE.ShaderChunk["worldpos_vertex"],THREE.ShaderChunk["envmap_vertex"],THREE.ShaderChunk["shadowmap_vertex"],"}"].join("\n"),fragmentShader:["uniform vec3 diffuse;","uniform float opacity;",THREE.ShaderChunk["color_pars_fragment"],THREE.ShaderChunk["map_pars_fragment"],THREE.ShaderChunk["lightmap_pars_fragment"],THREE.ShaderChunk["envmap_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],THREE.ShaderChunk["shadowmap_pars_fragment"],THREE.ShaderChunk["specularmap_pars_fragment"],"void main() {","gl_FragColor = vec4( diffuse, opacity );",THREE.ShaderChunk["map_fragment"],THREE.ShaderChunk["alphatest_fragment"],THREE.ShaderChunk["specularmap_fragment"],THREE.ShaderChunk["lightmap_fragment"],THREE.ShaderChunk["color_fragment"],THREE.ShaderChunk["envmap_fragment"],THREE.ShaderChunk["shadowmap_fragment"],THREE.ShaderChunk["linear_to_gamma_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n")},lambert:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["common"],THREE.UniformsLib["fog"],THREE.UniformsLib["lights"],THREE.UniformsLib["shadowmap"],{ambient:{type:"c",value:new THREE.Color(16777215)},emissive:{type:"c",value:new THREE.Color(0)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),vertexShader:["#define LAMBERT","varying vec3 vLightFront;","#ifdef DOUBLE_SIDED","varying vec3 vLightBack;","#endif",THREE.ShaderChunk["map_pars_vertex"],THREE.ShaderChunk["lightmap_pars_vertex"],THREE.ShaderChunk["envmap_pars_vertex"],THREE.ShaderChunk["lights_lambert_pars_vertex"],THREE.ShaderChunk["color_pars_vertex"],THREE.ShaderChunk["morphtarget_pars_vertex"],THREE.ShaderChunk["skinning_pars_vertex"],THREE.ShaderChunk["shadowmap_pars_vertex"],"void main() {",THREE.ShaderChunk["map_vertex"],THREE.ShaderChunk["lightmap_vertex"],THREE.ShaderChunk["color_vertex"],THREE.ShaderChunk["morphnormal_vertex"],THREE.ShaderChunk["skinbase_vertex"],THREE.ShaderChunk["skinnormal_vertex"],THREE.ShaderChunk["defaultnormal_vertex"],THREE.ShaderChunk["morphtarget_vertex"],THREE.ShaderChunk["skinning_vertex"],THREE.ShaderChunk["default_vertex"],THREE.ShaderChunk["worldpos_vertex"],THREE.ShaderChunk["envmap_vertex"],THREE.ShaderChunk["lights_lambert_vertex"],THREE.ShaderChunk["shadowmap_vertex"],"}"].join("\n"),fragmentShader:["uniform float opacity;","varying vec3 vLightFront;","#ifdef DOUBLE_SIDED","varying vec3 vLightBack;","#endif",THREE.ShaderChunk["color_pars_fragment"],THREE.ShaderChunk["map_pars_fragment"],THREE.ShaderChunk["lightmap_pars_fragment"],THREE.ShaderChunk["envmap_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],THREE.ShaderChunk["shadowmap_pars_fragment"],THREE.ShaderChunk["specularmap_pars_fragment"],"void main() {","gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",THREE.ShaderChunk["map_fragment"],THREE.ShaderChunk["alphatest_fragment"],THREE.ShaderChunk["specularmap_fragment"],"#ifdef DOUBLE_SIDED","if ( gl_FrontFacing )","gl_FragColor.xyz *= vLightFront;","else","gl_FragColor.xyz *= vLightBack;","#else","gl_FragColor.xyz *= vLightFront;","#endif",THREE.ShaderChunk["lightmap_fragment"],THREE.ShaderChunk["color_fragment"],THREE.ShaderChunk["envmap_fragment"],THREE.ShaderChunk["shadowmap_fragment"],THREE.ShaderChunk["linear_to_gamma_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n")},phong:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["common"],THREE.UniformsLib["bump"],THREE.UniformsLib["normalmap"],THREE.UniformsLib["fog"],THREE.UniformsLib["lights"],THREE.UniformsLib["shadowmap"],{ambient:{type:"c",value:new THREE.Color(16777215)},emissive:{type:"c",value:new THREE.Color(0)},specular:{type:"c",value:new THREE.Color(1118481)},shininess:{type:"f",value:30},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),vertexShader:["#define PHONG","varying vec3 vViewPosition;","varying vec3 vNormal;",THREE.ShaderChunk["map_pars_vertex"],THREE.ShaderChunk["lightmap_pars_vertex"],THREE.ShaderChunk["envmap_pars_vertex"],THREE.ShaderChunk["lights_phong_pars_vertex"],THREE.ShaderChunk["color_pars_vertex"],THREE.ShaderChunk["morphtarget_pars_vertex"],THREE.ShaderChunk["skinning_pars_vertex"],THREE.ShaderChunk["shadowmap_pars_vertex"],"void main() {",THREE.ShaderChunk["map_vertex"],THREE.ShaderChunk["lightmap_vertex"],THREE.ShaderChunk["color_vertex"],THREE.ShaderChunk["morphnormal_vertex"],THREE.ShaderChunk["skinbase_vertex"],THREE.ShaderChunk["skinnormal_vertex"],THREE.ShaderChunk["defaultnormal_vertex"],"vNormal = normalize( transformedNormal );",THREE.ShaderChunk["morphtarget_vertex"],THREE.ShaderChunk["skinning_vertex"],THREE.ShaderChunk["default_vertex"],"vViewPosition = -mvPosition.xyz;",THREE.ShaderChunk["worldpos_vertex"],THREE.ShaderChunk["envmap_vertex"],THREE.ShaderChunk["lights_phong_vertex"],THREE.ShaderChunk["shadowmap_vertex"],"}"].join("\n"),fragmentShader:["uniform vec3 diffuse;","uniform float opacity;","uniform vec3 ambient;","uniform vec3 emissive;","uniform vec3 specular;","uniform float shininess;",THREE.ShaderChunk["color_pars_fragment"],THREE.ShaderChunk["map_pars_fragment"],THREE.ShaderChunk["lightmap_pars_fragment"],THREE.ShaderChunk["envmap_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],THREE.ShaderChunk["lights_phong_pars_fragment"],THREE.ShaderChunk["shadowmap_pars_fragment"],THREE.ShaderChunk["bumpmap_pars_fragment"],THREE.ShaderChunk["normalmap_pars_fragment"],THREE.ShaderChunk["specularmap_pars_fragment"],"void main() {","gl_FragColor = vec4( vec3 ( 1.0 ), opacity );",THREE.ShaderChunk["map_fragment"],THREE.ShaderChunk["alphatest_fragment"],THREE.ShaderChunk["specularmap_fragment"],THREE.ShaderChunk["lights_phong_fragment"],THREE.ShaderChunk["lightmap_fragment"],THREE.ShaderChunk["color_fragment"],THREE.ShaderChunk["envmap_fragment"],THREE.ShaderChunk["shadowmap_fragment"],THREE.ShaderChunk["linear_to_gamma_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n")},particle_basic:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["particle"],THREE.UniformsLib["shadowmap"]]),vertexShader:["uniform float size;","uniform float scale;",THREE.ShaderChunk["color_pars_vertex"],THREE.ShaderChunk["shadowmap_pars_vertex"],"void main() {",THREE.ShaderChunk["color_vertex"],"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );","#ifdef USE_SIZEATTENUATION","gl_PointSize = size * ( scale / length( mvPosition.xyz ) );","#else","gl_PointSize = size;","#endif","gl_Position = projectionMatrix * mvPosition;",THREE.ShaderChunk["worldpos_vertex"],THREE.ShaderChunk["shadowmap_vertex"],"}"].join("\n"),fragmentShader:["uniform vec3 psColor;","uniform float opacity;",THREE.ShaderChunk["color_pars_fragment"],THREE.ShaderChunk["map_particle_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],THREE.ShaderChunk["shadowmap_pars_fragment"],"void main() {","gl_FragColor = vec4( psColor, opacity );",THREE.ShaderChunk["map_particle_fragment"],THREE.ShaderChunk["alphatest_fragment"],THREE.ShaderChunk["color_fragment"],THREE.ShaderChunk["shadowmap_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n")},dashed:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["common"],THREE.UniformsLib["fog"],{scale:{type:"f",value:1},dashSize:{type:"f",value:1},totalSize:{type:"f",value:2}}]),vertexShader:["uniform float scale;","attribute float lineDistance;","varying float vLineDistance;",THREE.ShaderChunk["color_pars_vertex"],"void main() {",THREE.ShaderChunk["color_vertex"],"vLineDistance = scale * lineDistance;","vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );","gl_Position = projectionMatrix * mvPosition;","}"].join("\n"),fragmentShader:["uniform vec3 diffuse;","uniform float opacity;","uniform float dashSize;","uniform float totalSize;","varying float vLineDistance;",THREE.ShaderChunk["color_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],"void main() {","if ( mod( vLineDistance, totalSize ) > dashSize ) {","discard;","}","gl_FragColor = vec4( diffuse, opacity );",THREE.ShaderChunk["color_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n")},depth:{uniforms:{mNear:{type:"f",value:1},mFar:{type:"f",value:2e3},opacity:{type:"f",value:1}},vertexShader:["void main() {","gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );","}"].join("\n"),fragmentShader:["uniform float mNear;","uniform float mFar;","uniform float opacity;","void main() {","float depth = gl_FragCoord.z / gl_FragCoord.w;","float color = 1.0 - smoothstep( mNear, mFar, depth );","gl_FragColor = vec4( vec3( color ), opacity );","}"].join("\n")},normal:{uniforms:{opacity:{type:"f",value:1}},vertexShader:["varying vec3 vNormal;","void main() {","vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );","vNormal = normalize( normalMatrix * normal );","gl_Position = projectionMatrix * mvPosition;","}"].join("\n"),fragmentShader:["uniform float opacity;","varying vec3 vNormal;","void main() {","gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );","}"].join("\n")},normalmap:{uniforms:THREE.UniformsUtils.merge([THREE.UniformsLib["fog"],THREE.UniformsLib["lights"],THREE.UniformsLib["shadowmap"],{enableAO:{type:"i",value:0},enableDiffuse:{type:"i",value:0},enableSpecular:{type:"i",value:0},enableReflection:{type:"i",value:0},enableDisplacement:{type:"i",value:0},tDisplacement:{type:"t",value:null},tDiffuse:{type:"t",value:null},tCube:{type:"t",value:null},tNormal:{type:"t",value:null},tSpecular:{type:"t",value:null},tAO:{type:"t",value:null},uNormalScale:{type:"v2",value:new THREE.Vector2(1,1)},uDisplacementBias:{type:"f",value:0},uDisplacementScale:{type:"f",value:1},uDiffuseColor:{type:"c",value:new THREE.Color(16777215)},uSpecularColor:{type:"c",value:new THREE.Color(1118481)},uAmbientColor:{type:"c",value:new THREE.Color(16777215)},uShininess:{type:"f",value:30},uOpacity:{type:"f",value:1},useRefract:{type:"i",value:0},uRefractionRatio:{type:"f",value:.98},uReflectivity:{type:"f",value:.5},uOffset:{type:"v2",value:new THREE.Vector2(0,0)},uRepeat:{type:"v2",value:new THREE.Vector2(1,1)},wrapRGB:{type:"v3",value:new THREE.Vector3(1,1,1)}}]),fragmentShader:["uniform vec3 uAmbientColor;","uniform vec3 uDiffuseColor;","uniform vec3 uSpecularColor;","uniform float uShininess;","uniform float uOpacity;","uniform bool enableDiffuse;","uniform bool enableSpecular;","uniform bool enableAO;","uniform bool enableReflection;","uniform sampler2D tDiffuse;","uniform sampler2D tNormal;","uniform sampler2D tSpecular;","uniform sampler2D tAO;","uniform samplerCube tCube;","uniform vec2 uNormalScale;","uniform bool useRefract;","uniform float uRefractionRatio;","uniform float uReflectivity;","varying vec3 vTangent;","varying vec3 vBinormal;","varying vec3 vNormal;","varying vec2 vUv;","uniform vec3 ambientLightColor;","#if MAX_DIR_LIGHTS > 0","uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];","uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];","#endif","#if MAX_HEMI_LIGHTS > 0","uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];","uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];","#endif","#if MAX_POINT_LIGHTS > 0","uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];","uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];","uniform float pointLightDistance[ MAX_POINT_LIGHTS ];","#endif","#if MAX_SPOT_LIGHTS > 0","uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];","uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];","uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];","uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];","uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];","#endif","#ifdef WRAP_AROUND","uniform vec3 wrapRGB;","#endif","varying vec3 vWorldPosition;","varying vec3 vViewPosition;",THREE.ShaderChunk["shadowmap_pars_fragment"],THREE.ShaderChunk["fog_pars_fragment"],"void main() {","gl_FragColor = vec4( vec3( 1.0 ), uOpacity );","vec3 specularTex = vec3( 1.0 );","vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;","normalTex.xy *= uNormalScale;","normalTex = normalize( normalTex );","if( enableDiffuse ) {","#ifdef GAMMA_INPUT","vec4 texelColor = texture2D( tDiffuse, vUv );","texelColor.xyz *= texelColor.xyz;","gl_FragColor = gl_FragColor * texelColor;","#else","gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );","#endif","}","if( enableAO ) {","#ifdef GAMMA_INPUT","vec4 aoColor = texture2D( tAO, vUv );","aoColor.xyz *= aoColor.xyz;","gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;","#else","gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;","#endif","}","if( enableSpecular )","specularTex = texture2D( tSpecular, vUv ).xyz;","mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );","vec3 finalNormal = tsb * normalTex;","#ifdef FLIP_SIDED","finalNormal = -finalNormal;","#endif","vec3 normal = normalize( finalNormal );","vec3 viewPosition = normalize( vViewPosition );","#if MAX_POINT_LIGHTS > 0","vec3 pointDiffuse = vec3( 0.0 );","vec3 pointSpecular = vec3( 0.0 );","for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );","vec3 pointVector = lPosition.xyz + vViewPosition.xyz;","float pointDistance = 1.0;","if ( pointLightDistance[ i ] > 0.0 )","pointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );","pointVector = normalize( pointVector );","#ifdef WRAP_AROUND","float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );","float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );","vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );","#else","float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );","#endif","pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;","vec3 pointHalfVector = normalize( pointVector + viewPosition );","float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );","float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( uShininess + 2.0001 ) / 8.0;","vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );","pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;","#else","pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;","#endif","}","#endif","#if MAX_SPOT_LIGHTS > 0","vec3 spotDiffuse = vec3( 0.0 );","vec3 spotSpecular = vec3( 0.0 );","for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {","vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );","vec3 spotVector = lPosition.xyz + vViewPosition.xyz;","float spotDistance = 1.0;","if ( spotLightDistance[ i ] > 0.0 )","spotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );","spotVector = normalize( spotVector );","float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );","if ( spotEffect > spotLightAngleCos[ i ] ) {","spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );","#ifdef WRAP_AROUND","float spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );","float spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );","vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );","#else","float spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );","#endif","spotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;","vec3 spotHalfVector = normalize( spotVector + viewPosition );","float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );","float spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( uShininess + 2.0001 ) / 8.0;","vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );","spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;","#else","spotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;","#endif","}","}","#endif","#if MAX_DIR_LIGHTS > 0","vec3 dirDiffuse = vec3( 0.0 );","vec3 dirSpecular = vec3( 0.0 );","for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {","vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );","vec3 dirVector = normalize( lDirection.xyz );","#ifdef WRAP_AROUND","float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );","float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );","vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );","#else","float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );","#endif","dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;","vec3 dirHalfVector = normalize( dirVector + viewPosition );","float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );","float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float specularNormalization = ( uShininess + 2.0001 ) / 8.0;","vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );","dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;","#else","dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;","#endif","}","#endif","#if MAX_HEMI_LIGHTS > 0","vec3 hemiDiffuse = vec3( 0.0 );","vec3 hemiSpecular = vec3( 0.0 );","for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {","vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );","vec3 lVector = normalize( lDirection.xyz );","float dotProduct = dot( normal, lVector );","float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;","vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );","hemiDiffuse += uDiffuseColor * hemiColor;","vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );","float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;","float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );","vec3 lVectorGround = -lVector;","vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );","float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;","float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );","#ifdef PHYSICALLY_BASED_SHADING","float dotProductGround = dot( normal, lVectorGround );","float specularNormalization = ( uShininess + 2.0001 ) / 8.0;","vec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );","vec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );","hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );","#else","hemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;","#endif","}","#endif","vec3 totalDiffuse = vec3( 0.0 );","vec3 totalSpecular = vec3( 0.0 );","#if MAX_DIR_LIGHTS > 0","totalDiffuse += dirDiffuse;","totalSpecular += dirSpecular;","#endif","#if MAX_HEMI_LIGHTS > 0","totalDiffuse += hemiDiffuse;","totalSpecular += hemiSpecular;","#endif","#if MAX_POINT_LIGHTS > 0","totalDiffuse += pointDiffuse;","totalSpecular += pointSpecular;","#endif","#if MAX_SPOT_LIGHTS > 0","totalDiffuse += spotDiffuse;","totalSpecular += spotSpecular;","#endif","#ifdef METAL","gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );","#else","gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;","#endif","if ( enableReflection ) {","vec3 vReflect;","vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );","if ( useRefract ) {","vReflect = refract( cameraToVertex, normal, uRefractionRatio );","} else {","vReflect = reflect( cameraToVertex, normal );","}","vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );","#ifdef GAMMA_INPUT","cubeColor.xyz *= cubeColor.xyz;","#endif","gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );","}",THREE.ShaderChunk["shadowmap_fragment"],THREE.ShaderChunk["linear_to_gamma_fragment"],THREE.ShaderChunk["fog_fragment"],"}"].join("\n"),vertexShader:["attribute vec4 tangent;","uniform vec2 uOffset;","uniform vec2 uRepeat;","uniform bool enableDisplacement;","#ifdef VERTEX_TEXTURES","uniform sampler2D tDisplacement;","uniform float uDisplacementScale;","uniform float uDisplacementBias;","#endif","varying vec3 vTangent;","varying vec3 vBinormal;","varying vec3 vNormal;","varying vec2 vUv;","varying vec3 vWorldPosition;","varying vec3 vViewPosition;",THREE.ShaderChunk["skinning_pars_vertex"],THREE.ShaderChunk["shadowmap_pars_vertex"],"void main() {",THREE.ShaderChunk["skinbase_vertex"],THREE.ShaderChunk["skinnormal_vertex"],"#ifdef USE_SKINNING","vNormal = normalize( normalMatrix * skinnedNormal.xyz );","vec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );","vTangent = normalize( normalMatrix * skinnedTangent.xyz );","#else","vNormal = normalize( normalMatrix * normal );","vTangent = normalize( normalMatrix * tangent.xyz );","#endif","vBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );","vUv = uv * uRepeat + uOffset;","vec3 displacedPosition;","#ifdef VERTEX_TEXTURES","if ( enableDisplacement ) {","vec3 dv = texture2D( tDisplacement, uv ).xyz;","float df = uDisplacementScale * dv.x + uDisplacementBias;","displacedPosition = position + normalize( normal ) * df;","} else {","#ifdef USE_SKINNING","vec4 skinVertex = vec4( position, 1.0 );","vec4 skinned = boneMatX * skinVertex * skinWeight.x;","skinned += boneMatY * skinVertex * skinWeight.y;","displacedPosition = skinned.xyz;","#else","displacedPosition = position;","#endif","}","#else","#ifdef USE_SKINNING","vec4 skinVertex = vec4( position, 1.0 );","vec4 skinned = boneMatX * skinVertex * skinWeight.x;","skinned += boneMatY * skinVertex * skinWeight.y;","displacedPosition = skinned.xyz;","#else","displacedPosition = position;","#endif","#endif","vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );","vec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );","gl_Position = projectionMatrix * mvPosition;","vWorldPosition = worldPosition.xyz;","vViewPosition = -mvPosition.xyz;","#ifdef USE_SHADOWMAP","for( int i = 0; i < MAX_SHADOWS; i ++ ) {","vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;","}","#endif","}"].join("\n")},cube:{uniforms:{tCube:{type:"t",value:null},tFlip:{type:"f",value:-1}},vertexShader:["varying vec3 vWorldPosition;","void main() {","vec4 worldPosition = modelMatrix * vec4( position, 1.0 );","vWorldPosition = worldPosition.xyz;","gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );","}"].join("\n"),fragmentShader:["uniform samplerCube tCube;","uniform float tFlip;","varying vec3 vWorldPosition;","void main() {","gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );","}"].join("\n")},depthRGBA:{uniforms:{},vertexShader:[THREE.ShaderChunk["morphtarget_pars_vertex"],THREE.ShaderChunk["skinning_pars_vertex"],"void main() {",THREE.ShaderChunk["skinbase_vertex"],THREE.ShaderChunk["morphtarget_vertex"],THREE.ShaderChunk["skinning_vertex"],THREE.ShaderChunk["default_vertex"],"}"].join("\n"),fragmentShader:["vec4 pack_depth( const in float depth ) {","const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );","const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );","vec4 res = fract( depth * bit_shift );","res -= res.xxyz * bit_mask;","return res;","}","void main() {","gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );","}"].join("\n")}};THREE.WebGLRenderer=function(parameters){console.log("THREE.WebGLRenderer",THREE.REVISION);parameters=parameters||{};var _canvas=parameters.canvas!==undefined?parameters.canvas:document.createElement("canvas"),_precision=parameters.precision!==undefined?parameters.precision:"highp",_alpha=parameters.alpha!==undefined?parameters.alpha:true,_premultipliedAlpha=parameters.premultipliedAlpha!==undefined?parameters.premultipliedAlpha:true,_antialias=parameters.antialias!==undefined?parameters.antialias:false,_stencil=parameters.stencil!==undefined?parameters.stencil:true,_preserveDrawingBuffer=parameters.preserveDrawingBuffer!==undefined?parameters.preserveDrawingBuffer:false,_clearColor=parameters.clearColor!==undefined?new THREE.Color(parameters.clearColor):new THREE.Color(0),_clearAlpha=parameters.clearAlpha!==undefined?parameters.clearAlpha:0;this.domElement=_canvas;this.context=null;this.devicePixelRatio=parameters.devicePixelRatio!==undefined?parameters.devicePixelRatio:window.devicePixelRatio!==undefined?window.devicePixelRatio:1;this.autoClear=true;this.autoClearColor=true;this.autoClearDepth=true;this.autoClearStencil=true;this.sortObjects=true;this.autoUpdateObjects=true;this.autoUpdateScene=true;this.gammaInput=false;this.gammaOutput=false;this.physicallyBasedShading=false;this.shadowMapEnabled=false;this.shadowMapAutoUpdate=true;this.shadowMapType=THREE.PCFShadowMap;this.shadowMapCullFace=THREE.CullFaceFront;this.shadowMapDebug=false;this.shadowMapCascade=false;this.maxMorphTargets=8;this.maxMorphNormals=4;this.autoScaleCubemaps=true;this.renderPluginsPre=[];this.renderPluginsPost=[];this.info={memory:{programs:0,geometries:0,textures:0},render:{calls:0,vertices:0,faces:0,points:0}};var _this=this,_programs=[],_programs_counter=0,_currentProgram=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryGroupHash=null,_currentCamera=null,_geometryGroupCounter=0,_usedTextureUnits=0,_oldDoubleSided=-1,_oldFlipSided=-1,_oldBlending=-1,_oldBlendEquation=-1,_oldBlendSrc=-1,_oldBlendDst=-1,_oldDepthTest=-1,_oldDepthWrite=-1,_oldPolygonOffset=null,_oldPolygonOffsetFactor=null,_oldPolygonOffsetUnits=null,_oldLineWidth=null,_viewportX=0,_viewportY=0,_viewportWidth=0,_viewportHeight=0,_currentWidth=0,_currentHeight=0,_enabledAttributes={},_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_projScreenMatrixPS=new THREE.Matrix4,_vector3=new THREE.Vector3,_direction=new THREE.Vector3,_lightsNeedUpdate=true,_lights={ambient:[0,0,0],directional:{length:0,colors:new Array,positions:new Array},point:{length:0,colors:new Array,positions:new Array,distances:new Array},spot:{length:0,colors:new Array,positions:new Array,distances:new Array,directions:new Array,anglesCos:new Array,exponents:new Array},hemi:{length:0,skyColors:new Array,groundColors:new Array,positions:new Array}};var _gl;var _glExtensionTextureFloat;var _glExtensionStandardDerivatives;var _glExtensionTextureFilterAnisotropic;var _glExtensionCompressedTextureS3TC;initGL();setDefaultGLState();this.context=_gl;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 _maxAnisotropy=_glExtensionTextureFilterAnisotropic?_gl.getParameter(_glExtensionTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0;
var _supportsVertexTextures=_maxVertexTextures>0;var _supportsBoneTextures=_supportsVertexTextures&&_glExtensionTextureFloat;var _compressedTextureFormats=_glExtensionCompressedTextureS3TC?_gl.getParameter(_gl.COMPRESSED_TEXTURE_FORMATS):[];var _vertexShaderPrecisionHighpFloat=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.HIGH_FLOAT);var _vertexShaderPrecisionMediumpFloat=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.MEDIUM_FLOAT);var _vertexShaderPrecisionLowpFloat=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.LOW_FLOAT);var _fragmentShaderPrecisionHighpFloat=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.HIGH_FLOAT);var _fragmentShaderPrecisionMediumpFloat=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.MEDIUM_FLOAT);var _fragmentShaderPrecisionLowpFloat=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.LOW_FLOAT);var _vertexShaderPrecisionHighpInt=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.HIGH_INT);var _vertexShaderPrecisionMediumpInt=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.MEDIUM_INT);var _vertexShaderPrecisionLowpInt=_gl.getShaderPrecisionFormat(_gl.VERTEX_SHADER,_gl.LOW_INT);var _fragmentShaderPrecisionHighpInt=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.HIGH_INT);var _fragmentShaderPrecisionMediumpInt=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.MEDIUM_INT);var _fragmentShaderPrecisionLowpInt=_gl.getShaderPrecisionFormat(_gl.FRAGMENT_SHADER,_gl.LOW_INT);var highpAvailable=_vertexShaderPrecisionHighpFloat.precision>0&&_fragmentShaderPrecisionHighpFloat.precision>0;var mediumpAvailable=_vertexShaderPrecisionMediumpFloat.precision>0&&_fragmentShaderPrecisionMediumpFloat.precision>0;if(_precision==="highp"&&!highpAvailable){if(mediumpAvailable){_precision="mediump";console.warn("WebGLRenderer: highp not supported, using mediump")}else{_precision="lowp";console.warn("WebGLRenderer: highp and mediump not supported, using lowp")}}if(_precision==="mediump"&&!mediumpAvailable){_precision="lowp";console.warn("WebGLRenderer: mediump not supported, using lowp")}this.getContext=function(){return _gl};this.supportsVertexTextures=function(){return _supportsVertexTextures};this.supportsFloatTextures=function(){return _glExtensionTextureFloat};this.supportsStandardDerivatives=function(){return _glExtensionStandardDerivatives};this.supportsCompressedTextureS3TC=function(){return _glExtensionCompressedTextureS3TC};this.getMaxAnisotropy=function(){return _maxAnisotropy};this.getPrecision=function(){return _precision};this.setSize=function(width,height){_canvas.width=width*this.devicePixelRatio;_canvas.height=height*this.devicePixelRatio;_canvas.style.width=width+"px";_canvas.style.height=height+"px";this.setViewport(0,0,_canvas.width,_canvas.height)};this.setViewport=function(x,y,width,height){_viewportX=x!==undefined?x:0;_viewportY=y!==undefined?y:0;_viewportWidth=width!==undefined?width:_canvas.width;_viewportHeight=height!==undefined?height:_canvas.height;_gl.viewport(_viewportX,_viewportY,_viewportWidth,_viewportHeight)};this.setScissor=function(x,y,width,height){_gl.scissor(x,y,width,height)};this.enableScissorTest=function(enable){enable?_gl.enable(_gl.SCISSOR_TEST):_gl.disable(_gl.SCISSOR_TEST)};this.setClearColorHex=function(hex,alpha){_clearColor.setHex(hex);_clearAlpha=alpha;_gl.clearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)};this.setClearColor=function(color,alpha){_clearColor.copy(color);_clearAlpha=alpha;_gl.clearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)};this.getClearColor=function(){return _clearColor};this.getClearAlpha=function(){return _clearAlpha};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.clearTarget=function(renderTarget,color,depth,stencil){this.setRenderTarget(renderTarget);this.clear(color,depth,stencil)};this.addPostPlugin=function(plugin){plugin.init(this);this.renderPluginsPost.push(plugin)};this.addPrePlugin=function(plugin){plugin.init(this);this.renderPluginsPre.push(plugin)};this.updateShadowMap=function(scene,camera){_currentProgram=null;_oldBlending=-1;_oldDepthTest=-1;_oldDepthWrite=-1;_currentGeometryGroupHash=-1;_currentMaterialId=-1;_lightsNeedUpdate=true;_oldDoubleSided=-1;_oldFlipSided=-1;this.shadowMapPlugin.update(scene,camera)};function createParticleBuffers(geometry){geometry.__webglVertexBuffer=_gl.createBuffer();geometry.__webglColorBuffer=_gl.createBuffer();_this.info.memory.geometries++}function createLineBuffers(geometry){geometry.__webglVertexBuffer=_gl.createBuffer();geometry.__webglColorBuffer=_gl.createBuffer();geometry.__webglLineDistanceBuffer=_gl.createBuffer();_this.info.memory.geometries++}function createRibbonBuffers(geometry){geometry.__webglVertexBuffer=_gl.createBuffer();geometry.__webglColorBuffer=_gl.createBuffer();geometry.__webglNormalBuffer=_gl.createBuffer();_this.info.memory.geometries++}function createMeshBuffers(geometryGroup){geometryGroup.__webglVertexBuffer=_gl.createBuffer();geometryGroup.__webglNormalBuffer=_gl.createBuffer();geometryGroup.__webglTangentBuffer=_gl.createBuffer();geometryGroup.__webglColorBuffer=_gl.createBuffer();geometryGroup.__webglUVBuffer=_gl.createBuffer();geometryGroup.__webglUV2Buffer=_gl.createBuffer();geometryGroup.__webglSkinIndicesBuffer=_gl.createBuffer();geometryGroup.__webglSkinWeightsBuffer=_gl.createBuffer();geometryGroup.__webglFaceBuffer=_gl.createBuffer();geometryGroup.__webglLineBuffer=_gl.createBuffer();var m,ml;if(geometryGroup.numMorphTargets){geometryGroup.__webglMorphTargetsBuffers=[];for(m=0,ml=geometryGroup.numMorphTargets;m<ml;m++){geometryGroup.__webglMorphTargetsBuffers.push(_gl.createBuffer())}}if(geometryGroup.numMorphNormals){geometryGroup.__webglMorphNormalsBuffers=[];for(m=0,ml=geometryGroup.numMorphNormals;m<ml;m++){geometryGroup.__webglMorphNormalsBuffers.push(_gl.createBuffer())}}_this.info.memory.geometries++}var onGeometryDispose=function(event){var geometry=event.target;geometry.removeEventListener("dispose",onGeometryDispose);deallocateGeometry(geometry);_this.info.memory.geometries--};var onTextureDispose=function(event){var texture=event.target;texture.removeEventListener("dispose",onTextureDispose);deallocateTexture(texture);_this.info.memory.textures--};var onRenderTargetDispose=function(event){var renderTarget=event.target;renderTarget.removeEventListener("dispose",onRenderTargetDispose);deallocateRenderTarget(renderTarget);_this.info.memory.textures--};var onMaterialDispose=function(event){var material=event.target;material.removeEventListener("dispose",onMaterialDispose);deallocateMaterial(material)};var deallocateGeometry=function(geometry){geometry.__webglInit=undefined;if(geometry.__webglVertexBuffer!==undefined)_gl.deleteBuffer(geometry.__webglVertexBuffer);if(geometry.__webglNormalBuffer!==undefined)_gl.deleteBuffer(geometry.__webglNormalBuffer);if(geometry.__webglTangentBuffer!==undefined)_gl.deleteBuffer(geometry.__webglTangentBuffer);if(geometry.__webglColorBuffer!==undefined)_gl.deleteBuffer(geometry.__webglColorBuffer);if(geometry.__webglUVBuffer!==undefined)_gl.deleteBuffer(geometry.__webglUVBuffer);if(geometry.__webglUV2Buffer!==undefined)_gl.deleteBuffer(geometry.__webglUV2Buffer);if(geometry.__webglSkinIndicesBuffer!==undefined)_gl.deleteBuffer(geometry.__webglSkinIndicesBuffer);if(geometry.__webglSkinWeightsBuffer!==undefined)_gl.deleteBuffer(geometry.__webglSkinWeightsBuffer);if(geometry.__webglFaceBuffer!==undefined)_gl.deleteBuffer(geometry.__webglFaceBuffer);if(geometry.__webglLineBuffer!==undefined)_gl.deleteBuffer(geometry.__webglLineBuffer);if(geometry.__webglLineDistanceBuffer!==undefined)_gl.deleteBuffer(geometry.__webglLineDistanceBuffer);if(geometry.geometryGroups!==undefined){for(var g in geometry.geometryGroups){var geometryGroup=geometry.geometryGroups[g];if(geometryGroup.numMorphTargets!==undefined){for(var m=0,ml=geometryGroup.numMorphTargets;m<ml;m++){_gl.deleteBuffer(geometryGroup.__webglMorphTargetsBuffers[m])}}if(geometryGroup.numMorphNormals!==undefined){for(var m=0,ml=geometryGroup.numMorphNormals;m<ml;m++){_gl.deleteBuffer(geometryGroup.__webglMorphNormalsBuffers[m])}}deleteCustomAttributesBuffers(geometryGroup)}}deleteCustomAttributesBuffers(geometry)};var deallocateTexture=function(texture){if(texture.image&&texture.image.__webglTextureCube){_gl.deleteTexture(texture.image.__webglTextureCube)}else{if(!texture.__webglInit)return;texture.__webglInit=false;_gl.deleteTexture(texture.__webglTexture)}};var deallocateRenderTarget=function(renderTarget){if(!renderTarget||!renderTarget.__webglTexture)return;_gl.deleteTexture(renderTarget.__webglTexture);if(renderTarget instanceof THREE.WebGLRenderTargetCube){for(var i=0;i<6;i++){_gl.deleteFramebuffer(renderTarget.__webglFramebuffer[i]);_gl.deleteRenderbuffer(renderTarget.__webglRenderbuffer[i])}}else{_gl.deleteFramebuffer(renderTarget.__webglFramebuffer);_gl.deleteRenderbuffer(renderTarget.__webglRenderbuffer)}};var deallocateMaterial=function(material){var program=material.program;if(program===undefined)return;material.program=undefined;var i,il,programInfo;var deleteProgram=false;for(i=0,il=_programs.length;i<il;i++){programInfo=_programs[i];if(programInfo.program===program){programInfo.usedTimes--;if(programInfo.usedTimes===0){deleteProgram=true}break}}if(deleteProgram===true){var newPrograms=[];for(i=0,il=_programs.length;i<il;i++){programInfo=_programs[i];if(programInfo.program!==program){newPrograms.push(programInfo)}}_programs=newPrograms;_gl.deleteProgram(program);_this.info.memory.programs--}};function deleteCustomAttributesBuffers(geometry){if(geometry.__webglCustomAttributesList){for(var id in geometry.__webglCustomAttributesList){_gl.deleteBuffer(geometry.__webglCustomAttributesList[id].buffer)}}}function initCustomAttributes(geometry,object){var nvertices=geometry.vertices.length;var material=object.material;if(material.attributes){if(geometry.__webglCustomAttributesList===undefined){geometry.__webglCustomAttributesList=[]}for(var a in material.attributes){var attribute=material.attributes[a];if(!attribute.__webglInitialized||attribute.createUniqueBuffers){attribute.__webglInitialized=true;var size=1;if(attribute.type==="v2")size=2;else if(attribute.type==="v3")size=3;else if(attribute.type==="v4")size=4;else if(attribute.type==="c")size=3;attribute.size=size;attribute.array=new Float32Array(nvertices*size);attribute.buffer=_gl.createBuffer();attribute.buffer.belongsToAttribute=a;attribute.needsUpdate=true}geometry.__webglCustomAttributesList.push(attribute)}}}function initParticleBuffers(geometry,object){var nvertices=geometry.vertices.length;geometry.__vertexArray=new Float32Array(nvertices*3);geometry.__colorArray=new Float32Array(nvertices*3);geometry.__sortArray=[];geometry.__webglParticleCount=nvertices;initCustomAttributes(geometry,object)}function initLineBuffers(geometry,object){var nvertices=geometry.vertices.length;geometry.__vertexArray=new Float32Array(nvertices*3);geometry.__colorArray=new Float32Array(nvertices*3);geometry.__lineDistanceArray=new Float32Array(nvertices*1);geometry.__webglLineCount=nvertices;initCustomAttributes(geometry,object)}function initRibbonBuffers(geometry,object){var nvertices=geometry.vertices.length;geometry.__vertexArray=new Float32Array(nvertices*3);geometry.__colorArray=new Float32Array(nvertices*3);geometry.__normalArray=new Float32Array(nvertices*3);geometry.__webglVertexCount=nvertices;initCustomAttributes(geometry,object)}function initMeshBuffers(geometryGroup,object){var geometry=object.geometry,faces3=geometryGroup.faces3,faces4=geometryGroup.faces4,nvertices=faces3.length*3+faces4.length*4,ntris=faces3.length*1+faces4.length*2,nlines=faces3.length*3+faces4.length*4,material=getBufferMaterial(object,geometryGroup),uvType=bufferGuessUVType(material),normalType=bufferGuessNormalType(material),vertexColorType=bufferGuessVertexColorType(material);geometryGroup.__vertexArray=new Float32Array(nvertices*3);if(normalType){geometryGroup.__normalArray=new Float32Array(nvertices*3)}if(geometry.hasTangents){geometryGroup.__tangentArray=new Float32Array(nvertices*4)}if(vertexColorType){geometryGroup.__colorArray=new Float32Array(nvertices*3)}if(uvType){if(geometry.faceUvs.length>0||geometry.faceVertexUvs.length>0){geometryGroup.__uvArray=new Float32Array(nvertices*2)}if(geometry.faceUvs.length>1||geometry.faceVertexUvs.length>1){geometryGroup.__uv2Array=new Float32Array(nvertices*2)}}if(object.geometry.skinWeights.length&&object.geometry.skinIndices.length){geometryGroup.__skinIndexArray=new Float32Array(nvertices*4);geometryGroup.__skinWeightArray=new Float32Array(nvertices*4)}geometryGroup.__faceArray=new Uint16Array(ntris*3);geometryGroup.__lineArray=new Uint16Array(nlines*2);var m,ml;if(geometryGroup.numMorphTargets){geometryGroup.__morphTargetsArrays=[];for(m=0,ml=geometryGroup.numMorphTargets;m<ml;m++){geometryGroup.__morphTargetsArrays.push(new Float32Array(nvertices*3))}}if(geometryGroup.numMorphNormals){geometryGroup.__morphNormalsArrays=[];for(m=0,ml=geometryGroup.numMorphNormals;m<ml;m++){geometryGroup.__morphNormalsArrays.push(new Float32Array(nvertices*3))}}geometryGroup.__webglFaceCount=ntris*3;geometryGroup.__webglLineCount=nlines*2;if(material.attributes){if(geometryGroup.__webglCustomAttributesList===undefined){geometryGroup.__webglCustomAttributesList=[]}for(var a in material.attributes){var originalAttribute=material.attributes[a];var attribute={};for(var property in originalAttribute){attribute[property]=originalAttribute[property]}if(!attribute.__webglInitialized||attribute.createUniqueBuffers){attribute.__webglInitialized=true;var size=1;if(attribute.type==="v2")size=2;else if(attribute.type==="v3")size=3;else if(attribute.type==="v4")size=4;else if(attribute.type==="c")size=3;attribute.size=size;attribute.array=new Float32Array(nvertices*size);attribute.buffer=_gl.createBuffer();attribute.buffer.belongsToAttribute=a;originalAttribute.needsUpdate=true;attribute.__original=originalAttribute}geometryGroup.__webglCustomAttributesList.push(attribute)}}geometryGroup.__inittedArrays=true}function getBufferMaterial(object,geometryGroup){return object.material instanceof THREE.MeshFaceMaterial?object.material.materials[geometryGroup.materialIndex]:object.material}function materialNeedsSmoothNormals(material){return material&&material.shading!==undefined&&material.shading===THREE.SmoothShading}function bufferGuessNormalType(material){if(material instanceof THREE.MeshBasicMaterial&&!material.envMap||material instanceof THREE.MeshDepthMaterial){return false}if(materialNeedsSmoothNormals(material)){return THREE.SmoothShading}else{return THREE.FlatShading}}function bufferGuessVertexColorType(material){if(material.vertexColors){return material.vertexColors}return false}function bufferGuessUVType(material){if(material.map||material.lightMap||material.bumpMap||material.normalMap||material.specularMap||material instanceof THREE.ShaderMaterial){return true}return false}function initDirectBuffers(geometry){var a,attribute,type;for(a in geometry.attributes){if(a==="index"){type=_gl.ELEMENT_ARRAY_BUFFER}else{type=_gl.ARRAY_BUFFER}attribute=geometry.attributes[a];attribute.buffer=_gl.createBuffer();_gl.bindBuffer(type,attribute.buffer);_gl.bufferData(type,attribute.array,_gl.STATIC_DRAW)}}function setParticleBuffers(geometry,hint,object){var v,c,vertex,offset,index,color,vertices=geometry.vertices,vl=vertices.length,colors=geometry.colors,cl=colors.length,vertexArray=geometry.__vertexArray,colorArray=geometry.__colorArray,sortArray=geometry.__sortArray,dirtyVertices=geometry.verticesNeedUpdate,dirtyElements=geometry.elementsNeedUpdate,dirtyColors=geometry.colorsNeedUpdate,customAttributes=geometry.__webglCustomAttributesList,i,il,a,ca,cal,value,customAttribute;if(object.sortParticles){_projScreenMatrixPS.copy(_projScreenMatrix);_projScreenMatrixPS.multiply(object.matrixWorld);for(v=0;v<vl;v++){vertex=vertices[v];_vector3.copy(vertex);_vector3.applyProjection(_projScreenMatrixPS);sortArray[v]=[_vector3.z,v]}sortArray.sort(numericalSort);for(v=0;v<vl;v++){vertex=vertices[sortArray[v][1]];offset=v*3;vertexArray[offset]=vertex.x;vertexArray[offset+1]=vertex.y;vertexArray[offset+2]=vertex.z}for(c=0;c<cl;c++){offset=c*3;color=colors[sortArray[c][1]];colorArray[offset]=color.r;colorArray[offset+1]=color.g;colorArray[offset+2]=color.b}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(!(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices"))continue;offset=0;cal=customAttribute.value.length;if(customAttribute.size===1){for(ca=0;ca<cal;ca++){index=sortArray[ca][1];customAttribute.array[ca]=customAttribute.value[index]}}else if(customAttribute.size===2){for(ca=0;ca<cal;ca++){index=sortArray[ca][1];value=customAttribute.value[index];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;offset+=2}}else if(customAttribute.size===3){if(customAttribute.type==="c"){for(ca=0;ca<cal;ca++){index=sortArray[ca][1];value=customAttribute.value[index];customAttribute.array[offset]=value.r;customAttribute.array[offset+1]=value.g;customAttribute.array[offset+2]=value.b;offset+=3}}else{for(ca=0;ca<cal;ca++){index=sortArray[ca][1];value=customAttribute.value[index];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;offset+=3}}}else if(customAttribute.size===4){for(ca=0;ca<cal;ca++){index=sortArray[ca][1];value=customAttribute.value[index];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;customAttribute.array[offset+3]=value.w;offset+=4}}}}}else{if(dirtyVertices){for(v=0;v<vl;v++){vertex=vertices[v];offset=v*3;vertexArray[offset]=vertex.x;vertexArray[offset+1]=vertex.y;vertexArray[offset+2]=vertex.z}}if(dirtyColors){for(c=0;c<cl;c++){color=colors[c];offset=c*3;colorArray[offset]=color.r;colorArray[offset+1]=color.g;colorArray[offset+2]=color.b}}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(customAttribute.needsUpdate&&(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices")){cal=customAttribute.value.length;offset=0;if(customAttribute.size===1){for(ca=0;ca<cal;ca++){customAttribute.array[ca]=customAttribute.value[ca]}}else if(customAttribute.size===2){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;offset+=2}}else if(customAttribute.size===3){if(customAttribute.type==="c"){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.r;customAttribute.array[offset+1]=value.g;customAttribute.array[offset+2]=value.b;offset+=3}}else{for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;offset+=3}}}else if(customAttribute.size===4){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;customAttribute.array[offset+3]=value.w;offset+=4}}}}}}if(dirtyVertices||object.sortParticles){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglVertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,vertexArray,hint)}if(dirtyColors||object.sortParticles){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglColorBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,colorArray,hint)}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(customAttribute.needsUpdate||object.sortParticles){_gl.bindBuffer(_gl.ARRAY_BUFFER,customAttribute.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,customAttribute.array,hint)}}}}function setLineBuffers(geometry,hint){var v,c,d,vertex,offset,color,vertices=geometry.vertices,colors=geometry.colors,lineDistances=geometry.lineDistances,vl=vertices.length,cl=colors.length,dl=lineDistances.length,vertexArray=geometry.__vertexArray,colorArray=geometry.__colorArray,lineDistanceArray=geometry.__lineDistanceArray,dirtyVertices=geometry.verticesNeedUpdate,dirtyColors=geometry.colorsNeedUpdate,dirtyLineDistances=geometry.lineDistancesNeedUpdate,customAttributes=geometry.__webglCustomAttributesList,i,il,a,ca,cal,value,customAttribute;if(dirtyVertices){for(v=0;v<vl;v++){vertex=vertices[v];offset=v*3;vertexArray[offset]=vertex.x;vertexArray[offset+1]=vertex.y;vertexArray[offset+2]=vertex.z}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglVertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,vertexArray,hint)}if(dirtyColors){for(c=0;c<cl;c++){color=colors[c];offset=c*3;colorArray[offset]=color.r;colorArray[offset+1]=color.g;colorArray[offset+2]=color.b}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglColorBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,colorArray,hint)}if(dirtyLineDistances){for(d=0;d<dl;d++){lineDistanceArray[d]=lineDistances[d]}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglLineDistanceBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,lineDistanceArray,hint)}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(customAttribute.needsUpdate&&(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices")){offset=0;cal=customAttribute.value.length;if(customAttribute.size===1){for(ca=0;ca<cal;ca++){customAttribute.array[ca]=customAttribute.value[ca]}}else if(customAttribute.size===2){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;offset+=2}}else if(customAttribute.size===3){if(customAttribute.type==="c"){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.r;customAttribute.array[offset+1]=value.g;customAttribute.array[offset+2]=value.b;offset+=3}}else{for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;offset+=3}}}else if(customAttribute.size===4){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;customAttribute.array[offset+3]=value.w;offset+=4}}_gl.bindBuffer(_gl.ARRAY_BUFFER,customAttribute.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,customAttribute.array,hint)}}}}function setRibbonBuffers(geometry,hint){var v,c,n,vertex,offset,color,normal,i,il,ca,cal,customAttribute,value,vertices=geometry.vertices,colors=geometry.colors,normals=geometry.normals,vl=vertices.length,cl=colors.length,nl=normals.length,vertexArray=geometry.__vertexArray,colorArray=geometry.__colorArray,normalArray=geometry.__normalArray,dirtyVertices=geometry.verticesNeedUpdate,dirtyColors=geometry.colorsNeedUpdate,dirtyNormals=geometry.normalsNeedUpdate,customAttributes=geometry.__webglCustomAttributesList;if(dirtyVertices){for(v=0;v<vl;v++){vertex=vertices[v];offset=v*3;vertexArray[offset]=vertex.x;vertexArray[offset+1]=vertex.y;vertexArray[offset+2]=vertex.z}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglVertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,vertexArray,hint)}if(dirtyColors){for(c=0;c<cl;c++){color=colors[c];offset=c*3;colorArray[offset]=color.r;colorArray[offset+1]=color.g;colorArray[offset+2]=color.b}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglColorBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,colorArray,hint)}if(dirtyNormals){for(n=0;n<nl;n++){normal=normals[n];offset=n*3;normalArray[offset]=normal.x;normalArray[offset+1]=normal.y;normalArray[offset+2]=normal.z}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometry.__webglNormalBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,normalArray,hint)}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(customAttribute.needsUpdate&&(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices")){offset=0;cal=customAttribute.value.length;if(customAttribute.size===1){for(ca=0;ca<cal;ca++){customAttribute.array[ca]=customAttribute.value[ca]}}else if(customAttribute.size===2){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;offset+=2}}else if(customAttribute.size===3){if(customAttribute.type==="c"){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.r;customAttribute.array[offset+1]=value.g;customAttribute.array[offset+2]=value.b;offset+=3}}else{for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;offset+=3}}}else if(customAttribute.size===4){for(ca=0;ca<cal;ca++){value=customAttribute.value[ca];customAttribute.array[offset]=value.x;customAttribute.array[offset+1]=value.y;customAttribute.array[offset+2]=value.z;customAttribute.array[offset+3]=value.w;offset+=4}}_gl.bindBuffer(_gl.ARRAY_BUFFER,customAttribute.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,customAttribute.array,hint)}}}}function setMeshBuffers(geometryGroup,object,hint,dispose,material){if(!geometryGroup.__inittedArrays){return}var normalType=bufferGuessNormalType(material),vertexColorType=bufferGuessVertexColorType(material),uvType=bufferGuessUVType(material),needsSmoothNormals=normalType===THREE.SmoothShading;var f,fl,fi,face,vertexNormals,faceNormal,normal,vertexColors,faceColor,vertexTangents,uv,uv2,v1,v2,v3,v4,t1,t2,t3,t4,n1,n2,n3,n4,c1,c2,c3,c4,sw1,sw2,sw3,sw4,si1,si2,si3,si4,sa1,sa2,sa3,sa4,sb1,sb2,sb3,sb4,m,ml,i,il,vn,uvi,uv2i,vk,vkl,vka,nka,chf,faceVertexNormals,a,vertexIndex=0,offset=0,offset_uv=0,offset_uv2=0,offset_face=0,offset_normal=0,offset_tangent=0,offset_line=0,offset_color=0,offset_skin=0,offset_morphTarget=0,offset_custom=0,offset_customSrc=0,value,vertexArray=geometryGroup.__vertexArray,uvArray=geometryGroup.__uvArray,uv2Array=geometryGroup.__uv2Array,normalArray=geometryGroup.__normalArray,tangentArray=geometryGroup.__tangentArray,colorArray=geometryGroup.__colorArray,skinIndexArray=geometryGroup.__skinIndexArray,skinWeightArray=geometryGroup.__skinWeightArray,morphTargetsArrays=geometryGroup.__morphTargetsArrays,morphNormalsArrays=geometryGroup.__morphNormalsArrays,customAttributes=geometryGroup.__webglCustomAttributesList,customAttribute,faceArray=geometryGroup.__faceArray,lineArray=geometryGroup.__lineArray,geometry=object.geometry,dirtyVertices=geometry.verticesNeedUpdate,dirtyElements=geometry.elementsNeedUpdate,dirtyUvs=geometry.uvsNeedUpdate,dirtyNormals=geometry.normalsNeedUpdate,dirtyTangents=geometry.tangentsNeedUpdate,dirtyColors=geometry.colorsNeedUpdate,dirtyMorphTargets=geometry.morphTargetsNeedUpdate,vertices=geometry.vertices,chunk_faces3=geometryGroup.faces3,chunk_faces4=geometryGroup.faces4,obj_faces=geometry.faces,obj_uvs=geometry.faceVertexUvs[0],obj_uvs2=geometry.faceVertexUvs[1],obj_colors=geometry.colors,obj_skinIndices=geometry.skinIndices,obj_skinWeights=geometry.skinWeights,morphTargets=geometry.morphTargets,morphNormals=geometry.morphNormals;if(dirtyVertices){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];v1=vertices[face.a];v2=vertices[face.b];v3=vertices[face.c];vertexArray[offset]=v1.x;vertexArray[offset+1]=v1.y;vertexArray[offset+2]=v1.z;vertexArray[offset+3]=v2.x;vertexArray[offset+4]=v2.y;vertexArray[offset+5]=v2.z;vertexArray[offset+6]=v3.x;vertexArray[offset+7]=v3.y;vertexArray[offset+8]=v3.z;offset+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];v1=vertices[face.a];v2=vertices[face.b];v3=vertices[face.c];v4=vertices[face.d];vertexArray[offset]=v1.x;vertexArray[offset+1]=v1.y;vertexArray[offset+2]=v1.z;vertexArray[offset+3]=v2.x;vertexArray[offset+4]=v2.y;vertexArray[offset+5]=v2.z;vertexArray[offset+6]=v3.x;vertexArray[offset+7]=v3.y;vertexArray[offset+8]=v3.z;vertexArray[offset+9]=v4.x;vertexArray[offset+10]=v4.y;vertexArray[offset+11]=v4.z;offset+=12}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglVertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,vertexArray,hint)}if(dirtyMorphTargets){for(vk=0,vkl=morphTargets.length;vk<vkl;vk++){offset_morphTarget=0;for(f=0,fl=chunk_faces3.length;f<fl;f++){chf=chunk_faces3[f];face=obj_faces[chf];v1=morphTargets[vk].vertices[face.a];v2=morphTargets[vk].vertices[face.b];v3=morphTargets[vk].vertices[face.c];vka=morphTargetsArrays[vk];vka[offset_morphTarget]=v1.x;vka[offset_morphTarget+1]=v1.y;vka[offset_morphTarget+2]=v1.z;vka[offset_morphTarget+3]=v2.x;vka[offset_morphTarget+4]=v2.y;vka[offset_morphTarget+5]=v2.z;vka[offset_morphTarget+6]=v3.x;vka[offset_morphTarget+7]=v3.y;vka[offset_morphTarget+8]=v3.z;if(material.morphNormals){if(needsSmoothNormals){faceVertexNormals=morphNormals[vk].vertexNormals[chf];n1=faceVertexNormals.a;n2=faceVertexNormals.b;n3=faceVertexNormals.c}else{n1=morphNormals[vk].faceNormals[chf];n2=n1;n3=n1}nka=morphNormalsArrays[vk];nka[offset_morphTarget]=n1.x;nka[offset_morphTarget+1]=n1.y;nka[offset_morphTarget+2]=n1.z;nka[offset_morphTarget+3]=n2.x;nka[offset_morphTarget+4]=n2.y;nka[offset_morphTarget+5]=n2.z;nka[offset_morphTarget+6]=n3.x;nka[offset_morphTarget+7]=n3.y;nka[offset_morphTarget+8]=n3.z}offset_morphTarget+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){chf=chunk_faces4[f];face=obj_faces[chf];v1=morphTargets[vk].vertices[face.a];v2=morphTargets[vk].vertices[face.b];v3=morphTargets[vk].vertices[face.c];v4=morphTargets[vk].vertices[face.d];vka=morphTargetsArrays[vk];vka[offset_morphTarget]=v1.x;vka[offset_morphTarget+1]=v1.y;vka[offset_morphTarget+2]=v1.z;vka[offset_morphTarget+3]=v2.x;vka[offset_morphTarget+4]=v2.y;vka[offset_morphTarget+5]=v2.z;vka[offset_morphTarget+6]=v3.x;vka[offset_morphTarget+7]=v3.y;vka[offset_morphTarget+8]=v3.z;vka[offset_morphTarget+9]=v4.x;vka[offset_morphTarget+10]=v4.y;vka[offset_morphTarget+11]=v4.z;if(material.morphNormals){if(needsSmoothNormals){faceVertexNormals=morphNormals[vk].vertexNormals[chf];n1=faceVertexNormals.a;n2=faceVertexNormals.b;n3=faceVertexNormals.c;n4=faceVertexNormals.d}else{n1=morphNormals[vk].faceNormals[chf];n2=n1;n3=n1;n4=n1}nka=morphNormalsArrays[vk];nka[offset_morphTarget]=n1.x;nka[offset_morphTarget+1]=n1.y;nka[offset_morphTarget+2]=n1.z;nka[offset_morphTarget+3]=n2.x;nka[offset_morphTarget+4]=n2.y;nka[offset_morphTarget+5]=n2.z;nka[offset_morphTarget+6]=n3.x;nka[offset_morphTarget+7]=n3.y;nka[offset_morphTarget+8]=n3.z;nka[offset_morphTarget+9]=n4.x;nka[offset_morphTarget+10]=n4.y;nka[offset_morphTarget+11]=n4.z}offset_morphTarget+=12}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphTargetsBuffers[vk]);_gl.bufferData(_gl.ARRAY_BUFFER,morphTargetsArrays[vk],hint);if(material.morphNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphNormalsBuffers[vk]);_gl.bufferData(_gl.ARRAY_BUFFER,morphNormalsArrays[vk],hint)}}}if(obj_skinWeights.length){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];sw1=obj_skinWeights[face.a];sw2=obj_skinWeights[face.b];sw3=obj_skinWeights[face.c];skinWeightArray[offset_skin]=sw1.x;skinWeightArray[offset_skin+1]=sw1.y;skinWeightArray[offset_skin+2]=sw1.z;skinWeightArray[offset_skin+3]=sw1.w;skinWeightArray[offset_skin+4]=sw2.x;skinWeightArray[offset_skin+5]=sw2.y;skinWeightArray[offset_skin+6]=sw2.z;skinWeightArray[offset_skin+7]=sw2.w;skinWeightArray[offset_skin+8]=sw3.x;skinWeightArray[offset_skin+9]=sw3.y;skinWeightArray[offset_skin+10]=sw3.z;skinWeightArray[offset_skin+11]=sw3.w;si1=obj_skinIndices[face.a];si2=obj_skinIndices[face.b];si3=obj_skinIndices[face.c];skinIndexArray[offset_skin]=si1.x;skinIndexArray[offset_skin+1]=si1.y;skinIndexArray[offset_skin+2]=si1.z;skinIndexArray[offset_skin+3]=si1.w;skinIndexArray[offset_skin+4]=si2.x;skinIndexArray[offset_skin+5]=si2.y;skinIndexArray[offset_skin+6]=si2.z;skinIndexArray[offset_skin+7]=si2.w;
skinIndexArray[offset_skin+8]=si3.x;skinIndexArray[offset_skin+9]=si3.y;skinIndexArray[offset_skin+10]=si3.z;skinIndexArray[offset_skin+11]=si3.w;offset_skin+=12}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];sw1=obj_skinWeights[face.a];sw2=obj_skinWeights[face.b];sw3=obj_skinWeights[face.c];sw4=obj_skinWeights[face.d];skinWeightArray[offset_skin]=sw1.x;skinWeightArray[offset_skin+1]=sw1.y;skinWeightArray[offset_skin+2]=sw1.z;skinWeightArray[offset_skin+3]=sw1.w;skinWeightArray[offset_skin+4]=sw2.x;skinWeightArray[offset_skin+5]=sw2.y;skinWeightArray[offset_skin+6]=sw2.z;skinWeightArray[offset_skin+7]=sw2.w;skinWeightArray[offset_skin+8]=sw3.x;skinWeightArray[offset_skin+9]=sw3.y;skinWeightArray[offset_skin+10]=sw3.z;skinWeightArray[offset_skin+11]=sw3.w;skinWeightArray[offset_skin+12]=sw4.x;skinWeightArray[offset_skin+13]=sw4.y;skinWeightArray[offset_skin+14]=sw4.z;skinWeightArray[offset_skin+15]=sw4.w;si1=obj_skinIndices[face.a];si2=obj_skinIndices[face.b];si3=obj_skinIndices[face.c];si4=obj_skinIndices[face.d];skinIndexArray[offset_skin]=si1.x;skinIndexArray[offset_skin+1]=si1.y;skinIndexArray[offset_skin+2]=si1.z;skinIndexArray[offset_skin+3]=si1.w;skinIndexArray[offset_skin+4]=si2.x;skinIndexArray[offset_skin+5]=si2.y;skinIndexArray[offset_skin+6]=si2.z;skinIndexArray[offset_skin+7]=si2.w;skinIndexArray[offset_skin+8]=si3.x;skinIndexArray[offset_skin+9]=si3.y;skinIndexArray[offset_skin+10]=si3.z;skinIndexArray[offset_skin+11]=si3.w;skinIndexArray[offset_skin+12]=si4.x;skinIndexArray[offset_skin+13]=si4.y;skinIndexArray[offset_skin+14]=si4.z;skinIndexArray[offset_skin+15]=si4.w;offset_skin+=16}if(offset_skin>0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglSkinIndicesBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,skinIndexArray,hint);_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglSkinWeightsBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,skinWeightArray,hint)}}if(dirtyColors&&vertexColorType){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];vertexColors=face.vertexColors;faceColor=face.color;if(vertexColors.length===3&&vertexColorType===THREE.VertexColors){c1=vertexColors[0];c2=vertexColors[1];c3=vertexColors[2]}else{c1=faceColor;c2=faceColor;c3=faceColor}colorArray[offset_color]=c1.r;colorArray[offset_color+1]=c1.g;colorArray[offset_color+2]=c1.b;colorArray[offset_color+3]=c2.r;colorArray[offset_color+4]=c2.g;colorArray[offset_color+5]=c2.b;colorArray[offset_color+6]=c3.r;colorArray[offset_color+7]=c3.g;colorArray[offset_color+8]=c3.b;offset_color+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];vertexColors=face.vertexColors;faceColor=face.color;if(vertexColors.length===4&&vertexColorType===THREE.VertexColors){c1=vertexColors[0];c2=vertexColors[1];c3=vertexColors[2];c4=vertexColors[3]}else{c1=faceColor;c2=faceColor;c3=faceColor;c4=faceColor}colorArray[offset_color]=c1.r;colorArray[offset_color+1]=c1.g;colorArray[offset_color+2]=c1.b;colorArray[offset_color+3]=c2.r;colorArray[offset_color+4]=c2.g;colorArray[offset_color+5]=c2.b;colorArray[offset_color+6]=c3.r;colorArray[offset_color+7]=c3.g;colorArray[offset_color+8]=c3.b;colorArray[offset_color+9]=c4.r;colorArray[offset_color+10]=c4.g;colorArray[offset_color+11]=c4.b;offset_color+=12}if(offset_color>0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglColorBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,colorArray,hint)}}if(dirtyTangents&&geometry.hasTangents){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];vertexTangents=face.vertexTangents;t1=vertexTangents[0];t2=vertexTangents[1];t3=vertexTangents[2];tangentArray[offset_tangent]=t1.x;tangentArray[offset_tangent+1]=t1.y;tangentArray[offset_tangent+2]=t1.z;tangentArray[offset_tangent+3]=t1.w;tangentArray[offset_tangent+4]=t2.x;tangentArray[offset_tangent+5]=t2.y;tangentArray[offset_tangent+6]=t2.z;tangentArray[offset_tangent+7]=t2.w;tangentArray[offset_tangent+8]=t3.x;tangentArray[offset_tangent+9]=t3.y;tangentArray[offset_tangent+10]=t3.z;tangentArray[offset_tangent+11]=t3.w;offset_tangent+=12}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];vertexTangents=face.vertexTangents;t1=vertexTangents[0];t2=vertexTangents[1];t3=vertexTangents[2];t4=vertexTangents[3];tangentArray[offset_tangent]=t1.x;tangentArray[offset_tangent+1]=t1.y;tangentArray[offset_tangent+2]=t1.z;tangentArray[offset_tangent+3]=t1.w;tangentArray[offset_tangent+4]=t2.x;tangentArray[offset_tangent+5]=t2.y;tangentArray[offset_tangent+6]=t2.z;tangentArray[offset_tangent+7]=t2.w;tangentArray[offset_tangent+8]=t3.x;tangentArray[offset_tangent+9]=t3.y;tangentArray[offset_tangent+10]=t3.z;tangentArray[offset_tangent+11]=t3.w;tangentArray[offset_tangent+12]=t4.x;tangentArray[offset_tangent+13]=t4.y;tangentArray[offset_tangent+14]=t4.z;tangentArray[offset_tangent+15]=t4.w;offset_tangent+=16}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglTangentBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,tangentArray,hint)}if(dirtyNormals&&normalType){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];vertexNormals=face.vertexNormals;faceNormal=face.normal;if(vertexNormals.length===3&&needsSmoothNormals){for(i=0;i<3;i++){vn=vertexNormals[i];normalArray[offset_normal]=vn.x;normalArray[offset_normal+1]=vn.y;normalArray[offset_normal+2]=vn.z;offset_normal+=3}}else{for(i=0;i<3;i++){normalArray[offset_normal]=faceNormal.x;normalArray[offset_normal+1]=faceNormal.y;normalArray[offset_normal+2]=faceNormal.z;offset_normal+=3}}}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];vertexNormals=face.vertexNormals;faceNormal=face.normal;if(vertexNormals.length===4&&needsSmoothNormals){for(i=0;i<4;i++){vn=vertexNormals[i];normalArray[offset_normal]=vn.x;normalArray[offset_normal+1]=vn.y;normalArray[offset_normal+2]=vn.z;offset_normal+=3}}else{for(i=0;i<4;i++){normalArray[offset_normal]=faceNormal.x;normalArray[offset_normal+1]=faceNormal.y;normalArray[offset_normal+2]=faceNormal.z;offset_normal+=3}}}_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglNormalBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,normalArray,hint)}if(dirtyUvs&&obj_uvs&&uvType){for(f=0,fl=chunk_faces3.length;f<fl;f++){fi=chunk_faces3[f];uv=obj_uvs[fi];if(uv===undefined)continue;for(i=0;i<3;i++){uvi=uv[i];uvArray[offset_uv]=uvi.x;uvArray[offset_uv+1]=uvi.y;offset_uv+=2}}for(f=0,fl=chunk_faces4.length;f<fl;f++){fi=chunk_faces4[f];uv=obj_uvs[fi];if(uv===undefined)continue;for(i=0;i<4;i++){uvi=uv[i];uvArray[offset_uv]=uvi.x;uvArray[offset_uv+1]=uvi.y;offset_uv+=2}}if(offset_uv>0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglUVBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,uvArray,hint)}}if(dirtyUvs&&obj_uvs2&&uvType){for(f=0,fl=chunk_faces3.length;f<fl;f++){fi=chunk_faces3[f];uv2=obj_uvs2[fi];if(uv2===undefined)continue;for(i=0;i<3;i++){uv2i=uv2[i];uv2Array[offset_uv2]=uv2i.x;uv2Array[offset_uv2+1]=uv2i.y;offset_uv2+=2}}for(f=0,fl=chunk_faces4.length;f<fl;f++){fi=chunk_faces4[f];uv2=obj_uvs2[fi];if(uv2===undefined)continue;for(i=0;i<4;i++){uv2i=uv2[i];uv2Array[offset_uv2]=uv2i.x;uv2Array[offset_uv2+1]=uv2i.y;offset_uv2+=2}}if(offset_uv2>0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglUV2Buffer);_gl.bufferData(_gl.ARRAY_BUFFER,uv2Array,hint)}}if(dirtyElements){for(f=0,fl=chunk_faces3.length;f<fl;f++){faceArray[offset_face]=vertexIndex;faceArray[offset_face+1]=vertexIndex+1;faceArray[offset_face+2]=vertexIndex+2;offset_face+=3;lineArray[offset_line]=vertexIndex;lineArray[offset_line+1]=vertexIndex+1;lineArray[offset_line+2]=vertexIndex;lineArray[offset_line+3]=vertexIndex+2;lineArray[offset_line+4]=vertexIndex+1;lineArray[offset_line+5]=vertexIndex+2;offset_line+=6;vertexIndex+=3}for(f=0,fl=chunk_faces4.length;f<fl;f++){faceArray[offset_face]=vertexIndex;faceArray[offset_face+1]=vertexIndex+1;faceArray[offset_face+2]=vertexIndex+3;faceArray[offset_face+3]=vertexIndex+1;faceArray[offset_face+4]=vertexIndex+2;faceArray[offset_face+5]=vertexIndex+3;offset_face+=6;lineArray[offset_line]=vertexIndex;lineArray[offset_line+1]=vertexIndex+1;lineArray[offset_line+2]=vertexIndex;lineArray[offset_line+3]=vertexIndex+3;lineArray[offset_line+4]=vertexIndex+1;lineArray[offset_line+5]=vertexIndex+2;lineArray[offset_line+6]=vertexIndex+2;lineArray[offset_line+7]=vertexIndex+3;offset_line+=8;vertexIndex+=4}_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,geometryGroup.__webglFaceBuffer);_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER,faceArray,hint);_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,geometryGroup.__webglLineBuffer);_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER,lineArray,hint)}if(customAttributes){for(i=0,il=customAttributes.length;i<il;i++){customAttribute=customAttributes[i];if(!customAttribute.__original.needsUpdate)continue;offset_custom=0;offset_customSrc=0;if(customAttribute.size===1){if(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];customAttribute.array[offset_custom]=customAttribute.value[face.a];customAttribute.array[offset_custom+1]=customAttribute.value[face.b];customAttribute.array[offset_custom+2]=customAttribute.value[face.c];offset_custom+=3}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];customAttribute.array[offset_custom]=customAttribute.value[face.a];customAttribute.array[offset_custom+1]=customAttribute.value[face.b];customAttribute.array[offset_custom+2]=customAttribute.value[face.c];customAttribute.array[offset_custom+3]=customAttribute.value[face.d];offset_custom+=4}}else if(customAttribute.boundTo==="faces"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];customAttribute.array[offset_custom]=value;customAttribute.array[offset_custom+1]=value;customAttribute.array[offset_custom+2]=value;offset_custom+=3}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];customAttribute.array[offset_custom]=value;customAttribute.array[offset_custom+1]=value;customAttribute.array[offset_custom+2]=value;customAttribute.array[offset_custom+3]=value;offset_custom+=4}}}else if(customAttribute.size===2){if(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v2.x;customAttribute.array[offset_custom+3]=v2.y;customAttribute.array[offset_custom+4]=v3.x;customAttribute.array[offset_custom+5]=v3.y;offset_custom+=6}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];v4=customAttribute.value[face.d];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v2.x;customAttribute.array[offset_custom+3]=v2.y;customAttribute.array[offset_custom+4]=v3.x;customAttribute.array[offset_custom+5]=v3.y;customAttribute.array[offset_custom+6]=v4.x;customAttribute.array[offset_custom+7]=v4.y;offset_custom+=8}}else if(customAttribute.boundTo==="faces"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];v1=value;v2=value;v3=value;customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v2.x;customAttribute.array[offset_custom+3]=v2.y;customAttribute.array[offset_custom+4]=v3.x;customAttribute.array[offset_custom+5]=v3.y;offset_custom+=6}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];v1=value;v2=value;v3=value;v4=value;customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v2.x;customAttribute.array[offset_custom+3]=v2.y;customAttribute.array[offset_custom+4]=v3.x;customAttribute.array[offset_custom+5]=v3.y;customAttribute.array[offset_custom+6]=v4.x;customAttribute.array[offset_custom+7]=v4.y;offset_custom+=8}}}else if(customAttribute.size===3){var pp;if(customAttribute.type==="c"){pp=["r","g","b"]}else{pp=["x","y","z"]}if(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];offset_custom+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];v4=customAttribute.value[face.d];customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];customAttribute.array[offset_custom+9]=v4[pp[0]];customAttribute.array[offset_custom+10]=v4[pp[1]];customAttribute.array[offset_custom+11]=v4[pp[2]];offset_custom+=12}}else if(customAttribute.boundTo==="faces"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];v1=value;v2=value;v3=value;customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];offset_custom+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];v1=value;v2=value;v3=value;v4=value;customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];customAttribute.array[offset_custom+9]=v4[pp[0]];customAttribute.array[offset_custom+10]=v4[pp[1]];customAttribute.array[offset_custom+11]=v4[pp[2]];offset_custom+=12}}else if(customAttribute.boundTo==="faceVertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];v1=value[0];v2=value[1];v3=value[2];customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];offset_custom+=9}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];v1=value[0];v2=value[1];v3=value[2];v4=value[3];customAttribute.array[offset_custom]=v1[pp[0]];customAttribute.array[offset_custom+1]=v1[pp[1]];customAttribute.array[offset_custom+2]=v1[pp[2]];customAttribute.array[offset_custom+3]=v2[pp[0]];customAttribute.array[offset_custom+4]=v2[pp[1]];customAttribute.array[offset_custom+5]=v2[pp[2]];customAttribute.array[offset_custom+6]=v3[pp[0]];customAttribute.array[offset_custom+7]=v3[pp[1]];customAttribute.array[offset_custom+8]=v3[pp[2]];customAttribute.array[offset_custom+9]=v4[pp[0]];customAttribute.array[offset_custom+10]=v4[pp[1]];customAttribute.array[offset_custom+11]=v4[pp[2]];offset_custom+=12}}}else if(customAttribute.size===4){if(customAttribute.boundTo===undefined||customAttribute.boundTo==="vertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){face=obj_faces[chunk_faces3[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;offset_custom+=12}for(f=0,fl=chunk_faces4.length;f<fl;f++){face=obj_faces[chunk_faces4[f]];v1=customAttribute.value[face.a];v2=customAttribute.value[face.b];v3=customAttribute.value[face.c];v4=customAttribute.value[face.d];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;customAttribute.array[offset_custom+12]=v4.x;customAttribute.array[offset_custom+13]=v4.y;customAttribute.array[offset_custom+14]=v4.z;customAttribute.array[offset_custom+15]=v4.w;offset_custom+=16}}else if(customAttribute.boundTo==="faces"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];v1=value;v2=value;v3=value;customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;offset_custom+=12}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];v1=value;v2=value;v3=value;v4=value;customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;customAttribute.array[offset_custom+12]=v4.x;customAttribute.array[offset_custom+13]=v4.y;customAttribute.array[offset_custom+14]=v4.z;customAttribute.array[offset_custom+15]=v4.w;offset_custom+=16}}else if(customAttribute.boundTo==="faceVertices"){for(f=0,fl=chunk_faces3.length;f<fl;f++){value=customAttribute.value[chunk_faces3[f]];v1=value[0];v2=value[1];v3=value[2];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;offset_custom+=12}for(f=0,fl=chunk_faces4.length;f<fl;f++){value=customAttribute.value[chunk_faces4[f]];v1=value[0];v2=value[1];v3=value[2];v4=value[3];customAttribute.array[offset_custom]=v1.x;customAttribute.array[offset_custom+1]=v1.y;customAttribute.array[offset_custom+2]=v1.z;customAttribute.array[offset_custom+3]=v1.w;customAttribute.array[offset_custom+4]=v2.x;customAttribute.array[offset_custom+5]=v2.y;customAttribute.array[offset_custom+6]=v2.z;customAttribute.array[offset_custom+7]=v2.w;customAttribute.array[offset_custom+8]=v3.x;customAttribute.array[offset_custom+9]=v3.y;customAttribute.array[offset_custom+10]=v3.z;customAttribute.array[offset_custom+11]=v3.w;customAttribute.array[offset_custom+12]=v4.x;customAttribute.array[offset_custom+13]=v4.y;customAttribute.array[offset_custom+14]=v4.z;customAttribute.array[offset_custom+15]=v4.w;offset_custom+=16}}}_gl.bindBuffer(_gl.ARRAY_BUFFER,customAttribute.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,customAttribute.array,hint)}}if(dispose){delete geometryGroup.__inittedArrays;delete geometryGroup.__colorArray;delete geometryGroup.__normalArray;delete geometryGroup.__tangentArray;delete geometryGroup.__uvArray;delete geometryGroup.__uv2Array;delete geometryGroup.__faceArray;delete geometryGroup.__vertexArray;delete geometryGroup.__lineArray;delete geometryGroup.__skinIndexArray;delete geometryGroup.__skinWeightArray}}function setDirectBuffers(geometry,hint,dispose){var attributes=geometry.attributes;var index=attributes["index"];var position=attributes["position"];var normal=attributes["normal"];var uv=attributes["uv"];var color=attributes["color"];var tangent=attributes["tangent"];if(geometry.elementsNeedUpdate&&index!==undefined){_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,index.buffer);_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER,index.array,hint)}if(geometry.verticesNeedUpdate&&position!==undefined){_gl.bindBuffer(_gl.ARRAY_BUFFER,position.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,position.array,hint)}if(geometry.normalsNeedUpdate&&normal!==undefined){_gl.bindBuffer(_gl.ARRAY_BUFFER,normal.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,normal.array,hint)}if(geometry.uvsNeedUpdate&&uv!==undefined){_gl.bindBuffer(_gl.ARRAY_BUFFER,uv.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,uv.array,hint)}if(geometry.colorsNeedUpdate&&color!==undefined){_gl.bindBuffer(_gl.ARRAY_BUFFER,color.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,color.array,hint)}if(geometry.tangentsNeedUpdate&&tangent!==undefined){_gl.bindBuffer(_gl.ARRAY_BUFFER,tangent.buffer);_gl.bufferData(_gl.ARRAY_BUFFER,tangent.array,hint)}if(dispose){for(var i in geometry.attributes){delete geometry.attributes[i].array}}}this.renderBufferImmediate=function(object,program,material){if(object.hasPositions&&!object.__webglVertexBuffer)object.__webglVertexBuffer=_gl.createBuffer();if(object.hasNormals&&!object.__webglNormalBuffer)object.__webglNormalBuffer=_gl.createBuffer();if(object.hasUvs&&!object.__webglUvBuffer)object.__webglUvBuffer=_gl.createBuffer();if(object.hasColors&&!object.__webglColorBuffer)object.__webglColorBuffer=_gl.createBuffer();if(object.hasPositions){_gl.bindBuffer(_gl.ARRAY_BUFFER,object.__webglVertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW);_gl.enableVertexAttribArray(program.attributes.position);_gl.vertexAttribPointer(program.attributes.position,3,_gl.FLOAT,false,0,0)}if(object.hasNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,object.__webglNormalBuffer);if(material.shading===THREE.FlatShading){var nx,ny,nz,nax,nbx,ncx,nay,nby,ncy,naz,nbz,ncz,normalArray,i,il=object.count*3;for(i=0;i<il;i+=9){normalArray=object.normalArray;nax=normalArray[i];nay=normalArray[i+1];naz=normalArray[i+2];nbx=normalArray[i+3];nby=normalArray[i+4];nbz=normalArray[i+5];ncx=normalArray[i+6];ncy=normalArray[i+7];ncz=normalArray[i+8];nx=(nax+nbx+ncx)/3;ny=(nay+nby+ncy)/3;nz=(naz+nbz+ncz)/3;normalArray[i]=nx;normalArray[i+1]=ny;normalArray[i+2]=nz;normalArray[i+3]=nx;normalArray[i+4]=ny;normalArray[i+5]=nz;normalArray[i+6]=nx;normalArray[i+7]=ny;normalArray[i+8]=nz}}_gl.bufferData(_gl.ARRAY_BUFFER,object.normalArray,_gl.DYNAMIC_DRAW);_gl.enableVertexAttribArray(program.attributes.normal);_gl.vertexAttribPointer(program.attributes.normal,3,_gl.FLOAT,false,0,0)}if(object.hasUvs&&material.map){_gl.bindBuffer(_gl.ARRAY_BUFFER,object.__webglUvBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,object.uvArray,_gl.DYNAMIC_DRAW);_gl.enableVertexAttribArray(program.attributes.uv);_gl.vertexAttribPointer(program.attributes.uv,2,_gl.FLOAT,false,0,0)}if(object.hasColors&&material.vertexColors!==THREE.NoColors){_gl.bindBuffer(_gl.ARRAY_BUFFER,object.__webglColorBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,object.colorArray,_gl.DYNAMIC_DRAW);_gl.enableVertexAttribArray(program.attributes.color);_gl.vertexAttribPointer(program.attributes.color,3,_gl.FLOAT,false,0,0)}_gl.drawArrays(_gl.TRIANGLES,0,object.count);object.count=0};this.renderBufferDirect=function(camera,lights,fog,material,geometry,object){if(material.visible===false)return;var program,attributes,linewidth,primitives,a,attribute;program=setProgram(camera,lights,fog,material,object);attributes=program.attributes;var updateBuffers=false,wireframeBit=material.wireframe?1:0,geometryHash=geometry.id*16777215+program.id*2+wireframeBit;if(geometryHash!==_currentGeometryGroupHash){_currentGeometryGroupHash=geometryHash;updateBuffers=true}if(updateBuffers){disableAttributes()}if(object instanceof THREE.Mesh){var index=geometry.attributes["index"];if(index){var offsets=geometry.offsets;if(offsets.length>1)updateBuffers=true;for(var i=0,il=offsets.length;i<il;i++){var startIndex=offsets[i].index;if(updateBuffers){var position=geometry.attributes["position"];var positionSize=position.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,position.buffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,positionSize,_gl.FLOAT,false,0,startIndex*positionSize*4);var normal=geometry.attributes["normal"];if(attributes.normal>=0&&normal){var normalSize=normal.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,normal.buffer);enableAttribute(attributes.normal);_gl.vertexAttribPointer(attributes.normal,normalSize,_gl.FLOAT,false,0,startIndex*normalSize*4)}var uv=geometry.attributes["uv"];if(attributes.uv>=0&&uv){var uvSize=uv.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,uv.buffer);enableAttribute(attributes.uv);_gl.vertexAttribPointer(attributes.uv,uvSize,_gl.FLOAT,false,0,startIndex*uvSize*4)}var color=geometry.attributes["color"];if(attributes.color>=0&&color){var colorSize=color.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,color.buffer);enableAttribute(attributes.color);_gl.vertexAttribPointer(attributes.color,colorSize,_gl.FLOAT,false,0,startIndex*colorSize*4)}var tangent=geometry.attributes["tangent"];if(attributes.tangent>=0&&tangent){var tangentSize=tangent.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,tangent.buffer);enableAttribute(attributes.tangent);_gl.vertexAttribPointer(attributes.tangent,tangentSize,_gl.FLOAT,false,0,startIndex*tangentSize*4)}_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,index.buffer)}_gl.drawElements(_gl.TRIANGLES,offsets[i].count,_gl.UNSIGNED_SHORT,offsets[i].start*2);_this.info.render.calls++;_this.info.render.vertices+=offsets[i].count;_this.info.render.faces+=offsets[i].count/3}}else{if(updateBuffers){var position=geometry.attributes["position"];var positionSize=position.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,position.buffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,positionSize,_gl.FLOAT,false,0,0);var normal=geometry.attributes["normal"];if(attributes.normal>=0&&normal){var normalSize=normal.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,normal.buffer);enableAttribute(attributes.normal);_gl.vertexAttribPointer(attributes.normal,normalSize,_gl.FLOAT,false,0,0)}var uv=geometry.attributes["uv"];if(attributes.uv>=0&&uv){var uvSize=uv.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,uv.buffer);enableAttribute(attributes.uv);_gl.vertexAttribPointer(attributes.uv,uvSize,_gl.FLOAT,false,0,0)}var color=geometry.attributes["color"];if(attributes.color>=0&&color){var colorSize=color.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,color.buffer);enableAttribute(attributes.color);_gl.vertexAttribPointer(attributes.color,colorSize,_gl.FLOAT,false,0,0)}var tangent=geometry.attributes["tangent"];if(attributes.tangent>=0&&tangent){var tangentSize=tangent.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,tangent.buffer);enableAttribute(attributes.tangent);_gl.vertexAttribPointer(attributes.tangent,tangentSize,_gl.FLOAT,false,0,0)}}_gl.drawArrays(_gl.TRIANGLES,0,position.numItems/3);_this.info.render.calls++;_this.info.render.vertices+=position.numItems/3;_this.info.render.faces+=position.numItems/3/3}}else if(object instanceof THREE.ParticleSystem){if(updateBuffers){var position=geometry.attributes["position"];var positionSize=position.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,position.buffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,positionSize,_gl.FLOAT,false,0,0);var color=geometry.attributes["color"];if(attributes.color>=0&&color){var colorSize=color.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,color.buffer);enableAttribute(attributes.color);_gl.vertexAttribPointer(attributes.color,colorSize,_gl.FLOAT,false,0,0)}_gl.drawArrays(_gl.POINTS,0,position.numItems/3);_this.info.render.calls++;_this.info.render.points+=position.numItems/3}}else if(object instanceof THREE.Line){if(updateBuffers){var position=geometry.attributes["position"];var positionSize=position.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,position.buffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,positionSize,_gl.FLOAT,false,0,0);var color=geometry.attributes["color"];if(attributes.color>=0&&color){var colorSize=color.itemSize;_gl.bindBuffer(_gl.ARRAY_BUFFER,color.buffer);enableAttribute(attributes.color);_gl.vertexAttribPointer(attributes.color,colorSize,_gl.FLOAT,false,0,0)}setLineWidth(material.linewidth);_gl.drawArrays(_gl.LINE_STRIP,0,position.numItems/3);_this.info.render.calls++;_this.info.render.points+=position.numItems}}};this.renderBuffer=function(camera,lights,fog,material,geometryGroup,object){if(material.visible===false)return;var program,attributes,linewidth,primitives,a,attribute,i,il;program=setProgram(camera,lights,fog,material,object);attributes=program.attributes;var updateBuffers=false,wireframeBit=material.wireframe?1:0,geometryGroupHash=geometryGroup.id*16777215+program.id*2+wireframeBit;if(geometryGroupHash!==_currentGeometryGroupHash){_currentGeometryGroupHash=geometryGroupHash;updateBuffers=true}if(updateBuffers){disableAttributes()}if(!material.morphTargets&&attributes.position>=0){if(updateBuffers){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglVertexBuffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,false,0,0)}}else{if(object.morphTargetBase){setupMorphTargets(material,geometryGroup,object)}}if(updateBuffers){if(geometryGroup.__webglCustomAttributesList){for(i=0,il=geometryGroup.__webglCustomAttributesList.length;i<il;i++){attribute=geometryGroup.__webglCustomAttributesList[i];if(attributes[attribute.buffer.belongsToAttribute]>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,attribute.buffer);enableAttribute(attributes[attribute.buffer.belongsToAttribute]);_gl.vertexAttribPointer(attributes[attribute.buffer.belongsToAttribute],attribute.size,_gl.FLOAT,false,0,0)}}}if(attributes.color>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglColorBuffer);
enableAttribute(attributes.color);_gl.vertexAttribPointer(attributes.color,3,_gl.FLOAT,false,0,0)}if(attributes.normal>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglNormalBuffer);enableAttribute(attributes.normal);_gl.vertexAttribPointer(attributes.normal,3,_gl.FLOAT,false,0,0)}if(attributes.tangent>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglTangentBuffer);enableAttribute(attributes.tangent);_gl.vertexAttribPointer(attributes.tangent,4,_gl.FLOAT,false,0,0)}if(attributes.uv>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglUVBuffer);enableAttribute(attributes.uv);_gl.vertexAttribPointer(attributes.uv,2,_gl.FLOAT,false,0,0)}if(attributes.uv2>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglUV2Buffer);enableAttribute(attributes.uv2);_gl.vertexAttribPointer(attributes.uv2,2,_gl.FLOAT,false,0,0)}if(material.skinning&&attributes.skinIndex>=0&&attributes.skinWeight>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglSkinIndicesBuffer);enableAttribute(attributes.skinIndex);_gl.vertexAttribPointer(attributes.skinIndex,4,_gl.FLOAT,false,0,0);_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglSkinWeightsBuffer);enableAttribute(attributes.skinWeight);_gl.vertexAttribPointer(attributes.skinWeight,4,_gl.FLOAT,false,0,0)}if(attributes.lineDistance>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglLineDistanceBuffer);enableAttribute(attributes.lineDistance);_gl.vertexAttribPointer(attributes.lineDistance,1,_gl.FLOAT,false,0,0)}}if(object instanceof THREE.Mesh){if(material.wireframe){setLineWidth(material.wireframeLinewidth);if(updateBuffers)_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,geometryGroup.__webglLineBuffer);_gl.drawElements(_gl.LINES,geometryGroup.__webglLineCount,_gl.UNSIGNED_SHORT,0)}else{if(updateBuffers)_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,geometryGroup.__webglFaceBuffer);_gl.drawElements(_gl.TRIANGLES,geometryGroup.__webglFaceCount,_gl.UNSIGNED_SHORT,0)}_this.info.render.calls++;_this.info.render.vertices+=geometryGroup.__webglFaceCount;_this.info.render.faces+=geometryGroup.__webglFaceCount/3}else if(object instanceof THREE.Line){primitives=object.type===THREE.LineStrip?_gl.LINE_STRIP:_gl.LINES;setLineWidth(material.linewidth);_gl.drawArrays(primitives,0,geometryGroup.__webglLineCount);_this.info.render.calls++}else if(object instanceof THREE.ParticleSystem){_gl.drawArrays(_gl.POINTS,0,geometryGroup.__webglParticleCount);_this.info.render.calls++;_this.info.render.points+=geometryGroup.__webglParticleCount}else if(object instanceof THREE.Ribbon){_gl.drawArrays(_gl.TRIANGLE_STRIP,0,geometryGroup.__webglVertexCount);_this.info.render.calls++}};function enableAttribute(attribute){if(!_enabledAttributes[attribute]){_gl.enableVertexAttribArray(attribute);_enabledAttributes[attribute]=true}}function disableAttributes(){for(var attribute in _enabledAttributes){if(_enabledAttributes[attribute]){_gl.disableVertexAttribArray(attribute);_enabledAttributes[attribute]=false}}}function setupMorphTargets(material,geometryGroup,object){var attributes=material.program.attributes;if(object.morphTargetBase!==-1&&attributes.position>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphTargetsBuffers[object.morphTargetBase]);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,false,0,0)}else if(attributes.position>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglVertexBuffer);enableAttribute(attributes.position);_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,false,0,0)}if(object.morphTargetForcedOrder.length){var m=0;var order=object.morphTargetForcedOrder;var influences=object.morphTargetInfluences;while(m<material.numSupportedMorphTargets&&m<order.length){if(attributes["morphTarget"+m]>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphTargetsBuffers[order[m]]);enableAttribute(attributes["morphTarget"+m]);_gl.vertexAttribPointer(attributes["morphTarget"+m],3,_gl.FLOAT,false,0,0)}if(attributes["morphNormal"+m]>=0&&material.morphNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphNormalsBuffers[order[m]]);enableAttribute(attributes["morphNormal"+m]);_gl.vertexAttribPointer(attributes["morphNormal"+m],3,_gl.FLOAT,false,0,0)}object.__webglMorphTargetInfluences[m]=influences[order[m]];m++}}else{var influence,activeInfluenceIndices=[];var influences=object.morphTargetInfluences;var i,il=influences.length;for(i=0;i<il;i++){influence=influences[i];if(influence>0){activeInfluenceIndices.push([influence,i])}}if(activeInfluenceIndices.length>material.numSupportedMorphTargets){activeInfluenceIndices.sort(numericalSort);activeInfluenceIndices.length=material.numSupportedMorphTargets}else if(activeInfluenceIndices.length>material.numSupportedMorphNormals){activeInfluenceIndices.sort(numericalSort)}else if(activeInfluenceIndices.length===0){activeInfluenceIndices.push([0,0])}var influenceIndex,m=0;while(m<material.numSupportedMorphTargets){if(activeInfluenceIndices[m]){influenceIndex=activeInfluenceIndices[m][1];if(attributes["morphTarget"+m]>=0){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphTargetsBuffers[influenceIndex]);enableAttribute(attributes["morphTarget"+m]);_gl.vertexAttribPointer(attributes["morphTarget"+m],3,_gl.FLOAT,false,0,0)}if(attributes["morphNormal"+m]>=0&&material.morphNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,geometryGroup.__webglMorphNormalsBuffers[influenceIndex]);enableAttribute(attributes["morphNormal"+m]);_gl.vertexAttribPointer(attributes["morphNormal"+m],3,_gl.FLOAT,false,0,0)}object.__webglMorphTargetInfluences[m]=influences[influenceIndex]}else{object.__webglMorphTargetInfluences[m]=0}m++}}if(material.program.uniforms.morphTargetInfluences!==null){_gl.uniform1fv(material.program.uniforms.morphTargetInfluences,object.__webglMorphTargetInfluences)}}function painterSortStable(a,b){if(a.z!==b.z){return b.z-a.z}else{return b.id-a.id}}function numericalSort(a,b){return b[0]-a[0]}this.render=function(scene,camera,renderTarget,forceClear){if(camera instanceof THREE.Camera===false){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}var i,il,webglObject,object,renderList,lights=scene.__lights,fog=scene.fog;_currentMaterialId=-1;_lightsNeedUpdate=true;if(this.autoUpdateScene)scene.updateMatrixWorld();if(camera.parent===undefined)camera.updateMatrixWorld();camera.matrixWorldInverse.getInverse(camera.matrixWorld);_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);if(this.autoUpdateObjects)this.initWebGLObjects(scene);renderPlugins(this.renderPluginsPre,scene,camera);_this.info.render.calls=0;_this.info.render.vertices=0;_this.info.render.faces=0;_this.info.render.points=0;this.setRenderTarget(renderTarget);if(this.autoClear||forceClear){this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil)}renderList=scene.__webglObjects;for(i=0,il=renderList.length;i<il;i++){webglObject=renderList[i];object=webglObject.object;webglObject.render=false;if(object.visible){if(!(object instanceof THREE.Mesh||object instanceof THREE.ParticleSystem)||!object.frustumCulled||_frustum.intersectsObject(object)){setupMatrices(object,camera);unrollBufferMaterial(webglObject);webglObject.render=true;if(this.sortObjects===true){if(object.renderDepth!==null){webglObject.z=object.renderDepth}else{_vector3.getPositionFromMatrix(object.matrixWorld);_vector3.applyProjection(_projScreenMatrix);webglObject.z=_vector3.z}webglObject.id=object.id}}}}if(this.sortObjects){renderList.sort(painterSortStable)}renderList=scene.__webglObjectsImmediate;for(i=0,il=renderList.length;i<il;i++){webglObject=renderList[i];object=webglObject.object;if(object.visible){setupMatrices(object,camera);unrollImmediateBufferMaterial(webglObject)}}if(scene.overrideMaterial){var material=scene.overrideMaterial;this.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst);this.setDepthTest(material.depthTest);this.setDepthWrite(material.depthWrite);setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits);renderObjects(scene.__webglObjects,false,"",camera,lights,fog,true,material);renderObjectsImmediate(scene.__webglObjectsImmediate,"",camera,lights,fog,false,material)}else{var material=null;this.setBlending(THREE.NoBlending);renderObjects(scene.__webglObjects,true,"opaque",camera,lights,fog,false,material);renderObjectsImmediate(scene.__webglObjectsImmediate,"opaque",camera,lights,fog,false,material);renderObjects(scene.__webglObjects,false,"transparent",camera,lights,fog,true,material);renderObjectsImmediate(scene.__webglObjectsImmediate,"transparent",camera,lights,fog,true,material)}renderPlugins(this.renderPluginsPost,scene,camera);if(renderTarget&&renderTarget.generateMipmaps&&renderTarget.minFilter!==THREE.NearestFilter&&renderTarget.minFilter!==THREE.LinearFilter){updateRenderTargetMipmap(renderTarget)}this.setDepthTest(true);this.setDepthWrite(true)};function renderPlugins(plugins,scene,camera){if(!plugins.length)return;for(var i=0,il=plugins.length;i<il;i++){_currentProgram=null;_currentCamera=null;_oldBlending=-1;_oldDepthTest=-1;_oldDepthWrite=-1;_oldDoubleSided=-1;_oldFlipSided=-1;_currentGeometryGroupHash=-1;_currentMaterialId=-1;_lightsNeedUpdate=true;plugins[i].render(scene,camera,_currentWidth,_currentHeight);_currentProgram=null;_currentCamera=null;_oldBlending=-1;_oldDepthTest=-1;_oldDepthWrite=-1;_oldDoubleSided=-1;_oldFlipSided=-1;_currentGeometryGroupHash=-1;_currentMaterialId=-1;_lightsNeedUpdate=true}}function renderObjects(renderList,reverse,materialType,camera,lights,fog,useBlending,overrideMaterial){var webglObject,object,buffer,material,start,end,delta;if(reverse){start=renderList.length-1;end=-1;delta=-1}else{start=0;end=renderList.length;delta=1}for(var i=start;i!==end;i+=delta){webglObject=renderList[i];if(webglObject.render){object=webglObject.object;buffer=webglObject.buffer;if(overrideMaterial){material=overrideMaterial}else{material=webglObject[materialType];if(!material)continue;if(useBlending)_this.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst);_this.setDepthTest(material.depthTest);_this.setDepthWrite(material.depthWrite);setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits)}_this.setMaterialFaces(material);if(buffer instanceof THREE.BufferGeometry){_this.renderBufferDirect(camera,lights,fog,material,buffer,object)}else{_this.renderBuffer(camera,lights,fog,material,buffer,object)}}}}function renderObjectsImmediate(renderList,materialType,camera,lights,fog,useBlending,overrideMaterial){var webglObject,object,material,program;for(var i=0,il=renderList.length;i<il;i++){webglObject=renderList[i];object=webglObject.object;if(object.visible){if(overrideMaterial){material=overrideMaterial}else{material=webglObject[materialType];if(!material)continue;if(useBlending)_this.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst);_this.setDepthTest(material.depthTest);_this.setDepthWrite(material.depthWrite);setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits)}_this.renderImmediateObject(camera,lights,fog,material,object)}}}this.renderImmediateObject=function(camera,lights,fog,material,object){var program=setProgram(camera,lights,fog,material,object);_currentGeometryGroupHash=-1;_this.setMaterialFaces(material);if(object.immediateRenderCallback){object.immediateRenderCallback(program,_gl,_frustum)}else{object.render(function(object){_this.renderBufferImmediate(object,program,material)})}};function unrollImmediateBufferMaterial(globject){var object=globject.object,material=object.material;if(material.transparent){globject.transparent=material;globject.opaque=null}else{globject.opaque=material;globject.transparent=null}}function unrollBufferMaterial(globject){var object=globject.object,buffer=globject.buffer,material,materialIndex,meshMaterial;meshMaterial=object.material;if(meshMaterial instanceof THREE.MeshFaceMaterial){materialIndex=buffer.materialIndex;material=meshMaterial.materials[materialIndex];if(material.transparent){globject.transparent=material;globject.opaque=null}else{globject.opaque=material;globject.transparent=null}}else{material=meshMaterial;if(material){if(material.transparent){globject.transparent=material;globject.opaque=null}else{globject.opaque=material;globject.transparent=null}}}}function sortFacesByMaterial(geometry,material){var f,fl,face,materialIndex,vertices,groupHash,hash_map={};var numMorphTargets=geometry.morphTargets.length;var numMorphNormals=geometry.morphNormals.length;var usesFaceMaterial=material instanceof THREE.MeshFaceMaterial;geometry.geometryGroups={};for(f=0,fl=geometry.faces.length;f<fl;f++){face=geometry.faces[f];materialIndex=usesFaceMaterial?face.materialIndex:0;if(hash_map[materialIndex]===undefined){hash_map[materialIndex]={hash:materialIndex,counter:0}}groupHash=hash_map[materialIndex].hash+"_"+hash_map[materialIndex].counter;if(geometry.geometryGroups[groupHash]===undefined){geometry.geometryGroups[groupHash]={faces3:[],faces4:[],materialIndex:materialIndex,vertices:0,numMorphTargets:numMorphTargets,numMorphNormals:numMorphNormals}}vertices=face instanceof THREE.Face3?3:4;if(geometry.geometryGroups[groupHash].vertices+vertices>65535){hash_map[materialIndex].counter+=1;groupHash=hash_map[materialIndex].hash+"_"+hash_map[materialIndex].counter;if(geometry.geometryGroups[groupHash]===undefined){geometry.geometryGroups[groupHash]={faces3:[],faces4:[],materialIndex:materialIndex,vertices:0,numMorphTargets:numMorphTargets,numMorphNormals:numMorphNormals}}}if(face instanceof THREE.Face3){geometry.geometryGroups[groupHash].faces3.push(f)}else{geometry.geometryGroups[groupHash].faces4.push(f)}geometry.geometryGroups[groupHash].vertices+=vertices}geometry.geometryGroupsList=[];for(var g in geometry.geometryGroups){geometry.geometryGroups[g].id=_geometryGroupCounter++;geometry.geometryGroupsList.push(geometry.geometryGroups[g])}}this.initWebGLObjects=function(scene){if(!scene.__webglObjects){scene.__webglObjects=[];scene.__webglObjectsImmediate=[];scene.__webglSprites=[];scene.__webglFlares=[]}while(scene.__objectsAdded.length){addObject(scene.__objectsAdded[0],scene);scene.__objectsAdded.splice(0,1)}while(scene.__objectsRemoved.length){removeObject(scene.__objectsRemoved[0],scene);scene.__objectsRemoved.splice(0,1)}for(var o=0,ol=scene.__webglObjects.length;o<ol;o++){updateObject(scene.__webglObjects[o].object)}};function addObject(object,scene){var g,geometry,material,geometryGroup;if(!object.__webglInit){object.__webglInit=true;object._modelViewMatrix=new THREE.Matrix4;object._normalMatrix=new THREE.Matrix3;if(object.geometry!==undefined&&object.geometry.__webglInit===undefined){object.geometry.__webglInit=true;object.geometry.addEventListener("dispose",onGeometryDispose)}if(object instanceof THREE.Mesh){geometry=object.geometry;material=object.material;if(geometry instanceof THREE.Geometry){if(geometry.geometryGroups===undefined){sortFacesByMaterial(geometry,material)}for(g in geometry.geometryGroups){geometryGroup=geometry.geometryGroups[g];if(!geometryGroup.__webglVertexBuffer){createMeshBuffers(geometryGroup);initMeshBuffers(geometryGroup,object);geometry.verticesNeedUpdate=true;geometry.morphTargetsNeedUpdate=true;geometry.elementsNeedUpdate=true;geometry.uvsNeedUpdate=true;geometry.normalsNeedUpdate=true;geometry.tangentsNeedUpdate=true;geometry.colorsNeedUpdate=true}}}else if(geometry instanceof THREE.BufferGeometry){initDirectBuffers(geometry)}}else if(object instanceof THREE.Ribbon){geometry=object.geometry;if(!geometry.__webglVertexBuffer){createRibbonBuffers(geometry);initRibbonBuffers(geometry,object);geometry.verticesNeedUpdate=true;geometry.colorsNeedUpdate=true;geometry.normalsNeedUpdate=true}}else if(object instanceof THREE.Line){geometry=object.geometry;if(!geometry.__webglVertexBuffer){if(geometry instanceof THREE.Geometry){createLineBuffers(geometry);initLineBuffers(geometry,object);geometry.verticesNeedUpdate=true;geometry.colorsNeedUpdate=true;geometry.lineDistancesNeedUpdate=true}else if(geometry instanceof THREE.BufferGeometry){initDirectBuffers(geometry)}}}else if(object instanceof THREE.ParticleSystem){geometry=object.geometry;if(!geometry.__webglVertexBuffer){if(geometry instanceof THREE.Geometry){createParticleBuffers(geometry);initParticleBuffers(geometry,object);geometry.verticesNeedUpdate=true;geometry.colorsNeedUpdate=true}else if(geometry instanceof THREE.BufferGeometry){initDirectBuffers(geometry)}}}}if(!object.__webglActive){if(object instanceof THREE.Mesh){geometry=object.geometry;if(geometry instanceof THREE.BufferGeometry){addBuffer(scene.__webglObjects,geometry,object)}else if(geometry instanceof THREE.Geometry){for(g in geometry.geometryGroups){geometryGroup=geometry.geometryGroups[g];addBuffer(scene.__webglObjects,geometryGroup,object)}}}else if(object instanceof THREE.Ribbon||object instanceof THREE.Line||object instanceof THREE.ParticleSystem){geometry=object.geometry;addBuffer(scene.__webglObjects,geometry,object)}else if(object instanceof THREE.ImmediateRenderObject||object.immediateRenderCallback){addBufferImmediate(scene.__webglObjectsImmediate,object)}else if(object instanceof THREE.Sprite){scene.__webglSprites.push(object)}else if(object instanceof THREE.LensFlare){scene.__webglFlares.push(object)}object.__webglActive=true}}function addBuffer(objlist,buffer,object){objlist.push({buffer:buffer,object:object,opaque:null,transparent:null})}function addBufferImmediate(objlist,object){objlist.push({object:object,opaque:null,transparent:null})}function updateObject(object){var geometry=object.geometry,geometryGroup,customAttributesDirty,material;if(object instanceof THREE.Mesh){if(geometry instanceof THREE.BufferGeometry){if(geometry.verticesNeedUpdate||geometry.elementsNeedUpdate||geometry.uvsNeedUpdate||geometry.normalsNeedUpdate||geometry.colorsNeedUpdate||geometry.tangentsNeedUpdate){setDirectBuffers(geometry,_gl.DYNAMIC_DRAW,!geometry.dynamic)}geometry.verticesNeedUpdate=false;geometry.elementsNeedUpdate=false;geometry.uvsNeedUpdate=false;geometry.normalsNeedUpdate=false;geometry.colorsNeedUpdate=false;geometry.tangentsNeedUpdate=false}else{for(var i=0,il=geometry.geometryGroupsList.length;i<il;i++){geometryGroup=geometry.geometryGroupsList[i];material=getBufferMaterial(object,geometryGroup);if(geometry.buffersNeedUpdate){initMeshBuffers(geometryGroup,object)}customAttributesDirty=material.attributes&&areCustomAttributesDirty(material);if(geometry.verticesNeedUpdate||geometry.morphTargetsNeedUpdate||geometry.elementsNeedUpdate||geometry.uvsNeedUpdate||geometry.normalsNeedUpdate||geometry.colorsNeedUpdate||geometry.tangentsNeedUpdate||customAttributesDirty){setMeshBuffers(geometryGroup,object,_gl.DYNAMIC_DRAW,!geometry.dynamic,material)}}geometry.verticesNeedUpdate=false;geometry.morphTargetsNeedUpdate=false;geometry.elementsNeedUpdate=false;geometry.uvsNeedUpdate=false;geometry.normalsNeedUpdate=false;geometry.colorsNeedUpdate=false;geometry.tangentsNeedUpdate=false;geometry.buffersNeedUpdate=false;material.attributes&&clearCustomAttributes(material)}}else if(object instanceof THREE.Ribbon){material=getBufferMaterial(object,geometry);customAttributesDirty=material.attributes&&areCustomAttributesDirty(material);if(geometry.verticesNeedUpdate||geometry.colorsNeedUpdate||geometry.normalsNeedUpdate||customAttributesDirty){setRibbonBuffers(geometry,_gl.DYNAMIC_DRAW)}geometry.verticesNeedUpdate=false;geometry.colorsNeedUpdate=false;geometry.normalsNeedUpdate=false;material.attributes&&clearCustomAttributes(material)}else if(object instanceof THREE.Line){if(geometry instanceof THREE.BufferGeometry){if(geometry.verticesNeedUpdate||geometry.colorsNeedUpdate){setDirectBuffers(geometry,_gl.DYNAMIC_DRAW,!geometry.dynamic)}geometry.verticesNeedUpdate=false;geometry.colorsNeedUpdate=false}else{material=getBufferMaterial(object,geometry);customAttributesDirty=material.attributes&&areCustomAttributesDirty(material);if(geometry.verticesNeedUpdate||geometry.colorsNeedUpdate||geometry.lineDistancesNeedUpdate||customAttributesDirty){setLineBuffers(geometry,_gl.DYNAMIC_DRAW)}geometry.verticesNeedUpdate=false;geometry.colorsNeedUpdate=false;geometry.lineDistancesNeedUpdate=false;material.attributes&&clearCustomAttributes(material)}}else if(object instanceof THREE.ParticleSystem){if(geometry instanceof THREE.BufferGeometry){if(geometry.verticesNeedUpdate||geometry.colorsNeedUpdate){setDirectBuffers(geometry,_gl.DYNAMIC_DRAW,!geometry.dynamic)}geometry.verticesNeedUpdate=false;geometry.colorsNeedUpdate=false}else{material=getBufferMaterial(object,geometry);customAttributesDirty=material.attributes&&areCustomAttributesDirty(material);if(geometry.verticesNeedUpdate||geometry.colorsNeedUpdate||object.sortParticles||customAttributesDirty){setParticleBuffers(geometry,_gl.DYNAMIC_DRAW,object)}geometry.verticesNeedUpdate=false;geometry.colorsNeedUpdate=false;material.attributes&&clearCustomAttributes(material)}}}function areCustomAttributesDirty(material){for(var a in material.attributes){if(material.attributes[a].needsUpdate)return true}return false}function clearCustomAttributes(material){for(var a in material.attributes){material.attributes[a].needsUpdate=false}}function removeObject(object,scene){if(object instanceof THREE.Mesh||object instanceof THREE.ParticleSystem||object instanceof THREE.Ribbon||object instanceof THREE.Line){removeInstances(scene.__webglObjects,object)}else if(object instanceof THREE.Sprite){removeInstancesDirect(scene.__webglSprites,object)}else if(object instanceof THREE.LensFlare){removeInstancesDirect(scene.__webglFlares,object)}else if(object instanceof THREE.ImmediateRenderObject||object.immediateRenderCallback){removeInstances(scene.__webglObjectsImmediate,object)}object.__webglActive=false}function removeInstances(objlist,object){for(var o=objlist.length-1;o>=0;o--){if(objlist[o].object===object){objlist.splice(o,1)}}}function removeInstancesDirect(objlist,object){for(var o=objlist.length-1;o>=0;o--){if(objlist[o]===object){objlist.splice(o,1)}}}this.initMaterial=function(material,lights,fog,object){material.addEventListener("dispose",onMaterialDispose);var u,a,identifiers,i,parameters,maxLightCount,maxBones,maxShadows,shaderID;if(material instanceof THREE.MeshDepthMaterial){shaderID="depth"}else if(material instanceof THREE.MeshNormalMaterial){shaderID="normal"}else if(material instanceof THREE.MeshBasicMaterial){shaderID="basic"}else if(material instanceof THREE.MeshLambertMaterial){shaderID="lambert"}else if(material instanceof THREE.MeshPhongMaterial){shaderID="phong"}else if(material instanceof THREE.LineBasicMaterial){shaderID="basic"}else if(material instanceof THREE.LineDashedMaterial){shaderID="dashed"}else if(material instanceof THREE.ParticleBasicMaterial){shaderID="particle_basic"}if(shaderID){setMaterialShaders(material,THREE.ShaderLib[shaderID])}maxLightCount=allocateLights(lights);maxShadows=allocateShadows(lights);maxBones=allocateBones(object);parameters={map:!!material.map,envMap:!!material.envMap,lightMap:!!material.lightMap,bumpMap:!!material.bumpMap,normalMap:!!material.normalMap,specularMap:!!material.specularMap,vertexColors:material.vertexColors,fog:fog,useFog:material.fog,fogExp:fog instanceof THREE.FogExp2,sizeAttenuation:material.sizeAttenuation,skinning:material.skinning,maxBones:maxBones,useVertexTexture:_supportsBoneTextures&&object&&object.useVertexTexture,boneTextureWidth:object&&object.boneTextureWidth,boneTextureHeight:object&&object.boneTextureHeight,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:this.maxMorphTargets,maxMorphNormals:this.maxMorphNormals,maxDirLights:maxLightCount.directional,maxPointLights:maxLightCount.point,maxSpotLights:maxLightCount.spot,maxHemiLights:maxLightCount.hemi,maxShadows:maxShadows,shadowMapEnabled:this.shadowMapEnabled&&object.receiveShadow,shadowMapType:this.shadowMapType,shadowMapDebug:this.shadowMapDebug,shadowMapCascade:this.shadowMapCascade,alphaTest:material.alphaTest,metal:material.metal,perPixel:material.perPixel,wrapAround:material.wrapAround,doubleSided:material.side===THREE.DoubleSide,flipSided:material.side===THREE.BackSide};material.program=buildProgram(shaderID,material.fragmentShader,material.vertexShader,material.uniforms,material.attributes,material.defines,parameters);var attributes=material.program.attributes;if(material.morphTargets){material.numSupportedMorphTargets=0;var id,base="morphTarget";for(i=0;i<this.maxMorphTargets;i++){id=base+i;if(attributes[id]>=0){material.numSupportedMorphTargets++}}}if(material.morphNormals){material.numSupportedMorphNormals=0;var id,base="morphNormal";for(i=0;i<this.maxMorphNormals;i++){id=base+i;if(attributes[id]>=0){material.numSupportedMorphNormals++}}}material.uniformsList=[];for(u in material.uniforms){material.uniformsList.push([material.uniforms[u],u])}};function setMaterialShaders(material,shaders){material.uniforms=THREE.UniformsUtils.clone(shaders.uniforms);material.vertexShader=shaders.vertexShader;material.fragmentShader=shaders.fragmentShader}function setProgram(camera,lights,fog,material,object){_usedTextureUnits=0;if(material.needsUpdate){if(material.program)deallocateMaterial(material);_this.initMaterial(material,lights,fog,object);material.needsUpdate=false}if(material.morphTargets){if(!object.__webglMorphTargetInfluences){object.__webglMorphTargetInfluences=new Float32Array(_this.maxMorphTargets)}}var refreshMaterial=false;var program=material.program,p_uniforms=program.uniforms,m_uniforms=material.uniforms;if(program!==_currentProgram){_gl.useProgram(program);_currentProgram=program;refreshMaterial=true}if(material.id!==_currentMaterialId){_currentMaterialId=material.id;refreshMaterial=true}if(refreshMaterial||camera!==_currentCamera){_gl.uniformMatrix4fv(p_uniforms.projectionMatrix,false,camera.projectionMatrix.elements);if(camera!==_currentCamera)_currentCamera=camera}if(material.skinning){if(_supportsBoneTextures&&object.useVertexTexture){if(p_uniforms.boneTexture!==null){var textureUnit=getTextureUnit();_gl.uniform1i(p_uniforms.boneTexture,textureUnit);_this.setTexture(object.boneTexture,textureUnit)}}else{if(p_uniforms.boneGlobalMatrices!==null){_gl.uniformMatrix4fv(p_uniforms.boneGlobalMatrices,false,object.boneMatrices)}}}if(refreshMaterial){if(fog&&material.fog){refreshUniformsFog(m_uniforms,fog)}if(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material.lights){if(_lightsNeedUpdate){setupLights(program,lights);_lightsNeedUpdate=false}refreshUniformsLights(m_uniforms,_lights)}if(material instanceof THREE.MeshBasicMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.MeshPhongMaterial){refreshUniformsCommon(m_uniforms,material)}if(material instanceof THREE.LineBasicMaterial){refreshUniformsLine(m_uniforms,material)}else if(material instanceof THREE.LineDashedMaterial){refreshUniformsLine(m_uniforms,material);refreshUniformsDash(m_uniforms,material)}else if(material instanceof THREE.ParticleBasicMaterial){refreshUniformsParticle(m_uniforms,material)}else if(material instanceof THREE.MeshPhongMaterial){refreshUniformsPhong(m_uniforms,material)}else if(material instanceof THREE.MeshLambertMaterial){refreshUniformsLambert(m_uniforms,material)}else if(material instanceof THREE.MeshDepthMaterial){m_uniforms.mNear.value=camera.near;m_uniforms.mFar.value=camera.far;m_uniforms.opacity.value=material.opacity}else if(material instanceof THREE.MeshNormalMaterial){m_uniforms.opacity.value=material.opacity}if(object.receiveShadow&&!material._shadowPass){refreshUniformsShadow(m_uniforms,lights)}loadUniformsGeneric(program,material.uniformsList);if(material instanceof THREE.ShaderMaterial||material instanceof THREE.MeshPhongMaterial||material.envMap){if(p_uniforms.cameraPosition!==null){_vector3.getPositionFromMatrix(camera.matrixWorld);_gl.uniform3f(p_uniforms.cameraPosition,_vector3.x,_vector3.y,_vector3.z)}}if(material instanceof THREE.MeshPhongMaterial||material instanceof THREE.MeshLambertMaterial||material instanceof THREE.ShaderMaterial||material.skinning){if(p_uniforms.viewMatrix!==null){_gl.uniformMatrix4fv(p_uniforms.viewMatrix,false,camera.matrixWorldInverse.elements)}}}loadUniformsMatrices(p_uniforms,object);if(p_uniforms.modelMatrix!==null){_gl.uniformMatrix4fv(p_uniforms.modelMatrix,false,object.matrixWorld.elements)}return program}function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity;if(_this.gammaInput){uniforms.diffuse.value.copyGammaToLinear(material.color)}else{uniforms.diffuse.value=material.color}uniforms.map.value=material.map;uniforms.lightMap.value=material.lightMap;uniforms.specularMap.value=material.specularMap;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)}var uvScaleMap;if(material.map){uvScaleMap=material.map}else if(material.specularMap){uvScaleMap=material.specularMap}else if(material.normalMap){uvScaleMap=material.normalMap}else if(material.bumpMap){uvScaleMap=material.bumpMap}if(uvScaleMap!==undefined){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;uniforms.flipEnvMap.value=material.envMap instanceof THREE.WebGLRenderTargetCube?1:-1;if(_this.gammaInput){uniforms.reflectivity.value=material.reflectivity}else{uniforms.reflectivity.value=material.reflectivity}uniforms.refractionRatio.value=material.refractionRatio;uniforms.combine.value=material.combine;uniforms.useRefract.value=material.envMap&&material.envMap.mapping instanceof THREE.CubeRefractionMapping}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 refreshUniformsParticle(uniforms,material){uniforms.psColor.value=material.color;uniforms.opacity.value=material.opacity;uniforms.size.value=material.size;uniforms.scale.value=_canvas.height/2;uniforms.map.value=material.map}function refreshUniformsFog(uniforms,fog){uniforms.fogColor.value=fog.color;if(fog instanceof THREE.Fog){uniforms.fogNear.value=fog.near;uniforms.fogFar.value=fog.far}else if(fog instanceof THREE.FogExp2){uniforms.fogDensity.value=fog.density}}function refreshUniformsPhong(uniforms,material){uniforms.shininess.value=material.shininess;if(_this.gammaInput){uniforms.ambient.value.copyGammaToLinear(material.ambient);uniforms.emissive.value.copyGammaToLinear(material.emissive);uniforms.specular.value.copyGammaToLinear(material.specular)}else{uniforms.ambient.value=material.ambient;uniforms.emissive.value=material.emissive;uniforms.specular.value=material.specular}if(material.wrapAround){uniforms.wrapRGB.value.copy(material.wrapRGB)}}function refreshUniformsLambert(uniforms,material){if(_this.gammaInput){uniforms.ambient.value.copyGammaToLinear(material.ambient);uniforms.emissive.value.copyGammaToLinear(material.emissive)}else{uniforms.ambient.value=material.ambient;uniforms.emissive.value=material.emissive}if(material.wrapAround){uniforms.wrapRGB.value.copy(material.wrapRGB)}}function refreshUniformsLights(uniforms,lights){uniforms.ambientLightColor.value=lights.ambient;uniforms.directionalLightColor.value=lights.directional.colors;uniforms.directionalLightDirection.value=lights.directional.positions;uniforms.pointLightColor.value=lights.point.colors;uniforms.pointLightPosition.value=lights.point.positions;uniforms.pointLightDistance.value=lights.point.distances;
uniforms.spotLightColor.value=lights.spot.colors;uniforms.spotLightPosition.value=lights.spot.positions;uniforms.spotLightDistance.value=lights.spot.distances;uniforms.spotLightDirection.value=lights.spot.directions;uniforms.spotLightAngleCos.value=lights.spot.anglesCos;uniforms.spotLightExponent.value=lights.spot.exponents;uniforms.hemisphereLightSkyColor.value=lights.hemi.skyColors;uniforms.hemisphereLightGroundColor.value=lights.hemi.groundColors;uniforms.hemisphereLightDirection.value=lights.hemi.positions}function refreshUniformsShadow(uniforms,lights){if(uniforms.shadowMatrix){var j=0;for(var i=0,il=lights.length;i<il;i++){var light=lights[i];if(!light.castShadow)continue;if(light instanceof THREE.SpotLight||light instanceof THREE.DirectionalLight&&!light.shadowCascade){uniforms.shadowMap.value[j]=light.shadowMap;uniforms.shadowMapSize.value[j]=light.shadowMapSize;uniforms.shadowMatrix.value[j]=light.shadowMatrix;uniforms.shadowDarkness.value[j]=light.shadowDarkness;uniforms.shadowBias.value[j]=light.shadowBias;j++}}}}function loadUniformsMatrices(uniforms,object){_gl.uniformMatrix4fv(uniforms.modelViewMatrix,false,object._modelViewMatrix.elements);if(uniforms.normalMatrix){_gl.uniformMatrix3fv(uniforms.normalMatrix,false,object._normalMatrix.elements)}}function getTextureUnit(){var textureUnit=_usedTextureUnits;if(textureUnit>=_maxTextures){console.warn("WebGLRenderer: trying to use "+textureUnit+" texture units while this GPU supports only "+_maxTextures)}_usedTextureUnits+=1;return textureUnit}function loadUniformsGeneric(program,uniforms){var uniform,value,type,location,texture,textureUnit,i,il,j,jl,offset;for(j=0,jl=uniforms.length;j<jl;j++){location=program.uniforms[uniforms[j][1]];if(!location)continue;uniform=uniforms[j][0];type=uniform.type;value=uniform.value;if(type==="i"){_gl.uniform1i(location,value)}else if(type==="f"){_gl.uniform1f(location,value)}else if(type==="v2"){_gl.uniform2f(location,value.x,value.y)}else if(type==="v3"){_gl.uniform3f(location,value.x,value.y,value.z)}else if(type==="v4"){_gl.uniform4f(location,value.x,value.y,value.z,value.w)}else if(type==="c"){_gl.uniform3f(location,value.r,value.g,value.b)}else if(type==="iv1"){_gl.uniform1iv(location,value)}else if(type==="iv"){_gl.uniform3iv(location,value)}else if(type==="fv1"){_gl.uniform1fv(location,value)}else if(type==="fv"){_gl.uniform3fv(location,value)}else if(type==="v2v"){if(uniform._array===undefined){uniform._array=new Float32Array(2*value.length)}for(i=0,il=value.length;i<il;i++){offset=i*2;uniform._array[offset]=value[i].x;uniform._array[offset+1]=value[i].y}_gl.uniform2fv(location,uniform._array)}else if(type==="v3v"){if(uniform._array===undefined){uniform._array=new Float32Array(3*value.length)}for(i=0,il=value.length;i<il;i++){offset=i*3;uniform._array[offset]=value[i].x;uniform._array[offset+1]=value[i].y;uniform._array[offset+2]=value[i].z}_gl.uniform3fv(location,uniform._array)}else if(type==="v4v"){if(uniform._array===undefined){uniform._array=new Float32Array(4*value.length)}for(i=0,il=value.length;i<il;i++){offset=i*4;uniform._array[offset]=value[i].x;uniform._array[offset+1]=value[i].y;uniform._array[offset+2]=value[i].z;uniform._array[offset+3]=value[i].w}_gl.uniform4fv(location,uniform._array)}else if(type==="m4"){if(uniform._array===undefined){uniform._array=new Float32Array(16)}value.flattenToArray(uniform._array);_gl.uniformMatrix4fv(location,false,uniform._array)}else if(type==="m4v"){if(uniform._array===undefined){uniform._array=new Float32Array(16*value.length)}for(i=0,il=value.length;i<il;i++){value[i].flattenToArrayOffset(uniform._array,i*16)}_gl.uniformMatrix4fv(location,false,uniform._array)}else if(type==="t"){texture=value;textureUnit=getTextureUnit();_gl.uniform1i(location,textureUnit);if(!texture)continue;if(texture.image instanceof Array&&texture.image.length===6){setCubeTexture(texture,textureUnit)}else if(texture instanceof THREE.WebGLRenderTargetCube){setCubeTextureDynamic(texture,textureUnit)}else{_this.setTexture(texture,textureUnit)}}else if(type==="tv"){if(uniform._array===undefined){uniform._array=[]}for(i=0,il=uniform.value.length;i<il;i++){uniform._array[i]=getTextureUnit()}_gl.uniform1iv(location,uniform._array);for(i=0,il=uniform.value.length;i<il;i++){texture=uniform.value[i];textureUnit=uniform._array[i];if(!texture)continue;_this.setTexture(texture,textureUnit)}}}}function setupMatrices(object,camera){object._modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);object._normalMatrix.getInverse(object._modelViewMatrix);object._normalMatrix.transpose()}function setColorGamma(array,offset,color,intensitySq){array[offset]=color.r*color.r*intensitySq;array[offset+1]=color.g*color.g*intensitySq;array[offset+2]=color.b*color.b*intensitySq}function setColorLinear(array,offset,color,intensity){array[offset]=color.r*intensity;array[offset+1]=color.g*intensity;array[offset+2]=color.b*intensity}function setupLights(program,lights){var l,ll,light,n,r=0,g=0,b=0,color,skyColor,groundColor,intensity,intensitySq,position,distance,zlights=_lights,dirColors=zlights.directional.colors,dirPositions=zlights.directional.positions,pointColors=zlights.point.colors,pointPositions=zlights.point.positions,pointDistances=zlights.point.distances,spotColors=zlights.spot.colors,spotPositions=zlights.spot.positions,spotDistances=zlights.spot.distances,spotDirections=zlights.spot.directions,spotAnglesCos=zlights.spot.anglesCos,spotExponents=zlights.spot.exponents,hemiSkyColors=zlights.hemi.skyColors,hemiGroundColors=zlights.hemi.groundColors,hemiPositions=zlights.hemi.positions,dirLength=0,pointLength=0,spotLength=0,hemiLength=0,dirCount=0,pointCount=0,spotCount=0,hemiCount=0,dirOffset=0,pointOffset=0,spotOffset=0,hemiOffset=0;for(l=0,ll=lights.length;l<ll;l++){light=lights[l];if(light.onlyShadow)continue;color=light.color;intensity=light.intensity;distance=light.distance;if(light instanceof THREE.AmbientLight){if(!light.visible)continue;if(_this.gammaInput){r+=color.r*color.r;g+=color.g*color.g;b+=color.b*color.b}else{r+=color.r;g+=color.g;b+=color.b}}else if(light instanceof THREE.DirectionalLight){dirCount+=1;if(!light.visible)continue;_direction.getPositionFromMatrix(light.matrixWorld);_vector3.getPositionFromMatrix(light.target.matrixWorld);_direction.sub(_vector3);_direction.normalize();if(_direction.x===0&&_direction.y===0&&_direction.z===0)continue;dirOffset=dirLength*3;dirPositions[dirOffset]=_direction.x;dirPositions[dirOffset+1]=_direction.y;dirPositions[dirOffset+2]=_direction.z;if(_this.gammaInput){setColorGamma(dirColors,dirOffset,color,intensity*intensity)}else{setColorLinear(dirColors,dirOffset,color,intensity)}dirLength+=1}else if(light instanceof THREE.PointLight){pointCount+=1;if(!light.visible)continue;pointOffset=pointLength*3;if(_this.gammaInput){setColorGamma(pointColors,pointOffset,color,intensity*intensity)}else{setColorLinear(pointColors,pointOffset,color,intensity)}_vector3.getPositionFromMatrix(light.matrixWorld);pointPositions[pointOffset]=_vector3.x;pointPositions[pointOffset+1]=_vector3.y;pointPositions[pointOffset+2]=_vector3.z;pointDistances[pointLength]=distance;pointLength+=1}else if(light instanceof THREE.SpotLight){spotCount+=1;if(!light.visible)continue;spotOffset=spotLength*3;if(_this.gammaInput){setColorGamma(spotColors,spotOffset,color,intensity*intensity)}else{setColorLinear(spotColors,spotOffset,color,intensity)}_vector3.getPositionFromMatrix(light.matrixWorld);spotPositions[spotOffset]=_vector3.x;spotPositions[spotOffset+1]=_vector3.y;spotPositions[spotOffset+2]=_vector3.z;spotDistances[spotLength]=distance;_direction.copy(_vector3);_vector3.getPositionFromMatrix(light.target.matrixWorld);_direction.sub(_vector3);_direction.normalize();spotDirections[spotOffset]=_direction.x;spotDirections[spotOffset+1]=_direction.y;spotDirections[spotOffset+2]=_direction.z;spotAnglesCos[spotLength]=Math.cos(light.angle);spotExponents[spotLength]=light.exponent;spotLength+=1}else if(light instanceof THREE.HemisphereLight){hemiCount+=1;if(!light.visible)continue;_direction.getPositionFromMatrix(light.matrixWorld);_direction.normalize();if(_direction.x===0&&_direction.y===0&&_direction.z===0)continue;hemiOffset=hemiLength*3;hemiPositions[hemiOffset]=_direction.x;hemiPositions[hemiOffset+1]=_direction.y;hemiPositions[hemiOffset+2]=_direction.z;skyColor=light.color;groundColor=light.groundColor;if(_this.gammaInput){intensitySq=intensity*intensity;setColorGamma(hemiSkyColors,hemiOffset,skyColor,intensitySq);setColorGamma(hemiGroundColors,hemiOffset,groundColor,intensitySq)}else{setColorLinear(hemiSkyColors,hemiOffset,skyColor,intensity);setColorLinear(hemiGroundColors,hemiOffset,groundColor,intensity)}hemiLength+=1}}for(l=dirLength*3,ll=Math.max(dirColors.length,dirCount*3);l<ll;l++)dirColors[l]=0;for(l=pointLength*3,ll=Math.max(pointColors.length,pointCount*3);l<ll;l++)pointColors[l]=0;for(l=spotLength*3,ll=Math.max(spotColors.length,spotCount*3);l<ll;l++)spotColors[l]=0;for(l=hemiLength*3,ll=Math.max(hemiSkyColors.length,hemiCount*3);l<ll;l++)hemiSkyColors[l]=0;for(l=hemiLength*3,ll=Math.max(hemiGroundColors.length,hemiCount*3);l<ll;l++)hemiGroundColors[l]=0;zlights.directional.length=dirLength;zlights.point.length=pointLength;zlights.spot.length=spotLength;zlights.hemi.length=hemiLength;zlights.ambient[0]=r;zlights.ambient[1]=g;zlights.ambient[2]=b}this.setFaceCulling=function(cullFace,frontFaceDirection){if(cullFace===THREE.CullFaceNone){_gl.disable(_gl.CULL_FACE)}else{if(frontFaceDirection===THREE.FrontFaceDirectionCW){_gl.frontFace(_gl.CW)}else{_gl.frontFace(_gl.CCW)}if(cullFace===THREE.CullFaceBack){_gl.cullFace(_gl.BACK)}else if(cullFace===THREE.CullFaceFront){_gl.cullFace(_gl.FRONT)}else{_gl.cullFace(_gl.FRONT_AND_BACK)}_gl.enable(_gl.CULL_FACE)}};this.setMaterialFaces=function(material){var doubleSided=material.side===THREE.DoubleSide;var flipSided=material.side===THREE.BackSide;if(_oldDoubleSided!==doubleSided){if(doubleSided){_gl.disable(_gl.CULL_FACE)}else{_gl.enable(_gl.CULL_FACE)}_oldDoubleSided=doubleSided}if(_oldFlipSided!==flipSided){if(flipSided){_gl.frontFace(_gl.CW)}else{_gl.frontFace(_gl.CCW)}_oldFlipSided=flipSided}};this.setDepthTest=function(depthTest){if(_oldDepthTest!==depthTest){if(depthTest){_gl.enable(_gl.DEPTH_TEST)}else{_gl.disable(_gl.DEPTH_TEST)}_oldDepthTest=depthTest}};this.setDepthWrite=function(depthWrite){if(_oldDepthWrite!==depthWrite){_gl.depthMask(depthWrite);_oldDepthWrite=depthWrite}};function setLineWidth(width){if(width!==_oldLineWidth){_gl.lineWidth(width);_oldLineWidth=width}}function setPolygonOffset(polygonoffset,factor,units){if(_oldPolygonOffset!==polygonoffset){if(polygonoffset){_gl.enable(_gl.POLYGON_OFFSET_FILL)}else{_gl.disable(_gl.POLYGON_OFFSET_FILL)}_oldPolygonOffset=polygonoffset}if(polygonoffset&&(_oldPolygonOffsetFactor!==factor||_oldPolygonOffsetUnits!==units)){_gl.polygonOffset(factor,units);_oldPolygonOffsetFactor=factor;_oldPolygonOffsetUnits=units}}this.setBlending=function(blending,blendEquation,blendSrc,blendDst){if(blending!==_oldBlending){if(blending===THREE.NoBlending){_gl.disable(_gl.BLEND)}else if(blending===THREE.AdditiveBlending){_gl.enable(_gl.BLEND);_gl.blendEquation(_gl.FUNC_ADD);_gl.blendFunc(_gl.SRC_ALPHA,_gl.ONE)}else if(blending===THREE.SubtractiveBlending){_gl.enable(_gl.BLEND);_gl.blendEquation(_gl.FUNC_ADD);_gl.blendFunc(_gl.ZERO,_gl.ONE_MINUS_SRC_COLOR)}else if(blending===THREE.MultiplyBlending){_gl.enable(_gl.BLEND);_gl.blendEquation(_gl.FUNC_ADD);_gl.blendFunc(_gl.ZERO,_gl.SRC_COLOR)}else if(blending===THREE.CustomBlending){_gl.enable(_gl.BLEND)}else{_gl.enable(_gl.BLEND);_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)}_oldBlending=blending}if(blending===THREE.CustomBlending){if(blendEquation!==_oldBlendEquation){_gl.blendEquation(paramThreeToGL(blendEquation));_oldBlendEquation=blendEquation}if(blendSrc!==_oldBlendSrc||blendDst!==_oldBlendDst){_gl.blendFunc(paramThreeToGL(blendSrc),paramThreeToGL(blendDst));_oldBlendSrc=blendSrc;_oldBlendDst=blendDst}}else{_oldBlendEquation=null;_oldBlendSrc=null;_oldBlendDst=null}};function generateDefines(defines){var value,chunk,chunks=[];for(var d in defines){value=defines[d];if(value===false)continue;chunk="#define "+d+" "+value;chunks.push(chunk)}return chunks.join("\n")}function buildProgram(shaderID,fragmentShader,vertexShader,uniforms,attributes,defines,parameters){var p,pl,d,program,code;var chunks=[];if(shaderID){chunks.push(shaderID)}else{chunks.push(fragmentShader);chunks.push(vertexShader)}for(d in defines){chunks.push(d);chunks.push(defines[d])}for(p in parameters){chunks.push(p);chunks.push(parameters[p])}code=chunks.join();for(p=0,pl=_programs.length;p<pl;p++){var programInfo=_programs[p];if(programInfo.code===code){programInfo.usedTimes++;return programInfo.program}}var shadowMapTypeDefine="SHADOWMAP_TYPE_BASIC";if(parameters.shadowMapType===THREE.PCFShadowMap){shadowMapTypeDefine="SHADOWMAP_TYPE_PCF"}else if(parameters.shadowMapType===THREE.PCFSoftShadowMap){shadowMapTypeDefine="SHADOWMAP_TYPE_PCF_SOFT"}var customDefines=generateDefines(defines);program=_gl.createProgram();var prefix_vertex=["precision "+_precision+" float;",customDefines,_supportsVertexTextures?"#define VERTEX_TEXTURES":"",_this.gammaInput?"#define GAMMA_INPUT":"",_this.gammaOutput?"#define GAMMA_OUTPUT":"",_this.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"","#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,"#define MAX_BONES "+parameters.maxBones,parameters.map?"#define USE_MAP":"",parameters.envMap?"#define USE_ENVMAP":"",parameters.lightMap?"#define USE_LIGHTMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.skinning?"#define USE_SKINNING":"",parameters.useVertexTexture?"#define BONE_TEXTURE":"",parameters.boneTextureWidth?"#define N_BONE_PIXEL_X "+parameters.boneTextureWidth.toFixed(1):"",parameters.boneTextureHeight?"#define N_BONE_PIXEL_Y "+parameters.boneTextureHeight.toFixed(1):"",parameters.morphTargets?"#define USE_MORPHTARGETS":"",parameters.morphNormals?"#define USE_MORPHNORMALS":"",parameters.perPixel?"#define PHONG_PER_PIXEL":"",parameters.wrapAround?"#define WRAP_AROUND":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.shadowMapCascade?"#define SHADOWMAP_CASCADE":"",parameters.sizeAttenuation?"#define USE_SIZEATTENUATION":"","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;","attribute vec2 uv2;","#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",""].join("\n");var prefix_fragment=["precision "+_precision+" float;",parameters.bumpMap||parameters.normalMap?"#extension GL_OES_standard_derivatives : enable":"",customDefines,"#define MAX_DIR_LIGHTS "+parameters.maxDirLights,"#define MAX_POINT_LIGHTS "+parameters.maxPointLights,"#define MAX_SPOT_LIGHTS "+parameters.maxSpotLights,"#define MAX_HEMI_LIGHTS "+parameters.maxHemiLights,"#define MAX_SHADOWS "+parameters.maxShadows,parameters.alphaTest?"#define ALPHATEST "+parameters.alphaTest:"",_this.gammaInput?"#define GAMMA_INPUT":"",_this.gammaOutput?"#define GAMMA_OUTPUT":"",_this.physicallyBasedShading?"#define PHYSICALLY_BASED_SHADING":"",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.lightMap?"#define USE_LIGHTMAP":"",parameters.bumpMap?"#define USE_BUMPMAP":"",parameters.normalMap?"#define USE_NORMALMAP":"",parameters.specularMap?"#define USE_SPECULARMAP":"",parameters.vertexColors?"#define USE_COLOR":"",parameters.metal?"#define METAL":"",parameters.perPixel?"#define PHONG_PER_PIXEL":"",parameters.wrapAround?"#define WRAP_AROUND":"",parameters.doubleSided?"#define DOUBLE_SIDED":"",parameters.flipSided?"#define FLIP_SIDED":"",parameters.shadowMapEnabled?"#define USE_SHADOWMAP":"",parameters.shadowMapEnabled?"#define "+shadowMapTypeDefine:"",parameters.shadowMapDebug?"#define SHADOWMAP_DEBUG":"",parameters.shadowMapCascade?"#define SHADOWMAP_CASCADE":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",""].join("\n");var glFragmentShader=getShader("fragment",prefix_fragment+fragmentShader);var glVertexShader=getShader("vertex",prefix_vertex+vertexShader);_gl.attachShader(program,glVertexShader);_gl.attachShader(program,glFragmentShader);_gl.linkProgram(program);if(!_gl.getProgramParameter(program,_gl.LINK_STATUS)){console.error("Could not initialise shader\n"+"VALIDATE_STATUS: "+_gl.getProgramParameter(program,_gl.VALIDATE_STATUS)+", gl error ["+_gl.getError()+"]")}_gl.deleteShader(glFragmentShader);_gl.deleteShader(glVertexShader);program.uniforms={};program.attributes={};var identifiers,u,a,i;identifiers=["viewMatrix","modelViewMatrix","projectionMatrix","normalMatrix","modelMatrix","cameraPosition","morphTargetInfluences"];if(parameters.useVertexTexture){identifiers.push("boneTexture")}else{identifiers.push("boneGlobalMatrices")}for(u in uniforms){identifiers.push(u)}cacheUniformLocations(program,identifiers);identifiers=["position","normal","uv","uv2","tangent","color","skinIndex","skinWeight","lineDistance"];for(i=0;i<parameters.maxMorphTargets;i++){identifiers.push("morphTarget"+i)}for(i=0;i<parameters.maxMorphNormals;i++){identifiers.push("morphNormal"+i)}for(a in attributes){identifiers.push(a)}cacheAttributeLocations(program,identifiers);program.id=_programs_counter++;_programs.push({program:program,code:code,usedTimes:1});_this.info.memory.programs=_programs.length;return program}function cacheUniformLocations(program,identifiers){var i,l,id;for(i=0,l=identifiers.length;i<l;i++){id=identifiers[i];program.uniforms[id]=_gl.getUniformLocation(program,id)}}function cacheAttributeLocations(program,identifiers){var i,l,id;for(i=0,l=identifiers.length;i<l;i++){id=identifiers[i];program.attributes[id]=_gl.getAttribLocation(program,id)}}function addLineNumbers(string){var chunks=string.split("\n");for(var i=0,il=chunks.length;i<il;i++){chunks[i]=i+1+": "+chunks[i]}return chunks.join("\n")}function getShader(type,string){var shader;if(type==="fragment"){shader=_gl.createShader(_gl.FRAGMENT_SHADER)}else if(type==="vertex"){shader=_gl.createShader(_gl.VERTEX_SHADER)}_gl.shaderSource(shader,string);_gl.compileShader(shader);if(!_gl.getShaderParameter(shader,_gl.COMPILE_STATUS)){console.error(_gl.getShaderInfoLog(shader));console.error(addLineNumbers(string));return null}return shader}function isPowerOfTwo(value){return(value&value-1)===0}function setTextureParameters(textureType,texture,isImagePowerOfTwo){if(isImagePowerOfTwo){_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);_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter))}if(_glExtensionTextureFilterAnisotropic&&texture.type!==THREE.FloatType){if(texture.anisotropy>1||texture.__oldAnisotropy){_gl.texParameterf(textureType,_glExtensionTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,_maxAnisotropy));texture.__oldAnisotropy=texture.anisotropy}}}this.setTexture=function(texture,slot){if(texture.needsUpdate){if(!texture.__webglInit){texture.__webglInit=true;texture.addEventListener("dispose",onTextureDispose);texture.__webglTexture=_gl.createTexture();_this.info.memory.textures++}_gl.activeTexture(_gl.TEXTURE0+slot);_gl.bindTexture(_gl.TEXTURE_2D,texture.__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=texture.image,isImagePowerOfTwo=isPowerOfTwo(image.width)&&isPowerOfTwo(image.height),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isImagePowerOfTwo);var mipmap,mipmaps=texture.mipmaps;if(texture instanceof THREE.DataTexture){if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];_gl.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data)}texture.generateMipmaps=false}else{_gl.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data)}}else if(texture instanceof THREE.CompressedTexture){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];_gl.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data)}}else{if(mipmaps.length>0&&isImagePowerOfTwo){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];_gl.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap)}texture.generateMipmaps=false}else{_gl.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,texture.image)}}if(texture.generateMipmaps&&isImagePowerOfTwo)_gl.generateMipmap(_gl.TEXTURE_2D);texture.needsUpdate=false;if(texture.onUpdate)texture.onUpdate()}else{_gl.activeTexture(_gl.TEXTURE0+slot);_gl.bindTexture(_gl.TEXTURE_2D,texture.__webglTexture)}};function clampToMaxSize(image,maxSize){if(image.width<=maxSize&&image.height<=maxSize){return image}var maxDimension=Math.max(image.width,image.height);var newWidth=Math.floor(image.width*maxSize/maxDimension);var newHeight=Math.floor(image.height*maxSize/maxDimension);var canvas=document.createElement("canvas");canvas.width=newWidth;canvas.height=newHeight;var ctx=canvas.getContext("2d");ctx.drawImage(image,0,0,image.width,image.height,0,0,newWidth,newHeight);return canvas}function setCubeTexture(texture,slot){if(texture.image.length===6){if(texture.needsUpdate){if(!texture.image.__webglTextureCube){texture.image.__webglTextureCube=_gl.createTexture();_this.info.memory.textures++}_gl.activeTexture(_gl.TEXTURE0+slot);_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,texture.image.__webglTextureCube);_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);var isCompressed=texture instanceof THREE.CompressedTexture;var cubeImage=[];for(var i=0;i<6;i++){if(_this.autoScaleCubemaps&&!isCompressed){cubeImage[i]=clampToMaxSize(texture.image[i],_maxCubemapSize)}else{cubeImage[i]=texture.image[i]}}var image=cubeImage[0],isImagePowerOfTwo=isPowerOfTwo(image.width)&&isPowerOfTwo(image.height),glFormat=paramThreeToGL(texture.format),glType=paramThreeToGL(texture.type);setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isImagePowerOfTwo);for(var i=0;i<6;i++){if(isCompressed){var mipmap,mipmaps=cubeImage[i].mipmaps;for(var j=0,jl=mipmaps.length;j<jl;j++){mipmap=mipmaps[j];_gl.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data)}}else{_gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i])}}if(texture.generateMipmaps&&isImagePowerOfTwo){_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP)}texture.needsUpdate=false;if(texture.onUpdate)texture.onUpdate()}else{_gl.activeTexture(_gl.TEXTURE0+slot);_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,texture.image.__webglTextureCube)}}}function setCubeTextureDynamic(texture,slot){_gl.activeTexture(_gl.TEXTURE0+slot);_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,texture.__webglTexture)}function setupFrameBuffer(framebuffer,renderTarget,textureTarget){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,textureTarget,renderTarget.__webglTexture,0)}function setupRenderBuffer(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{_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.RGBA4,renderTarget.width,renderTarget.height)}}this.setRenderTarget=function(renderTarget){var isCube=renderTarget instanceof THREE.WebGLRenderTargetCube;if(renderTarget&&!renderTarget.__webglFramebuffer){if(renderTarget.depthBuffer===undefined)renderTarget.depthBuffer=true;if(renderTarget.stencilBuffer===undefined)renderTarget.stencilBuffer=true;renderTarget.addEventListener("dispose",onRenderTargetDispose);renderTarget.__webglTexture=_gl.createTexture();_this.info.memory.textures++;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget.width)&&isPowerOfTwo(renderTarget.height),glFormat=paramThreeToGL(renderTarget.format),glType=paramThreeToGL(renderTarget.type);if(isCube){renderTarget.__webglFramebuffer=[];renderTarget.__webglRenderbuffer=[];_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,renderTarget.__webglTexture);setTextureParameters(_gl.TEXTURE_CUBE_MAP,renderTarget,isTargetPowerOfTwo);for(var i=0;i<6;i++){renderTarget.__webglFramebuffer[i]=_gl.createFramebuffer();renderTarget.__webglRenderbuffer[i]=_gl.createRenderbuffer();_gl.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null);setupFrameBuffer(renderTarget.__webglFramebuffer[i],renderTarget,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i);setupRenderBuffer(renderTarget.__webglRenderbuffer[i],renderTarget)}if(isTargetPowerOfTwo)_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP)}else{renderTarget.__webglFramebuffer=_gl.createFramebuffer();if(renderTarget.shareDepthFrom){renderTarget.__webglRenderbuffer=renderTarget.shareDepthFrom.__webglRenderbuffer}else{renderTarget.__webglRenderbuffer=_gl.createRenderbuffer()}_gl.bindTexture(_gl.TEXTURE_2D,renderTarget.__webglTexture);setTextureParameters(_gl.TEXTURE_2D,renderTarget,isTargetPowerOfTwo);_gl.texImage2D(_gl.TEXTURE_2D,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null);setupFrameBuffer(renderTarget.__webglFramebuffer,renderTarget,_gl.TEXTURE_2D);if(renderTarget.shareDepthFrom){if(renderTarget.depthBuffer&&!renderTarget.stencilBuffer){_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderTarget.__webglRenderbuffer)}else if(renderTarget.depthBuffer&&renderTarget.stencilBuffer){_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderTarget.__webglRenderbuffer)}}else{setupRenderBuffer(renderTarget.__webglRenderbuffer,renderTarget)}if(isTargetPowerOfTwo)_gl.generateMipmap(_gl.TEXTURE_2D)}if(isCube){_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,null)}else{_gl.bindTexture(_gl.TEXTURE_2D,null)}_gl.bindRenderbuffer(_gl.RENDERBUFFER,null);_gl.bindFramebuffer(_gl.FRAMEBUFFER,null)}var framebuffer,width,height,vx,vy;if(renderTarget){if(isCube){framebuffer=renderTarget.__webglFramebuffer[renderTarget.activeCubeFace]}else{framebuffer=renderTarget.__webglFramebuffer}width=renderTarget.width;height=renderTarget.height;vx=0;vy=0}else{framebuffer=null;width=_viewportWidth;height=_viewportHeight;vx=_viewportX;vy=_viewportY}if(framebuffer!==_currentFramebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_gl.viewport(vx,vy,width,height);_currentFramebuffer=framebuffer}_currentWidth=width;_currentHeight=height};function updateRenderTargetMipmap(renderTarget){if(renderTarget instanceof THREE.WebGLRenderTargetCube){_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,renderTarget.__webglTexture);_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP);_gl.bindTexture(_gl.TEXTURE_CUBE_MAP,null)}else{_gl.bindTexture(_gl.TEXTURE_2D,renderTarget.__webglTexture);_gl.generateMipmap(_gl.TEXTURE_2D);_gl.bindTexture(_gl.TEXTURE_2D,null)}}function filterFallback(f){if(f===THREE.NearestFilter||f===THREE.NearestMipMapNearestFilter||f===THREE.NearestMipMapLinearFilter){return _gl.NEAREST}return _gl.LINEAR}function paramThreeToGL(p){if(p===THREE.RepeatWrapping)return _gl.REPEAT;if(p===THREE.ClampToEdgeWrapping)return _gl.CLAMP_TO_EDGE;if(p===THREE.MirroredRepeatWrapping)return _gl.MIRRORED_REPEAT;if(p===THREE.NearestFilter)return _gl.NEAREST;if(p===THREE.NearestMipMapNearestFilter)return _gl.NEAREST_MIPMAP_NEAREST;if(p===THREE.NearestMipMapLinearFilter)return _gl.NEAREST_MIPMAP_LINEAR;if(p===THREE.LinearFilter)return _gl.LINEAR;if(p===THREE.LinearMipMapNearestFilter)return _gl.LINEAR_MIPMAP_NEAREST;if(p===THREE.LinearMipMapLinearFilter)return _gl.LINEAR_MIPMAP_LINEAR;if(p===THREE.UnsignedByteType)return _gl.UNSIGNED_BYTE;if(p===THREE.UnsignedShort4444Type)return _gl.UNSIGNED_SHORT_4_4_4_4;if(p===THREE.UnsignedShort5551Type)return _gl.UNSIGNED_SHORT_5_5_5_1;if(p===THREE.UnsignedShort565Type)return _gl.UNSIGNED_SHORT_5_6_5;if(p===THREE.ByteType)return _gl.BYTE;if(p===THREE.ShortType)return _gl.SHORT;if(p===THREE.UnsignedShortType)return _gl.UNSIGNED_SHORT;if(p===THREE.IntType)return _gl.INT;if(p===THREE.UnsignedIntType)return _gl.UNSIGNED_INT;if(p===THREE.FloatType)return _gl.FLOAT;if(p===THREE.AlphaFormat)return _gl.ALPHA;if(p===THREE.RGBFormat)return _gl.RGB;if(p===THREE.RGBAFormat)return _gl.RGBA;if(p===THREE.LuminanceFormat)return _gl.LUMINANCE;if(p===THREE.LuminanceAlphaFormat)return _gl.LUMINANCE_ALPHA;if(p===THREE.AddEquation)return _gl.FUNC_ADD;if(p===THREE.SubtractEquation)return _gl.FUNC_SUBTRACT;if(p===THREE.ReverseSubtractEquation)return _gl.FUNC_REVERSE_SUBTRACT;if(p===THREE.ZeroFactor)return _gl.ZERO;if(p===THREE.OneFactor)return _gl.ONE;if(p===THREE.SrcColorFactor)return _gl.SRC_COLOR;if(p===THREE.OneMinusSrcColorFactor)return _gl.ONE_MINUS_SRC_COLOR;if(p===THREE.SrcAlphaFactor)return _gl.SRC_ALPHA;if(p===THREE.OneMinusSrcAlphaFactor)return _gl.ONE_MINUS_SRC_ALPHA;if(p===THREE.DstAlphaFactor)return _gl.DST_ALPHA;if(p===THREE.OneMinusDstAlphaFactor)return _gl.ONE_MINUS_DST_ALPHA;if(p===THREE.DstColorFactor)return _gl.DST_COLOR;if(p===THREE.OneMinusDstColorFactor)return _gl.ONE_MINUS_DST_COLOR;if(p===THREE.SrcAlphaSaturateFactor)return _gl.SRC_ALPHA_SATURATE;if(_glExtensionCompressedTextureS3TC!==undefined){if(p===THREE.RGB_S3TC_DXT1_Format)return _glExtensionCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT1_Format)return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(p===THREE.RGBA_S3TC_DXT3_Format)return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(p===THREE.RGBA_S3TC_DXT5_Format)return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT;
}return 0}function allocateBones(object){if(_supportsBoneTextures&&object&&object.useVertexTexture){return 1024}else{var nVertexUniforms=_gl.getParameter(_gl.MAX_VERTEX_UNIFORM_VECTORS);var nVertexMatrices=Math.floor((nVertexUniforms-20)/4);var maxBones=nVertexMatrices;if(object!==undefined&&object instanceof THREE.SkinnedMesh){maxBones=Math.min(object.bones.length,maxBones);if(maxBones<object.bones.length){console.warn("WebGLRenderer: too many bones - "+object.bones.length+", this GPU supports just "+maxBones+" (try OpenGL instead of ANGLE)")}}return maxBones}}function allocateLights(lights){var l,ll,light,dirLights,pointLights,spotLights,hemiLights;dirLights=pointLights=spotLights=hemiLights=0;for(l=0,ll=lights.length;l<ll;l++){light=lights[l];if(light.onlyShadow)continue;if(light instanceof THREE.DirectionalLight)dirLights++;if(light instanceof THREE.PointLight)pointLights++;if(light instanceof THREE.SpotLight)spotLights++;if(light instanceof THREE.HemisphereLight)hemiLights++}return{directional:dirLights,point:pointLights,spot:spotLights,hemi:hemiLights}}function allocateShadows(lights){var l,ll,light,maxShadows=0;for(l=0,ll=lights.length;l<ll;l++){light=lights[l];if(!light.castShadow)continue;if(light instanceof THREE.SpotLight)maxShadows++;if(light instanceof THREE.DirectionalLight&&!light.shadowCascade)maxShadows++}return maxShadows}function initGL(){try{if(!(_gl=_canvas.getContext("experimental-webgl",{alpha:_alpha,premultipliedAlpha:_premultipliedAlpha,antialias:_antialias,stencil:_stencil,preserveDrawingBuffer:_preserveDrawingBuffer}))){throw"Error creating WebGL context."}}catch(error){console.error(error)}_glExtensionTextureFloat=_gl.getExtension("OES_texture_float");_glExtensionStandardDerivatives=_gl.getExtension("OES_standard_derivatives");_glExtensionTextureFilterAnisotropic=_gl.getExtension("EXT_texture_filter_anisotropic")||_gl.getExtension("MOZ_EXT_texture_filter_anisotropic")||_gl.getExtension("WEBKIT_EXT_texture_filter_anisotropic");_glExtensionCompressedTextureS3TC=_gl.getExtension("WEBGL_compressed_texture_s3tc")||_gl.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||_gl.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");if(!_glExtensionTextureFloat){console.log("THREE.WebGLRenderer: Float textures not supported.")}if(!_glExtensionStandardDerivatives){console.log("THREE.WebGLRenderer: Standard derivatives not supported.")}if(!_glExtensionTextureFilterAnisotropic){console.log("THREE.WebGLRenderer: Anisotropic texture filtering not supported.")}if(!_glExtensionCompressedTextureS3TC){console.log("THREE.WebGLRenderer: S3TC compressed textures not supported.")}if(_gl.getShaderPrecisionFormat===undefined){_gl.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}}}}function setDefaultGLState(){_gl.clearColor(0,0,0,1);_gl.clearDepth(1);_gl.clearStencil(0);_gl.enable(_gl.DEPTH_TEST);_gl.depthFunc(_gl.LEQUAL);_gl.frontFace(_gl.CCW);_gl.cullFace(_gl.BACK);_gl.enable(_gl.CULL_FACE);_gl.enable(_gl.BLEND);_gl.blendEquation(_gl.FUNC_ADD);_gl.blendFunc(_gl.SRC_ALPHA,_gl.ONE_MINUS_SRC_ALPHA);_gl.clearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha)}this.shadowMapPlugin=new THREE.ShadowMapPlugin;this.addPrePlugin(this.shadowMapPlugin);this.addPostPlugin(new THREE.SpritePlugin);this.addPostPlugin(new THREE.LensFlarePlugin)};THREE.WebGLRenderTarget=function(width,height,options){THREE.EventDispatcher.call(this);this.width=width;this.height=height;options=options||{};this.wrapS=options.wrapS!==undefined?options.wrapS:THREE.ClampToEdgeWrapping;this.wrapT=options.wrapT!==undefined?options.wrapT:THREE.ClampToEdgeWrapping;this.magFilter=options.magFilter!==undefined?options.magFilter:THREE.LinearFilter;this.minFilter=options.minFilter!==undefined?options.minFilter:THREE.LinearMipMapLinearFilter;this.anisotropy=options.anisotropy!==undefined?options.anisotropy:1;this.offset=new THREE.Vector2(0,0);this.repeat=new THREE.Vector2(1,1);this.format=options.format!==undefined?options.format:THREE.RGBAFormat;this.type=options.type!==undefined?options.type:THREE.UnsignedByteType;this.depthBuffer=options.depthBuffer!==undefined?options.depthBuffer:true;this.stencilBuffer=options.stencilBuffer!==undefined?options.stencilBuffer:true;this.generateMipmaps=true;this.shareDepthFrom=null};THREE.WebGLRenderTarget.prototype.clone=function(){var tmp=new THREE.WebGLRenderTarget(this.width,this.height);tmp.wrapS=this.wrapS;tmp.wrapT=this.wrapT;tmp.magFilter=this.magFilter;tmp.minFilter=this.minFilter;tmp.anisotropy=this.anisotropy;tmp.offset.copy(this.offset);tmp.repeat.copy(this.repeat);tmp.format=this.format;tmp.type=this.type;tmp.depthBuffer=this.depthBuffer;tmp.stencilBuffer=this.stencilBuffer;tmp.generateMipmaps=this.generateMipmaps;tmp.shareDepthFrom=this.shareDepthFrom;return tmp};THREE.WebGLRenderTarget.prototype.dispose=function(){this.dispatchEvent({type:"dispose"})};THREE.WebGLRenderTargetCube=function(width,height,options){THREE.WebGLRenderTarget.call(this,width,height,options);this.activeCubeFace=0};THREE.WebGLRenderTargetCube.prototype=Object.create(THREE.WebGLRenderTarget.prototype);THREE.RenderableVertex=function(){this.positionWorld=new THREE.Vector3;this.positionScreen=new THREE.Vector4;this.visible=true};THREE.RenderableVertex.prototype.copy=function(vertex){this.positionWorld.copy(vertex.positionWorld);this.positionScreen.copy(vertex.positionScreen)};THREE.RenderableFace3=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.color=null;this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableFace4=function(){this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.v3=new THREE.RenderableVertex;this.v4=new THREE.RenderableVertex;this.centroidModel=new THREE.Vector3;this.normalModel=new THREE.Vector3;this.normalModelView=new THREE.Vector3;this.vertexNormalsLength=0;this.vertexNormalsModel=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.vertexNormalsModelView=[new THREE.Vector3,new THREE.Vector3,new THREE.Vector3,new THREE.Vector3];this.color=null;this.material=null;this.uvs=[[]];this.z=null};THREE.RenderableObject=function(){this.object=null;this.z=null};THREE.RenderableParticle=function(){this.object=null;this.x=null;this.y=null;this.z=null;this.rotation=null;this.scale=new THREE.Vector2;this.material=null};THREE.RenderableLine=function(){this.z=null;this.v1=new THREE.RenderableVertex;this.v2=new THREE.RenderableVertex;this.material=null};THREE.GeometryUtils={merge:function(geometry1,object2){var matrix,normalMatrix,vertexOffset=geometry1.vertices.length,uvPosition=geometry1.faceVertexUvs[0].length,geometry2=object2 instanceof THREE.Mesh?object2.geometry:object2,vertices1=geometry1.vertices,vertices2=geometry2.vertices,faces1=geometry1.faces,faces2=geometry2.faces,uvs1=geometry1.faceVertexUvs[0],uvs2=geometry2.faceVertexUvs[0];if(object2 instanceof THREE.Mesh){object2.matrixAutoUpdate&&object2.updateMatrix();matrix=object2.matrix;normalMatrix=new THREE.Matrix3;normalMatrix.getInverse(matrix);normalMatrix.transpose()}for(var i=0,il=vertices2.length;i<il;i++){var vertex=vertices2[i];var vertexCopy=vertex.clone();if(matrix)vertexCopy.applyMatrix4(matrix);vertices1.push(vertexCopy)}for(i=0,il=faces2.length;i<il;i++){var face=faces2[i],faceCopy,normal,color,faceVertexNormals=face.vertexNormals,faceVertexColors=face.vertexColors;if(face instanceof THREE.Face3){faceCopy=new THREE.Face3(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset)}else if(face instanceof THREE.Face4){faceCopy=new THREE.Face4(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset,face.d+vertexOffset)}faceCopy.normal.copy(face.normal);if(normalMatrix){faceCopy.normal.applyMatrix3(normalMatrix).normalize()}for(var j=0,jl=faceVertexNormals.length;j<jl;j++){normal=faceVertexNormals[j].clone();if(normalMatrix){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;faceCopy.centroid.copy(face.centroid);if(matrix){faceCopy.centroid.applyMatrix4(matrix)}faces1.push(faceCopy)}for(i=0,il=uvs2.length;i<il;i++){var uv=uvs2[i],uvCopy=[];for(var j=0,jl=uv.length;j<jl;j++){uvCopy.push(new THREE.Vector2(uv[j].x,uv[j].y))}uvs1.push(uvCopy)}},removeMaterials:function(geometry,materialIndexArray){var materialIndexMap={};for(var i=0,il=materialIndexArray.length;i<il;i++){materialIndexMap[materialIndexArray[i]]=true}var face,newFaces=[];for(var i=0,il=geometry.faces.length;i<il;i++){face=geometry.faces[i];if(!(face.materialIndex in materialIndexMap))newFaces.push(face)}geometry.faces=newFaces},randomPointInTriangle:function(vectorA,vectorB,vectorC){var a,b,c,point=new THREE.Vector3,tmp=THREE.GeometryUtils.__v1;a=THREE.GeometryUtils.random();b=THREE.GeometryUtils.random();if(a+b>1){a=1-a;b=1-b}c=1-a-b;point.copy(vectorA);point.multiplyScalar(a);tmp.copy(vectorB);tmp.multiplyScalar(b);point.add(tmp);tmp.copy(vectorC);tmp.multiplyScalar(c);point.add(tmp);return point},randomPointInFace:function(face,geometry,useCachedAreas){var vA,vB,vC,vD;if(face instanceof THREE.Face3){vA=geometry.vertices[face.a];vB=geometry.vertices[face.b];vC=geometry.vertices[face.c];return THREE.GeometryUtils.randomPointInTriangle(vA,vB,vC)}else if(face instanceof THREE.Face4){vA=geometry.vertices[face.a];vB=geometry.vertices[face.b];vC=geometry.vertices[face.c];vD=geometry.vertices[face.d];var area1,area2;if(useCachedAreas){if(face._area1&&face._area2){area1=face._area1;area2=face._area2}else{area1=THREE.GeometryUtils.triangleArea(vA,vB,vD);area2=THREE.GeometryUtils.triangleArea(vB,vC,vD);face._area1=area1;face._area2=area2}}else{area1=THREE.GeometryUtils.triangleArea(vA,vB,vD),area2=THREE.GeometryUtils.triangleArea(vB,vC,vD)}var r=THREE.GeometryUtils.random()*(area1+area2);if(r<area1){return THREE.GeometryUtils.randomPointInTriangle(vA,vB,vD)}else{return THREE.GeometryUtils.randomPointInTriangle(vB,vC,vD)}}},randomPointsInGeometry:function(geometry,n){var face,i,faces=geometry.faces,vertices=geometry.vertices,il=faces.length,totalArea=0,cumulativeAreas=[],vA,vB,vC,vD;for(i=0;i<il;i++){face=faces[i];if(face instanceof THREE.Face3){vA=vertices[face.a];vB=vertices[face.b];vC=vertices[face.c];face._area=THREE.GeometryUtils.triangleArea(vA,vB,vC)}else if(face instanceof THREE.Face4){vA=vertices[face.a];vB=vertices[face.b];vC=vertices[face.c];vD=vertices[face.d];face._area1=THREE.GeometryUtils.triangleArea(vA,vB,vD);face._area2=THREE.GeometryUtils.triangleArea(vB,vC,vD);face._area=face._area1+face._area2}totalArea+=face._area;cumulativeAreas[i]=totalArea}function binarySearchIndices(value){function binarySearch(start,end){if(end<start)return start;var mid=start+Math.floor((end-start)/2);if(cumulativeAreas[mid]>value){return binarySearch(start,mid-1)}else if(cumulativeAreas[mid]<value){return binarySearch(mid+1,end)}else{return mid}}var result=binarySearch(0,cumulativeAreas.length-1);return result}var r,index,result=[];var stats={};for(i=0;i<n;i++){r=THREE.GeometryUtils.random()*totalArea;index=binarySearchIndices(r);result[i]=THREE.GeometryUtils.randomPointInFace(faces[index],geometry,true);if(!stats[index]){stats[index]=1}else{stats[index]+=1}}return result},triangleArea:function(vectorA,vectorB,vectorC){var tmp1=THREE.GeometryUtils.__v1,tmp2=THREE.GeometryUtils.__v2;tmp1.subVectors(vectorB,vectorA);tmp2.subVectors(vectorC,vectorA);tmp1.cross(tmp2);return.5*tmp1.length()},center:function(geometry){geometry.computeBoundingBox();var bb=geometry.boundingBox;var offset=new THREE.Vector3;offset.addVectors(bb.min,bb.max);offset.multiplyScalar(-.5);geometry.applyMatrix((new THREE.Matrix4).makeTranslation(offset.x,offset.y,offset.z));geometry.computeBoundingBox();return offset},normalizeUVs:function(geometry){var uvSet=geometry.faceVertexUvs[0];for(var i=0,il=uvSet.length;i<il;i++){var uvs=uvSet[i];for(var j=0,jl=uvs.length;j<jl;j++){if(uvs[j].x!==1)uvs[j].x=uvs[j].x-Math.floor(uvs[j].x);if(uvs[j].y!==1)uvs[j].y=uvs[j].y-Math.floor(uvs[j].y)}}},triangulateQuads:function(geometry){var i,il,j,jl;var faces=[];var faceUvs=[];var faceVertexUvs=[];for(i=0,il=geometry.faceUvs.length;i<il;i++){faceUvs[i]=[]}for(i=0,il=geometry.faceVertexUvs.length;i<il;i++){faceVertexUvs[i]=[]}for(i=0,il=geometry.faces.length;i<il;i++){var face=geometry.faces[i];if(face instanceof THREE.Face4){var a=face.a;var b=face.b;var c=face.c;var d=face.d;var triA=new THREE.Face3;var triB=new THREE.Face3;triA.color.copy(face.color);triB.color.copy(face.color);triA.materialIndex=face.materialIndex;triB.materialIndex=face.materialIndex;triA.a=a;triA.b=b;triA.c=d;triB.a=b;triB.b=c;triB.c=d;if(face.vertexColors.length===4){triA.vertexColors[0]=face.vertexColors[0].clone();triA.vertexColors[1]=face.vertexColors[1].clone();triA.vertexColors[2]=face.vertexColors[3].clone();triB.vertexColors[0]=face.vertexColors[1].clone();triB.vertexColors[1]=face.vertexColors[2].clone();triB.vertexColors[2]=face.vertexColors[3].clone()}faces.push(triA,triB);for(j=0,jl=geometry.faceVertexUvs.length;j<jl;j++){if(geometry.faceVertexUvs[j].length){var uvs=geometry.faceVertexUvs[j][i];var uvA=uvs[0];var uvB=uvs[1];var uvC=uvs[2];var uvD=uvs[3];var uvsTriA=[uvA.clone(),uvB.clone(),uvD.clone()];var uvsTriB=[uvB.clone(),uvC.clone(),uvD.clone()];faceVertexUvs[j].push(uvsTriA,uvsTriB)}}for(j=0,jl=geometry.faceUvs.length;j<jl;j++){if(geometry.faceUvs[j].length){var faceUv=geometry.faceUvs[j][i];faceUvs[j].push(faceUv,faceUv)}}}else{faces.push(face);for(j=0,jl=geometry.faceUvs.length;j<jl;j++){faceUvs[j].push(geometry.faceUvs[j][i])}for(j=0,jl=geometry.faceVertexUvs.length;j<jl;j++){faceVertexUvs[j].push(geometry.faceVertexUvs[j][i])}}}geometry.faces=faces;geometry.faceUvs=faceUvs;geometry.faceVertexUvs=faceVertexUvs;geometry.computeCentroids();geometry.computeFaceNormals();geometry.computeVertexNormals();if(geometry.hasTangents)geometry.computeTangents()},setMaterialIndex:function(geometry,index,startFace,endFace){var faces=geometry.faces;var start=startFace||0;var end=endFace||faces.length-1;for(var i=start;i<=end;i++){faces[i].materialIndex=index}}};THREE.GeometryUtils.random=THREE.Math.random16;THREE.GeometryUtils.__v1=new THREE.Vector3;THREE.GeometryUtils.__v2=new THREE.Vector3;THREE.ImageUtils={crossOrigin:"anonymous",loadTexture:function(url,mapping,onLoad,onError){var image=new Image;var texture=new THREE.Texture(image,mapping);var loader=new THREE.ImageLoader;loader.addEventListener("load",function(event){texture.image=event.content;texture.needsUpdate=true;if(onLoad)onLoad(texture)});loader.addEventListener("error",function(event){if(onError)onError(event.message)});loader.crossOrigin=this.crossOrigin;loader.load(url,image);texture.sourceFile=url;return texture},loadCompressedTexture:function(url,mapping,onLoad,onError){var texture=new THREE.CompressedTexture;texture.mapping=mapping;var request=new XMLHttpRequest;request.onload=function(){var buffer=request.response;var dds=THREE.ImageUtils.parseDDS(buffer,true);texture.format=dds.format;texture.mipmaps=dds.mipmaps;texture.image.width=dds.width;texture.image.height=dds.height;texture.generateMipmaps=false;texture.needsUpdate=true;if(onLoad)onLoad(texture)};request.onerror=onError;request.open("GET",url,true);request.responseType="arraybuffer";request.send(null);return texture},loadTextureCube:function(array,mapping,onLoad,onError){var images=[];images.loadCount=0;var texture=new THREE.Texture;texture.image=images;if(mapping!==undefined)texture.mapping=mapping;texture.flipY=false;for(var i=0,il=array.length;i<il;++i){var cubeImage=new Image;images[i]=cubeImage;cubeImage.onload=function(){images.loadCount+=1;if(images.loadCount===6){texture.needsUpdate=true;if(onLoad)onLoad(texture)}};cubeImage.onerror=onError;cubeImage.crossOrigin=this.crossOrigin;cubeImage.src=array[i]}return texture},loadCompressedTextureCube:function(array,mapping,onLoad,onError){var images=[];images.loadCount=0;var texture=new THREE.CompressedTexture;texture.image=images;if(mapping!==undefined)texture.mapping=mapping;texture.flipY=false;texture.generateMipmaps=false;var generateCubeFaceCallback=function(rq,img){return function(){var buffer=rq.response;var dds=THREE.ImageUtils.parseDDS(buffer,true);img.format=dds.format;img.mipmaps=dds.mipmaps;img.width=dds.width;img.height=dds.height;images.loadCount+=1;if(images.loadCount===6){texture.format=dds.format;texture.needsUpdate=true;if(onLoad)onLoad(texture)}}};if(array instanceof Array){for(var i=0,il=array.length;i<il;++i){var cubeImage={};images[i]=cubeImage;var request=new XMLHttpRequest;request.onload=generateCubeFaceCallback(request,cubeImage);request.onerror=onError;var url=array[i];request.open("GET",url,true);request.responseType="arraybuffer";request.send(null)}}else{var url=array;var request=new XMLHttpRequest;request.onload=function(){var buffer=request.response;var dds=THREE.ImageUtils.parseDDS(buffer,true);if(dds.isCubemap){var faces=dds.mipmaps.length/dds.mipmapCount;for(var f=0;f<faces;f++){images[f]={mipmaps:[]};for(var i=0;i<dds.mipmapCount;i++){images[f].mipmaps.push(dds.mipmaps[f*dds.mipmapCount+i]);images[f].format=dds.format;images[f].width=dds.width;images[f].height=dds.height}}texture.format=dds.format;texture.needsUpdate=true;if(onLoad)onLoad(texture)}};request.onerror=onError;request.open("GET",url,true);request.responseType="arraybuffer";request.send(null)}return texture},parseDDS:function(buffer,loadMipmaps){var dds={mipmaps:[],width:0,height:0,format:null,mipmapCount:1};var DDS_MAGIC=542327876;var DDSD_CAPS=1,DDSD_HEIGHT=2,DDSD_WIDTH=4,DDSD_PITCH=8,DDSD_PIXELFORMAT=4096,DDSD_MIPMAPCOUNT=131072,DDSD_LINEARSIZE=524288,DDSD_DEPTH=8388608;var DDSCAPS_COMPLEX=8,DDSCAPS_MIPMAP=4194304,DDSCAPS_TEXTURE=4096;var DDSCAPS2_CUBEMAP=512,DDSCAPS2_CUBEMAP_POSITIVEX=1024,DDSCAPS2_CUBEMAP_NEGATIVEX=2048,DDSCAPS2_CUBEMAP_POSITIVEY=4096,DDSCAPS2_CUBEMAP_NEGATIVEY=8192,DDSCAPS2_CUBEMAP_POSITIVEZ=16384,DDSCAPS2_CUBEMAP_NEGATIVEZ=32768,DDSCAPS2_VOLUME=2097152;var DDPF_ALPHAPIXELS=1,DDPF_ALPHA=2,DDPF_FOURCC=4,DDPF_RGB=64,DDPF_YUV=512,DDPF_LUMINANCE=131072;function fourCCToInt32(value){return value.charCodeAt(0)+(value.charCodeAt(1)<<8)+(value.charCodeAt(2)<<16)+(value.charCodeAt(3)<<24)}function int32ToFourCC(value){return String.fromCharCode(value&255,value>>8&255,value>>16&255,value>>24&255)}var FOURCC_DXT1=fourCCToInt32("DXT1");var FOURCC_DXT3=fourCCToInt32("DXT3");var FOURCC_DXT5=fourCCToInt32("DXT5");var headerLengthInt=31;var off_magic=0;var off_size=1;var off_flags=2;var off_height=3;var off_width=4;var off_mipmapCount=7;var off_pfFlags=20;var off_pfFourCC=21;var off_caps=27;var off_caps2=28;var off_caps3=29;var off_caps4=30;var header=new Int32Array(buffer,0,headerLengthInt);if(header[off_magic]!==DDS_MAGIC){console.error("ImageUtils.parseDDS(): Invalid magic number in DDS header");return dds}if(!header[off_pfFlags]&DDPF_FOURCC){console.error("ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code");return dds}var blockBytes;var fourCC=header[off_pfFourCC];switch(fourCC){case FOURCC_DXT1:blockBytes=8;dds.format=THREE.RGB_S3TC_DXT1_Format;break;case FOURCC_DXT3:blockBytes=16;dds.format=THREE.RGBA_S3TC_DXT3_Format;break;case FOURCC_DXT5:blockBytes=16;dds.format=THREE.RGBA_S3TC_DXT5_Format;break;default:console.error("ImageUtils.parseDDS(): Unsupported FourCC code: ",int32ToFourCC(fourCC));return dds}dds.mipmapCount=1;if(header[off_flags]&DDSD_MIPMAPCOUNT&&loadMipmaps!==false){dds.mipmapCount=Math.max(1,header[off_mipmapCount])}dds.isCubemap=header[off_caps2]&DDSCAPS2_CUBEMAP?true:false;dds.width=header[off_width];dds.height=header[off_height];var dataOffset=header[off_size]+4;var width=dds.width;var height=dds.height;var faces=dds.isCubemap?6:1;for(var face=0;face<faces;face++){for(var i=0;i<dds.mipmapCount;i++){var dataLength=Math.max(4,width)/4*Math.max(4,height)/4*blockBytes;var byteArray=new Uint8Array(buffer,dataOffset,dataLength);var mipmap={data:byteArray,width:width,height:height};dds.mipmaps.push(mipmap);dataOffset+=dataLength;width=Math.max(width*.5,1);height=Math.max(height*.5,1)}width=dds.width;height=dds.height}return dds},getNormalMap:function(image,depth){var cross=function(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]};var subtract=function(a,b){return[a[0]-b[0],a[1]-b[1],a[2]-b[2]]};var normalize=function(a){var l=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);return[a[0]/l,a[1]/l,a[2]/l]};depth=depth|1;var width=image.width;var height=image.height;var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;var context=canvas.getContext("2d");context.drawImage(image,0,0);var data=context.getImageData(0,0,width,height).data;var imageData=context.createImageData(width,height);var output=imageData.data;for(var x=0;x<width;x++){for(var y=0;y<height;y++){var ly=y-1<0?0:y-1;var uy=y+1>height-1?height-1:y+1;var lx=x-1<0?0:x-1;var ux=x+1>width-1?width-1:x+1;var points=[];var origin=[0,0,data[(y*width+x)*4]/255*depth];points.push([-1,0,data[(y*width+lx)*4]/255*depth]);points.push([-1,-1,data[(ly*width+lx)*4]/255*depth]);points.push([0,-1,data[(ly*width+x)*4]/255*depth]);points.push([1,-1,data[(ly*width+ux)*4]/255*depth]);points.push([1,0,data[(y*width+ux)*4]/255*depth]);points.push([1,1,data[(uy*width+ux)*4]/255*depth]);points.push([0,1,data[(uy*width+x)*4]/255*depth]);points.push([-1,1,data[(uy*width+lx)*4]/255*depth]);var normals=[];var num_points=points.length;for(var i=0;i<num_points;i++){var v1=points[i];var v2=points[(i+1)%num_points];v1=subtract(v1,origin);v2=subtract(v2,origin);normals.push(normalize(cross(v1,v2)))}var normal=[0,0,0];for(var i=0;i<normals.length;i++){normal[0]+=normals[i][0];normal[1]+=normals[i][1];normal[2]+=normals[i][2]}normal[0]/=normals.length;normal[1]/=normals.length;normal[2]/=normals.length;var idx=(y*width+x)*4;output[idx]=(normal[0]+1)/2*255|0;output[idx+1]=(normal[1]+1)/2*255|0;output[idx+2]=normal[2]*255|0;output[idx+3]=255}}context.putImageData(imageData,0,0);return canvas},generateDataTexture:function(width,height,color){var size=width*height;var data=new Uint8Array(3*size);var r=Math.floor(color.r*255);var g=Math.floor(color.g*255);var b=Math.floor(color.b*255);for(var i=0;i<size;i++){data[i*3]=r;data[i*3+1]=g;data[i*3+2]=b}var texture=new THREE.DataTexture(data,width,height,THREE.RGBFormat);texture.needsUpdate=true;return texture}};THREE.SceneUtils={createMultiMaterialObject:function(geometry,materials){var group=new THREE.Object3D;for(var i=0,l=materials.length;i<l;i++){group.add(new THREE.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 THREE.Matrix4;matrixWorldInverse.getInverse(parent.matrixWorld);child.applyMatrix(matrixWorldInverse);scene.remove(child);parent.add(child)}};THREE.FontUtils={faces:{},face:"helvetiker",weight:"normal",style:"normal",size:150,divisions:10,getFace:function(){return this.faces[this.face][this.weight][this.style]},loadFace:function(data){var family=data.familyName.toLowerCase();var ThreeFont=this;ThreeFont.faces[family]=ThreeFont.faces[family]||{};ThreeFont.faces[family][data.cssFontWeight]=ThreeFont.faces[family][data.cssFontWeight]||{};ThreeFont.faces[family][data.cssFontWeight][data.cssFontStyle]=data;var face=ThreeFont.faces[family][data.cssFontWeight][data.cssFontStyle]=data;return data},drawText:function(text){var characterPts=[],allPts=[];var i,p,face=this.getFace(),scale=this.size/face.resolution,offset=0,chars=String(text).split(""),length=chars.length;var fontPaths=[];for(i=0;i<length;i++){var path=new THREE.Path;var ret=this.extractGlyphPoints(chars[i],face,scale,offset,path);offset+=ret.offset;fontPaths.push(ret.path)}var width=offset/2;return{paths:fontPaths,offset:width}},extractGlyphPoints:function(c,face,scale,offset,path){var pts=[];var i,i2,divisions,outline,action,length,scaleX,scaleY,x,y,cpx,cpy,cpx0,cpy0,cpx1,cpy1,cpx2,cpy2,laste,glyph=face.glyphs[c]||face.glyphs["?"];if(!glyph)return;if(glyph.o){outline=glyph._cachedOutline||(glyph._cachedOutline=glyph.o.split(" "));length=outline.length;scaleX=scale;scaleY=scale;for(i=0;i<length;){action=outline[i++];switch(action){case"m":x=outline[i++]*scaleX+offset;y=outline[i++]*scaleY;path.moveTo(x,y);break;case"l":x=outline[i++]*scaleX+offset;y=outline[i++]*scaleY;path.lineTo(x,y);break;case"q":cpx=outline[i++]*scaleX+offset;cpy=outline[i++]*scaleY;cpx1=outline[i++]*scaleX+offset;cpy1=outline[i++]*scaleY;path.quadraticCurveTo(cpx1,cpy1,cpx,cpy);laste=pts[pts.length-1];if(laste){cpx0=laste.x;cpy0=laste.y;for(i2=1,divisions=this.divisions;i2<=divisions;i2++){var t=i2/divisions;var tx=THREE.Shape.Utils.b2(t,cpx0,cpx1,cpx);var ty=THREE.Shape.Utils.b2(t,cpy0,cpy1,cpy)}}break;case"b":cpx=outline[i++]*scaleX+offset;cpy=outline[i++]*scaleY;cpx1=outline[i++]*scaleX+offset;cpy1=outline[i++]*-scaleY;cpx2=outline[i++]*scaleX+offset;cpy2=outline[i++]*-scaleY;path.bezierCurveTo(cpx,cpy,cpx1,cpy1,cpx2,cpy2);laste=pts[pts.length-1];if(laste){cpx0=laste.x;cpy0=laste.y;for(i2=1,divisions=this.divisions;i2<=divisions;i2++){var t=i2/divisions;var tx=THREE.Shape.Utils.b3(t,cpx0,cpx1,cpx2,cpx);var ty=THREE.Shape.Utils.b3(t,cpy0,cpy1,cpy2,cpy)}}break}}}return{offset:glyph.ha*scale,path:path}}};THREE.FontUtils.generateShapes=function(text,parameters){parameters=parameters||{};var size=parameters.size!==undefined?parameters.size:100;var curveSegments=parameters.curveSegments!==undefined?parameters.curveSegments:4;var font=parameters.font!==undefined?parameters.font:"helvetiker";var weight=parameters.weight!==undefined?parameters.weight:"normal";var style=parameters.style!==undefined?parameters.style:"normal";THREE.FontUtils.size=size;THREE.FontUtils.divisions=curveSegments;THREE.FontUtils.face=font;THREE.FontUtils.weight=weight;THREE.FontUtils.style=style;var data=THREE.FontUtils.drawText(text);var paths=data.paths;var shapes=[];for(var p=0,pl=paths.length;p<pl;p++){Array.prototype.push.apply(shapes,paths[p].toShapes())}return shapes};(function(namespace){var EPSILON=1e-10;var process=function(contour,indices){var n=contour.length;if(n<3)return null;var result=[],verts=[],vertIndices=[];var u,v,w;if(area(contour)>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;var count=2*nv;for(v=nv-1;nv>2;){if(count--<=0){console.log("Warning, unable to triangulate polygon!");if(indices)return vertIndices;return result}u=v;if(nv<=u)u=0;v=u+1;if(nv<=v)v=0;w=v+1;if(nv<=w)w=0;if(snip(contour,u,v,w,nv,verts)){var a,b,c,s,t;a=verts[u];b=verts[v];c=verts[w];result.push([contour[a],contour[b],contour[c]]);vertIndices.push([verts[u],verts[v],verts[w]]);for(s=v,t=v+1;t<nv;s++,t++){verts[s]=verts[t]}nv--;count=2*nv}}if(indices)return vertIndices;return result};var area=function(contour){var n=contour.length;var a=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*.5};var snip=function(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(EPSILON>(bx-ax)*(cy-ay)-(by-ay)*(cx-ax))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++){if(p===u||p===v||p===w)continue;px=contour[verts[p]].x;py=contour[verts[p]].y;apx=px-ax;apy=py-ay;bpx=px-bx;bpy=py-by;cpx=px-cx;cpy=py-cy;aCROSSbp=aX*bpy-aY*bpx;cCROSSap=cX*apy-cY*apx;bCROSScp=bX*cpy-bY*cpx;if(aCROSSbp>=0&&bCROSScp>=0&&cCROSSap>=0)return false}return true};namespace.Triangulate=process;namespace.Triangulate.area=area;return namespace})(THREE.FontUtils);self._typeface_js={faces:THREE.FontUtils.faces,loadFace:THREE.FontUtils.loadFace};THREE.Curve=function(){};THREE.Curve.prototype.getPoint=function(t){console.log("Warning, getPoint() not implemented!");return null};THREE.Curve.prototype.getPointAt=function(u){var t=this.getUtoTmapping(u);return this.getPoint(t)};THREE.Curve.prototype.getPoints=function(divisions){if(!divisions)divisions=5;var d,pts=[];for(d=0;d<=divisions;d++){pts.push(this.getPoint(d/divisions))}return pts};THREE.Curve.prototype.getSpacedPoints=function(divisions){if(!divisions)divisions=5;var d,pts=[];for(d=0;d<=divisions;d++){pts.push(this.getPointAt(d/divisions))}return pts};THREE.Curve.prototype.getLength=function(){var lengths=this.getLengths();return lengths[lengths.length-1]};THREE.Curve.prototype.getLengths=function(divisions){if(!divisions)divisions=this.__arcLengthDivisions?this.__arcLengthDivisions:200;if(this.cacheArcLengths&&this.cacheArcLengths.length==divisions+1&&!this.needsUpdate){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};THREE.Curve.prototype.updateArcLengths=function(){this.needsUpdate=true;this.getLengths()};THREE.Curve.prototype.getUtoTmapping=function(u,distance){var arcLengths=this.getLengths();var i=0,il=arcLengths.length;var targetArcLength;if(distance){targetArcLength=distance}else{targetArcLength=u*arcLengths[il-1]}var low=0,high=il-1,comparison;while(low<=high){i=Math.floor(low+(high-low)/2);comparison=arcLengths[i]-targetArcLength;if(comparison<0){low=i+1;continue}else if(comparison>0){high=i-1;continue}else{high=i;break}}i=high;if(arcLengths[i]==targetArcLength){var t=i/(il-1);return t}var lengthBefore=arcLengths[i];var lengthAfter=arcLengths[i+1];var segmentLength=lengthAfter-lengthBefore;var segmentFraction=(targetArcLength-lengthBefore)/segmentLength;var t=(i+segmentFraction)/(il-1);return t};THREE.Curve.prototype.getTangent=function(t){var delta=1e-4;var t1=t-delta;var t2=t+delta;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()};THREE.Curve.prototype.getTangentAt=function(u){var t=this.getUtoTmapping(u);return this.getTangent(t)};THREE.LineCurve=function(v1,v2){this.v1=v1;this.v2=v2};THREE.LineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.LineCurve.prototype.getPoint=function(t){var point=this.v2.clone().sub(this.v1);point.multiplyScalar(t).add(this.v1);return point};THREE.LineCurve.prototype.getPointAt=function(u){return this.getPoint(u)};THREE.LineCurve.prototype.getTangent=function(t){var tangent=this.v2.clone().sub(this.v1);return tangent.normalize()};THREE.QuadraticBezierCurve=function(v0,v1,v2){this.v0=v0;this.v1=v1;this.v2=v2};THREE.QuadraticBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.QuadraticBezierCurve.prototype.getPoint=function(t){var tx,ty;tx=THREE.Shape.Utils.b2(t,this.v0.x,this.v1.x,this.v2.x);ty=THREE.Shape.Utils.b2(t,this.v0.y,this.v1.y,this.v2.y);return new THREE.Vector2(tx,ty)};THREE.QuadraticBezierCurve.prototype.getTangent=function(t){var tx,ty;tx=THREE.Curve.Utils.tangentQuadraticBezier(t,this.v0.x,this.v1.x,this.v2.x);ty=THREE.Curve.Utils.tangentQuadraticBezier(t,this.v0.y,this.v1.y,this.v2.y);var tangent=new THREE.Vector2(tx,ty);tangent.normalize();return tangent};THREE.CubicBezierCurve=function(v0,v1,v2,v3){this.v0=v0;this.v1=v1;this.v2=v2;this.v3=v3};THREE.CubicBezierCurve.prototype=Object.create(THREE.Curve.prototype);THREE.CubicBezierCurve.prototype.getPoint=function(t){var tx,ty;tx=THREE.Shape.Utils.b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x);ty=THREE.Shape.Utils.b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y);
return new THREE.Vector2(tx,ty)};THREE.CubicBezierCurve.prototype.getTangent=function(t){var tx,ty;tx=THREE.Curve.Utils.tangentCubicBezier(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x);ty=THREE.Curve.Utils.tangentCubicBezier(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y);var tangent=new THREE.Vector2(tx,ty);tangent.normalize();return tangent};THREE.SplineCurve=function(points){this.points=points==undefined?[]:points};THREE.SplineCurve.prototype=Object.create(THREE.Curve.prototype);THREE.SplineCurve.prototype.getPoint=function(t){var v=new THREE.Vector2;var c=[];var points=this.points,point,intPoint,weight;point=(points.length-1)*t;intPoint=Math.floor(point);weight=point-intPoint;c[0]=intPoint==0?intPoint:intPoint-1;c[1]=intPoint;c[2]=intPoint>points.length-2?points.length-1:intPoint+1;c[3]=intPoint>points.length-3?points.length-1:intPoint+2;v.x=THREE.Curve.Utils.interpolate(points[c[0]].x,points[c[1]].x,points[c[2]].x,points[c[3]].x,weight);v.y=THREE.Curve.Utils.interpolate(points[c[0]].y,points[c[1]].y,points[c[2]].y,points[c[3]].y,weight);return v};THREE.EllipseCurve=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise){this.aX=aX;this.aY=aY;this.xRadius=xRadius;this.yRadius=yRadius;this.aStartAngle=aStartAngle;this.aEndAngle=aEndAngle;this.aClockwise=aClockwise};THREE.EllipseCurve.prototype=Object.create(THREE.Curve.prototype);THREE.EllipseCurve.prototype.getPoint=function(t){var deltaAngle=this.aEndAngle-this.aStartAngle;if(!this.aClockwise){t=1-t}var angle=this.aStartAngle+t*deltaAngle;var tx=this.aX+this.xRadius*Math.cos(angle);var ty=this.aY+this.yRadius*Math.sin(angle);return new THREE.Vector2(tx,ty)};THREE.ArcCurve=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){THREE.EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)};THREE.ArcCurve.prototype=Object.create(THREE.EllipseCurve.prototype);THREE.Curve.Utils={tangentQuadraticBezier:function(t,p0,p1,p2){return 2*(1-t)*(p1-p0)+2*t*(p2-p1)},tangentCubicBezier:function(t,p0,p1,p2,p3){return-3*p0*(1-t)*(1-t)+3*p1*(1-t)*(1-t)-6*t*p1*(1-t)+6*t*p2*(1-t)-3*t*t*p2+3*t*t*p3},tangentSpline:function(t,p0,p1,p2,p3){var h00=6*t*t-6*t;var h10=3*t*t-4*t+1;var h01=-6*t*t+6*t;var h11=3*t*t-2*t;return h00+h10+h01+h11},interpolate:function(p0,p1,p2,p3,t){var v0=(p2-p0)*.5;var v1=(p3-p1)*.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}};THREE.Curve.create=function(constructor,getPointFunc){constructor.prototype=Object.create(THREE.Curve.prototype);constructor.prototype.getPoint=getPointFunc;return constructor};THREE.LineCurve3=THREE.Curve.create(function(v1,v2){this.v1=v1;this.v2=v2},function(t){var r=new THREE.Vector3;r.subVectors(this.v2,this.v1);r.multiplyScalar(t);r.add(this.v1);return r});THREE.QuadraticBezierCurve3=THREE.Curve.create(function(v0,v1,v2){this.v0=v0;this.v1=v1;this.v2=v2},function(t){var tx,ty,tz;tx=THREE.Shape.Utils.b2(t,this.v0.x,this.v1.x,this.v2.x);ty=THREE.Shape.Utils.b2(t,this.v0.y,this.v1.y,this.v2.y);tz=THREE.Shape.Utils.b2(t,this.v0.z,this.v1.z,this.v2.z);return new THREE.Vector3(tx,ty,tz)});THREE.CubicBezierCurve3=THREE.Curve.create(function(v0,v1,v2,v3){this.v0=v0;this.v1=v1;this.v2=v2;this.v3=v3},function(t){var tx,ty,tz;tx=THREE.Shape.Utils.b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x);ty=THREE.Shape.Utils.b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y);tz=THREE.Shape.Utils.b3(t,this.v0.z,this.v1.z,this.v2.z,this.v3.z);return new THREE.Vector3(tx,ty,tz)});THREE.SplineCurve3=THREE.Curve.create(function(points){this.points=points==undefined?[]:points},function(t){var v=new THREE.Vector3;var c=[];var points=this.points,point,intPoint,weight;point=(points.length-1)*t;intPoint=Math.floor(point);weight=point-intPoint;c[0]=intPoint==0?intPoint:intPoint-1;c[1]=intPoint;c[2]=intPoint>points.length-2?points.length-1:intPoint+1;c[3]=intPoint>points.length-3?points.length-1:intPoint+2;var pt0=points[c[0]],pt1=points[c[1]],pt2=points[c[2]],pt3=points[c[3]];v.x=THREE.Curve.Utils.interpolate(pt0.x,pt1.x,pt2.x,pt3.x,weight);v.y=THREE.Curve.Utils.interpolate(pt0.y,pt1.y,pt2.y,pt3.y,weight);v.z=THREE.Curve.Utils.interpolate(pt0.z,pt1.z,pt2.z,pt3.z,weight);return v});THREE.ClosedSplineCurve3=THREE.Curve.create(function(points){this.points=points==undefined?[]:points},function(t){var v=new THREE.Vector3;var c=[];var points=this.points,point,intPoint,weight;point=(points.length-0)*t;intPoint=Math.floor(point);weight=point-intPoint;intPoint+=intPoint>0?0:(Math.floor(Math.abs(intPoint)/points.length)+1)*points.length;c[0]=(intPoint-1)%points.length;c[1]=intPoint%points.length;c[2]=(intPoint+1)%points.length;c[3]=(intPoint+2)%points.length;v.x=THREE.Curve.Utils.interpolate(points[c[0]].x,points[c[1]].x,points[c[2]].x,points[c[3]].x,weight);v.y=THREE.Curve.Utils.interpolate(points[c[0]].y,points[c[1]].y,points[c[2]].y,points[c[3]].y,weight);v.z=THREE.Curve.Utils.interpolate(points[c[0]].z,points[c[1]].z,points[c[2]].z,points[c[3]].z,weight);return v});THREE.CurvePath=function(){this.curves=[];this.bends=[];this.autoClose=false};THREE.CurvePath.prototype=Object.create(THREE.Curve.prototype);THREE.CurvePath.prototype.add=function(curve){this.curves.push(curve)};THREE.CurvePath.prototype.checkConnection=function(){};THREE.CurvePath.prototype.closePath=function(){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 THREE.LineCurve(endPoint,startPoint))}};THREE.CurvePath.prototype.getPoint=function(t){var d=t*this.getLength();var curveLengths=this.getCurveLengths();var i=0,diff,curve;while(i<curveLengths.length){if(curveLengths[i]>=d){diff=curveLengths[i]-d;curve=this.curves[i];var u=1-diff/curve.getLength();return curve.getPointAt(u);break}i++}return null};THREE.CurvePath.prototype.getLength=function(){var lens=this.getCurveLengths();return lens[lens.length-1]};THREE.CurvePath.prototype.getCurveLengths=function(){if(this.cacheLengths&&this.cacheLengths.length==this.curves.length){return this.cacheLengths}var lengths=[],sums=0;var i,il=this.curves.length;for(i=0;i<il;i++){sums+=this.curves[i].getLength();lengths.push(sums)}this.cacheLengths=lengths;return lengths};THREE.CurvePath.prototype.getBoundingBox=function(){var points=this.getPoints();var maxX,maxY,maxZ;var minX,minY,minZ;maxX=maxY=Number.NEGATIVE_INFINITY;minX=minY=Number.POSITIVE_INFINITY;var p,i,il,sum;var v3=points[0]instanceof THREE.Vector3;sum=v3?new THREE.Vector3:new THREE.Vector2;for(i=0,il=points.length;i<il;i++){p=points[i];if(p.x>maxX)maxX=p.x;else if(p.x<minX)minX=p.x;if(p.y>maxY)maxY=p.y;else if(p.y<minY)minY=p.y;if(v3){if(p.z>maxZ)maxZ=p.z;else if(p.z<minZ)minZ=p.z}sum.add(p)}var ret={minX:minX,minY:minY,maxX:maxX,maxY:maxY,centroid:sum.divideScalar(il)};if(v3){ret.maxZ=maxZ;ret.minZ=minZ}return ret};THREE.CurvePath.prototype.createPointsGeometry=function(divisions){var pts=this.getPoints(divisions,true);return this.createGeometry(pts)};THREE.CurvePath.prototype.createSpacedPointsGeometry=function(divisions){var pts=this.getSpacedPoints(divisions,true);return this.createGeometry(pts)};THREE.CurvePath.prototype.createGeometry=function(points){var geometry=new THREE.Geometry;for(var i=0;i<points.length;i++){geometry.vertices.push(new THREE.Vector3(points[i].x,points[i].y,points[i].z||0))}return geometry};THREE.CurvePath.prototype.addWrapPath=function(bendpath){this.bends.push(bendpath)};THREE.CurvePath.prototype.getTransformedPoints=function(segments,bends){var oldPts=this.getPoints(segments);var i,il;if(!bends){bends=this.bends}for(i=0,il=bends.length;i<il;i++){oldPts=this.getWrapPoints(oldPts,bends[i])}return oldPts};THREE.CurvePath.prototype.getTransformedSpacedPoints=function(segments,bends){var oldPts=this.getSpacedPoints(segments);var i,il;if(!bends){bends=this.bends}for(i=0,il=bends.length;i<il;i++){oldPts=this.getWrapPoints(oldPts,bends[i])}return oldPts};THREE.CurvePath.prototype.getWrapPoints=function(oldPts,path){var bounds=this.getBoundingBox();var i,il,p,oldX,oldY,xNorm;for(i=0,il=oldPts.length;i<il;i++){p=oldPts[i];oldX=p.x;oldY=p.y;xNorm=oldX/bounds.maxX;xNorm=path.getUtoTmapping(xNorm,oldX);var pathPt=path.getPoint(xNorm);var normal=path.getNormalVector(xNorm).multiplyScalar(oldY);p.x=pathPt.x+normal.x;p.y=pathPt.y+normal.y}return oldPts};THREE.Gyroscope=function(){THREE.Object3D.call(this)};THREE.Gyroscope.prototype=Object.create(THREE.Object3D.prototype);THREE.Gyroscope.prototype.updateMatrixWorld=function(force){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||force){if(this.parent){this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);this.matrixWorld.decompose(this.translationWorld,this.rotationWorld,this.scaleWorld);this.matrix.decompose(this.translationObject,this.rotationObject,this.scaleObject);this.matrixWorld.compose(this.translationWorld,this.rotationObject,this.scaleWorld)}else{this.matrixWorld.copy(this.matrix)}this.matrixWorldNeedsUpdate=false;force=true}for(var i=0,l=this.children.length;i<l;i++){this.children[i].updateMatrixWorld(force)}};THREE.Gyroscope.prototype.translationWorld=new THREE.Vector3;THREE.Gyroscope.prototype.translationObject=new THREE.Vector3;THREE.Gyroscope.prototype.rotationWorld=new THREE.Quaternion;THREE.Gyroscope.prototype.rotationObject=new THREE.Quaternion;THREE.Gyroscope.prototype.scaleWorld=new THREE.Vector3;THREE.Gyroscope.prototype.scaleObject=new THREE.Vector3;THREE.Path=function(points){THREE.CurvePath.call(this);this.actions=[];if(points){this.fromPoints(points)}};THREE.Path.prototype=Object.create(THREE.CurvePath.prototype);THREE.PathActions={MOVE_TO:"moveTo",LINE_TO:"lineTo",QUADRATIC_CURVE_TO:"quadraticCurveTo",BEZIER_CURVE_TO:"bezierCurveTo",CSPLINE_THRU:"splineThru",ARC:"arc",ELLIPSE:"ellipse"};THREE.Path.prototype.fromPoints=function(vectors){this.moveTo(vectors[0].x,vectors[0].y);for(var v=1,vlen=vectors.length;v<vlen;v++){this.lineTo(vectors[v].x,vectors[v].y)}};THREE.Path.prototype.moveTo=function(x,y){var args=Array.prototype.slice.call(arguments);this.actions.push({action:THREE.PathActions.MOVE_TO,args:args})};THREE.Path.prototype.lineTo=function(x,y){var args=Array.prototype.slice.call(arguments);var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];var curve=new THREE.LineCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(x,y));this.curves.push(curve);this.actions.push({action:THREE.PathActions.LINE_TO,args:args})};THREE.Path.prototype.quadraticCurveTo=function(aCPx,aCPy,aX,aY){var args=Array.prototype.slice.call(arguments);var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];var curve=new THREE.QuadraticBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCPx,aCPy),new THREE.Vector2(aX,aY));this.curves.push(curve);this.actions.push({action:THREE.PathActions.QUADRATIC_CURVE_TO,args:args})};THREE.Path.prototype.bezierCurveTo=function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){var args=Array.prototype.slice.call(arguments);var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];var curve=new THREE.CubicBezierCurve(new THREE.Vector2(x0,y0),new THREE.Vector2(aCP1x,aCP1y),new THREE.Vector2(aCP2x,aCP2y),new THREE.Vector2(aX,aY));this.curves.push(curve);this.actions.push({action:THREE.PathActions.BEZIER_CURVE_TO,args:args})};THREE.Path.prototype.splineThru=function(pts){var args=Array.prototype.slice.call(arguments);var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];var npts=[new THREE.Vector2(x0,y0)];Array.prototype.push.apply(npts,pts);var curve=new THREE.SplineCurve(npts);this.curves.push(curve);this.actions.push({action:THREE.PathActions.CSPLINE_THRU,args:args})};THREE.Path.prototype.arc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];this.absarc(aX+x0,aY+y0,aRadius,aStartAngle,aEndAngle,aClockwise)};THREE.Path.prototype.absarc=function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){this.absellipse(aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise)};THREE.Path.prototype.ellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise){var lastargs=this.actions[this.actions.length-1].args;var x0=lastargs[lastargs.length-2];var y0=lastargs[lastargs.length-1];this.absellipse(aX+x0,aY+y0,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise)};THREE.Path.prototype.absellipse=function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise){var args=Array.prototype.slice.call(arguments);var curve=new THREE.EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise);this.curves.push(curve);var lastPoint=curve.getPoint(aClockwise?1:0);args.push(lastPoint.x);args.push(lastPoint.y);this.actions.push({action:THREE.PathActions.ELLIPSE,args:args})};THREE.Path.prototype.getSpacedPoints=function(divisions,closedPath){if(!divisions)divisions=40;var points=[];for(var i=0;i<divisions;i++){points.push(this.getPoint(i/divisions))}return points};THREE.Path.prototype.getPoints=function(divisions,closedPath){if(this.useSpacedPoints){console.log("tata");return this.getSpacedPoints(divisions,closedPath)}divisions=divisions||12;var points=[];var i,il,item,action,args;var cpx,cpy,cpx2,cpy2,cpx1,cpy1,cpx0,cpy0,laste,j,t,tx,ty;for(i=0,il=this.actions.length;i<il;i++){item=this.actions[i];action=item.action;args=item.args;switch(action){case THREE.PathActions.MOVE_TO:points.push(new THREE.Vector2(args[0],args[1]));break;case THREE.PathActions.LINE_TO:points.push(new THREE.Vector2(args[0],args[1]));break;case THREE.PathActions.QUADRATIC_CURVE_TO:cpx=args[2];cpy=args[3];cpx1=args[0];cpy1=args[1];if(points.length>0){laste=points[points.length-1];cpx0=laste.x;cpy0=laste.y}else{laste=this.actions[i-1].args;cpx0=laste[laste.length-2];cpy0=laste[laste.length-1]}for(j=1;j<=divisions;j++){t=j/divisions;tx=THREE.Shape.Utils.b2(t,cpx0,cpx1,cpx);ty=THREE.Shape.Utils.b2(t,cpy0,cpy1,cpy);points.push(new THREE.Vector2(tx,ty))}break;case THREE.PathActions.BEZIER_CURVE_TO:cpx=args[4];cpy=args[5];cpx1=args[0];cpy1=args[1];cpx2=args[2];cpy2=args[3];if(points.length>0){laste=points[points.length-1];cpx0=laste.x;cpy0=laste.y}else{laste=this.actions[i-1].args;cpx0=laste[laste.length-2];cpy0=laste[laste.length-1]}for(j=1;j<=divisions;j++){t=j/divisions;tx=THREE.Shape.Utils.b3(t,cpx0,cpx1,cpx2,cpx);ty=THREE.Shape.Utils.b3(t,cpy0,cpy1,cpy2,cpy);points.push(new THREE.Vector2(tx,ty))}break;case THREE.PathActions.CSPLINE_THRU:laste=this.actions[i-1].args;var last=new THREE.Vector2(laste[laste.length-2],laste[laste.length-1]);var spts=[last];var n=divisions*args[0].length;spts=spts.concat(args[0]);var spline=new THREE.SplineCurve(spts);for(j=1;j<=n;j++){points.push(spline.getPointAt(j/n))}break;case THREE.PathActions.ARC:var aX=args[0],aY=args[1],aRadius=args[2],aStartAngle=args[3],aEndAngle=args[4],aClockwise=!!args[5];var deltaAngle=aEndAngle-aStartAngle;var angle;var tdivisions=divisions*2;for(j=1;j<=tdivisions;j++){t=j/tdivisions;if(!aClockwise){t=1-t}angle=aStartAngle+t*deltaAngle;tx=aX+aRadius*Math.cos(angle);ty=aY+aRadius*Math.sin(angle);points.push(new THREE.Vector2(tx,ty))}break;case THREE.PathActions.ELLIPSE:var aX=args[0],aY=args[1],xRadius=args[2],yRadius=args[3],aStartAngle=args[4],aEndAngle=args[5],aClockwise=!!args[6];var deltaAngle=aEndAngle-aStartAngle;var angle;var tdivisions=divisions*2;for(j=1;j<=tdivisions;j++){t=j/tdivisions;if(!aClockwise){t=1-t}angle=aStartAngle+t*deltaAngle;tx=aX+xRadius*Math.cos(angle);ty=aY+yRadius*Math.sin(angle);points.push(new THREE.Vector2(tx,ty))}break}}var lastPoint=points[points.length-1];var EPSILON=1e-10;if(Math.abs(lastPoint.x-points[0].x)<EPSILON&&Math.abs(lastPoint.y-points[0].y)<EPSILON)points.splice(points.length-1,1);if(closedPath){points.push(points[0])}return points};THREE.Path.prototype.toShapes=function(){var i,il,item,action,args;var subPaths=[],lastPath=new THREE.Path;for(i=0,il=this.actions.length;i<il;i++){item=this.actions[i];args=item.args;action=item.action;if(action==THREE.PathActions.MOVE_TO){if(lastPath.actions.length!=0){subPaths.push(lastPath);lastPath=new THREE.Path}}lastPath[action].apply(lastPath,args)}if(lastPath.actions.length!=0){subPaths.push(lastPath)}if(subPaths.length==0)return[];var tmpPath,tmpShape,shapes=[];var holesFirst=!THREE.Shape.Utils.isClockWise(subPaths[0].getPoints());if(subPaths.length==1){tmpPath=subPaths[0];tmpShape=new THREE.Shape;tmpShape.actions=tmpPath.actions;tmpShape.curves=tmpPath.curves;shapes.push(tmpShape);return shapes}if(holesFirst){tmpShape=new THREE.Shape;for(i=0,il=subPaths.length;i<il;i++){tmpPath=subPaths[i];if(THREE.Shape.Utils.isClockWise(tmpPath.getPoints())){tmpShape.actions=tmpPath.actions;tmpShape.curves=tmpPath.curves;shapes.push(tmpShape);tmpShape=new THREE.Shape}else{tmpShape.holes.push(tmpPath)}}}else{for(i=0,il=subPaths.length;i<il;i++){tmpPath=subPaths[i];if(THREE.Shape.Utils.isClockWise(tmpPath.getPoints())){if(tmpShape)shapes.push(tmpShape);tmpShape=new THREE.Shape;tmpShape.actions=tmpPath.actions;tmpShape.curves=tmpPath.curves}else{tmpShape.holes.push(tmpPath)}}shapes.push(tmpShape)}return shapes};THREE.Shape=function(){THREE.Path.apply(this,arguments);this.holes=[]};THREE.Shape.prototype=Object.create(THREE.Path.prototype);THREE.Shape.prototype.extrude=function(options){var extruded=new THREE.ExtrudeGeometry(this,options);return extruded};THREE.Shape.prototype.makeGeometry=function(options){var geometry=new THREE.ShapeGeometry(this,options);return geometry};THREE.Shape.prototype.getPointsHoles=function(divisions){var i,il=this.holes.length,holesPts=[];for(i=0;i<il;i++){holesPts[i]=this.holes[i].getTransformedPoints(divisions,this.bends)}return holesPts};THREE.Shape.prototype.getSpacedPointsHoles=function(divisions){var i,il=this.holes.length,holesPts=[];for(i=0;i<il;i++){holesPts[i]=this.holes[i].getTransformedSpacedPoints(divisions,this.bends)}return holesPts};THREE.Shape.prototype.extractAllPoints=function(divisions){return{shape:this.getTransformedPoints(divisions),holes:this.getPointsHoles(divisions)}};THREE.Shape.prototype.extractPoints=function(divisions){if(this.useSpacedPoints){return this.extractAllSpacedPoints(divisions)}return this.extractAllPoints(divisions)};THREE.Shape.prototype.extractAllSpacedPoints=function(divisions){return{shape:this.getTransformedSpacedPoints(divisions),holes:this.getSpacedPointsHoles(divisions)}};THREE.Shape.Utils={removeHoles:function(contour,holes){var shape=contour.concat();var allpoints=shape.concat();var prevShapeVert,nextShapeVert,prevHoleVert,nextHoleVert,holeIndex,shapeIndex,shapeId,shapeGroup,h,h2,hole,shortest,d,p,pts1,pts2,tmpShape1,tmpShape2,tmpHole1,tmpHole2,verts=[];for(h=0;h<holes.length;h++){hole=holes[h];Array.prototype.push.apply(allpoints,hole);shortest=Number.POSITIVE_INFINITY;for(h2=0;h2<hole.length;h2++){pts1=hole[h2];var dist=[];for(p=0;p<shape.length;p++){pts2=shape[p];d=pts1.distanceToSquared(pts2);dist.push(d);if(d<shortest){shortest=d;holeIndex=h2;shapeIndex=p}}}prevShapeVert=shapeIndex-1>=0?shapeIndex-1:shape.length-1;prevHoleVert=holeIndex-1>=0?holeIndex-1:hole.length-1;var areaapts=[hole[holeIndex],shape[shapeIndex],shape[prevShapeVert]];var areaa=THREE.FontUtils.Triangulate.area(areaapts);var areabpts=[hole[holeIndex],hole[prevHoleVert],shape[shapeIndex]];var areab=THREE.FontUtils.Triangulate.area(areabpts);var shapeOffset=1;var holeOffset=-1;var oldShapeIndex=shapeIndex,oldHoleIndex=holeIndex;shapeIndex+=shapeOffset;holeIndex+=holeOffset;if(shapeIndex<0){shapeIndex+=shape.length}shapeIndex%=shape.length;if(holeIndex<0){holeIndex+=hole.length}holeIndex%=hole.length;prevShapeVert=shapeIndex-1>=0?shapeIndex-1:shape.length-1;prevHoleVert=holeIndex-1>=0?holeIndex-1:hole.length-1;areaapts=[hole[holeIndex],shape[shapeIndex],shape[prevShapeVert]];var areaa2=THREE.FontUtils.Triangulate.area(areaapts);areabpts=[hole[holeIndex],hole[prevHoleVert],shape[shapeIndex]];var areab2=THREE.FontUtils.Triangulate.area(areabpts);if(areaa+areab>areaa2+areab2){shapeIndex=oldShapeIndex;holeIndex=oldHoleIndex;if(shapeIndex<0){shapeIndex+=shape.length}shapeIndex%=shape.length;if(holeIndex<0){holeIndex+=hole.length}holeIndex%=hole.length;prevShapeVert=shapeIndex-1>=0?shapeIndex-1:shape.length-1;prevHoleVert=holeIndex-1>=0?holeIndex-1:hole.length-1}else{}tmpShape1=shape.slice(0,shapeIndex);tmpShape2=shape.slice(shapeIndex);tmpHole1=hole.slice(holeIndex);tmpHole2=hole.slice(0,holeIndex);var trianglea=[hole[holeIndex],shape[shapeIndex],shape[prevShapeVert]];var triangleb=[hole[holeIndex],hole[prevHoleVert],shape[shapeIndex]];verts.push(trianglea);verts.push(triangleb);shape=tmpShape1.concat(tmpHole1).concat(tmpHole2).concat(tmpShape2)}return{shape:shape,isolatedPts:verts,allpoints:allpoints}},triangulateShape:function(contour,holes){var shapeWithoutHoles=THREE.Shape.Utils.removeHoles(contour,holes);var shape=shapeWithoutHoles.shape,allpoints=shapeWithoutHoles.allpoints,isolatedPts=shapeWithoutHoles.isolatedPts;var triangles=THREE.FontUtils.Triangulate(shape,false);var i,il,f,face,key,index,allPointsMap={},isolatedPointsMap={};for(i=0,il=allpoints.length;i<il;i++){key=allpoints[i].x+":"+allpoints[i].y;if(allPointsMap[key]!==undefined){console.log("Duplicate point",key)}allPointsMap[key]=i}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}}}for(i=0,il=isolatedPts.length;i<il;i++){face=isolatedPts[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(isolatedPts)},isClockWise:function(pts){return THREE.FontUtils.Triangulate.area(pts)<0},b2p0:function(t,p){var k=1-t;return k*k*p},b2p1:function(t,p){return 2*(1-t)*t*p},b2p2:function(t,p){return t*t*p},b2:function(t,p0,p1,p2){return this.b2p0(t,p0)+this.b2p1(t,p1)+this.b2p2(t,p2)},b3p0:function(t,p){var k=1-t;return k*k*k*p},b3p1:function(t,p){var k=1-t;return 3*k*k*t*p},b3p2:function(t,p){var k=1-t;return 3*k*t*t*p},b3p3:function(t,p){return t*t*t*p},b3:function(t,p0,p1,p2,p3){return this.b3p0(t,p0)+this.b3p1(t,p1)+this.b3p2(t,p2)+this.b3p3(t,p3)}};THREE.AnimationHandler=function(){var playing=[];var library={};var that={};that.update=function(deltaTimeMS){for(var i=0;i<playing.length;i++)playing[i].update(deltaTimeMS)};that.addToUpdate=function(animation){if(playing.indexOf(animation)===-1)playing.push(animation)};that.removeFromUpdate=function(animation){var index=playing.indexOf(animation);if(index!==-1)playing.splice(index,1)};that.add=function(data){if(library[data.name]!==undefined)console.log("THREE.AnimationHandler.add: Warning! "+data.name+" already exists in library. Overwriting.");library[data.name]=data;initData(data)};that.get=function(name){if(typeof name==="string"){if(library[name]){return library[name]}else{console.log("THREE.AnimationHandler.get: Couldn't find animation "+name);return null}}else{}};that.parse=function(root){var hierarchy=[];if(root instanceof THREE.SkinnedMesh){for(var b=0;b<root.bones.length;b++){hierarchy.push(root.bones[b])}}else{parseRecurseHierarchy(root,hierarchy)}return hierarchy};var parseRecurseHierarchy=function(root,hierarchy){hierarchy.push(root);for(var c=0;c<root.children.length;c++)parseRecurseHierarchy(root.children[c],hierarchy)};var initData=function(data){if(data.initialized===true)return;for(var h=0;h<data.hierarchy.length;h++){for(var k=0;k<data.hierarchy[h].keys.length;k++){if(data.hierarchy[h].keys[k].time<0)data.hierarchy[h].keys[k].time=0;if(data.hierarchy[h].keys[k].rot!==undefined&&!(data.hierarchy[h].keys[k].rot instanceof THREE.Quaternion)){var quat=data.hierarchy[h].keys[k].rot;data.hierarchy[h].keys[k].rot=new THREE.Quaternion(quat[0],quat[1],quat[2],quat[3])}}if(data.hierarchy[h].keys.length&&data.hierarchy[h].keys[0].morphTargets!==undefined){var usedMorphTargets={};for(var k=0;k<data.hierarchy[h].keys.length;k++){for(var m=0;m<data.hierarchy[h].keys[k].morphTargets.length;m++){var morphTargetName=data.hierarchy[h].keys[k].morphTargets[m];usedMorphTargets[morphTargetName]=-1}}data.hierarchy[h].usedMorphTargets=usedMorphTargets;for(var k=0;k<data.hierarchy[h].keys.length;k++){var influences={};for(var morphTargetName in usedMorphTargets){for(var m=0;m<data.hierarchy[h].keys[k].morphTargets.length;m++){if(data.hierarchy[h].keys[k].morphTargets[m]===morphTargetName){influences[morphTargetName]=data.hierarchy[h].keys[k].morphTargetsInfluences[m];break}}if(m===data.hierarchy[h].keys[k].morphTargets.length){influences[morphTargetName]=0}}data.hierarchy[h].keys[k].morphTargetsInfluences=influences}}for(var k=1;k<data.hierarchy[h].keys.length;k++){if(data.hierarchy[h].keys[k].time===data.hierarchy[h].keys[k-1].time){data.hierarchy[h].keys.splice(k,1);k--}}for(var k=0;k<data.hierarchy[h].keys.length;k++){data.hierarchy[h].keys[k].index=k}}var lengthInFrames=parseInt(data.length*data.fps,10);data.JIT={};data.JIT.hierarchy=[];for(var h=0;h<data.hierarchy.length;h++)data.JIT.hierarchy.push(new Array(lengthInFrames));data.initialized=true};that.LINEAR=0;that.CATMULLROM=1;that.CATMULLROM_FORWARD=2;return that}();THREE.Animation=function(root,name,interpolationType){this.root=root;this.data=THREE.AnimationHandler.get(name);this.hierarchy=THREE.AnimationHandler.parse(root);this.currentTime=0;this.timeScale=1;this.isPlaying=false;this.isPaused=true;this.loop=true;this.interpolationType=interpolationType!==undefined?interpolationType:THREE.AnimationHandler.LINEAR;this.points=[];this.target=new THREE.Vector3};THREE.Animation.prototype.play=function(loop,startTimeMS){if(this.isPlaying===false){this.isPlaying=true;this.loop=loop!==undefined?loop:true;this.currentTime=startTimeMS!==undefined?startTimeMS:0;var h,hl=this.hierarchy.length,object;for(h=0;h<hl;h++){object=this.hierarchy[h];if(this.interpolationType!==THREE.AnimationHandler.CATMULLROM_FORWARD){object.useQuaternion=true}object.matrixAutoUpdate=true;if(object.animationCache===undefined){object.animationCache={};object.animationCache.prevKey={pos:0,rot:0,scl:0};object.animationCache.nextKey={pos:0,rot:0,scl:0};object.animationCache.originalMatrix=object instanceof THREE.Bone?object.skinMatrix:object.matrix}var prevKey=object.animationCache.prevKey;var nextKey=object.animationCache.nextKey;prevKey.pos=this.data.hierarchy[h].keys[0];prevKey.rot=this.data.hierarchy[h].keys[0];prevKey.scl=this.data.hierarchy[h].keys[0];nextKey.pos=this.getNextKeyWith("pos",h,1);nextKey.rot=this.getNextKeyWith("rot",h,1);nextKey.scl=this.getNextKeyWith("scl",h,1)}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.Animation.prototype.pause=function(){if(this.isPaused===true){THREE.AnimationHandler.addToUpdate(this)}else{THREE.AnimationHandler.removeFromUpdate(this)}this.isPaused=!this.isPaused};THREE.Animation.prototype.stop=function(){this.isPlaying=false;this.isPaused=false;THREE.AnimationHandler.removeFromUpdate(this)};THREE.Animation.prototype.update=function(deltaTimeMS){if(this.isPlaying===false)return;var types=["pos","rot","scl"];var type;var scale;var vector;var prevXYZ,nextXYZ;var prevKey,nextKey;var object;var animationCache;var frame;var JIThierarchy=this.data.JIT.hierarchy;var currentTime,unloopedCurrentTime;var currentPoint,forwardPoint,angle;this.currentTime+=deltaTimeMS*this.timeScale;unloopedCurrentTime=this.currentTime;currentTime=this.currentTime=this.currentTime%this.data.length;frame=parseInt(Math.min(currentTime*this.data.fps,this.data.length*this.data.fps),10);for(var h=0,hl=this.hierarchy.length;h<hl;h++){object=this.hierarchy[h];animationCache=object.animationCache;for(var t=0;t<3;t++){type=types[t];prevKey=animationCache.prevKey[type];nextKey=animationCache.nextKey[type];if(nextKey.time<=unloopedCurrentTime){if(currentTime<unloopedCurrentTime){if(this.loop){prevKey=this.data.hierarchy[h].keys[0];nextKey=this.getNextKeyWith(type,h,1);while(nextKey.time<currentTime){prevKey=nextKey;nextKey=this.getNextKeyWith(type,h,nextKey.index+1)}}else{this.stop();return}}else{do{prevKey=nextKey;nextKey=this.getNextKeyWith(type,h,nextKey.index+1)}while(nextKey.time<currentTime)}animationCache.prevKey[type]=prevKey;animationCache.nextKey[type]=nextKey}object.matrixAutoUpdate=true;object.matrixWorldNeedsUpdate=true;scale=(currentTime-prevKey.time)/(nextKey.time-prevKey.time);prevXYZ=prevKey[type];nextXYZ=nextKey[type];if(scale<0||scale>1){console.log("THREE.Animation.update: Warning! Scale out of bounds:"+scale+" on bone "+h);scale=scale<0?0:1}if(type==="pos"){vector=object.position;if(this.interpolationType===THREE.AnimationHandler.LINEAR){vector.x=prevXYZ[0]+(nextXYZ[0]-prevXYZ[0])*scale;vector.y=prevXYZ[1]+(nextXYZ[1]-prevXYZ[1])*scale;vector.z=prevXYZ[2]+(nextXYZ[2]-prevXYZ[2])*scale}else if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){this.points[0]=this.getPrevKeyWith("pos",h,prevKey.index-1)["pos"];this.points[1]=prevXYZ;this.points[2]=nextXYZ;this.points[3]=this.getNextKeyWith("pos",h,nextKey.index+1)["pos"];scale=scale*.33+.33;currentPoint=this.interpolateCatmullRom(this.points,scale);vector.x=currentPoint[0];vector.y=currentPoint[1];vector.z=currentPoint[2];if(this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){forwardPoint=this.interpolateCatmullRom(this.points,scale*1.01);this.target.set(forwardPoint[0],forwardPoint[1],forwardPoint[2]);this.target.sub(vector);this.target.y=0;this.target.normalize();angle=Math.atan2(this.target.x,this.target.z);object.rotation.set(0,angle,0)}}}else if(type==="rot"){THREE.Quaternion.slerp(prevXYZ,nextXYZ,object.quaternion,scale)}else if(type==="scl"){vector=object.scale;vector.x=prevXYZ[0]+(nextXYZ[0]-prevXYZ[0])*scale;vector.y=prevXYZ[1]+(nextXYZ[1]-prevXYZ[1])*scale;vector.z=prevXYZ[2]+(nextXYZ[2]-prevXYZ[2])*scale}}}};THREE.Animation.prototype.interpolateCatmullRom=function(points,scale){var c=[],v3=[],point,intPoint,weight,w2,w3,pa,pb,pc,pd;point=(points.length-1)*scale;intPoint=Math.floor(point);weight=point-intPoint;c[0]=intPoint===0?intPoint:intPoint-1;c[1]=intPoint;c[2]=intPoint>points.length-2?intPoint:intPoint+1;c[3]=intPoint>points.length-3?intPoint:intPoint+2;pa=points[c[0]];pb=points[c[1]];pc=points[c[2]];pd=points[c[3]];w2=weight*weight;w3=weight*w2;v3[0]=this.interpolate(pa[0],pb[0],pc[0],pd[0],weight,w2,w3);v3[1]=this.interpolate(pa[1],pb[1],pc[1],pd[1],weight,w2,w3);v3[2]=this.interpolate(pa[2],pb[2],pc[2],pd[2],weight,w2,w3);return v3};THREE.Animation.prototype.interpolate=function(p0,p1,p2,p3,t,t2,t3){var v0=(p2-p0)*.5,v1=(p3-p1)*.5;return(2*(p1-p2)+v0+v1)*t3+(-3*(p1-p2)-2*v0-v1)*t2+v0*t+p1};THREE.Animation.prototype.getNextKeyWith=function(type,h,key){var keys=this.data.hierarchy[h].keys;if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){key=key<keys.length-1?key:keys.length-1}else{key=key%keys.length}for(;key<keys.length;key++){if(keys[key][type]!==undefined){return keys[key]}}return this.data.hierarchy[h].keys[0]};THREE.Animation.prototype.getPrevKeyWith=function(type,h,key){var keys=this.data.hierarchy[h].keys;if(this.interpolationType===THREE.AnimationHandler.CATMULLROM||this.interpolationType===THREE.AnimationHandler.CATMULLROM_FORWARD){key=key>0?key:0}else{key=key>=0?key:key+keys.length}for(;key>=0;key--){if(keys[key][type]!==undefined){return keys[key]}}return this.data.hierarchy[h].keys[keys.length-1]};THREE.KeyFrameAnimation=function(root,data,JITCompile){this.root=root;this.data=THREE.AnimationHandler.get(data);this.hierarchy=THREE.AnimationHandler.parse(root);this.currentTime=0;this.timeScale=.001;this.isPlaying=false;this.isPaused=true;this.loop=true;this.JITCompile=JITCompile!==undefined?JITCompile:true;for(var h=0,hl=this.hierarchy.length;h<hl;h++){var keys=this.data.hierarchy[h].keys,sids=this.data.hierarchy[h].sids,obj=this.hierarchy[h];
if(keys.length&&sids){for(var s=0;s<sids.length;s++){var sid=sids[s],next=this.getNextKeyWith(sid,h,0);if(next){next.apply(sid)}}obj.matrixAutoUpdate=false;this.data.hierarchy[h].node.updateMatrix();obj.matrixWorldNeedsUpdate=true}}};THREE.KeyFrameAnimation.prototype.play=function(loop,startTimeMS){if(!this.isPlaying){this.isPlaying=true;this.loop=loop!==undefined?loop:true;this.currentTime=startTimeMS!==undefined?startTimeMS:0;this.startTimeMs=startTimeMS;this.startTime=1e7;this.endTime=-this.startTime;var h,hl=this.hierarchy.length,object,node;for(h=0;h<hl;h++){object=this.hierarchy[h];node=this.data.hierarchy[h];object.useQuaternion=true;if(node.animationCache===undefined){node.animationCache={};node.animationCache.prevKey=null;node.animationCache.nextKey=null;node.animationCache.originalMatrix=object instanceof THREE.Bone?object.skinMatrix:object.matrix}var keys=this.data.hierarchy[h].keys;if(keys.length){node.animationCache.prevKey=keys[0];node.animationCache.nextKey=keys[1];this.startTime=Math.min(keys[0].time,this.startTime);this.endTime=Math.max(keys[keys.length-1].time,this.endTime)}}this.update(0)}this.isPaused=false;THREE.AnimationHandler.addToUpdate(this)};THREE.KeyFrameAnimation.prototype.pause=function(){if(this.isPaused){THREE.AnimationHandler.addToUpdate(this)}else{THREE.AnimationHandler.removeFromUpdate(this)}this.isPaused=!this.isPaused};THREE.KeyFrameAnimation.prototype.stop=function(){this.isPlaying=false;this.isPaused=false;THREE.AnimationHandler.removeFromUpdate(this);for(var h=0;h<this.data.hierarchy.length;h++){var obj=this.hierarchy[h];var node=this.data.hierarchy[h];if(node.animationCache!==undefined){var original=node.animationCache.originalMatrix;if(obj instanceof THREE.Bone){original.copy(obj.skinMatrix);obj.skinMatrix=original}else{original.copy(obj.matrix);obj.matrix=original}delete node.animationCache}}};THREE.KeyFrameAnimation.prototype.update=function(deltaTimeMS){if(!this.isPlaying)return;var prevKey,nextKey;var object;var node;var frame;var JIThierarchy=this.data.JIT.hierarchy;var currentTime,unloopedCurrentTime;var looped;this.currentTime+=deltaTimeMS*this.timeScale;unloopedCurrentTime=this.currentTime;currentTime=this.currentTime=this.currentTime%this.data.length;if(currentTime<this.startTimeMs){currentTime=this.currentTime=this.startTimeMs+currentTime}frame=parseInt(Math.min(currentTime*this.data.fps,this.data.length*this.data.fps),10);looped=currentTime<unloopedCurrentTime;if(looped&&!this.loop){for(var h=0,hl=this.hierarchy.length;h<hl;h++){var keys=this.data.hierarchy[h].keys,sids=this.data.hierarchy[h].sids,end=keys.length-1,obj=this.hierarchy[h];if(keys.length){for(var s=0;s<sids.length;s++){var sid=sids[s],prev=this.getPrevKeyWith(sid,h,end);if(prev){prev.apply(sid)}}this.data.hierarchy[h].node.updateMatrix();obj.matrixWorldNeedsUpdate=true}}this.stop();return}if(currentTime<this.startTime){return}for(var h=0,hl=this.hierarchy.length;h<hl;h++){object=this.hierarchy[h];node=this.data.hierarchy[h];var keys=node.keys,animationCache=node.animationCache;if(this.JITCompile&&JIThierarchy[h][frame]!==undefined){if(object instanceof THREE.Bone){object.skinMatrix=JIThierarchy[h][frame];object.matrixWorldNeedsUpdate=false}else{object.matrix=JIThierarchy[h][frame];object.matrixWorldNeedsUpdate=true}}else if(keys.length){if(this.JITCompile&&animationCache){if(object instanceof THREE.Bone){object.skinMatrix=animationCache.originalMatrix}else{object.matrix=animationCache.originalMatrix}}prevKey=animationCache.prevKey;nextKey=animationCache.nextKey;if(prevKey&&nextKey){if(nextKey.time<=unloopedCurrentTime){if(looped&&this.loop){prevKey=keys[0];nextKey=keys[1];while(nextKey.time<currentTime){prevKey=nextKey;nextKey=keys[prevKey.index+1]}}else if(!looped){var lastIndex=keys.length-1;while(nextKey.time<currentTime&&nextKey.index!==lastIndex){prevKey=nextKey;nextKey=keys[prevKey.index+1]}}animationCache.prevKey=prevKey;animationCache.nextKey=nextKey}if(nextKey.time>=currentTime)prevKey.interpolate(nextKey,currentTime);else prevKey.interpolate(nextKey,nextKey.time)}this.data.hierarchy[h].node.updateMatrix();object.matrixWorldNeedsUpdate=true}}if(this.JITCompile){if(JIThierarchy[0][frame]===undefined){this.hierarchy[0].updateMatrixWorld(true);for(var h=0;h<this.hierarchy.length;h++){if(this.hierarchy[h]instanceof THREE.Bone){JIThierarchy[h][frame]=this.hierarchy[h].skinMatrix.clone()}else{JIThierarchy[h][frame]=this.hierarchy[h].matrix.clone()}}}}};THREE.KeyFrameAnimation.prototype.getNextKeyWith=function(sid,h,key){var keys=this.data.hierarchy[h].keys;key=key%keys.length;for(;key<keys.length;key++){if(keys[key].hasTarget(sid)){return keys[key]}}return keys[0]};THREE.KeyFrameAnimation.prototype.getPrevKeyWith=function(sid,h,key){var keys=this.data.hierarchy[h].keys;key=key>=0?key:key+keys.length;for(;key>=0;key--){if(keys[key].hasTarget(sid)){return keys[key]}}return keys[keys.length-1]};THREE.CubeCamera=function(near,far,cubeResolution){THREE.Object3D.call(this);var fov=90,aspect=1;var cameraPX=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraPX.up.set(0,-1,0);cameraPX.lookAt(new THREE.Vector3(1,0,0));this.add(cameraPX);var cameraNX=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraNX.up.set(0,-1,0);cameraNX.lookAt(new THREE.Vector3(-1,0,0));this.add(cameraNX);var cameraPY=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraPY.up.set(0,0,1);cameraPY.lookAt(new THREE.Vector3(0,1,0));this.add(cameraPY);var cameraNY=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraNY.up.set(0,0,-1);cameraNY.lookAt(new THREE.Vector3(0,-1,0));this.add(cameraNY);var cameraPZ=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraPZ.up.set(0,-1,0);cameraPZ.lookAt(new THREE.Vector3(0,0,1));this.add(cameraPZ);var cameraNZ=new THREE.PerspectiveCamera(fov,aspect,near,far);cameraNZ.up.set(0,-1,0);cameraNZ.lookAt(new THREE.Vector3(0,0,-1));this.add(cameraNZ);this.renderTarget=new THREE.WebGLRenderTargetCube(cubeResolution,cubeResolution,{format:THREE.RGBFormat,magFilter:THREE.LinearFilter,minFilter:THREE.LinearFilter});this.updateCubeMap=function(renderer,scene){var renderTarget=this.renderTarget;var generateMipmaps=renderTarget.generateMipmaps;renderTarget.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.generateMipmaps=generateMipmaps;renderTarget.activeCubeFace=5;renderer.render(scene,cameraNZ,renderTarget)}};THREE.CubeCamera.prototype=Object.create(THREE.Object3D.prototype);THREE.CombinedCamera=function(width,height,fov,near,far,orthoNear,orthoFar){THREE.Camera.call(this);this.fov=fov;this.left=-width/2;this.right=width/2;this.top=height/2;this.bottom=-height/2;this.cameraO=new THREE.OrthographicCamera(width/-2,width/2,height/2,height/-2,orthoNear,orthoFar);this.cameraP=new THREE.PerspectiveCamera(fov,width/height,near,far);this.zoom=1;this.toPerspective();var aspect=width/height};THREE.CombinedCamera.prototype=Object.create(THREE.Camera.prototype);THREE.CombinedCamera.prototype.toPerspective=function(){this.near=this.cameraP.near;this.far=this.cameraP.far;this.cameraP.fov=this.fov/this.zoom;this.cameraP.updateProjectionMatrix();this.projectionMatrix=this.cameraP.projectionMatrix;this.inPerspectiveMode=true;this.inOrthographicMode=false};THREE.CombinedCamera.prototype.toOrthographic=function(){var fov=this.fov;var aspect=this.cameraP.aspect;var near=this.cameraP.near;var far=this.cameraP.far;var hyperfocus=(near+far)/2;var halfHeight=Math.tan(fov/2)*hyperfocus;var planeHeight=2*halfHeight;var planeWidth=planeHeight*aspect;var halfWidth=planeWidth/2;halfHeight/=this.zoom;halfWidth/=this.zoom;this.cameraO.left=-halfWidth;this.cameraO.right=halfWidth;this.cameraO.top=halfHeight;this.cameraO.bottom=-halfHeight;this.cameraO.updateProjectionMatrix();this.near=this.cameraO.near;this.far=this.cameraO.far;this.projectionMatrix=this.cameraO.projectionMatrix;this.inPerspectiveMode=false;this.inOrthographicMode=true};THREE.CombinedCamera.prototype.setSize=function(width,height){this.cameraP.aspect=width/height;this.left=-width/2;this.right=width/2;this.top=height/2;this.bottom=-height/2};THREE.CombinedCamera.prototype.setFov=function(fov){this.fov=fov;if(this.inPerspectiveMode){this.toPerspective()}else{this.toOrthographic()}};THREE.CombinedCamera.prototype.updateProjectionMatrix=function(){if(this.inPerspectiveMode){this.toPerspective()}else{this.toPerspective();this.toOrthographic()}};THREE.CombinedCamera.prototype.setLens=function(focalLength,frameHeight){if(frameHeight===undefined)frameHeight=24;var fov=2*THREE.Math.radToDeg(Math.atan(frameHeight/(focalLength*2)));this.setFov(fov);return fov};THREE.CombinedCamera.prototype.setZoom=function(zoom){this.zoom=zoom;if(this.inPerspectiveMode){this.toPerspective()}else{this.toOrthographic()}};THREE.CombinedCamera.prototype.toFrontView=function(){this.rotation.x=0;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBackView=function(){this.rotation.x=0;this.rotation.y=Math.PI;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toLeftView=function(){this.rotation.x=0;this.rotation.y=-Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toRightView=function(){this.rotation.x=0;this.rotation.y=Math.PI/2;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toTopView=function(){this.rotation.x=-Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.CombinedCamera.prototype.toBottomView=function(){this.rotation.x=Math.PI/2;this.rotation.y=0;this.rotation.z=0;this.rotationAutoUpdate=false};THREE.AsteriskGeometry=function(innerRadius,outerRadius){THREE.Geometry.call(this);var sd=innerRadius;var ed=outerRadius;var sd2=.707*sd;var ed2=.707*ed;var rays=[[sd,0,0],[ed,0,0],[-sd,0,0],[-ed,0,0],[0,sd,0],[0,ed,0],[0,-sd,0],[0,-ed,0],[0,0,sd],[0,0,ed],[0,0,-sd],[0,0,-ed],[sd2,sd2,0],[ed2,ed2,0],[-sd2,-sd2,0],[-ed2,-ed2,0],[sd2,-sd2,0],[ed2,-ed2,0],[-sd2,sd2,0],[-ed2,ed2,0],[sd2,0,sd2],[ed2,0,ed2],[-sd2,0,-sd2],[-ed2,0,-ed2],[sd2,0,-sd2],[ed2,0,-ed2],[-sd2,0,sd2],[-ed2,0,ed2],[0,sd2,sd2],[0,ed2,ed2],[0,-sd2,-sd2],[0,-ed2,-ed2],[0,sd2,-sd2],[0,ed2,-ed2],[0,-sd2,sd2],[0,-ed2,ed2]];for(var i=0,il=rays.length;i<il;i++){var x=rays[i][0];var y=rays[i][1];var z=rays[i][2];this.vertices.push(new THREE.Vector3(x,y,z))}};THREE.AsteriskGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CircleGeometry=function(radius,segments,thetaStart,thetaLength){THREE.Geometry.call(this);radius=radius||50;thetaStart=thetaStart!==undefined?thetaStart:0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;segments=segments!==undefined?Math.max(3,segments):8;var i,uvs=[],center=new THREE.Vector3,centerUV=new THREE.Vector2(.5,.5);this.vertices.push(center);uvs.push(centerUV);for(i=0;i<=segments;i++){var vertex=new THREE.Vector3;vertex.x=radius*Math.cos(thetaStart+i/segments*thetaLength);vertex.y=radius*Math.sin(thetaStart+i/segments*thetaLength);this.vertices.push(vertex);uvs.push(new THREE.Vector2((vertex.x/radius+1)/2,-(vertex.y/radius+1)/2+1))}var n=new THREE.Vector3(0,0,-1);for(i=1;i<=segments;i++){var v1=i;var v2=i+1;var v3=0;this.faces.push(new THREE.Face3(v1,v2,v3,[n,n,n]));this.faceVertexUvs[0].push([uvs[i],uvs[i+1],centerUV])}this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)};THREE.CircleGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CubeGeometry=function(width,height,depth,widthSegments,heightSegments,depthSegments){THREE.Geometry.call(this);var scope=this;this.width=width;this.height=height;this.depth=depth;this.widthSegments=widthSegments||1;this.heightSegments=heightSegments||1;this.depthSegments=depthSegments||1;var width_half=this.width/2;var height_half=this.height/2;var depth_half=this.depth/2;buildPlane("z","y",-1,-1,this.depth,this.height,width_half,0);buildPlane("z","y",1,-1,this.depth,this.height,-width_half,1);buildPlane("x","z",1,1,this.width,this.depth,height_half,2);buildPlane("x","z",1,-1,this.width,this.depth,-height_half,3);buildPlane("x","y",1,-1,this.width,this.height,depth_half,4);buildPlane("x","y",-1,-1,this.width,this.height,-depth_half,5);function buildPlane(u,v,udir,vdir,width,height,depth,materialIndex){var w,ix,iy,gridX=scope.widthSegments,gridY=scope.heightSegments,width_half=width/2,height_half=height/2,offset=scope.vertices.length;if(u==="x"&&v==="y"||u==="y"&&v==="x"){w="z"}else if(u==="x"&&v==="z"||u==="z"&&v==="x"){w="y";gridY=scope.depthSegments}else if(u==="z"&&v==="y"||u==="y"&&v==="z"){w="x";gridX=scope.depthSegments}var gridX1=gridX+1,gridY1=gridY+1,segment_width=width/gridX,segment_height=height/gridY,normal=new THREE.Vector3;normal[w]=depth>0?1:-1;for(iy=0;iy<gridY1;iy++){for(ix=0;ix<gridX1;ix++){var vector=new THREE.Vector3;vector[u]=(ix*segment_width-width_half)*udir;vector[v]=(iy*segment_height-height_half)*vdir;vector[w]=depth;scope.vertices.push(vector)}}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;var face=new THREE.Face4(a+offset,b+offset,c+offset,d+offset);face.normal.copy(normal);face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone(),normal.clone());face.materialIndex=materialIndex;scope.faces.push(face);scope.faceVertexUvs[0].push([new THREE.Vector2(ix/gridX,1-iy/gridY),new THREE.Vector2(ix/gridX,1-(iy+1)/gridY),new THREE.Vector2((ix+1)/gridX,1-(iy+1)/gridY),new THREE.Vector2((ix+1)/gridX,1-iy/gridY)])}}}this.computeCentroids();this.mergeVertices()};THREE.CubeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.CylinderGeometry=function(radiusTop,radiusBottom,height,radiusSegments,heightSegments,openEnded){THREE.Geometry.call(this);radiusTop=radiusTop!==undefined?radiusTop:20;radiusBottom=radiusBottom!==undefined?radiusBottom:20;height=height!==undefined?height:100;var heightHalf=height/2;var segmentsX=radiusSegments||8;var segmentsY=heightSegments||1;var x,y,vertices=[],uvs=[];for(y=0;y<=segmentsY;y++){var verticesRow=[];var uvsRow=[];var v=y/segmentsY;var radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;x<=segmentsX;x++){var u=x/segmentsX;var vertex=new THREE.Vector3;vertex.x=radius*Math.sin(u*Math.PI*2);vertex.y=-v*height+heightHalf;vertex.z=radius*Math.cos(u*Math.PI*2);this.vertices.push(vertex);verticesRow.push(this.vertices.length-1);uvsRow.push(new THREE.Vector2(u,1-v))}vertices.push(verticesRow);uvs.push(uvsRow)}var tanTheta=(radiusBottom-radiusTop)/height;var na,nb;for(x=0;x<segmentsX;x++){if(radiusTop!==0){na=this.vertices[vertices[0][x]].clone();nb=this.vertices[vertices[0][x+1]].clone()}else{na=this.vertices[vertices[1][x]].clone();nb=this.vertices[vertices[1][x+1]].clone()}na.setY(Math.sqrt(na.x*na.x+na.z*na.z)*tanTheta).normalize();nb.setY(Math.sqrt(nb.x*nb.x+nb.z*nb.z)*tanTheta).normalize();for(y=0;y<segmentsY;y++){var v1=vertices[y][x];var v2=vertices[y+1][x];var v3=vertices[y+1][x+1];var v4=vertices[y][x+1];var n1=na.clone();var n2=na.clone();var n3=nb.clone();var n4=nb.clone();var uv1=uvs[y][x].clone();var uv2=uvs[y+1][x].clone();var uv3=uvs[y+1][x+1].clone();var uv4=uvs[y][x+1].clone();this.faces.push(new THREE.Face4(v1,v2,v3,v4,[n1,n2,n3,n4]));this.faceVertexUvs[0].push([uv1,uv2,uv3,uv4])}}if(!openEnded&&radiusTop>0){this.vertices.push(new THREE.Vector3(0,heightHalf,0));for(x=0;x<segmentsX;x++){var v1=vertices[0][x];var v2=vertices[0][x+1];var v3=this.vertices.length-1;var n1=new THREE.Vector3(0,1,0);var n2=new THREE.Vector3(0,1,0);var n3=new THREE.Vector3(0,1,0);var uv1=uvs[0][x].clone();var uv2=uvs[0][x+1].clone();var uv3=new THREE.Vector2(uv2.u,0);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3]));this.faceVertexUvs[0].push([uv1,uv2,uv3])}}if(!openEnded&&radiusBottom>0){this.vertices.push(new THREE.Vector3(0,-heightHalf,0));for(x=0;x<segmentsX;x++){var v1=vertices[y][x+1];var v2=vertices[y][x];var v3=this.vertices.length-1;var n1=new THREE.Vector3(0,-1,0);var n2=new THREE.Vector3(0,-1,0);var n3=new THREE.Vector3(0,-1,0);var uv1=uvs[y][x+1].clone();var uv2=uvs[y][x].clone();var uv3=new THREE.Vector2(uv2.u,1);this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3]));this.faceVertexUvs[0].push([uv1,uv2,uv3])}}this.computeCentroids();this.computeFaceNormals()};THREE.CylinderGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ExtrudeGeometry=function(shapes,options){if(typeof shapes==="undefined"){shapes=[];return}THREE.Geometry.call(this);shapes=shapes instanceof Array?shapes:[shapes];this.shapebb=shapes[shapes.length-1].getBoundingBox();this.addShapeList(shapes,options);this.computeCentroids();this.computeFaceNormals()};THREE.ExtrudeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.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)}};THREE.ExtrudeGeometry.prototype.addShape=function(shape,options){var amount=options.amount!==undefined?options.amount:100;var bevelThickness=options.bevelThickness!==undefined?options.bevelThickness:6;var bevelSize=options.bevelSize!==undefined?options.bevelSize:bevelThickness-2;var bevelSegments=options.bevelSegments!==undefined?options.bevelSegments:3;var bevelEnabled=options.bevelEnabled!==undefined?options.bevelEnabled:true;var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;var steps=options.steps!==undefined?options.steps:1;var extrudePath=options.extrudePath;var extrudePts,extrudeByPath=false;var material=options.material;var extrudeMaterial=options.extrudeMaterial;var uvgen=options.UVGenerator!==undefined?options.UVGenerator:THREE.ExtrudeGeometry.WorldUVGenerator;var shapebb=this.shapebb;var splineTube,binormal,normal,position2;if(extrudePath){extrudePts=extrudePath.getSpacedPoints(steps);extrudeByPath=true;bevelEnabled=false;splineTube=options.frames!==undefined?options.frames:new THREE.TubeGeometry.FrenetFrames(extrudePath,steps,false);binormal=new THREE.Vector3;normal=new THREE.Vector3;position2=new THREE.Vector3}if(!bevelEnabled){bevelSegments=0;bevelThickness=0;bevelSize=0}var ahole,h,hl;var scope=this;var bevelPoints=[];var shapesOffset=this.vertices.length;var shapePoints=shape.extractPoints(curveSegments);var vertices=shapePoints.shape;var holes=shapePoints.holes;var reverse=!THREE.Shape.Utils.isClockWise(vertices);if(reverse){vertices=vertices.reverse();for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];if(THREE.Shape.Utils.isClockWise(ahole)){holes[h]=ahole.reverse()}}reverse=false}var faces=THREE.Shape.Utils.triangulateShape(vertices,holes);var contour=vertices;for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];vertices=vertices.concat(ahole)}function scalePt2(pt,vec,size){if(!vec)console.log("die");return vec.clone().multiplyScalar(size).add(pt)}var b,bs,t,z,vert,vlen=vertices.length,face,flen=faces.length,cont,clen=contour.length;var RAD_TO_DEGREES=180/Math.PI;function getBevelVec(pt_i,pt_j,pt_k){return getBevelVec2(pt_i,pt_j,pt_k)}function getBevelVec1(pt_i,pt_j,pt_k){var anglea=Math.atan2(pt_j.y-pt_i.y,pt_j.x-pt_i.x);var angleb=Math.atan2(pt_k.y-pt_i.y,pt_k.x-pt_i.x);if(anglea>angleb){angleb+=Math.PI*2}var anglec=(anglea+angleb)/2;var x=-Math.cos(anglec);var y=-Math.sin(anglec);var vec=new THREE.Vector2(x,y);return vec}function getBevelVec2(pt_i,pt_j,pt_k){var a=THREE.ExtrudeGeometry.__v1,b=THREE.ExtrudeGeometry.__v2,v_hat=THREE.ExtrudeGeometry.__v3,w_hat=THREE.ExtrudeGeometry.__v4,p=THREE.ExtrudeGeometry.__v5,q=THREE.ExtrudeGeometry.__v6,v,w,v_dot_w_hat,q_sub_p_dot_w_hat,s,intersection;a.set(pt_i.x-pt_j.x,pt_i.y-pt_j.y);b.set(pt_i.x-pt_k.x,pt_i.y-pt_k.y);v=a.normalize();w=b.normalize();v_hat.set(-v.y,v.x);w_hat.set(w.y,-w.x);p.copy(pt_i).add(v_hat);q.copy(pt_i).add(w_hat);if(p.equals(q)){return w_hat.clone()}p.copy(pt_j).add(v_hat);q.copy(pt_k).add(w_hat);v_dot_w_hat=v.dot(w_hat);q_sub_p_dot_w_hat=q.sub(p).dot(w_hat);if(v_dot_w_hat===0){console.log("Either infinite or no solutions!");if(q_sub_p_dot_w_hat===0){console.log("Its finite solutions.")}else{console.log("Too bad, no solutions.")}}s=q_sub_p_dot_w_hat/v_dot_w_hat;if(s<0){return getBevelVec1(pt_i,pt_j,pt_k)}intersection=v.multiplyScalar(s).add(p);return intersection.sub(pt_i).clone()}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;var pt_i=contour[i];var pt_j=contour[j];var pt_k=contour[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;oneHoleMovements[i]=getBevelVec(ahole[i],ahole[j],ahole[k])}holesMovements.push(oneHoleMovements);verticesMovements=verticesMovements.concat(oneHoleMovements)}for(b=0;b<bevelSegments;b++){t=b/bevelSegments;z=bevelThickness*(1-t);bs=bevelSize*Math.sin(t*Math.PI/2);for(i=0,il=contour.length;i<il;i++){vert=scalePt2(contour[i],contourMovements[i],bs);v(vert.x,vert.y,-z)}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;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{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)}}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{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)}}}for(b=bevelSegments-1;b>=0;b--){t=b/bevelSegments;z=bevelThickness*(1-t);bs=bevelSize*Math.sin(t*Math.PI/2);for(i=0,il=contour.length;i<il;i++){vert=scalePt2(contour[i],contourMovements[i],bs);v(vert.x,vert.y,amount+z)}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)}}}}buildLidFaces();buildSideFaces();function buildLidFaces(){if(bevelEnabled){var layer=0;var offset=vlen*layer;for(i=0;i<flen;i++){face=faces[i];f3(face[2]+offset,face[1]+offset,face[0]+offset,true)}layer=steps+bevelSegments*2;offset=vlen*layer;for(i=0;i<flen;i++){face=faces[i];f3(face[0]+offset,face[1]+offset,face[2]+offset,false)}}else{for(i=0;i<flen;i++){face=faces[i];f3(face[2],face[1],face[0],true)}for(i=0;i<flen;i++){face=faces[i];f3(face[0]+vlen*steps,face[1]+vlen*steps,face[2]+vlen*steps,false)}}}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);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;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 THREE.Vector3(x,y,z))}function f3(a,b,c,isBottom){a+=shapesOffset;b+=shapesOffset;c+=shapesOffset;scope.faces.push(new THREE.Face3(a,b,c,null,null,material));var uvs=isBottom?uvgen.generateBottomUV(scope,shape,options,a,b,c):uvgen.generateTopUV(scope,shape,options,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 THREE.Face4(a,b,c,d,null,null,extrudeMaterial));var uvs=uvgen.generateSideWallUV(scope,shape,wallContour,options,a,b,c,d,stepIndex,stepsLength,contourIndex1,contourIndex2);scope.faceVertexUvs[0].push(uvs)}};THREE.ExtrudeGeometry.WorldUVGenerator={generateTopUV:function(geometry,extrudedShape,extrudeOptions,indexA,indexB,indexC){var ax=geometry.vertices[indexA].x,ay=geometry.vertices[indexA].y,bx=geometry.vertices[indexB].x,by=geometry.vertices[indexB].y,cx=geometry.vertices[indexC].x,cy=geometry.vertices[indexC].y;return[new THREE.Vector2(ax,ay),new THREE.Vector2(bx,by),new THREE.Vector2(cx,cy)]},generateBottomUV:function(geometry,extrudedShape,extrudeOptions,indexA,indexB,indexC){return this.generateTopUV(geometry,extrudedShape,extrudeOptions,indexA,indexB,indexC)},generateSideWallUV:function(geometry,extrudedShape,wallContour,extrudeOptions,indexA,indexB,indexC,indexD,stepIndex,stepsLength,contourIndex1,contourIndex2){var ax=geometry.vertices[indexA].x,ay=geometry.vertices[indexA].y,az=geometry.vertices[indexA].z,bx=geometry.vertices[indexB].x,by=geometry.vertices[indexB].y,bz=geometry.vertices[indexB].z,cx=geometry.vertices[indexC].x,cy=geometry.vertices[indexC].y,cz=geometry.vertices[indexC].z,dx=geometry.vertices[indexD].x,dy=geometry.vertices[indexD].y,dz=geometry.vertices[indexD].z;if(Math.abs(ay-by)<.01){return[new THREE.Vector2(ax,1-az),new THREE.Vector2(bx,1-bz),new THREE.Vector2(cx,1-cz),new THREE.Vector2(dx,1-dz)]}else{return[new THREE.Vector2(ay,1-az),new THREE.Vector2(by,1-bz),new THREE.Vector2(cy,1-cz),new THREE.Vector2(dy,1-dz)]}}};THREE.ExtrudeGeometry.__v1=new THREE.Vector2;THREE.ExtrudeGeometry.__v2=new THREE.Vector2;THREE.ExtrudeGeometry.__v3=new THREE.Vector2;THREE.ExtrudeGeometry.__v4=new THREE.Vector2;THREE.ExtrudeGeometry.__v5=new THREE.Vector2;THREE.ExtrudeGeometry.__v6=new THREE.Vector2;THREE.ShapeGeometry=function(shapes,options){THREE.Geometry.call(this);if(shapes instanceof Array===false)shapes=[shapes];this.shapebb=shapes[shapes.length-1].getBoundingBox();this.addShapeList(shapes,options);this.computeCentroids();this.computeFaceNormals()};THREE.ShapeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ShapeGeometry.prototype.addShapeList=function(shapes,options){for(var i=0,l=shapes.length;i<l;i++){this.addShape(shapes[i],options)}return this};THREE.ShapeGeometry.prototype.addShape=function(shape,options){if(options===undefined)options={};var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;var material=options.material;var uvgen=options.UVGenerator===undefined?THREE.ExtrudeGeometry.WorldUVGenerator:options.UVGenerator;var shapebb=this.shapebb;var i,l,hole,s;var shapesOffset=this.vertices.length;var shapePoints=shape.extractPoints(curveSegments);var vertices=shapePoints.shape;var holes=shapePoints.holes;var reverse=!THREE.Shape.Utils.isClockWise(vertices);if(reverse){vertices=vertices.reverse();for(i=0,l=holes.length;i<l;i++){hole=holes[i];if(THREE.Shape.Utils.isClockWise(hole)){holes[i]=hole.reverse()}}reverse=false}var faces=THREE.Shape.Utils.triangulateShape(vertices,holes);var contour=vertices;for(i=0,l=holes.length;i<l;i++){hole=holes[i];vertices=vertices.concat(hole)}var vert,vlen=vertices.length;var face,flen=faces.length;var cont,clen=contour.length;for(i=0;i<vlen;i++){vert=vertices[i];this.vertices.push(new THREE.Vector3(vert.x,vert.y,0))}for(i=0;i<flen;i++){face=faces[i];var a=face[0]+shapesOffset;var b=face[1]+shapesOffset;var c=face[2]+shapesOffset;this.faces.push(new THREE.Face3(a,b,c,null,null,material));this.faceVertexUvs[0].push(uvgen.generateBottomUV(this,shape,options,a,b,c))}};THREE.LatheGeometry=function(points,segments,phiStart,phiLength){THREE.Geometry.call(this);segments=segments||12;phiStart=phiStart||0;phiLength=phiLength||2*Math.PI;var inversePointLength=1/(points.length-1);var inverseSegments=1/segments;for(var i=0,il=segments;i<=il;i++){var phi=phiStart+i*inverseSegments*phiLength;var c=Math.cos(phi),s=Math.sin(phi);for(var j=0,jl=points.length;j<jl;j++){var pt=points[j];var vertex=new THREE.Vector3;vertex.x=c*pt.x-s*pt.y;vertex.y=s*pt.x+c*pt.y;vertex.z=pt.z;this.vertices.push(vertex)}}var np=points.length;for(var i=0,il=segments;i<il;i++){for(var j=0,jl=points.length-1;j<jl;j++){var base=j+np*i;var a=base;var b=base+np;var c=base+1+np;var d=base+1;this.faces.push(new THREE.Face4(a,b,c,d));var u0=i*inverseSegments;var v0=j*inversePointLength;var u1=u0+inverseSegments;var v1=v0+inversePointLength;this.faceVertexUvs[0].push([new THREE.Vector2(u0,v0),new THREE.Vector2(u1,v0),new THREE.Vector2(u1,v1),new THREE.Vector2(u0,v1)])}}this.mergeVertices();this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.LatheGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.PlaneGeometry=function(width,height,widthSegments,heightSegments){THREE.Geometry.call(this);this.width=width;this.height=height;this.widthSegments=widthSegments||1;this.heightSegments=heightSegments||1;var ix,iz;var width_half=width/2;var height_half=height/2;var gridX=this.widthSegments;var gridZ=this.heightSegments;var gridX1=gridX+1;var gridZ1=gridZ+1;var segment_width=this.width/gridX;var segment_height=this.height/gridZ;var normal=new THREE.Vector3(0,0,1);for(iz=0;iz<gridZ1;iz++){for(ix=0;ix<gridX1;ix++){var x=ix*segment_width-width_half;var y=iz*segment_height-height_half;this.vertices.push(new THREE.Vector3(x,-y,0))}}for(iz=0;iz<gridZ;iz++){for(ix=0;ix<gridX;ix++){var a=ix+gridX1*iz;var b=ix+gridX1*(iz+1);var c=ix+1+gridX1*(iz+1);var d=ix+1+gridX1*iz;var face=new THREE.Face4(a,b,c,d);face.normal.copy(normal);face.vertexNormals.push(normal.clone(),normal.clone(),normal.clone(),normal.clone());this.faces.push(face);this.faceVertexUvs[0].push([new THREE.Vector2(ix/gridX,1-iz/gridZ),new THREE.Vector2(ix/gridX,1-(iz+1)/gridZ),new THREE.Vector2((ix+1)/gridX,1-(iz+1)/gridZ),new THREE.Vector2((ix+1)/gridX,1-iz/gridZ)])}}this.computeCentroids()};THREE.PlaneGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.SphereGeometry=function(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){THREE.Geometry.call(this);this.radius=radius||50;this.widthSegments=Math.max(3,Math.floor(widthSegments)||8);this.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 x,y,vertices=[],uvs=[];for(y=0;y<=this.heightSegments;y++){var verticesRow=[];var uvsRow=[];for(x=0;x<=this.widthSegments;x++){var u=x/this.widthSegments;var v=y/this.heightSegments;var vertex=new THREE.Vector3;vertex.x=-this.radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertex.y=this.radius*Math.cos(thetaStart+v*thetaLength);vertex.z=this.radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);this.vertices.push(vertex);verticesRow.push(this.vertices.length-1);uvsRow.push(new THREE.Vector2(u,1-v))}vertices.push(verticesRow);uvs.push(uvsRow)}for(y=0;y<this.heightSegments;y++){for(x=0;x<this.widthSegments;x++){var v1=vertices[y][x+1];var v2=vertices[y][x];var v3=vertices[y+1][x];var v4=vertices[y+1][x+1];var n1=this.vertices[v1].clone().normalize();var n2=this.vertices[v2].clone().normalize();var n3=this.vertices[v3].clone().normalize();var n4=this.vertices[v4].clone().normalize();var uv1=uvs[y][x+1].clone();var uv2=uvs[y][x].clone();var uv3=uvs[y+1][x].clone();var uv4=uvs[y+1][x+1].clone();if(Math.abs(this.vertices[v1].y)===this.radius){
this.faces.push(new THREE.Face3(v1,v3,v4,[n1,n3,n4]));this.faceVertexUvs[0].push([uv1,uv3,uv4])}else if(Math.abs(this.vertices[v3].y)===this.radius){this.faces.push(new THREE.Face3(v1,v2,v3,[n1,n2,n3]));this.faceVertexUvs[0].push([uv1,uv2,uv3])}else{this.faces.push(new THREE.Face4(v1,v2,v3,v4,[n1,n2,n3,n4]));this.faceVertexUvs[0].push([uv1,uv2,uv3,uv4])}}}this.computeCentroids();this.computeFaceNormals();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)};THREE.SphereGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TextGeometry=function(text,parameters){var textShapes=THREE.FontUtils.generateShapes(text,parameters);parameters.amount=parameters.height!==undefined?parameters.height:50;if(parameters.bevelThickness===undefined)parameters.bevelThickness=10;if(parameters.bevelSize===undefined)parameters.bevelSize=8;if(parameters.bevelEnabled===undefined)parameters.bevelEnabled=false;THREE.ExtrudeGeometry.call(this,textShapes,parameters)};THREE.TextGeometry.prototype=Object.create(THREE.ExtrudeGeometry.prototype);THREE.TorusGeometry=function(radius,tube,radialSegments,tubularSegments,arc){THREE.Geometry.call(this);var scope=this;this.radius=radius||100;this.tube=tube||40;this.radialSegments=radialSegments||8;this.tubularSegments=tubularSegments||6;this.arc=arc||Math.PI*2;var center=new THREE.Vector3,uvs=[],normals=[];for(var j=0;j<=this.radialSegments;j++){for(var i=0;i<=this.tubularSegments;i++){var u=i/this.tubularSegments*this.arc;var v=j/this.radialSegments*Math.PI*2;center.x=this.radius*Math.cos(u);center.y=this.radius*Math.sin(u);var vertex=new THREE.Vector3;vertex.x=(this.radius+this.tube*Math.cos(v))*Math.cos(u);vertex.y=(this.radius+this.tube*Math.cos(v))*Math.sin(u);vertex.z=this.tube*Math.sin(v);this.vertices.push(vertex);uvs.push(new THREE.Vector2(i/this.tubularSegments,j/this.radialSegments));normals.push(vertex.clone().sub(center).normalize())}}for(var j=1;j<=this.radialSegments;j++){for(var i=1;i<=this.tubularSegments;i++){var a=(this.tubularSegments+1)*j+i-1;var b=(this.tubularSegments+1)*(j-1)+i-1;var c=(this.tubularSegments+1)*(j-1)+i;var d=(this.tubularSegments+1)*j+i;var face=new THREE.Face4(a,b,c,d,[normals[a],normals[b],normals[c],normals[d]]);face.normal.add(normals[a]);face.normal.add(normals[b]);face.normal.add(normals[c]);face.normal.add(normals[d]);face.normal.normalize();this.faces.push(face);this.faceVertexUvs[0].push([uvs[a].clone(),uvs[b].clone(),uvs[c].clone(),uvs[d].clone()])}}this.computeCentroids()};THREE.TorusGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TorusKnotGeometry=function(radius,tube,radialSegments,tubularSegments,p,q,heightScale){THREE.Geometry.call(this);var scope=this;this.radius=radius||100;this.tube=tube||40;this.radialSegments=radialSegments||64;this.tubularSegments=tubularSegments||8;this.p=p||2;this.q=q||3;this.heightScale=heightScale||1;this.grid=new Array(this.radialSegments);var tang=new THREE.Vector3;var n=new THREE.Vector3;var bitan=new THREE.Vector3;for(var i=0;i<this.radialSegments;++i){this.grid[i]=new Array(this.tubularSegments);for(var j=0;j<this.tubularSegments;++j){var u=i/this.radialSegments*2*this.p*Math.PI;var v=j/this.tubularSegments*2*Math.PI;var p1=getPos(u,v,this.q,this.p,this.radius,this.heightScale);var p2=getPos(u+.01,v,this.q,this.p,this.radius,this.heightScale);var cx,cy;tang.subVectors(p2,p1);n.addVectors(p2,p1);bitan.crossVectors(tang,n);n.crossVectors(bitan,tang);bitan.normalize();n.normalize();cx=-this.tube*Math.cos(v);cy=this.tube*Math.sin(v);p1.x+=cx*n.x+cy*bitan.x;p1.y+=cx*n.y+cy*bitan.y;p1.z+=cx*n.z+cy*bitan.z;this.grid[i][j]=vert(p1.x,p1.y,p1.z)}}for(var i=0;i<this.radialSegments;++i){for(var j=0;j<this.tubularSegments;++j){var ip=(i+1)%this.radialSegments;var jp=(j+1)%this.tubularSegments;var a=this.grid[i][j];var b=this.grid[ip][j];var c=this.grid[ip][jp];var d=this.grid[i][jp];var uva=new THREE.Vector2(i/this.radialSegments,j/this.tubularSegments);var uvb=new THREE.Vector2((i+1)/this.radialSegments,j/this.tubularSegments);var uvc=new THREE.Vector2((i+1)/this.radialSegments,(j+1)/this.tubularSegments);var uvd=new THREE.Vector2(i/this.radialSegments,(j+1)/this.tubularSegments);this.faces.push(new THREE.Face4(a,b,c,d));this.faceVertexUvs[0].push([uva,uvb,uvc,uvd])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals();function vert(x,y,z){return scope.vertices.push(new THREE.Vector3(x,y,z))-1}function getPos(u,v,in_q,in_p,radius,heightScale){var cu=Math.cos(u);var cv=Math.cos(v);var su=Math.sin(u);var quOverP=in_q/in_p*u;var cs=Math.cos(quOverP);var tx=radius*(2+cs)*.5*cu;var ty=radius*(2+cs)*su*.5;var tz=heightScale*radius*Math.sin(quOverP)*.5;return new THREE.Vector3(tx,ty,tz)}};THREE.TorusKnotGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TubeGeometry=function(path,segments,radius,radiusSegments,closed,debug){THREE.Geometry.call(this);this.path=path;this.segments=segments||64;this.radius=radius||1;this.radiusSegments=radiusSegments||8;this.closed=closed||false;if(debug)this.debug=new THREE.Object3D;this.grid=[];var scope=this,tangent,normal,binormal,numpoints=this.segments+1,x,y,z,tx,ty,tz,u,v,cx,cy,pos,pos2=new THREE.Vector3,i,j,ip,jp,a,b,c,d,uva,uvb,uvc,uvd;var frames=new THREE.TubeGeometry.FrenetFrames(this.path,this.segments,this.closed),tangents=frames.tangents,normals=frames.normals,binormals=frames.binormals;this.tangents=tangents;this.normals=normals;this.binormals=binormals;function vert(x,y,z){return scope.vertices.push(new THREE.Vector3(x,y,z))-1}for(i=0;i<numpoints;i++){this.grid[i]=[];u=i/(numpoints-1);pos=path.getPointAt(u);tangent=tangents[i];normal=normals[i];binormal=binormals[i];if(this.debug){this.debug.add(new THREE.ArrowHelper(tangent,pos,radius,255));this.debug.add(new THREE.ArrowHelper(normal,pos,radius,16711680));this.debug.add(new THREE.ArrowHelper(binormal,pos,radius,65280))}for(j=0;j<this.radiusSegments;j++){v=j/this.radiusSegments*2*Math.PI;cx=-this.radius*Math.cos(v);cy=this.radius*Math.sin(v);pos2.copy(pos);pos2.x+=cx*normal.x+cy*binormal.x;pos2.y+=cx*normal.y+cy*binormal.y;pos2.z+=cx*normal.z+cy*binormal.z;this.grid[i][j]=vert(pos2.x,pos2.y,pos2.z)}}for(i=0;i<this.segments;i++){for(j=0;j<this.radiusSegments;j++){ip=this.closed?(i+1)%this.segments:i+1;jp=(j+1)%this.radiusSegments;a=this.grid[i][j];b=this.grid[ip][j];c=this.grid[ip][jp];d=this.grid[i][jp];uva=new THREE.Vector2(i/this.segments,j/this.radiusSegments);uvb=new THREE.Vector2((i+1)/this.segments,j/this.radiusSegments);uvc=new THREE.Vector2((i+1)/this.segments,(j+1)/this.radiusSegments);uvd=new THREE.Vector2(i/this.segments,(j+1)/this.radiusSegments);this.faces.push(new THREE.Face4(a,b,c,d));this.faceVertexUvs[0].push([uva,uvb,uvc,uvd])}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.TubeGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TubeGeometry.FrenetFrames=function(path,segments,closed){var tangent=new THREE.Vector3,normal=new THREE.Vector3,binormal=new THREE.Vector3,tangents=[],normals=[],binormals=[],vec=new THREE.Vector3,mat=new THREE.Matrix4,numpoints=segments+1,theta,epsilon=1e-4,smallest,tx,ty,tz,i,u,v;this.tangents=tangents;this.normals=normals;this.binormals=binormals;for(i=0;i<numpoints;i++){u=i/(numpoints-1);tangents[i]=path.getTangentAt(u);tangents[i].normalize()}initialNormal3();function initialNormal1(lastBinormal){normals[0]=new THREE.Vector3;binormals[0]=new THREE.Vector3;if(lastBinormal===undefined)lastBinormal=new THREE.Vector3(0,0,1);normals[0].crossVectors(lastBinormal,tangents[0]).normalize();binormals[0].crossVectors(tangents[0],normals[0]).normalize()}function initialNormal2(){var t2=path.getTangentAt(epsilon);normals[0]=(new THREE.Vector3).subVectors(t2,tangents[0]).normalize();binormals[0]=(new THREE.Vector3).crossVectors(tangents[0],normals[0]);normals[0].crossVectors(binormals[0],tangents[0]).normalize();binormals[0].crossVectors(tangents[0],normals[0]).normalize()}function initialNormal3(){normals[0]=new THREE.Vector3;binormals[0]=new THREE.Vector3;smallest=Number.MAX_VALUE;tx=Math.abs(tangents[0].x);ty=Math.abs(tangents[0].y);tz=Math.abs(tangents[0].z);if(tx<=smallest){smallest=tx;normal.set(1,0,0)}if(ty<=smallest){smallest=ty;normal.set(0,1,0)}if(tz<=smallest){normal.set(0,0,1)}vec.crossVectors(tangents[0],normal).normalize();normals[0].crossVectors(tangents[0],vec);binormals[0].crossVectors(tangents[0],normals[0])}for(i=1;i<numpoints;i++){normals[i]=normals[i-1].clone();binormals[i]=binormals[i-1].clone();vec.crossVectors(tangents[i-1],tangents[i]);if(vec.length()>epsilon){vec.normalize();theta=Math.acos(tangents[i-1].dot(tangents[i]));normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta))}binormals[i].crossVectors(tangents[i],normals[i])}if(closed){theta=Math.acos(normals[0].dot(normals[numpoints-1]));theta/=numpoints-1;if(tangents[0].dot(vec.crossVectors(normals[0],normals[numpoints-1]))>0){theta=-theta}for(i=1;i<numpoints;i++){normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i));binormals[i].crossVectors(tangents[i],normals[i])}}};THREE.PolyhedronGeometry=function(vertices,faces,radius,detail){THREE.Geometry.call(this);radius=radius||1;detail=detail||0;var that=this;for(var i=0,l=vertices.length;i<l;i++){prepare(new THREE.Vector3(vertices[i][0],vertices[i][1],vertices[i][2]))}var midpoints=[],p=this.vertices;for(var i=0,l=faces.length;i<l;i++){make(p[faces[i][0]],p[faces[i][1]],p[faces[i][2]],detail)}this.mergeVertices();for(var i=0,l=this.vertices.length;i<l;i++){this.vertices[i].multiplyScalar(radius)}function prepare(vector){var vertex=vector.normalize().clone();vertex.index=that.vertices.push(vertex)-1;var u=azimuth(vector)/2/Math.PI+.5;var v=inclination(vector)/Math.PI+.5;vertex.uv=new THREE.Vector2(u,1-v);return vertex}function make(v1,v2,v3,detail){if(detail<1){var face=new THREE.Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()]);face.centroid.add(v1).add(v2).add(v3).divideScalar(3);face.normal=face.centroid.clone().normalize();that.faces.push(face);var azi=azimuth(face.centroid);that.faceVertexUvs[0].push([correctUV(v1.uv,v1,azi),correctUV(v2.uv,v2,azi),correctUV(v3.uv,v3,azi)])}else{detail-=1;make(v1,midpoint(v1,v2),midpoint(v1,v3),detail);make(midpoint(v1,v2),v2,midpoint(v2,v3),detail);make(midpoint(v1,v3),midpoint(v2,v3),v3,detail);make(midpoint(v1,v2),midpoint(v2,v3),midpoint(v1,v3),detail)}}function midpoint(v1,v2){if(!midpoints[v1.index])midpoints[v1.index]=[];if(!midpoints[v2.index])midpoints[v2.index]=[];var mid=midpoints[v1.index][v2.index];if(mid===undefined){midpoints[v1.index][v2.index]=midpoints[v2.index][v1.index]=mid=prepare((new THREE.Vector3).addVectors(v1,v2).divideScalar(2))}return mid}function azimuth(vector){return Math.atan2(vector.z,-vector.x)}function inclination(vector){return Math.atan2(-vector.y,Math.sqrt(vector.x*vector.x+vector.z*vector.z))}function correctUV(uv,vector,azimuth){if(azimuth<0&&uv.x===1)uv=new THREE.Vector2(uv.x-1,uv.y);if(vector.x===0&&vector.z===0)uv=new THREE.Vector2(azimuth/2/Math.PI+.5,uv.y);return uv}this.computeCentroids();this.boundingSphere=new THREE.Sphere(new THREE.Vector3,radius)};THREE.PolyhedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.IcosahedronGeometry=function(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 faces=[[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]];THREE.PolyhedronGeometry.call(this,vertices,faces,radius,detail)};THREE.IcosahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.OctahedronGeometry=function(radius,detail){var vertices=[[1,0,0],[-1,0,0],[0,1,0],[0,-1,0],[0,0,1],[0,0,-1]];var faces=[[0,2,4],[0,4,3],[0,3,5],[0,5,2],[1,2,5],[1,5,3],[1,3,4],[1,4,2]];THREE.PolyhedronGeometry.call(this,vertices,faces,radius,detail)};THREE.OctahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.TetrahedronGeometry=function(radius,detail){var vertices=[[1,1,1],[-1,-1,1],[-1,1,-1],[1,-1,-1]];var faces=[[2,1,0],[0,3,2],[1,3,0],[2,3,1]];THREE.PolyhedronGeometry.call(this,vertices,faces,radius,detail)};THREE.TetrahedronGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ParametricGeometry=function(func,slices,stacks,useTris){THREE.Geometry.call(this);var verts=this.vertices;var faces=this.faces;var uvs=this.faceVertexUvs[0];useTris=useTris===undefined?false:useTris;var i,il,j,p;var u,v;var stackCount=stacks+1;var sliceCount=slices+1;for(i=0;i<=stacks;i++){v=i/stacks;for(j=0;j<=slices;j++){u=j/slices;p=func(u,v);verts.push(p)}}var a,b,c,d;var uva,uvb,uvc,uvd;for(i=0;i<stacks;i++){for(j=0;j<slices;j++){a=i*sliceCount+j;b=i*sliceCount+j+1;c=(i+1)*sliceCount+j;d=(i+1)*sliceCount+j+1;uva=new THREE.Vector2(j/slices,i/stacks);uvb=new THREE.Vector2((j+1)/slices,i/stacks);uvc=new THREE.Vector2(j/slices,(i+1)/stacks);uvd=new THREE.Vector2((j+1)/slices,(i+1)/stacks);if(useTris){faces.push(new THREE.Face3(a,b,c));faces.push(new THREE.Face3(b,d,c));uvs.push([uva,uvb,uvc]);uvs.push([uvb,uvd,uvc])}else{faces.push(new THREE.Face4(a,b,d,c));uvs.push([uva,uvb,uvd,uvc])}}}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ParametricGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.ConvexGeometry=function(vertices){THREE.Geometry.call(this);var faces=[[0,1,2],[0,2,1]];for(var i=3;i<vertices.length;i++){addPoint(i)}function addPoint(vertexId){var vertex=vertices[vertexId].clone();var mag=vertex.length();vertex.x+=mag*randomOffset();vertex.y+=mag*randomOffset();vertex.z+=mag*randomOffset();var hole=[];for(var f=0;f<faces.length;){var face=faces[f];if(visible(face,vertex)){for(var e=0;e<3;e++){var edge=[face[e],face[(e+1)%3]];var boundary=true;for(var h=0;h<hole.length;h++){if(equalEdge(hole[h],edge)){hole[h]=hole[hole.length-1];hole.pop();boundary=false;break}}if(boundary){hole.push(edge)}}faces[f]=faces[faces.length-1];faces.pop()}else{f++}}for(var h=0;h<hole.length;h++){faces.push([hole[h][0],hole[h][1],vertexId])}}function visible(face,vertex){var va=vertices[face[0]];var vb=vertices[face[1]];var vc=vertices[face[2]];var n=normal(va,vb,vc);var dist=n.dot(va);return n.dot(vertex)>=dist}function normal(va,vb,vc){var cb=new THREE.Vector3;var ab=new THREE.Vector3;cb.subVectors(vc,vb);ab.subVectors(va,vb);cb.cross(ab);cb.normalize();return cb}function equalEdge(ea,eb){return ea[0]===eb[1]&&ea[1]===eb[0]}function randomOffset(){return(Math.random()-.5)*2*1e-6}function vertexUv(vertex){var mag=vertex.length();return new THREE.Vector2(vertex.x/mag,vertex.y/mag)}var id=0;var newId=new Array(vertices.length);for(var i=0;i<faces.length;i++){var face=faces[i];for(var j=0;j<3;j++){if(newId[face[j]]===undefined){newId[face[j]]=id++;this.vertices.push(vertices[face[j]])}face[j]=newId[face[j]]}}for(var i=0;i<faces.length;i++){this.faces.push(new THREE.Face3(faces[i][0],faces[i][1],faces[i][2]))}for(var i=0;i<this.faces.length;i++){var face=this.faces[i];this.faceVertexUvs[0].push([vertexUv(this.vertices[face.a]),vertexUv(this.vertices[face.b]),vertexUv(this.vertices[face.c])])}this.computeCentroids();this.computeFaceNormals();this.computeVertexNormals()};THREE.ConvexGeometry.prototype=Object.create(THREE.Geometry.prototype);THREE.AxisHelper=function(size){var geometry=new THREE.Geometry;geometry.vertices.push(new THREE.Vector3,new THREE.Vector3(size||1,0,0),new THREE.Vector3,new THREE.Vector3(0,size||1,0),new THREE.Vector3,new THREE.Vector3(0,0,size||1));geometry.colors.push(new THREE.Color(16711680),new THREE.Color(16755200),new THREE.Color(65280),new THREE.Color(11206400),new THREE.Color(255),new THREE.Color(43775));var material=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors});THREE.Line.call(this,geometry,material,THREE.LinePieces)};THREE.AxisHelper.prototype=Object.create(THREE.Line.prototype);THREE.ArrowHelper=function(dir,origin,length,hex){THREE.Object3D.call(this);if(length===undefined)length=20;if(hex===undefined)hex=16776960;var lineGeometry=new THREE.Geometry;lineGeometry.vertices.push(new THREE.Vector3(0,0,0));lineGeometry.vertices.push(new THREE.Vector3(0,1,0));this.line=new THREE.Line(lineGeometry,new THREE.LineBasicMaterial({color:hex}));this.add(this.line);var coneGeometry=new THREE.CylinderGeometry(0,.05,.25,5,1);this.cone=new THREE.Mesh(coneGeometry,new THREE.MeshBasicMaterial({color:hex}));this.cone.position.set(0,1,0);this.add(this.cone);if(origin instanceof THREE.Vector3)this.position=origin;this.setDirection(dir);this.setLength(length)};THREE.ArrowHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.ArrowHelper.prototype.setDirection=function(dir){var d=THREE.ArrowHelper.__v1.copy(dir).normalize();if(d.y>.999){this.rotation.set(0,0,0)}else if(d.y<-.999){this.rotation.set(Math.PI,0,0)}else{var axis=THREE.ArrowHelper.__v2.set(d.z,0,-d.x).normalize();var radians=Math.acos(d.y);var quaternion=THREE.ArrowHelper.__q1.setFromAxisAngle(axis,radians);this.rotation.setEulerFromQuaternion(quaternion,this.eulerOrder)}};THREE.ArrowHelper.prototype.setLength=function(length){this.scale.set(length,length,length)};THREE.ArrowHelper.prototype.setColor=function(hex){this.line.material.color.setHex(hex);this.cone.material.color.setHex(hex)};THREE.ArrowHelper.__v1=new THREE.Vector3;THREE.ArrowHelper.__v2=new THREE.Vector3;THREE.ArrowHelper.__q1=new THREE.Quaternion;THREE.CameraHelper=function(camera){THREE.Line.call(this);var scope=this;this.geometry=new THREE.Geometry;this.material=new THREE.LineBasicMaterial({color:16777215,vertexColors:THREE.FaceColors});this.type=THREE.LinePieces;this.matrixWorld=camera.matrixWorld;this.matrixAutoUpdate=false;this.pointMap={};var hexFrustum=16755200;var hexCone=16711680;var hexUp=43775;var hexTarget=16777215;var hexCross=3355443;addLine("n1","n2",hexFrustum);addLine("n2","n4",hexFrustum);addLine("n4","n3",hexFrustum);addLine("n3","n1",hexFrustum);addLine("f1","f2",hexFrustum);addLine("f2","f4",hexFrustum);addLine("f4","f3",hexFrustum);addLine("f3","f1",hexFrustum);addLine("n1","f1",hexFrustum);addLine("n2","f2",hexFrustum);addLine("n3","f3",hexFrustum);addLine("n4","f4",hexFrustum);addLine("p","n1",hexCone);addLine("p","n2",hexCone);addLine("p","n3",hexCone);addLine("p","n4",hexCone);addLine("u1","u2",hexUp);addLine("u2","u3",hexUp);addLine("u3","u1",hexUp);addLine("c","t",hexTarget);addLine("p","c",hexCross);addLine("cn1","cn2",hexCross);addLine("cn3","cn4",hexCross);addLine("cf1","cf2",hexCross);addLine("cf3","cf4",hexCross);this.camera=camera;function addLine(a,b,hex){addPoint(a,hex);addPoint(b,hex)}function addPoint(id,hex){scope.geometry.vertices.push(new THREE.Vector3);scope.geometry.colors.push(new THREE.Color(hex));if(scope.pointMap[id]===undefined)scope.pointMap[id]=[];scope.pointMap[id].push(scope.geometry.vertices.length-1)}this.update(camera)};THREE.CameraHelper.prototype=Object.create(THREE.Line.prototype);THREE.CameraHelper.prototype.update=function(){var scope=this;var w=1,h=1;THREE.CameraHelper.__c.projectionMatrix.copy(this.camera.projectionMatrix);setPoint("c",0,0,-1);setPoint("t",0,0,1);setPoint("n1",-w,-h,-1);setPoint("n2",w,-h,-1);setPoint("n3",-w,h,-1);setPoint("n4",w,h,-1);setPoint("f1",-w,-h,1);setPoint("f2",w,-h,1);setPoint("f3",-w,h,1);setPoint("f4",w,h,1);setPoint("u1",w*.7,h*1.1,-1);setPoint("u2",-w*.7,h*1.1,-1);setPoint("u3",0,h*2,-1);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);function setPoint(point,x,y,z){THREE.CameraHelper.__v.set(x,y,z);THREE.CameraHelper.__projector.unprojectVector(THREE.CameraHelper.__v,THREE.CameraHelper.__c);var points=scope.pointMap[point];if(points!==undefined){for(var i=0,il=points.length;i<il;i++){scope.geometry.vertices[points[i]].copy(THREE.CameraHelper.__v)}}}this.geometry.verticesNeedUpdate=true};THREE.CameraHelper.__projector=new THREE.Projector;THREE.CameraHelper.__v=new THREE.Vector3;THREE.CameraHelper.__c=new THREE.Camera;THREE.DirectionalLightHelper=function(light,sphereSize){THREE.Object3D.call(this);this.light=light;this.position=light.position;this.direction=new THREE.Vector3;this.direction.subVectors(light.target.position,light.position);var intensity=THREE.Math.clamp(light.intensity,0,1);this.color=light.color.clone();this.color.multiplyScalar(intensity);var hexColor=this.color.getHex();var bulbGeometry=new THREE.SphereGeometry(sphereSize,16,8);var raysGeometry=new THREE.AsteriskGeometry(sphereSize*1.25,sphereSize*2.25);var bulbMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false});var raysMaterial=new THREE.LineBasicMaterial({color:hexColor,fog:false});this.lightSphere=new THREE.Mesh(bulbGeometry,bulbMaterial);this.lightRays=new THREE.Line(raysGeometry,raysMaterial,THREE.LinePieces);this.add(this.lightSphere);this.add(this.lightRays);this.lightSphere.properties.isGizmo=true;this.lightSphere.properties.gizmoSubject=light;this.lightSphere.properties.gizmoRoot=this;this.targetSphere=null;if(light.target.properties.targetInverse!==undefined){var targetGeo=new THREE.SphereGeometry(sphereSize,8,4);var targetMaterial=new THREE.MeshBasicMaterial({color:hexColor,wireframe:true,fog:false});this.targetSphere=new THREE.Mesh(targetGeo,targetMaterial);this.targetSphere.position=light.target.position;this.targetSphere.properties.isGizmo=true;this.targetSphere.properties.gizmoSubject=light.target;this.targetSphere.properties.gizmoRoot=this.targetSphere;var lineMaterial=new THREE.LineDashedMaterial({color:hexColor,dashSize:4,gapSize:4,opacity:.75,transparent:true,fog:false});var lineGeometry=new THREE.Geometry;lineGeometry.vertices.push(this.position.clone());lineGeometry.vertices.push(this.targetSphere.position.clone());lineGeometry.computeLineDistances();this.targetLine=new THREE.Line(lineGeometry,lineMaterial);this.targetLine.properties.isGizmo=true}this.properties.isGizmo=true};THREE.DirectionalLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.DirectionalLightHelper.prototype.update=function(){this.direction.subVectors(this.light.target.position,this.light.position);var intensity=THREE.Math.clamp(this.light.intensity,0,1);this.color.copy(this.light.color);this.color.multiplyScalar(intensity);this.lightSphere.material.color.copy(this.color);this.lightRays.material.color.copy(this.color);if(this.targetSphere!==null){this.targetSphere.material.color.copy(this.color);this.targetLine.material.color.copy(this.color);this.targetLine.geometry.vertices[0].copy(this.light.position);this.targetLine.geometry.vertices[1].copy(this.light.target.position);this.targetLine.geometry.computeLineDistances();this.targetLine.geometry.verticesNeedUpdate=true}};THREE.HemisphereLightHelper=function(light,sphereSize,arrowLength,domeSize){THREE.Object3D.call(this);this.light=light;this.position=light.position;var intensity=THREE.Math.clamp(light.intensity,0,1);this.color=light.color.clone();this.color.multiplyScalar(intensity);var hexColor=this.color.getHex();this.groundColor=light.groundColor.clone();this.groundColor.multiplyScalar(intensity);var hexColorGround=this.groundColor.getHex();var bulbGeometry=new THREE.SphereGeometry(sphereSize,16,8,0,Math.PI*2,0,Math.PI*.5);var bulbGroundGeometry=new THREE.SphereGeometry(sphereSize,16,8,0,Math.PI*2,Math.PI*.5,Math.PI);var bulbSkyMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false});var bulbGroundMaterial=new THREE.MeshBasicMaterial({color:hexColorGround,fog:false});for(var i=0,il=bulbGeometry.faces.length;i<il;i++){bulbGeometry.faces[i].materialIndex=0}for(var i=0,il=bulbGroundGeometry.faces.length;i<il;i++){bulbGroundGeometry.faces[i].materialIndex=1}THREE.GeometryUtils.merge(bulbGeometry,bulbGroundGeometry);this.lightSphere=new THREE.Mesh(bulbGeometry,new THREE.MeshFaceMaterial([bulbSkyMaterial,bulbGroundMaterial]));this.lightArrow=new THREE.ArrowHelper(new THREE.Vector3(0,1,0),new THREE.Vector3(0,(sphereSize+arrowLength)*1.1,0),arrowLength,hexColor);this.lightArrow.rotation.x=Math.PI;this.lightArrowGround=new THREE.ArrowHelper(new THREE.Vector3(0,1,0),new THREE.Vector3(0,(sphereSize+arrowLength)*-1.1,0),arrowLength,hexColorGround);var joint=new THREE.Object3D;joint.rotation.x=-Math.PI*.5;joint.add(this.lightSphere);joint.add(this.lightArrow);joint.add(this.lightArrowGround);this.add(joint);this.lightSphere.properties.isGizmo=true;this.lightSphere.properties.gizmoSubject=light;this.lightSphere.properties.gizmoRoot=this;this.properties.isGizmo=true;this.target=new THREE.Vector3;this.lookAt(this.target)};THREE.HemisphereLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.HemisphereLightHelper.prototype.update=function(){var intensity=THREE.Math.clamp(this.light.intensity,0,1);this.color.copy(this.light.color);this.color.multiplyScalar(intensity);this.groundColor.copy(this.light.groundColor);this.groundColor.multiplyScalar(intensity);this.lightSphere.material.materials[0].color.copy(this.color);this.lightSphere.material.materials[1].color.copy(this.groundColor);this.lightArrow.setColor(this.color.getHex());this.lightArrowGround.setColor(this.groundColor.getHex());this.lookAt(this.target)};THREE.PointLightHelper=function(light,sphereSize){THREE.Object3D.call(this);this.light=light;this.position=light.position;var intensity=THREE.Math.clamp(light.intensity,0,1);this.color=light.color.clone();this.color.multiplyScalar(intensity);var hexColor=this.color.getHex();var bulbGeometry=new THREE.SphereGeometry(sphereSize,16,8);var raysGeometry=new THREE.AsteriskGeometry(sphereSize*1.25,sphereSize*2.25);var distanceGeometry=new THREE.IcosahedronGeometry(1,2);var bulbMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false});var raysMaterial=new THREE.LineBasicMaterial({color:hexColor,fog:false});var distanceMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false,wireframe:true,opacity:.1,transparent:true});this.lightSphere=new THREE.Mesh(bulbGeometry,bulbMaterial);this.lightRays=new THREE.Line(raysGeometry,raysMaterial,THREE.LinePieces);this.lightDistance=new THREE.Mesh(distanceGeometry,distanceMaterial);var d=light.distance;if(d===0){this.lightDistance.visible=false}else{this.lightDistance.scale.set(d,d,d)}this.add(this.lightSphere);this.add(this.lightRays);this.add(this.lightDistance);this.lightSphere.properties.isGizmo=true;this.lightSphere.properties.gizmoSubject=light;this.lightSphere.properties.gizmoRoot=this;this.properties.isGizmo=true};THREE.PointLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.PointLightHelper.prototype.update=function(){var intensity=THREE.Math.clamp(this.light.intensity,0,1);this.color.copy(this.light.color);this.color.multiplyScalar(intensity);this.lightSphere.material.color.copy(this.color);this.lightRays.material.color.copy(this.color);this.lightDistance.material.color.copy(this.color);var d=this.light.distance;if(d===0){this.lightDistance.visible=false}else{this.lightDistance.visible=true;this.lightDistance.scale.set(d,d,d)}};THREE.SpotLightHelper=function(light,sphereSize){THREE.Object3D.call(this);this.light=light;this.position=light.position;this.direction=new THREE.Vector3;this.direction.subVectors(light.target.position,light.position);var intensity=THREE.Math.clamp(light.intensity,0,1);this.color=light.color.clone();this.color.multiplyScalar(intensity);var hexColor=this.color.getHex();var bulbGeometry=new THREE.SphereGeometry(sphereSize,16,8);var raysGeometry=new THREE.AsteriskGeometry(sphereSize*1.25,sphereSize*2.25);var coneGeometry=new THREE.CylinderGeometry(1e-4,1,1,8,1,true);var coneMatrix=new THREE.Matrix4;coneMatrix.rotateX(-Math.PI/2);coneMatrix.translate(new THREE.Vector3(0,-.5,0));coneGeometry.applyMatrix(coneMatrix);var bulbMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false});var raysMaterial=new THREE.LineBasicMaterial({color:hexColor,fog:false});var coneMaterial=new THREE.MeshBasicMaterial({color:hexColor,fog:false,wireframe:true,opacity:.3,transparent:true});this.lightSphere=new THREE.Mesh(bulbGeometry,bulbMaterial);this.lightCone=new THREE.Mesh(coneGeometry,coneMaterial);var coneLength=light.distance?light.distance:1e4;var coneWidth=coneLength*Math.tan(light.angle*.5)*2;this.lightCone.scale.set(coneWidth,coneWidth,coneLength);this.lightRays=new THREE.Line(raysGeometry,raysMaterial,THREE.LinePieces);this.gyroscope=new THREE.Gyroscope;this.gyroscope.add(this.lightSphere);this.gyroscope.add(this.lightRays);this.add(this.gyroscope);this.add(this.lightCone);this.lookAt(light.target.position);this.lightSphere.properties.isGizmo=true;this.lightSphere.properties.gizmoSubject=light;this.lightSphere.properties.gizmoRoot=this;this.targetSphere=null;if(light.target.properties.targetInverse!==undefined){var targetGeo=new THREE.SphereGeometry(sphereSize,8,4);var targetMaterial=new THREE.MeshBasicMaterial({color:hexColor,wireframe:true,fog:false});this.targetSphere=new THREE.Mesh(targetGeo,targetMaterial);this.targetSphere.position=light.target.position;this.targetSphere.properties.isGizmo=true;this.targetSphere.properties.gizmoSubject=light.target;this.targetSphere.properties.gizmoRoot=this.targetSphere;var lineMaterial=new THREE.LineDashedMaterial({color:hexColor,dashSize:4,gapSize:4,opacity:.75,transparent:true,fog:false});var lineGeometry=new THREE.Geometry;lineGeometry.vertices.push(this.position.clone());lineGeometry.vertices.push(this.targetSphere.position.clone());lineGeometry.computeLineDistances();this.targetLine=new THREE.Line(lineGeometry,lineMaterial);this.targetLine.properties.isGizmo=true}this.properties.isGizmo=true};THREE.SpotLightHelper.prototype=Object.create(THREE.Object3D.prototype);THREE.SpotLightHelper.prototype.update=function(){this.direction.subVectors(this.light.target.position,this.light.position);this.lookAt(this.light.target.position);var coneLength=this.light.distance?this.light.distance:1e4;var coneWidth=coneLength*Math.tan(this.light.angle*.5)*2;this.lightCone.scale.set(coneWidth,coneWidth,coneLength);var intensity=THREE.Math.clamp(this.light.intensity,0,1);this.color.copy(this.light.color);this.color.multiplyScalar(intensity);this.lightSphere.material.color.copy(this.color);this.lightRays.material.color.copy(this.color);this.lightCone.material.color.copy(this.color);if(this.targetSphere!==null){this.targetSphere.material.color.copy(this.color);this.targetLine.material.color.copy(this.color);this.targetLine.geometry.vertices[0].copy(this.light.position);this.targetLine.geometry.vertices[1].copy(this.light.target.position);this.targetLine.geometry.computeLineDistances();this.targetLine.geometry.verticesNeedUpdate=true}};THREE.ImmediateRenderObject=function(){THREE.Object3D.call(this);this.render=function(renderCallback){}};THREE.ImmediateRenderObject.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare=function(texture,size,distance,blending,color){THREE.Object3D.call(this);this.lensFlares=[];this.positionScreen=new THREE.Vector3;this.customUpdateCallback=undefined;if(texture!==undefined){this.add(texture,size,distance,blending,color)}};THREE.LensFlare.prototype=Object.create(THREE.Object3D.prototype);THREE.LensFlare.prototype.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 THREE.Color(16777215);if(blending===undefined)blending=THREE.NormalBlending;distance=Math.min(distance,Math.max(0,distance));this.lensFlares.push({texture:texture,size:size,distance:distance,x:0,y:0,z:0,scale:1,rotation:1,opacity:opacity,color:color,blending:blending})};THREE.LensFlare.prototype.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*.25;flare.rotation+=(flare.wantedRotation-flare.rotation)*.25}};THREE.MorphBlendMesh=function(geometry,material){THREE.Mesh.call(this,geometry,material);this.animationsMap={};this.animationsList=[];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)};THREE.MorphBlendMesh.prototype=Object.create(THREE.Mesh.prototype);THREE.MorphBlendMesh.prototype.createAnimation=function(name,start,end,fps){var animation={startFrame:start,endFrame: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)};THREE.MorphBlendMesh.prototype.autoCreateAnimations=function(fps){var pattern=/([a-z]+)(\d+)/;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];var num=chunks[2];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};THREE.MorphBlendMesh.prototype.setAnimationDirectionForward=function(name){var animation=this.animationsMap[name];if(animation){animation.direction=1;animation.directionBackwards=false}};THREE.MorphBlendMesh.prototype.setAnimationDirectionBackward=function(name){var animation=this.animationsMap[name];if(animation){animation.direction=-1;animation.directionBackwards=true}};THREE.MorphBlendMesh.prototype.setAnimationFPS=function(name,fps){var animation=this.animationsMap[name];if(animation){animation.fps=fps;animation.duration=(animation.end-animation.start)/animation.fps}};THREE.MorphBlendMesh.prototype.setAnimationDuration=function(name,duration){var animation=this.animationsMap[name];if(animation){animation.duration=duration;animation.fps=(animation.end-animation.start)/animation.duration}};THREE.MorphBlendMesh.prototype.setAnimationWeight=function(name,weight){var animation=this.animationsMap[name];if(animation){animation.weight=weight}};THREE.MorphBlendMesh.prototype.setAnimationTime=function(name,time){var animation=this.animationsMap[name];if(animation){animation.time=time}};THREE.MorphBlendMesh.prototype.getAnimationTime=function(name){var time=0;var animation=this.animationsMap[name];if(animation){time=animation.time}return time};THREE.MorphBlendMesh.prototype.getAnimationDuration=function(name){var duration=-1;var animation=this.animationsMap[name];if(animation){duration=animation.duration}return duration};THREE.MorphBlendMesh.prototype.playAnimation=function(name){var animation=this.animationsMap[name];if(animation){animation.time=0;animation.active=true}else{console.warn("animation["+name+"] undefined")}};THREE.MorphBlendMesh.prototype.stopAnimation=function(name){var animation=this.animationsMap[name];if(animation){animation.active=false}};THREE.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.startFrame+THREE.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;this.morphTargetInfluences[animation.currentFrame]=mix*weight;this.morphTargetInfluences[animation.lastFrame]=(1-mix)*weight}};THREE.LensFlarePlugin=function(){var _gl,_renderer,_precision,_lensFlare={};this.init=function(renderer){_gl=renderer.context;_renderer=renderer;_precision=renderer.getPrecision();_lensFlare.vertices=new Float32Array(8+8);_lensFlare.faces=new Uint16Array(6);var i=0;_lensFlare.vertices[i++]=-1;_lensFlare.vertices[i++]=-1;_lensFlare.vertices[i++]=0;_lensFlare.vertices[i++]=0;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=-1;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=0;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=-1;_lensFlare.vertices[i++]=1;_lensFlare.vertices[i++]=0;_lensFlare.vertices[i++]=1;i=0;_lensFlare.faces[i++]=0;_lensFlare.faces[i++]=1;_lensFlare.faces[i++]=2;_lensFlare.faces[i++]=0;_lensFlare.faces[i++]=2;_lensFlare.faces[i++]=3;_lensFlare.vertexBuffer=_gl.createBuffer();_lensFlare.elementBuffer=_gl.createBuffer();_gl.bindBuffer(_gl.ARRAY_BUFFER,_lensFlare.vertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,_lensFlare.vertices,_gl.STATIC_DRAW);_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,_lensFlare.elementBuffer);_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER,_lensFlare.faces,_gl.STATIC_DRAW);_lensFlare.tempTexture=_gl.createTexture();_lensFlare.occlusionTexture=_gl.createTexture();_gl.bindTexture(_gl.TEXTURE_2D,_lensFlare.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);_gl.bindTexture(_gl.TEXTURE_2D,_lensFlare.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);if(_gl.getParameter(_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS)<=0){_lensFlare.hasVertexTexture=false;_lensFlare.program=createProgram(THREE.ShaderFlares["lensFlare"],_precision)}else{_lensFlare.hasVertexTexture=true;_lensFlare.program=createProgram(THREE.ShaderFlares["lensFlareVertexTexture"],_precision)}_lensFlare.attributes={};_lensFlare.uniforms={};_lensFlare.attributes.vertex=_gl.getAttribLocation(_lensFlare.program,"position");_lensFlare.attributes.uv=_gl.getAttribLocation(_lensFlare.program,"uv");_lensFlare.uniforms.renderType=_gl.getUniformLocation(_lensFlare.program,"renderType");_lensFlare.uniforms.map=_gl.getUniformLocation(_lensFlare.program,"map");_lensFlare.uniforms.occlusionMap=_gl.getUniformLocation(_lensFlare.program,"occlusionMap");_lensFlare.uniforms.opacity=_gl.getUniformLocation(_lensFlare.program,"opacity");_lensFlare.uniforms.color=_gl.getUniformLocation(_lensFlare.program,"color");_lensFlare.uniforms.scale=_gl.getUniformLocation(_lensFlare.program,"scale");_lensFlare.uniforms.rotation=_gl.getUniformLocation(_lensFlare.program,"rotation");_lensFlare.uniforms.screenPosition=_gl.getUniformLocation(_lensFlare.program,"screenPosition")};this.render=function(scene,camera,viewportWidth,viewportHeight){var flares=scene.__webglFlares,nFlares=flares.length;if(!nFlares)return;var tempPosition=new THREE.Vector3;var invAspect=viewportHeight/viewportWidth,halfViewportWidth=viewportWidth*.5,halfViewportHeight=viewportHeight*.5;var size=16/viewportHeight,scale=new THREE.Vector2(size*invAspect,size);var screenPosition=new THREE.Vector3(1,1,0),screenPositionPixels=new THREE.Vector2(1,1);var uniforms=_lensFlare.uniforms,attributes=_lensFlare.attributes;_gl.useProgram(_lensFlare.program);_gl.enableVertexAttribArray(_lensFlare.attributes.vertex);_gl.enableVertexAttribArray(_lensFlare.attributes.uv);_gl.uniform1i(uniforms.occlusionMap,0);_gl.uniform1i(uniforms.map,1);_gl.bindBuffer(_gl.ARRAY_BUFFER,_lensFlare.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,_lensFlare.elementBuffer);_gl.disable(_gl.CULL_FACE);_gl.depthMask(false);var i,j,jl,flare,sprite;for(i=0;i<nFlares;i++){size=16/viewportHeight;scale.set(size*invAspect,size);flare=flares[i];tempPosition.set(flare.matrixWorld.elements[12],flare.matrixWorld.elements[13],flare.matrixWorld.elements[14]);tempPosition.applyMatrix4(camera.matrixWorldInverse);tempPosition.applyProjection(camera.projectionMatrix);screenPosition.copy(tempPosition);screenPositionPixels.x=screenPosition.x*halfViewportWidth+halfViewportWidth;screenPositionPixels.y=screenPosition.y*halfViewportHeight+halfViewportHeight;if(_lensFlare.hasVertexTexture||screenPositionPixels.x>0&&screenPositionPixels.x<viewportWidth&&screenPositionPixels.y>0&&screenPositionPixels.y<viewportHeight){_gl.activeTexture(_gl.TEXTURE1);_gl.bindTexture(_gl.TEXTURE_2D,_lensFlare.tempTexture);_gl.copyTexImage2D(_gl.TEXTURE_2D,0,_gl.RGB,screenPositionPixels.x-8,screenPositionPixels.y-8,16,16,0);_gl.uniform1i(uniforms.renderType,0);_gl.uniform2f(uniforms.scale,scale.x,scale.y);_gl.uniform3f(uniforms.screenPosition,screenPosition.x,screenPosition.y,screenPosition.z);_gl.disable(_gl.BLEND);_gl.enable(_gl.DEPTH_TEST);_gl.drawElements(_gl.TRIANGLES,6,_gl.UNSIGNED_SHORT,0);_gl.activeTexture(_gl.TEXTURE0);_gl.bindTexture(_gl.TEXTURE_2D,_lensFlare.occlusionTexture);_gl.copyTexImage2D(_gl.TEXTURE_2D,0,_gl.RGBA,screenPositionPixels.x-8,screenPositionPixels.y-8,16,16,0);_gl.uniform1i(uniforms.renderType,1);_gl.disable(_gl.DEPTH_TEST);_gl.activeTexture(_gl.TEXTURE1);_gl.bindTexture(_gl.TEXTURE_2D,_lensFlare.tempTexture);_gl.drawElements(_gl.TRIANGLES,6,_gl.UNSIGNED_SHORT,0);flare.positionScreen.copy(screenPosition);if(flare.customUpdateCallback){flare.customUpdateCallback(flare)}else{flare.updateLensFlares()}_gl.uniform1i(uniforms.renderType,2);_gl.enable(_gl.BLEND);for(j=0,jl=flare.lensFlares.length;j<jl;j++){sprite=flare.lensFlares[j];if(sprite.opacity>.001&&sprite.scale>.001){screenPosition.x=sprite.x;screenPosition.y=sprite.y;screenPosition.z=sprite.z;size=sprite.size*sprite.scale/viewportHeight;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);_renderer.setBlending(sprite.blending,sprite.blendEquation,sprite.blendSrc,sprite.blendDst);_renderer.setTexture(sprite.texture,1);_gl.drawElements(_gl.TRIANGLES,6,_gl.UNSIGNED_SHORT,0)}}}}_gl.enable(_gl.CULL_FACE);_gl.enable(_gl.DEPTH_TEST);_gl.depthMask(true)};function createProgram(shader,precision){var program=_gl.createProgram();var fragmentShader=_gl.createShader(_gl.FRAGMENT_SHADER);var vertexShader=_gl.createShader(_gl.VERTEX_SHADER);var prefix="precision "+precision+" 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}};THREE.ShadowMapPlugin=function(){var _gl,_renderer,_depthMaterial,_depthMaterialMorph,_depthMaterialSkin,_depthMaterialMorphSkin,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4,_min=new THREE.Vector3,_max=new THREE.Vector3,_matrixPosition=new THREE.Vector3;this.init=function(renderer){_gl=renderer.context;_renderer=renderer;var depthShader=THREE.ShaderLib["depthRGBA"];var depthUniforms=THREE.UniformsUtils.clone(depthShader.uniforms);_depthMaterial=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms});_depthMaterialMorph=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,morphTargets:true});_depthMaterialSkin=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,skinning:true});_depthMaterialMorphSkin=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,morphTargets:true,skinning:true});_depthMaterial._shadowPass=true;_depthMaterialMorph._shadowPass=true;_depthMaterialSkin._shadowPass=true;_depthMaterialMorphSkin._shadowPass=true};this.render=function(scene,camera){if(!(_renderer.shadowMapEnabled&&_renderer.shadowMapAutoUpdate))return;this.update(scene,camera)};this.update=function(scene,camera){var i,il,j,jl,n,shadowMap,shadowMatrix,shadowCamera,program,buffer,material,webglObject,object,light,renderList,lights=[],k=0,fog=null;_gl.clearColor(1,1,1,1);_gl.disable(_gl.BLEND);_gl.enable(_gl.CULL_FACE);_gl.frontFace(_gl.CCW);if(_renderer.shadowMapCullFace===THREE.CullFaceFront){_gl.cullFace(_gl.FRONT)}else{_gl.cullFace(_gl.BACK)}_renderer.setDepthTest(true);for(i=0,il=scene.__lights.length;i<il;i++){light=scene.__lights[i];if(!light.castShadow)continue;if(light instanceof THREE.DirectionalLight&&light.shadowCascade){for(n=0;n<light.shadowCascadeCount;n++){var virtualLight;if(!light.shadowCascadeArray[n]){virtualLight=createVirtualLight(light,n);virtualLight.originalCamera=camera;var gyro=new THREE.Gyroscope;gyro.position=light.shadowCascadeOffset;gyro.add(virtualLight);gyro.add(virtualLight.target);camera.add(gyro);light.shadowCascadeArray[n]=virtualLight;console.log("Created virtualLight",virtualLight)}else{virtualLight=light.shadowCascadeArray[n]}updateVirtualLight(light,n);lights[k]=virtualLight;k++}}else{lights[k]=light;k++}}for(i=0,il=lights.length;i<il;i++){light=lights[i];if(!light.shadowMap){var shadowFilter=THREE.LinearFilter;if(_renderer.shadowMapType===THREE.PCFSoftShadowMap){shadowFilter=THREE.NearestFilter}var pars={minFilter:shadowFilter,magFilter:shadowFilter,format:THREE.RGBAFormat};light.shadowMap=new THREE.WebGLRenderTarget(light.shadowMapWidth,light.shadowMapHeight,pars);light.shadowMapSize=new THREE.Vector2(light.shadowMapWidth,light.shadowMapHeight);light.shadowMatrix=new THREE.Matrix4}if(!light.shadowCamera){if(light instanceof THREE.SpotLight){light.shadowCamera=new THREE.PerspectiveCamera(light.shadowCameraFov,light.shadowMapWidth/light.shadowMapHeight,light.shadowCameraNear,light.shadowCameraFar)}else if(light instanceof THREE.DirectionalLight){light.shadowCamera=new THREE.OrthographicCamera(light.shadowCameraLeft,light.shadowCameraRight,light.shadowCameraTop,light.shadowCameraBottom,light.shadowCameraNear,light.shadowCameraFar)}else{console.error("Unsupported light type for shadow");continue}scene.add(light.shadowCamera);if(_renderer.autoUpdateScene)scene.updateMatrixWorld()}if(light.shadowCameraVisible&&!light.cameraHelper){light.cameraHelper=new THREE.CameraHelper(light.shadowCamera);light.shadowCamera.add(light.cameraHelper)}if(light.isVirtual&&virtualLight.originalCamera==camera){updateShadowCamera(camera,light)}shadowMap=light.shadowMap;shadowMatrix=light.shadowMatrix;shadowCamera=light.shadowCamera;shadowCamera.position.getPositionFromMatrix(light.matrixWorld);_matrixPosition.getPositionFromMatrix(light.target.matrixWorld);shadowCamera.lookAt(_matrixPosition);shadowCamera.updateMatrixWorld();shadowCamera.matrixWorldInverse.getInverse(shadowCamera.matrixWorld);if(light.cameraHelper)light.cameraHelper.visible=light.shadowCameraVisible;if(light.shadowCameraVisible)light.cameraHelper.update();shadowMatrix.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1);shadowMatrix.multiply(shadowCamera.projectionMatrix);shadowMatrix.multiply(shadowCamera.matrixWorldInverse);_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix,shadowCamera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);_renderer.setRenderTarget(shadowMap);_renderer.clear();renderList=scene.__webglObjects;for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];object=webglObject.object;webglObject.render=false;if(object.visible&&object.castShadow){if(!(object instanceof THREE.Mesh||object instanceof THREE.ParticleSystem)||!object.frustumCulled||_frustum.intersectsObject(object)){object._modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);webglObject.render=true}}}var objectMaterial,useMorphing,useSkinning;for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];if(webglObject.render){object=webglObject.object;buffer=webglObject.buffer;objectMaterial=getObjectMaterial(object);useMorphing=object.geometry.morphTargets.length>0&&objectMaterial.morphTargets;useSkinning=object instanceof THREE.SkinnedMesh&&objectMaterial.skinning;if(object.customDepthMaterial){material=object.customDepthMaterial}else if(useSkinning){material=useMorphing?_depthMaterialMorphSkin:_depthMaterialSkin}else if(useMorphing){material=_depthMaterialMorph}else{material=_depthMaterial}if(buffer instanceof THREE.BufferGeometry){_renderer.renderBufferDirect(shadowCamera,scene.__lights,fog,material,buffer,object)}else{_renderer.renderBuffer(shadowCamera,scene.__lights,fog,material,buffer,object)}}}renderList=scene.__webglObjectsImmediate;for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];object=webglObject.object;if(object.visible&&object.castShadow){object._modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);_renderer.renderImmediateObject(shadowCamera,scene.__lights,fog,_depthMaterial,object)}}}var clearColor=_renderer.getClearColor(),clearAlpha=_renderer.getClearAlpha();_gl.clearColor(clearColor.r,clearColor.g,clearColor.b,clearAlpha);_gl.enable(_gl.BLEND);if(_renderer.shadowMapCullFace===THREE.CullFaceFront){_gl.cullFace(_gl.BACK)}};function createVirtualLight(light,cascade){var virtualLight=new THREE.DirectionalLight;virtualLight.isVirtual=true;virtualLight.onlyShadow=true;virtualLight.castShadow=true;virtualLight.shadowCameraNear=light.shadowCameraNear;virtualLight.shadowCameraFar=light.shadowCameraFar;virtualLight.shadowCameraLeft=light.shadowCameraLeft;virtualLight.shadowCameraRight=light.shadowCameraRight;virtualLight.shadowCameraBottom=light.shadowCameraBottom;virtualLight.shadowCameraTop=light.shadowCameraTop;virtualLight.shadowCameraVisible=light.shadowCameraVisible;virtualLight.shadowDarkness=light.shadowDarkness;virtualLight.shadowBias=light.shadowCascadeBias[cascade];virtualLight.shadowMapWidth=light.shadowCascadeWidth[cascade];virtualLight.shadowMapHeight=light.shadowCascadeHeight[cascade];virtualLight.pointsWorld=[];virtualLight.pointsFrustum=[];var pointsWorld=virtualLight.pointsWorld,pointsFrustum=virtualLight.pointsFrustum;for(var i=0;i<8;i++){pointsWorld[i]=new THREE.Vector3;pointsFrustum[i]=new THREE.Vector3}var nearZ=light.shadowCascadeNearZ[cascade];var farZ=light.shadowCascadeFarZ[cascade];pointsFrustum[0].set(-1,-1,nearZ);pointsFrustum[1].set(1,-1,nearZ);pointsFrustum[2].set(-1,1,nearZ);pointsFrustum[3].set(1,1,nearZ);pointsFrustum[4].set(-1,-1,farZ);pointsFrustum[5].set(1,-1,farZ);pointsFrustum[6].set(-1,1,farZ);pointsFrustum[7].set(1,1,farZ);return virtualLight}function updateVirtualLight(light,cascade){var virtualLight=light.shadowCascadeArray[cascade];virtualLight.position.copy(light.position);virtualLight.target.position.copy(light.target.position);virtualLight.lookAt(virtualLight.target);virtualLight.shadowCameraVisible=light.shadowCameraVisible;virtualLight.shadowDarkness=light.shadowDarkness;virtualLight.shadowBias=light.shadowCascadeBias[cascade];var nearZ=light.shadowCascadeNearZ[cascade];var farZ=light.shadowCascadeFarZ[cascade];var pointsFrustum=virtualLight.pointsFrustum;pointsFrustum[0].z=nearZ;pointsFrustum[1].z=nearZ;pointsFrustum[2].z=nearZ;pointsFrustum[3].z=nearZ;pointsFrustum[4].z=farZ;pointsFrustum[5].z=farZ;pointsFrustum[6].z=farZ;pointsFrustum[7].z=farZ}function updateShadowCamera(camera,light){var shadowCamera=light.shadowCamera,pointsFrustum=light.pointsFrustum,pointsWorld=light.pointsWorld;_min.set(Infinity,Infinity,Infinity);_max.set(-Infinity,-Infinity,-Infinity);for(var i=0;i<8;i++){var p=pointsWorld[i];p.copy(pointsFrustum[i]);THREE.ShadowMapPlugin.__projector.unprojectVector(p,camera);p.applyMatrix4(shadowCamera.matrixWorldInverse);if(p.x<_min.x)_min.x=p.x;if(p.x>_max.x)_max.x=p.x;if(p.y<_min.y)_min.y=p.y;if(p.y>_max.y)_max.y=p.y;if(p.z<_min.z)_min.z=p.z;if(p.z>_max.z)_max.z=p.z}shadowCamera.left=_min.x;shadowCamera.right=_max.x;shadowCamera.top=_max.y;shadowCamera.bottom=_min.y;shadowCamera.updateProjectionMatrix()}function getObjectMaterial(object){return object.material instanceof THREE.MeshFaceMaterial?object.material.materials[0]:object.material}};THREE.ShadowMapPlugin.__projector=new THREE.Projector;THREE.SpritePlugin=function(){var _gl,_renderer,_precision,_sprite={};this.init=function(renderer){_gl=renderer.context;_renderer=renderer;_precision=renderer.getPrecision();_sprite.vertices=new Float32Array(8+8);_sprite.faces=new Uint16Array(6);var i=0;_sprite.vertices[i++]=-1;_sprite.vertices[i++]=-1;_sprite.vertices[i++]=0;_sprite.vertices[i++]=0;_sprite.vertices[i++]=1;_sprite.vertices[i++]=-1;_sprite.vertices[i++]=1;_sprite.vertices[i++]=0;_sprite.vertices[i++]=1;_sprite.vertices[i++]=1;_sprite.vertices[i++]=1;_sprite.vertices[i++]=1;_sprite.vertices[i++]=-1;_sprite.vertices[i++]=1;_sprite.vertices[i++]=0;_sprite.vertices[i++]=1;i=0;_sprite.faces[i++]=0;_sprite.faces[i++]=1;_sprite.faces[i++]=2;_sprite.faces[i++]=0;_sprite.faces[i++]=2;_sprite.faces[i++]=3;_sprite.vertexBuffer=_gl.createBuffer();_sprite.elementBuffer=_gl.createBuffer();_gl.bindBuffer(_gl.ARRAY_BUFFER,_sprite.vertexBuffer);_gl.bufferData(_gl.ARRAY_BUFFER,_sprite.vertices,_gl.STATIC_DRAW);_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,_sprite.elementBuffer);_gl.bufferData(_gl.ELEMENT_ARRAY_BUFFER,_sprite.faces,_gl.STATIC_DRAW);_sprite.program=createProgram(THREE.ShaderSprite["sprite"],_precision);_sprite.attributes={};_sprite.uniforms={};_sprite.attributes.position=_gl.getAttribLocation(_sprite.program,"position");_sprite.attributes.uv=_gl.getAttribLocation(_sprite.program,"uv");_sprite.uniforms.uvOffset=_gl.getUniformLocation(_sprite.program,"uvOffset");_sprite.uniforms.uvScale=_gl.getUniformLocation(_sprite.program,"uvScale");_sprite.uniforms.rotation=_gl.getUniformLocation(_sprite.program,"rotation");_sprite.uniforms.scale=_gl.getUniformLocation(_sprite.program,"scale");_sprite.uniforms.alignment=_gl.getUniformLocation(_sprite.program,"alignment");_sprite.uniforms.color=_gl.getUniformLocation(_sprite.program,"color");_sprite.uniforms.map=_gl.getUniformLocation(_sprite.program,"map");_sprite.uniforms.opacity=_gl.getUniformLocation(_sprite.program,"opacity");_sprite.uniforms.useScreenCoordinates=_gl.getUniformLocation(_sprite.program,"useScreenCoordinates");_sprite.uniforms.sizeAttenuation=_gl.getUniformLocation(_sprite.program,"sizeAttenuation");_sprite.uniforms.screenPosition=_gl.getUniformLocation(_sprite.program,"screenPosition");_sprite.uniforms.modelViewMatrix=_gl.getUniformLocation(_sprite.program,"modelViewMatrix");_sprite.uniforms.projectionMatrix=_gl.getUniformLocation(_sprite.program,"projectionMatrix");_sprite.uniforms.fogType=_gl.getUniformLocation(_sprite.program,"fogType");_sprite.uniforms.fogDensity=_gl.getUniformLocation(_sprite.program,"fogDensity");_sprite.uniforms.fogNear=_gl.getUniformLocation(_sprite.program,"fogNear");_sprite.uniforms.fogFar=_gl.getUniformLocation(_sprite.program,"fogFar");_sprite.uniforms.fogColor=_gl.getUniformLocation(_sprite.program,"fogColor");_sprite.uniforms.alphaTest=_gl.getUniformLocation(_sprite.program,"alphaTest")};this.render=function(scene,camera,viewportWidth,viewportHeight){var sprites=scene.__webglSprites,nSprites=sprites.length;if(!nSprites)return;var attributes=_sprite.attributes,uniforms=_sprite.uniforms;var invAspect=viewportHeight/viewportWidth;var halfViewportWidth=viewportWidth*.5,halfViewportHeight=viewportHeight*.5;_gl.useProgram(_sprite.program);_gl.enableVertexAttribArray(attributes.position);_gl.enableVertexAttribArray(attributes.uv);_gl.disable(_gl.CULL_FACE);_gl.enable(_gl.BLEND);_gl.bindBuffer(_gl.ARRAY_BUFFER,_sprite.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,_sprite.elementBuffer);_gl.uniformMatrix4fv(uniforms.projectionMatrix,false,camera.projectionMatrix.elements);_gl.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 instanceof THREE.Fog){_gl.uniform1f(uniforms.fogNear,fog.near);_gl.uniform1f(uniforms.fogFar,fog.far);_gl.uniform1i(uniforms.fogType,1);oldFogType=1;sceneFogType=1}else if(fog instanceof THREE.FogExp2){_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}var i,sprite,material,screenPosition,size,fogType,scale=[];for(i=0;i<nSprites;i++){sprite=sprites[i];material=sprite.material;if(!sprite.visible||material.opacity===0)continue;if(!material.useScreenCoordinates){sprite._modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,sprite.matrixWorld);sprite.z=-sprite._modelViewMatrix.elements[14]}else{sprite.z=-sprite.position.z}}sprites.sort(painterSortStable);for(i=0;i<nSprites;i++){sprite=sprites[i];material=sprite.material;if(!sprite.visible||material.opacity===0)continue;if(material.map&&material.map.image&&material.map.image.width){_gl.uniform1f(uniforms.alphaTest,material.alphaTest);if(material.useScreenCoordinates===true){_gl.uniform1i(uniforms.useScreenCoordinates,1);_gl.uniform3f(uniforms.screenPosition,(sprite.position.x*_renderer.devicePixelRatio-halfViewportWidth)/halfViewportWidth,(halfViewportHeight-sprite.position.y*_renderer.devicePixelRatio)/halfViewportHeight,Math.max(0,Math.min(1,sprite.position.z)));scale[0]=_renderer.devicePixelRatio;scale[1]=_renderer.devicePixelRatio}else{_gl.uniform1i(uniforms.useScreenCoordinates,0);_gl.uniform1i(uniforms.sizeAttenuation,material.sizeAttenuation?1:0);_gl.uniformMatrix4fv(uniforms.modelViewMatrix,false,sprite._modelViewMatrix.elements);scale[0]=1;scale[1]=1}if(scene.fog&&material.fog){fogType=sceneFogType}else{fogType=0}if(oldFogType!==fogType){_gl.uniform1i(uniforms.fogType,fogType);oldFogType=fogType}size=1/(material.scaleByViewport?viewportHeight:1);scale[0]*=size*invAspect*sprite.scale.x;scale[1]*=size*sprite.scale.y;_gl.uniform2f(uniforms.uvScale,material.uvScale.x,material.uvScale.y);_gl.uniform2f(uniforms.uvOffset,material.uvOffset.x,material.uvOffset.y);_gl.uniform2f(uniforms.alignment,material.alignment.x,material.alignment.y);_gl.uniform1f(uniforms.opacity,material.opacity);_gl.uniform3f(uniforms.color,material.color.r,material.color.g,material.color.b);_gl.uniform1f(uniforms.rotation,sprite.rotation);_gl.uniform2fv(uniforms.scale,scale);_renderer.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst);_renderer.setDepthTest(material.depthTest);_renderer.setDepthWrite(material.depthWrite);_renderer.setTexture(material.map,0);_gl.drawElements(_gl.TRIANGLES,6,_gl.UNSIGNED_SHORT,0)}}_gl.enable(_gl.CULL_FACE)};function createProgram(shader,precision){var program=_gl.createProgram();var fragmentShader=_gl.createShader(_gl.FRAGMENT_SHADER);var vertexShader=_gl.createShader(_gl.VERTEX_SHADER);var prefix="precision "+precision+" 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}function painterSortStable(a,b){if(a.z!==b.z){return b.z-a.z}else{return b.id-a.id}}};THREE.DepthPassPlugin=function(){this.enabled=false;this.renderTarget=null;var _gl,_renderer,_depthMaterial,_depthMaterialMorph,_depthMaterialSkin,_depthMaterialMorphSkin,_frustum=new THREE.Frustum,_projScreenMatrix=new THREE.Matrix4;this.init=function(renderer){_gl=renderer.context;_renderer=renderer;var depthShader=THREE.ShaderLib["depthRGBA"];var depthUniforms=THREE.UniformsUtils.clone(depthShader.uniforms);_depthMaterial=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms});_depthMaterialMorph=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,morphTargets:true});_depthMaterialSkin=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,skinning:true});_depthMaterialMorphSkin=new THREE.ShaderMaterial({fragmentShader:depthShader.fragmentShader,vertexShader:depthShader.vertexShader,uniforms:depthUniforms,morphTargets:true,skinning:true});_depthMaterial._shadowPass=true;_depthMaterialMorph._shadowPass=true;_depthMaterialSkin._shadowPass=true;_depthMaterialMorphSkin._shadowPass=true};this.render=function(scene,camera){if(!this.enabled)return;this.update(scene,camera)};this.update=function(scene,camera){var i,il,j,jl,n,program,buffer,material,webglObject,object,light,renderList,fog=null;_gl.clearColor(1,1,1,1);_gl.disable(_gl.BLEND);_renderer.setDepthTest(true);if(_renderer.autoUpdateScene)scene.updateMatrixWorld();camera.matrixWorldInverse.getInverse(camera.matrixWorld);_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);_renderer.setRenderTarget(this.renderTarget);_renderer.clear();renderList=scene.__webglObjects;for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];object=webglObject.object;webglObject.render=false;if(object.visible){if(!(object instanceof THREE.Mesh||object instanceof THREE.ParticleSystem)||!object.frustumCulled||_frustum.intersectsObject(object)){object._modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);webglObject.render=true}}}var objectMaterial,useMorphing,useSkinning;for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];if(webglObject.render){object=webglObject.object;buffer=webglObject.buffer;if(object instanceof THREE.ParticleSystem&&!object.customDepthMaterial)continue;objectMaterial=getObjectMaterial(object);if(objectMaterial)_renderer.setMaterialFaces(object.material);useMorphing=object.geometry.morphTargets.length>0&&objectMaterial.morphTargets;useSkinning=object instanceof THREE.SkinnedMesh&&objectMaterial.skinning;if(object.customDepthMaterial){material=object.customDepthMaterial}else if(useSkinning){material=useMorphing?_depthMaterialMorphSkin:_depthMaterialSkin}else if(useMorphing){material=_depthMaterialMorph}else{material=_depthMaterial}if(buffer instanceof THREE.BufferGeometry){_renderer.renderBufferDirect(camera,scene.__lights,fog,material,buffer,object)}else{_renderer.renderBuffer(camera,scene.__lights,fog,material,buffer,object)}}}renderList=scene.__webglObjectsImmediate;
for(j=0,jl=renderList.length;j<jl;j++){webglObject=renderList[j];object=webglObject.object;if(object.visible){object._modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);_renderer.renderImmediateObject(camera,scene.__lights,fog,_depthMaterial,object)}}var clearColor=_renderer.getClearColor(),clearAlpha=_renderer.getClearAlpha();_gl.clearColor(clearColor.r,clearColor.g,clearColor.b,clearAlpha);_gl.enable(_gl.BLEND)};function getObjectMaterial(object){return object.material instanceof THREE.MeshFaceMaterial?object.material.materials[0]:object.material}};THREE.ShaderFlares={lensFlareVertexTexture:{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 ) ) +","texture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +","texture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +","texture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +","texture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +","texture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +","texture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +","texture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +","texture2D( occlusionMap, vec2( 0.5, 0.5 ) );","vVisibility = ( visibility.r / 9.0 ) *","( 1.0 - visibility.g / 9.0 ) *","( visibility.b / 9.0 ) *","( 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() {","if( renderType == 0 ) {","gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );","} else if( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * vVisibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")},lensFlare:{vertexShader:["uniform lowp int renderType;","uniform vec3 screenPosition;","uniform vec2 scale;","uniform float rotation;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uv;","vec2 pos = position;","if( renderType == 2 ) {","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:["precision mediump float;","uniform lowp int renderType;","uniform sampler2D map;","uniform sampler2D occlusionMap;","uniform float opacity;","uniform vec3 color;","varying vec2 vUV;","void main() {","if( renderType == 0 ) {","gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );","} else if( renderType == 1 ) {","gl_FragColor = texture2D( map, vUV );","} else {","float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +","texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +","texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +","texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;","visibility = ( 1.0 - visibility / 4.0 );","vec4 texture = texture2D( map, vUV );","texture.a *= opacity * visibility;","gl_FragColor = texture;","gl_FragColor.rgb *= color;","}","}"].join("\n")}};THREE.ShaderSprite={sprite:{vertexShader:["uniform int useScreenCoordinates;","uniform int sizeAttenuation;","uniform vec3 screenPosition;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform float rotation;","uniform vec2 scale;","uniform vec2 alignment;","uniform vec2 uvOffset;","uniform vec2 uvScale;","attribute vec2 position;","attribute vec2 uv;","varying vec2 vUV;","void main() {","vUV = uvOffset + uv * uvScale;","vec2 alignedPosition = position + alignment;","vec2 rotatedPosition;","rotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;","rotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;","vec4 finalPosition;","if( useScreenCoordinates != 0 ) {","finalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );","} else {","finalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );","finalPosition.xy += rotatedPosition * ( sizeAttenuation == 1 ? 1.0 : finalPosition.z );","}","gl_Position = finalPosition;","}"].join("\n"),fragmentShader:["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;","float 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")}};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports){exports=module.exports=THREE}exports.THREE=THREE}else{this["THREE"]=THREE}}).call(this,require("_process"))},{_process:9}],48:[function(require,module,exports){function Tic(){this._things=[]}module.exports=function(){return new Tic};Tic.prototype._stack=function(thing){var self=this;self._things.push(thing);var i=self._things.length-1;return function(){delete self._things[i]}};Tic.prototype.interval=Tic.prototype.setInterval=function(fn,at){return this._stack({fn:fn,at:at,args:Array.prototype.slice.call(arguments,2),elapsed:0,once:false})};Tic.prototype.timeout=Tic.prototype.setTimeout=function(fn,at){return this._stack({fn:fn,at:at,args:Array.prototype.slice.call(arguments,2),elapsed:0,once:true})};Tic.prototype.tick=function(dt){var self=this;self._things.forEach(function(thing,i){thing.elapsed+=dt;if(thing.elapsed>thing.at){thing.elapsed-=thing.at;thing.fn.apply(thing.fn,thing.args||[]);if(thing.once){delete self._things[i]}}})}},{}],49:[function(require,module,exports){module.exports=control;var Stream=require("stream").Stream;function control(control_state,opts){return new Control(control_state,opts)}function Control(state,opts){Stream.call(this);opts=opts||{};this.state=state;this._pitch_target=this._yaw_target=this._roll_target=this._target=null;this.speed=opts.speed||.0032;this.max_speed=opts.maxSpeed||.0112;this.jump_max_speed=opts.jumpMaxSpeed||.016;this.jump_max_timer=opts.jumpTimer||200;this.jump_speed=opts.jumpSpeed||.004;this.jump_timer=this.jump_timer_max;this.jumping=false;this.acceleration=opts.accelerationCurve||this.acceleration;this.fire_rate=opts.fireRate||0;this.needs_discrete_fire=opts.discreteFire||false;this.onfire=opts.onfire||this.onfire;this.firing=0;this.x_rotation_per_ms=opts.rotationXMax||opts.rotationMax||33;this.y_rotation_per_ms=opts.rotationYMax||opts.rotationMax||33;this.z_rotation_per_ms=opts.rotationZMax||opts.rotationMax||33;this.x_rotation_clamp=opts.rotationXClamp||Math.PI/2;this.y_rotation_clamp=opts.rotationYClamp||Infinity;this.z_rotation_clamp=opts.rotationZClamp||0;this.rotation_scale=opts.rotationScale||.002;this.air_control="airControl"in opts?opts.airControl:true;this.state.x_rotation_accum=this.state.y_rotation_accum=this.state.z_rotation_accum=0;this.accel_max_timer=opts.accelTimer||200;this.x_accel_timer=this.accel_max_timer+0;this.z_accel_timer=this.accel_max_timer+0;this.readable=this.writable=true;this.buffer=[];this.paused=false}var cons=Control,proto=cons.prototype=new Stream;proto.constructor=cons;var max=Math.max,min=Math.min,sin=Math.sin,abs=Math.abs,floor=Math.floor,PI=Math.PI;proto.tick=function(dt){if(!this._target){return}var state=this.state,target=this._target,speed=this.speed,jump_speed=this.jump_speed,okay_z=abs(target.velocity.z)<this.max_speed,okay_x=abs(target.velocity.x)<this.max_speed,at_rest=target.atRestY();if(!this._target)return;if(state.forward||state.backward){this.z_accel_timer=max(0,this.z_accel_timer-dt)}if(state.backward){if(target.velocity.z<this.max_speed)target.velocity.z=max(min(this.max_speed,speed*dt*this.acceleration(this.z_accel_timer,this.accel_max_timer)),target.velocity.z)}else if(state.forward){if(target.velocity.z>-this.max_speed)target.velocity.z=min(max(-this.max_speed,-speed*dt*this.acceleration(this.z_accel_timer,this.accel_max_timer)),target.velocity.z)}else{this.z_accel_timer=this.accel_max_timer}if(state.left||state.right){this.x_accel_timer=max(0,this.x_accel_timer-dt)}if(state.right){if(target.velocity.x<this.max_speed)target.velocity.x=max(min(this.max_speed,speed*dt*this.acceleration(this.x_accel_timer,this.accel_max_timer)),target.velocity.x)}else if(state.left){if(target.velocity.x>-this.max_speed)target.velocity.x=min(max(-this.max_speed,-speed*dt*this.acceleration(this.x_accel_timer,this.accel_max_timer)),target.velocity.x)}else{this.x_accel_timer=this.accel_max_timer}if(state.jump){if(!this.jumping&&!at_rest){}else if(at_rest>0){this.jumping=false}else{this.jumping=true;if(this.jump_timer>0){target.velocity.y=min(target.velocity.y+jump_speed*min(dt,this.jump_timer),this.jump_max_speed)}this.jump_timer=max(this.jump_timer-dt,0)}}else{this.jumping=false}this.jump_timer=at_rest<0?this.jump_max_timer:this.jump_timer;var can_fire=true;if(state.fire||state.firealt){if(this.firing&&this.needs_discrete_fire){this.firing+=dt}else{if(!this.fire_rate||floor(this.firing/this.fire_rate)!==floor((this.firing+dt)/this.fire_rate)){this.onfire(state)}this.firing+=dt}}else{this.firing=0}var x_rotation=this.state.x_rotation_accum*this.rotation_scale,y_rotation=this.state.y_rotation_accum*this.rotation_scale,z_rotation=this.state.z_rotation_accum*this.rotation_scale,pitch_target=this._pitch_target,yaw_target=this._yaw_target,roll_target=this._roll_target;pitch_target.rotation.x=clamp(pitch_target.rotation.x+clamp(x_rotation,this.x_rotation_per_ms),this.x_rotation_clamp);yaw_target.rotation.y=clamp(yaw_target.rotation.y+clamp(y_rotation,this.y_rotation_per_ms),this.y_rotation_clamp);roll_target.rotation.z=clamp(roll_target.rotation.z+clamp(z_rotation,this.z_rotation_per_ms),this.z_rotation_clamp);if(this.listeners("data").length){this.emitUpdate()}this.state.x_rotation_accum=this.state.y_rotation_accum=this.state.z_rotation_accum=0};proto.write=function(changes){for(var key in changes){this.state[key]=changes[key]}};proto.end=function(deltas){if(deltas){this.write(deltas)}};proto.createWriteRotationStream=function(){var state=this.state,stream=new Stream;state.x_rotation_accum=state.y_rotation_accum=state.z_rotation_accum=0;stream.writable=true;stream.write=write;stream.end=end;return stream;function write(changes){state.x_rotation_accum-=changes.dy||0;state.y_rotation_accum-=changes.dx||0;state.z_rotation_accum+=changes.dz||0}function end(deltas){if(deltas){stream.write(deltas)}}};proto.emitUpdate=function(){return this.queue({x_rotation_accum:this.state.x_rotation_accum,y_rotation_accum:this.state.y_rotation_accum,z_rotation_accum:this.state.z_rotation_accum,forward:this.state.forward,backward:this.state.backward,left:this.state.left,right:this.state.right,fire:this.state.fire,firealt:this.state.firealt,jump:this.state.jump})};proto.drain=function(){var buf=this.buffer,data;while(buf.length&&!this.paused){data=buf.shift();if(null===data){return this.emit("end")}this.emit("data",data)}};proto.resume=function(){this.paused=false;this.drain();if(!this.paused){this.emit("drain")}return this};proto.pause=function(){if(this.paused)return;this.paused=true;this.emit("pause");return this};proto.queue=function(data){this.buffer.push(data);this.drain();return this};proto.acceleration=function(current,max){var pct=(max-current)/max;return sin(PI/2*pct)};proto.target=function(target){if(target){this._target=target;this._yaw_target=target.yaw||target;this._pitch_target=target.pitch||target;this._roll_target=target.roll||target}return this._target};proto.onfire=function(_){};function clamp(value,to){return isFinite(to)?max(min(value,to),-to):value}},{stream:21}],50:[function(require,module,exports){var THREE=require("three");module.exports=function(data,mesher,scaleFactor,three){return new Mesh(data,mesher,scaleFactor,three)};module.exports.Mesh=Mesh;function Mesh(data,mesher,scaleFactor,three){this.THREE=three||THREE;this.data=data;var geometry=this.geometry=new this.THREE.Geometry;this.scale=scaleFactor||new this.THREE.Vector3(10,10,10);var result=mesher(data.voxels,data.dims);this.meshed=result;geometry.vertices.length=0;geometry.faces.length=0;for(var i=0;i<result.vertices.length;++i){var q=result.vertices[i];geometry.vertices.push(new this.THREE.Vector3(q[0],q[1],q[2]))}for(var i=0;i<result.faces.length;++i){geometry.faceVertexUvs[0].push(this.faceVertexUv(i));var q=result.faces[i];if(q.length===5){var f=new this.THREE.Face4(q[0],q[1],q[2],q[3]);f.color=new this.THREE.Color(q[4]);geometry.faces.push(f)}else if(q.length==4){var f=new this.THREE.Face3(q[0],q[1],q[2]);f.color=new this.THREE.Color(q[3]);geometry.faces.push(f)}}geometry.computeFaceNormals();var light=new THREE.Color(16777215);var shadow=new THREE.Color(5263440);for(var i=0;i<geometry.faces.length;++i){var face=geometry.faces[i];if(face.normal.y===1)face.vertexColors=[light,light,light,light];else if(face.normal.y===-1)face.vertexColors=[shadow,shadow,shadow,shadow];else if(face.normal.x===1)face.vertexColors=[shadow,light,light,shadow];else if(face.normal.x===-1)face.vertexColors=[shadow,shadow,light,light];else if(face.normal.z===1)face.vertexColors=[shadow,shadow,light,light];else face.vertexColors=[shadow,light,light,shadow]}geometry.verticesNeedUpdate=true;geometry.elementsNeedUpdate=true;geometry.normalsNeedUpdate=true;geometry.computeBoundingBox();geometry.computeBoundingSphere()}Mesh.prototype.createWireMesh=function(hexColor){var wireMaterial=new this.THREE.MeshBasicMaterial({color:hexColor||16777215,wireframe:true});wireMesh=new THREE.Mesh(this.geometry,wireMaterial);wireMesh.scale=this.scale;wireMesh.doubleSided=true;this.wireMesh=wireMesh;return wireMesh};Mesh.prototype.createSurfaceMesh=function(material){material=material||new this.THREE.MeshNormalMaterial;var surfaceMesh=new this.THREE.Mesh(this.geometry,material);surfaceMesh.scale=this.scale;surfaceMesh.doubleSided=false;this.surfaceMesh=surfaceMesh;return surfaceMesh};Mesh.prototype.addToScene=function(scene){if(this.wireMesh)scene.add(this.wireMesh);if(this.surfaceMesh)scene.add(this.surfaceMesh)};Mesh.prototype.setPosition=function(x,y,z){if(this.wireMesh)this.wireMesh.position=new this.THREE.Vector3(x,y,z);if(this.surfaceMesh)this.surfaceMesh.position=new this.THREE.Vector3(x,y,z)};Mesh.prototype.faceVertexUv=function(i){var vs=[this.meshed.vertices[i*4+0],this.meshed.vertices[i*4+1],this.meshed.vertices[i*4+2],this.meshed.vertices[i*4+3]];var spans={x0:vs[0][0]-vs[1][0],x1:vs[1][0]-vs[2][0],y0:vs[0][1]-vs[1][1],y1:vs[1][1]-vs[2][1],z0:vs[0][2]-vs[1][2],z1:vs[1][2]-vs[2][2]};var size={x:Math.max(Math.abs(spans.x0),Math.abs(spans.x1)),y:Math.max(Math.abs(spans.y0),Math.abs(spans.y1)),z:Math.max(Math.abs(spans.z0),Math.abs(spans.z1))};if(size.x===0){if(spans.y0>spans.y1){var width=size.y;var height=size.z}else{var width=size.z;var height=size.y}}if(size.y===0){if(spans.x0>spans.x1){var width=size.x;var height=size.z}else{var width=size.z;var height=size.x}}if(size.z===0){if(spans.x0>spans.x1){var width=size.x;var height=size.y}else{var width=size.y;var height=size.x}}if(size.z===0&&spans.x0<spans.x1||size.x===0&&spans.y0>spans.y1){return[new this.THREE.Vector2(height,0),new this.THREE.Vector2(0,0),new this.THREE.Vector2(0,width),new this.THREE.Vector2(height,width)]}else{return[new this.THREE.Vector2(0,0),new this.THREE.Vector2(0,height),new this.THREE.Vector2(width,height),new this.THREE.Vector2(width,0)]}}},{three:47}],51:[function(require,module,exports){module.exports=physical;var aabb=require("aabb-3d"),THREE=require("three");function physical(avatar,collidables,dimensions,terminal){return new Physical(avatar,collidables,dimensions,terminal)}function Physical(avatar,collidables,dimensions,terminal){this.avatar=avatar;this.terminal=terminal||new THREE.Vector3(.9,.1,.9);this.dimensions=dimensions=dimensions||[1,1,1];this._aabb=aabb([0,0,0],dimensions);this.resting={x:false,y:false,z:false};this.collidables=collidables;this.friction=new THREE.Vector3(1,1,1);this.rotation=this.avatar.rotation;this.default_friction=1;this.yaw=this.pitch=this.roll=avatar;this.forces=new THREE.Vector3(0,0,0);this.attractors=[];this.acceleration=new THREE.Vector3(0,0,0);this.velocity=new THREE.Vector3(0,0,0)}var cons=Physical,proto=cons.prototype,axes=["x","y","z"],abs=Math.abs;var WORLD_DESIRED=new THREE.Vector3(0,0,0),DESIRED=new THREE.Vector3(0,0,0),START=new THREE.Vector3(0,0,0),END=new THREE.Vector3(0,0,0),DIRECTION=new THREE.Vector3,LOCAL_ATTRACTOR=new THREE.Vector3,TOTAL_FORCES=new THREE.Vector3;proto.applyWorldAcceleration=applyTo("acceleration");proto.applyWorldVelocity=applyTo("velocity");function applyTo(which){return function(world){var local=this.avatar.worldToLocal(world);this[which].x+=local.x;this[which].y+=local.y;this[which].z+=local.z}}proto.tick=function(dt){var forces=this.forces,acceleration=this.acceleration,velocity=this.velocity,terminal=this.terminal,friction=this.friction,desired=DESIRED,world_desired=WORLD_DESIRED,bbox,pcs;TOTAL_FORCES.multiplyScalar(0);desired.x=desired.y=desired.z=world_desired.x=world_desired.y=world_desired.z=0;for(var i=0;i<this.attractors.length;i++){var distance_factor=this.avatar.position.distanceToSquared(this.attractors[i]);LOCAL_ATTRACTOR.copy(this.attractors[i]);LOCAL_ATTRACTOR=this.avatar.worldToLocal(LOCAL_ATTRACTOR);DIRECTION.sub(LOCAL_ATTRACTOR,this.avatar.position);DIRECTION.divideScalar(DIRECTION.length()*distance_factor);DIRECTION.multiplyScalar(this.attractors[i].mass);TOTAL_FORCES.addSelf(DIRECTION)}if(!this.resting.x){acceleration.x/=8*dt;acceleration.x+=TOTAL_FORCES.x*dt;acceleration.x+=forces.x*dt;velocity.x+=acceleration.x*dt;velocity.x*=friction.x;if(abs(velocity.x)<terminal.x){desired.x=velocity.x*dt}else if(velocity.x!==0){desired.x=velocity.x/abs(velocity.x)*terminal.x}}else{acceleration.x=velocity.x=0}if(!this.resting.y){acceleration.y/=8*dt;acceleration.y+=TOTAL_FORCES.y*dt;acceleration.y+=forces.y*dt;velocity.y+=acceleration.y*dt;velocity.y*=friction.y;if(abs(velocity.y)<terminal.y){desired.y=velocity.y*dt}else if(velocity.y!==0){desired.y=velocity.y/abs(velocity.y)*terminal.y}}else{acceleration.y=velocity.y=0}if(!this.resting.z){acceleration.z/=8*dt;acceleration.z+=TOTAL_FORCES.z*dt;acceleration.z+=forces.z*dt;velocity.z+=acceleration.z*dt;velocity.z*=friction.z;if(abs(velocity.z)<terminal.z){desired.z=velocity.z*dt}else if(velocity.z!==0){desired.z=velocity.z/abs(velocity.z)*terminal.z}}else{acceleration.z=velocity.z=0}START.copy(this.avatar.position);this.avatar.translateX(desired.x);this.avatar.translateY(desired.y);this.avatar.translateZ(desired.z);END.copy(this.avatar.position);this.avatar.position.copy(START);world_desired.x=END.x-START.x;world_desired.y=END.y-START.y;world_desired.z=END.z-START.z;this.friction.x=this.friction.y=this.friction.z=this.default_friction;this.resting.x=this.resting.y=this.resting.z=false;bbox=this.aabb();pcs=this.collidables;for(var i=0,len=pcs.length;i<len;++i){if(pcs[i]!==this){pcs[i].collide(this,bbox,world_desired,this.resting)}}this.avatar.position.x+=world_desired.x;this.avatar.position.y+=world_desired.y;this.avatar.position.z+=world_desired.z};proto.subjectTo=function(force){this.forces.x+=force[0];this.forces.y+=force[1];this.forces.z+=force[2];return this};proto.removeForce=function(force){this.forces.x-=force[0];this.forces.y-=force[1];this.forces.z-=force[2];return this};proto.attractTo=function(vector,mass){vector.mass=mass;this.attractors.push(vector)};proto.aabb=function(){var pos=this.avatar.position;var d=this.dimensions;return aabb([pos.x-d[0]/2,pos.y,pos.z-d[2]/2],this.dimensions)};proto.collide=function(other,bbox,world_vec,resting){return};proto.atRestX=function(){return this.resting.x};proto.atRestY=function(){return this.resting.y};proto.atRestZ=function(){return this.resting.z}},{"aabb-3d":25,three:47}],52:[function(require,module,exports){"use strict";function traceRay_impl(voxels,px,py,pz,dx,dy,dz,max_d,hit_pos,hit_norm,EPSILON){var t=0,nx=0,ny=0,nz=0,ix,iy,iz,fx,fy,fz,ox,oy,oz,ex,ey,ez,b,step,min_step,floor=Math.floor;while(t<=max_d){ox=px+t*dx;oy=py+t*dy;oz=pz+t*dz;ix=floor(ox)|0;iy=floor(oy)|0;iz=floor(oz)|0;fx=ox-ix;fy=oy-iy;fz=oz-iz;b=voxels.getBlock(ix,iy,iz);if(b){if(hit_pos){hit_pos[0]=fx<EPSILON?+ix:fx>1-EPSILON?ix+1-EPSILON:ox;hit_pos[1]=fy<EPSILON?+iy:fy>1-EPSILON?iy+1-EPSILON:oy;hit_pos[2]=fz<EPSILON?+iz:fz>1-EPSILON?iz+1-EPSILON:oz}if(hit_norm){hit_norm[0]=nx;hit_norm[1]=ny;hit_norm[2]=nz}return b}min_step=+(EPSILON*(1+t));if(t>min_step){ex=nx<0?fx<=min_step:fx>=1-min_step;ey=ny<0?fy<=min_step:fy>=1-min_step;ez=nz<0?fz<=min_step:fz>=1-min_step;if(ex&&ey&&ez){b=voxels.getBlock(ix+nx,iy+ny,iz)||voxels.getBlock(ix,iy+ny,iz+nz)||voxels.getBlock(ix+nx,iy,iz+nz);if(b){if(hit_pos){hit_pos[0]=nx<0?ix-EPSILON:ix+1-EPSILON;hit_pos[1]=ny<0?iy-EPSILON:iy+1-EPSILON;hit_pos[2]=nz<0?iz-EPSILON:iz+1-EPSILON}if(hit_norm){hit_norm[0]=nx;hit_norm[1]=ny;hit_norm[2]=nz}return b}}if(ex&&(ey||ez)){b=voxels.getBlock(ix+nx,iy,iz);if(b){if(hit_pos){hit_pos[0]=nx<0?ix-EPSILON:ix+1-EPSILON;hit_pos[1]=fy<EPSILON?+iy:oy;hit_pos[2]=fz<EPSILON?+iz:oz}if(hit_norm){hit_norm[0]=nx;hit_norm[1]=ny;hit_norm[2]=nz}return b}}if(ey&&(ex||ez)){b=voxels.getBlock(ix,iy+ny,iz);if(b){if(hit_pos){hit_pos[0]=fx<EPSILON?+ix:ox;hit_pos[1]=ny<0?iy-EPSILON:iy+1-EPSILON;hit_pos[2]=fz<EPSILON?+iz:oz}if(hit_norm){hit_norm[0]=nx;hit_norm[1]=ny;hit_norm[2]=nz}return b}}if(ez&&(ex||ey)){b=voxels.getBlock(ix,iy,iz+nz);if(b){if(hit_pos){hit_pos[0]=fx<EPSILON?+ix:ox;hit_pos[1]=fy<EPSILON?+iy:oy;hit_pos[2]=nz<0?iz-EPSILON:iz+1-EPSILON}if(hit_norm){hit_norm[0]=nx;hit_norm[1]=ny;hit_norm[2]=nz}return b}}}nx=ny=nz=0;step=2;if(dx<-EPSILON){var s=-fx/dx;nx=1;step=s}if(dx>EPSILON){var s=(1-fx)/dx;nx=-1;step=s}if(dy<-EPSILON){var s=-fy/dy;if(s<step-min_step){nx=0;ny=1;step=s}else if(s<step+min_step){ny=1}}if(dy>EPSILON){var s=(1-fy)/dy;if(s<step-min_step){nx=0;ny=-1;step=s}else if(s<step+min_step){ny=-1}}if(dz<-EPSILON){var s=-fz/dz;if(s<step-min_step){nx=ny=0;nz=1;step=s}else if(s<step+min_step){nz=1}}if(dz>EPSILON){var s=(1-fz)/dz;if(s<step-min_step){nx=ny=0;nz=-1;step=s}else if(s<step+min_step){nz=-1}}if(step>max_d-t){step=max_d-t-min_step}if(step<min_step){step=min_step}t+=step}if(hit_pos){hit_pos[0]=ox;hit_pos[1]=oy;hit_pos[2]=oz}if(hit_norm){hit_norm[0]=hit_norm[1]=hit_norm[2]=0}return 0}function traceRay(voxels,origin,direction,max_d,hit_pos,hit_norm,EPSILON){var px=+origin[0],py=+origin[1],pz=+origin[2],dx=+direction[0],dy=+direction[1],dz=+direction[2],ds=Math.sqrt(dx*dx+dy*dy+dz*dz);if(typeof EPSILON==="undefined"){EPSILON=1e-8}if(ds<EPSILON){if(hit_pos){hit_pos[0]=hit_pos[1]=hit_pos[2]}if(hit_norm){hit_norm[0]=hit_norm[1]=hit_norm[2]}return 0}dx/=ds;dy/=ds;dz/=ds;if(typeof max_d==="undefined"){max_d=64}else{max_d=+max_d}return traceRay_impl(voxels,px,py,pz,dx,dy,dz,max_d,hit_pos,hit_norm,EPSILON)}module.exports=traceRay},{}],53:[function(require,module,exports){module.exports=coordinates;var aabb=require("aabb-3d");var events=require("events");function coordinates(spatial,box,regionWidth){var emitter=new events.EventEmitter;var lastRegion=[NaN,NaN,NaN];var thisRegion;if(arguments.length===2){regionWidth=box;box=aabb([-Infinity,-Infinity,-Infinity],[Infinity,Infinity,Infinity])}spatial.on("position",box,updateRegion);function updateRegion(pos){thisRegion=[Math.floor(pos[0]/regionWidth),Math.floor(pos[1]/regionWidth),Math.floor(pos[2]/regionWidth)];if(thisRegion[0]!==lastRegion[0]||thisRegion[1]!==lastRegion[1]||thisRegion[2]!==lastRegion[2]){emitter.emit("change",thisRegion)}lastRegion=thisRegion}return emitter}},{"aabb-3d":25,events:5}],54:[function(require,module,exports){var tic=require("tic")();var createAtlas=require("atlaspack");function Texture(opts){if(!(this instanceof Texture))return new Texture(opts||{});var self=this;this.game=opts.game;delete opts.game;this.THREE=this.game.THREE;this.materials=[];this.texturePath=opts.texturePath||"/textures/";this.loading=0;var useFlatColors=opts.materialFlatColor===true;delete opts.materialFlatColor;this.options=defaults(opts||{},{crossOrigin:"Anonymous",materialParams:defaults(opts.materialParams||{},{ambient:12303291}),materialType:this.THREE.MeshLambertMaterial,applyTextureParams:function(map){map.magFilter=self.THREE.NearestFilter;map.minFilter=self.THREE.LinearMipMapLinearFilter}});this.canvas=typeof document!=="undefined"?document.createElement("canvas"):{};this.canvas.width=opts.atlasWidth||512;this.canvas.height=opts.atlasHeight||512;this.atlas=createAtlas(this.canvas);this.atlas.tilepad=true;this._atlasuv=false;this._atlaskey=false;this.texture=new this.THREE.Texture(this.canvas);this.options.applyTextureParams(this.texture);if(useFlatColors){this.material=new this.THREE.MeshBasicMaterial({vertexColors:this.THREE.VertexColors})}else{this.material=new this.options.materialType(this.options.materialParams);this.material.map=this.texture;this.material.transparent=true}this._meshQueue=[]}module.exports=Texture;Texture.prototype.load=function(names,done){var self=this;if(!Array.isArray(names))names=[names];done=done||function(){};this.loading++;var materialSlice=names.map(self._expandName);self.materials=self.materials.concat(materialSlice);var load=Object.create(null);materialSlice.forEach(function(mats){mats.forEach(function(mat){if(mat.slice(0,1)==="#")return;load[mat]=true})});if(Object.keys(load).length>0){each(Object.keys(load),self.pack.bind(self),function(){self._afterLoading();done(materialSlice)})}else{self._afterLoading()}};Texture.prototype.pack=function(name,done){var self=this;function pack(img){var node=self.atlas.pack(img);if(node===false){self.atlas=self.atlas.expand(img);self.atlas.tilepad=true}done()}if(typeof name==="string"){var img=new Image;img.id=name;img.crossOrigin=self.options.crossOrigin;img.src=self.texturePath+ext(name);img.onload=function(){pack(img)};img.onerror=function(){console.error("Couldn't load URL ["+img.src+"]");done()}}else{pack(name)}return self};Texture.prototype.find=function(name){var self=this;var type=0;self.materials.forEach(function(mats,i){mats.forEach(function(mat){if(mat===name){type=i+1;return false}});if(type!==0)return false});return type};Texture.prototype._expandName=function(name){if(name===null)return Array(6);if(name.top)return[name.back,name.front,name.top,name.bottom,name.left,name.right];if(!Array.isArray(name))name=[name];if(name.length===1)name=[name[0],name[0],name[0],name[0],name[0],name[0]];if(name.length===2)name=[name[1],name[1],name[0],name[0],name[1],name[1]];if(name.length===3)name=[name[2],name[2],name[0],name[1],name[2],name[2]];if(name.length===4)name=[name[2],name[2],name[0],name[1],name[3],name[3]];return name};Texture.prototype._afterLoading=function(){var self=this;function alldone(){self.loading--;self._atlasuv=self.atlas.uv(self.canvas.width,self.canvas.height);self._atlaskey=Object.create(null);self.atlas.index().forEach(function(key){self._atlaskey[key.name]=key});self.texture.needsUpdate=true;self.material.needsUpdate=true;if(self._meshQueue.length>0){self._meshQueue.forEach(function(queue,i){self.paint.apply(queue.self,queue.args);delete self._meshQueue[i]})}}self._powerof2(function(){setTimeout(alldone,100)})};Texture.prototype._powerof2=function(done){var w=this.canvas.width;var h=this.canvas.height;function pow2(x){x--;x|=x>>1;x|=x>>2;x|=x>>4;x|=x>>8;x|=x>>16;x++;return x}if(h>w)w=h;var old=this.canvas.getContext("2d").getImageData(0,0,this.canvas.width,this.canvas.height);this.canvas.width=this.canvas.height=pow2(w);this.canvas.getContext("2d").putImageData(old,0,0);done()};Texture.prototype.paint=function(mesh,materials){var self=this;if(self.loading>0){self._meshQueue.push({self:self,args:arguments});return false}var isVoxelMesh=materials?false:true;if(!isVoxelMesh)materials=self._expandName(materials);mesh.geometry.faces.forEach(function(face,i){if(mesh.geometry.faceVertexUvs[0].length<1)return;if(isVoxelMesh){var index=Math.floor(face.color.b*255+face.color.g*255*255+face.color.r*255*255*255);materials=self.materials[index-1];if(!materials)materials=self.materials[0]}var name=materials[0]||"";if(face.normal.z===1)name=materials[1]||"";else if(face.normal.y===1)name=materials[2]||"";else if(face.normal.y===-1)name=materials[3]||"";else if(face.normal.x===-1)name=materials[4]||"";else if(face.normal.x===1)name=materials[5]||"";if(name.slice(0,1)==="#"){self.setColor(mesh.geometry.faces[i],name);return}var atlasuv=self._atlasuv[name];if(!atlasuv)return;if(isVoxelMesh){if(face.normal.z===-1||face.normal.x===1){atlasuv=uvrot(atlasuv,90)}atlasuv=uvinvert(atlasuv)}else{atlasuv=uvrot(atlasuv,-90)}for(var j=0;j<4;j++){mesh.geometry.faceVertexUvs[0][i][j].set(atlasuv[j][0],1-atlasuv[j][1])}});mesh.geometry.uvsNeedUpdate=true};Texture.prototype.sprite=function(name,w,h,cb){var self=this;if(typeof w==="function"){cb=w;w=null}if(typeof h==="function"){cb=h;h=null}w=w||16;h=h||w;self.loading++;var img=new Image;img.src=self.texturePath+ext(name);img.onerror=cb;img.onload=function(){var canvases=[];for(var x=0;x<img.width;x+=w){for(var y=0;y<img.height;y+=h){var canvas=document.createElement("canvas");canvas.width=w;canvas.height=h;canvas.name=name+"_"+x+"_"+y;canvas.getContext("2d").drawImage(img,x,y,w,h,0,0,w,h);canvases.push(canvas)}}var textures=[];each(canvases,function(canvas,next){var tex=new Image;tex.name=canvas.name;tex.src=canvas.toDataURL();tex.onload=function(){self.pack(tex,next)};tex.onerror=next;textures.push([tex.name,tex.name,tex.name,tex.name,tex.name,tex.name])},function(){self._afterLoading();delete canvases;self.materials=self.materials.concat(textures);cb(textures)})};return self};Texture.prototype.animate=function(mesh,names,delay){var self=this;delay=delay||1e3;if(!Array.isArray(names)||names.length<2)return false;var i=0;var mat=new this.options.materialType(this.options.materialParams);mat.map=this.texture;mat.transparent=true;mat.needsUpdate=true;tic.interval(function(){self.paint(mesh,names[i%names.length]);i++},delay);return mat};Texture.prototype.tick=function(dt){tic.tick(dt)};Texture.prototype.setColor=function(face,color){var rgb=hex2rgb(color);face.color.setRGB(rgb[0],rgb[1],rgb[2]);var ld=this._lightDark(color);if(face.normal.y===1)face.vertexColors=[ld[0],ld[0],ld[0],ld[0]];else if(face.normal.y===-1)face.vertexColors=[ld[1],ld[1],ld[1],ld[1]];else if(face.normal.x===1)face.vertexColors=[ld[1],ld[0],ld[0],ld[1]];else if(face.normal.x===-1)face.vertexColors=[ld[1],ld[1],ld[0],ld[0]];else if(face.normal.z===1)face.vertexColors=[ld[1],ld[1],ld[0],ld[0]];else face.vertexColors=[ld[1],ld[0],ld[0],ld[1]]};Texture.prototype._lightDark=memoize(function(color){var light=new this.THREE.Color(color);var hsl=light.getHSL();var dark=light.clone();dark.setHSL(hsl.h,hsl.s,hsl.l-.1);return[light,dark]});function uvrot(coords,deg){if(deg===0)return coords;var c=[];var i=(4-Math.ceil(deg/90))%4;for(var j=0;j<4;j++){c.push(coords[i]);if(i===3)i=0;else i++}return c}function uvinvert(coords){var c=coords.slice(0);return[c[3],c[2],c[1],c[0]]}function ext(name){return String(name).indexOf(".")!==-1?name:name+".png";
}function defaults(obj){[].slice.call(arguments,1).forEach(function(from){if(from)for(var k in from)if(obj[k]==null)obj[k]=from[k]});return obj}function each(arr,it,done){var count=0;arr.forEach(function(a){it(a,function(){count++;if(count>=arr.length)done()})})}function hex2rgb(hex){if(hex[0]==="#")hex=hex.substr(1);return[parseInt(hex.substr(0,2),16)/255,parseInt(hex.substr(2,2),16)/255,parseInt(hex.substr(4,2),16)/255]}function memoize(func){function memoized(){var cache=memoized.cache,key=arguments[0];return hasOwnProperty.call(cache,key)?cache[key]:cache[key]=func.apply(this,arguments)}memoized.cache={};return memoized}},{atlaspack:55,tic:48}],55:[function(require,module,exports){(function(global){!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.atlaspack=e()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){function Rect(x,y,w,h){this.x=x;this.y=y;this.w=w;this.h=h}Rect.prototype.fitsIn=function(outer){return outer.w>=this.w&&outer.h>=this.h};Rect.prototype.sameSizeAs=function(other){return this.w===other.w&&this.h===other.h};function Atlas(x,y,w,h){if(arguments.length===1){this.canvas=x;x=y=0;w=this.canvas.width;h=this.canvas.height}if(arguments.length===2){w=x;h=y;x=y=0}this.left=this.right=null;this.rect=new Rect(x,y,w,h);this.filled=false;this.tilepad=false;this._cache=[];this._uvcache=Object.create(null)}module.exports=function(){if(arguments.length===1){return new Atlas(arguments[0])}if(arguments.length===2){return new Atlas(arguments[0],arguments[1])}return new Atlas(arguments[0],arguments[1],arguments[2],arguments[3])};module.exports.Atlas=Atlas;module.exports.Rect=Rect;Atlas.prototype.pack=function(rect){this._cache=[];this._uvcache=Object.create(null);rect=this._toRect(rect);if(this.img&&this.tilepad){rect=this._tilepad(rect)}if(this.left!==null){return this._ontoCanvas(this.left.pack(rect)||this.right.pack(rect))}if(this.filled||!rect.fitsIn(this.rect)){return false}if(rect.sameSizeAs(this.rect)){this.filled=true;return this._ontoCanvas(this)}if(this.rect.w-rect.w>this.rect.h-rect.h){this.left=new Atlas(this.rect.x,this.rect.y,rect.w,this.rect.h);this.right=new Atlas(this.rect.x+rect.w,this.rect.y,this.rect.w-rect.w,this.rect.h)}else{this.left=new Atlas(this.rect.x,this.rect.y,this.rect.w,rect.h);this.right=new Atlas(this.rect.x,this.rect.y+rect.h,this.rect.w,this.rect.h-rect.h)}return this._ontoCanvas(this.left.pack(rect))};Atlas.prototype.expand=function(rect){var self=this;rect=this._toRect(rect);if(this.img&&this.tilepad){rect=this._tilepad(rect)}var atlas;if(this.rect.w<this.rect.h){atlas=new Atlas(0,0,this.rect.w+rect.w,this.rect.h);atlas.right=new Atlas(this.rect.w,0,rect.w,this.rect.h);atlas.left=this}else{atlas=new Atlas(0,0,this.rect.w,this.rect.h+rect.h);atlas.right=new Atlas(0,this.rect.h,this.rect.w,rect.h);atlas.left=this}["canvas","context","img"].forEach(function(p){if(self[p]){atlas[p]=self[p];self[p]=null}});if(atlas.canvas){if(!atlas.context){atlas.context=atlas.canvas.getContext("2d")}var old=atlas.context.getImageData(0,0,atlas.canvas.width,atlas.canvas.height);atlas.canvas.width=atlas.rect.w;atlas.canvas.height=atlas.rect.h;atlas.context.putImageData(old,0,0)}return atlas.pack(rect)===false?atlas.expand(rect):atlas};Atlas.prototype.index=function(){var self=this;if(self._cache.length>0){return self._cache}(function loop(atlas){if(atlas.left!==null){loop(atlas.left);loop(atlas.right)}else if(atlas.rect.name){self._cache.push(atlas.rect)}})(self);return self._cache};Atlas.prototype.uv=function(w,h){var self=this;w=w||self.rect.w;h=h||self.rect.h;var isPad=this.tilepad;(function loop(atlas){if(atlas.left!==null){loop(atlas.left);loop(atlas.right)}else if(typeof atlas.rect.name!=="undefined"){var p=isPad?atlas.rect.w/4:0;self._uvcache[atlas.rect.name]=[[atlas.rect.x+p,atlas.rect.y+p],[atlas.rect.x+p+(atlas.rect.w-p*2),atlas.rect.y+p],[atlas.rect.x+p+(atlas.rect.w-p*2),atlas.rect.y+p+(atlas.rect.h-p*2)],[atlas.rect.x+p,atlas.rect.y+p+(atlas.rect.h-p*2)]].map(function(uv){if(uv[0]!==0){uv[0]=uv[0]/w}if(uv[1]!==0){uv[1]=uv[1]/h}return uv})}})(self);return self._uvcache};Atlas.prototype.json=function(input){var self=this;if(input){if(typeof input==="string")input=JSON.parse(input);return function loop(obj){if(!obj||!obj.rect)return;var atlas=new Atlas(obj.rect.x,obj.rect.y,obj.rect.w,obj.rect.h);if(obj.left)atlas.left=loop(obj.left);if(obj.right)atlas.right=loop(obj.right);return atlas}(input)}else{return JSON.stringify(function loop(atlas){var obj={left:null,right:null,rect:atlas.rect,filled:atlas.filled};if(atlas.left!==null){obj.left=loop(atlas.left);obj.right=loop(atlas.right)}return obj}(self),null,2)}};Atlas.prototype._tilepad=function(rect){var img=this.img;if(!img)return rect;var p=img.width/2;var canvas=document.createElement("canvas");canvas.name=img.name||img.src;canvas.id=img.id||"";canvas.width=img.width+img.width;canvas.height=img.height+img.height;var ctx=canvas.getContext("2d");var pattern=ctx.createPattern(img,"repeat");ctx.fillStyle=pattern;ctx.translate(p,p);ctx.fillRect(-p,-p,canvas.width+p,canvas.height+p);ctx.translate(-p,-p);this.img=canvas;return new Rect(rect.x,rect.y,this.img.width,this.img.height)};Atlas.prototype._ontoCanvas=function(node){if(node&&this.img&&this.canvas){if(!this.context){this.context=this.canvas.getContext("2d")}this.context.clearRect(node.rect.x,node.rect.y,node.rect.w,node.rect.h);this.context.drawImage(this.img,node.rect.x,node.rect.y,node.rect.w,node.rect.h);node.rect.name=this.img.id||this.img.name||this.img.src||null}return node};Atlas.prototype._toRect=function(rect){if(rect.nodeName&&rect.nodeName==="IMG"){this.img=rect;rect=new Rect(rect.x,rect.y,rect.width,rect.height)}if(!(rect instanceof Rect)){rect=new Rect(rect.x||0,rect.y||0,rect.w||rect.width,rect.h||rect.height)}return rect};Atlas.prototype._debug=function(){if(!this.canvas){return}var context=this.canvas.getContext("2d");this.index().forEach(function(rect){context.lineWidth=1;context.strokeStyle="red";context.strokeRect(rect.x,rect.y,rect.w,rect.h)})}},{}]},{},[1])(1)})}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],56:[function(require,module,exports){(function(process){var THREE,temporaryPosition,temporaryVector;module.exports=function(three,opts){temporaryPosition=new three.Vector3;temporaryVector=new three.Vector3;return new View(three,opts)};function View(three,opts){THREE=three;this.fov=opts.fov||60;this.width=opts.width||512;this.height=opts.height||512;this.aspectRatio=opts.aspectRatio||this.width/this.height;this.nearPlane=opts.nearPlane||1;this.farPlane=opts.farPlane||1e4;this.skyColor=opts.skyColor||12571109;this.ortho=opts.ortho;this.camera=this.ortho?new THREE.OrthographicCamera(this.width/-2,this.width/2,this.height/2,this.height/-2,this.nearPlane,this.farPlane):new THREE.PerspectiveCamera(this.fov,this.aspectRatio,this.nearPlane,this.farPlane);this.camera.lookAt(new THREE.Vector3(0,0,0));if(!process.browser)return;this.createRenderer();this.element=this.renderer.domElement}View.prototype.createRenderer=function(){this.renderer=new THREE.WebGLRenderer({antialias:true});this.renderer.setSize(this.width,this.height);this.renderer.setClearColorHex(this.skyColor,1);this.renderer.clear()};View.prototype.bindToScene=function(scene){scene.add(this.camera)};View.prototype.getCamera=function(){return this.camera};View.prototype.cameraPosition=function(){temporaryPosition.multiplyScalar(0);temporaryPosition.applyMatrix4(this.camera.matrixWorld);return[temporaryPosition.x,temporaryPosition.y,temporaryPosition.z]};View.prototype.cameraVector=function(){temporaryVector.multiplyScalar(0);temporaryVector.z=-1;this.camera.matrixWorld.rotateAxis(temporaryVector);return[temporaryVector.x,temporaryVector.y,temporaryVector.z]};View.prototype.resizeWindow=function(width,height){if(this.element.parentElement){width=width||this.element.parentElement.clientWidth;height=height||this.element.parentElement.clientHeight}this.camera.aspect=this.aspectRatio=width/height;this.width=width;this.height=height;this.camera.updateProjectionMatrix();this.renderer.setSize(width,height)};View.prototype.render=function(scene){this.renderer.render(scene,this.camera)};View.prototype.appendTo=function(element){if(typeof element==="object"){element.appendChild(this.element)}else{document.querySelector(element).appendChild(this.element)}this.resizeWindow(this.width,this.height)}}).call(this,require("_process"))},{_process:9}],57:[function(require,module,exports){var events=require("events");var inherits=require("inherits");module.exports=function(opts){return new Chunker(opts)};module.exports.Chunker=Chunker;function Chunker(opts){this.distance=opts.chunkDistance||2;this.chunkSize=opts.chunkSize||32;this.cubeSize=opts.cubeSize||25;this.generateVoxelChunk=opts.generateVoxelChunk;this.chunks={};this.meshes={};if(this.chunkSize&this.chunkSize-1!==0)throw new Error("chunkSize must be a power of 2");var bits=0;for(var size=this.chunkSize;size>0;size>>=1)bits++;this.chunkBits=bits-1}inherits(Chunker,events.EventEmitter);Chunker.prototype.nearbyChunks=function(position,distance){var current=this.chunkAtPosition(position);var x=current[0];var y=current[1];var z=current[2];var dist=distance||this.distance;var nearby=[];for(var cx=x-dist;cx!==x+dist;++cx){for(var cy=y-dist;cy!==y+dist;++cy){for(var cz=z-dist;cz!==z+dist;++cz){nearby.push([cx,cy,cz])}}}return nearby};Chunker.prototype.requestMissingChunks=function(position){var self=this;this.nearbyChunks(position).map(function(chunk){if(!self.chunks[chunk.join("|")]){self.emit("missingChunk",chunk)}})};Chunker.prototype.getBounds=function(x,y,z){var bits=this.chunkBits;var low=[x<<bits,y<<bits,z<<bits];var high=[x+1<<bits,y+1<<bits,z+1<<bits];return[low,high]};Chunker.prototype.generateChunk=function(x,y,z){var self=this;var bounds=this.getBounds(x,y,z);var chunk=this.generateVoxelChunk(bounds[0],bounds[1],x,y,z);var position=[x,y,z];chunk.position=position;this.chunks[position.join("|")]=chunk;return chunk};Chunker.prototype.chunkAtCoordinates=function(x,y,z){var bits=this.chunkBits;var cx=x>>bits;var cy=y>>bits;var cz=z>>bits;var chunkPos=[cx,cy,cz];return chunkPos};Chunker.prototype.chunkAtPosition=function(position){var cubeSize=this.cubeSize;var x=Math.floor(position[0]/cubeSize);var y=Math.floor(position[1]/cubeSize);var z=Math.floor(position[2]/cubeSize);var chunkPos=this.chunkAtCoordinates(x,y,z);return chunkPos};Chunker.prototype.voxelIndexFromCoordinates=function(x,y,z){var bits=this.chunkBits;var mask=(1<<bits)-1;var vidx=(x&mask)+((y&mask)<<bits)+((z&mask)<<bits*2);return vidx};Chunker.prototype.voxelIndexFromPosition=function(pos){var v=this.voxelVector(pos);return this.voxelIndex(v)};Chunker.prototype.voxelAtCoordinates=function(x,y,z,val){var ckey=this.chunkAtCoordinates(x,y,z).join("|");var chunk=this.chunks[ckey];if(!chunk)return false;var vidx=this.voxelIndexFromCoordinates(x,y,z);var v=chunk.voxels[vidx];if(typeof val!=="undefined"){chunk.voxels[vidx]=val}return v};Chunker.prototype.voxelAtPosition=function(pos,val){var cubeSize=this.cubeSize;var x=Math.floor(pos[0]/cubeSize);var y=Math.floor(pos[1]/cubeSize);var z=Math.floor(pos[2]/cubeSize);var v=this.voxelAtCoordinates(x,y,z,val);return v};Chunker.prototype.voxelIndex=function(voxelVector){var vidx=this.voxelIndexFromCoordinates(voxelVector[0],voxelVector[1],voxelVector[2]);return vidx};Chunker.prototype.voxelVector=function(pos){var cubeSize=this.cubeSize;var mask=(1<<this.chunkBits)-1;var vx=Math.floor(pos[0]/cubeSize)&mask;var vy=Math.floor(pos[1]/cubeSize)&mask;var vz=Math.floor(pos[2]/cubeSize)&mask;return[vx,vy,vz]}},{events:5,inherits:28}],58:[function(require,module,exports){var chunker=require("./chunker");module.exports=function(opts){if(!opts.generateVoxelChunk)opts.generateVoxelChunk=function(low,high){return generate(low,high,module.exports.generator["Valley"])};return chunker(opts)};module.exports.meshers={culled:require("./meshers/culled").mesher,greedy:require("./meshers/greedy").mesher,monotone:require("./meshers/monotone").mesher,stupid:require("./meshers/stupid").mesher};module.exports.Chunker=chunker.Chunker;module.exports.geometry={};module.exports.generator={};module.exports.generate=generate;function generate(l,h,f,game){var d=[h[0]-l[0],h[1]-l[1],h[2]-l[2]];var v=new Int8Array(d[0]*d[1]*d[2]);var n=0;for(var k=l[2];k<h[2];++k)for(var j=l[1];j<h[1];++j)for(var i=l[0];i<h[0];++i,++n){v[n]=f(i,j,k,n,game)}return{voxels:v,dims:d}}module.exports.generator["Sphere"]=function(i,j,k){return i*i+j*j+k*k<=16*16?1:0};module.exports.generator["Noise"]=function(i,j,k){return Math.random()<.1?Math.random()*16777215:0};module.exports.generator["Dense Noise"]=function(i,j,k){return Math.round(Math.random()*16777215)};module.exports.generator["Checker"]=function(i,j,k){return!!(i+j+k&1)?(i^j^k)&2?1:16777215:0};module.exports.generator["Hill"]=function(i,j,k){return j<=16*Math.exp(-(i*i+k*k)/64)?1:0};module.exports.generator["Valley"]=function(i,j,k){return j<=(i*i+k*k)*31/(32*32*2)+1?1:0};module.exports.generator["Hilly Terrain"]=function(i,j,k){var h0=3*Math.sin(Math.PI*i/12-Math.PI*k*.1)+27;if(j>h0+1){return 0}if(h0<=j){return 1}var h1=2*Math.sin(Math.PI*i*.25-Math.PI*k*.3)+20;if(h1<=j){return 2}if(2<j){return Math.random()<.1?2236962:11184810}return 3};module.exports.scale=function(x,fromLow,fromHigh,toLow,toHigh){return(x-fromLow)*(toHigh-toLow)/(fromHigh-fromLow)+toLow};module.exports.generateExamples=function(){return{Sphere:generate([-16,-16,-16],[16,16,16],module.exports.generator["Sphere"]),Noise:generate([0,0,0],[16,16,16],module.exports.generator["Noise"]),"Dense Noise":generate([0,0,0],[16,16,16],module.exports.generator["Dense Noise"]),Checker:generate([0,0,0],[8,8,8],module.exports.generator["Checker"]),Hill:generate([-16,0,-16],[16,16,16],module.exports.generator["Hill"]),Valley:generate([0,0,0],[32,32,32],module.exports.generator["Valley"]),"Hilly Terrain":generate([0,0,0],[32,32,32],module.exports.generator["Hilly Terrain"])}}},{"./chunker":57,"./meshers/culled":59,"./meshers/greedy":60,"./meshers/monotone":61,"./meshers/stupid":62}],59:[function(require,module,exports){function CulledMesh(volume,dims){var dir=new Array(3);for(var i=0;i<3;++i){dir[i]=[[0,0,0],[0,0,0]];dir[i][0][(i+1)%3]=1;dir[i][1][(i+2)%3]=1}var vertices=[],faces=[],x=[0,0,0],B=[[false,true],[false,true],[false,true]],n=-dims[0]*dims[1];for(B[2]=[false,true],x[2]=-1;x[2]<dims[2];B[2]=[true,++x[2]<dims[2]-1])for(n-=dims[0],B[1]=[false,true],x[1]=-1;x[1]<dims[1];B[1]=[true,++x[1]<dims[1]-1])for(n-=1,B[0]=[false,true],x[0]=-1;x[0]<dims[0];B[0]=[true,++x[0]<dims[0]-1],++n){var p=B[0][0]&&B[1][0]&&B[2][0]?volume[n]:0,b=[B[0][1]&&B[1][0]&&B[2][0]?volume[n+1]:0,B[0][0]&&B[1][1]&&B[2][0]?volume[n+dims[0]]:0,B[0][0]&&B[1][0]&&B[2][1]?volume[n+dims[0]*dims[1]]:0];for(var d=0;d<3;++d)if(!!p!==!!b[d]){var s=!p?1:0;var t=[x[0],x[1],x[2]],u=dir[d][s],v=dir[d][s^1];++t[d];var vertex_count=vertices.length;vertices.push([t[0],t[1],t[2]]);vertices.push([t[0]+u[0],t[1]+u[1],t[2]+u[2]]);vertices.push([t[0]+u[0]+v[0],t[1]+u[1]+v[1],t[2]+u[2]+v[2]]);vertices.push([t[0]+v[0],t[1]+v[1],t[2]+v[2]]);faces.push([vertex_count,vertex_count+1,vertex_count+2,vertex_count+3,s?b[d]:p])}}return{vertices:vertices,faces:faces}}if(exports){exports.mesher=CulledMesh}},{}],60:[function(require,module,exports){var GreedyMesh=function(){var mask=new Int32Array(4096);return function(volume,dims){var vertices=[],faces=[],dimsX=dims[0],dimsY=dims[1],dimsXY=dimsX*dimsY;for(var d=0;d<3;++d){var i,j,k,l,w,W,h,n,c,u=(d+1)%3,v=(d+2)%3,x=[0,0,0],q=[0,0,0],du=[0,0,0],dv=[0,0,0],dimsD=dims[d],dimsU=dims[u],dimsV=dims[v],qdimsX,qdimsXY,xd;if(mask.length<dimsU*dimsV){mask=new Int32Array(dimsU*dimsV)}q[d]=1;x[d]=-1;qdimsX=dimsX*q[1];qdimsXY=dimsXY*q[2];while(x[d]<dimsD){xd=x[d];n=0;for(x[v]=0;x[v]<dimsV;++x[v]){for(x[u]=0;x[u]<dimsU;++x[u],++n){var a=xd>=0&&volume[x[0]+dimsX*x[1]+dimsXY*x[2]],b=xd<dimsD-1&&volume[x[0]+q[0]+dimsX*x[1]+qdimsX+dimsXY*x[2]+qdimsXY];if(a?b:!b){mask[n]=0;continue}mask[n]=a?a:-b}}++x[d];n=0;for(j=0;j<dimsV;++j){for(i=0;i<dimsU;){c=mask[n];if(!c){i++;n++;continue}w=1;while(c===mask[n+w]&&i+w<dimsU)w++;for(h=1;j+h<dimsV;++h){k=0;while(k<w&&c===mask[n+k+h*dimsU])k++;if(k<w)break}du[d]=0;dv[d]=0;x[u]=i;x[v]=j;if(c>0){dv[v]=h;dv[u]=0;du[u]=w;du[v]=0}else{c=-c;du[v]=h;du[u]=0;dv[u]=w;dv[v]=0}var vertex_count=vertices.length;vertices.push([x[0],x[1],x[2]]);vertices.push([x[0]+du[0],x[1]+du[1],x[2]+du[2]]);vertices.push([x[0]+du[0]+dv[0],x[1]+du[1]+dv[1],x[2]+du[2]+dv[2]]);vertices.push([x[0]+dv[0],x[1]+dv[1],x[2]+dv[2]]);faces.push([vertex_count,vertex_count+1,vertex_count+2,vertex_count+3,c]);W=n+w;for(l=0;l<h;++l){for(k=n;k<W;++k){mask[k+l*dimsU]=0}}i+=w;n+=w}}}}return{vertices:vertices,faces:faces}}}();if(exports){exports.mesher=GreedyMesh}},{}],61:[function(require,module,exports){"use strict";var MonotoneMesh=function(){function MonotonePolygon(c,v,ul,ur){this.color=c;this.left=[[ul,v]];this.right=[[ur,v]]}MonotonePolygon.prototype.close_off=function(v){this.left.push([this.left[this.left.length-1][0],v]);this.right.push([this.right[this.right.length-1][0],v])};MonotonePolygon.prototype.merge_run=function(v,u_l,u_r){var l=this.left[this.left.length-1][0],r=this.right[this.right.length-1][0];if(l!==u_l){this.left.push([l,v]);this.left.push([u_l,v])}if(r!==u_r){this.right.push([r,v]);this.right.push([u_r,v])}};return function(volume,dims){function f(i,j,k){return volume[i+dims[0]*(j+dims[1]*k)]}var vertices=[],faces=[];for(var d=0;d<3;++d){var i,j,k,u=(d+1)%3,v=(d+2)%3,x=new Int32Array(3),q=new Int32Array(3),runs=new Int32Array(2*(dims[u]+1)),frontier=new Int32Array(dims[u]),next_frontier=new Int32Array(dims[u]),left_index=new Int32Array(2*dims[v]),right_index=new Int32Array(2*dims[v]),stack=new Int32Array(24*dims[v]),delta=[[0,0],[0,0]];q[d]=1;for(x[d]=-1;x[d]<dims[d];){var n=0,polygons=[],nf=0;for(x[v]=0;x[v]<dims[v];++x[v]){var nr=0,p=0,c=0;for(x[u]=0;x[u]<dims[u];++x[u],p=c){var a=0<=x[d]?f(x[0],x[1],x[2]):0,b=x[d]<dims[d]-1?f(x[0]+q[0],x[1]+q[1],x[2]+q[2]):0;c=a;if(!a===!b){c=0}else if(!a){c=-b}if(p!==c){runs[nr++]=x[u];runs[nr++]=c}}runs[nr++]=dims[u];runs[nr++]=0;var fp=0;for(var i=0,j=0;i<nf&&j<nr-2;){var p=polygons[frontier[i]],p_l=p.left[p.left.length-1][0],p_r=p.right[p.right.length-1][0],p_c=p.color,r_l=runs[j],r_r=runs[j+2],r_c=runs[j+1];if(r_r>p_l&&p_r>r_l&&r_c===p_c){p.merge_run(x[v],r_l,r_r);next_frontier[fp++]=frontier[i];++i;j+=2}else{if(r_r<=p_r){if(!!r_c){var n_poly=new MonotonePolygon(r_c,x[v],r_l,r_r);next_frontier[fp++]=polygons.length;polygons.push(n_poly)}j+=2}if(p_r<=r_r){p.close_off(x[v]);++i}}}for(;i<nf;++i){polygons[frontier[i]].close_off(x[v])}for(;j<nr-2;j+=2){var r_l=runs[j],r_r=runs[j+2],r_c=runs[j+1];if(!!r_c){var n_poly=new MonotonePolygon(r_c,x[v],r_l,r_r);next_frontier[fp++]=polygons.length;polygons.push(n_poly)}}var tmp=next_frontier;next_frontier=frontier;frontier=tmp;nf=fp}for(var i=0;i<nf;++i){var p=polygons[frontier[i]];p.close_off(dims[v])}x[d]++;for(var i=0;i<polygons.length;++i){var p=polygons[i],c=p.color,flipped=false;if(c<0){flipped=true;c=-c}for(var j=0;j<p.left.length;++j){left_index[j]=vertices.length;var y=[0,0,0],z=p.left[j];y[d]=x[d];y[u]=z[0];y[v]=z[1];vertices.push(y)}for(var j=0;j<p.right.length;++j){right_index[j]=vertices.length;var y=[0,0,0],z=p.right[j];y[d]=x[d];y[u]=z[0];y[v]=z[1];vertices.push(y)}var bottom=0,top=0,l_i=1,r_i=1,side=true;stack[top++]=left_index[0];stack[top++]=p.left[0][0];stack[top++]=p.left[0][1];stack[top++]=right_index[0];stack[top++]=p.right[0][0];stack[top++]=p.right[0][1];while(l_i<p.left.length||r_i<p.right.length){var n_side=false;if(l_i===p.left.length){n_side=true}else if(r_i!==p.right.length){var l=p.left[l_i],r=p.right[r_i];n_side=l[1]>r[1]}var idx=n_side?right_index[r_i]:left_index[l_i],vert=n_side?p.right[r_i]:p.left[l_i];if(n_side!==side){while(bottom+3<top){if(flipped===n_side){faces.push([stack[bottom],stack[bottom+3],idx,c])}else{faces.push([stack[bottom+3],stack[bottom],idx,c])}bottom+=3}}else{while(bottom+3<top){for(var j=0;j<2;++j)for(var k=0;k<2;++k){delta[j][k]=stack[top-3*(j+1)+k+1]-vert[k]}var det=delta[0][0]*delta[1][1]-delta[1][0]*delta[0][1];if(n_side===det>0){break}if(det!==0){if(flipped===n_side){faces.push([stack[top-3],stack[top-6],idx,c])}else{faces.push([stack[top-6],stack[top-3],idx,c])}}top-=3}}stack[top++]=idx;stack[top++]=vert[0];stack[top++]=vert[1];if(n_side){++r_i}else{++l_i}side=n_side}}}}return{vertices:vertices,faces:faces}}}();if(exports){exports.mesher=MonotoneMesh}},{}],62:[function(require,module,exports){function StupidMesh(volume,dims){var vertices=[],faces=[],x=[0,0,0],n=0;for(x[2]=0;x[2]<dims[2];++x[2])for(x[1]=0;x[1]<dims[1];++x[1])for(x[0]=0;x[0]<dims[0];++x[0],++n)if(!!volume[n]){for(var d=0;d<3;++d){var t=[x[0],x[1],x[2]],u=[0,0,0],v=[0,0,0];u[(d+1)%3]=1;v[(d+2)%3]=1;for(var s=0;s<2;++s){t[d]=x[d]+s;var tmp=u;u=v;v=tmp;var vertex_count=vertices.length;vertices.push([t[0],t[1],t[2]]);vertices.push([t[0]+u[0],t[1]+u[1],t[2]+u[2]]);vertices.push([t[0]+u[0]+v[0],t[1]+u[1]+v[1],t[2]+u[2]+v[2]]);vertices.push([t[0]+v[0],t[1]+v[1],t[2]+v[2]]);faces.push([vertex_count,vertex_count+1,vertex_count+2,vertex_count+3,volume[n]])}}}return{vertices:vertices,faces:faces}}if(exports){exports.mesher=StupidMesh}},{}],"voxel-engine":[function(require,module,exports){(function(process){var voxel=require("voxel");var voxelMesh=require("voxel-mesh");var ray=require("voxel-raycast");var texture=require("voxel-texture");var control=require("voxel-control");var voxelView=require("voxel-view");var THREE=require("three");var Stats=require("./lib/stats");var Detector=require("./lib/detector");var inherits=require("inherits");var path=require("path");var EventEmitter=require("events").EventEmitter;if(process.browser)var interact=require("interact");var requestAnimationFrame=require("raf");var collisions=require("collide-3d-tilemap");var aabb=require("aabb-3d");var glMatrix=require("gl-matrix");var vector=glMatrix.vec3;var SpatialEventEmitter=require("spatial-events");var regionChange=require("voxel-region-change");var kb=require("kb-controls");var physical=require("voxel-physical");var pin=require("pin-it");var tic=require("tic")();module.exports=Game;function Game(opts){if(!(this instanceof Game))return new Game(opts);var self=this;if(!opts)opts={};if(process.browser&&this.notCapable(opts))return;this.isClient=Boolean(typeof opts.isClient!=="undefined"?opts.isClient:process.browser);if(!("generateChunks"in opts))opts.generateChunks=true;this.generateChunks=opts.generateChunks;this.setConfigurablePositions(opts);this.configureChunkLoading(opts);this.setDimensions(opts);this.THREE=THREE;this.vector=vector;this.glMatrix=glMatrix;this.arrayType=opts.arrayType||Uint8Array;this.cubeSize=1;this.chunkSize=opts.chunkSize||32;this.chunkDistance=opts.chunkDistance||2;this.removeDistance=opts.removeDistance||this.chunkDistance+1;this.skyColor=opts.skyColor||12571109;this.antialias=opts.antialias;this.playerHeight=opts.playerHeight||1.62;this.meshType=opts.meshType||"surfaceMesh";this.mesher=opts.mesher||voxel.meshers.culled;this.materialType=opts.materialType||THREE.MeshLambertMaterial;this.materialParams=opts.materialParams||{};this.items=[];this.voxels=voxel(this);this.scene=new THREE.Scene;this.view=opts.view||new voxelView(THREE,{width:this.width,height:this.height,skyColor:this.skyColor,antialias:this.antialias});this.view.bindToScene(this.scene);this.camera=this.view.getCamera();if(!opts.lightsDisabled)this.addLights(this.scene);this.fogScale=opts.fogScale||32;if(!opts.fogDisabled)this.scene.fog=new THREE.Fog(this.skyColor,25e-5,this.worldWidth()*this.fogScale);this.collideVoxels=collisions(this.getBlock.bind(this),1,[Infinity,Infinity,Infinity],[-Infinity,-Infinity,-Infinity]);this.timer=this.initializeTimer(opts.tickFPS||16);this.paused=false;this.spatial=new SpatialEventEmitter;this.region=regionChange(this.spatial,aabb([0,0,0],[1,1,1]),this.chunkSize);this.voxelRegion=regionChange(this.spatial,1);this.chunkRegion=regionChange(this.spatial,this.chunkSize);this.asyncChunkGeneration=false;this.chunksNeedsUpdate={};this.pendingChunks=[];this.materials=texture({game:this,texturePath:opts.texturePath||"./textures/",materialType:opts.materialType||THREE.MeshLambertMaterial,materialParams:opts.materialParams||{},materialFlatColor:opts.materialFlatColor===true});this.materialNames=opts.materials||[["grass","dirt","grass_dirt"],"brick","dirt"];self.chunkRegion.on("change",function(newChunk){self.removeFarChunks()});if(this.isClient)this.materials.load(this.materialNames);if(this.generateChunks)this.handleChunkGeneration();if(!this.isClient)return;this.paused=true;this.initializeRendering(opts);this.showAllChunks();setTimeout(function(){self.asyncChunkGeneration="asyncChunkGeneration"in opts?opts.asyncChunkGeneration:true},2e3);this.initializeControls(opts)}inherits(Game,EventEmitter);Game.prototype.voxelPosition=function(gamePosition){var _=Math.floor;var p=gamePosition;var v=[];v[0]=_(p[0]);v[1]=_(p[1]);v[2]=_(p[2]);return v};Game.prototype.cameraPosition=function(){return this.view.cameraPosition()};Game.prototype.cameraVector=function(){return this.view.cameraVector()};Game.prototype.makePhysical=function(target,envelope,blocksCreation){var vel=this.terminalVelocity;envelope=envelope||[2/3,1.5,2/3];var obj=physical(target,this.potentialCollisionSet(),envelope,{x:vel[0],y:vel[1],z:vel[2]});obj.blocksCreation=!!blocksCreation;return obj};Game.prototype.addItem=function(item){if(!item.tick){var newItem=physical(item.mesh,this.potentialCollisionSet(),[item.size,item.size,item.size]);if(item.velocity){newItem.velocity.copy(item.velocity);newItem.subjectTo(this.gravity)}newItem.repr=function(){return"debris"};newItem.mesh=item.mesh;newItem.blocksCreation=item.blocksCreation;item=newItem}this.items.push(item);if(item.mesh)this.scene.add(item.mesh);return this.items[this.items.length-1]};Game.prototype.removeItem=function(item){var ix=this.items.indexOf(item);if(ix<0)return;this.items.splice(ix,1);if(item.mesh)this.scene.remove(item.mesh)};Game.prototype.raycast=Game.prototype.raycastVoxels=function(start,direction,maxDistance,epilson){if(!start)return this.raycastVoxels(this.cameraPosition(),this.cameraVector(),10);var hitNormal=[0,0,0];var hitPosition=[0,0,0];var cp=start||this.cameraPosition();var cv=direction||this.cameraVector();var hitBlock=ray(this,cp,cv,maxDistance||10,hitPosition,hitNormal,epilson||this.epilson);if(hitBlock<=0)return false;var adjacentPosition=[0,0,0];var voxelPosition=this.voxelPosition(hitPosition);vector.add(adjacentPosition,voxelPosition,hitNormal);return{position:hitPosition,voxel:voxelPosition,direction:direction,value:hitBlock,normal:hitNormal,adjacent:adjacentPosition}};Game.prototype.canCreateBlock=function(pos){pos=this.parseVectorArguments(arguments);var floored=pos.map(function(i){return Math.floor(i)});var bbox=aabb(floored,[1,1,1]);for(var i=0,len=this.items.length;i<len;++i){var item=this.items[i];var itemInTheWay=item.blocksCreation&&item.aabb&&bbox.intersects(item.aabb());if(itemInTheWay)return false}return true};Game.prototype.createBlock=function(pos,val){if(typeof val==="string")val=this.materials.find(val);if(!this.canCreateBlock(pos))return false;this.setBlock(pos,val);return true};Game.prototype.setBlock=function(pos,val){if(typeof val==="string")val=this.materials.find(val);var old=this.voxels.voxelAtPosition(pos,val);var c=this.voxels.chunkAtPosition(pos);var chunk=this.voxels.chunks[c.join("|")];if(!chunk)return;this.addChunkToNextUpdate(chunk);this.spatial.emit("change-block",pos,old,val);this.emit("setBlock",pos,val,old)};Game.prototype.getBlock=function(pos){pos=this.parseVectorArguments(arguments);return this.voxels.voxelAtPosition(pos)};Game.prototype.blockPosition=function(pos){pos=this.parseVectorArguments(arguments);var ox=Math.floor(pos[0]);var oy=Math.floor(pos[1]);var oz=Math.floor(pos[2]);return[ox,oy,oz]};Game.prototype.blocks=function(low,high,iterator){var l=low,h=high;var d=[h[0]-l[0],h[1]-l[1],h[2]-l[2]];if(!iterator)var voxels=new this.arrayType(d[0]*d[1]*d[2]);var i=0;for(var z=l[2];z<h[2];++z)for(var y=l[1];y<h[1];++y)for(var x=l[0];x<h[0];++x,++i){if(iterator)iterator(x,y,z,i);else voxels[i]=this.voxels.voxelAtPosition([x,y,z])}if(!iterator)return{voxels:voxels,dims:d}};Game.prototype.createAdjacent=function(hit,val){this.createBlock(hit.adjacent,val)};Game.prototype.appendTo=function(element){this.view.appendTo(element)};Game.prototype.gravity=[0,-36e-7,0];Game.prototype.friction=.3;Game.prototype.epilson=1e-8;Game.prototype.terminalVelocity=[.9,.1,.9];Game.prototype.defaultButtons={W:"forward",A:"left",S:"backward",D:"right","<up>":"forward","<left>":"left","<down>":"backward","<right>":"right","<mouse 1>":"fire","<mouse 3>":"firealt","<space>":"jump","<shift>":"crouch","<control>":"alt"};Game.prototype.parseVectorArguments=function(args){if(!args)return false;if(args[0]instanceof Array)return args[0];return[args[0],args[1],args[2]]};Game.prototype.setConfigurablePositions=function(opts){var sp=opts.startingPosition;this.startingPosition=sp||[35,1024,35];var wo=opts.worldOrigin;this.worldOrigin=wo||[0,0,0]};Game.prototype.setDimensions=function(opts){if(opts.container)this.container=opts.container;if(opts.container&&opts.container.clientHeight){this.height=opts.container.clientHeight}else{this.height=typeof window==="undefined"?1:window.innerHeight}if(opts.container&&opts.container.clientWidth){this.width=opts.container.clientWidth}else{this.width=typeof window==="undefined"?1:window.innerWidth}};Game.prototype.notCapable=function(opts){var self=this;if(!Detector().webgl){this.view={appendTo:function(el){el.appendChild(self.notCapableMessage())}};return true}return false};Game.prototype.notCapableMessage=function(){var wrapper=document.createElement("div");wrapper.className="errorMessage";var a=document.createElement("a");a.title="You need WebGL and Pointer Lock (Chrome 23/Firefox 14) to play this game. Click here for more information.";a.innerHTML=a.title;a.href="http://get.webgl.org";wrapper.appendChild(a);return wrapper};Game.prototype.onWindowResize=function(){var width=window.innerWidth;var height=window.innerHeight;if(this.container){width=this.container.clientWidth;height=this.container.clientHeight}this.view.resizeWindow(width,height)};Game.prototype.control=function(target){this.controlling=target;return this.controls.target(target)};Game.prototype.potentialCollisionSet=function(){return[{collide:this.collideTerrain.bind(this)}]};Game.prototype.playerPosition=function(){var target=this.controls.target();var position=target?target.avatar.position:this.camera.localToWorld(this.camera.position.clone());return[position.x,position.y,position.z]};Game.prototype.playerAABB=function(position){var pos=position||this.playerPosition();var lower=[];var upper=[1/2,this.playerHeight,1/2];var playerBottom=[1/4,this.playerHeight,1/4];vector.subtract(lower,pos,playerBottom);var bbox=aabb(lower,upper);return bbox};Game.prototype.collideTerrain=function(other,bbox,vec,resting){var self=this;var axes=["x","y","z"];var vec3=[vec.x,vec.y,vec.z];this.collideVoxels(bbox,vec3,function hit(axis,tile,coords,dir,edge){if(!tile)return;if(Math.abs(vec3[axis])<Math.abs(edge))return;vec3[axis]=vec[axes[axis]]=edge;other.acceleration[axes[axis]]=0;
resting[axes[axis]]=dir;other.friction[axes[(axis+1)%3]]=other.friction[axes[(axis+2)%3]]=axis===1?self.friction:1;return true})};Game.prototype.addStats=function(){stats=new Stats;stats.domElement.style.position="absolute";stats.domElement.style.bottom="0px";document.body.appendChild(stats.domElement)};Game.prototype.addLights=function(scene){var ambientLight,directionalLight;ambientLight=new THREE.AmbientLight(13421772);scene.add(ambientLight);var light=new THREE.DirectionalLight(16777215,1);light.position.set(1,1,.5).normalize();scene.add(light)};Game.prototype.configureChunkLoading=function(opts){var self=this;if(!opts.generateChunks)return;if(!opts.generate){this.generate=function(x,y,z){return x*x+y*y+z*z<=15*15?1:0}}else{this.generate=opts.generate}if(opts.generateVoxelChunk){this.generateVoxelChunk=opts.generateVoxelChunk}else{this.generateVoxelChunk=function(low,high){return voxel.generate(low,high,self.generate,self)}}};Game.prototype.worldWidth=function(){return this.chunkSize*2*this.chunkDistance};Game.prototype.chunkToWorld=function(pos){return[pos[0]*this.chunkSize,pos[1]*this.chunkSize,pos[2]*this.chunkSize]};Game.prototype.removeFarChunks=function(playerPosition){var self=this;playerPosition=playerPosition||this.playerPosition();var nearbyChunks=this.voxels.nearbyChunks(playerPosition,this.removeDistance).map(function(chunkPos){return chunkPos.join("|")});Object.keys(self.voxels.chunks).map(function(chunkIndex){if(nearbyChunks.indexOf(chunkIndex)>-1)return;var chunk=self.voxels.chunks[chunkIndex];var mesh=self.voxels.meshes[chunkIndex];var pendingIndex=self.pendingChunks.indexOf(chunkIndex);if(pendingIndex!==-1)self.pendingChunks.splice(pendingIndex,1);if(!chunk)return;var chunkPosition=chunk.position;if(mesh){if(mesh.surfaceMesh){self.scene.remove(mesh.surfaceMesh);mesh.surfaceMesh.geometry.dispose()}if(mesh.wireMesh){mesh.wireMesh.geometry.dispose();self.scene.remove(mesh.wireMesh)}delete mesh.data;delete mesh.geometry;delete mesh.meshed;delete mesh.surfaceMesh;delete mesh.wireMesh}delete self.voxels.chunks[chunkIndex];self.emit("removeChunk",chunkPosition)});self.voxels.requestMissingChunks(playerPosition)};Game.prototype.addChunkToNextUpdate=function(chunk){this.chunksNeedsUpdate[chunk.position.join("|")]=chunk};Game.prototype.updateDirtyChunks=function(){var self=this;Object.keys(this.chunksNeedsUpdate).forEach(function showChunkAtIndex(chunkIndex){var chunk=self.chunksNeedsUpdate[chunkIndex];self.emit("dirtyChunkUpdate",chunk);self.showChunk(chunk)});this.chunksNeedsUpdate={}};Game.prototype.loadPendingChunks=function(count){var pendingChunks=this.pendingChunks;if(!this.asyncChunkGeneration){count=pendingChunks.length}else{count=count||pendingChunks.length*.1;count=Math.max(1,Math.min(count,pendingChunks.length))}for(var i=0;i<count;i+=1){var chunkPos=pendingChunks[i].split("|");var chunk=this.voxels.generateChunk(chunkPos[0]|0,chunkPos[1]|0,chunkPos[2]|0);if(this.isClient)this.showChunk(chunk)}if(count)pendingChunks.splice(0,count)};Game.prototype.getChunkAtPosition=function(pos){var chunkID=this.voxels.chunkAtPosition(pos).join("|");var chunk=this.voxels.chunks[chunkID];return chunk};Game.prototype.showAllChunks=function(){for(var chunkIndex in this.voxels.chunks){this.showChunk(this.voxels.chunks[chunkIndex])}};Game.prototype.showChunk=function(chunk){var chunkIndex=chunk.position.join("|");var bounds=this.voxels.getBounds.apply(this.voxels,chunk.position);var scale=new THREE.Vector3(1,1,1);var mesh=voxelMesh(chunk,this.mesher,scale,this.THREE);this.voxels.chunks[chunkIndex]=chunk;if(this.voxels.meshes[chunkIndex]){if(this.voxels.meshes[chunkIndex].surfaceMesh)this.scene.remove(this.voxels.meshes[chunkIndex].surfaceMesh);if(this.voxels.meshes[chunkIndex].wireMesh)this.scene.remove(this.voxels.meshes[chunkIndex].wireMesh)}this.voxels.meshes[chunkIndex]=mesh;if(this.isClient){if(this.meshType==="wireMesh")mesh.createWireMesh();else mesh.createSurfaceMesh(this.materials.material);this.materials.paint(mesh)}mesh.setPosition(bounds[0][0],bounds[0][1],bounds[0][2]);mesh.addToScene(this.scene);this.emit("renderChunk",chunk);return mesh};Game.prototype.addMarker=function(position){var geometry=new THREE.SphereGeometry(.1,10,10);var material=new THREE.MeshPhongMaterial({color:16777215,shading:THREE.FlatShading});var mesh=new THREE.Mesh(geometry,material);mesh.position.copy(position);this.scene.add(mesh)};Game.prototype.addAABBMarker=function(aabb,color){var geometry=new THREE.CubeGeometry(aabb.width(),aabb.height(),aabb.depth());var material=new THREE.MeshBasicMaterial({color:color||16777215,wireframe:true,transparent:true,opacity:.5,side:THREE.DoubleSide});var mesh=new THREE.Mesh(geometry,material);mesh.position.set(aabb.x0()+aabb.width()/2,aabb.y0()+aabb.height()/2,aabb.z0()+aabb.depth()/2);this.scene.add(mesh);return mesh};Game.prototype.addVoxelMarker=function(x,y,z,color){var bbox=aabb([x,y,z],[1,1,1]);return this.addAABBMarker(bbox,color)};Game.prototype.pin=pin;Game.prototype.onControlChange=function(gained,stream){this.paused=false;if(!gained&&!this.optout){this.buttons.disable();return}this.buttons.enable();stream.pipe(this.controls.createWriteRotationStream())};Game.prototype.onControlOptOut=function(){this.optout=true};Game.prototype.onFire=function(state){this.emit("fire",this.controlling,state)};Game.prototype.setInterval=tic.interval.bind(tic);Game.prototype.setTimeout=tic.timeout.bind(tic);Game.prototype.tick=function(delta){for(var i=0,len=this.items.length;i<len;++i){this.items[i].tick(delta)}if(this.materials)this.materials.tick(delta);if(this.pendingChunks.length)this.loadPendingChunks();if(Object.keys(this.chunksNeedsUpdate).length>0)this.updateDirtyChunks();tic.tick(delta);this.emit("tick",delta);if(!this.controls)return;var playerPos=this.playerPosition();this.spatial.emit("position",playerPos,playerPos)};Game.prototype.render=function(delta){this.view.render(this.scene)};Game.prototype.initializeTimer=function(rate){var self=this;var accum=0;var now=0;var last=null;var dt=0;var wholeTick;self.frameUpdated=true;self.interval=setInterval(timer,0);return self.interval;function timer(){if(self.paused){last=Date.now();accum=0;return}now=Date.now();dt=now-(last||now);last=now;accum+=dt;if(accum<rate)return;wholeTick=accum/rate|0;if(wholeTick<=0)return;wholeTick*=rate;self.tick(wholeTick);accum-=wholeTick;self.frameUpdated=true}};Game.prototype.initializeRendering=function(opts){var self=this;if(!opts.statsDisabled)self.addStats();window.addEventListener("resize",self.onWindowResize.bind(self),false);requestAnimationFrame(window).on("data",function(dt){self.emit("prerender",dt);self.render(dt);self.emit("postrender",dt)});if(typeof stats!=="undefined"){self.on("postrender",function(){stats.update()})}};Game.prototype.initializeControls=function(opts){this.keybindings=opts.keybindings||this.defaultButtons;this.buttons=kb(document.body,this.keybindings);this.buttons.disable();this.optout=false;this.interact=interact(opts.interactElement||this.view.element,opts.interactMouseDrag);this.interact.on("attain",this.onControlChange.bind(this,true)).on("release",this.onControlChange.bind(this,false)).on("opt-out",this.onControlOptOut.bind(this));this.hookupControls(this.buttons,opts)};Game.prototype.hookupControls=function(buttons,opts){opts=opts||{};opts.controls=opts.controls||{};opts.controls.onfire=this.onFire.bind(this);this.controls=control(buttons,opts.controls);this.items.push(this.controls);this.controlling=null};Game.prototype.handleChunkGeneration=function(){var self=this;this.voxels.on("missingChunk",function(chunkPos){self.pendingChunks.push(chunkPos.join("|"))});this.voxels.requestMissingChunks(this.worldOrigin);this.loadPendingChunks(this.pendingChunks.length)};Game.prototype.destroy=function(){clearInterval(this.timer)}}).call(this,require("_process"))},{"./lib/detector":23,"./lib/stats":24,_process:9,"aabb-3d":25,"collide-3d-tilemap":26,events:5,"gl-matrix":27,inherits:28,interact:29,"kb-controls":38,path:8,"pin-it":43,raf:44,"spatial-events":45,three:47,tic:48,voxel:58,"voxel-control":49,"voxel-mesh":50,"voxel-physical":51,"voxel-raycast":52,"voxel-region-change":53,"voxel-texture":54,"voxel-view":56}]},{},[]);var createGame=require("voxel-engine");var texturePath=require("programmerart-textures")("");var game=createGame({texturePath:texturePath,materials:[["blocks/grass_top","blocks/dirt","blocks/grass_side"],"blocks/stone","blocks/dirt"]});var createPlayer=require("voxel-player")(game);var container=document.body;game.appendTo(container);var player=createPlayer("player.png");player.possess();player.yaw.position.set(0,100,0);
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"programmerart-textures": "2.1.0",
"voxel-player": "0.1.0",
"voxel-engine": "0.20.2"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment