{"version":3,"sources":["webpack:///./node_modules/three/three.js","webpack:///./src/views/components/LangCanvas.vue","webpack:///./src/views/components/LangCanvas.vue?2ece"],"names":["window","self","undefined","performance","now","process","hrtime","time","Date","getTime","THREE","REVISION","console","info","log","debug","warn","error","Int32Array","Array","Float32Array","String","prototype","trim","this","replace","extend","obj","source","Object","keys","i","il","length","prop","defineProperty","getOwnPropertyDescriptor","safeHasOwnProperty","hasOwnProperty","call","lastTime","vendors","x","requestAnimationFrame","cancelAnimationFrame","callback","currTime","timeToCall","Math","max","id","setTimeout","clearTimeout","CullFaceNone","CullFaceBack","CullFaceFront","CullFaceFrontBack","FrontFaceDirectionCW","FrontFaceDirectionCCW","BasicShadowMap","PCFShadowMap","PCFSoftShadowMap","FrontSide","BackSide","DoubleSide","NoShading","FlatShading","SmoothShading","NoColors","FaceColors","VertexColors","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","MultiplyOperation","MixOperation","AddOperation","UVMapping","CubeReflectionMapping","CubeRefractionMapping","SphericalReflectionMapping","SphericalRefractionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipMapNearestFilter","LinearMipMapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedShort565Type","AlphaFormat","RGBFormat","RGBAFormat","LuminanceFormat","LuminanceAlphaFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","Color","value","set","constructor","r","g","b","copy","setHex","setStyle","hex","floor","setRGB","setHSL","h","s","l","hue2rgb","p","q","t","style","test","color","exec","min","parseInt","ColorKeywords","copyGammaToLinear","copyLinearToGamma","sqrt","convertGammaToLinear","convertLinearToGamma","getHex","getHexString","toString","slice","getHSL","hsl","hue","saturation","lightness","delta","getStyle","offsetHSL","add","addColors","color1","color2","addScalar","multiply","multiplyScalar","lerp","alpha","equals","c","clone","Quaternion","y","z","w","setFromEuler","v","order","c1","cos","c2","c3","s1","sin","s2","s3","setFromAxisAngle","axis","angle","halfAngle","setFromRotationMatrix","m","te","elements","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","inverse","conjugate","normalize","lengthSq","multiplyQuaternions","a","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","multiplyVector3","vector","applyQuaternion","slerp","qb","cosHalfTheta","halfTheta","acos","sinHalfTheta","abs","ratioA","ratioB","fromArray","array","toArray","qa","qm","Vector2","setX","setY","setComponent","index","Error","getComponent","addVectors","sub","subVectors","divideScalar","clamp","negate","dot","distanceTo","distanceToSquared","dx","dy","setLength","oldLength","Vector3","setZ","multiplyVectors","applyMatrix3","e","applyMatrix4","applyProjection","d","qx","qy","qz","qw","ix","iy","iz","iw","transformDirection","divide","lengthManhattan","cross","crossVectors","angleTo","theta","dz","setEulerFromRotationMatrix","asin","atan2","setEulerFromQuaternion","sqx","sqy","sqz","sqw","getPositionFromMatrix","getScaleFromMatrix","sx","sy","sz","getColumnFromMatrix","matrix","offset","me","applyEuler","q1","eulerOrder","quaternion","applyAxisAngle","projectOnVector","v1","projectOnPlane","planeNormal","reflect","Vector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","PI","xx","yy","zz","xy","xz","yz","Line3","start","end","line","center","optionalTarget","result","distanceSq","distance","at","closestPointToPointParameter","startP","startEnd","point","clampToLine","startEnd2","startEnd_startP","closestPointToPoint","Box2","Infinity","setFromPoints","points","makeEmpty","setFromCenterAndSize","size","halfSize","box","empty","expandByPoint","expandByVector","expandByScalar","scalar","containsPoint","containsBox","getParameter","isIntersectionBox","clampPoint","distanceToPoint","clampedPoint","intersect","union","translate","Box3","getBoundingSphere","Sphere","radius","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","identity","multiplyVector3Array","determinant","f","getInverse","throwOnInvertible","det","msg","transpose","tmp","getNormalMatrix","transposeIntoArray","Matrix4","n14","n24","n34","n41","n42","n43","n44","extractPosition","copyPosition","extractRotation","scaleX","scaleY","scaleZ","setRotationFromEuler","makeRotationFromEuler","ae","af","be","bf","ce","cf","de","df","ac","ad","bc","bd","setRotationFromQuaternion","makeRotationFromQuaternion","x2","y2","z2","wx","wy","wz","lookAt","eye","target","up","n","multiplyMatrices","a11","a12","a13","a14","a21","a22","a23","a24","a31","a32","a33","a34","a41","a42","a43","a44","b11","b12","b13","b14","b21","b22","b23","b24","b31","b32","b33","b34","b41","b42","b43","b44","multiplyToArray","multiplyVector4","rotateAxis","crossVector","flattenToArray","flat","flattenToArrayOffset","getPosition","setPosition","rotateX","rotateY","rotateZ","rotateByAxis","scale","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","tx","ty","makeScale","compose","position","makeFromPositionQuaternionScale","makeFromPositionEulerScale","rotation","makeFrustum","left","right","bottom","top","near","far","makePerspective","fov","aspect","ymax","tan","degToRad","ymin","xmin","xmax","makeOrthographic","decompose","Ray","origin","direction","ray","recast","directionDistance","isIntersectionSphere","sphere","isIntersectionPlane","plane","denominator","normal","distanceToPlane","constant","intersectPlane","matrix4","setFromCenterAndPoints","maxRadiusSq","radiusSq","intersectsSphere","radiusSum","deltaLengthSq","getBoundingBox","Frustum","p0","p1","p2","p3","p4","p5","planes","Plane","frustum","setFromMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","setComponents","intersectsObject","object","matrixWorld","negRadius","geometry","boundingSphere","setFromNormalAndCoplanarPoint","setFromCoplanarPoints","v2","inverseNormalLength","distanceToSphere","projectPoint","orthoPoint","perpendicularMagnitude","isIntersectionLine","startSign","endSign","intersectLine","coplanarPoint","optionalNormalMatrix","newNormal","newCoplanarPoint","clampBottom","mapLinear","a1","a2","b1","b2","smoothstep","smootherstep","random16","random","randInt","low","high","randFloat","randFloatSpread","range","sign","degreeToRadiansFactor","degrees","radToDeg","radianToDegreesFactor","radians","Spline","intPoint","weight","w2","w3","pa","pb","pc","pd","v3","interpolate","t2","t3","v0","initFromArray","getPoint","k","getControlPointsArray","coords","getLength","nSubDivisions","nSamples","oldIntPoint","oldPosition","tmpVec","chunkLengths","totalLength","chunks","total","reparametrizeByArcLength","samplingCoef","j","indexCurrent","indexNext","realDistance","sampling","newpoints","sl","push","ceil","Triangle","resultLengthSq","barycoordFromPoint","dot00","dot01","dot02","dot11","dot12","denom","invDenom","u","setFromPointsAndIndices","i0","i1","i2","triangle","area","midpoint","Vertex","UV","Clock","autoStart","startTime","oldTime","elapsedTime","running","stop","getElapsedTime","getDelta","diff","newTime","EventDispatcher","addEventListener","type","listener","_listeners","listeners","indexOf","hasEventListener","removeEventListener","splice","dispatchEvent","event","listenerArray","Raycaster","localRay","facePlane","intersectPoint","matrixPosition","inverseMatrix","descSort","intersectObject","raycaster","intersects","Particle","face","LOD","getObjectForDistance","Mesh","vertices","isFaceMaterial","material","MeshFaceMaterial","objectMaterials","materials","side","precision","fl","faces","materialIndex","planeDistance","planeSign","Face3","Face4","faceIndex","intersectDescendants","descendants","getDescendants","recursive","sort","intersectObjects","objects","Object3D","Object3DIdCount","name","parent","children","defaultEulerOrder","renderDepth","rotationAutoUpdate","matrixAutoUpdate","matrixWorldNeedsUpdate","useQuaternion","visible","castShadow","receiveShadow","frustumCulled","userData","applyMatrix","m1","rotateOnAxis","q2","translateOnAxis","translateX","translateY","translateZ","localToWorld","worldToLocal","remove","scene","Scene","__addObject","__removeObject","traverse","getObjectById","child","getObjectByName","getChildByName","apply","updateMatrix","updateMatrixWorld","force","JSON","parse","stringify","Projector","_object","_objectCount","_vertex","_vertexCount","_face","_face3Count","_face4Count","_line","_lineCount","_particle","_particleCount","_modelMatrix","_objectPool","_objectPoolLength","_vertexPool","_vertexPoolLength","_face3Pool","_face3PoolLength","_face4Pool","_face4PoolLength","_linePool","_linePoolLength","_particlePool","_particlePoolLength","_renderData","sprites","lights","_vector3","_vector4","_clipBox","_boundingBox","_points3","_points4","_viewMatrix","_viewProjectionMatrix","_modelViewProjectionMatrix","_normalMatrix","_normalViewMatrix","_centroid","_frustum","_clippedVertex1PositionScreen","_clippedVertex2PositionScreen","projectVector","camera","matrixWorldInverse","projectionMatrix","unprojectVector","projectionMatrixInverse","pickingRay","getObject","getNextObjectInPool","projectObject","Light","Line","Sprite","projectGraph","root","sortObjects","painterSort","RenderableObject","getNextVertexInPool","vertex","RenderableVertex","getNextFace3InPool","RenderableFace3","getNextFace4InPool","RenderableFace4","getNextLineInPool","RenderableLine","getNextParticleInPool","particle","RenderableParticle","clipLine","alpha1","alpha2","bc1near","bc2near","bc1far","bc2far","projectScene","sortElements","o","ol","vl","nl","cl","ul","faceVertexNormals","faceVertexUvs","uvs","v4","autoUpdate","positionWorld","positionScreen","normalModel","normalModelView","centroidModel","centroid","vertexNormals","vertexNormalsModel","vertexNormalsModelView","vertexNormalsLength","step","LinePieces","vertexColors","colors","vertexTangents","Geometry","GeometryIdCount","normals","faceUvs","morphTargets","morphColors","morphNormals","skinWeights","skinIndices","lineDistances","boundingBox","hasTangents","dynamic","verticesNeedUpdate","elementsNeedUpdate","uvsNeedUpdate","normalsNeedUpdate","tangentsNeedUpdate","colorsNeedUpdate","lineDistancesNeedUpdate","buffersNeedUpdate","normalMatrix","jl","computeCentroids","computeFaceNormals","cb","ab","vA","vB","vC","computeVertexNormals","areaWeighted","__tmpVertices","vD","db","dc","computeMorphNormals","__originalFaceNormal","__originalVertexNormals","tmpGeo","faceNormals","dstNormalsFace","dstNormalsVertex","faceNormal","computeTangents","vertexIndex","uv","uvA","uvB","uvC","x1","y1","z1","t1","tan1","tan2","sdir","tdir","tmp2","handleTriangle","context","ua","ub","uc","computeLineDistances","computeBoundingBox","computeBoundingSphere","mergeVertices","key","indices","verticesMap","unique","changes","precisionPoints","pow","round","join","faceIndicesToRemove","dupIndex","newFace","uvCopy","dispose","BufferGeometry","attributes","offsets","positionArray","normalArray","normalizeNormals","positions","bb","nVertexElements","itemSize","numItems","pA","pB","pC","count","nVertices","nTangentElements","xA","yA","zA","xB","yB","zB","xC","yC","zC","uA","uB","uC","tangents","iA","iB","iC","n2","handleVertex","Camera","create","OrthographicCamera","updateProjectionMatrix","PerspectiveCamera","setLens","focalLength","frameHeight","atan","setViewOffset","fullWidth","fullHeight","width","height","light","AmbientLight","AreaLight","intensity","constantAttenuation","linearAttenuation","quadraticAttenuation","DirectionalLight","onlyShadow","shadowCameraNear","shadowCameraFar","shadowCameraLeft","shadowCameraRight","shadowCameraTop","shadowCameraBottom","shadowCameraVisible","shadowBias","shadowDarkness","shadowMapWidth","shadowMapHeight","shadowCascade","shadowCascadeOffset","shadowCascadeCount","shadowCascadeBias","shadowCascadeWidth","shadowCascadeHeight","shadowCascadeNearZ","shadowCascadeFarZ","shadowCascadeArray","shadowMap","shadowMapSize","shadowCamera","shadowMatrix","HemisphereLight","skyColorHex","groundColorHex","groundColor","PointLight","SpotLight","exponent","shadowCameraFov","Loader","showStatus","statusDomElement","addStatusElement","onLoadStart","onLoadProgress","onLoadComplete","crossOrigin","document","createElement","fontSize","textAlign","background","padding","zIndex","innerHTML","updateProgress","progress","message","loaded","toFixed","extractUrlBase","url","parts","split","pop","initMaterials","texturePath","createMaterial","needsTangents","ShaderMaterial","_this","is_pow2","LN2","nearest_pow2","load_image","where","image","Image","onload","getContext","drawImage","needsUpdate","src","create_texture","sourceFile","repeat","wrap","anisotropy","isCompressed","fullPath","texture","ImageUtils","loadCompressedTexture","Texture","wrapS","wrapT","wrapMap","rgb2hex","rgb","mtype","mpars","opacity","map","lightMap","normalMap","bumpMap","wireframe","shading","toLowerCase","blending","transparent","depthTest","depthWrite","flipSided","doubleSided","colorDiffuse","DbgColor","colorSpecular","specular","colorAmbient","ambient","transparency","specularCoef","shininess","mapDiffuse","mapDiffuseRepeat","mapDiffuseOffset","mapDiffuseWrap","mapDiffuseAnisotropy","mapLight","mapLightRepeat","mapLightOffset","mapLightWrap","mapLightAnisotropy","mapBump","mapBumpRepeat","mapBumpOffset","mapBumpWrap","mapBumpAnisotropy","mapNormal","mapNormalRepeat","mapNormalOffset","mapNormalWrap","mapNormalAnisotropy","mapSpecular","mapSpecularRepeat","mapSpecularOffset","mapSpecularWrap","mapSpecularAnisotropy","mapBumpScale","bumpScale","shader","ShaderLib","uniforms","UniformsUtils","mapNormalFactor","specularMap","parameters","fragmentShader","vertexShader","fog","DbgName","ImageLoader","load","scope","content","JSONLoader","withCredentials","loadAjaxJSON","callbackProgress","xhr","XMLHttpRequest","onreadystatechange","readyState","DONE","status","responseText","json","LOADING","getResponseHeader","HEADERS_RECEIVED","open","send","parseModel","isBitSet","fi","zLength","colorIndex","normalIndex","uvIndex","isQuad","hasMaterial","hasFaceUv","hasFaceVertexUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","uvLayer","nUvLayers","parseSkin","bones","animation","parseMorphing","dstVertices","srcVertices","dstColors","srcColors","LoadingMonitor","onLoad","loader","GeometryLoader","request","response","MaterialLoader","MeshBasicMaterial","MeshLambertMaterial","emissive","MeshPhongMaterial","MeshNormalMaterial","MeshDepthMaterial","SceneLoader","callbackSync","geometryHandlerMap","hierarchyHandlerMap","addGeometryHandler","callbackFinished","typeID","loaderClass","addHierarchyHandler","counter_models","counter_textures","total_models","total_textures","urlBase","target_array","data","geometries","face_materials","textures","cameras","fogs","empties","groups","transform","get_url","source_url","url_type","handle_objects","handle_children","mat","dst","pos","rot","scl","quat","objID","objJSON","loading","reservedTypes","loaderParameters","parType","options","urlBaseType","create_callback_hierachy","skin","SkinnedMesh","morph","MorphAnimMesh","duration","mirroredLoop","groupID","handle_mesh","geo","handle_hierarchy","node","create_callback_geometry","async_callback_gate","dae","create_callback_embed","totalModels","totalTextures","loadedModels","loadedTextures","finalize","ta","targetName","targetInverse","fogID","fogJSON","geoID","geoJSON","textureID","textureJSON","matID","matJSON","parID","callbackTexture","generateTextureCallback","traverse_json_hierarchy","objChildID","Fog","FogExp2","density","CubeGeometry","depth","widthSegments","heightSegments","depthSegments","PlaneGeometry","SphereGeometry","CylinderGeometry","topRad","botRad","radSegs","heightSegs","TorusGeometry","tube","segmentsR","segmentsT","IcosahedronGeometry","subdivisions","modelJson","embeds","texture_path","metadata","jsonLoader","model","mapping","url_array","loadCompressedTextureCube","loadTextureCube","fullUrl","textureCallback","loadTexture","minFilter","magFilter","diffuse","normalScale","envMap","reflectivity","displacementMap","displacementBias","displacementScale","materialArray","label","defaults","currentCamera","TextureLoader","Material","MaterialIdCount","blendSrc","blendDst","blendEquation","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","alphaTest","overdraw","setValues","values","newValue","currentValue","LineBasicMaterial","linewidth","linecap","linejoin","LineDashedMaterial","dashSize","gapSize","combine","refractionRatio","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","skinning","wrapAround","wrapRGB","metal","perPixel","ParticleBasicMaterial","sizeAttenuation","ParticleCanvasMaterial","program","defines","SpriteMaterial","useScreenCoordinates","scaleByViewport","alignment","SpriteAlignment","uvOffset","uvScale","topLeft","topCenter","topRight","centerLeft","centerRight","bottomLeft","bottomCenter","bottomRight","format","TextureIdCount","mipmaps","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","onUpdate","CompressedTexture","DataTexture","ParticleSystem","sortParticles","LineStrip","setGeometry","setMaterial","updateMorphTargets","morphTargetBase","morphTargetForcedOrder","morphTargetInfluences","morphTargetDictionary","ml","getMorphTargetIndexByName","bakeTransform","tempGeometry","GeometryUtils","merge","Bone","belongsToSkin","skinMatrix","update","parentSkinMatrix","forceUpdate","useVertexTexture","bone","gbone","identityMatrix","boneMatrices","rotq","addBone","nBones","boneTextureWidth","boneTextureHeight","boneTexture","pose","boneInverses","bl","offsetMatrix","sw","lastKeyframe","currentKeyframe","directionBackwards","setFrameRange","startKeyframe","endKeyframe","setDirectionForward","setDirectionBackward","parseAnimations","animations","firstAnimation","pattern","match","setAnimationLabel","playAnimation","fps","updateAnimation","frameTime","keyframe","mix","Ribbon","addLevel","rotation3d","overrideMaterial","__objects","__lights","__objectsAdded","__objectsRemoved","ai","CanvasRenderer","_elements","_lights","_canvasWidth","_canvasHeight","_canvasWidthHalf","_canvasHeightHalf","_camera","_v1","_v2","_v3","_v4","_v1x","_v1y","_v2x","_v2y","_v3x","_v3y","_v4x","_v4y","_v5x","_v5y","_v6x","_v6y","_near","_far","_image","_uvs","_uv1x","_uv1y","_uv2x","_uv2y","_uv3x","_uv3y","_pixelMap","_pixelMapContext","_pixelMapImage","_pixelMapData","_gradientMap","_gradientMapContext","_projector","_canvas","canvas","_context","_clearColor","_clearAlpha","_contextGlobalAlpha","_contextGlobalCompositeOperation","_contextStrokeStyle","_contextFillStyle","_contextLineWidth","_contextLineCap","_contextLineJoin","_contextDashSize","_contextGapSize","_v5","_v6","_color","_color1","_color2","_color3","_color4","_diffuseColor","_emissiveColor","_lightColor","_patterns","_imagedatas","_clearBox","_elemBox","_ambientLight","_directionalLights","_pointLights","_gradientMapQuality","calculateLights","ll","lightColor","calculateLight","lightPosition","amount","renderParticle","element","bitmap","bitmapWidth","bitmapHeight","setOpacity","setBlending","setFillStyle","save","rotate","fillRect","restore","setStrokeStyle","renderLine","beginPath","moveTo","lineTo","setLineWidth","setLineCap","setLineJoin","colorStyle1","colorStyle2","grad","createLinearGradient","addColorStop","exception","stroke","setDashAndGap","renderFace3","uv1","uv2","uv3","render","drawTriangle","getGradientTexture","clipImage","strokePath","fillPath","patternPath","renderFace4","v5","v6","drawQuad","x0","y0","closePath","x3","y3","fill","u0","u1","u2","repeatX","repeatY","createPattern","idet","offsetX","offsetY","getImageData","clip","color3","color4","putImageData","expand","globalAlpha","globalCompositeOperation","lineWidth","lineCap","lineJoin","strokeStyle","fillStyle","dashSizeValue","gapSizeValue","setLineDash","mozDash","domElement","devicePixelRatio","autoClear","supportsVertexTextures","setFaceCulling","setSize","updateStyle","setClearColor","setClearColorHex","getMaxAnisotropy","clear","setTransform","clearRect","el","ShaderChunk","fog_pars_fragment","fog_fragment","envmap_pars_fragment","envmap_fragment","envmap_pars_vertex","worldpos_vertex","envmap_vertex","map_particle_pars_fragment","map_particle_fragment","map_pars_vertex","map_pars_fragment","map_vertex","map_fragment","lightmap_pars_fragment","lightmap_pars_vertex","lightmap_fragment","lightmap_vertex","bumpmap_pars_fragment","normalmap_pars_fragment","specularmap_pars_fragment","specularmap_fragment","lights_lambert_pars_vertex","lights_lambert_vertex","lights_phong_pars_vertex","lights_phong_vertex","lights_phong_pars_fragment","lights_phong_fragment","color_pars_fragment","color_fragment","color_pars_vertex","color_vertex","skinning_pars_vertex","skinbase_vertex","skinning_vertex","morphtarget_pars_vertex","morphtarget_vertex","default_vertex","morphnormal_vertex","skinnormal_vertex","defaultnormal_vertex","shadowmap_pars_fragment","shadowmap_fragment","shadowmap_pars_vertex","shadowmap_vertex","alphatest_fragment","linear_to_gamma_fragment","merged","uniforms_src","parameter_src","uniforms_dst","UniformsLib","common","bump","normalmap","shadowmap","WebGLRenderer","_precision","_alpha","_premultipliedAlpha","premultipliedAlpha","_antialias","antialias","_stencil","stencil","_preserveDrawingBuffer","preserveDrawingBuffer","clearColor","clearAlpha","autoClearColor","autoClearDepth","autoClearStencil","autoUpdateObjects","gammaInput","gammaOutput","physicallyBasedShading","shadowMapEnabled","shadowMapAutoUpdate","shadowMapType","shadowMapCullFace","shadowMapDebug","shadowMapCascade","maxMorphTargets","maxMorphNormals","autoScaleCubemaps","renderPluginsPre","renderPluginsPost","memory","programs","calls","_gl","_glExtensionTextureFloat","_glExtensionStandardDerivatives","_glExtensionTextureFilterAnisotropic","_glExtensionCompressedTextureS3TC","_programs","_programs_counter","_currentProgram","_currentFramebuffer","_currentMaterialId","_currentGeometryGroupHash","_currentCamera","_geometryGroupCounter","_usedTextureUnits","_oldDoubleSided","_oldFlipSided","_oldBlending","_oldBlendEquation","_oldBlendSrc","_oldBlendDst","_oldDepthTest","_oldDepthWrite","_oldPolygonOffset","_oldPolygonOffsetFactor","_oldPolygonOffsetUnits","_oldLineWidth","_viewportX","_viewportY","_viewportWidth","_viewportHeight","_currentWidth","_currentHeight","_enabledAttributes","_projScreenMatrix","_projScreenMatrixPS","_direction","_lightsNeedUpdate","directional","distances","spot","directions","anglesCos","exponents","hemi","skyColors","groundColors","initGL","setDefaultGLState","_maxTextures","MAX_TEXTURE_IMAGE_UNITS","_maxVertexTextures","MAX_VERTEX_TEXTURE_IMAGE_UNITS","_maxCubemapSize","MAX_TEXTURE_SIZE","MAX_CUBE_MAP_TEXTURE_SIZE","_maxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","_supportsVertexTextures","_supportsBoneTextures","_vertexShaderPrecisionHighpFloat","COMPRESSED_TEXTURE_FORMATS","getShaderPrecisionFormat","VERTEX_SHADER","HIGH_FLOAT","_vertexShaderPrecisionMediumpFloat","MEDIUM_FLOAT","_fragmentShaderPrecisionHighpFloat","LOW_FLOAT","FRAGMENT_SHADER","_fragmentShaderPrecisionMediumpFloat","highpAvailable","HIGH_INT","MEDIUM_INT","LOW_INT","mediumpAvailable","createParticleBuffers","__webglVertexBuffer","createBuffer","__webglColorBuffer","createLineBuffers","__webglLineDistanceBuffer","createRibbonBuffers","__webglNormalBuffer","createMeshBuffers","geometryGroup","__webglTangentBuffer","__webglUVBuffer","__webglUV2Buffer","__webglSkinIndicesBuffer","__webglSkinWeightsBuffer","__webglFaceBuffer","__webglLineBuffer","numMorphTargets","__webglMorphTargetsBuffers","numMorphNormals","__webglMorphNormalsBuffers","supportsFloatTextures","supportsStandardDerivatives","supportsCompressedTextureS3TC","getPrecision","setViewport","viewport","setScissor","scissor","enableScissorTest","enable","SCISSOR_TEST","disable","getClearColor","getClearAlpha","bits","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","clearTarget","renderTarget","setRenderTarget","addPostPlugin","plugin","init","addPrePlugin","updateShadowMap","shadowMapPlugin","onGeometryDispose","deallocateGeometry","onTextureDispose","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","onMaterialDispose","deallocateMaterial","__webglInit","deleteBuffer","geometryGroups","deleteCustomAttributesBuffers","__webglTextureCube","deleteTexture","__webglTexture","WebGLRenderTargetCube","deleteFramebuffer","__webglFramebuffer","deleteRenderbuffer","__webglRenderbuffer","programInfo","deleteProgram","usedTimes","newPrograms","__webglCustomAttributesList","buffer","initCustomAttributes","nvertices","attribute","__webglInitialized","createUniqueBuffers","belongsToAttribute","initParticleBuffers","__vertexArray","__colorArray","__sortArray","__webglParticleCount","initLineBuffers","__lineDistanceArray","__webglLineCount","initRibbonBuffers","__normalArray","__webglVertexCount","initMeshBuffers","faces3","faces4","ntris","nlines","getBufferMaterial","uvType","bufferGuessUVType","normalType","bufferGuessNormalType","vertexColorType","bufferGuessVertexColorType","__tangentArray","__uvArray","__uv2Array","__skinIndexArray","__skinWeightArray","__faceArray","Uint16Array","__lineArray","__morphTargetsArrays","__morphNormalsArrays","__webglFaceCount","originalAttribute","property","__original","__inittedArrays","materialNeedsSmoothNormals","initDirectBuffers","ELEMENT_ARRAY_BUFFER","ARRAY_BUFFER","bindBuffer","bufferData","STATIC_DRAW","setParticleBuffers","hint","ca","cal","customAttribute","vertexArray","colorArray","sortArray","dirtyVertices","dirtyColors","customAttributes","numericalSort","boundTo","setLineBuffers","dl","lineDistanceArray","dirtyLineDistances","setRibbonBuffers","dirtyNormals","setMeshBuffers","faceColor","t4","n1","n3","n4","c4","sw1","sw2","sw3","sw4","si1","si2","si3","si4","vn","uvi","uv2i","vk","vkl","vka","nka","chf","needsSmoothNormals","offset_uv","offset_uv2","offset_face","offset_normal","offset_tangent","offset_line","offset_color","offset_skin","offset_morphTarget","offset_custom","uvArray","uv2Array","tangentArray","skinIndexArray","skinWeightArray","morphTargetsArrays","morphNormalsArrays","faceArray","lineArray","dirtyElements","dirtyUvs","dirtyTangents","dirtyMorphTargets","morphTargetsNeedUpdate","chunk_faces3","chunk_faces4","obj_faces","obj_uvs","obj_uvs2","obj_skinIndices","obj_skinWeights","pp","setDirectBuffers","attributeName","attributeItem","enableAttribute","enableVertexAttribArray","disableAttributes","disableVertexAttribArray","setupMorphTargets","vertexAttribPointer","FLOAT","influences","numSupportedMorphTargets","__webglMorphTargetInfluences","influence","activeInfluenceIndices","numSupportedMorphNormals","influenceIndex","uniform1fv","painterSortStable","renderPlugins","plugins","renderObjects","renderList","reverse","materialType","useBlending","webglObject","setDepthTest","setDepthWrite","setPolygonOffset","setMaterialFaces","renderBufferDirect","renderBuffer","renderObjectsImmediate","renderImmediateObject","unrollImmediateBufferMaterial","globject","opaque","unrollBufferMaterial","meshMaterial","sortFacesByMaterial","groupHash","hash_map","usesFaceMaterial","hash","counter","geometryGroupsList","addObject","_modelViewMatrix","__webglActive","addBuffer","__webglObjects","ImmediateRenderObject","immediateRenderCallback","addBufferImmediate","__webglObjectsImmediate","__webglSprites","LensFlare","__webglFlares","objlist","updateObject","customAttributesDirty","DYNAMIC_DRAW","areCustomAttributesDirty","clearCustomAttributes","removeObject","removeInstances","removeInstancesDirect","setMaterialShaders","shaders","setProgram","initMaterial","refreshMaterial","p_uniforms","m_uniforms","useProgram","uniformMatrix4fv","textureUnit","getTextureUnit","uniform1i","setTexture","boneGlobalMatrices","refreshUniformsFog","setupLights","refreshUniformsLights","refreshUniformsCommon","refreshUniformsLine","refreshUniformsDash","refreshUniformsParticle","refreshUniformsPhong","refreshUniformsLambert","mNear","mFar","_shadowPass","refreshUniformsShadow","loadUniformsGeneric","uniformsList","cameraPosition","uniform3f","viewMatrix","loadUniformsMatrices","modelMatrix","uvScaleMap","offsetRepeat","flipEnvMap","useRefract","totalSize","psColor","fogColor","fogNear","fogFar","fogDensity","ambientLightColor","directionalLightColor","directionalLightDirection","pointLightColor","pointLightPosition","pointLightDistance","spotLightColor","spotLightPosition","spotLightDistance","spotLightDirection","spotLightAngleCos","spotLightExponent","hemisphereLightSkyColor","hemisphereLightGroundColor","hemisphereLightDirection","modelViewMatrix","uniformMatrix3fv","uniform","location","uniform1f","uniform2f","uniform4f","uniform1iv","uniform3iv","uniform3fv","_array","uniform2fv","uniform4fv","setCubeTexture","setCubeTextureDynamic","setupMatrices","setColorGamma","intensitySq","setColorLinear","skyColor","zlights","dirColors","dirPositions","pointColors","pointPositions","pointDistances","spotColors","spotPositions","spotDistances","spotDirections","spotAnglesCos","spotExponents","hemiSkyColors","hemiGroundColors","hemiPositions","dirLength","pointLength","spotLength","hemiLength","dirCount","pointCount","spotCount","hemiCount","dirOffset","pointOffset","spotOffset","hemiOffset","polygonoffset","factor","units","POLYGON_OFFSET_FILL","generateDefines","chunk","buildProgram","shaderID","pl","code","shadowMapTypeDefine","customDefines","createProgram","identifiers","prefix_vertex","maxDirLights","maxPointLights","maxSpotLights","maxHemiLights","maxShadows","maxBones","prefix_fragment","useFog","fogExp","glVertexShader","getShader","glFragmentShader","attachShader","linkProgram","getProgramParameter","LINK_STATUS","VALIDATE_STATUS","getError","deleteShader","cacheUniformLocations","cacheAttributeLocations","getUniformLocation","getAttribLocation","addLineNumbers","string","createShader","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","isPowerOfTwo","setTextureParameters","textureType","isImagePowerOfTwo","texParameteri","TEXTURE_WRAP_S","paramThreeToGL","TEXTURE_WRAP_T","TEXTURE_MAG_FILTER","TEXTURE_MIN_FILTER","CLAMP_TO_EDGE","filterFallback","__oldAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","clampToMaxSize","maxSize","maxDimension","newWidth","newHeight","ctx","slot","createTexture","activeTexture","TEXTURE0","bindTexture","TEXTURE_CUBE_MAP","pixelStorei","UNPACK_FLIP_Y_WEBGL","cubeImage","glFormat","glType","mipmap","compressedTexImage2D","TEXTURE_CUBE_MAP_POSITIVE_X","texImage2D","generateMipmap","setupFrameBuffer","framebuffer","textureTarget","bindFramebuffer","FRAMEBUFFER","framebufferTexture2D","COLOR_ATTACHMENT0","setupRenderBuffer","renderbuffer","bindRenderbuffer","RENDERBUFFER","depthBuffer","stencilBuffer","renderbufferStorage","DEPTH_COMPONENT16","framebufferRenderbuffer","DEPTH_ATTACHMENT","DEPTH_STENCIL","DEPTH_STENCIL_ATTACHMENT","RGBA4","updateRenderTargetMipmap","TEXTURE_2D","NEAREST","LINEAR","REPEAT","MIRRORED_REPEAT","NEAREST_MIPMAP_NEAREST","NEAREST_MIPMAP_LINEAR","LINEAR_MIPMAP_NEAREST","LINEAR_MIPMAP_LINEAR","UNSIGNED_BYTE","UNSIGNED_SHORT_4_4_4_4","UNSIGNED_SHORT_5_5_5_1","UNSIGNED_SHORT_5_6_5","BYTE","SHORT","UNSIGNED_SHORT","INT","UNSIGNED_INT","ALPHA","RGB","RGBA","LUMINANCE","LUMINANCE_ALPHA","FUNC_ADD","FUNC_SUBTRACT","FUNC_REVERSE_SUBTRACT","ZERO","ONE","SRC_COLOR","ONE_MINUS_SRC_COLOR","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","DST_ALPHA","ONE_MINUS_DST_ALPHA","DST_COLOR","ONE_MINUS_DST_COLOR","SRC_ALPHA_SATURATE","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","allocateBones","nVertexUniforms","MAX_VERTEX_UNIFORM_VECTORS","nVertexMatrices","allocateLights","dirLights","pointLights","spotLights","hemiLights","allocateShadows","getExtension","clearDepth","clearStencil","DEPTH_TEST","depthFunc","LEQUAL","frontFace","CCW","cullFace","BACK","CULL_FACE","BLEND","blendFunc","renderBufferImmediate","hasPositions","hasNormals","hasUvs","__webglUvBuffer","hasColors","nx","ny","nz","nax","nbx","ncx","nay","nby","ncy","naz","nbz","ncz","drawArrays","TRIANGLES","programAttributes","geometryAttributes","attributePointer","attributeSize","updateBuffers","wireframeBit","geometryHash","startIndex","drawElements","POINTS","LINE_STRIP","primitives","geometryGroupHash","tangent","skinIndex","skinWeight","lineDistance","LINES","TRIANGLE_STRIP","forceClear","initWebGLObjects","maxLightCount","base","frontFaceDirection","CW","FRONT","FRONT_AND_BACK","depthMask","blendEquationSeparate","blendFuncSeparate","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","vx","vy","isCube","isTargetPowerOfTwo","createFramebuffer","createRenderbuffer","shareDepthFrom","activeCubeFace","ShadowMapPlugin","SpritePlugin","LensFlarePlugin","WebGLRenderTarget","geometry1","object2","materialIndexOffset","vertexOffset","geometry2","vertices1","vertices2","faces1","faces2","uvs1","uvs2","vertexCopy","faceCopy","faceVertexColors","removeMaterials","materialIndexArray","materialIndexMap","newFaces","randomPointInTriangle","vectorA","vectorB","vectorC","__v1","randomPointInFace","useCachedAreas","area1","area2","_area1","_area2","triangleArea","randomPointsInGeometry","totalArea","cumulativeAreas","_area","binarySearchIndices","binarySearch","mid","stats","tmp1","__v2","normalizeUVs","uvSet","triangulateQuads","triA","triB","uvD","uvsTriA","uvsTriB","faceUv","setMaterialIndex","startFace","endFace","onError","dds","parseDDS","onerror","responseType","images","loadCount","generateCubeFaceCallback","rq","img","isCubemap","mipmapCount","loadMipmaps","DDS_MAGIC","DDSD_MIPMAPCOUNT","DDSCAPS2_CUBEMAP","DDPF_FOURCC","fourCCToInt32","charCodeAt","int32ToFourCC","fromCharCode","blockBytes","FOURCC_DXT1","FOURCC_DXT3","FOURCC_DXT5","headerLengthInt","off_magic","off_size","off_flags","off_height","off_width","off_mipmapCount","off_pfFlags","off_pfFourCC","off_caps2","header","fourCC","dataOffset","dataLength","byteArray","Uint8Array","getNormalMap","subtract","imageData","createImageData","output","ly","uy","lx","ux","num_points","idx","generateDataTexture","SceneUtils","createMultiMaterialObject","group","detach","attach","FontUtils","divisions","getFace","loadFace","family","familyName","ThreeFont","cssFontWeight","cssFontStyle","drawText","text","resolution","chars","fontPaths","path","Path","ret","extractGlyphPoints","paths","outline","action","cpx","cpy","cpx0","cpy0","cpx1","cpy1","cpx2","cpy2","laste","pts","glyph","glyphs","_cachedOutline","quadraticCurveTo","Shape","Utils","bezierCurveTo","b3","ha","generateShapes","curveSegments","font","shapes","toShapes","namespace","EPSILON","contour","verts","vertIndices","nv","snip","ax","ay","bx","by","cx","cy","px","py","aX","aY","bX","bY","cX","cY","apx","apy","bpx","bpy","cCROSSap","bCROSScp","aCROSSbp","Triangulate","_typeface_js","typeface_js","Curve","getPointAt","getUtoTmapping","getPoints","getSpacedPoints","lengths","getLengths","cacheArcLengths","current","cache","last","sum","updateArcLengths","targetArcLength","arcLengths","comparison","lengthBefore","lengthAfter","segmentLength","segmentFraction","getTangent","pt1","pt2","vec","getTangentAt","LineCurve","QuadraticBezierCurve","tangentQuadraticBezier","CubicBezierCurve","tangentCubicBezier","SplineCurve","EllipseCurve","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","deltaAngle","ArcCurve","aRadius","tangentSpline","h00","h10","h01","h11","getPointFunc","LineCurve3","QuadraticBezierCurve3","tz","CubicBezierCurve3","SplineCurve3","pt0","pt3","ClosedSplineCurve3","CurvePath","curves","bends","autoClose","curve","checkConnection","startPoint","endPoint","curveLengths","getCurveLengths","lens","cacheLengths","sums","maxX","maxY","maxZ","minX","minY","minZ","Number","NEGATIVE_INFINITY","POSITIVE_INFINITY","createPointsGeometry","createGeometry","createSpacedPointsGeometry","addWrapPath","bendpath","getTransformedPoints","segments","oldPts","getWrapPoints","getTransformedSpacedPoints","oldX","oldY","xNorm","bounds","pathPt","getNormalVector","Gyroscope","translationWorld","rotationWorld","scaleWorld","translationObject","rotationObject","scaleObject","actions","fromPoints","PathActions","MOVE_TO","LINE_TO","QUADRATIC_CURVE_TO","BEZIER_CURVE_TO","CSPLINE_THRU","ARC","ELLIPSE","vectors","vlen","args","arguments","lastargs","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","splineThru","npts","arc","absarc","absellipse","ellipse","lastPoint","closedPath","useSpacedPoints","item","spts","concat","spline","tdivisions","subPaths","lastPath","tmpPath","tmpShape","holesFirst","isClockWise","holes","extrude","extruded","ExtrudeGeometry","makeGeometry","ShapeGeometry","getPointsHoles","holesPts","getSpacedPointsHoles","extractAllPoints","shape","extractPoints","extractAllSpacedPoints","removeHoles","prevShapeVert","prevHoleVert","holeIndex","shapeIndex","h2","hole","shortest","pts1","pts2","tmpShape1","tmpShape2","tmpHole1","tmpHole2","allpoints","dist","areaapts","areaa","areabpts","areab","shapeOffset","holeOffset","oldShapeIndex","oldHoleIndex","areaa2","areab2","trianglea","triangleb","isolatedPts","triangulateShape","shapeWithoutHoles","triangles","allPointsMap","b2p0","b2p1","b2p2","b3p0","b3p1","b3p2","b3p3","AnimationHandler","playing","library","that","deltaTimeMS","initData","hierarchy","parseRecurseHierarchy","initialized","usedMorphTargets","morphTargetName","morphTargetsInfluences","lengthInFrames","JIT","CATMULLROM","CATMULLROM_FORWARD","Animation","interpolationType","get","currentTime","timeScale","isPlaying","isPaused","loop","play","startTimeMS","hl","animationCache","prevKey","nextKey","originalMatrix","getNextKeyWith","addToUpdate","pause","removeFromUpdate","prevXYZ","nextXYZ","unloopedCurrentTime","currentPoint","forwardPoint","types","getPrevKeyWith","interpolateCatmullRom","KeyFrameAnimation","JITCompile","sids","sid","next","startTimeMs","endTime","original","frame","looped","JIThierarchy","lastIndex","prev","hasTarget","CubeCamera","cubeResolution","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","updateCubeMap","renderer","CombinedCamera","orthoNear","orthoFar","cameraO","cameraP","zoom","toPerspective","inPerspectiveMode","inOrthographicMode","toOrthographic","hyperfocus","halfHeight","planeHeight","planeWidth","halfWidth","setFov","setZoom","toFrontView","toBackView","toLeftView","toRightView","toTopView","toBottomView","CircleGeometry","thetaStart","thetaLength","centerUV","segment","width_half","height_half","depth_half","buildPlane","udir","vdir","gridX","gridY","gridX1","gridY1","segment_width","segment_height","radiusTop","radiusBottom","radiusSegments","openEnded","heightHalf","verticesRow","uvsRow","na","nb","tanTheta","uv4","shapebb","addShapeList","addShape","extrudePts","splineTube","binormal","position2","ahole","bevelThickness","bevelSize","bevelSegments","bevelEnabled","steps","extrudePath","extrudeByPath","extrudeMaterial","uvgen","UVGenerator","WorldUVGenerator","frames","TubeGeometry","FrenetFrames","shapesOffset","shapePoints","scalePt2","pt","bs","vert","flen","getBevelVec","pt_i","pt_j","pt_k","getBevelVec2","getBevelVec1","anglea","angleb","anglec","v_dot_w_hat","q_sub_p_dot_w_hat","intersection","v_hat","__v3","w_hat","__v4","__v5","__v6","contourMovements","oneHoleMovements","holesMovements","verticesMovements","binormals","buildLidFaces","layer","f3","buildSideFaces","layeroffset","sidewalls","slen1","slen2","f4","isBottom","generateBottomUV","generateTopUV","wallContour","stepIndex","stepsLength","contourIndex1","contourIndex2","generateSideWallUV","extrudedShape","extrudeOptions","indexA","indexB","indexC","indexD","az","bz","cz","LatheGeometry","phiStart","phiLength","inversePointLength","inverseSegments","phi","np","gridZ","gridZ1","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","radiusStep","thetaSegment","TextGeometry","textShapes","radialSegments","tubularSegments","TorusKnotGeometry","heightScale","grid","tang","bitan","getPos","ip","jp","uva","uvb","uvc","uvd","in_q","in_p","cu","su","quOverP","cs","closed","numpoints","pos2","ArrowHelper","smallest","initialNormal3","MAX_VALUE","PolyhedronGeometry","detail","prepare","subdivide","azimuth","inclination","make","azi","correctUV","cols","aj","bj","rows","OctahedronGeometry","TetrahedronGeometry","ParametricGeometry","func","slices","stacks","useTris","sliceCount","ConvexGeometry","addPoint","vertexId","mag","randomOffset","edge","boundary","equalEdge","va","vb","vc","ea","eb","vertexUv","newId","AxisHelper","dir","lineGeometry","coneGeometry","cone","setDirection","setColor","BoxHelper","CameraHelper","pointMap","hexFrustum","hexCone","hexUp","hexTarget","hexCross","addLine","projector","setPoint","DirectionalLightHelper","sphereSize","lightSphere","targetLine","FaceNormalsHelper","GridHelper","HemisphereLightHelper","arrowLength","domeSize","materialSky","materialGround","PointLightHelper","SpotLightHelper","lightCone","coneLength","coneWidth","renderCallback","lensFlares","customUpdateCallback","updateLensFlares","flare","vecX","vecY","wantedRotation","MorphBlendMesh","animationsMap","animationsList","numFrames","startFrame","endFrame","createAnimation","setAnimationWeight","lastFrame","currentFrame","active","autoCreateAnimations","frameRanges","setAnimationDirectionForward","setAnimationDirectionBackward","setAnimationFPS","setAnimationDuration","setAnimationTime","getAnimationTime","getAnimationDuration","stopAnimation","_renderer","_lensFlare","prefix","vertexBuffer","elementBuffer","tempTexture","occlusionTexture","hasVertexTexture","ShaderFlares","renderType","occlusionMap","screenPosition","viewportWidth","viewportHeight","flares","nFlares","sprite","tempPosition","invAspect","halfViewportWidth","halfViewportHeight","screenPositionPixels","TEXTURE1","copyTexImage2D","_depthMaterial","_depthMaterialMorph","_depthMaterialSkin","_depthMaterialMorphSkin","_min","_max","_matrixPosition","createVirtualLight","cascade","virtualLight","isVirtual","pointsWorld","pointsFrustum","nearZ","farZ","updateVirtualLight","updateShadowCamera","__projector","getObjectMaterial","depthShader","depthUniforms","originalCamera","gyro","shadowFilter","pars","cameraHelper","objectMaterial","useMorphing","useSkinning","customDepthMaterial","_sprite","ShaderSprite","fogType","nSprites","oldFogType","sceneFogType","DepthPassPlugin","enabled","module","exports","ref","interval","timeout","computed","langCanvasLoad","$store","state","mounted","$nextTick","unmounted","methods","clearInterval","container","particles","SEPARATION","AMOUNTX","AMOUNTY","mouseX","mouseY","lookOvar","windowHalfX","innerWidth","windowHalfY","innerHeight","animate","setInterval","onWindowResize","$refs","offsetWidth","offsetHeight","PI2","appendChild","getElementById","onDocumentMouseMove","clientX","clientY","__exports__"],"mappings":"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","file":"js/chunk-6b685705.1700529706612.js","sourcesContent":["\r\nvar window = window || {};\r\nvar self = self || {};\r\n\r\n// High-resulution counter: emulate window.performance.now() for THREE.CLOCK\r\nif( window.performance === undefined ) {\r\n\r\n\twindow.performance = { };\r\n\r\n}\r\n\r\nif( window.performance.now === undefined ) {\r\n\r\n\t// check if we are in a Node.js environment\r\n\tif( ( process !== undefined ) && ( process.hrtime !== undefined ) ) {\r\n\r\n\t\twindow.performance.now = function () {\r\n\r\n\t\t\tvar time = process.hrtime();\r\n\t\t\treturn ( time[0] + time[1] / 1e9 ) * 1000;\r\n\r\n\t\t};\r\n\r\n\t}\r\n\t// if not Node.js revert to using the Date class\r\n\telse {\r\n\r\n\t\twindow.performance.now = function() {\r\n\r\n\t\t\treturn new Date().getTime();\r\n\r\n\t\t};\r\n\r\n\t}\r\n\r\n}\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author Larry Battle / http://bateru.com/news\r\n */\r\n\r\nvar THREE = THREE || { REVISION: '59dev' };\r\n\r\nself.console = self.console || {\r\n\r\n\tinfo: function () {},\r\n\tlog: function () {},\r\n\tdebug: function () {},\r\n\twarn: function () {},\r\n\terror: function () {}\r\n\r\n};\r\n\r\nself.Int32Array = self.Int32Array || Array;\r\nself.Float32Array = self.Float32Array || Array;\r\n\r\nString.prototype.trim = String.prototype.trim || function () {\r\n\r\n\treturn this.replace( /^\\s+|\\s+$/g, '' );\r\n\r\n};\r\n\r\n// based on https://github.com/documentcloud/underscore/blob/bf657be243a075b5e72acc8a83e6f12a564d8f55/underscore.js#L767\r\nTHREE.extend = function ( obj, source ) {\r\n\r\n\t// ECMAScript5 compatibility based on: http://www.nczonline.net/blog/2012/12/11/are-your-mixins-ecmascript-5-compatible/\r\n\tif ( Object.keys ) {\r\n\r\n\t\tvar keys = Object.keys( source );\r\n\r\n\t\tfor (var i = 0, il = keys.length; i < il; i++) {\r\n\r\n\t\t\tvar prop = keys[i];\r\n\t\t\tObject.defineProperty( obj, prop, Object.getOwnPropertyDescriptor( source, prop ) );\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\tvar safeHasOwnProperty = {}.hasOwnProperty;\r\n\r\n\t\tfor ( var prop in source ) {\r\n\r\n\t\t\tif ( safeHasOwnProperty.call( source, prop ) ) {\r\n\r\n\t\t\t\tobj[prop] = source[prop];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn obj;\r\n\r\n};\r\n\r\n// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\r\n\r\n// requestAnimationFrame polyfill by Erik Möller\r\n// fixes from Paul Irish and Tino Zijdel\r\n\r\n( function () {\r\n\r\n\tvar lastTime = 0;\r\n\tvar vendors = [ 'ms', 'moz', 'webkit', 'o' ];\r\n\r\n\tfor ( var x = 0; x < vendors.length && !window.requestAnimationFrame; ++ x ) {\r\n\r\n\t\twindow.requestAnimationFrame = window[ vendors[ x ] + 'RequestAnimationFrame' ];\r\n\t\twindow.cancelAnimationFrame = window[ vendors[ x ] + 'CancelAnimationFrame' ] || window[ vendors[ x ] + 'CancelRequestAnimationFrame' ];\r\n\r\n\t}\r\n\r\n\tif ( window.requestAnimationFrame === undefined ) {\r\n\r\n\t\twindow.requestAnimationFrame = function ( callback ) {\r\n\r\n\t\t\tvar currTime = Date.now(), timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) );\r\n\t\t\tvar id = window.setTimeout( function() { callback( currTime + timeToCall ); }, timeToCall );\r\n\t\t\tlastTime = currTime + timeToCall;\r\n\t\t\treturn id;\r\n\r\n\t\t};\r\n\r\n\t}\r\n\r\n\twindow.cancelAnimationFrame = window.cancelAnimationFrame || function ( id ) { window.clearTimeout( id ) };\r\n\r\n}() );\r\n\r\n// GL STATE CONSTANTS\r\n\r\nTHREE.CullFaceNone = 0;\r\nTHREE.CullFaceBack = 1;\r\nTHREE.CullFaceFront = 2;\r\nTHREE.CullFaceFrontBack = 3;\r\n\r\nTHREE.FrontFaceDirectionCW = 0;\r\nTHREE.FrontFaceDirectionCCW = 1;\r\n\r\n// SHADOWING TYPES\r\n\r\nTHREE.BasicShadowMap = 0;\r\nTHREE.PCFShadowMap = 1;\r\nTHREE.PCFSoftShadowMap = 2;\r\n\r\n// MATERIAL CONSTANTS\r\n\r\n// side\r\n\r\nTHREE.FrontSide = 0;\r\nTHREE.BackSide = 1;\r\nTHREE.DoubleSide = 2;\r\n\r\n// shading\r\n\r\nTHREE.NoShading = 0;\r\nTHREE.FlatShading = 1;\r\nTHREE.SmoothShading = 2;\r\n\r\n// colors\r\n\r\nTHREE.NoColors = 0;\r\nTHREE.FaceColors = 1;\r\nTHREE.VertexColors = 2;\r\n\r\n// blending modes\r\n\r\nTHREE.NoBlending = 0;\r\nTHREE.NormalBlending = 1;\r\nTHREE.AdditiveBlending = 2;\r\nTHREE.SubtractiveBlending = 3;\r\nTHREE.MultiplyBlending = 4;\r\nTHREE.CustomBlending = 5;\r\n\r\n// custom blending equations\r\n// (numbers start from 100 not to clash with other\r\n// mappings to OpenGL constants defined in Texture.js)\r\n\r\nTHREE.AddEquation = 100;\r\nTHREE.SubtractEquation = 101;\r\nTHREE.ReverseSubtractEquation = 102;\r\n\r\n// custom blending destination factors\r\n\r\nTHREE.ZeroFactor = 200;\r\nTHREE.OneFactor = 201;\r\nTHREE.SrcColorFactor = 202;\r\nTHREE.OneMinusSrcColorFactor = 203;\r\nTHREE.SrcAlphaFactor = 204;\r\nTHREE.OneMinusSrcAlphaFactor = 205;\r\nTHREE.DstAlphaFactor = 206;\r\nTHREE.OneMinusDstAlphaFactor = 207;\r\n\r\n// custom blending source factors\r\n\r\n//THREE.ZeroFactor = 200;\r\n//THREE.OneFactor = 201;\r\n//THREE.SrcAlphaFactor = 204;\r\n//THREE.OneMinusSrcAlphaFactor = 205;\r\n//THREE.DstAlphaFactor = 206;\r\n//THREE.OneMinusDstAlphaFactor = 207;\r\nTHREE.DstColorFactor = 208;\r\nTHREE.OneMinusDstColorFactor = 209;\r\nTHREE.SrcAlphaSaturateFactor = 210;\r\n\r\n\r\n// TEXTURE CONSTANTS\r\n\r\nTHREE.MultiplyOperation = 0;\r\nTHREE.MixOperation = 1;\r\nTHREE.AddOperation = 2;\r\n\r\n// Mapping modes\r\n\r\nTHREE.UVMapping = function () {};\r\n\r\nTHREE.CubeReflectionMapping = function () {};\r\nTHREE.CubeRefractionMapping = function () {};\r\n\r\nTHREE.SphericalReflectionMapping = function () {};\r\nTHREE.SphericalRefractionMapping = function () {};\r\n\r\n// Wrapping modes\r\n\r\nTHREE.RepeatWrapping = 1000;\r\nTHREE.ClampToEdgeWrapping = 1001;\r\nTHREE.MirroredRepeatWrapping = 1002;\r\n\r\n// Filters\r\n\r\nTHREE.NearestFilter = 1003;\r\nTHREE.NearestMipMapNearestFilter = 1004;\r\nTHREE.NearestMipMapLinearFilter = 1005;\r\nTHREE.LinearFilter = 1006;\r\nTHREE.LinearMipMapNearestFilter = 1007;\r\nTHREE.LinearMipMapLinearFilter = 1008;\r\n\r\n// Data types\r\n\r\nTHREE.UnsignedByteType = 1009;\r\nTHREE.ByteType = 1010;\r\nTHREE.ShortType = 1011;\r\nTHREE.UnsignedShortType = 1012;\r\nTHREE.IntType = 1013;\r\nTHREE.UnsignedIntType = 1014;\r\nTHREE.FloatType = 1015;\r\n\r\n// Pixel types\r\n\r\n//THREE.UnsignedByteType = 1009;\r\nTHREE.UnsignedShort4444Type = 1016;\r\nTHREE.UnsignedShort5551Type = 1017;\r\nTHREE.UnsignedShort565Type = 1018;\r\n\r\n// Pixel formats\r\n\r\nTHREE.AlphaFormat = 1019;\r\nTHREE.RGBFormat = 1020;\r\nTHREE.RGBAFormat = 1021;\r\nTHREE.LuminanceFormat = 1022;\r\nTHREE.LuminanceAlphaFormat = 1023;\r\n\r\n// Compressed texture formats\r\n\r\nTHREE.RGB_S3TC_DXT1_Format = 2001;\r\nTHREE.RGBA_S3TC_DXT1_Format = 2002;\r\nTHREE.RGBA_S3TC_DXT3_Format = 2003;\r\nTHREE.RGBA_S3TC_DXT5_Format = 2004;\r\n\r\n/*\r\n// Potential future PVRTC compressed texture formats\r\nTHREE.RGB_PVRTC_4BPPV1_Format = 2100;\r\nTHREE.RGB_PVRTC_2BPPV1_Format = 2101;\r\nTHREE.RGBA_PVRTC_4BPPV1_Format = 2102;\r\nTHREE.RGBA_PVRTC_2BPPV1_Format = 2103;\r\n*/\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Color = function ( value ) {\r\n\r\n\tif ( value !== undefined ) this.set( value );\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\nTHREE.Color.prototype = {\r\n\r\n\tconstructor: THREE.Color,\r\n\r\n\tr: 1, g: 1, b: 1,\r\n\r\n\tset: function ( value ) {\r\n\r\n\t\tif ( value instanceof THREE.Color ) {\r\n\r\n\t\t\tthis.copy( value );\r\n\r\n\t\t} else if ( typeof value === 'number' ) {\r\n\r\n\t\t\tthis.setHex( value );\r\n\r\n\t\t} else if ( typeof value === 'string' ) {\r\n\r\n\t\t\tthis.setStyle( value );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetHex: function ( hex ) {\r\n\r\n\t\thex = Math.floor( hex );\r\n\r\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\r\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\r\n\t\tthis.b = ( hex & 255 ) / 255;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetRGB: function ( r, g, b ) {\r\n\r\n\t\tthis.r = r;\r\n\t\tthis.g = g;\r\n\t\tthis.b = b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetHSL: function ( h, s, l ) {\r\n\r\n\t\t// h,s,l ranges are in 0.0 - 1.0\r\n\r\n\t\tif ( s === 0 ) {\r\n\r\n\t\t\tthis.r = this.g = this.b = l;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar hue2rgb = function ( p, q, t ) {\r\n\r\n\t\t\t\tif ( t < 0 ) t += 1;\r\n\t\t\t\tif ( t > 1 ) t -= 1;\r\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\r\n\t\t\t\tif ( t < 1 / 2 ) return q;\r\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\r\n\t\t\t\treturn p;\r\n\r\n\t\t\t};\r\n\r\n\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\r\n\t\t\tvar q = ( 2 * l ) - p;\r\n\r\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\r\n\t\t\tthis.g = hue2rgb( q, p, h );\r\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetStyle: function ( style ) {\r\n\r\n\t\t// rgb(255,0,0)\r\n\r\n\t\tif ( /^rgb\\((\\d+),(\\d+),(\\d+)\\)$/i.test( style ) ) {\r\n\r\n\t\t\tvar color = /^rgb\\((\\d+),(\\d+),(\\d+)\\)$/i.exec( style );\r\n\r\n\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\r\n\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\r\n\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\t// rgb(100%,0%,0%)\r\n\r\n\t\tif ( /^rgb\\((\\d+)\\%,(\\d+)\\%,(\\d+)\\%\\)$/i.test( style ) ) {\r\n\r\n\t\t\tvar color = /^rgb\\((\\d+)\\%,(\\d+)\\%,(\\d+)\\%\\)$/i.exec( style );\r\n\r\n\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\r\n\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\r\n\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\t// #ff0000\r\n\r\n\t\tif ( /^\\#([0-9a-f]{6})$/i.test( style ) ) {\r\n\r\n\t\t\tvar color = /^\\#([0-9a-f]{6})$/i.exec( style );\r\n\r\n\t\t\tthis.setHex( parseInt( color[ 1 ], 16 ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\t// #f00\r\n\r\n\t\tif ( /^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test( style ) ) {\r\n\r\n\t\t\tvar color = /^\\#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec( style );\r\n\r\n\t\t\tthis.setHex( parseInt( color[ 1 ] + color[ 1 ] + color[ 2 ] + color[ 2 ] + color[ 3 ] + color[ 3 ], 16 ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\t// red\r\n\r\n\t\tif ( /^(\\w+)$/i.test( style ) ) {\r\n\r\n\t\t\tthis.setHex( THREE.ColorKeywords[ style ] );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\r\n\t},\r\n\r\n\tcopy: function ( color ) {\r\n\r\n\t\tthis.r = color.r;\r\n\t\tthis.g = color.g;\r\n\t\tthis.b = color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyGammaToLinear: function ( color ) {\r\n\r\n\t\tthis.r = color.r * color.r;\r\n\t\tthis.g = color.g * color.g;\r\n\t\tthis.b = color.b * color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopyLinearToGamma: function ( color ) {\r\n\r\n\t\tthis.r = Math.sqrt( color.r );\r\n\t\tthis.g = Math.sqrt( color.g );\r\n\t\tthis.b = Math.sqrt( color.b );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconvertGammaToLinear: function () {\r\n\r\n\t\tvar r = this.r, g = this.g, b = this.b;\r\n\r\n\t\tthis.r = r * r;\r\n\t\tthis.g = g * g;\r\n\t\tthis.b = b * b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconvertLinearToGamma: function () {\r\n\r\n\t\tthis.r = Math.sqrt( this.r );\r\n\t\tthis.g = Math.sqrt( this.g );\r\n\t\tthis.b = Math.sqrt( this.b );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetHex: function () {\r\n\r\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\r\n\r\n\t},\r\n\r\n\tgetHexString: function () {\r\n\r\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\r\n\r\n\t},\r\n\r\n\tgetHSL: function () {\r\n\r\n\t\tvar hsl = { h: 0, s: 0, l: 0 };\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\r\n\r\n\t\t\tvar r = this.r, g = this.g, b = this.b;\r\n\r\n\t\t\tvar max = Math.max( r, g, b );\r\n\t\t\tvar min = Math.min( r, g, b );\r\n\r\n\t\t\tvar hue, saturation;\r\n\t\t\tvar lightness = ( min + max ) / 2.0;\r\n\r\n\t\t\tif ( min === max ) {\r\n\r\n\t\t\t\thue = 0;\r\n\t\t\t\tsaturation = 0;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar delta = max - min;\r\n\r\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\r\n\r\n\t\t\t\tswitch ( max ) {\r\n\r\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\r\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\r\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\thue /= 6;\r\n\r\n\t\t\t}\r\n\r\n\t\t\thsl.h = hue;\r\n\t\t\thsl.s = saturation;\r\n\t\t\thsl.l = lightness;\r\n\r\n\t\t\treturn hsl;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetStyle: function () {\r\n\r\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\r\n\r\n\t},\r\n\r\n\toffsetHSL: function ( h, s, l ) {\r\n\r\n\t\tvar hsl = this.getHSL();\r\n\r\n\t\thsl.h += h; hsl.s += s; hsl.l += l;\r\n\r\n\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( color ) {\r\n\r\n\t\tthis.r += color.r;\r\n\t\tthis.g += color.g;\r\n\t\tthis.b += color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddColors: function ( color1, color2 ) {\r\n\r\n\t\tthis.r = color1.r + color2.r;\r\n\t\tthis.g = color1.g + color2.g;\r\n\t\tthis.b = color1.b + color2.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.r += s;\r\n\t\tthis.g += s;\r\n\t\tthis.b += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( color ) {\r\n\r\n\t\tthis.r *= color.r;\r\n\t\tthis.g *= color.g;\r\n\t\tthis.b *= color.b;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tthis.r *= s;\r\n\t\tthis.g *= s;\r\n\t\tthis.b *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerp: function ( color, alpha ) {\r\n\r\n\t\tthis.r += ( color.r - this.r ) * alpha;\r\n\t\tthis.g += ( color.g - this.g ) * alpha;\r\n\t\tthis.b += ( color.b - this.b ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( c ) {\r\n\r\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Color().setRGB( this.r, this.g, this.b );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ColorKeywords = { \"aliceblue\": 0xF0F8FF, \"antiquewhite\": 0xFAEBD7, \"aqua\": 0x00FFFF, \"aquamarine\": 0x7FFFD4, \"azure\": 0xF0FFFF,\r\n\"beige\": 0xF5F5DC, \"bisque\": 0xFFE4C4, \"black\": 0x000000, \"blanchedalmond\": 0xFFEBCD, \"blue\": 0x0000FF, \"blueviolet\": 0x8A2BE2,\r\n\"brown\": 0xA52A2A, \"burlywood\": 0xDEB887, \"cadetblue\": 0x5F9EA0, \"chartreuse\": 0x7FFF00, \"chocolate\": 0xD2691E, \"coral\": 0xFF7F50,\r\n\"cornflowerblue\": 0x6495ED, \"cornsilk\": 0xFFF8DC, \"crimson\": 0xDC143C, \"cyan\": 0x00FFFF, \"darkblue\": 0x00008B, \"darkcyan\": 0x008B8B,\r\n\"darkgoldenrod\": 0xB8860B, \"darkgray\": 0xA9A9A9, \"darkgreen\": 0x006400, \"darkgrey\": 0xA9A9A9, \"darkkhaki\": 0xBDB76B, \"darkmagenta\": 0x8B008B,\r\n\"darkolivegreen\": 0x556B2F, \"darkorange\": 0xFF8C00, \"darkorchid\": 0x9932CC, \"darkred\": 0x8B0000, \"darksalmon\": 0xE9967A, \"darkseagreen\": 0x8FBC8F,\r\n\"darkslateblue\": 0x483D8B, \"darkslategray\": 0x2F4F4F, \"darkslategrey\": 0x2F4F4F, \"darkturquoise\": 0x00CED1, \"darkviolet\": 0x9400D3,\r\n\"deeppink\": 0xFF1493, \"deepskyblue\": 0x00BFFF, \"dimgray\": 0x696969, \"dimgrey\": 0x696969, \"dodgerblue\": 0x1E90FF, \"firebrick\": 0xB22222,\r\n\"floralwhite\": 0xFFFAF0, \"forestgreen\": 0x228B22, \"fuchsia\": 0xFF00FF, \"gainsboro\": 0xDCDCDC, \"ghostwhite\": 0xF8F8FF, \"gold\": 0xFFD700,\r\n\"goldenrod\": 0xDAA520, \"gray\": 0x808080, \"green\": 0x008000, \"greenyellow\": 0xADFF2F, \"grey\": 0x808080, \"honeydew\": 0xF0FFF0, \"hotpink\": 0xFF69B4,\r\n\"indianred\": 0xCD5C5C, \"indigo\": 0x4B0082, \"ivory\": 0xFFFFF0, \"khaki\": 0xF0E68C, \"lavender\": 0xE6E6FA, \"lavenderblush\": 0xFFF0F5, \"lawngreen\": 0x7CFC00,\r\n\"lemonchiffon\": 0xFFFACD, \"lightblue\": 0xADD8E6, \"lightcoral\": 0xF08080, \"lightcyan\": 0xE0FFFF, \"lightgoldenrodyellow\": 0xFAFAD2, \"lightgray\": 0xD3D3D3,\r\n\"lightgreen\": 0x90EE90, \"lightgrey\": 0xD3D3D3, \"lightpink\": 0xFFB6C1, \"lightsalmon\": 0xFFA07A, \"lightseagreen\": 0x20B2AA, \"lightskyblue\": 0x87CEFA,\r\n\"lightslategray\": 0x778899, \"lightslategrey\": 0x778899, \"lightsteelblue\": 0xB0C4DE, \"lightyellow\": 0xFFFFE0, \"lime\": 0x00FF00, \"limegreen\": 0x32CD32,\r\n\"linen\": 0xFAF0E6, \"magenta\": 0xFF00FF, \"maroon\": 0x800000, \"mediumaquamarine\": 0x66CDAA, \"mediumblue\": 0x0000CD, \"mediumorchid\": 0xBA55D3,\r\n\"mediumpurple\": 0x9370DB, \"mediumseagreen\": 0x3CB371, \"mediumslateblue\": 0x7B68EE, \"mediumspringgreen\": 0x00FA9A, \"mediumturquoise\": 0x48D1CC,\r\n\"mediumvioletred\": 0xC71585, \"midnightblue\": 0x191970, \"mintcream\": 0xF5FFFA, \"mistyrose\": 0xFFE4E1, \"moccasin\": 0xFFE4B5, \"navajowhite\": 0xFFDEAD,\r\n\"navy\": 0x000080, \"oldlace\": 0xFDF5E6, \"olive\": 0x808000, \"olivedrab\": 0x6B8E23, \"orange\": 0xFFA500, \"orangered\": 0xFF4500, \"orchid\": 0xDA70D6,\r\n\"palegoldenrod\": 0xEEE8AA, \"palegreen\": 0x98FB98, \"paleturquoise\": 0xAFEEEE, \"palevioletred\": 0xDB7093, \"papayawhip\": 0xFFEFD5, \"peachpuff\": 0xFFDAB9,\r\n\"peru\": 0xCD853F, \"pink\": 0xFFC0CB, \"plum\": 0xDDA0DD, \"powderblue\": 0xB0E0E6, \"purple\": 0x800080, \"red\": 0xFF0000, \"rosybrown\": 0xBC8F8F,\r\n\"royalblue\": 0x4169E1, \"saddlebrown\": 0x8B4513, \"salmon\": 0xFA8072, \"sandybrown\": 0xF4A460, \"seagreen\": 0x2E8B57, \"seashell\": 0xFFF5EE,\r\n\"sienna\": 0xA0522D, \"silver\": 0xC0C0C0, \"skyblue\": 0x87CEEB, \"slateblue\": 0x6A5ACD, \"slategray\": 0x708090, \"slategrey\": 0x708090, \"snow\": 0xFFFAFA,\r\n\"springgreen\": 0x00FF7F, \"steelblue\": 0x4682B4, \"tan\": 0xD2B48C, \"teal\": 0x008080, \"thistle\": 0xD8BFD8, \"tomato\": 0xFF6347, \"turquoise\": 0x40E0D0,\r\n\"violet\": 0xEE82EE, \"wheat\": 0xF5DEB3, \"white\": 0xFFFFFF, \"whitesmoke\": 0xF5F5F5, \"yellow\": 0xFFFF00, \"yellowgreen\": 0x9ACD32 };\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Quaternion = function( x, y, z, w ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\tthis.z = z || 0;\r\n\tthis.w = ( w !== undefined ) ? w : 1;\r\n\r\n};\r\n\r\nTHREE.Quaternion.prototype = {\r\n\r\n\tconstructor: THREE.Quaternion,\r\n\r\n\tset: function ( x, y, z, w ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( q ) {\r\n\r\n\t\tthis.x = q.x;\r\n\t\tthis.y = q.y;\r\n\t\tthis.z = q.z;\r\n\t\tthis.w = q.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromEuler: function ( v, order ) {\r\n\r\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\r\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\r\n\t\t//\tcontent/SpinCalc.m\r\n\r\n\t\tvar c1 = Math.cos( v.x / 2 );\r\n\t\tvar c2 = Math.cos( v.y / 2 );\r\n\t\tvar c3 = Math.cos( v.z / 2 );\r\n\t\tvar s1 = Math.sin( v.x / 2 );\r\n\t\tvar s2 = Math.sin( v.y / 2 );\r\n\t\tvar s3 = Math.sin( v.z / 2 );\r\n\r\n\t\tif ( order === undefined || order === 'XYZ' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 + c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 + s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 - s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 - s1 * s2 * s3;\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tthis.x = s1 * c2 * c3 - c1 * s2 * s3;\r\n\t\t\tthis.y = c1 * s2 * c3 - s1 * c2 * s3;\r\n\t\t\tthis.z = c1 * c2 * s3 + s1 * s2 * c3;\r\n\t\t\tthis.w = c1 * c2 * c3 + s1 * s2 * s3;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromAxisAngle: function ( axis, angle ) {\r\n\r\n\t\t// from http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\r\n\t\t// axis have to be normalized\r\n\r\n\t\tvar halfAngle = angle / 2,\r\n\t\t\ts = Math.sin( halfAngle );\r\n\r\n\t\tthis.x = axis.x * s;\r\n\t\tthis.y = axis.y * s;\r\n\t\tthis.z = axis.z * s;\r\n\t\tthis.w = Math.cos( halfAngle );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromRotationMatrix: function ( m ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tvar te = m.elements,\r\n\r\n\t\t\tm11 = te[0], m12 = te[4], m13 = te[8],\r\n\t\t\tm21 = te[1], m22 = te[5], m23 = te[9],\r\n\t\t\tm31 = te[2], m32 = te[6], m33 = te[10],\r\n\r\n\t\t\ttrace = m11 + m22 + m33,\r\n\t\t\ts;\r\n\r\n\t\tif ( trace > 0 ) {\r\n\r\n\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\r\n\r\n\t\t\tthis.w = 0.25 / s;\r\n\t\t\tthis.x = ( m32 - m23 ) * s;\r\n\t\t\tthis.y = ( m13 - m31 ) * s;\r\n\t\t\tthis.z = ( m21 - m12 ) * s;\r\n\r\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\r\n\r\n\t\t\tthis.w = (m32 - m23 ) / s;\r\n\t\t\tthis.x = 0.25 * s;\r\n\t\t\tthis.y = (m12 + m21 ) / s;\r\n\t\t\tthis.z = (m13 + m31 ) / s;\r\n\r\n\t\t} else if ( m22 > m33 ) {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\r\n\r\n\t\t\tthis.w = (m13 - m31 ) / s;\r\n\t\t\tthis.x = (m12 + m21 ) / s;\r\n\t\t\tthis.y = 0.25 * s;\r\n\t\t\tthis.z = (m23 + m32 ) / s;\r\n\r\n\t\t} else {\r\n\r\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\r\n\r\n\t\t\tthis.w = ( m21 - m12 ) / s;\r\n\t\t\tthis.x = ( m13 + m31 ) / s;\r\n\t\t\tthis.y = ( m23 + m32 ) / s;\r\n\t\t\tthis.z = 0.25 * s;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tinverse: function () {\r\n\r\n\t\tthis.conjugate().normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tconjugate: function () {\r\n\r\n\t\tthis.x *= -1;\r\n\t\tthis.y *= -1;\r\n\t\tthis.z *= -1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\tvar l = this.length();\r\n\r\n\t\tif ( l === 0 ) {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\t\t\tthis.z = 0;\r\n\t\t\tthis.w = 1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tl = 1 / l;\r\n\r\n\t\t\tthis.x = this.x * l;\r\n\t\t\tthis.y = this.y * l;\r\n\t\t\tthis.z = this.z * l;\r\n\t\t\tthis.w = this.w * l;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( q, p ) {\r\n\r\n\t\tif ( p !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Quaternion\\'s .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\r\n\t\t\treturn this.multiplyQuaternions( q, p );\r\n\r\n\t\t}\r\n\r\n\t\treturn this.multiplyQuaternions( this, q );\r\n\r\n\t},\r\n\r\n\tmultiplyQuaternions: function ( a, b ) {\r\n\r\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\r\n\r\n\t\tvar qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\r\n\t\tvar qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\r\n\r\n\t\tthis.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\r\n\t\tthis.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\r\n\t\tthis.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\r\n\t\tthis.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyVector3: function ( vector ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Quaternion\\'s .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\r\n\t\treturn vector.applyQuaternion( this );\r\n\r\n\t},\r\n\r\n\tslerp: function ( qb, t ) {\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\r\n\r\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\r\n\r\n\t\tvar cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\r\n\r\n\t\tif ( cosHalfTheta < 0 ) {\r\n\r\n\t\t\tthis.w = -qb.w;\r\n\t\t\tthis.x = -qb.x;\r\n\t\t\tthis.y = -qb.y;\r\n\t\t\tthis.z = -qb.z;\r\n\r\n\t\t\tcosHalfTheta = -cosHalfTheta;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.copy( qb );\r\n\r\n\t\t}\r\n\r\n\t\tif ( cosHalfTheta >= 1.0 ) {\r\n\r\n\t\t\tthis.w = w;\r\n\t\t\tthis.x = x;\r\n\t\t\tthis.y = y;\r\n\t\t\tthis.z = z;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tvar halfTheta = Math.acos( cosHalfTheta );\r\n\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\r\n\r\n\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\r\n\r\n\t\t\tthis.w = 0.5 * ( w + this.w );\r\n\t\t\tthis.x = 0.5 * ( x + this.x );\r\n\t\t\tthis.y = 0.5 * ( y + this.y );\r\n\t\t\tthis.z = 0.5 * ( z + this.z );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\r\n\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\r\n\r\n\t\tthis.w = ( w * ratioA + this.w * ratioB );\r\n\t\tthis.x = ( x * ratioA + this.x * ratioB );\r\n\t\tthis.y = ( y * ratioA + this.y * ratioB );\r\n\t\tthis.z = ( z * ratioA + this.z * ratioB );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.x = array[ 0 ];\r\n\t\tthis.y = array[ 1 ];\r\n\t\tthis.z = array[ 2 ];\r\n\t\tthis.w = array[ 3 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function () {\r\n\r\n\t\treturn [ this.x, this.y, this.z, this.w ];\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Quaternion( this.x, this.y, this.z, this.w );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Quaternion.slerp = function ( qa, qb, qm, t ) {\r\n\r\n\treturn qm.copy( qa ).slerp( qb, t );\r\n\r\n}\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author egraether / http://egraether.com/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n */\r\n\r\nTHREE.Vector2 = function ( x, y ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\r\n};\r\n\r\nTHREE.Vector2.prototype = {\r\n\r\n\tconstructor: THREE.Vector2,\r\n\r\n\tset: function ( x, y ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector2\\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector2\\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tthis.x *= s;\r\n\t\tthis.y *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( s ) {\r\n\r\n\t\tif ( s !== 0 ) {\r\n\r\n\t\t\tthis.x /= s;\r\n\t\t\tthis.y /= s;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.set( 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tif ( this.x > v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y > v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tif ( this.x < v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tif ( this.x < min.x ) {\r\n\r\n\t\t\tthis.x = min.x;\r\n\r\n\t\t} else if ( this.x > max.x ) {\r\n\r\n\t\t\tthis.x = max.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < min.y ) {\r\n\r\n\t\t\tthis.y = min.y;\r\n\r\n\t\t} else if ( this.y > max.y ) {\r\n\r\n\t\t\tthis.y = max.y;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function() {\r\n\r\n\t\treturn this.multiplyScalar( - 1 );\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tdistanceTo: function ( v ) {\r\n\r\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\r\n\r\n\t},\r\n\r\n\tdistanceToSquared: function ( v ) {\r\n\r\n\t\tvar dx = this.x - v.x, dy = this.y - v.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\r\n\t},\r\n\r\n\tsetLength: function ( l ) {\r\n\r\n\t\tvar oldLength = this.length();\r\n\r\n\t\tif ( oldLength !== 0 && l !== oldLength ) {\r\n\r\n\t\t\tthis.multiplyScalar( l / oldLength );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.x = array[ 0 ];\r\n\t\tthis.y = array[ 1 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function () {\r\n\r\n\t\treturn [ this.x, this.y ];\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Vector2( this.x, this.y );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author *kile / http://kile.stravaganza.org/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author egraether / http://egraether.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Vector3 = function ( x, y, z ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\tthis.z = z || 0;\r\n\r\n};\r\n\r\nTHREE.Vector3.prototype = {\r\n\r\n\tconstructor: THREE.Vector3,\r\n\r\n\tset: function ( x, y, z ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetZ: function ( z ) {\r\n\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tcase 2: this.z = value; break;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tcase 2: return this.z;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\t\tthis.z = v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector3\\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\t\tthis.z += v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\t\tthis.z += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\t\tthis.z = a.z + b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector3\\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\t\tthis.z -= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\t\tthis.z = a.z - b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiply: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector3\\'s .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\r\n\t\t\treturn this.multiplyVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x *= v.x;\r\n\t\tthis.y *= v.y;\r\n\t\tthis.z *= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tthis.x *= s;\r\n\t\tthis.y *= s;\r\n\t\tthis.z *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x * b.x;\r\n\t\tthis.y = a.y * b.y;\r\n\t\tthis.z = a.z * b.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix3: function ( m ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[0] * x + e[3] * y + e[6] * z;\r\n\t\tthis.y = e[1] * x + e[4] * y + e[7] * z;\r\n\t\tthis.z = e[2] * x + e[5] * y + e[8] * z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 affine matrix\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z + e[12];\r\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z + e[13];\r\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z + e[14];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyProjection: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 projection matrix\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\t\tvar d = 1 / ( e[3] * x + e[7] * y + e[11] * z + e[15] ); // perspective divide\r\n\r\n\t\tthis.x = ( e[0] * x + e[4] * y + e[8] * z + e[12] ) * d;\r\n\t\tthis.y = ( e[1] * x + e[5] * y + e[9] * z + e[13] ) * d;\r\n\t\tthis.z = ( e[2] * x + e[6] * y + e[10] * z + e[14] ) * d;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyQuaternion: function ( q ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\r\n\t\tvar qx = q.x;\r\n\t\tvar qy = q.y;\r\n\t\tvar qz = q.z;\r\n\t\tvar qw = q.w;\r\n\r\n\t\t// calculate quat * vector\r\n\r\n\t\tvar ix = qw * x + qy * z - qz * y;\r\n\t\tvar iy = qw * y + qz * x - qx * z;\r\n\t\tvar iz = qw * z + qx * y - qy * x;\r\n\t\tvar iw = -qx * x - qy * y - qz * z;\r\n\r\n\t\t// calculate result * inverse quat\r\n\r\n\t\tthis.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\r\n\t\tthis.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\r\n\t\tthis.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttransformDirection: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4 affine matrix\r\n\t\t// vector interpreted as a direction\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z;\r\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z;\r\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z;\r\n\r\n\t\tthis.normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivide: function ( v ) {\r\n\r\n\t\tthis.x /= v.x;\r\n\t\tthis.y /= v.y;\r\n\t\tthis.z /= v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( s ) {\r\n\r\n\t\tif ( s !== 0 ) {\r\n\r\n\t\t\tthis.x /= s;\r\n\t\t\tthis.y /= s;\r\n\t\t\tthis.z /= s;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\t\t\tthis.z = 0;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tif ( this.x > v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y > v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z > v.z ) {\r\n\r\n\t\t\tthis.z = v.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tif ( this.x < v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z < v.z ) {\r\n\r\n\t\t\tthis.z = v.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tif ( this.x < min.x ) {\r\n\r\n\t\t\tthis.x = min.x;\r\n\r\n\t\t} else if ( this.x > max.x ) {\r\n\r\n\t\t\tthis.x = max.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < min.y ) {\r\n\r\n\t\t\tthis.y = min.y;\r\n\r\n\t\t} else if ( this.y > max.y ) {\r\n\r\n\t\t\tthis.y = max.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z < min.z ) {\r\n\r\n\t\t\tthis.z = min.z;\r\n\r\n\t\t} else if ( this.z > max.z ) {\r\n\r\n\t\t\tthis.z = max.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\treturn this.multiplyScalar( - 1 );\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\r\n\r\n\t},\r\n\r\n\tlengthManhattan: function () {\r\n\r\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tsetLength: function ( l ) {\r\n\r\n\t\tvar oldLength = this.length();\r\n\r\n\t\tif ( oldLength !== 0 && l !== oldLength ) {\r\n\r\n\t\t\tthis.multiplyScalar( l / oldLength );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\t\tthis.z += ( v.z - this.z ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcross: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector3\\'s .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\r\n\t\t\treturn this.crossVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tvar x = this.x, y = this.y, z = this.z;\r\n\r\n\t\tthis.x = y * v.z - z * v.y;\r\n\t\tthis.y = z * v.x - x * v.z;\r\n\t\tthis.z = x * v.y - y * v.x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcrossVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.y * b.z - a.z * b.y;\r\n\t\tthis.y = a.z * b.x - a.x * b.z;\r\n\t\tthis.z = a.x * b.y - a.y * b.x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tangleTo: function ( v ) {\r\n\r\n\t\tvar theta = this.dot( v ) / ( this.length() * v.length() );\r\n\r\n\t\t// clamp, to handle numerical problems\r\n\r\n\t\treturn Math.acos( THREE.Math.clamp( theta, -1, 1 ) );\r\n\r\n\t},\r\n\r\n\tdistanceTo: function ( v ) {\r\n\r\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\r\n\r\n\t},\r\n\r\n\tdistanceToSquared: function ( v ) {\r\n\r\n\t\tvar dx = this.x - v.x;\r\n\t\tvar dy = this.y - v.y;\r\n\t\tvar dz = this.z - v.z;\r\n\r\n\t\treturn dx * dx + dy * dy + dz * dz;\r\n\r\n\t},\r\n\r\n\tsetEulerFromRotationMatrix: function ( m, order ) {\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\t// clamp, to handle numerical problems\r\n\r\n\t\tfunction clamp( x ) {\r\n\r\n\t\t\treturn Math.min( Math.max( x, -1 ), 1 );\r\n\r\n\t\t}\r\n\r\n\t\tvar te = m.elements;\r\n\t\tvar m11 = te[0], m12 = te[4], m13 = te[8];\r\n\t\tvar m21 = te[1], m22 = te[5], m23 = te[9];\r\n\t\tvar m31 = te[2], m32 = te[6], m33 = te[10];\r\n\r\n\t\tif ( order === undefined || order === 'XYZ' ) {\r\n\r\n\t\t\tthis.y = Math.asin( clamp( m13 ) );\r\n\r\n\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.x = Math.atan2( - m23, m33 );\r\n\t\t\t\tthis.z = Math.atan2( - m12, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.x = Math.atan2( m32, m22 );\r\n\t\t\t\tthis.z = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tthis.x = Math.asin( - clamp( m23 ) );\r\n\r\n\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.y = Math.atan2( m13, m33 );\r\n\t\t\t\tthis.z = Math.atan2( m21, m22 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.y = Math.atan2( - m31, m11 );\r\n\t\t\t\tthis.z = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tthis.x = Math.asin( clamp( m32 ) );\r\n\r\n\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.y = Math.atan2( - m31, m33 );\r\n\t\t\t\tthis.z = Math.atan2( - m12, m22 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.y = 0;\r\n\t\t\t\tthis.z = Math.atan2( m21, m11 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tthis.y = Math.asin( - clamp( m31 ) );\r\n\r\n\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.x = Math.atan2( m32, m33 );\r\n\t\t\t\tthis.z = Math.atan2( m21, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.x = 0;\r\n\t\t\t\tthis.z = Math.atan2( - m12, m22 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tthis.z = Math.asin( clamp( m21 ) );\r\n\r\n\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.x = Math.atan2( - m23, m22 );\r\n\t\t\t\tthis.y = Math.atan2( - m31, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.x = 0;\r\n\t\t\t\tthis.y = Math.atan2( m13, m33 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tthis.z = Math.asin( - clamp( m12 ) );\r\n\r\n\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\r\n\r\n\t\t\t\tthis.x = Math.atan2( m32, m22 );\r\n\t\t\t\tthis.y = Math.atan2( m13, m11 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.x = Math.atan2( - m23, m33 );\r\n\t\t\t\tthis.y = 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetEulerFromQuaternion: function ( q, order ) {\r\n\r\n\t\t// q is assumed to be normalized\r\n\r\n\t\t// clamp, to handle numerical problems\r\n\r\n\t\tfunction clamp( x ) {\r\n\r\n\t\t\treturn Math.min( Math.max( x, -1 ), 1 );\r\n\r\n\t\t}\r\n\r\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m\r\n\r\n\t\tvar sqx = q.x * q.x;\r\n\t\tvar sqy = q.y * q.y;\r\n\t\tvar sqz = q.z * q.z;\r\n\t\tvar sqw = q.w * q.w;\r\n\r\n\t\tif ( order === undefined || order === 'XYZ' ) {\r\n\r\n\t\t\tthis.x = Math.atan2( 2 * ( q.x * q.w - q.y * q.z ), ( sqw - sqx - sqy + sqz ) );\r\n\t\t\tthis.y = Math.asin( clamp( 2 * ( q.x * q.z + q.y * q.w ) ) );\r\n\t\t\tthis.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw + sqx - sqy - sqz ) );\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tthis.x = Math.asin( clamp( 2 * ( q.x * q.w - q.y * q.z ) ) );\r\n\t\t\tthis.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw - sqx - sqy + sqz ) );\r\n\t\t\tthis.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw - sqx + sqy - sqz ) );\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tthis.x = Math.asin( clamp( 2 * ( q.x * q.w + q.y * q.z ) ) );\r\n\t\t\tthis.y = Math.atan2( 2 * ( q.y * q.w - q.z * q.x ), ( sqw - sqx - sqy + sqz ) );\r\n\t\t\tthis.z = Math.atan2( 2 * ( q.z * q.w - q.x * q.y ), ( sqw - sqx + sqy - sqz ) );\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tthis.x = Math.atan2( 2 * ( q.x * q.w + q.z * q.y ), ( sqw - sqx - sqy + sqz ) );\r\n\t\t\tthis.y = Math.asin( clamp( 2 * ( q.y * q.w - q.x * q.z ) ) );\r\n\t\t\tthis.z = Math.atan2( 2 * ( q.x * q.y + q.z * q.w ), ( sqw + sqx - sqy - sqz ) );\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tthis.x = Math.atan2( 2 * ( q.x * q.w - q.z * q.y ), ( sqw - sqx + sqy - sqz ) );\r\n\t\t\tthis.y = Math.atan2( 2 * ( q.y * q.w - q.x * q.z ), ( sqw + sqx - sqy - sqz ) );\r\n\t\t\tthis.z = Math.asin( clamp( 2 * ( q.x * q.y + q.z * q.w ) ) );\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tthis.x = Math.atan2( 2 * ( q.x * q.w + q.y * q.z ), ( sqw - sqx + sqy - sqz ) );\r\n\t\t\tthis.y = Math.atan2( 2 * ( q.x * q.z + q.y * q.w ), ( sqw + sqx - sqy - sqz ) );\r\n\t\t\tthis.z = Math.asin( clamp( 2 * ( q.z * q.w - q.x * q.y ) ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetPositionFromMatrix: function ( m ) {\r\n\r\n\t\tthis.x = m.elements[12];\r\n\t\tthis.y = m.elements[13];\r\n\t\tthis.z = m.elements[14];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetScaleFromMatrix: function ( m ) {\r\n\r\n\t\tvar sx = this.set( m.elements[0], m.elements[1], m.elements[2] ).length();\r\n\t\tvar sy = this.set( m.elements[4], m.elements[5], m.elements[6] ).length();\r\n\t\tvar sz = this.set( m.elements[8], m.elements[9], m.elements[10] ).length();\r\n\r\n\t\tthis.x = sx;\r\n\t\tthis.y = sy;\r\n\t\tthis.z = sz;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetColumnFromMatrix: function ( index, matrix ) {\r\n\r\n\t\tvar offset = index * 4;\r\n\r\n\t\tvar me = matrix.elements;\r\n\r\n\t\tthis.x = me[ offset ];\r\n\t\tthis.y = me[ offset + 1 ];\r\n\t\tthis.z = me[ offset + 2 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.x = array[ 0 ];\r\n\t\tthis.y = array[ 1 ];\r\n\t\tthis.z = array[ 2 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function () {\r\n\r\n\t\treturn [ this.x, this.y, this.z ];\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Vector3( this.x, this.y, this.z );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.extend( THREE.Vector3.prototype, {\r\n\r\n\tapplyEuler: function () {\r\n\r\n\t\tvar q1 = new THREE.Quaternion();\r\n\r\n\t\treturn function ( v, eulerOrder ) {\r\n\r\n\t\t\tvar quaternion = q1.setFromEuler( v, eulerOrder );\r\n\r\n\t\t\tthis.applyQuaternion( quaternion );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tapplyAxisAngle: function () {\r\n\r\n\t\tvar q1 = new THREE.Quaternion();\r\n\r\n\t\treturn function ( axis, angle ) {\r\n\r\n\t\t\tvar quaternion = q1.setFromAxisAngle( axis, angle );\r\n\r\n\t\t\tthis.applyQuaternion( quaternion );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tprojectOnVector: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t\tv1.copy( vector ).normalize();\r\n\t\t\tvar d = this.dot( v1 );\r\n\t\t\treturn this.copy( v1 ).multiplyScalar( d );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tprojectOnPlane: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( planeNormal ) {\r\n\r\n\t\t\tv1.copy( this ).projectOnVector( planeNormal );\r\n\r\n\t\t\treturn this.sub( v1 );\r\n\r\n\t\t}\r\n\r\n\t}(),\r\n\r\n\treflect: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t v1.copy( this ).projectOnVector( vector ).multiplyScalar( 2 );\r\n\r\n\t\t return this.subVectors( v1, this );\r\n\r\n\t\t}\r\n\r\n\t}()\r\n\r\n} );\r\n/**\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author egraether / http://egraether.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Vector4 = function ( x, y, z, w ) {\r\n\r\n\tthis.x = x || 0;\r\n\tthis.y = y || 0;\r\n\tthis.z = z || 0;\r\n\tthis.w = ( w !== undefined ) ? w : 1;\r\n\r\n};\r\n\r\nTHREE.Vector4.prototype = {\r\n\r\n\tconstructor: THREE.Vector4,\r\n\r\n\tset: function ( x, y, z, w ) {\r\n\r\n\t\tthis.x = x;\r\n\t\tthis.y = y;\r\n\t\tthis.z = z;\r\n\t\tthis.w = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetX: function ( x ) {\r\n\r\n\t\tthis.x = x;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetY: function ( y ) {\r\n\r\n\t\tthis.y = y;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetZ: function ( z ) {\r\n\r\n\t\tthis.z = z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetW: function ( w ) {\r\n\r\n\t\tthis.w = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponent: function ( index, value ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: this.x = value; break;\r\n\t\t\tcase 1: this.y = value; break;\r\n\t\t\tcase 2: this.z = value; break;\r\n\t\t\tcase 3: this.w = value; break;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetComponent: function ( index ) {\r\n\r\n\t\tswitch ( index ) {\r\n\r\n\t\t\tcase 0: return this.x;\r\n\t\t\tcase 1: return this.y;\r\n\t\t\tcase 2: return this.z;\r\n\t\t\tcase 3: return this.w;\r\n\t\t\tdefault: throw new Error( \"index is out of range: \" + index );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcopy: function ( v ) {\r\n\r\n\t\tthis.x = v.x;\r\n\t\tthis.y = v.y;\r\n\t\tthis.z = v.z;\r\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tadd: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector4\\'s .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\r\n\t\t\treturn this.addVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x += v.x;\r\n\t\tthis.y += v.y;\r\n\t\tthis.z += v.z;\r\n\t\tthis.w += v.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddScalar: function ( s ) {\r\n\r\n\t\tthis.x += s;\r\n\t\tthis.y += s;\r\n\t\tthis.z += s;\r\n\t\tthis.w += s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\taddVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x + b.x;\r\n\t\tthis.y = a.y + b.y;\r\n\t\tthis.z = a.z + b.z;\r\n\t\tthis.w = a.w + b.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsub: function ( v, w ) {\r\n\r\n\t\tif ( w !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Vector4\\'s .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\r\n\t\t\treturn this.subVectors( v, w );\r\n\r\n\t\t}\r\n\r\n\t\tthis.x -= v.x;\r\n\t\tthis.y -= v.y;\r\n\t\tthis.z -= v.z;\r\n\t\tthis.w -= v.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsubVectors: function ( a, b ) {\r\n\r\n\t\tthis.x = a.x - b.x;\r\n\t\tthis.y = a.y - b.y;\r\n\t\tthis.z = a.z - b.z;\r\n\t\tthis.w = a.w - b.w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tthis.x *= s;\r\n\t\tthis.y *= s;\r\n\t\tthis.z *= s;\r\n\t\tthis.w *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( m ) {\r\n\r\n\t\tvar x = this.x;\r\n\t\tvar y = this.y;\r\n\t\tvar z = this.z;\r\n\t\tvar w = this.w;\r\n\r\n\t\tvar e = m.elements;\r\n\r\n\t\tthis.x = e[0] * x + e[4] * y + e[8] * z + e[12] * w;\r\n\t\tthis.y = e[1] * x + e[5] * y + e[9] * z + e[13] * w;\r\n\t\tthis.z = e[2] * x + e[6] * y + e[10] * z + e[14] * w;\r\n\t\tthis.w = e[3] * x + e[7] * y + e[11] * z + e[15] * w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdivideScalar: function ( s ) {\r\n\r\n\t\tif ( s !== 0 ) {\r\n\r\n\t\t\tthis.x /= s;\r\n\t\t\tthis.y /= s;\r\n\t\t\tthis.z /= s;\r\n\t\t\tthis.w /= s;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.x = 0;\r\n\t\t\tthis.y = 0;\r\n\t\t\tthis.z = 0;\r\n\t\t\tthis.w = 1;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetAxisAngleFromQuaternion: function ( q ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\r\n\r\n\t\t// q is assumed to be normalized\r\n\r\n\t\tthis.w = 2 * Math.acos( q.w );\r\n\r\n\t\tvar s = Math.sqrt( 1 - q.w * q.w );\r\n\r\n\t\tif ( s < 0.0001 ) {\r\n\r\n\t\t\t this.x = 1;\r\n\t\t\t this.y = 0;\r\n\t\t\t this.z = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t this.x = q.x / s;\r\n\t\t\t this.y = q.y / s;\r\n\t\t\t this.z = q.z / s;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\r\n\r\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\r\n\r\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\r\n\r\n\t\tvar angle, x, y, z,\t\t// variables for result\r\n\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\r\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\r\n\r\n\t\t\tte = m.elements,\r\n\r\n\t\t\tm11 = te[0], m12 = te[4], m13 = te[8],\r\n\t\t\tm21 = te[1], m22 = te[5], m23 = te[9],\r\n\t\t\tm31 = te[2], m32 = te[6], m33 = te[10];\r\n\r\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon )\r\n\t\t && ( Math.abs( m13 - m31 ) < epsilon )\r\n\t\t && ( Math.abs( m23 - m32 ) < epsilon ) ) {\r\n\r\n\t\t\t// singularity found\r\n\t\t\t// first check for identity matrix which must have +1 for all terms\r\n\t\t\t// in leading diagonal and zero in other terms\r\n\r\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 )\r\n\t\t\t && ( Math.abs( m13 + m31 ) < epsilon2 )\r\n\t\t\t && ( Math.abs( m23 + m32 ) < epsilon2 )\r\n\t\t\t && ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\r\n\r\n\t\t\t\t// this singularity is identity matrix so angle = 0\r\n\r\n\t\t\t\tthis.set( 1, 0, 0, 0 );\r\n\r\n\t\t\t\treturn this; // zero angle, arbitrary axis\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// otherwise this singularity is angle = 180\r\n\r\n\t\t\tangle = Math.PI;\r\n\r\n\t\t\tvar xx = ( m11 + 1 ) / 2;\r\n\t\t\tvar yy = ( m22 + 1 ) / 2;\r\n\t\t\tvar zz = ( m33 + 1 ) / 2;\r\n\t\t\tvar xy = ( m12 + m21 ) / 4;\r\n\t\t\tvar xz = ( m13 + m31 ) / 4;\r\n\t\t\tvar yz = ( m23 + m32 ) / 4;\r\n\r\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) { // m11 is the largest diagonal term\r\n\r\n\t\t\t\tif ( xx < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0;\r\n\t\t\t\t\ty = 0.707106781;\r\n\t\t\t\t\tz = 0.707106781;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tx = Math.sqrt( xx );\r\n\t\t\t\t\ty = xy / x;\r\n\t\t\t\t\tz = xz / x;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( yy > zz ) { // m22 is the largest diagonal term\r\n\r\n\t\t\t\tif ( yy < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0.707106781;\r\n\t\t\t\t\ty = 0;\r\n\t\t\t\t\tz = 0.707106781;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ty = Math.sqrt( yy );\r\n\t\t\t\t\tx = xy / y;\r\n\t\t\t\t\tz = yz / y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else { // m33 is the largest diagonal term so base result on this\r\n\r\n\t\t\t\tif ( zz < epsilon ) {\r\n\r\n\t\t\t\t\tx = 0.707106781;\r\n\t\t\t\t\ty = 0.707106781;\r\n\t\t\t\t\tz = 0;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tz = Math.sqrt( zz );\r\n\t\t\t\t\tx = xz / z;\r\n\t\t\t\t\ty = yz / z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.set( x, y, z, angle );\r\n\r\n\t\t\treturn this; // return 180 deg rotation\r\n\r\n\t\t}\r\n\r\n\t\t// as we have reached here there are no singularities so we can handle normally\r\n\r\n\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 )\r\n\t\t\t\t\t\t + ( m13 - m31 ) * ( m13 - m31 )\r\n\t\t\t\t\t\t + ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\r\n\r\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\r\n\r\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\r\n\t\t// caught by singularity test above, but I've left it in just in case\r\n\r\n\t\tthis.x = ( m32 - m23 ) / s;\r\n\t\tthis.y = ( m13 - m31 ) / s;\r\n\t\tthis.z = ( m21 - m12 ) / s;\r\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmin: function ( v ) {\r\n\r\n\t\tif ( this.x > v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y > v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z > v.z ) {\r\n\r\n\t\t\tthis.z = v.z;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.w > v.w ) {\r\n\r\n\t\t\tthis.w = v.w;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmax: function ( v ) {\r\n\r\n\t\tif ( this.x < v.x ) {\r\n\r\n\t\t\tthis.x = v.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < v.y ) {\r\n\r\n\t\t\tthis.y = v.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z < v.z ) {\r\n\r\n\t\t\tthis.z = v.z;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.w < v.w ) {\r\n\r\n\t\t\tthis.w = v.w;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclamp: function ( min, max ) {\r\n\r\n\t\t// This function assumes min < max, if this assumption isn't true it will not operate correctly\r\n\r\n\t\tif ( this.x < min.x ) {\r\n\r\n\t\t\tthis.x = min.x;\r\n\r\n\t\t} else if ( this.x > max.x ) {\r\n\r\n\t\t\tthis.x = max.x;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.y < min.y ) {\r\n\r\n\t\t\tthis.y = min.y;\r\n\r\n\t\t} else if ( this.y > max.y ) {\r\n\r\n\t\t\tthis.y = max.y;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.z < min.z ) {\r\n\r\n\t\t\tthis.z = min.z;\r\n\r\n\t\t} else if ( this.z > max.z ) {\r\n\r\n\t\t\tthis.z = max.z;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.w < min.w ) {\r\n\r\n\t\t\tthis.w = min.w;\r\n\r\n\t\t} else if ( this.w > max.w ) {\r\n\r\n\t\t\tthis.w = max.w;\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function() {\r\n\r\n\t\treturn this.multiplyScalar( -1 );\r\n\r\n\t},\r\n\r\n\tdot: function ( v ) {\r\n\r\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\r\n\r\n\t},\r\n\r\n\tlengthSq: function () {\r\n\r\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\r\n\r\n\t},\r\n\r\n\tlength: function () {\r\n\r\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\r\n\r\n\t},\r\n\r\n\tlengthManhattan: function () {\r\n\r\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\treturn this.divideScalar( this.length() );\r\n\r\n\t},\r\n\r\n\tsetLength: function ( l ) {\r\n\r\n\t\tvar oldLength = this.length();\r\n\r\n\t\tif ( oldLength !== 0 && l !== oldLength ) {\r\n\r\n\t\t\tthis.multiplyScalar( l / oldLength );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlerp: function ( v, alpha ) {\r\n\r\n\t\tthis.x += ( v.x - this.x ) * alpha;\r\n\t\tthis.y += ( v.y - this.y ) * alpha;\r\n\t\tthis.z += ( v.z - this.z ) * alpha;\r\n\t\tthis.w += ( v.w - this.w ) * alpha;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( v ) {\r\n\r\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\r\n\r\n\t},\r\n\r\n\tfromArray: function ( array ) {\r\n\r\n\t\tthis.x = array[ 0 ];\r\n\t\tthis.y = array[ 1 ];\r\n\t\tthis.z = array[ 2 ];\r\n\t\tthis.w = array[ 3 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttoArray: function () {\r\n\r\n\t\treturn [ this.x, this.y, this.z, this.w ];\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Vector4( this.x, this.y, this.z, this.w );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Line3 = function ( start, end ) {\r\n\r\n\tthis.start = ( start !== undefined ) ? start : new THREE.Vector3();\r\n\tthis.end = ( end !== undefined ) ? end : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Line3.prototype = {\r\n\r\n\tconstructor: THREE.Line3,\r\n\r\n\tset: function ( start, end ) {\r\n\r\n\t\tthis.start.copy( start );\r\n\t\tthis.end.copy( end );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( line ) {\r\n\r\n\t\tthis.start.copy( line.start );\r\n\t\tthis.end.copy( line.end );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tdelta: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.subVectors( this.end, this.start );\r\n\r\n\t},\r\n\r\n\tdistanceSq: function () {\r\n\r\n\t\treturn this.start.distanceToSquared( this.end );\r\n\r\n\t},\r\n\r\n\tdistance: function () {\r\n\r\n\t\treturn this.start.distanceTo( this.end );\r\n\r\n\t},\r\n\r\n\tat: function ( t, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\r\n\r\n\t},\r\n\r\n\tclosestPointToPointParameter: function() {\r\n\r\n\t\tvar startP = new THREE.Vector3();\r\n\t\tvar startEnd = new THREE.Vector3();\r\n\r\n\t\treturn function ( point, clampToLine ) {\r\n\r\n\t\t\tstartP.subVectors( point, this.start );\r\n\t\t\tstartEnd.subVectors( this.end, this.start );\r\n\r\n\t\t\tvar startEnd2 = startEnd.dot( startEnd );\r\n\t\t\tvar startEnd_startP = startEnd.dot( startP );\r\n\r\n\t\t\tvar t = startEnd_startP / startEnd2;\r\n\r\n\t\t\tif ( clampToLine ) {\r\n\r\n\t\t\t\tt = THREE.Math.clamp( t, 0, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn t;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\r\n\r\n\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( matrix ) {\r\n\r\n\t\tthis.start.applyMatrix4( matrix );\r\n\t\tthis.end.applyMatrix4( matrix );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( line ) {\r\n\r\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Line3().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Box2 = function ( min, max ) {\r\n\r\n\tthis.min = ( min !== undefined ) ? min : new THREE.Vector2( Infinity, Infinity );\r\n\tthis.max = ( max !== undefined ) ? max : new THREE.Vector2( -Infinity, -Infinity );\r\n\r\n};\r\n\r\nTHREE.Box2.prototype = {\r\n\r\n\tconstructor: THREE.Box2,\r\n\r\n\tset: function ( min, max ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPoints: function ( points ) {\r\n\r\n\t\tif ( points.length > 0 ) {\r\n\r\n\t\t\tvar point = points[ 0 ];\r\n\r\n\t\t\tthis.min.copy( point );\r\n\t\t\tthis.max.copy( point );\r\n\r\n\t\t\tfor ( var i = 1, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tpoint = points[ i ];\r\n\r\n\t\t\t\tif ( point.x < this.min.x ) {\r\n\r\n\t\t\t\t\tthis.min.x = point.x;\r\n\r\n\t\t\t\t} else if ( point.x > this.max.x ) {\r\n\r\n\t\t\t\t\tthis.max.x = point.x;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( point.y < this.min.y ) {\r\n\r\n\t\t\t\t\tthis.min.y = point.y;\r\n\r\n\t\t\t\t} else if ( point.y > this.max.y ) {\r\n\r\n\t\t\t\t\tthis.max.y = point.y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.makeEmpty();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCenterAndSize: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector2();\r\n\r\n\t\treturn function ( center, size ) {\r\n\r\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\r\n\t\t\tthis.min.copy( center ).sub( halfSize );\r\n\t\t\tthis.max.copy( center ).add( halfSize );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tcopy: function ( box ) {\r\n\r\n\t\tthis.min.copy( box.min );\r\n\t\tthis.max.copy( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeEmpty: function () {\r\n\r\n\t\tthis.min.x = this.min.y = Infinity;\r\n\t\tthis.max.x = this.max.y = -Infinity;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tempty: function () {\r\n\r\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\r\n\r\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tsize: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.subVectors( this.max, this.min );\r\n\r\n\t},\r\n\r\n\texpandByPoint: function ( point ) {\r\n\r\n\t\tthis.min.min( point );\r\n\t\tthis.max.max( point );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\texpandByVector: function ( vector ) {\r\n\r\n\t\tthis.min.sub( vector );\r\n\t\tthis.max.add( vector );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\texpandByScalar: function ( scalar ) {\r\n\r\n\t\tthis.min.addScalar( -scalar );\r\n\t\tthis.max.addScalar( scalar );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tif ( point.x < this.min.x || point.x > this.max.x ||\r\n\t\t point.y < this.min.y || point.y > this.max.y ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tcontainsBox: function ( box ) {\r\n\r\n\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\r\n\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tgetParameter: function ( point ) {\r\n\r\n\t\t// This can potentially have a divide by zero if the box\r\n\t\t// has a size dimension of 0.\r\n\r\n\t\treturn new THREE.Vector2(\r\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\r\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\r\n\t\t);\r\n\r\n\t},\r\n\r\n\tisIntersectionBox: function ( box ) {\r\n\r\n\t\t// using 6 splitting planes to rule out intersections.\r\n\r\n\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\r\n\t\t box.max.y < this.min.y || box.min.y > this.max.y ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector2();\r\n\t\treturn result.copy( point ).clamp( this.min, this.max );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector2();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\r\n\t\t\treturn clampedPoint.sub( point ).length();\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersect: function ( box ) {\r\n\r\n\t\tthis.min.max( box.min );\r\n\t\tthis.max.min( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tunion: function ( box ) {\r\n\r\n\t\tthis.min.min( box.min );\r\n\t\tthis.max.max( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.min.add( offset );\r\n\t\tthis.max.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( box ) {\r\n\r\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Box2().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Box3 = function ( min, max ) {\r\n\r\n\tthis.min = ( min !== undefined ) ? min : new THREE.Vector3( Infinity, Infinity, Infinity );\r\n\tthis.max = ( max !== undefined ) ? max : new THREE.Vector3( -Infinity, -Infinity, -Infinity );\r\n\r\n};\r\n\r\nTHREE.Box3.prototype = {\r\n\r\n\tconstructor: THREE.Box3,\r\n\r\n\tset: function ( min, max ) {\r\n\r\n\t\tthis.min.copy( min );\r\n\t\tthis.max.copy( max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPoints: function ( points ) {\r\n\r\n\t\tif ( points.length > 0 ) {\r\n\r\n\t\t\tvar point = points[ 0 ];\r\n\r\n\t\t\tthis.min.copy( point );\r\n\t\t\tthis.max.copy( point );\r\n\r\n\t\t\tfor ( var i = 1, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tpoint = points[ i ];\r\n\r\n\t\t\t\tif ( point.x < this.min.x ) {\r\n\r\n\t\t\t\t\tthis.min.x = point.x;\r\n\r\n\t\t\t\t} else if ( point.x > this.max.x ) {\r\n\r\n\t\t\t\t\tthis.max.x = point.x;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( point.y < this.min.y ) {\r\n\r\n\t\t\t\t\tthis.min.y = point.y;\r\n\r\n\t\t\t\t} else if ( point.y > this.max.y ) {\r\n\r\n\t\t\t\t\tthis.max.y = point.y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( point.z < this.min.z ) {\r\n\r\n\t\t\t\t\tthis.min.z = point.z;\r\n\r\n\t\t\t\t} else if ( point.z > this.max.z ) {\r\n\r\n\t\t\t\t\tthis.max.z = point.z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.makeEmpty();\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCenterAndSize: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( center, size ) {\r\n\r\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\r\n\r\n\t\t\tthis.min.copy( center ).sub( halfSize );\r\n\t\t\tthis.max.copy( center ).add( halfSize );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tcopy: function ( box ) {\r\n\r\n\t\tthis.min.copy( box.min );\r\n\t\tthis.max.copy( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeEmpty: function () {\r\n\r\n\t\tthis.min.x = this.min.y = this.min.z = Infinity;\r\n\t\tthis.max.x = this.max.y = this.max.z = -Infinity;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tempty: function () {\r\n\r\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\r\n\r\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\r\n\r\n\t},\r\n\r\n\tcenter: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\r\n\r\n\t},\r\n\r\n\tsize: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.subVectors( this.max, this.min );\r\n\r\n\t},\r\n\r\n\texpandByPoint: function ( point ) {\r\n\r\n\t\tthis.min.min( point );\r\n\t\tthis.max.max( point );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByVector: function ( vector ) {\r\n\r\n\t\tthis.min.sub( vector );\r\n\t\tthis.max.add( vector );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\texpandByScalar: function ( scalar ) {\r\n\r\n\t\tthis.min.addScalar( -scalar );\r\n\t\tthis.max.addScalar( scalar );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tif ( point.x < this.min.x || point.x > this.max.x ||\r\n\t\t point.y < this.min.y || point.y > this.max.y ||\r\n\t\t point.z < this.min.z || point.z > this.max.z ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tcontainsBox: function ( box ) {\r\n\r\n\t\tif ( ( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&\r\n\t\t\t ( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&\r\n\t\t\t ( this.min.z <= box.min.z ) && ( box.max.z <= this.max.z ) ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tgetParameter: function ( point ) {\r\n\r\n\t\t// This can potentially have a divide by zero if the box\r\n\t\t// has a size dimension of 0.\r\n\r\n\t\treturn new THREE.Vector3(\r\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\r\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\r\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\r\n\t\t);\r\n\r\n\t},\r\n\r\n\tisIntersectionBox: function ( box ) {\r\n\r\n\t\t// using 6 splitting planes to rule out intersections.\r\n\r\n\t\tif ( box.max.x < this.min.x || box.min.x > this.max.x ||\r\n\t\t box.max.y < this.min.y || box.min.y > this.max.y ||\r\n\t\t box.max.z < this.min.z || box.min.z > this.max.z ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( point ).clamp( this.min, this.max );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\r\n\t\t\treturn clampedPoint.sub( point ).length();\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tgetBoundingSphere: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Sphere();\r\n\r\n\t\t\tresult.center = this.center();\r\n\t\t\tresult.radius = this.size( v1 ).length() * 0.5;\r\n\r\n\t\t\treturn result;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersect: function ( box ) {\r\n\r\n\t\tthis.min.max( box.min );\r\n\t\tthis.max.min( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tunion: function ( box ) {\r\n\r\n\t\tthis.min.min( box.min );\r\n\t\tthis.max.max( box.max );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function() {\r\n\r\n\t\tvar points = [\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3(),\r\n\t\t\tnew THREE.Vector3()\r\n\t\t];\r\n\r\n\t\treturn function ( matrix ) {\r\n\r\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\r\n\t\t\tpoints[0].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\r\n\t\t\tpoints[1].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\r\n\t\t\tpoints[2].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\r\n\t\t\tpoints[3].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\r\n\t\t\tpoints[4].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\r\n\t\t\tpoints[5].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\r\n\t\t\tpoints[6].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\r\n\t\t\tpoints[7].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\r\n\r\n\t\t\tthis.makeEmpty();\r\n\t\t\tthis.setFromPoints( points );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.min.add( offset );\r\n\t\tthis.max.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( box ) {\r\n\r\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Box3().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Matrix3 = function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\r\n\r\n\tthis.elements = new Float32Array(9);\r\n\r\n\tthis.set(\r\n\r\n\t\t( n11 !== undefined ) ? n11 : 1, n12 || 0, n13 || 0,\r\n\t\tn21 || 0, ( n22 !== undefined ) ? n22 : 1, n23 || 0,\r\n\t\tn31 || 0, n32 || 0, ( n33 !== undefined ) ? n33 : 1\r\n\r\n\t);\r\n};\r\n\r\nTHREE.Matrix3.prototype = {\r\n\r\n\tconstructor: THREE.Matrix3,\r\n\r\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[0] = n11; te[3] = n12; te[6] = n13;\r\n\t\tte[1] = n21; te[4] = n22; te[7] = n23;\r\n\t\tte[2] = n31; te[5] = n32; te[8] = n33;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tidentity: function () {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0,\r\n\t\t\t0, 1, 0,\r\n\t\t\t0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( m ) {\r\n\r\n\t\tvar me = m.elements;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tme[0], me[3], me[6],\r\n\t\t\tme[1], me[4], me[7],\r\n\t\t\tme[2], me[5], me[8]\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyVector3: function ( vector ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix3\\'s .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\r\n\t\treturn vector.applyMatrix3( this );\r\n\r\n\t},\r\n\r\n\tmultiplyVector3Array: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( a ) {\r\n\r\n\t\t\tfor ( var i = 0, il = a.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\tv1.x = a[ i ];\r\n\t\t\t\tv1.y = a[ i + 1 ];\r\n\t\t\t\tv1.z = a[ i + 2 ];\r\n\r\n\t\t\t\tv1.applyMatrix3(this);\r\n\r\n\t\t\t\ta[ i ] = v1.x;\r\n\t\t\t\ta[ i + 1 ] = v1.y;\r\n\t\t\t\ta[ i + 2 ] = v1.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[0] *= s; te[3] *= s; te[6] *= s;\r\n\t\tte[1] *= s; te[4] *= s; te[7] *= s;\r\n\t\tte[2] *= s; te[5] *= s; te[8] *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdeterminant: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar a = te[0], b = te[1], c = te[2],\r\n\t\t\td = te[3], e = te[4], f = te[5],\r\n\t\t\tg = te[6], h = te[7], i = te[8];\r\n\r\n\t\treturn a*e*i - a*f*h - b*d*i + b*f*g + c*d*h - c*e*g;\r\n\r\n\t},\r\n\r\n\tgetInverse: function ( matrix, throwOnInvertible ) {\r\n\r\n\t\t// input: THREE.Matrix4\r\n\t\t// ( based on http://code.google.com/p/webgl-mjs/ )\r\n\r\n\t\tvar me = matrix.elements;\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[ 0 ] = me[10] * me[5] - me[6] * me[9];\r\n\t\tte[ 1 ] = - me[10] * me[1] + me[2] * me[9];\r\n\t\tte[ 2 ] = me[6] * me[1] - me[2] * me[5];\r\n\t\tte[ 3 ] = - me[10] * me[4] + me[6] * me[8];\r\n\t\tte[ 4 ] = me[10] * me[0] - me[2] * me[8];\r\n\t\tte[ 5 ] = - me[6] * me[0] + me[2] * me[4];\r\n\t\tte[ 6 ] = me[9] * me[4] - me[5] * me[8];\r\n\t\tte[ 7 ] = - me[9] * me[0] + me[1] * me[8];\r\n\t\tte[ 8 ] = me[5] * me[0] - me[1] * me[4];\r\n\r\n\t\tvar det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 3 ] + me[ 2 ] * te[ 6 ];\r\n\r\n\t\t// no inverse\r\n\r\n\t\tif ( det === 0 ) {\r\n\r\n\t\t\tvar msg = \"Matrix3.getInverse(): can't invert matrix, determinant is 0\";\r\n\r\n\t\t\tif ( throwOnInvertible || false ) {\r\n\r\n\t\t\t\tthrow new Error( msg ); \r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.warn( msg );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.identity();\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t\tthis.multiplyScalar( 1.0 / det );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranspose: function () {\r\n\r\n\t\tvar tmp, m = this.elements;\r\n\r\n\t\ttmp = m[1]; m[1] = m[3]; m[3] = tmp;\r\n\t\ttmp = m[2]; m[2] = m[6]; m[6] = tmp;\r\n\t\ttmp = m[5]; m[5] = m[7]; m[7] = tmp;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetNormalMatrix: function ( m ) {\r\n\r\n\t\t// input: THREE.Matrix4\r\n\r\n\t\tthis.getInverse( m ).transpose();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttransposeIntoArray: function ( r ) {\r\n\r\n\t\tvar m = this.elements;\r\n\r\n\t\tr[ 0 ] = m[ 0 ];\r\n\t\tr[ 1 ] = m[ 3 ];\r\n\t\tr[ 2 ] = m[ 6 ];\r\n\t\tr[ 3 ] = m[ 1 ];\r\n\t\tr[ 4 ] = m[ 4 ];\r\n\t\tr[ 5 ] = m[ 7 ];\r\n\t\tr[ 6 ] = m[ 2 ];\r\n\t\tr[ 7 ] = m[ 5 ];\r\n\t\tr[ 8 ] = m[ 8 ];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\treturn new THREE.Matrix3(\r\n\r\n\t\t\tte[0], te[3], te[6],\r\n\t\t\tte[1], te[4], te[7],\r\n\t\t\tte[2], te[5], te[8]\r\n\r\n\t\t);\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author philogb / http://blog.thejit.org/\r\n * @author jordi_ros / http://plattsoft.com\r\n * @author D1plo1d / http://github.com/D1plo1d\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author timknip / http://www.floorplanner.com/\r\n * @author bhouston / http://exocortex.com\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\n\r\nTHREE.Matrix4 = function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\r\n\r\n\tvar te = this.elements = new Float32Array( 16 );\r\n\r\n\t// TODO: if n11 is undefined, then just set to identity, otherwise copy all other values into matrix\r\n\t// we should not support semi specification of Matrix4, it is just weird.\r\n\r\n\tte[0] = ( n11 !== undefined ) ? n11 : 1; te[4] = n12 || 0; te[8] = n13 || 0; te[12] = n14 || 0;\r\n\tte[1] = n21 || 0; te[5] = ( n22 !== undefined ) ? n22 : 1; te[9] = n23 || 0; te[13] = n24 || 0;\r\n\tte[2] = n31 || 0; te[6] = n32 || 0; te[10] = ( n33 !== undefined ) ? n33 : 1; te[14] = n34 || 0;\r\n\tte[3] = n41 || 0; te[7] = n42 || 0; te[11] = n43 || 0; te[15] = ( n44 !== undefined ) ? n44 : 1;\r\n\r\n};\r\n\r\nTHREE.Matrix4.prototype = {\r\n\r\n\tconstructor: THREE.Matrix4,\r\n\r\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[0] = n11; te[4] = n12; te[8] = n13; te[12] = n14;\r\n\t\tte[1] = n21; te[5] = n22; te[9] = n23; te[13] = n24;\r\n\t\tte[2] = n31; te[6] = n32; te[10] = n33; te[14] = n34;\r\n\t\tte[3] = n41; te[7] = n42; te[11] = n43; te[15] = n44;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tidentity: function () {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, 1, 0, 0,\r\n\t\t\t0, 0, 1, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( m ) {\r\n\r\n\t\tvar me = m.elements;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tme[0], me[4], me[8], me[12],\r\n\t\t\tme[1], me[5], me[9], me[13],\r\n\t\t\tme[2], me[6], me[10], me[14],\r\n\t\t\tme[3], me[7], me[11], me[15]\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\textractPosition: function ( m ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .extractPosition() has been renamed to .copyPosition().' );\r\n\t\treturn this.copyPosition( m );\r\n\r\n\t},\r\n\r\n\tcopyPosition: function ( m ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar me = m.elements;\r\n\r\n\t\tte[12] = me[12];\r\n\t\tte[13] = me[13];\r\n\t\tte[14] = me[14];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\textractRotation: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( m ) {\r\n\r\n\t\t\tvar te = this.elements;\r\n\t\t\tvar me = m.elements;\r\n\r\n\t\t\tvar scaleX = 1 / v1.set( me[0], me[1], me[2] ).length();\r\n\t\t\tvar scaleY = 1 / v1.set( me[4], me[5], me[6] ).length();\r\n\t\t\tvar scaleZ = 1 / v1.set( me[8], me[9], me[10] ).length();\r\n\r\n\t\t\tte[0] = me[0] * scaleX;\r\n\t\t\tte[1] = me[1] * scaleX;\r\n\t\t\tte[2] = me[2] * scaleX;\r\n\r\n\t\t\tte[4] = me[4] * scaleY;\r\n\t\t\tte[5] = me[5] * scaleY;\r\n\t\t\tte[6] = me[6] * scaleY;\r\n\r\n\t\t\tte[8] = me[8] * scaleZ;\r\n\t\t\tte[9] = me[9] * scaleZ;\r\n\t\t\tte[10] = me[10] * scaleZ;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetRotationFromEuler: function ( v, order ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .setRotationFromEuler() has been deprecated in favor of makeRotationFromEuler. Please update your code.' );\r\n\r\n\t\treturn this.makeRotationFromEuler( v, order );\r\n\r\n\t},\r\n\r\n\tmakeRotationFromEuler: function ( v, order ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar x = v.x, y = v.y, z = v.z;\r\n\t\tvar a = Math.cos( x ), b = Math.sin( x );\r\n\t\tvar c = Math.cos( y ), d = Math.sin( y );\r\n\t\tvar e = Math.cos( z ), f = Math.sin( z );\r\n\r\n\t\tif ( order === undefined || order === 'XYZ' ) {\r\n\r\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\r\n\r\n\t\t\tte[0] = c * e;\r\n\t\t\tte[4] = - c * f;\r\n\t\t\tte[8] = d;\r\n\r\n\t\t\tte[1] = af + be * d;\r\n\t\t\tte[5] = ae - bf * d;\r\n\t\t\tte[9] = - b * c;\r\n\r\n\t\t\tte[2] = bf - ae * d;\r\n\t\t\tte[6] = be + af * d;\r\n\t\t\tte[10] = a * c;\r\n\r\n\t\t} else if ( order === 'YXZ' ) {\r\n\r\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\r\n\r\n\t\t\tte[0] = ce + df * b;\r\n\t\t\tte[4] = de * b - cf;\r\n\t\t\tte[8] = a * d;\r\n\r\n\t\t\tte[1] = a * f;\r\n\t\t\tte[5] = a * e;\r\n\t\t\tte[9] = - b;\r\n\r\n\t\t\tte[2] = cf * b - de;\r\n\t\t\tte[6] = df + ce * b;\r\n\t\t\tte[10] = a * c;\r\n\r\n\t\t} else if ( order === 'ZXY' ) {\r\n\r\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\r\n\r\n\t\t\tte[0] = ce - df * b;\r\n\t\t\tte[4] = - a * f;\r\n\t\t\tte[8] = de + cf * b;\r\n\r\n\t\t\tte[1] = cf + de * b;\r\n\t\t\tte[5] = a * e;\r\n\t\t\tte[9] = df - ce * b;\r\n\r\n\t\t\tte[2] = - a * d;\r\n\t\t\tte[6] = b;\r\n\t\t\tte[10] = a * c;\r\n\r\n\t\t} else if ( order === 'ZYX' ) {\r\n\r\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\r\n\r\n\t\t\tte[0] = c * e;\r\n\t\t\tte[4] = be * d - af;\r\n\t\t\tte[8] = ae * d + bf;\r\n\r\n\t\t\tte[1] = c * f;\r\n\t\t\tte[5] = bf * d + ae;\r\n\t\t\tte[9] = af * d - be;\r\n\r\n\t\t\tte[2] = - d;\r\n\t\t\tte[6] = b * c;\r\n\t\t\tte[10] = a * c;\r\n\r\n\t\t} else if ( order === 'YZX' ) {\r\n\r\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\r\n\r\n\t\t\tte[0] = c * e;\r\n\t\t\tte[4] = bd - ac * f;\r\n\t\t\tte[8] = bc * f + ad;\r\n\r\n\t\t\tte[1] = f;\r\n\t\t\tte[5] = a * e;\r\n\t\t\tte[9] = - b * e;\r\n\r\n\t\t\tte[2] = - d * e;\r\n\t\t\tte[6] = ad * f + bc;\r\n\t\t\tte[10] = ac - bd * f;\r\n\r\n\t\t} else if ( order === 'XZY' ) {\r\n\r\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\r\n\r\n\t\t\tte[0] = c * e;\r\n\t\t\tte[4] = - f;\r\n\t\t\tte[8] = d * e;\r\n\r\n\t\t\tte[1] = ac * f + bd;\r\n\t\t\tte[5] = a * e;\r\n\t\t\tte[9] = ad * f - bc;\r\n\r\n\t\t\tte[2] = bc * f - ad;\r\n\t\t\tte[6] = b * e;\r\n\t\t\tte[10] = bd * f + ac;\r\n\r\n\t\t}\r\n\r\n\t\t// last column\r\n\t\tte[3] = 0;\r\n\t\tte[7] = 0;\r\n\t\tte[11] = 0;\r\n\r\n\t\t// bottom row\r\n\t\tte[12] = 0;\r\n\t\tte[13] = 0;\r\n\t\tte[14] = 0;\r\n\t\tte[15] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetRotationFromQuaternion: function ( q ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .setRotationFromQuaternion() has been deprecated in favor of makeRotationFromQuaternion. Please update your code.' );\r\n\r\n\t\treturn this.makeRotationFromQuaternion( q );\r\n\r\n\t},\r\n\r\n\tmakeRotationFromQuaternion: function ( q ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar x = q.x, y = q.y, z = q.z, w = q.w;\r\n\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\r\n\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\r\n\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\r\n\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\r\n\r\n\t\tte[0] = 1 - ( yy + zz );\r\n\t\tte[4] = xy - wz;\r\n\t\tte[8] = xz + wy;\r\n\r\n\t\tte[1] = xy + wz;\r\n\t\tte[5] = 1 - ( xx + zz );\r\n\t\tte[9] = yz - wx;\r\n\r\n\t\tte[2] = xz - wy;\r\n\t\tte[6] = yz + wx;\r\n\t\tte[10] = 1 - ( xx + yy );\r\n\r\n\t\t// last column\r\n\t\tte[3] = 0;\r\n\t\tte[7] = 0;\r\n\t\tte[11] = 0;\r\n\r\n\t\t// bottom row\r\n\t\tte[12] = 0;\r\n\t\tte[13] = 0;\r\n\t\tte[14] = 0;\r\n\t\tte[15] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tlookAt: function() {\r\n\r\n\t\tvar x = new THREE.Vector3();\r\n\t\tvar y = new THREE.Vector3();\r\n\t\tvar z = new THREE.Vector3();\r\n\r\n\t\treturn function ( eye, target, up ) {\r\n\r\n\t\t\tvar te = this.elements;\r\n\r\n\t\t\tz.subVectors( eye, target ).normalize();\r\n\r\n\t\t\tif ( z.length() === 0 ) {\r\n\r\n\t\t\t\tz.z = 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tx.crossVectors( up, z ).normalize();\r\n\r\n\t\t\tif ( x.length() === 0 ) {\r\n\r\n\t\t\t\tz.x += 0.0001;\r\n\t\t\t\tx.crossVectors( up, z ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t\ty.crossVectors( z, x );\r\n\r\n\r\n\t\t\tte[0] = x.x; te[4] = y.x; te[8] = z.x;\r\n\t\t\tte[1] = x.y; te[5] = y.y; te[9] = z.y;\r\n\t\t\tte[2] = x.z; te[6] = y.z; te[10] = z.z;\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmultiply: function ( m, n ) {\r\n\r\n\t\tif ( n !== undefined ) {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\r\n\t\t\treturn this.multiplyMatrices( m, n );\r\n\r\n\t\t}\r\n\r\n\t\treturn this.multiplyMatrices( this, m );\r\n\r\n\t},\r\n\r\n\tmultiplyMatrices: function ( a, b ) {\r\n\r\n\t\tvar ae = a.elements;\r\n\t\tvar be = b.elements;\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar a11 = ae[0], a12 = ae[4], a13 = ae[8], a14 = ae[12];\r\n\t\tvar a21 = ae[1], a22 = ae[5], a23 = ae[9], a24 = ae[13];\r\n\t\tvar a31 = ae[2], a32 = ae[6], a33 = ae[10], a34 = ae[14];\r\n\t\tvar a41 = ae[3], a42 = ae[7], a43 = ae[11], a44 = ae[15];\r\n\r\n\t\tvar b11 = be[0], b12 = be[4], b13 = be[8], b14 = be[12];\r\n\t\tvar b21 = be[1], b22 = be[5], b23 = be[9], b24 = be[13];\r\n\t\tvar b31 = be[2], b32 = be[6], b33 = be[10], b34 = be[14];\r\n\t\tvar b41 = be[3], b42 = be[7], b43 = be[11], b44 = be[15];\r\n\r\n\t\tte[0] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\r\n\t\tte[4] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\r\n\t\tte[8] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\r\n\t\tte[12] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\r\n\r\n\t\tte[1] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\r\n\t\tte[5] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\r\n\t\tte[9] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\r\n\t\tte[13] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\r\n\r\n\t\tte[2] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\r\n\t\tte[6] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\r\n\t\tte[10] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\r\n\t\tte[14] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\r\n\r\n\t\tte[3] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\r\n\t\tte[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\r\n\t\tte[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\r\n\t\tte[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyToArray: function ( a, b, r ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tthis.multiplyMatrices( a, b );\r\n\r\n\t\tr[ 0 ] = te[0]; r[ 1 ] = te[1]; r[ 2 ] = te[2]; r[ 3 ] = te[3];\r\n\t\tr[ 4 ] = te[4]; r[ 5 ] = te[5]; r[ 6 ] = te[6]; r[ 7 ] = te[7];\r\n\t\tr[ 8 ] = te[8]; r[ 9 ] = te[9]; r[ 10 ] = te[10]; r[ 11 ] = te[11];\r\n\t\tr[ 12 ] = te[12]; r[ 13 ] = te[13]; r[ 14 ] = te[14]; r[ 15 ] = te[15];\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyScalar: function ( s ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[0] *= s; te[4] *= s; te[8] *= s; te[12] *= s;\r\n\t\tte[1] *= s; te[5] *= s; te[9] *= s; te[13] *= s;\r\n\t\tte[2] *= s; te[6] *= s; te[10] *= s; te[14] *= s;\r\n\t\tte[3] *= s; te[7] *= s; te[11] *= s; te[15] *= s;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmultiplyVector3: function ( vector ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.' );\r\n\t\treturn vector.applyProjection( this );\r\n\r\n\t},\r\n\r\n\tmultiplyVector4: function ( vector ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\r\n\t\treturn vector.applyMatrix4( this );\r\n\r\n\t},\r\n\r\n\tmultiplyVector3Array: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( a ) {\r\n\r\n\t\t\tfor ( var i = 0, il = a.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\tv1.x = a[ i ];\r\n\t\t\t\tv1.y = a[ i + 1 ];\r\n\t\t\t\tv1.z = a[ i + 2 ];\r\n\r\n\t\t\t\tv1.applyProjection( this );\r\n\r\n\t\t\t\ta[ i ] = v1.x;\r\n\t\t\t\ta[ i + 1 ] = v1.y;\r\n\t\t\t\ta[ i + 2 ] = v1.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn a;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\trotateAxis: function ( v ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\r\n\r\n\t\tv.transformDirection( this );\r\n\r\n\t},\r\n\r\n\tcrossVector: function ( vector ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\r\n\t\treturn vector.applyMatrix4( this );\r\n\r\n\t},\r\n\r\n\tdeterminant: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar n11 = te[0], n12 = te[4], n13 = te[8], n14 = te[12];\r\n\t\tvar n21 = te[1], n22 = te[5], n23 = te[9], n24 = te[13];\r\n\t\tvar n31 = te[2], n32 = te[6], n33 = te[10], n34 = te[14];\r\n\t\tvar n41 = te[3], n42 = te[7], n43 = te[11], n44 = te[15];\r\n\r\n\t\t//TODO: make this more efficient\r\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\r\n\r\n\t\treturn (\r\n\t\t\tn41 * (\r\n\t\t\t\t+n14 * n23 * n32\r\n\t\t\t\t-n13 * n24 * n32\r\n\t\t\t\t-n14 * n22 * n33\r\n\t\t\t\t+n12 * n24 * n33\r\n\t\t\t\t+n13 * n22 * n34\r\n\t\t\t\t-n12 * n23 * n34\r\n\t\t\t) +\r\n\t\t\tn42 * (\r\n\t\t\t\t+n11 * n23 * n34\r\n\t\t\t\t-n11 * n24 * n33\r\n\t\t\t\t+n14 * n21 * n33\r\n\t\t\t\t-n13 * n21 * n34\r\n\t\t\t\t+n13 * n24 * n31\r\n\t\t\t\t-n14 * n23 * n31\r\n\t\t\t) +\r\n\t\t\tn43 * (\r\n\t\t\t\t+n11 * n24 * n32\r\n\t\t\t\t-n11 * n22 * n34\r\n\t\t\t\t-n14 * n21 * n32\r\n\t\t\t\t+n12 * n21 * n34\r\n\t\t\t\t+n14 * n22 * n31\r\n\t\t\t\t-n12 * n24 * n31\r\n\t\t\t) +\r\n\t\t\tn44 * (\r\n\t\t\t\t-n13 * n22 * n31\r\n\t\t\t\t-n11 * n23 * n32\r\n\t\t\t\t+n11 * n22 * n33\r\n\t\t\t\t+n13 * n21 * n32\r\n\t\t\t\t-n12 * n21 * n33\r\n\t\t\t\t+n12 * n23 * n31\r\n\t\t\t)\r\n\r\n\t\t);\r\n\r\n\t},\r\n\r\n\ttranspose: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar tmp;\r\n\r\n\t\ttmp = te[1]; te[1] = te[4]; te[4] = tmp;\r\n\t\ttmp = te[2]; te[2] = te[8]; te[8] = tmp;\r\n\t\ttmp = te[6]; te[6] = te[9]; te[9] = tmp;\r\n\r\n\t\ttmp = te[3]; te[3] = te[12]; te[12] = tmp;\r\n\t\ttmp = te[7]; te[7] = te[13]; te[13] = tmp;\r\n\t\ttmp = te[11]; te[11] = te[14]; te[14] = tmp;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tflattenToArray: function ( flat ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tflat[ 0 ] = te[0]; flat[ 1 ] = te[1]; flat[ 2 ] = te[2]; flat[ 3 ] = te[3];\r\n\t\tflat[ 4 ] = te[4]; flat[ 5 ] = te[5]; flat[ 6 ] = te[6]; flat[ 7 ] = te[7];\r\n\t\tflat[ 8 ] = te[8]; flat[ 9 ] = te[9]; flat[ 10 ] = te[10]; flat[ 11 ] = te[11];\r\n\t\tflat[ 12 ] = te[12]; flat[ 13 ] = te[13]; flat[ 14 ] = te[14]; flat[ 15 ] = te[15];\r\n\r\n\t\treturn flat;\r\n\r\n\t},\r\n\r\n\tflattenToArrayOffset: function( flat, offset ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tflat[ offset ] = te[0];\r\n\t\tflat[ offset + 1 ] = te[1];\r\n\t\tflat[ offset + 2 ] = te[2];\r\n\t\tflat[ offset + 3 ] = te[3];\r\n\r\n\t\tflat[ offset + 4 ] = te[4];\r\n\t\tflat[ offset + 5 ] = te[5];\r\n\t\tflat[ offset + 6 ] = te[6];\r\n\t\tflat[ offset + 7 ] = te[7];\r\n\r\n\t\tflat[ offset + 8 ] = te[8];\r\n\t\tflat[ offset + 9 ] = te[9];\r\n\t\tflat[ offset + 10 ] = te[10];\r\n\t\tflat[ offset + 11 ] = te[11];\r\n\r\n\t\tflat[ offset + 12 ] = te[12];\r\n\t\tflat[ offset + 13 ] = te[13];\r\n\t\tflat[ offset + 14 ] = te[14];\r\n\t\tflat[ offset + 15 ] = te[15];\r\n\r\n\t\treturn flat;\r\n\r\n\t},\r\n\r\n\tgetPosition: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .getPosition() has been removed. Use Vector3.getPositionFromMatrix( matrix ) instead.' );\r\n\r\n\t\t\tvar te = this.elements;\r\n\t\t\treturn v1.set( te[12], te[13], te[14] );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tsetPosition: function ( v ) {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tte[12] = v.x;\r\n\t\tte[13] = v.y;\r\n\t\tte[14] = v.z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetInverse: function ( m, throwOnInvertible ) {\r\n\r\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\r\n\t\tvar te = this.elements;\r\n\t\tvar me = m.elements;\r\n\r\n\t\tvar n11 = me[0], n12 = me[4], n13 = me[8], n14 = me[12];\r\n\t\tvar n21 = me[1], n22 = me[5], n23 = me[9], n24 = me[13];\r\n\t\tvar n31 = me[2], n32 = me[6], n33 = me[10], n34 = me[14];\r\n\t\tvar n41 = me[3], n42 = me[7], n43 = me[11], n44 = me[15];\r\n\r\n\t\tte[0] = n23*n34*n42 - n24*n33*n42 + n24*n32*n43 - n22*n34*n43 - n23*n32*n44 + n22*n33*n44;\r\n\t\tte[4] = n14*n33*n42 - n13*n34*n42 - n14*n32*n43 + n12*n34*n43 + n13*n32*n44 - n12*n33*n44;\r\n\t\tte[8] = n13*n24*n42 - n14*n23*n42 + n14*n22*n43 - n12*n24*n43 - n13*n22*n44 + n12*n23*n44;\r\n\t\tte[12] = n14*n23*n32 - n13*n24*n32 - n14*n22*n33 + n12*n24*n33 + n13*n22*n34 - n12*n23*n34;\r\n\t\tte[1] = n24*n33*n41 - n23*n34*n41 - n24*n31*n43 + n21*n34*n43 + n23*n31*n44 - n21*n33*n44;\r\n\t\tte[5] = n13*n34*n41 - n14*n33*n41 + n14*n31*n43 - n11*n34*n43 - n13*n31*n44 + n11*n33*n44;\r\n\t\tte[9] = n14*n23*n41 - n13*n24*n41 - n14*n21*n43 + n11*n24*n43 + n13*n21*n44 - n11*n23*n44;\r\n\t\tte[13] = n13*n24*n31 - n14*n23*n31 + n14*n21*n33 - n11*n24*n33 - n13*n21*n34 + n11*n23*n34;\r\n\t\tte[2] = n22*n34*n41 - n24*n32*n41 + n24*n31*n42 - n21*n34*n42 - n22*n31*n44 + n21*n32*n44;\r\n\t\tte[6] = n14*n32*n41 - n12*n34*n41 - n14*n31*n42 + n11*n34*n42 + n12*n31*n44 - n11*n32*n44;\r\n\t\tte[10] = n12*n24*n41 - n14*n22*n41 + n14*n21*n42 - n11*n24*n42 - n12*n21*n44 + n11*n22*n44;\r\n\t\tte[14] = n14*n22*n31 - n12*n24*n31 - n14*n21*n32 + n11*n24*n32 + n12*n21*n34 - n11*n22*n34;\r\n\t\tte[3] = n23*n32*n41 - n22*n33*n41 - n23*n31*n42 + n21*n33*n42 + n22*n31*n43 - n21*n32*n43;\r\n\t\tte[7] = n12*n33*n41 - n13*n32*n41 + n13*n31*n42 - n11*n33*n42 - n12*n31*n43 + n11*n32*n43;\r\n\t\tte[11] = n13*n22*n41 - n12*n23*n41 - n13*n21*n42 + n11*n23*n42 + n12*n21*n43 - n11*n22*n43;\r\n\t\tte[15] = n12*n23*n31 - n13*n22*n31 + n13*n21*n32 - n11*n23*n32 - n12*n21*n33 + n11*n22*n33;\r\n\r\n\t\tvar det = me[ 0 ] * te[ 0 ] + me[ 1 ] * te[ 4 ] + me[ 2 ] * te[ 8 ] + me[ 3 ] * te[ 12 ];\r\n\r\n\t\tif ( det == 0 ) {\r\n\r\n\t\t\tvar msg = \"Matrix4.getInverse(): can't invert matrix, determinant is 0\";\r\n\r\n\t\t\tif ( throwOnInvertible || false ) {\r\n\r\n\t\t\t\tthrow new Error( msg ); \r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.warn( msg );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.identity();\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tthis.multiplyScalar( 1 / det );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranslate: function ( v ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .translate() has been removed.');\r\n\r\n\t},\r\n\r\n\trotateX: function ( angle ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .rotateX() has been removed.');\r\n\r\n\t},\r\n\r\n\trotateY: function ( angle ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .rotateY() has been removed.');\r\n\r\n\t},\r\n\r\n\trotateZ: function ( angle ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .rotateZ() has been removed.');\r\n\r\n\t},\r\n\r\n\trotateByAxis: function ( axis, angle ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .rotateByAxis() has been removed.');\r\n\r\n\t},\r\n\r\n\tscale: function ( v ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar x = v.x, y = v.y, z = v.z;\r\n\r\n\t\tte[0] *= x; te[4] *= y; te[8] *= z;\r\n\t\tte[1] *= x; te[5] *= y; te[9] *= z;\r\n\t\tte[2] *= x; te[6] *= y; te[10] *= z;\r\n\t\tte[3] *= x; te[7] *= y; te[11] *= z;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tgetMaxScaleOnAxis: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\tvar scaleXSq = te[0] * te[0] + te[1] * te[1] + te[2] * te[2];\r\n\t\tvar scaleYSq = te[4] * te[4] + te[5] * te[5] + te[6] * te[6];\r\n\t\tvar scaleZSq = te[8] * te[8] + te[9] * te[9] + te[10] * te[10];\r\n\r\n\t\treturn Math.sqrt( Math.max( scaleXSq, Math.max( scaleYSq, scaleZSq ) ) );\r\n\r\n\t},\r\n\r\n\tmakeTranslation: function ( x, y, z ) {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, x,\r\n\t\t\t0, 1, 0, y,\r\n\t\t\t0, 0, 1, z,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationX: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t1, 0, 0, 0,\r\n\t\t\t0, c, -s, 0,\r\n\t\t\t0, s, c, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationY: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\t c, 0, s, 0,\r\n\t\t\t 0, 1, 0, 0,\r\n\t\t\t-s, 0, c, 0,\r\n\t\t\t 0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationZ: function ( theta ) {\r\n\r\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tc, -s, 0, 0,\r\n\t\t\ts, c, 0, 0,\r\n\t\t\t0, 0, 1, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeRotationAxis: function ( axis, angle ) {\r\n\r\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\r\n\r\n\t\tvar c = Math.cos( angle );\r\n\t\tvar s = Math.sin( angle );\r\n\t\tvar t = 1 - c;\r\n\t\tvar x = axis.x, y = axis.y, z = axis.z;\r\n\t\tvar tx = t * x, ty = t * y;\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\r\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\r\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\t return this;\r\n\r\n\t},\r\n\r\n\tmakeScale: function ( x, y, z ) {\r\n\r\n\t\tthis.set(\r\n\r\n\t\t\tx, 0, 0, 0,\r\n\t\t\t0, y, 0, 0,\r\n\t\t\t0, 0, z, 0,\r\n\t\t\t0, 0, 0, 1\r\n\r\n\t\t);\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcompose: function ( position, quaternion, scale ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Matrix4\\'s .compose() has been deprecated in favor of makeFromPositionQuaternionScale. Please update your code.' );\r\n\r\n\t\treturn this.makeFromPositionQuaternionScale( position, quaternion, scale );\r\n\r\n\t},\r\n\r\n\tmakeFromPositionQuaternionScale: function ( position, quaternion, scale ) {\r\n\r\n\t\tthis.makeRotationFromQuaternion( quaternion );\r\n\t\tthis.scale( scale );\r\n\t\tthis.setPosition( position );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeFromPositionEulerScale: function ( position, rotation, eulerOrder, scale ) {\r\n\r\n\t\tthis.makeRotationFromEuler( rotation, eulerOrder );\r\n\t\tthis.scale( scale );\r\n\t\tthis.setPosition( position );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar x = 2 * near / ( right - left );\r\n\t\tvar y = 2 * near / ( top - bottom );\r\n\r\n\t\tvar a = ( right + left ) / ( right - left );\r\n\t\tvar b = ( top + bottom ) / ( top - bottom );\r\n\t\tvar c = - ( far + near ) / ( far - near );\r\n\t\tvar d = - 2 * far * near / ( far - near );\r\n\r\n\t\tte[0] = x;\tte[4] = 0;\tte[8] = a;\tte[12] = 0;\r\n\t\tte[1] = 0;\tte[5] = y;\tte[9] = b;\tte[13] = 0;\r\n\t\tte[2] = 0;\tte[6] = 0;\tte[10] = c;\tte[14] = d;\r\n\t\tte[3] = 0;\tte[7] = 0;\tte[11] = - 1;\tte[15] = 0;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tmakePerspective: function ( fov, aspect, near, far ) {\r\n\r\n\t\tvar ymax = near * Math.tan( THREE.Math.degToRad( fov * 0.5 ) );\r\n\t\tvar ymin = - ymax;\r\n\t\tvar xmin = ymin * aspect;\r\n\t\tvar xmax = ymax * aspect;\r\n\r\n\t\treturn this.makeFrustum( xmin, xmax, ymin, ymax, near, far );\r\n\r\n\t},\r\n\r\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\r\n\r\n\t\tvar te = this.elements;\r\n\t\tvar w = right - left;\r\n\t\tvar h = top - bottom;\r\n\t\tvar p = far - near;\r\n\r\n\t\tvar x = ( right + left ) / w;\r\n\t\tvar y = ( top + bottom ) / h;\r\n\t\tvar z = ( far + near ) / p;\r\n\r\n\t\tte[0] = 2 / w;\tte[4] = 0;\tte[8] = 0;\tte[12] = -x;\r\n\t\tte[1] = 0;\tte[5] = 2 / h;\tte[9] = 0;\tte[13] = -y;\r\n\t\tte[2] = 0;\tte[6] = 0;\tte[10] = -2/p;\tte[14] = -z;\r\n\t\tte[3] = 0;\tte[7] = 0;\tte[11] = 0;\tte[15] = 1;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar te = this.elements;\r\n\r\n\t\treturn new THREE.Matrix4(\r\n\r\n\t\t\tte[0], te[4], te[8], te[12],\r\n\t\t\tte[1], te[5], te[9], te[13],\r\n\t\t\tte[2], te[6], te[10], te[14],\r\n\t\t\tte[3], te[7], te[11], te[15]\r\n\r\n\t\t);\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.extend( THREE.Matrix4.prototype, {\r\n\r\n\tdecompose: function() {\r\n\r\n\t\tvar x = new THREE.Vector3();\r\n\t\tvar y = new THREE.Vector3();\r\n\t\tvar z = new THREE.Vector3();\r\n\t\tvar matrix = new THREE.Matrix4();\r\n\r\n\t\treturn function ( position, quaternion, scale ) {\r\n\r\n\t\t\tvar te = this.elements;\r\n\r\n\t\t\t// grab the axis vectors\r\n\t\t\tx.set( te[0], te[1], te[2] );\r\n\t\t\ty.set( te[4], te[5], te[6] );\r\n\t\t\tz.set( te[8], te[9], te[10] );\r\n\r\n\t\t\tposition = ( position instanceof THREE.Vector3 ) ? position : new THREE.Vector3();\r\n\t\t\tquaternion = ( quaternion instanceof THREE.Quaternion ) ? quaternion : new THREE.Quaternion();\r\n\t\t\tscale = ( scale instanceof THREE.Vector3 ) ? scale : new THREE.Vector3();\r\n\r\n\t\t\tscale.x = x.length();\r\n\t\t\tscale.y = y.length();\r\n\t\t\tscale.z = z.length();\r\n\r\n\t\t\tposition.x = te[12];\r\n\t\t\tposition.y = te[13];\r\n\t\t\tposition.z = te[14];\r\n\r\n\t\t\t// scale the rotation part\r\n\r\n\t\t\tmatrix.copy( this );\r\n\r\n\t\t\tmatrix.elements[0] /= scale.x;\r\n\t\t\tmatrix.elements[1] /= scale.x;\r\n\t\t\tmatrix.elements[2] /= scale.x;\r\n\r\n\t\t\tmatrix.elements[4] /= scale.y;\r\n\t\t\tmatrix.elements[5] /= scale.y;\r\n\t\t\tmatrix.elements[6] /= scale.y;\r\n\r\n\t\t\tmatrix.elements[8] /= scale.z;\r\n\t\t\tmatrix.elements[9] /= scale.z;\r\n\t\t\tmatrix.elements[10] /= scale.z;\r\n\r\n\t\t\tquaternion.setFromRotationMatrix( matrix );\r\n\r\n\t\t\treturn [ position, quaternion, scale ];\r\n\r\n\t\t};\r\n\r\n\t}()\r\n\r\n} );\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Ray = function ( origin, direction ) {\r\n\r\n\tthis.origin = ( origin !== undefined ) ? origin : new THREE.Vector3();\r\n\tthis.direction = ( direction !== undefined ) ? direction : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Ray.prototype = {\r\n\r\n\tconstructor: THREE.Ray,\r\n\r\n\tset: function ( origin, direction ) {\r\n\r\n\t\tthis.origin.copy( origin );\r\n\t\tthis.direction.copy( direction );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( ray ) {\r\n\r\n\t\tthis.origin.copy( ray.origin );\r\n\t\tthis.direction.copy( ray.direction );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tat: function( t, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\r\n\r\n\t},\r\n\r\n\trecast: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( t ) {\r\n\r\n\t\t\tthis.origin.copy( this.at( t, v1 ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tclosestPointToPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\tresult.subVectors( point, this.origin );\r\n\t\tvar directionDistance = result.dot( this.direction );\r\n\r\n\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( point ) {\r\n\r\n\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\r\n\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\r\n\r\n\t\t\treturn v1.distanceTo( point );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tisIntersectionSphere: function( sphere ) {\r\n\r\n\t\treturn ( this.distanceToPoint( sphere.center ) <= sphere.radius );\r\n\r\n\t},\r\n\r\n\tisIntersectionPlane: function ( plane ) {\r\n\r\n\t\t// check if the line and plane are non-perpendicular, if they\r\n\t\t// eventually they will intersect.\r\n\t\tvar denominator = plane.normal.dot( this.direction );\r\n\t\tif ( denominator != 0 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\t// line is coplanar, return origin\r\n\t\tif( plane.distanceToPoint( this.origin ) == 0 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tdistanceToPlane: function ( plane ) {\r\n\r\n\t\tvar denominator = plane.normal.dot( this.direction );\r\n\t\tif ( denominator == 0 ) {\r\n\r\n\t\t\t// line is coplanar, return origin\r\n\t\t\tif( plane.distanceToPoint( this.origin ) == 0 ) {\r\n\r\n\t\t\t\treturn 0;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Unsure if this is the correct method to handle this case.\r\n\t\t\treturn undefined;\r\n\r\n\t\t}\r\n\r\n\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\r\n\r\n\t\treturn t;\r\n\r\n\t},\r\n\r\n\tintersectPlane: function ( plane, optionalTarget ) {\r\n\r\n\t\tvar t = this.distanceToPlane( plane );\r\n\r\n\t\tif ( t === undefined ) {\r\n\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\treturn this.at( t, optionalTarget );\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( matrix4 ) {\r\n\r\n\t\tthis.direction.add( this.origin ).applyMatrix4( matrix4 );\r\n\t\tthis.origin.applyMatrix4( matrix4 );\r\n\t\tthis.direction.sub( this.origin );\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tequals: function ( ray ) {\r\n\r\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Ray().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Sphere = function ( center, radius ) {\r\n\r\n\tthis.center = ( center !== undefined ) ? center : new THREE.Vector3();\r\n\tthis.radius = ( radius !== undefined ) ? radius : 0;\r\n\r\n};\r\n\r\nTHREE.Sphere.prototype = {\r\n\r\n\tconstructor: THREE.Sphere,\r\n\r\n\tset: function ( center, radius ) {\r\n\r\n\t\tthis.center.copy( center );\r\n\t\tthis.radius = radius;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetFromCenterAndPoints: function ( center, points ) {\r\n\r\n\t\tvar maxRadiusSq = 0;\r\n\r\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar radiusSq = center.distanceToSquared( points[ i ] );\r\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, radiusSq );\r\n\r\n\t\t}\r\n\r\n\t\tthis.center = center;\r\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( sphere ) {\r\n\r\n\t\tthis.center.copy( sphere.center );\r\n\t\tthis.radius = sphere.radius;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tempty: function () {\r\n\r\n\t\treturn ( this.radius <= 0 );\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function ( point ) {\r\n\r\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\r\n\r\n\t},\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\tvar radiusSum = this.radius + sphere.radius;\r\n\r\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\r\n\r\n\t},\r\n\r\n\tclampPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\tresult.copy( point );\r\n\r\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\r\n\r\n\t\t\tresult.sub( this.center ).normalize();\r\n\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\tgetBoundingBox: function ( optionalTarget ) {\r\n\r\n\t\tvar box = optionalTarget || new THREE.Box3();\r\n\r\n\t\tbox.set( this.center, this.center );\r\n\t\tbox.expandByScalar( this.radius );\r\n\r\n\t\treturn box;\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function ( matrix ) {\r\n\r\n\t\tthis.center.applyMatrix4( matrix );\r\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.center.add( offset );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( sphere ) {\r\n\r\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Sphere().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Frustum = function ( p0, p1, p2, p3, p4, p5 ) {\r\n\r\n\tthis.planes = [\r\n\r\n\t\t( p0 !== undefined ) ? p0 : new THREE.Plane(),\r\n\t\t( p1 !== undefined ) ? p1 : new THREE.Plane(),\r\n\t\t( p2 !== undefined ) ? p2 : new THREE.Plane(),\r\n\t\t( p3 !== undefined ) ? p3 : new THREE.Plane(),\r\n\t\t( p4 !== undefined ) ? p4 : new THREE.Plane(),\r\n\t\t( p5 !== undefined ) ? p5 : new THREE.Plane()\r\n\r\n\t];\r\n\r\n};\r\n\r\nTHREE.Frustum.prototype = {\r\n\r\n\tconstructor: THREE.Frustum,\r\n\r\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tplanes[0].copy( p0 );\r\n\t\tplanes[1].copy( p1 );\r\n\t\tplanes[2].copy( p2 );\r\n\t\tplanes[3].copy( p3 );\r\n\t\tplanes[4].copy( p4 );\r\n\t\tplanes[5].copy( p5 );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( frustum ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tfor( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tplanes[i].copy( frustum.planes[i] );\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromMatrix: function ( m ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\t\tvar me = m.elements;\r\n\t\tvar me0 = me[0], me1 = me[1], me2 = me[2], me3 = me[3];\r\n\t\tvar me4 = me[4], me5 = me[5], me6 = me[6], me7 = me[7];\r\n\t\tvar me8 = me[8], me9 = me[9], me10 = me[10], me11 = me[11];\r\n\t\tvar me12 = me[12], me13 = me[13], me14 = me[14], me15 = me[15];\r\n\r\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\r\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\r\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\r\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\r\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\r\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tintersectsObject: function () {\r\n\r\n\t\tvar center = new THREE.Vector3();\r\n\r\n\t\treturn function ( object ) {\r\n\r\n\t\t\t// this method is expanded inlined for performance reasons.\r\n\r\n\t\t\tvar matrix = object.matrixWorld;\r\n\t\t\tvar planes = this.planes;\r\n\t\t\tvar negRadius = - object.geometry.boundingSphere.radius * matrix.getMaxScaleOnAxis();\r\n\r\n\t\t\tcenter.getPositionFromMatrix( matrix );\r\n\r\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\r\n\r\n\t\t\t\tif ( distance < negRadius ) {\r\n\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tintersectsSphere: function ( sphere ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\t\tvar center = sphere.center;\r\n\t\tvar negRadius = -sphere.radius;\r\n\r\n\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tvar distance = planes[ i ].distanceToPoint( center );\r\n\r\n\t\t\tif ( distance < negRadius ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\tvar planes = this.planes;\r\n\r\n\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\r\n\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Frustum().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Plane = function ( normal, constant ) {\r\n\r\n\tthis.normal = ( normal !== undefined ) ? normal : new THREE.Vector3( 1, 0, 0 );\r\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\r\n\r\n};\r\n\r\nTHREE.Plane.prototype = {\r\n\r\n\tconstructor: THREE.Plane,\r\n\r\n\tset: function ( normal, constant ) {\r\n\r\n\t\tthis.normal.copy( normal );\r\n\t\tthis.constant = constant;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetComponents: function ( x, y, z, w ) {\r\n\r\n\t\tthis.normal.set( x, y, z );\r\n\t\tthis.constant = w;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\r\n\r\n\t\tthis.normal.copy( normal );\r\n\t\tthis.constant = - point.dot( this.normal );\t// must be this.normal, not normal, as this.normal is normalized\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromCoplanarPoints: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\t\tvar v2 = new THREE.Vector3();\r\n\r\n\t\treturn function ( a, b, c ) {\r\n\r\n\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\r\n\r\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\r\n\r\n\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\r\n\tcopy: function ( plane ) {\r\n\r\n\t\tthis.normal.copy( plane.normal );\r\n\t\tthis.constant = plane.constant;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnormalize: function () {\r\n\r\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\r\n\r\n\t\tvar inverseNormalLength = 1.0 / this.normal.length();\r\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\r\n\t\tthis.constant *= inverseNormalLength;\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tnegate: function () {\r\n\r\n\t\tthis.constant *= -1;\r\n\t\tthis.normal.negate();\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tdistanceToPoint: function ( point ) {\r\n\r\n\t\treturn this.normal.dot( point ) + this.constant;\r\n\r\n\t},\r\n\r\n\tdistanceToSphere: function ( sphere ) {\r\n\r\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\r\n\r\n\t},\r\n\r\n\tprojectPoint: function ( point, optionalTarget ) {\r\n\r\n\t\treturn this.orthoPoint( point, optionalTarget ).sub( point ).negate();\r\n\r\n\t},\r\n\r\n\torthoPoint: function ( point, optionalTarget ) {\r\n\r\n\t\tvar perpendicularMagnitude = this.distanceToPoint( point );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( this.normal ).multiplyScalar( perpendicularMagnitude );\r\n\r\n\t},\r\n\r\n\tisIntersectionLine: function ( line ) {\r\n\r\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\r\n\r\n\t\tvar startSign = this.distanceToPoint( line.start );\r\n\t\tvar endSign = this.distanceToPoint( line.end );\r\n\r\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\r\n\r\n\t},\r\n\r\n\tintersectLine: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( line, optionalTarget ) {\r\n\r\n\t\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t\tvar direction = line.delta( v1 );\r\n\r\n\t\t\tvar denominator = this.normal.dot( direction );\r\n\r\n\t\t\tif ( denominator == 0 ) {\r\n\r\n\t\t\t\t// line is coplanar, return origin\r\n\t\t\t\tif( this.distanceToPoint( line.start ) == 0 ) {\r\n\r\n\t\t\t\t\treturn result.copy( line.start );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Unsure if this is the correct method to handle this case.\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\r\n\r\n\t\t\tif( t < 0 || t > 1 ) {\r\n\r\n\t\t\t\treturn undefined;\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\r\n\tcoplanarPoint: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\r\n\r\n\t},\r\n\r\n\tapplyMatrix4: function() {\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\t\tvar v2 = new THREE.Vector3();\r\n\r\n\t\treturn function ( matrix, optionalNormalMatrix ) {\r\n\r\n\t\t\t// compute new normal based on theory here:\r\n\t\t\t// http://www.songho.ca/opengl/gl_normaltransform.html\r\n\t\t\toptionalNormalMatrix = optionalNormalMatrix || new THREE.Matrix3().getNormalMatrix( matrix );\r\n\t\t\tvar newNormal = v1.copy( this.normal ).applyMatrix3( optionalNormalMatrix );\r\n\r\n\t\t\tvar newCoplanarPoint = this.coplanarPoint( v2 );\r\n\t\t\tnewCoplanarPoint.applyMatrix4( matrix );\r\n\r\n\t\t\tthis.setFromNormalAndCoplanarPoint( newNormal, newCoplanarPoint );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslate: function ( offset ) {\r\n\r\n\t\tthis.constant = this.constant - offset.dot( this.normal );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tequals: function ( plane ) {\r\n\r\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant == this.constant );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Plane().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Math = {\r\n\r\n\t// Clamp value to range \r\n\r\n\tclamp: function ( x, a, b ) {\r\n\r\n\t\treturn ( x < a ) ? a : ( ( x > b ) ? b : x );\r\n\r\n\t},\r\n\r\n\t// Clamp value to range to range \r\n\r\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\r\n\r\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\r\n\r\n\t},\r\n\r\n\t// http://en.wikipedia.org/wiki/Smoothstep\r\n\r\n\tsmoothstep: function ( x, min, max ) {\r\n\r\n\t\tif ( x <= min ) return 0;\r\n\t\tif ( x >= max ) return 1;\r\n\r\n\t\tx = ( x - min )/( max - min );\r\n\r\n\t\treturn x*x*(3 - 2*x);\r\n\r\n\t},\r\n\r\n\tsmootherstep: function ( x, min, max ) {\r\n\r\n\t\tif ( x <= min ) return 0;\r\n\t\tif ( x >= max ) return 1;\r\n\r\n\t\tx = ( x - min )/( max - min );\r\n\r\n\t\treturn x*x*x*(x*(x*6 - 15) + 10);\r\n\r\n\t},\r\n\r\n\t// Random float from <0, 1> with 16 bits of randomness\r\n\t// (standard Math.random() creates repetitive patterns when applied over larger space)\r\n\r\n\trandom16: function () {\r\n\r\n\t\treturn ( 65280 * Math.random() + 255 * Math.random() ) / 65535;\r\n\r\n\t},\r\n\r\n\t// Random integer from interval\r\n\r\n\trandInt: function ( low, high ) {\r\n\r\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\r\n\r\n\t},\r\n\r\n\t// Random float from interval\r\n\r\n\trandFloat: function ( low, high ) {\r\n\r\n\t\treturn low + Math.random() * ( high - low );\r\n\r\n\t},\r\n\r\n\t// Random float from <-range/2, range/2> interval\r\n\r\n\trandFloatSpread: function ( range ) {\r\n\r\n\t\treturn range * ( 0.5 - Math.random() );\r\n\r\n\t},\r\n\r\n\tsign: function ( x ) {\r\n\r\n\t\treturn ( x < 0 ) ? -1 : ( ( x > 0 ) ? 1 : 0 );\r\n\r\n\t},\r\n\r\n\tdegToRad: function() {\r\n\r\n\t\tvar degreeToRadiansFactor = Math.PI / 180;\r\n\r\n\t\treturn function ( degrees ) {\r\n\r\n\t\t\treturn degrees * degreeToRadiansFactor;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tradToDeg: function() {\r\n\r\n\t\tvar radianToDegreesFactor = 180 / Math.PI;\r\n\r\n\t\treturn function ( radians ) {\r\n\r\n\t\t\treturn radians * radianToDegreesFactor;\r\n\r\n\t\t};\r\n\r\n\t}()\r\n\r\n};\r\n/**\r\n * Spline from Tween.js, slightly optimized (and trashed)\r\n * http://sole.github.com/tween.js/examples/05_spline.html\r\n *\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Spline = function ( points ) {\r\n\r\n\tthis.points = points;\r\n\r\n\tvar c = [], v3 = { x: 0, y: 0, z: 0 },\r\n\tpoint, intPoint, weight, w2, w3,\r\n\tpa, pb, pc, pd;\r\n\r\n\tthis.initFromArray = function( a ) {\r\n\r\n\t\tthis.points = [];\r\n\r\n\t\tfor ( var i = 0; i < a.length; i++ ) {\r\n\r\n\t\t\tthis.points[ i ] = { x: a[ i ][ 0 ], y: a[ i ][ 1 ], z: a[ i ][ 2 ] };\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.getPoint = function ( k ) {\r\n\r\n\t\tpoint = ( this.points.length - 1 ) * k;\r\n\t\tintPoint = Math.floor( point );\r\n\t\tweight = point - intPoint;\r\n\r\n\t\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\r\n\t\tc[ 1 ] = intPoint;\r\n\t\tc[ 2 ] = intPoint > this.points.length - 2 ? this.points.length - 1 : intPoint + 1;\r\n\t\tc[ 3 ] = intPoint > this.points.length - 3 ? this.points.length - 1 : intPoint + 2;\r\n\r\n\t\tpa = this.points[ c[ 0 ] ];\r\n\t\tpb = this.points[ c[ 1 ] ];\r\n\t\tpc = this.points[ c[ 2 ] ];\r\n\t\tpd = this.points[ c[ 3 ] ];\r\n\r\n\t\tw2 = weight * weight;\r\n\t\tw3 = weight * w2;\r\n\r\n\t\tv3.x = interpolate( pa.x, pb.x, pc.x, pd.x, weight, w2, w3 );\r\n\t\tv3.y = interpolate( pa.y, pb.y, pc.y, pd.y, weight, w2, w3 );\r\n\t\tv3.z = interpolate( pa.z, pb.z, pc.z, pd.z, weight, w2, w3 );\r\n\r\n\t\treturn v3;\r\n\r\n\t};\r\n\r\n\tthis.getControlPointsArray = function () {\r\n\r\n\t\tvar i, p, l = this.points.length,\r\n\t\t\tcoords = [];\r\n\r\n\t\tfor ( i = 0; i < l; i ++ ) {\r\n\r\n\t\t\tp = this.points[ i ];\r\n\t\t\tcoords[ i ] = [ p.x, p.y, p.z ];\r\n\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\r\n\t};\r\n\r\n\t// approximate length by summing linear segments\r\n\r\n\tthis.getLength = function ( nSubDivisions ) {\r\n\r\n\t\tvar i, index, nSamples, position,\r\n\t\t\tpoint = 0, intPoint = 0, oldIntPoint = 0,\r\n\t\t\toldPosition = new THREE.Vector3(),\r\n\t\t\ttmpVec = new THREE.Vector3(),\r\n\t\t\tchunkLengths = [],\r\n\t\t\ttotalLength = 0;\r\n\r\n\t\t// first point has 0 length\r\n\r\n\t\tchunkLengths[ 0 ] = 0;\r\n\r\n\t\tif ( !nSubDivisions ) nSubDivisions = 100;\r\n\r\n\t\tnSamples = this.points.length * nSubDivisions;\r\n\r\n\t\toldPosition.copy( this.points[ 0 ] );\r\n\r\n\t\tfor ( i = 1; i < nSamples; i ++ ) {\r\n\r\n\t\t\tindex = i / nSamples;\r\n\r\n\t\t\tposition = this.getPoint( index );\r\n\t\t\ttmpVec.copy( position );\r\n\r\n\t\t\ttotalLength += tmpVec.distanceTo( oldPosition );\r\n\r\n\t\t\toldPosition.copy( position );\r\n\r\n\t\t\tpoint = ( this.points.length - 1 ) * index;\r\n\t\t\tintPoint = Math.floor( point );\r\n\r\n\t\t\tif ( intPoint != oldIntPoint ) {\r\n\r\n\t\t\t\tchunkLengths[ intPoint ] = totalLength;\r\n\t\t\t\toldIntPoint = intPoint;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// last point ends with total length\r\n\r\n\t\tchunkLengths[ chunkLengths.length ] = totalLength;\r\n\r\n\t\treturn { chunks: chunkLengths, total: totalLength };\r\n\r\n\t};\r\n\r\n\tthis.reparametrizeByArcLength = function ( samplingCoef ) {\r\n\r\n\t\tvar i, j,\r\n\t\t\tindex, indexCurrent, indexNext,\r\n\t\t\tlinearDistance, realDistance,\r\n\t\t\tsampling, position,\r\n\t\t\tnewpoints = [],\r\n\t\t\ttmpVec = new THREE.Vector3(),\r\n\t\t\tsl = this.getLength();\r\n\r\n\t\tnewpoints.push( tmpVec.copy( this.points[ 0 ] ).clone() );\r\n\r\n\t\tfor ( i = 1; i < this.points.length; i++ ) {\r\n\r\n\t\t\t//tmpVec.copy( this.points[ i - 1 ] );\r\n\t\t\t//linearDistance = tmpVec.distanceTo( this.points[ i ] );\r\n\r\n\t\t\trealDistance = sl.chunks[ i ] - sl.chunks[ i - 1 ];\r\n\r\n\t\t\tsampling = Math.ceil( samplingCoef * realDistance / sl.total );\r\n\r\n\t\t\tindexCurrent = ( i - 1 ) / ( this.points.length - 1 );\r\n\t\t\tindexNext = i / ( this.points.length - 1 );\r\n\r\n\t\t\tfor ( j = 1; j < sampling - 1; j++ ) {\r\n\r\n\t\t\t\tindex = indexCurrent + j * ( 1 / sampling ) * ( indexNext - indexCurrent );\r\n\r\n\t\t\t\tposition = this.getPoint( index );\r\n\t\t\t\tnewpoints.push( tmpVec.copy( position ).clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tnewpoints.push( tmpVec.copy( this.points[ i ] ).clone() );\r\n\r\n\t\t}\r\n\r\n\t\tthis.points = newpoints;\r\n\r\n\t};\r\n\r\n\t// Catmull-Rom\r\n\r\n\tfunction interpolate( p0, p1, p2, p3, t, t2, t3 ) {\r\n\r\n\t\tvar v0 = ( p2 - p0 ) * 0.5,\r\n\t\t\tv1 = ( p3 - p1 ) * 0.5;\r\n\r\n\t\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\r\n\r\n\t};\r\n\r\n};\r\n/**\r\n * @author bhouston / http://exocortex.com\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Triangle = function ( a, b, c ) {\r\n\r\n\tthis.a = ( a !== undefined ) ? a : new THREE.Vector3();\r\n\tthis.b = ( b !== undefined ) ? b : new THREE.Vector3();\r\n\tthis.c = ( c !== undefined ) ? c : new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Triangle.normal = function() {\r\n\r\n\tvar v0 = new THREE.Vector3();\r\n\r\n\treturn function ( a, b, c, optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\tresult.subVectors( c, b );\r\n\t\tv0.subVectors( a, b );\r\n\t\tresult.cross( v0 );\r\n\r\n\t\tvar resultLengthSq = result.lengthSq();\r\n\t\tif( resultLengthSq > 0 ) {\r\n\r\n\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn result.set( 0, 0, 0 );\r\n\r\n\t};\r\n\r\n}();\r\n\r\n// static/instance method to calculate barycoordinates\r\n// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\r\nTHREE.Triangle.barycoordFromPoint = function() {\r\n\r\n\tvar v0 = new THREE.Vector3();\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\r\n\treturn function ( point, a, b, c, optionalTarget ) {\r\n\r\n\t\tv0.subVectors( c, a );\r\n\t\tv1.subVectors( b, a );\r\n\t\tv2.subVectors( point, a );\r\n\r\n\t\tvar dot00 = v0.dot( v0 );\r\n\t\tvar dot01 = v0.dot( v1 );\r\n\t\tvar dot02 = v0.dot( v2 );\r\n\t\tvar dot11 = v1.dot( v1 );\r\n\t\tvar dot12 = v1.dot( v2 );\r\n\r\n\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\r\n\t\t// colinear or singular triangle\r\n\t\tif( denom == 0 ) {\r\n\t\t\t// arbitrary location outside of triangle?\r\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\r\n\t\t\treturn result.set( -2, -1, -1 );\r\n\t\t}\r\n\r\n\t\tvar invDenom = 1 / denom;\r\n\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\r\n\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\r\n\r\n\t\t// barycoordinates must always sum to 1\r\n\t\treturn result.set( 1 - u - v, v, u );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Triangle.containsPoint = function() {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\r\n\treturn function ( point, a, b, c ) {\r\n\r\n\t\tvar result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 );\r\n\r\n\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.Triangle.prototype = {\r\n\r\n\tconstructor: THREE.Triangle,\r\n\r\n\tset: function ( a, b, c ) {\r\n\r\n\t\tthis.a.copy( a );\r\n\t\tthis.b.copy( b );\r\n\t\tthis.c.copy( c );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\r\n\r\n\t\tthis.a.copy( points[i0] );\r\n\t\tthis.b.copy( points[i1] );\r\n\t\tthis.c.copy( points[i2] );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tcopy: function ( triangle ) {\r\n\r\n\t\tthis.a.copy( triangle.a );\r\n\t\tthis.b.copy( triangle.b );\r\n\t\tthis.c.copy( triangle.c );\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tarea: function() {\r\n\r\n\t\tvar v0 = new THREE.Vector3();\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tv0.subVectors( this.c, this.b );\r\n\t\t\tv1.subVectors( this.a, this.b );\r\n\r\n\t\t\treturn v0.cross( v1 ).length() * 0.5;\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tmidpoint: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Vector3();\r\n\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\r\n\r\n\t},\r\n\r\n\tnormal: function ( optionalTarget ) {\r\n\r\n\t\treturn THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget );\r\n\r\n\t},\r\n\r\n\tplane: function ( optionalTarget ) {\r\n\r\n\t\tvar result = optionalTarget || new THREE.Plane();\r\n\r\n\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\r\n\r\n\t},\r\n\r\n\tbarycoordFromPoint: function ( point, optionalTarget ) {\r\n\r\n\t\treturn THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\r\n\r\n\t},\r\n\r\n\tcontainsPoint: function ( point ) {\r\n\r\n\t\treturn THREE.Triangle.containsPoint( point, this.a, this.b, this.c );\r\n\r\n\t},\r\n\r\n\tequals: function ( triangle ) {\r\n\r\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\treturn new THREE.Triangle().copy( this );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Vertex = function ( v ) {\r\n\r\n\tconsole.warn( 'THREE.Vertex has been DEPRECATED. Use THREE.Vector3 instead.')\r\n\treturn v;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.UV = function ( u, v ) {\r\n\r\n\tconsole.warn( 'THREE.UV has been DEPRECATED. Use THREE.Vector2 instead.')\r\n\treturn new THREE.Vector2( u, v );\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Clock = function ( autoStart ) {\r\n\r\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\r\n\r\n\tthis.startTime = 0;\r\n\tthis.oldTime = 0;\r\n\tthis.elapsedTime = 0;\r\n\r\n\tthis.running = false;\r\n\r\n};\r\n\r\nTHREE.Clock.prototype = {\r\n\r\n\tconstructor: THREE.Clock,\r\n\r\n\tstart: function () {\r\n\r\n\t\tthis.startTime = window.performance !== undefined && window.performance.now !== undefined\r\n\t\t\t\t\t? window.performance.now()\r\n\t\t\t\t\t: Date.now();\r\n\r\n\t\tthis.oldTime = this.startTime;\r\n\t\tthis.running = true;\r\n\t},\r\n\r\n\tstop: function () {\r\n\r\n\t\tthis.getElapsedTime();\r\n\t\tthis.running = false;\r\n\r\n\t},\r\n\r\n\tgetElapsedTime: function () {\r\n\r\n\t\tthis.getDelta();\r\n\t\treturn this.elapsedTime;\r\n\r\n\t},\r\n\r\n\tgetDelta: function () {\r\n\r\n\t\tvar diff = 0;\r\n\r\n\t\tif ( this.autoStart && ! this.running ) {\r\n\r\n\t\t\tthis.start();\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.running ) {\r\n\r\n\t\t\tvar newTime = window.performance !== undefined && window.performance.now !== undefined\r\n\t\t\t\t\t? window.performance.now()\r\n\t\t\t\t\t: Date.now();\r\n\r\n\t\t\tdiff = 0.001 * ( newTime - this.oldTime );\r\n\t\t\tthis.oldTime = newTime;\r\n\r\n\t\t\tthis.elapsedTime += diff;\r\n\r\n\t\t}\r\n\r\n\t\treturn diff;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * https://github.com/mrdoob/eventdispatcher.js/\r\n */\r\n\r\nTHREE.EventDispatcher = function () {}\r\n\r\nTHREE.EventDispatcher.prototype = {\r\n\r\n\tconstructor: THREE.EventDispatcher,\r\n\r\n\taddEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) this._listeners = {};\r\n\r\n\t\tvar listeners = this._listeners;\r\n\r\n\t\tif ( listeners[ type ] === undefined ) {\r\n\r\n\t\t\tlisteners[ type ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\r\n\r\n\t\t\tlisteners[ type ].push( listener );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\thasEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return false;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\r\n\t\tif ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tremoveEventListener: function ( type, listener ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\t\tvar index = listeners[ type ].indexOf( listener );\r\n\r\n\t\tif ( index !== - 1 ) {\r\n\r\n\t\t\tlisteners[ type ].splice( index, 1 );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tdispatchEvent: function ( event ) {\r\n\r\n\t\tif ( this._listeners === undefined ) return;\r\n\r\n\t\tvar listeners = this._listeners;\r\n\t\tvar listenerArray = listeners[ event.type ];\r\n\r\n\t\tif ( listenerArray !== undefined ) {\r\n\r\n\t\t\tevent.target = this;\r\n\r\n\t\t\tfor ( var i = 0, l = listenerArray.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tlistenerArray[ i ].call( this, event );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author bhouston / http://exocortex.com/\r\n */\r\n\r\n( function ( THREE ) {\r\n\r\n\tTHREE.Raycaster = function ( origin, direction, near, far ) {\r\n\r\n\t\tthis.ray = new THREE.Ray( origin, direction );\r\n\r\n\t\t// normalized ray.direction required for accurate distance calculations\r\n\t\tif ( this.ray.direction.lengthSq() > 0 ) {\r\n\r\n\t\t\tthis.ray.direction.normalize();\r\n\r\n\t\t}\r\n\r\n\t\tthis.near = near || 0;\r\n\t\tthis.far = far || Infinity;\r\n\r\n\t};\r\n\r\n\tvar sphere = new THREE.Sphere();\r\n\tvar localRay = new THREE.Ray();\r\n\tvar facePlane = new THREE.Plane();\r\n\tvar intersectPoint = new THREE.Vector3();\r\n\tvar matrixPosition = new THREE.Vector3();\r\n\r\n\tvar inverseMatrix = new THREE.Matrix4();\r\n\r\n\tvar descSort = function ( a, b ) {\r\n\r\n\t\treturn a.distance - b.distance;\r\n\r\n\t};\r\n\r\n\tvar intersectObject = function ( object, raycaster, intersects ) {\r\n\r\n\t\tif ( object instanceof THREE.Particle ) {\r\n\r\n\t\t\tmatrixPosition.getPositionFromMatrix( object.matrixWorld );\r\n\t\t\tvar distance = raycaster.ray.distanceToPoint( matrixPosition );\r\n\r\n\t\t\tif ( distance > object.scale.x ) {\r\n\r\n\t\t\t\treturn intersects;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tintersects.push( {\r\n\r\n\t\t\t\tdistance: distance,\r\n\t\t\t\tpoint: object.position,\r\n\t\t\t\tface: null,\r\n\t\t\t\tobject: object\r\n\r\n\t\t\t} );\r\n\r\n\t\t} else if ( object instanceof THREE.LOD ) {\r\n\r\n\t\t\tmatrixPosition.getPositionFromMatrix( object.matrixWorld );\r\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\r\n\r\n\t\t\tintersectObject( object.getObjectForDistance( distance ), raycaster, intersects );\r\n\r\n\t\t} else if ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t// Checking boundingSphere distance to ray\r\n\t\t\tmatrixPosition.getPositionFromMatrix( object.matrixWorld );\r\n\t\t\tsphere.set(\r\n\t\t\t\tmatrixPosition,\r\n\t\t\t\tobject.geometry.boundingSphere.radius * object.matrixWorld.getMaxScaleOnAxis() );\r\n\r\n\t\t\tif ( ! raycaster.ray.isIntersectionSphere( sphere ) ) {\r\n\r\n\t\t\t\treturn intersects;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Checking faces\r\n\r\n\t\t\tvar geometry = object.geometry;\r\n\t\t\tvar vertices = geometry.vertices;\r\n\r\n\t\t\tvar isFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;\r\n\t\t\tvar objectMaterials = isFaceMaterial === true ? object.material.materials : null;\r\n\r\n\t\t\tvar side = object.material.side;\r\n\r\n\t\t\tvar a, b, c, d;\r\n\t\t\tvar precision = raycaster.precision;\r\n\r\n\t\t\tinverseMatrix.getInverse( object.matrixWorld );\r\n\r\n\t\t\tlocalRay.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\r\n\r\n\t\t\tfor ( var f = 0, fl = geometry.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tvar face = geometry.faces[ f ];\r\n\r\n\t\t\t\tvar material = isFaceMaterial === true ? objectMaterials[ face.materialIndex ] : object.material;\r\n\r\n\t\t\t\tif ( material === undefined ) continue;\r\n\r\n\t\t\t\tfacePlane.setFromNormalAndCoplanarPoint( face.normal, vertices[face.a] );\r\n\r\n\t\t\t\tvar planeDistance = localRay.distanceToPlane( facePlane );\r\n\r\n\t\t\t\t// bail if raycaster and plane are parallel\r\n\t\t\t\tif ( Math.abs( planeDistance ) < precision ) continue;\r\n\r\n\t\t\t\t// if negative distance, then plane is behind raycaster\r\n\t\t\t\tif ( planeDistance < 0 ) continue;\r\n\r\n\t\t\t\t// check if we hit the wrong side of a single sided face\r\n\t\t\t\tside = material.side;\r\n\t\t\t\tif ( side !== THREE.DoubleSide ) {\r\n\r\n\t\t\t\t\tvar planeSign = localRay.direction.dot( facePlane.normal );\r\n\r\n\t\t\t\t\tif ( ! ( side === THREE.FrontSide ? planeSign < 0 : planeSign > 0 ) ) continue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// this can be done using the planeDistance from localRay because localRay wasn't normalized, but ray was\r\n\t\t\t\tif ( planeDistance < raycaster.near || planeDistance > raycaster.far ) continue;\r\n\r\n\t\t\t\tintersectPoint = localRay.at( planeDistance, intersectPoint ); // passing in intersectPoint avoids a copy\r\n\r\n\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\ta = vertices[ face.a ];\r\n\t\t\t\t\tb = vertices[ face.b ];\r\n\t\t\t\t\tc = vertices[ face.c ];\r\n\r\n\t\t\t\t\tif ( ! THREE.Triangle.containsPoint( intersectPoint, a, b, c ) ) continue;\r\n\r\n\t\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\t\ta = vertices[ face.a ];\r\n\t\t\t\t\tb = vertices[ face.b ];\r\n\t\t\t\t\tc = vertices[ face.c ];\r\n\t\t\t\t\td = vertices[ face.d ];\r\n\r\n\t\t\t\t\tif ( ( ! THREE.Triangle.containsPoint( intersectPoint, a, b, d ) ) &&\r\n\t\t\t\t\t\t ( ! THREE.Triangle.containsPoint( intersectPoint, b, c, d ) ) ) continue;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// This is added because if we call out of this if/else group when none of the cases\r\n\t\t\t\t\t// match it will add a point to the intersection list erroneously.\r\n\t\t\t\t\tthrow Error( \"face type not supported\" );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tintersects.push( {\r\n\r\n\t\t\t\t\tdistance: planeDistance,\t// this works because the original ray was normalized, and the transformed localRay wasn't\r\n\t\t\t\t\tpoint: raycaster.ray.at( planeDistance ),\r\n\t\t\t\t\tface: face,\r\n\t\t\t\t\tfaceIndex: f,\r\n\t\t\t\t\tobject: object\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar intersectDescendants = function ( object, raycaster, intersects ) {\r\n\r\n\t\tvar descendants = object.getDescendants();\r\n\r\n\t\tfor ( var i = 0, l = descendants.length; i < l; i ++ ) {\r\n\r\n\t\t\tintersectObject( descendants[ i ], raycaster, intersects );\r\n\r\n\t\t}\r\n\t};\r\n\r\n\t//\r\n\r\n\tTHREE.Raycaster.prototype.precision = 0.0001;\r\n\r\n\tTHREE.Raycaster.prototype.set = function ( origin, direction ) {\r\n\r\n\t\tthis.ray.set( origin, direction );\r\n\r\n\t\t// normalized ray.direction required for accurate distance calculations\r\n\t\tif ( this.ray.direction.length() > 0 ) {\r\n\r\n\t\t\tthis.ray.direction.normalize();\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tTHREE.Raycaster.prototype.intersectObject = function ( object, recursive ) {\r\n\r\n\t\tvar intersects = [];\r\n\r\n\t\tif ( recursive === true ) {\r\n\r\n\t\t\tintersectDescendants( object, this, intersects );\r\n\r\n\t\t}\r\n\r\n\t\tintersectObject( object, this, intersects );\r\n\r\n\t\tintersects.sort( descSort );\r\n\r\n\t\treturn intersects;\r\n\r\n\t};\r\n\r\n\tTHREE.Raycaster.prototype.intersectObjects = function ( objects, recursive ) {\r\n\r\n\t\tvar intersects = [];\r\n\r\n\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\r\n\r\n\t\t\tintersectObject( objects[ i ], this, intersects );\r\n\r\n\t\t\tif ( recursive === true ) {\r\n\r\n\t\t\t\tintersectDescendants( objects[ i ], this, intersects );\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tintersects.sort( descSort );\r\n\r\n\t\treturn intersects;\r\n\r\n\t};\r\n\r\n}( THREE ) );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n */\r\n\r\nTHREE.Object3D = function () {\r\n\r\n\tthis.id = THREE.Object3DIdCount ++;\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.parent = undefined;\r\n\tthis.children = [];\r\n\r\n\tthis.up = new THREE.Vector3( 0, 1, 0 );\r\n\r\n\tthis.position = new THREE.Vector3();\r\n\tthis.rotation = new THREE.Vector3();\r\n\tthis.eulerOrder = THREE.Object3D.defaultEulerOrder;\r\n\tthis.scale = new THREE.Vector3( 1, 1, 1 );\r\n\r\n\tthis.renderDepth = null;\r\n\r\n\tthis.rotationAutoUpdate = true;\r\n\r\n\tthis.matrix = new THREE.Matrix4();\r\n\tthis.matrixWorld = new THREE.Matrix4();\r\n\r\n\tthis.matrixAutoUpdate = true;\r\n\tthis.matrixWorldNeedsUpdate = true;\r\n\r\n\tthis.quaternion = new THREE.Quaternion();\r\n\tthis.useQuaternion = false;\r\n\r\n\tthis.visible = true;\r\n\r\n\tthis.castShadow = false;\r\n\tthis.receiveShadow = false;\r\n\r\n\tthis.frustumCulled = true;\r\n\r\n\tthis.userData = {};\r\n\r\n};\r\n\r\n\r\nTHREE.Object3D.prototype = {\r\n\r\n\tconstructor: THREE.Object3D,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tapplyMatrix: function () {\r\n\r\n\t\tvar m1 = new THREE.Matrix4();\r\n\r\n\t\treturn function ( matrix ) {\r\n\r\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\r\n\r\n\t\t\tthis.position.getPositionFromMatrix( this.matrix );\r\n\r\n\t\t\tthis.scale.getScaleFromMatrix( this.matrix );\r\n\r\n\t\t\tm1.extractRotation( this.matrix );\r\n\r\n\t\t\tif ( this.useQuaternion === true ) {\r\n\r\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.rotation.setEulerFromRotationMatrix( m1, this.eulerOrder );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}(),\r\n\r\n\trotateOnAxis: function() {\r\n\r\n\t\t// rotate object on axis in object space\r\n\t\t// axis is assumed to be normalized\r\n\r\n\t\tvar q1 = new THREE.Quaternion();\r\n\t\tvar q2 = new THREE.Quaternion();\r\n\r\n\t\treturn function ( axis, angle ) {\r\n\r\n\t\t\tq1.setFromAxisAngle( axis, angle );\r\n\r\n\t\t\tif ( this.useQuaternion === true ) {\r\n\r\n\t\t\t\tthis.quaternion.multiply( q1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tq2.setFromEuler( this.rotation, this.eulerOrder );\r\n\t\t\t\tq2.multiply( q1 );\r\n\r\n\t\t\t\tthis.rotation.setEulerFromQuaternion( q2, this.eulerOrder );\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t}(),\r\n\r\n\ttranslateOnAxis: function () {\r\n\r\n\t\t// translate object by distance along axis in object space\r\n\t\t// axis is assumed to be normalized\r\n\r\n\t\tvar v1 = new THREE.Vector3();\r\n\r\n\t\treturn function ( axis, distance ) {\r\n\r\n\t\t\tv1.copy( axis );\r\n\r\n\t\t\tif ( this.useQuaternion === true ) {\r\n\r\n\t\t\t\tv1.applyQuaternion( this.quaternion );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tv1.applyEuler( this.rotation, this.eulerOrder );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\r\n\r\n\t\t\treturn this;\r\n\r\n\t\t}\r\n\r\n\t}(),\r\n\r\n\ttranslate: function ( distance, axis ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Object3D\\'s .translate() has been removed. Use .translateOnAxis( axis, distance ) instead. Note args have been changed.' );\r\n\t\treturn this.translateOnAxis( axis, distance );\r\n\r\n\t},\r\n\r\n\ttranslateX: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 1, 0, 0 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateY: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 1, 0 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\ttranslateZ: function () {\r\n\r\n\t\tvar v1 = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\t\treturn function ( distance ) {\r\n\r\n\t\t\treturn this.translateOnAxis( v1, distance );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlocalToWorld: function ( vector ) {\r\n\r\n\t\treturn vector.applyMatrix4( this.matrixWorld );\r\n\r\n\t},\r\n\r\n\tworldToLocal: function () {\r\n\r\n\t\tvar m1 = new THREE.Matrix4();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tlookAt: function () {\r\n\r\n\t\t// This routine does not support objects with rotated and/or translated parent(s)\r\n\r\n\t\tvar m1 = new THREE.Matrix4();\r\n\r\n\t\treturn function ( vector ) {\r\n\r\n\t\t\tm1.lookAt( vector, this.position, this.up );\r\n\r\n\t\t\tif ( this.useQuaternion === true ) {\r\n\r\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.rotation.setEulerFromRotationMatrix( m1, this.eulerOrder );\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t}(),\r\n\r\n\tadd: function ( object ) {\r\n\r\n\t\tif ( object === this ) {\r\n\r\n\t\t\tconsole.warn( 'THREE.Object3D.add: An object can\\'t be added as a child of itself.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tif ( object instanceof THREE.Object3D ) {\r\n\r\n\t\t\tif ( object.parent !== undefined ) {\r\n\r\n\t\t\t\tobject.parent.remove( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.parent = this;\r\n\t\t\tthis.children.push( object );\r\n\r\n\t\t\t// add to scene\r\n\r\n\t\t\tvar scene = this;\r\n\r\n\t\t\twhile ( scene.parent !== undefined ) {\r\n\r\n\t\t\t\tscene = scene.parent;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( scene !== undefined && scene instanceof THREE.Scene ) {\r\n\r\n\t\t\t\tscene.__addObject( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tremove: function ( object ) {\r\n\r\n\t\tvar index = this.children.indexOf( object );\r\n\r\n\t\tif ( index !== - 1 ) {\r\n\r\n\t\t\tobject.parent = undefined;\r\n\t\t\tthis.children.splice( index, 1 );\r\n\r\n\t\t\t// remove from scene\r\n\r\n\t\t\tvar scene = this;\r\n\r\n\t\t\twhile ( scene.parent !== undefined ) {\r\n\r\n\t\t\t\tscene = scene.parent;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( scene !== undefined && scene instanceof THREE.Scene ) {\r\n\r\n\t\t\t\tscene.__removeObject( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttraverse: function ( callback ) {\r\n\r\n\t\tcallback( this );\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tthis.children[ i ].traverse( callback );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tgetObjectById: function ( id, recursive ) {\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar child = this.children[ i ];\r\n\r\n\t\t\tif ( child.id === id ) {\r\n\r\n\t\t\t\treturn child;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( recursive === true ) {\r\n\r\n\t\t\t\tchild = child.getObjectById( id, recursive );\r\n\r\n\t\t\t\tif ( child !== undefined ) {\r\n\r\n\t\t\t\t\treturn child;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\r\n\t},\r\n\r\n\tgetObjectByName: function ( name, recursive ) {\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tvar child = this.children[ i ];\r\n\r\n\t\t\tif ( child.name === name ) {\r\n\r\n\t\t\t\treturn child;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( recursive === true ) {\r\n\r\n\t\t\t\tchild = child.getObjectByName( name, recursive );\r\n\r\n\t\t\t\tif ( child !== undefined ) {\r\n\r\n\t\t\t\t\treturn child;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\r\n\t},\r\n\r\n\tgetChildByName: function ( name, recursive ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: Object3D\\'s .getChildByName() has been renamed to .getObjectByName().' );\r\n\t\treturn this.getObjectByName( name, recursive );\r\n\r\n\t},\r\n\r\n\tgetDescendants: function ( array ) {\r\n\r\n\t\tif ( array === undefined ) array = [];\r\n\r\n\t\tArray.prototype.push.apply( array, this.children );\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tthis.children[ i ].getDescendants( array );\r\n\r\n\t\t}\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tupdateMatrix: function () {\r\n\r\n\t\t// if we are not using a quaternion directly, convert Euler rotation to this.quaternion.\r\n\r\n\t\tif ( this.useQuaternion === false ) {\r\n\r\n\t\t\tthis.matrix.makeFromPositionEulerScale( this.position, this.rotation, this.eulerOrder, this.scale );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.matrix.makeFromPositionQuaternionScale( this.position, this.quaternion, this.scale );\r\n\r\n\t\t}\r\n\r\n\t\tthis.matrixWorldNeedsUpdate = true;\r\n\r\n\t},\r\n\r\n\tupdateMatrixWorld: function ( force ) {\r\n\r\n\t\tif ( this.matrixAutoUpdate === true ) this.updateMatrix();\r\n\r\n\t\tif ( this.matrixWorldNeedsUpdate === true || force === true ) {\r\n\r\n\t\t\tif ( this.parent === undefined ) {\r\n\r\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.matrixWorldNeedsUpdate = false;\r\n\r\n\t\t\tforce = true;\r\n\r\n\t\t}\r\n\r\n\t\t// update children\r\n\r\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tthis.children[ i ].updateMatrixWorld( force );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function ( object ) {\r\n\r\n\t\tif ( object === undefined ) object = new THREE.Object3D();\r\n\r\n\t\tobject.name = this.name;\r\n\r\n\t\tobject.up.copy( this.up );\r\n\r\n\t\tobject.position.copy( this.position );\r\n\t\tif ( object.rotation instanceof THREE.Vector3 ) object.rotation.copy( this.rotation ); // because of Sprite madness\r\n\t\tobject.eulerOrder = this.eulerOrder;\r\n\t\tobject.scale.copy( this.scale );\r\n\r\n\t\tobject.renderDepth = this.renderDepth;\r\n\r\n\t\tobject.rotationAutoUpdate = this.rotationAutoUpdate;\r\n\r\n\t\tobject.matrix.copy( this.matrix );\r\n\t\tobject.matrixWorld.copy( this.matrixWorld );\r\n\r\n\t\tobject.matrixAutoUpdate = this.matrixAutoUpdate;\r\n\t\tobject.matrixWorldNeedsUpdate = this.matrixWorldNeedsUpdate;\r\n\r\n\t\tobject.quaternion.copy( this.quaternion );\r\n\t\tobject.useQuaternion = this.useQuaternion;\r\n\r\n\t\tobject.visible = this.visible;\r\n\r\n\t\tobject.castShadow = this.castShadow;\r\n\t\tobject.receiveShadow = this.receiveShadow;\r\n\r\n\t\tobject.frustumCulled = this.frustumCulled;\r\n\r\n\t\tobject.userData = JSON.parse( JSON.stringify( this.userData ) );\r\n\r\n\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\r\n\r\n\t\t\tvar child = this.children[ i ];\r\n\t\t\tobject.add( child.clone() );\r\n\r\n\t\t}\r\n\r\n\t\treturn object;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Object3D.defaultEulerOrder = 'XYZ',\r\n\r\nTHREE.Object3DIdCount = 0;\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author julianwa / https://github.com/julianwa\r\n */\r\n\r\nTHREE.Projector = function () {\r\n\r\n\tvar _object, _objectCount, _objectPool = [], _objectPoolLength = 0,\r\n\t_vertex, _vertexCount, _vertexPool = [], _vertexPoolLength = 0,\r\n\t_face, _face3Count, _face3Pool = [], _face3PoolLength = 0,\r\n\t_face4Count, _face4Pool = [], _face4PoolLength = 0,\r\n\t_line, _lineCount, _linePool = [], _linePoolLength = 0,\r\n\t_particle, _particleCount, _particlePool = [], _particlePoolLength = 0,\r\n\r\n\t_renderData = { objects: [], sprites: [], lights: [], elements: [] },\r\n\r\n\t_vector3 = new THREE.Vector3(),\r\n\t_vector4 = new THREE.Vector4(),\r\n\r\n\t_clipBox = new THREE.Box3( new THREE.Vector3( -1, -1, -1 ), new THREE.Vector3( 1, 1, 1 ) ),\r\n\t_boundingBox = new THREE.Box3(),\r\n\t_points3 = new Array( 3 ),\r\n\t_points4 = new Array( 4 ),\r\n\r\n\t_viewMatrix = new THREE.Matrix4(),\r\n\t_viewProjectionMatrix = new THREE.Matrix4(),\r\n\r\n\t_modelMatrix,\r\n\t_modelViewProjectionMatrix = new THREE.Matrix4(),\r\n\r\n\t_normalMatrix = new THREE.Matrix3(),\r\n\t_normalViewMatrix = new THREE.Matrix3(),\r\n\r\n\t_centroid = new THREE.Vector3(),\r\n\r\n\t_frustum = new THREE.Frustum(),\r\n\r\n\t_clippedVertex1PositionScreen = new THREE.Vector4(),\r\n\t_clippedVertex2PositionScreen = new THREE.Vector4();\r\n\r\n\tthis.projectVector = function ( vector, camera ) {\r\n\r\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\r\n\r\n\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\r\n\r\n\t\treturn vector.applyProjection( _viewProjectionMatrix );\r\n\r\n\t};\r\n\r\n\tthis.unprojectVector = function ( vector, camera ) {\r\n\r\n\t\tcamera.projectionMatrixInverse.getInverse( camera.projectionMatrix );\r\n\r\n\t\t_viewProjectionMatrix.multiplyMatrices( camera.matrixWorld, camera.projectionMatrixInverse );\r\n\r\n\t\treturn vector.applyProjection( _viewProjectionMatrix );\r\n\r\n\t};\r\n\r\n\tthis.pickingRay = function ( vector, camera ) {\r\n\r\n\t\t// set two vectors with opposing z values\r\n\t\tvector.z = -1.0;\r\n\t\tvar end = new THREE.Vector3( vector.x, vector.y, 1.0 );\r\n\r\n\t\tthis.unprojectVector( vector, camera );\r\n\t\tthis.unprojectVector( end, camera );\r\n\r\n\t\t// find direction from vector to end\r\n\t\tend.sub( vector ).normalize();\r\n\r\n\t\treturn new THREE.Raycaster( vector, end );\r\n\r\n\t};\r\n\r\n\tvar getObject = function ( object ) {\r\n\r\n\t\t_object = getNextObjectInPool();\r\n\t\t_object.object = object;\r\n\r\n\t\tif ( object.renderDepth !== null ) {\r\n\r\n\t\t\t_object.z = object.renderDepth;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_vector3.getPositionFromMatrix( object.matrixWorld );\r\n\t\t\t_vector3.applyProjection( _viewProjectionMatrix );\r\n\t\t\t_object.z = _vector3.z;\r\n\r\n\t\t}\r\n\r\n\t\treturn _object;\r\n\r\n\t};\r\n\r\n\tvar projectObject = function ( object ) {\r\n\r\n\t\tif ( object.visible === false ) return;\r\n\r\n\t\tif ( object instanceof THREE.Light ) {\r\n\r\n\t\t\t_renderData.lights.push( object );\r\n\r\n\t\t} else if ( object instanceof THREE.Mesh || object instanceof THREE.Line ) {\r\n\r\n\t\t\tif ( object.frustumCulled === false || _frustum.intersectsObject( object ) === true ) {\r\n\r\n\t\t\t\t_renderData.objects.push( getObject( object ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( object instanceof THREE.Sprite || object instanceof THREE.Particle ) {\r\n\r\n\t\t\t_renderData.sprites.push( getObject( object ) );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\r\n\r\n\t\t\tprojectObject( object.children[ i ] );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar projectGraph = function ( root, sortObjects ) {\r\n\r\n\t\t_objectCount = 0;\r\n\r\n\t\t_renderData.objects.length = 0;\r\n\t\t_renderData.sprites.length = 0;\r\n\t\t_renderData.lights.length = 0;\r\n\r\n\t\tprojectObject( root );\r\n\r\n\t\tif ( sortObjects === true ) {\r\n\r\n\t\t\t_renderData.objects.sort( painterSort );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.projectScene = function ( scene, camera, sortObjects, sortElements ) {\r\n\r\n\t\tvar visible = false,\r\n\t\to, ol, v, vl, f, fl, n, nl, c, cl, u, ul, object,\r\n\t\tgeometry, vertices, faces, face, faceVertexNormals, faceVertexUvs, uvs,\r\n\t\tv1, v2, v3, v4, isFaceMaterial, objectMaterials;\r\n\r\n\t\t_face3Count = 0;\r\n\t\t_face4Count = 0;\r\n\t\t_lineCount = 0;\r\n\t\t_particleCount = 0;\r\n\r\n\t\t_renderData.elements.length = 0;\r\n\r\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\r\n\r\n\t\t_viewMatrix.copy( camera.matrixWorldInverse.getInverse( camera.matrixWorld ) );\r\n\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\r\n\r\n\t\t_normalViewMatrix.getNormalMatrix( _viewMatrix );\r\n\r\n\t\t_frustum.setFromMatrix( _viewProjectionMatrix );\r\n\r\n\t\tprojectGraph( scene, sortObjects );\r\n\r\n\t\tfor ( o = 0, ol = _renderData.objects.length; o < ol; o ++ ) {\r\n\r\n\t\t\tobject = _renderData.objects[ o ].object;\r\n\r\n\t\t\t_modelMatrix = object.matrixWorld;\r\n\r\n\t\t\t_vertexCount = 0;\r\n\r\n\t\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t\tgeometry = object.geometry;\r\n\r\n\t\t\t\tvertices = geometry.vertices;\r\n\t\t\t\tfaces = geometry.faces;\r\n\t\t\t\tfaceVertexUvs = geometry.faceVertexUvs;\r\n\r\n\t\t\t\t_normalMatrix.getNormalMatrix( _modelMatrix );\r\n\r\n\t\t\t\tisFaceMaterial = object.material instanceof THREE.MeshFaceMaterial;\r\n\t\t\t\tobjectMaterials = isFaceMaterial === true ? object.material : null;\r\n\r\n\t\t\t\tfor ( v = 0, vl = vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\t\t\t_vertex = getNextVertexInPool();\r\n\r\n\t\t\t\t\t_vertex.positionWorld.copy( vertices[ v ] ).applyMatrix4( _modelMatrix );\r\n\t\t\t\t\t_vertex.positionScreen.copy( _vertex.positionWorld ).applyMatrix4( _viewProjectionMatrix );\r\n\r\n\t\t\t\t\t_vertex.positionScreen.x /= _vertex.positionScreen.w;\r\n\t\t\t\t\t_vertex.positionScreen.y /= _vertex.positionScreen.w;\r\n\t\t\t\t\t_vertex.positionScreen.z /= _vertex.positionScreen.w;\r\n\r\n\t\t\t\t\t_vertex.visible = ! ( _vertex.positionScreen.x < -1 || _vertex.positionScreen.x > 1 ||\r\n\t\t\t\t\t\t\t _vertex.positionScreen.y < -1 || _vertex.positionScreen.y > 1 ||\r\n\t\t\t\t\t\t\t _vertex.positionScreen.z < -1 || _vertex.positionScreen.z > 1 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( f = 0, fl = faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\tface = faces[ f ];\r\n\r\n\t\t\t\t\tvar material = isFaceMaterial === true\r\n\t\t\t\t\t\t? objectMaterials.materials[ face.materialIndex ]\r\n\t\t\t\t\t\t: object.material;\r\n\r\n\t\t\t\t\tif ( material === undefined ) continue;\r\n\r\n\t\t\t\t\tvar side = material.side;\r\n\r\n\t\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\t\tv1 = _vertexPool[ face.a ];\r\n\t\t\t\t\t\tv2 = _vertexPool[ face.b ];\r\n\t\t\t\t\t\tv3 = _vertexPool[ face.c ];\r\n\r\n\t\t\t\t\t\t_points3[ 0 ] = v1.positionScreen;\r\n\t\t\t\t\t\t_points3[ 1 ] = v2.positionScreen;\r\n\t\t\t\t\t\t_points3[ 2 ] = v3.positionScreen;\r\n\r\n\t\t\t\t\t\tif ( v1.visible === true || v2.visible === true || v3.visible === true ||\r\n\t\t\t\t\t\t\t_clipBox.isIntersectionBox( _boundingBox.setFromPoints( _points3 ) ) ) {\r\n\r\n\t\t\t\t\t\t\tvisible = ( ( v3.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -\r\n\t\t\t\t\t\t\t\t( v3.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0;\r\n\r\n\t\t\t\t\t\t\tif ( side === THREE.DoubleSide || visible === ( side === THREE.FrontSide ) ) {\r\n\r\n\t\t\t\t\t\t\t\t_face = getNextFace3InPool();\r\n\r\n\t\t\t\t\t\t\t\t_face.v1.copy( v1 );\r\n\t\t\t\t\t\t\t\t_face.v2.copy( v2 );\r\n\t\t\t\t\t\t\t\t_face.v3.copy( v3 );\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\t\t\tv1 = _vertexPool[ face.a ];\r\n\t\t\t\t\t\tv2 = _vertexPool[ face.b ];\r\n\t\t\t\t\t\tv3 = _vertexPool[ face.c ];\r\n\t\t\t\t\t\tv4 = _vertexPool[ face.d ];\r\n\r\n\t\t\t\t\t\t_points4[ 0 ] = v1.positionScreen;\r\n\t\t\t\t\t\t_points4[ 1 ] = v2.positionScreen;\r\n\t\t\t\t\t\t_points4[ 2 ] = v3.positionScreen;\r\n\t\t\t\t\t\t_points4[ 3 ] = v4.positionScreen;\r\n\r\n\t\t\t\t\t\tif ( v1.visible === true || v2.visible === true || v3.visible === true || v4.visible === true ||\r\n\t\t\t\t\t\t\t_clipBox.isIntersectionBox( _boundingBox.setFromPoints( _points4 ) ) ) {\r\n\r\n\t\t\t\t\t\t\tvisible = ( v4.positionScreen.x - v1.positionScreen.x ) * ( v2.positionScreen.y - v1.positionScreen.y ) -\r\n\t\t\t\t\t\t\t\t( v4.positionScreen.y - v1.positionScreen.y ) * ( v2.positionScreen.x - v1.positionScreen.x ) < 0 ||\r\n\t\t\t\t\t\t\t\t( v2.positionScreen.x - v3.positionScreen.x ) * ( v4.positionScreen.y - v3.positionScreen.y ) -\r\n\t\t\t\t\t\t\t\t( v2.positionScreen.y - v3.positionScreen.y ) * ( v4.positionScreen.x - v3.positionScreen.x ) < 0;\r\n\r\n\r\n\t\t\t\t\t\t\tif ( side === THREE.DoubleSide || visible === ( side === THREE.FrontSide ) ) {\r\n\r\n\t\t\t\t\t\t\t\t_face = getNextFace4InPool();\r\n\r\n\t\t\t\t\t\t\t\t_face.v1.copy( v1 );\r\n\t\t\t\t\t\t\t\t_face.v2.copy( v2 );\r\n\t\t\t\t\t\t\t\t_face.v3.copy( v3 );\r\n\t\t\t\t\t\t\t\t_face.v4.copy( v4 );\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_face.normalModel.copy( face.normal );\r\n\r\n\t\t\t\t\tif ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) {\r\n\r\n\t\t\t\t\t\t_face.normalModel.negate();\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_face.normalModel.applyMatrix3( _normalMatrix ).normalize();\r\n\r\n\t\t\t\t\t_face.normalModelView.copy( _face.normalModel ).applyMatrix3( _normalViewMatrix );\r\n\r\n\t\t\t\t\t_face.centroidModel.copy( face.centroid ).applyMatrix4( _modelMatrix );\r\n\r\n\t\t\t\t\tfaceVertexNormals = face.vertexNormals;\r\n\r\n\t\t\t\t\tfor ( n = 0, nl = faceVertexNormals.length; n < nl; n ++ ) {\r\n\r\n\t\t\t\t\t\tvar normalModel = _face.vertexNormalsModel[ n ];\r\n\t\t\t\t\t\tnormalModel.copy( faceVertexNormals[ n ] );\r\n\r\n\t\t\t\t\t\tif ( visible === false && ( side === THREE.BackSide || side === THREE.DoubleSide ) ) {\r\n\r\n\t\t\t\t\t\t\tnormalModel.negate();\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tnormalModel.applyMatrix3( _normalMatrix ).normalize();\r\n\r\n\t\t\t\t\t\tvar normalModelView = _face.vertexNormalsModelView[ n ];\r\n\t\t\t\t\t\tnormalModelView.copy( normalModel ).applyMatrix3( _normalViewMatrix );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_face.vertexNormalsLength = faceVertexNormals.length;\r\n\r\n\t\t\t\t\tfor ( c = 0, cl = faceVertexUvs.length; c < cl; c ++ ) {\r\n\r\n\t\t\t\t\t\tuvs = faceVertexUvs[ c ][ f ];\r\n\r\n\t\t\t\t\t\tif ( uvs === undefined ) continue;\r\n\r\n\t\t\t\t\t\tfor ( u = 0, ul = uvs.length; u < ul; u ++ ) {\r\n\r\n\t\t\t\t\t\t\t_face.uvs[ c ][ u ] = uvs[ u ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_face.color = face.color;\r\n\t\t\t\t\t_face.material = material;\r\n\r\n\t\t\t\t\t_centroid.copy( _face.centroidModel ).applyProjection( _viewProjectionMatrix );\r\n\r\n\t\t\t\t\t_face.z = _centroid.z;\r\n\r\n\t\t\t\t\t_renderData.elements.push( _face );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\t\t_modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );\r\n\r\n\t\t\t\tvertices = object.geometry.vertices;\r\n\r\n\t\t\t\tv1 = getNextVertexInPool();\r\n\t\t\t\tv1.positionScreen.copy( vertices[ 0 ] ).applyMatrix4( _modelViewProjectionMatrix );\r\n\r\n\t\t\t\t// Handle LineStrip and LinePieces\r\n\t\t\t\tvar step = object.type === THREE.LinePieces ? 2 : 1;\r\n\r\n\t\t\t\tfor ( v = 1, vl = vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\t\t\tv1 = getNextVertexInPool();\r\n\t\t\t\t\tv1.positionScreen.copy( vertices[ v ] ).applyMatrix4( _modelViewProjectionMatrix );\r\n\r\n\t\t\t\t\tif ( ( v + 1 ) % step > 0 ) continue;\r\n\r\n\t\t\t\t\tv2 = _vertexPool[ _vertexCount - 2 ];\r\n\r\n\t\t\t\t\t_clippedVertex1PositionScreen.copy( v1.positionScreen );\r\n\t\t\t\t\t_clippedVertex2PositionScreen.copy( v2.positionScreen );\r\n\r\n\t\t\t\t\tif ( clipLine( _clippedVertex1PositionScreen, _clippedVertex2PositionScreen ) === true ) {\r\n\r\n\t\t\t\t\t\t// Perform the perspective divide\r\n\t\t\t\t\t\t_clippedVertex1PositionScreen.multiplyScalar( 1 / _clippedVertex1PositionScreen.w );\r\n\t\t\t\t\t\t_clippedVertex2PositionScreen.multiplyScalar( 1 / _clippedVertex2PositionScreen.w );\r\n\r\n\t\t\t\t\t\t_line = getNextLineInPool();\r\n\t\t\t\t\t\t_line.v1.positionScreen.copy( _clippedVertex1PositionScreen );\r\n\t\t\t\t\t\t_line.v2.positionScreen.copy( _clippedVertex2PositionScreen );\r\n\r\n\t\t\t\t\t\t_line.z = Math.max( _clippedVertex1PositionScreen.z, _clippedVertex2PositionScreen.z );\r\n\r\n\t\t\t\t\t\t_line.material = object.material;\r\n\r\n\t\t\t\t\t\tif ( object.material.vertexColors === THREE.VertexColors ) {\r\n\r\n\t\t\t\t\t\t\t_line.vertexColors[ 0 ].copy( object.geometry.colors[ v ] );\r\n\t\t\t\t\t\t\t_line.vertexColors[ 1 ].copy( object.geometry.colors[ v - 1 ] );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t_renderData.elements.push( _line );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( o = 0, ol = _renderData.sprites.length; o < ol; o++ ) {\r\n\r\n\t\t\tobject = _renderData.sprites[ o ].object;\r\n\r\n\t\t\t_modelMatrix = object.matrixWorld;\r\n\r\n\t\t\tif ( object instanceof THREE.Particle ) {\r\n\r\n\t\t\t\t_vector4.set( _modelMatrix.elements[12], _modelMatrix.elements[13], _modelMatrix.elements[14], 1 );\r\n\t\t\t\t_vector4.applyMatrix4( _viewProjectionMatrix );\r\n\r\n\t\t\t\t_vector4.z /= _vector4.w;\r\n\r\n\t\t\t\tif ( _vector4.z > 0 && _vector4.z < 1 ) {\r\n\r\n\t\t\t\t\t_particle = getNextParticleInPool();\r\n\t\t\t\t\t_particle.object = object;\r\n\t\t\t\t\t_particle.x = _vector4.x / _vector4.w;\r\n\t\t\t\t\t_particle.y = _vector4.y / _vector4.w;\r\n\t\t\t\t\t_particle.z = _vector4.z;\r\n\r\n\t\t\t\t\t_particle.rotation = object.rotation.z;\r\n\r\n\t\t\t\t\t_particle.scale.x = object.scale.x * Math.abs( _particle.x - ( _vector4.x + camera.projectionMatrix.elements[0] ) / ( _vector4.w + camera.projectionMatrix.elements[12] ) );\r\n\t\t\t\t\t_particle.scale.y = object.scale.y * Math.abs( _particle.y - ( _vector4.y + camera.projectionMatrix.elements[5] ) / ( _vector4.w + camera.projectionMatrix.elements[13] ) );\r\n\r\n\t\t\t\t\t_particle.material = object.material;\r\n\r\n\t\t\t\t\t_renderData.elements.push( _particle );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( sortElements === true ) _renderData.elements.sort( painterSort );\r\n\r\n\t\treturn _renderData;\r\n\r\n\t};\r\n\r\n\t// Pools\r\n\r\n\tfunction getNextObjectInPool() {\r\n\r\n\t\tif ( _objectCount === _objectPoolLength ) {\r\n\r\n\t\t\tvar object = new THREE.RenderableObject();\r\n\t\t\t_objectPool.push( object );\r\n\t\t\t_objectPoolLength ++;\r\n\t\t\t_objectCount ++;\r\n\t\t\treturn object;\r\n\r\n\t\t}\r\n\r\n\t\treturn _objectPool[ _objectCount ++ ];\r\n\r\n\t}\r\n\r\n\tfunction getNextVertexInPool() {\r\n\r\n\t\tif ( _vertexCount === _vertexPoolLength ) {\r\n\r\n\t\t\tvar vertex = new THREE.RenderableVertex();\r\n\t\t\t_vertexPool.push( vertex );\r\n\t\t\t_vertexPoolLength ++;\r\n\t\t\t_vertexCount ++;\r\n\t\t\treturn vertex;\r\n\r\n\t\t}\r\n\r\n\t\treturn _vertexPool[ _vertexCount ++ ];\r\n\r\n\t}\r\n\r\n\tfunction getNextFace3InPool() {\r\n\r\n\t\tif ( _face3Count === _face3PoolLength ) {\r\n\r\n\t\t\tvar face = new THREE.RenderableFace3();\r\n\t\t\t_face3Pool.push( face );\r\n\t\t\t_face3PoolLength ++;\r\n\t\t\t_face3Count ++;\r\n\t\t\treturn face;\r\n\r\n\t\t}\r\n\r\n\t\treturn _face3Pool[ _face3Count ++ ];\r\n\r\n\r\n\t}\r\n\r\n\tfunction getNextFace4InPool() {\r\n\r\n\t\tif ( _face4Count === _face4PoolLength ) {\r\n\r\n\t\t\tvar face = new THREE.RenderableFace4();\r\n\t\t\t_face4Pool.push( face );\r\n\t\t\t_face4PoolLength ++;\r\n\t\t\t_face4Count ++;\r\n\t\t\treturn face;\r\n\r\n\t\t}\r\n\r\n\t\treturn _face4Pool[ _face4Count ++ ];\r\n\r\n\t}\r\n\r\n\tfunction getNextLineInPool() {\r\n\r\n\t\tif ( _lineCount === _linePoolLength ) {\r\n\r\n\t\t\tvar line = new THREE.RenderableLine();\r\n\t\t\t_linePool.push( line );\r\n\t\t\t_linePoolLength ++;\r\n\t\t\t_lineCount ++\r\n\t\t\treturn line;\r\n\r\n\t\t}\r\n\r\n\t\treturn _linePool[ _lineCount ++ ];\r\n\r\n\t}\r\n\r\n\tfunction getNextParticleInPool() {\r\n\r\n\t\tif ( _particleCount === _particlePoolLength ) {\r\n\r\n\t\t\tvar particle = new THREE.RenderableParticle();\r\n\t\t\t_particlePool.push( particle );\r\n\t\t\t_particlePoolLength ++;\r\n\t\t\t_particleCount ++\r\n\t\t\treturn particle;\r\n\r\n\t\t}\r\n\r\n\t\treturn _particlePool[ _particleCount ++ ];\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tfunction painterSort( a, b ) {\r\n\r\n\t\treturn b.z - a.z;\r\n\r\n\t}\r\n\r\n\tfunction clipLine( s1, s2 ) {\r\n\r\n\t\tvar alpha1 = 0, alpha2 = 1,\r\n\r\n\t\t// Calculate the boundary coordinate of each vertex for the near and far clip planes,\r\n\t\t// Z = -1 and Z = +1, respectively.\r\n\t\tbc1near = s1.z + s1.w,\r\n\t\tbc2near = s2.z + s2.w,\r\n\t\tbc1far = - s1.z + s1.w,\r\n\t\tbc2far = - s2.z + s2.w;\r\n\r\n\t\tif ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) {\r\n\r\n\t\t\t// Both vertices lie entirely within all clip planes.\r\n\t\t\treturn true;\r\n\r\n\t\t} else if ( ( bc1near < 0 && bc2near < 0) || (bc1far < 0 && bc2far < 0 ) ) {\r\n\r\n\t\t\t// Both vertices lie entirely outside one of the clip planes.\r\n\t\t\treturn false;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// The line segment spans at least one clip plane.\r\n\r\n\t\t\tif ( bc1near < 0 ) {\r\n\r\n\t\t\t\t// v1 lies outside the near plane, v2 inside\r\n\t\t\t\talpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) );\r\n\r\n\t\t\t} else if ( bc2near < 0 ) {\r\n\r\n\t\t\t\t// v2 lies outside the near plane, v1 inside\r\n\t\t\t\talpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( bc1far < 0 ) {\r\n\r\n\t\t\t\t// v1 lies outside the far plane, v2 inside\r\n\t\t\t\talpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) );\r\n\r\n\t\t\t} else if ( bc2far < 0 ) {\r\n\r\n\t\t\t\t// v2 lies outside the far plane, v2 inside\r\n\t\t\t\talpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( alpha2 < alpha1 ) {\r\n\r\n\t\t\t\t// The line segment spans two boundaries, but is outside both of them.\r\n\t\t\t\t// (This can't happen when we're only clipping against just near/far but good\r\n\t\t\t\t// to leave the check here for future usage if other clip planes are added.)\r\n\t\t\t\treturn false;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Update the s1 and s2 vertices to match the clipped line segment.\r\n\t\t\t\ts1.lerp( s2, alpha1 );\r\n\t\t\t\ts2.lerp( s1, 1 - alpha2 );\r\n\r\n\t\t\t\treturn true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Face3 = function ( a, b, c, normal, color, materialIndex ) {\r\n\r\n\tthis.a = a;\r\n\tthis.b = b;\r\n\tthis.c = c;\r\n\r\n\tthis.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();\r\n\tthis.vertexNormals = normal instanceof Array ? normal : [ ];\r\n\r\n\tthis.color = color instanceof THREE.Color ? color : new THREE.Color();\r\n\tthis.vertexColors = color instanceof Array ? color : [];\r\n\r\n\tthis.vertexTangents = [];\r\n\r\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\r\n\r\n\tthis.centroid = new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Face3.prototype = {\r\n\r\n\tconstructor: THREE.Face3,\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar face = new THREE.Face3( this.a, this.b, this.c );\r\n\r\n\t\tface.normal.copy( this.normal );\r\n\t\tface.color.copy( this.color );\r\n\t\tface.centroid.copy( this.centroid );\r\n\r\n\t\tface.materialIndex = this.materialIndex;\r\n\r\n\t\tvar i, il;\r\n\t\tfor ( i = 0, il = this.vertexNormals.length; i < il; i ++ ) face.vertexNormals[ i ] = this.vertexNormals[ i ].clone();\r\n\t\tfor ( i = 0, il = this.vertexColors.length; i < il; i ++ ) face.vertexColors[ i ] = this.vertexColors[ i ].clone();\r\n\t\tfor ( i = 0, il = this.vertexTangents.length; i < il; i ++ ) face.vertexTangents[ i ] = this.vertexTangents[ i ].clone();\r\n\r\n\t\treturn face;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Face4 = function ( a, b, c, d, normal, color, materialIndex ) {\r\n\r\n\tthis.a = a;\r\n\tthis.b = b;\r\n\tthis.c = c;\r\n\tthis.d = d;\r\n\r\n\tthis.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();\r\n\tthis.vertexNormals = normal instanceof Array ? normal : [ ];\r\n\r\n\tthis.color = color instanceof THREE.Color ? color : new THREE.Color();\r\n\tthis.vertexColors = color instanceof Array ? color : [];\r\n\r\n\tthis.vertexTangents = [];\r\n\r\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\r\n\r\n\tthis.centroid = new THREE.Vector3();\r\n\r\n};\r\n\r\nTHREE.Face4.prototype = {\r\n\r\n\tconstructor: THREE.Face4,\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar face = new THREE.Face4( this.a, this.b, this.c, this.d );\r\n\r\n\t\tface.normal.copy( this.normal );\r\n\t\tface.color.copy( this.color );\r\n\t\tface.centroid.copy( this.centroid );\r\n\r\n\t\tface.materialIndex = this.materialIndex;\r\n\r\n\t\tvar i, il;\r\n\t\tfor ( i = 0, il = this.vertexNormals.length; i < il; i ++ ) face.vertexNormals[ i ] = this.vertexNormals[ i ].clone();\r\n\t\tfor ( i = 0, il = this.vertexColors.length; i < il; i ++ ) face.vertexColors[ i ] = this.vertexColors[ i ].clone();\r\n\t\tfor ( i = 0, il = this.vertexTangents.length; i < il; i ++ ) face.vertexTangents[ i ] = this.vertexTangents[ i ].clone();\r\n\r\n\t\treturn face;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author kile / http://kile.stravaganza.org/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\nTHREE.Geometry = function () {\r\n\r\n\tthis.id = THREE.GeometryIdCount ++;\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.vertices = [];\r\n\tthis.colors = []; // one-to-one vertex colors, used in ParticleSystem, Line and Ribbon\r\n\tthis.normals = []; // one-to-one vertex normals, used in Ribbon\r\n\r\n\tthis.faces = [];\r\n\r\n\tthis.faceUvs = [[]];\r\n\tthis.faceVertexUvs = [[]];\r\n\r\n\tthis.morphTargets = [];\r\n\tthis.morphColors = [];\r\n\tthis.morphNormals = [];\r\n\r\n\tthis.skinWeights = [];\r\n\tthis.skinIndices = [];\r\n\r\n\tthis.lineDistances = [];\r\n\r\n\tthis.boundingBox = null;\r\n\tthis.boundingSphere = null;\r\n\r\n\tthis.hasTangents = false;\r\n\r\n\tthis.dynamic = true; // the intermediate typed arrays will be deleted when set to false\r\n\r\n\t// update flags\r\n\r\n\tthis.verticesNeedUpdate = false;\r\n\tthis.elementsNeedUpdate = false;\r\n\tthis.uvsNeedUpdate = false;\r\n\tthis.normalsNeedUpdate = false;\r\n\tthis.tangentsNeedUpdate = false;\r\n\tthis.colorsNeedUpdate = false;\r\n\tthis.lineDistancesNeedUpdate = false;\r\n\r\n\tthis.buffersNeedUpdate = false;\r\n\r\n};\r\n\r\nTHREE.Geometry.prototype = {\r\n\r\n\tconstructor: THREE.Geometry,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tvar normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar vertex = this.vertices[ i ];\r\n\t\t\tvertex.applyMatrix4( matrix );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar face = this.faces[ i ];\r\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tface.centroid.applyMatrix4( matrix );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeCentroids: function () {\r\n\r\n\t\tvar f, fl, face;\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\t\t\tface.centroid.set( 0, 0, 0 );\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tface.centroid.add( this.vertices[ face.a ] );\r\n\t\t\t\tface.centroid.add( this.vertices[ face.b ] );\r\n\t\t\t\tface.centroid.add( this.vertices[ face.c ] );\r\n\t\t\t\tface.centroid.divideScalar( 3 );\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tface.centroid.add( this.vertices[ face.a ] );\r\n\t\t\t\tface.centroid.add( this.vertices[ face.b ] );\r\n\t\t\t\tface.centroid.add( this.vertices[ face.c ] );\r\n\t\t\t\tface.centroid.add( this.vertices[ face.d ] );\r\n\t\t\t\tface.centroid.divideScalar( 4 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeFaceNormals: function () {\r\n\r\n\t\tvar cb = new THREE.Vector3(), ab = new THREE.Vector3();\r\n\r\n\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tvar face = this.faces[ f ];\r\n\r\n\t\t\tvar vA = this.vertices[ face.a ];\r\n\t\t\tvar vB = this.vertices[ face.b ];\r\n\t\t\tvar vC = this.vertices[ face.c ];\r\n\r\n\t\t\tcb.subVectors( vC, vB );\r\n\t\t\tab.subVectors( vA, vB );\r\n\t\t\tcb.cross( ab );\r\n\r\n\t\t\tcb.normalize();\r\n\r\n\t\t\tface.normal.copy( cb );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeVertexNormals: function ( areaWeighted ) {\r\n\r\n\t\tvar v, vl, f, fl, face, vertices;\r\n\r\n\t\t// create internal buffers for reuse when calling this method repeatedly\r\n\t\t// (otherwise memory allocation / deallocation every frame is big resource hog)\r\n\r\n\t\tif ( this.__tmpVertices === undefined ) {\r\n\r\n\t\t\tthis.__tmpVertices = new Array( this.vertices.length );\r\n\t\t\tvertices = this.__tmpVertices;\r\n\r\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertices[ v ] = new THREE.Vector3();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\tface.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\r\n\t\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\t\tface.vertexNormals = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvertices = this.__tmpVertices;\r\n\r\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertices[ v ].set( 0, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( areaWeighted ) {\r\n\r\n\t\t\t// vertex normals weighted by triangle areas\r\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\r\n\r\n\t\t\tvar vA, vB, vC, vD;\r\n\t\t\tvar cb = new THREE.Vector3(), ab = new THREE.Vector3(),\r\n\t\t\t\tdb = new THREE.Vector3(), dc = new THREE.Vector3(), bc = new THREE.Vector3();\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\tvA = this.vertices[ face.a ];\r\n\t\t\t\t\tvB = this.vertices[ face.b ];\r\n\t\t\t\t\tvC = this.vertices[ face.c ];\r\n\r\n\t\t\t\t\tcb.subVectors( vC, vB );\r\n\t\t\t\t\tab.subVectors( vA, vB );\r\n\t\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\t\tvertices[ face.a ].add( cb );\r\n\t\t\t\t\tvertices[ face.b ].add( cb );\r\n\t\t\t\t\tvertices[ face.c ].add( cb );\r\n\r\n\t\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\t\tvA = this.vertices[ face.a ];\r\n\t\t\t\t\tvB = this.vertices[ face.b ];\r\n\t\t\t\t\tvC = this.vertices[ face.c ];\r\n\t\t\t\t\tvD = this.vertices[ face.d ];\r\n\r\n\t\t\t\t\t// abd\r\n\r\n\t\t\t\t\tdb.subVectors( vD, vB );\r\n\t\t\t\t\tab.subVectors( vA, vB );\r\n\t\t\t\t\tdb.cross( ab );\r\n\r\n\t\t\t\t\tvertices[ face.a ].add( db );\r\n\t\t\t\t\tvertices[ face.b ].add( db );\r\n\t\t\t\t\tvertices[ face.d ].add( db );\r\n\r\n\t\t\t\t\t// bcd\r\n\r\n\t\t\t\t\tdc.subVectors( vD, vC );\r\n\t\t\t\t\tbc.subVectors( vB, vC );\r\n\t\t\t\t\tdc.cross( bc );\r\n\r\n\t\t\t\t\tvertices[ face.b ].add( dc );\r\n\t\t\t\t\tvertices[ face.c ].add( dc );\r\n\t\t\t\t\tvertices[ face.d ].add( dc );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\r\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\r\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\r\n\r\n\t\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\r\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\r\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\r\n\t\t\t\t\tvertices[ face.d ].add( face.normal );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\tvertices[ v ].normalize();\r\n\r\n\t\t}\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tface.vertexNormals[ 0 ].copy( vertices[ face.a ] );\r\n\t\t\t\tface.vertexNormals[ 1 ].copy( vertices[ face.b ] );\r\n\t\t\t\tface.vertexNormals[ 2 ].copy( vertices[ face.c ] );\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tface.vertexNormals[ 0 ].copy( vertices[ face.a ] );\r\n\t\t\t\tface.vertexNormals[ 1 ].copy( vertices[ face.b ] );\r\n\t\t\t\tface.vertexNormals[ 2 ].copy( vertices[ face.c ] );\r\n\t\t\t\tface.vertexNormals[ 3 ].copy( vertices[ face.d ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeMorphNormals: function () {\r\n\r\n\t\tvar i, il, f, fl, face;\r\n\r\n\t\t// save original normals\r\n\t\t// - create temp variables on first access\r\n\t\t// otherwise just copy (for faster repeated calls)\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tif ( ! face.__originalFaceNormal ) {\r\n\r\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\r\n\r\n\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\r\n\r\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// use temp geometry to compute face and vertex normals for each morph\r\n\r\n\t\tvar tmpGeo = new THREE.Geometry();\r\n\t\ttmpGeo.faces = this.faces;\r\n\r\n\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\t\t// create on first access\r\n\r\n\t\t\tif ( ! this.morphNormals[ i ] ) {\r\n\r\n\t\t\t\tthis.morphNormals[ i ] = {};\r\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\r\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\r\n\r\n\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\r\n\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\r\n\r\n\t\t\t\tvar faceNormal, vertexNormals;\r\n\r\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\t\tfaceNormal = new THREE.Vector3();\r\n\r\n\t\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\t\tvertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3() };\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tvertexNormals = { a: new THREE.Vector3(), b: new THREE.Vector3(), c: new THREE.Vector3(), d: new THREE.Vector3() };\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\r\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar morphNormals = this.morphNormals[ i ];\r\n\r\n\t\t\t// set vertices to morph target\r\n\r\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\r\n\r\n\t\t\t// compute morph normals\r\n\r\n\t\t\ttmpGeo.computeFaceNormals();\r\n\t\t\ttmpGeo.computeVertexNormals();\r\n\r\n\t\t\t// store morph normals\r\n\r\n\t\t\tvar faceNormal, vertexNormals;\r\n\r\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\r\n\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\r\n\r\n\t\t\t\tfaceNormal.copy( face.normal );\r\n\r\n\t\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\r\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\r\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\r\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\r\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\r\n\t\t\t\t\tvertexNormals.d.copy( face.vertexNormals[ 3 ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore original normals\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tface.normal = face.__originalFaceNormal;\r\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeTangents: function () {\r\n\r\n\t\t// based on http://www.terathon.com/code/tangent.html\r\n\t\t// tangents go to vertices\r\n\r\n\t\tvar f, fl, v, vl, i, il, vertexIndex,\r\n\t\t\tface, uv, vA, vB, vC, uvA, uvB, uvC,\r\n\t\t\tx1, x2, y1, y2, z1, z2,\r\n\t\t\ts1, s2, t1, t2, r, t, test,\r\n\t\t\ttan1 = [], tan2 = [],\r\n\t\t\tsdir = new THREE.Vector3(), tdir = new THREE.Vector3(),\r\n\t\t\ttmp = new THREE.Vector3(), tmp2 = new THREE.Vector3(),\r\n\t\t\tn = new THREE.Vector3(), w;\r\n\r\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\r\n\r\n\t\t\ttan1[ v ] = new THREE.Vector3();\r\n\t\t\ttan2[ v ] = new THREE.Vector3();\r\n\r\n\t\t}\r\n\r\n\t\tfunction handleTriangle( context, a, b, c, ua, ub, uc ) {\r\n\r\n\t\t\tvA = context.vertices[ a ];\r\n\t\t\tvB = context.vertices[ b ];\r\n\t\t\tvC = context.vertices[ c ];\r\n\r\n\t\t\tuvA = uv[ ua ];\r\n\t\t\tuvB = uv[ ub ];\r\n\t\t\tuvC = uv[ uc ];\r\n\r\n\t\t\tx1 = vB.x - vA.x;\r\n\t\t\tx2 = vC.x - vA.x;\r\n\t\t\ty1 = vB.y - vA.y;\r\n\t\t\ty2 = vC.y - vA.y;\r\n\t\t\tz1 = vB.z - vA.z;\r\n\t\t\tz2 = vC.z - vA.z;\r\n\r\n\t\t\ts1 = uvB.x - uvA.x;\r\n\t\t\ts2 = uvC.x - uvA.x;\r\n\t\t\tt1 = uvB.y - uvA.y;\r\n\t\t\tt2 = uvC.y - uvA.y;\r\n\r\n\t\t\tr = 1.0 / ( s1 * t2 - s2 * t1 );\r\n\t\t\tsdir.set( ( t2 * x1 - t1 * x2 ) * r,\r\n\t\t\t\t\t ( t2 * y1 - t1 * y2 ) * r,\r\n\t\t\t\t\t ( t2 * z1 - t1 * z2 ) * r );\r\n\t\t\ttdir.set( ( s1 * x2 - s2 * x1 ) * r,\r\n\t\t\t\t\t ( s1 * y2 - s2 * y1 ) * r,\r\n\t\t\t\t\t ( s1 * z2 - s2 * z1 ) * r );\r\n\r\n\t\t\ttan1[ a ].add( sdir );\r\n\t\t\ttan1[ b ].add( sdir );\r\n\t\t\ttan1[ c ].add( sdir );\r\n\r\n\t\t\ttan2[ a ].add( tdir );\r\n\t\t\ttan2[ b ].add( tdir );\r\n\t\t\ttan2[ c ].add( tdir );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\t\t\tuv = this.faceVertexUvs[ 0 ][ f ]; // use UV layer 0 for tangents\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\thandleTriangle( this, face.a, face.b, face.c, 0, 1, 2 );\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\thandleTriangle( this, face.a, face.b, face.d, 0, 1, 3 );\r\n\t\t\t\thandleTriangle( this, face.b, face.c, face.d, 1, 2, 3 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar faceIndex = [ 'a', 'b', 'c', 'd' ];\r\n\r\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = this.faces[ f ];\r\n\r\n\t\t\tfor ( i = 0; i < face.vertexNormals.length; i++ ) {\r\n\r\n\t\t\t\tn.copy( face.vertexNormals[ i ] );\r\n\r\n\t\t\t\tvertexIndex = face[ faceIndex[ i ] ];\r\n\r\n\t\t\t\tt = tan1[ vertexIndex ];\r\n\r\n\t\t\t\t// Gram-Schmidt orthogonalize\r\n\r\n\t\t\t\ttmp.copy( t );\r\n\t\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\r\n\r\n\t\t\t\t// Calculate handedness\r\n\r\n\t\t\t\ttmp2.crossVectors( face.vertexNormals[ i ], t );\r\n\t\t\t\ttest = tmp2.dot( tan2[ vertexIndex ] );\r\n\t\t\t\tw = (test < 0.0) ? -1.0 : 1.0;\r\n\r\n\t\t\t\tface.vertexTangents[ i ] = new THREE.Vector4( tmp.x, tmp.y, tmp.z, w );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.hasTangents = true;\r\n\r\n\t},\r\n\r\n\tcomputeLineDistances: function ( ) {\r\n\r\n\t\tvar d = 0;\r\n\t\tvar vertices = this.vertices;\r\n\r\n\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tif ( i > 0 ) {\r\n\r\n\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.lineDistances[ i ] = d;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeBoundingBox: function () {\r\n\r\n\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\tthis.boundingBox = new THREE.Box3();\r\n\r\n\t\t}\r\n\r\n\t\tthis.boundingBox.setFromPoints( this.vertices );\r\n\r\n\t},\r\n\r\n\tcomputeBoundingSphere: function () {\r\n\r\n\t\tif ( this.boundingSphere === null ) {\r\n\r\n\t\t\tthis.boundingSphere = new THREE.Sphere();\r\n\r\n\t\t}\r\n\r\n\t\tthis.boundingSphere.setFromCenterAndPoints( this.boundingSphere.center, this.vertices );\r\n\r\n\t},\r\n\r\n\t/*\r\n\t * Checks for duplicate vertices with hashmap.\r\n\t * Duplicated vertices are removed\r\n\t * and faces' vertices are updated.\r\n\t */\r\n\r\n\tmergeVertices: function () {\r\n\r\n\t\tvar verticesMap = {}; // Hashmap for looking up vertice by position coordinates (and making sure they are unique)\r\n\t\tvar unique = [], changes = [];\r\n\r\n\t\tvar v, key;\r\n\t\tvar precisionPoints = 4; // number of decimal points, eg. 4 for epsilon of 0.0001\r\n\t\tvar precision = Math.pow( 10, precisionPoints );\r\n\t\tvar i,il, face;\r\n\t\tvar indices, k, j, jl, u;\r\n\r\n\t\t// reset cache of vertices as it now will be changing.\r\n\t\tthis.__tmpVertices = undefined;\r\n\r\n\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tv = this.vertices[ i ];\r\n\t\t\tkey = [ Math.round( v.x * precision ), Math.round( v.y * precision ), Math.round( v.z * precision ) ].join( '_' );\r\n\r\n\t\t\tif ( verticesMap[ key ] === undefined ) {\r\n\r\n\t\t\t\tverticesMap[ key ] = i;\r\n\t\t\t\tunique.push( this.vertices[ i ] );\r\n\t\t\t\tchanges[ i ] = unique.length - 1;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\r\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\r\n\t\t// if faces are completely degenerate after merging vertices, we\r\n\t\t// have to remove them from the geometry.\r\n\t\tvar faceIndicesToRemove = [];\r\n\r\n\t\tfor( i = 0, il = this.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = this.faces[ i ];\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tface.a = changes[ face.a ];\r\n\t\t\t\tface.b = changes[ face.b ];\r\n\t\t\t\tface.c = changes[ face.c ];\r\n\r\n\t\t\t\tindices = [ face.a, face.b, face.c ];\r\n\r\n\t\t\t\tvar dupIndex = -1;\r\n\r\n\t\t\t\t// if any duplicate vertices are found in a Face3\r\n\t\t\t\t// we have to remove the face as nothing can be saved\r\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\r\n\t\t\t\t\tif ( indices[ n ] == indices[ ( n + 1 ) % 3 ] ) {\r\n\r\n\t\t\t\t\t\tdupIndex = n;\r\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tface.a = changes[ face.a ];\r\n\t\t\t\tface.b = changes[ face.b ];\r\n\t\t\t\tface.c = changes[ face.c ];\r\n\t\t\t\tface.d = changes[ face.d ];\r\n\r\n\t\t\t\t// check dups in (a, b, c, d) and convert to -> face3\r\n\r\n\t\t\t\tindices = [ face.a, face.b, face.c, face.d ];\r\n\r\n\t\t\t\tvar dupIndex = -1;\r\n\r\n\t\t\t\tfor ( var n = 0; n < 4; n ++ ) {\r\n\r\n\t\t\t\t\tif ( indices[ n ] == indices[ ( n + 1 ) % 4 ] ) {\r\n\r\n\t\t\t\t\t\t// if more than one duplicated vertex is found\r\n\t\t\t\t\t\t// we can't generate any valid Face3's, thus\r\n\t\t\t\t\t\t// we need to remove this face complete.\r\n\t\t\t\t\t\tif ( dupIndex >= 0 ) {\r\n\r\n\t\t\t\t\t\t\tfaceIndicesToRemove.push( i );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdupIndex = n;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( dupIndex >= 0 ) {\r\n\r\n\t\t\t\t\tindices.splice( dupIndex, 1 );\r\n\r\n\t\t\t\t\tvar newFace = new THREE.Face3( indices[0], indices[1], indices[2], face.normal, face.color, face.materialIndex );\r\n\r\n\t\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\t\tu = this.faceVertexUvs[ j ][ i ];\r\n\r\n\t\t\t\t\t\tif ( u ) {\r\n\t\t\t\t\t\t\tu.splice( dupIndex, 1 );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif( face.vertexNormals && face.vertexNormals.length > 0) {\r\n\r\n\t\t\t\t\t\tnewFace.vertexNormals = face.vertexNormals;\r\n\t\t\t\t\t\tnewFace.vertexNormals.splice( dupIndex, 1 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif( face.vertexColors && face.vertexColors.length > 0 ) {\r\n\r\n\t\t\t\t\t\tnewFace.vertexColors = face.vertexColors;\r\n\t\t\t\t\t\tnewFace.vertexColors.splice( dupIndex, 1 );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.faces[ i ] = newFace;\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\r\n\r\n\t\t\tthis.faces.splice( i, 1 );\r\n\r\n\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tthis.faceVertexUvs[ j ].splice( i, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Use unique set of vertices\r\n\r\n\t\tvar diff = this.vertices.length - unique.length;\r\n\t\tthis.vertices = unique;\r\n\t\treturn diff;\r\n\r\n\t},\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar geometry = new THREE.Geometry();\r\n\r\n\t\tvar vertices = this.vertices;\r\n\r\n\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\r\n\r\n\t\t\tgeometry.vertices.push( vertices[ i ].clone() );\r\n\r\n\t\t}\r\n\r\n\t\tvar faces = this.faces;\r\n\r\n\t\tfor ( var i = 0, il = faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tgeometry.faces.push( faces[ i ].clone() );\r\n\r\n\t\t}\r\n\r\n\t\tvar uvs = this.faceVertexUvs[ 0 ];\r\n\r\n\t\tfor ( var i = 0, il = uvs.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar uv = uvs[ i ], uvCopy = [];\r\n\r\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tuvCopy.push( new THREE.Vector2( uv[ j ].x, uv[ j ].y ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.faceVertexUvs[ 0 ].push( uvCopy );\r\n\r\n\t\t}\r\n\r\n\t\treturn geometry;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.GeometryIdCount = 0;\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.BufferGeometry = function () {\r\n\r\n\tthis.id = THREE.GeometryIdCount ++;\r\n\r\n\t// attributes\r\n\r\n\tthis.attributes = {};\r\n\r\n\t// attributes typed arrays are kept only if dynamic flag is set\r\n\r\n\tthis.dynamic = false;\r\n\r\n\t// offsets for chunks when using indexed elements\r\n\r\n\tthis.offsets = [];\r\n\r\n\t// boundings\r\n\r\n\tthis.boundingBox = null;\r\n\tthis.boundingSphere = null;\r\n\r\n\tthis.hasTangents = false;\r\n\r\n\t// for compatibility\r\n\r\n\tthis.morphTargets = [];\r\n\r\n};\r\n\r\nTHREE.BufferGeometry.prototype = {\r\n\r\n\tconstructor: THREE.BufferGeometry,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tapplyMatrix: function ( matrix ) {\r\n\r\n\t\tvar positionArray;\r\n\t\tvar normalArray;\r\n\r\n\t\tif ( this.attributes[ \"position\" ] ) positionArray = this.attributes[ \"position\" ].array;\r\n\t\tif ( this.attributes[ \"normal\" ] ) normalArray = this.attributes[ \"normal\" ].array;\r\n\r\n\t\tif ( positionArray !== undefined ) {\r\n\r\n\t\t\tmatrix.multiplyVector3Array( positionArray );\r\n\t\t\tthis.verticesNeedUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( normalArray !== undefined ) {\r\n\r\n\t\t\tvar normalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\t\tnormalMatrix.multiplyVector3Array( normalArray );\r\n\r\n\t\t\tthis.normalizeNormals();\r\n\r\n\t\t\tthis.normalsNeedUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeBoundingBox: function () {\r\n\r\n\t\tif ( this.boundingBox === null ) {\r\n\r\n\t\t\tthis.boundingBox = new THREE.Box3();\r\n\r\n\t\t}\r\n\r\n\t\tvar positions = this.attributes[ \"position\" ].array;\r\n\r\n\t\tif ( positions ) {\r\n\r\n\t\t\tvar bb = this.boundingBox;\r\n\t\t\tvar x, y, z;\r\n\r\n\t\t\tif( positions.length >= 3 ) {\r\n\t\t\t\tbb.min.x = bb.max.x = positions[ 0 ];\r\n\t\t\t\tbb.min.y = bb.max.y = positions[ 1 ];\r\n\t\t\t\tbb.min.z = bb.max.z = positions[ 2 ];\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var i = 3, il = positions.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\tx = positions[ i ];\r\n\t\t\t\ty = positions[ i + 1 ];\r\n\t\t\t\tz = positions[ i + 2 ];\r\n\r\n\t\t\t\t// bounding box\r\n\r\n\t\t\t\tif ( x < bb.min.x ) {\r\n\r\n\t\t\t\t\tbb.min.x = x;\r\n\r\n\t\t\t\t} else if ( x > bb.max.x ) {\r\n\r\n\t\t\t\t\tbb.max.x = x;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( y < bb.min.y ) {\r\n\r\n\t\t\t\t\tbb.min.y = y;\r\n\r\n\t\t\t\t} else if ( y > bb.max.y ) {\r\n\r\n\t\t\t\t\tbb.max.y = y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( z < bb.min.z ) {\r\n\r\n\t\t\t\t\tbb.min.z = z;\r\n\r\n\t\t\t\t} else if ( z > bb.max.z ) {\r\n\r\n\t\t\t\t\tbb.max.z = z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( positions === undefined || positions.length === 0 ) {\r\n\r\n\t\t\tthis.boundingBox.min.set( 0, 0, 0 );\r\n\t\t\tthis.boundingBox.max.set( 0, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeBoundingSphere: function () {\r\n\r\n\t\tif ( this.boundingSphere === null ) {\r\n\r\n\t\t\tthis.boundingSphere = new THREE.Sphere();\r\n\r\n\t\t}\r\n\r\n\t\tvar positions = this.attributes[ \"position\" ].array;\r\n\r\n\t\tif ( positions ) {\r\n\r\n\t\t\tvar radiusSq, maxRadiusSq = 0;\r\n\t\t\tvar x, y, z;\r\n\r\n\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 3 ) {\r\n\r\n\t\t\t\tx = positions[ i ];\r\n\t\t\t\ty = positions[ i + 1 ];\r\n\t\t\t\tz = positions[ i + 2 ];\r\n\r\n\t\t\t\tradiusSq = x * x + y * y + z * z;\r\n\t\t\t\tif ( radiusSq > maxRadiusSq ) maxRadiusSq = radiusSq;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeVertexNormals: function () {\r\n\r\n\t\tif ( this.attributes[ \"position\" ] ) {\r\n\r\n\t\t\tvar i, il;\r\n\t\t\tvar j, jl;\r\n\r\n\t\t\tvar nVertexElements = this.attributes[ \"position\" ].array.length;\r\n\r\n\t\t\tif ( this.attributes[ \"normal\" ] === undefined ) {\r\n\r\n\t\t\t\tthis.attributes[ \"normal\" ] = {\r\n\r\n\t\t\t\t\titemSize: 3,\r\n\t\t\t\t\tarray: new Float32Array( nVertexElements ),\r\n\t\t\t\t\tnumItems: nVertexElements\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// reset existing normals to zero\r\n\r\n\t\t\t\tfor ( i = 0, il = this.attributes[ \"normal\" ].array.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tthis.attributes[ \"normal\" ].array[ i ] = 0;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar positions = this.attributes[ \"position\" ].array;\r\n\t\t\tvar normals = this.attributes[ \"normal\" ].array;\r\n\r\n\t\t\tvar vA, vB, vC, x, y, z,\r\n\r\n\t\t\tpA = new THREE.Vector3(),\r\n\t\t\tpB = new THREE.Vector3(),\r\n\t\t\tpC = new THREE.Vector3(),\r\n\r\n\t\t\tcb = new THREE.Vector3(),\r\n\t\t\tab = new THREE.Vector3();\r\n\r\n\t\t\t// indexed elements\r\n\r\n\t\t\tif ( this.attributes[ \"index\" ] ) {\r\n\r\n\t\t\t\tvar indices = this.attributes[ \"index\" ].array;\r\n\r\n\t\t\t\tvar offsets = this.offsets;\r\n\r\n\t\t\t\tfor ( j = 0, jl = offsets.length; j < jl; ++ j ) {\r\n\r\n\t\t\t\t\tvar start = offsets[ j ].start;\r\n\t\t\t\t\tvar count = offsets[ j ].count;\r\n\t\t\t\t\tvar index = offsets[ j ].index;\r\n\r\n\t\t\t\t\tfor ( i = start, il = start + count; i < il; i += 3 ) {\r\n\r\n\t\t\t\t\t\tvA = index + indices[ i ];\r\n\t\t\t\t\t\tvB = index + indices[ i + 1 ];\r\n\t\t\t\t\t\tvC = index + indices[ i + 2 ];\r\n\r\n\t\t\t\t\t\tx = positions[ vA * 3 ];\r\n\t\t\t\t\t\ty = positions[ vA * 3 + 1 ];\r\n\t\t\t\t\t\tz = positions[ vA * 3 + 2 ];\r\n\t\t\t\t\t\tpA.set( x, y, z );\r\n\r\n\t\t\t\t\t\tx = positions[ vB * 3 ];\r\n\t\t\t\t\t\ty = positions[ vB * 3 + 1 ];\r\n\t\t\t\t\t\tz = positions[ vB * 3 + 2 ];\r\n\t\t\t\t\t\tpB.set( x, y, z );\r\n\r\n\t\t\t\t\t\tx = positions[ vC * 3 ];\r\n\t\t\t\t\t\ty = positions[ vC * 3 + 1 ];\r\n\t\t\t\t\t\tz = positions[ vC * 3 + 2 ];\r\n\t\t\t\t\t\tpC.set( x, y, z );\r\n\r\n\t\t\t\t\t\tcb.subVectors( pC, pB );\r\n\t\t\t\t\t\tab.subVectors( pA, pB );\r\n\t\t\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\t\t\tnormals[ vA * 3 ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vA * 3 + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vA * 3 + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t\tnormals[ vB * 3 ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vB * 3 + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vB * 3 + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t\tnormals[ vC * 3 ] += cb.x;\r\n\t\t\t\t\t\tnormals[ vC * 3 + 1 ] += cb.y;\r\n\t\t\t\t\t\tnormals[ vC * 3 + 2 ] += cb.z;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t// non-indexed elements (unconnected triangle soup)\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfor ( i = 0, il = positions.length; i < il; i += 9 ) {\r\n\r\n\t\t\t\t\tx = positions[ i ];\r\n\t\t\t\t\ty = positions[ i + 1 ];\r\n\t\t\t\t\tz = positions[ i + 2 ];\r\n\t\t\t\t\tpA.set( x, y, z );\r\n\r\n\t\t\t\t\tx = positions[ i + 3 ];\r\n\t\t\t\t\ty = positions[ i + 4 ];\r\n\t\t\t\t\tz = positions[ i + 5 ];\r\n\t\t\t\t\tpB.set( x, y, z );\r\n\r\n\t\t\t\t\tx = positions[ i + 6 ];\r\n\t\t\t\t\ty = positions[ i + 7 ];\r\n\t\t\t\t\tz = positions[ i + 8 ];\r\n\t\t\t\t\tpC.set( x, y, z );\r\n\r\n\t\t\t\t\tcb.subVectors( pC, pB );\r\n\t\t\t\t\tab.subVectors( pA, pB );\r\n\t\t\t\t\tcb.cross( ab );\r\n\r\n\t\t\t\t\tnormals[ i ] \t = cb.x;\r\n\t\t\t\t\tnormals[ i + 1 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 2 ] = cb.z;\r\n\r\n\t\t\t\t\tnormals[ i + 3 ] = cb.x;\r\n\t\t\t\t\tnormals[ i + 4 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 5 ] = cb.z;\r\n\r\n\t\t\t\t\tnormals[ i + 6 ] = cb.x;\r\n\t\t\t\t\tnormals[ i + 7 ] = cb.y;\r\n\t\t\t\t\tnormals[ i + 8 ] = cb.z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.normalizeNormals();\r\n\r\n\t\t\tthis.normalsNeedUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tnormalizeNormals: function () {\r\n\r\n\t\tvar normals = this.attributes[ \"normal\" ].array;\r\n\r\n\t\tvar x, y, z, n;\r\n\r\n\t\tfor ( var i = 0, il = normals.length; i < il; i += 3 ) {\r\n\r\n\t\t\tx = normals[ i ];\r\n\t\t\ty = normals[ i + 1 ];\r\n\t\t\tz = normals[ i + 2 ];\r\n\r\n\t\t\tn = 1.0 / Math.sqrt( x * x + y * y + z * z );\r\n\r\n\t\t\tnormals[ i ] \t *= n;\r\n\t\t\tnormals[ i + 1 ] *= n;\r\n\t\t\tnormals[ i + 2 ] *= n;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tcomputeTangents: function () {\r\n\r\n\t\t// based on http://www.terathon.com/code/tangent.html\r\n\t\t// (per vertex tangents)\r\n\r\n\t\tif ( this.attributes[ \"index\" ] === undefined ||\r\n\t\t\t this.attributes[ \"position\" ] === undefined ||\r\n\t\t\t this.attributes[ \"normal\" ] === undefined ||\r\n\t\t\t this.attributes[ \"uv\" ] === undefined ) {\r\n\r\n\t\t\tconsole.warn( \"Missing required attributes (index, position, normal or uv) in BufferGeometry.computeTangents()\" );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar indices = this.attributes[ \"index\" ].array;\r\n\t\tvar positions = this.attributes[ \"position\" ].array;\r\n\t\tvar normals = this.attributes[ \"normal\" ].array;\r\n\t\tvar uvs = this.attributes[ \"uv\" ].array;\r\n\r\n\t\tvar nVertices = positions.length / 3;\r\n\r\n\t\tif ( this.attributes[ \"tangent\" ] === undefined ) {\r\n\r\n\t\t\tvar nTangentElements = 4 * nVertices;\r\n\r\n\t\t\tthis.attributes[ \"tangent\" ] = {\r\n\r\n\t\t\t\titemSize: 4,\r\n\t\t\t\tarray: new Float32Array( nTangentElements ),\r\n\t\t\t\tnumItems: nTangentElements\r\n\r\n\t\t\t};\r\n\r\n\t\t}\r\n\r\n\t\tvar tangents = this.attributes[ \"tangent\" ].array;\r\n\r\n\t\tvar tan1 = [], tan2 = [];\r\n\r\n\t\tfor ( var k = 0; k < nVertices; k ++ ) {\r\n\r\n\t\t\ttan1[ k ] = new THREE.Vector3();\r\n\t\t\ttan2[ k ] = new THREE.Vector3();\r\n\r\n\t\t}\r\n\r\n\t\tvar xA, yA, zA,\r\n\t\t\txB, yB, zB,\r\n\t\t\txC, yC, zC,\r\n\r\n\t\t\tuA, vA,\r\n\t\t\tuB, vB,\r\n\t\t\tuC, vC,\r\n\r\n\t\t\tx1, x2, y1, y2, z1, z2,\r\n\t\t\ts1, s2, t1, t2, r;\r\n\r\n\t\tvar sdir = new THREE.Vector3(), tdir = new THREE.Vector3();\r\n\r\n\t\tfunction handleTriangle( a, b, c ) {\r\n\r\n\t\t\txA = positions[ a * 3 ];\r\n\t\t\tyA = positions[ a * 3 + 1 ];\r\n\t\t\tzA = positions[ a * 3 + 2 ];\r\n\r\n\t\t\txB = positions[ b * 3 ];\r\n\t\t\tyB = positions[ b * 3 + 1 ];\r\n\t\t\tzB = positions[ b * 3 + 2 ];\r\n\r\n\t\t\txC = positions[ c * 3 ];\r\n\t\t\tyC = positions[ c * 3 + 1 ];\r\n\t\t\tzC = positions[ c * 3 + 2 ];\r\n\r\n\t\t\tuA = uvs[ a * 2 ];\r\n\t\t\tvA = uvs[ a * 2 + 1 ];\r\n\r\n\t\t\tuB = uvs[ b * 2 ];\r\n\t\t\tvB = uvs[ b * 2 + 1 ];\r\n\r\n\t\t\tuC = uvs[ c * 2 ];\r\n\t\t\tvC = uvs[ c * 2 + 1 ];\r\n\r\n\t\t\tx1 = xB - xA;\r\n\t\t\tx2 = xC - xA;\r\n\r\n\t\t\ty1 = yB - yA;\r\n\t\t\ty2 = yC - yA;\r\n\r\n\t\t\tz1 = zB - zA;\r\n\t\t\tz2 = zC - zA;\r\n\r\n\t\t\ts1 = uB - uA;\r\n\t\t\ts2 = uC - uA;\r\n\r\n\t\t\tt1 = vB - vA;\r\n\t\t\tt2 = vC - vA;\r\n\r\n\t\t\tr = 1.0 / ( s1 * t2 - s2 * t1 );\r\n\r\n\t\t\tsdir.set(\r\n\t\t\t\t( t2 * x1 - t1 * x2 ) * r,\r\n\t\t\t\t( t2 * y1 - t1 * y2 ) * r,\r\n\t\t\t\t( t2 * z1 - t1 * z2 ) * r\r\n\t\t\t);\r\n\r\n\t\t\ttdir.set(\r\n\t\t\t\t( s1 * x2 - s2 * x1 ) * r,\r\n\t\t\t\t( s1 * y2 - s2 * y1 ) * r,\r\n\t\t\t\t( s1 * z2 - s2 * z1 ) * r\r\n\t\t\t);\r\n\r\n\t\t\ttan1[ a ].add( sdir );\r\n\t\t\ttan1[ b ].add( sdir );\r\n\t\t\ttan1[ c ].add( sdir );\r\n\r\n\t\t\ttan2[ a ].add( tdir );\r\n\t\t\ttan2[ b ].add( tdir );\r\n\t\t\ttan2[ c ].add( tdir );\r\n\r\n\t\t}\r\n\r\n\t\tvar i, il;\r\n\t\tvar j, jl;\r\n\t\tvar iA, iB, iC;\r\n\r\n\t\tvar offsets = this.offsets;\r\n\r\n\t\tfor ( j = 0, jl = offsets.length; j < jl; ++ j ) {\r\n\r\n\t\t\tvar start = offsets[ j ].start;\r\n\t\t\tvar count = offsets[ j ].count;\r\n\t\t\tvar index = offsets[ j ].index;\r\n\r\n\t\t\tfor ( i = start, il = start + count; i < il; i += 3 ) {\r\n\r\n\t\t\t\tiA = index + indices[ i ];\r\n\t\t\t\tiB = index + indices[ i + 1 ];\r\n\t\t\t\tiC = index + indices[ i + 2 ];\r\n\r\n\t\t\t\thandleTriangle( iA, iB, iC );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar tmp = new THREE.Vector3(), tmp2 = new THREE.Vector3();\r\n\t\tvar n = new THREE.Vector3(), n2 = new THREE.Vector3();\r\n\t\tvar w, t, test;\r\n\r\n\t\tfunction handleVertex( v ) {\r\n\r\n\t\t\tn.x = normals[ v * 3 ];\r\n\t\t\tn.y = normals[ v * 3 + 1 ];\r\n\t\t\tn.z = normals[ v * 3 + 2 ];\r\n\r\n\t\t\tn2.copy( n );\r\n\r\n\t\t\tt = tan1[ v ];\r\n\r\n\t\t\t// Gram-Schmidt orthogonalize\r\n\r\n\t\t\ttmp.copy( t );\r\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\r\n\r\n\t\t\t// Calculate handedness\r\n\r\n\t\t\ttmp2.crossVectors( n2, t );\r\n\t\t\ttest = tmp2.dot( tan2[ v ] );\r\n\t\t\tw = ( test < 0.0 ) ? -1.0 : 1.0;\r\n\r\n\t\t\ttangents[ v * 4 ] = tmp.x;\r\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\r\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\r\n\t\t\ttangents[ v * 4 + 3 ] = w;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( j = 0, jl = offsets.length; j < jl; ++ j ) {\r\n\r\n\t\t\tvar start = offsets[ j ].start;\r\n\t\t\tvar count = offsets[ j ].count;\r\n\t\t\tvar index = offsets[ j ].index;\r\n\r\n\t\t\tfor ( i = start, il = start + count; i < il; i += 3 ) {\r\n\r\n\t\t\t\tiA = index + indices[ i ];\r\n\t\t\t\tiB = index + indices[ i + 1 ];\r\n\t\t\t\tiC = index + indices[ i + 2 ];\r\n\r\n\t\t\t\thandleVertex( iA );\r\n\t\t\t\thandleVertex( iB );\r\n\t\t\t\thandleVertex( iC );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.hasTangents = true;\r\n\t\tthis.tangentsNeedUpdate = true;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.Camera = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.matrixWorldInverse = new THREE.Matrix4();\r\n\r\n\tthis.projectionMatrix = new THREE.Matrix4();\r\n\tthis.projectionMatrixInverse = new THREE.Matrix4();\r\n\r\n};\r\n\r\nTHREE.Camera.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Camera.prototype.lookAt = function () {\r\n\r\n\t// This routine does not support cameras with rotated and/or translated parent(s)\r\n\r\n\tvar m1 = new THREE.Matrix4();\r\n\r\n\treturn function ( vector ) {\r\n\r\n\t\tm1.lookAt( this.position, vector, this.up );\r\n\r\n\t\tif ( this.useQuaternion === true ) {\r\n\r\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.rotation.setEulerFromRotationMatrix( m1, this.eulerOrder );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}();\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.OrthographicCamera = function ( left, right, top, bottom, near, far ) {\r\n\r\n\tTHREE.Camera.call( this );\r\n\r\n\tthis.left = left;\r\n\tthis.right = right;\r\n\tthis.top = top;\r\n\tthis.bottom = bottom;\r\n\r\n\tthis.near = ( near !== undefined ) ? near : 0.1;\r\n\tthis.far = ( far !== undefined ) ? far : 2000;\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\nTHREE.OrthographicCamera.prototype = Object.create( THREE.Camera.prototype );\r\n\r\nTHREE.OrthographicCamera.prototype.updateProjectionMatrix = function () {\r\n\r\n\tthis.projectionMatrix.makeOrthographic( this.left, this.right, this.top, this.bottom, this.near, this.far );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author greggman / http://games.greggman.com/\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n */\r\n\r\nTHREE.PerspectiveCamera = function ( fov, aspect, near, far ) {\r\n\r\n\tTHREE.Camera.call( this );\r\n\r\n\tthis.fov = fov !== undefined ? fov : 50;\r\n\tthis.aspect = aspect !== undefined ? aspect : 1;\r\n\tthis.near = near !== undefined ? near : 0.1;\r\n\tthis.far = far !== undefined ? far : 2000;\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\nTHREE.PerspectiveCamera.prototype = Object.create( THREE.Camera.prototype );\r\n\r\n\r\n/**\r\n * Uses Focal Length (in mm) to estimate and set FOV\r\n * 35mm (fullframe) camera is used if frame size is not specified;\r\n * Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html\r\n */\r\n\r\nTHREE.PerspectiveCamera.prototype.setLens = function ( focalLength, frameHeight ) {\r\n\r\n\tif ( frameHeight === undefined ) frameHeight = 24;\r\n\r\n\tthis.fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) );\r\n\tthis.updateProjectionMatrix();\r\n\r\n}\r\n\r\n\r\n/**\r\n * Sets an offset in a larger frustum. This is useful for multi-window or\r\n * multi-monitor/multi-machine setups.\r\n *\r\n * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\r\n * the monitors are in grid like this\r\n *\r\n * +---+---+---+\r\n * | A | B | C |\r\n * +---+---+---+\r\n * | D | E | F |\r\n * +---+---+---+\r\n *\r\n * then for each monitor you would call it like this\r\n *\r\n * var w = 1920;\r\n * var h = 1080;\r\n * var fullWidth = w * 3;\r\n * var fullHeight = h * 2;\r\n *\r\n * --A--\r\n * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\r\n * --B--\r\n * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\r\n * --C--\r\n * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\r\n * --D--\r\n * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\r\n * --E--\r\n * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\r\n * --F--\r\n * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\r\n *\r\n * Note there is no reason monitors have to be the same size or in a grid.\r\n */\r\n\r\nTHREE.PerspectiveCamera.prototype.setViewOffset = function ( fullWidth, fullHeight, x, y, width, height ) {\r\n\r\n\tthis.fullWidth = fullWidth;\r\n\tthis.fullHeight = fullHeight;\r\n\tthis.x = x;\r\n\tthis.y = y;\r\n\tthis.width = width;\r\n\tthis.height = height;\r\n\r\n\tthis.updateProjectionMatrix();\r\n\r\n};\r\n\r\n\r\nTHREE.PerspectiveCamera.prototype.updateProjectionMatrix = function () {\r\n\r\n\tif ( this.fullWidth ) {\r\n\r\n\t\tvar aspect = this.fullWidth / this.fullHeight;\r\n\t\tvar top = Math.tan( THREE.Math.degToRad( this.fov * 0.5 ) ) * this.near;\r\n\t\tvar bottom = -top;\r\n\t\tvar left = aspect * bottom;\r\n\t\tvar right = aspect * top;\r\n\t\tvar width = Math.abs( right - left );\r\n\t\tvar height = Math.abs( top - bottom );\r\n\r\n\t\tthis.projectionMatrix.makeFrustum(\r\n\t\t\tleft + this.x * width / this.fullWidth,\r\n\t\t\tleft + ( this.x + this.width ) * width / this.fullWidth,\r\n\t\t\ttop - ( this.y + this.height ) * height / this.fullHeight,\r\n\t\t\ttop - this.y * height / this.fullHeight,\r\n\t\t\tthis.near,\r\n\t\t\tthis.far\r\n\t\t);\r\n\r\n\t} else {\r\n\r\n\t\tthis.projectionMatrix.makePerspective( this.fov, this.aspect, this.near, this.far );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n \r\nTHREE.Light = function ( hex ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.color = new THREE.Color( hex );\r\n\r\n};\r\n\r\nTHREE.Light.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Light.prototype.clone = function ( light ) {\r\n\r\n\tif ( light === undefined ) light = new THREE.Light();\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, light );\r\n\r\n\tlight.color.copy( this.color );\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AmbientLight = function ( hex ) {\r\n\r\n\tTHREE.Light.call( this, hex );\r\n\r\n};\r\n\r\nTHREE.AmbientLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\nTHREE.AmbientLight.prototype.clone = function () {\r\n\r\n\tvar light = new THREE.AmbientLight();\r\n\r\n\tTHREE.Light.prototype.clone.call( this, light );\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author MPanknin / http://www.redplant.de/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.AreaLight = function ( hex, intensity ) {\r\n\r\n\tTHREE.Light.call( this, hex );\r\n\r\n\tthis.normal = new THREE.Vector3( 0, -1, 0 );\r\n\tthis.right = new THREE.Vector3( 1, 0, 0 );\r\n\r\n\tthis.intensity = ( intensity !== undefined ) ? intensity : 1;\r\n\r\n\tthis.width = 1.0;\r\n\tthis.height = 1.0;\r\n\r\n\tthis.constantAttenuation = 1.5;\r\n\tthis.linearAttenuation = 0.5;\r\n\tthis.quadraticAttenuation = 0.1;\r\n\r\n};\r\n\r\nTHREE.AreaLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.DirectionalLight = function ( hex, intensity ) {\r\n\r\n\tTHREE.Light.call( this, hex );\r\n\r\n\tthis.position.set( 0, 1, 0 );\r\n\tthis.target = new THREE.Object3D();\r\n\r\n\tthis.intensity = ( intensity !== undefined ) ? intensity : 1;\r\n\r\n\tthis.castShadow = false;\r\n\tthis.onlyShadow = false;\r\n\r\n\t//\r\n\r\n\tthis.shadowCameraNear = 50;\r\n\tthis.shadowCameraFar = 5000;\r\n\r\n\tthis.shadowCameraLeft = -500;\r\n\tthis.shadowCameraRight = 500;\r\n\tthis.shadowCameraTop = 500;\r\n\tthis.shadowCameraBottom = -500;\r\n\r\n\tthis.shadowCameraVisible = false;\r\n\r\n\tthis.shadowBias = 0;\r\n\tthis.shadowDarkness = 0.5;\r\n\r\n\tthis.shadowMapWidth = 512;\r\n\tthis.shadowMapHeight = 512;\r\n\r\n\t//\r\n\r\n\tthis.shadowCascade = false;\r\n\r\n\tthis.shadowCascadeOffset = new THREE.Vector3( 0, 0, -1000 );\r\n\tthis.shadowCascadeCount = 2;\r\n\r\n\tthis.shadowCascadeBias = [ 0, 0, 0 ];\r\n\tthis.shadowCascadeWidth = [ 512, 512, 512 ];\r\n\tthis.shadowCascadeHeight = [ 512, 512, 512 ];\r\n\r\n\tthis.shadowCascadeNearZ = [ -1.000, 0.990, 0.998 ];\r\n\tthis.shadowCascadeFarZ = [ 0.990, 0.998, 1.000 ];\r\n\r\n\tthis.shadowCascadeArray = [];\r\n\r\n\t//\r\n\r\n\tthis.shadowMap = null;\r\n\tthis.shadowMapSize = null;\r\n\tthis.shadowCamera = null;\r\n\tthis.shadowMatrix = null;\r\n\r\n};\r\n\r\nTHREE.DirectionalLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\nTHREE.DirectionalLight.prototype.clone = function () {\r\n\r\n\tvar light = new THREE.DirectionalLight();\r\n\r\n\tTHREE.Light.prototype.clone.call( this, light );\r\n\r\n\tlight.target = this.target.clone();\r\n\r\n\tlight.intensity = this.intensity;\r\n\r\n\tlight.castShadow = this.castShadow;\r\n\tlight.onlyShadow = this.onlyShadow;\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.HemisphereLight = function ( skyColorHex, groundColorHex, intensity ) {\r\n\r\n\tTHREE.Light.call( this, skyColorHex );\r\n\r\n\tthis.position.set( 0, 100, 0 );\r\n\r\n\tthis.groundColor = new THREE.Color( groundColorHex );\r\n\tthis.intensity = ( intensity !== undefined ) ? intensity : 1;\r\n\r\n};\r\n\r\nTHREE.HemisphereLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\nTHREE.HemisphereLight.prototype.clone = function () {\r\n\r\n\tvar light = new THREE.PointLight();\r\n\r\n\tTHREE.Light.prototype.clone.call( this, light );\r\n\r\n\tlight.groundColor.copy( this.groundColor );\r\n\tlight.intensity = this.intensity;\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.PointLight = function ( hex, intensity, distance ) {\r\n\r\n\tTHREE.Light.call( this, hex );\r\n\r\n\tthis.intensity = ( intensity !== undefined ) ? intensity : 1;\r\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\r\n\r\n};\r\n\r\nTHREE.PointLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\nTHREE.PointLight.prototype.clone = function () {\r\n\r\n\tvar light = new THREE.PointLight();\r\n\r\n\tTHREE.Light.prototype.clone.call( this, light );\r\n\r\n\tlight.intensity = this.intensity;\r\n\tlight.distance = this.distance;\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SpotLight = function ( hex, intensity, distance, angle, exponent ) {\r\n\r\n\tTHREE.Light.call( this, hex );\r\n\r\n\tthis.position.set( 0, 1, 0 );\r\n\tthis.target = new THREE.Object3D();\r\n\r\n\tthis.intensity = ( intensity !== undefined ) ? intensity : 1;\r\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\r\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\r\n\tthis.exponent = ( exponent !== undefined ) ? exponent : 10;\r\n\r\n\tthis.castShadow = false;\r\n\tthis.onlyShadow = false;\r\n\r\n\t//\r\n\r\n\tthis.shadowCameraNear = 50;\r\n\tthis.shadowCameraFar = 5000;\r\n\tthis.shadowCameraFov = 50;\r\n\r\n\tthis.shadowCameraVisible = false;\r\n\r\n\tthis.shadowBias = 0;\r\n\tthis.shadowDarkness = 0.5;\r\n\r\n\tthis.shadowMapWidth = 512;\r\n\tthis.shadowMapHeight = 512;\r\n\r\n\t//\r\n\r\n\tthis.shadowMap = null;\r\n\tthis.shadowMapSize = null;\r\n\tthis.shadowCamera = null;\r\n\tthis.shadowMatrix = null;\r\n\r\n};\r\n\r\nTHREE.SpotLight.prototype = Object.create( THREE.Light.prototype );\r\n\r\nTHREE.SpotLight.prototype.clone = function () {\r\n\r\n\tvar light = new THREE.SpotLight();\r\n\r\n\tTHREE.Light.prototype.clone.call( this, light );\r\n\r\n\tlight.target = this.target.clone();\r\n\r\n\tlight.intensity = this.intensity;\r\n\tlight.distance = this.distance;\r\n\tlight.angle = this.angle;\r\n\tlight.exponent = this.exponent;\r\n\r\n\tlight.castShadow = this.castShadow;\r\n\tlight.onlyShadow = this.onlyShadow;\r\n\r\n\treturn light;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Loader = function ( showStatus ) {\r\n\r\n\tthis.showStatus = showStatus;\r\n\tthis.statusDomElement = showStatus ? THREE.Loader.prototype.addStatusElement() : null;\r\n\r\n\tthis.onLoadStart = function () {};\r\n\tthis.onLoadProgress = function () {};\r\n\tthis.onLoadComplete = function () {};\r\n\r\n};\r\n\r\nTHREE.Loader.prototype = {\r\n\r\n\tconstructor: THREE.Loader,\r\n\r\n\tcrossOrigin: 'anonymous',\r\n\r\n\taddStatusElement: function () {\r\n\r\n\t\tvar e = document.createElement( \"div\" );\r\n\r\n\t\te.style.position = \"absolute\";\r\n\t\te.style.right = \"0px\";\r\n\t\te.style.top = \"0px\";\r\n\t\te.style.fontSize = \"0.8em\";\r\n\t\te.style.textAlign = \"left\";\r\n\t\te.style.background = \"rgba(0,0,0,0.25)\";\r\n\t\te.style.color = \"#fff\";\r\n\t\te.style.width = \"120px\";\r\n\t\te.style.padding = \"0.5em 0.5em 0.5em 0.5em\";\r\n\t\te.style.zIndex = 1000;\r\n\r\n\t\te.innerHTML = \"Loading ...\";\r\n\r\n\t\treturn e;\r\n\r\n\t},\r\n\r\n\tupdateProgress: function ( progress ) {\r\n\r\n\t\tvar message = \"Loaded \";\r\n\r\n\t\tif ( progress.total ) {\r\n\r\n\t\t\tmessage += ( 100 * progress.loaded / progress.total ).toFixed(0) + \"%\";\r\n\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmessage += ( progress.loaded / 1000 ).toFixed(2) + \" KB\";\r\n\r\n\t\t}\r\n\r\n\t\tthis.statusDomElement.innerHTML = message;\r\n\r\n\t},\r\n\r\n\textractUrlBase: function ( url ) {\r\n\r\n\t\tvar parts = url.split( '/' );\r\n\t\tparts.pop();\r\n\t\treturn ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';\r\n\r\n\t},\r\n\r\n\tinitMaterials: function ( materials, texturePath ) {\r\n\r\n\t\tvar array = [];\r\n\r\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\r\n\r\n\t\t\tarray[ i ] = THREE.Loader.prototype.createMaterial( materials[ i ], texturePath );\r\n\r\n\t\t}\r\n\r\n\t\treturn array;\r\n\r\n\t},\r\n\r\n\tneedsTangents: function ( materials ) {\r\n\r\n\t\tfor( var i = 0, il = materials.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar m = materials[ i ];\r\n\r\n\t\t\tif ( m instanceof THREE.ShaderMaterial ) return true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tcreateMaterial: function ( m, texturePath ) {\r\n\r\n\t\tvar _this = this;\r\n\r\n\t\tfunction is_pow2( n ) {\r\n\r\n\t\t\tvar l = Math.log( n ) / Math.LN2;\r\n\t\t\treturn Math.floor( l ) == l;\r\n\r\n\t\t}\r\n\r\n\t\tfunction nearest_pow2( n ) {\r\n\r\n\t\t\tvar l = Math.log( n ) / Math.LN2;\r\n\t\t\treturn Math.pow( 2, Math.round( l ) );\r\n\r\n\t\t}\r\n\r\n\t\tfunction load_image( where, url ) {\r\n\r\n\t\t\tvar image = new Image();\r\n\r\n\t\t\timage.onload = function () {\r\n\r\n\t\t\t\tif ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {\r\n\r\n\t\t\t\t\tvar width = nearest_pow2( this.width );\r\n\t\t\t\t\tvar height = nearest_pow2( this.height );\r\n\r\n\t\t\t\t\twhere.image.width = width;\r\n\t\t\t\t\twhere.image.height = height;\r\n\t\t\t\t\twhere.image.getContext( '2d' ).drawImage( this, 0, 0, width, height );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\twhere.image = this;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\twhere.needsUpdate = true;\r\n\r\n\t\t\t};\r\n\r\n\t\t\timage.crossOrigin = _this.crossOrigin;\r\n\t\t\timage.src = url;\r\n\r\n\t\t}\r\n\r\n\t\tfunction create_texture( where, name, sourceFile, repeat, offset, wrap, anisotropy ) {\r\n\r\n\t\t\tvar isCompressed = /\\.dds$/i.test( sourceFile );\r\n\t\t\tvar fullPath = texturePath + \"/\" + sourceFile;\r\n\r\n\t\t\tif ( isCompressed ) {\r\n\r\n\t\t\t\tvar texture = THREE.ImageUtils.loadCompressedTexture( fullPath );\r\n\r\n\t\t\t\twhere[ name ] = texture;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar texture = document.createElement( 'canvas' );\r\n\r\n\t\t\t\twhere[ name ] = new THREE.Texture( texture );\r\n\r\n\t\t\t}\r\n\r\n\t\t\twhere[ name ].sourceFile = sourceFile;\r\n\r\n\t\t\tif( repeat ) {\r\n\r\n\t\t\t\twhere[ name ].repeat.set( repeat[ 0 ], repeat[ 1 ] );\r\n\r\n\t\t\t\tif ( repeat[ 0 ] !== 1 ) where[ name ].wrapS = THREE.RepeatWrapping;\r\n\t\t\t\tif ( repeat[ 1 ] !== 1 ) where[ name ].wrapT = THREE.RepeatWrapping;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( offset ) {\r\n\r\n\t\t\t\twhere[ name ].offset.set( offset[ 0 ], offset[ 1 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( wrap ) {\r\n\r\n\t\t\t\tvar wrapMap = {\r\n\t\t\t\t\t\"repeat\": THREE.RepeatWrapping,\r\n\t\t\t\t\t\"mirror\": THREE.MirroredRepeatWrapping\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( wrapMap[ wrap[ 0 ] ] !== undefined ) where[ name ].wrapS = wrapMap[ wrap[ 0 ] ];\r\n\t\t\t\tif ( wrapMap[ wrap[ 1 ] ] !== undefined ) where[ name ].wrapT = wrapMap[ wrap[ 1 ] ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( anisotropy ) {\r\n\r\n\t\t\t\twhere[ name ].anisotropy = anisotropy;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( ! isCompressed ) {\r\n\r\n\t\t\t\tload_image( where[ name ], fullPath );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfunction rgb2hex( rgb ) {\r\n\r\n\t\t\treturn ( rgb[ 0 ] * 255 << 16 ) + ( rgb[ 1 ] * 255 << 8 ) + rgb[ 2 ] * 255;\r\n\r\n\t\t}\r\n\r\n\t\t// defaults\r\n\r\n\t\tvar mtype = \"MeshLambertMaterial\";\r\n\t\tvar mpars = { color: 0xeeeeee, opacity: 1.0, map: null, lightMap: null, normalMap: null, bumpMap: null, wireframe: false };\r\n\r\n\t\t// parameters from model file\r\n\r\n\t\tif ( m.shading ) {\r\n\r\n\t\t\tvar shading = m.shading.toLowerCase();\r\n\r\n\t\t\tif ( shading === \"phong\" ) mtype = \"MeshPhongMaterial\";\r\n\t\t\telse if ( shading === \"basic\" ) mtype = \"MeshBasicMaterial\";\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.blending !== undefined && THREE[ m.blending ] !== undefined ) {\r\n\r\n\t\t\tmpars.blending = THREE[ m.blending ];\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.transparent !== undefined || m.opacity < 1.0 ) {\r\n\r\n\t\t\tmpars.transparent = m.transparent;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.depthTest !== undefined ) {\r\n\r\n\t\t\tmpars.depthTest = m.depthTest;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.depthWrite !== undefined ) {\r\n\r\n\t\t\tmpars.depthWrite = m.depthWrite;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.visible !== undefined ) {\r\n\r\n\t\t\tmpars.visible = m.visible;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.flipSided !== undefined ) {\r\n\r\n\t\t\tmpars.side = THREE.BackSide;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.doubleSided !== undefined ) {\r\n\r\n\t\t\tmpars.side = THREE.DoubleSide;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.wireframe !== undefined ) {\r\n\r\n\t\t\tmpars.wireframe = m.wireframe;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.vertexColors !== undefined ) {\r\n\r\n\t\t\tif ( m.vertexColors === \"face\" ) {\r\n\r\n\t\t\t\tmpars.vertexColors = THREE.FaceColors;\r\n\r\n\t\t\t} else if ( m.vertexColors ) {\r\n\r\n\t\t\t\tmpars.vertexColors = THREE.VertexColors;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// colors\r\n\r\n\t\tif ( m.colorDiffuse ) {\r\n\r\n\t\t\tmpars.color = rgb2hex( m.colorDiffuse );\r\n\r\n\t\t} else if ( m.DbgColor ) {\r\n\r\n\t\t\tmpars.color = m.DbgColor;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.colorSpecular ) {\r\n\r\n\t\t\tmpars.specular = rgb2hex( m.colorSpecular );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.colorAmbient ) {\r\n\r\n\t\t\tmpars.ambient = rgb2hex( m.colorAmbient );\r\n\r\n\t\t}\r\n\r\n\t\t// modifiers\r\n\r\n\t\tif ( m.transparency ) {\r\n\r\n\t\t\tmpars.opacity = m.transparency;\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.specularCoef ) {\r\n\r\n\t\t\tmpars.shininess = m.specularCoef;\r\n\r\n\t\t}\r\n\r\n\t\t// textures\r\n\r\n\t\tif ( m.mapDiffuse && texturePath ) {\r\n\r\n\t\t\tcreate_texture( mpars, \"map\", m.mapDiffuse, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.mapLight && texturePath ) {\r\n\r\n\t\t\tcreate_texture( mpars, \"lightMap\", m.mapLight, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.mapBump && texturePath ) {\r\n\r\n\t\t\tcreate_texture( mpars, \"bumpMap\", m.mapBump, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.mapNormal && texturePath ) {\r\n\r\n\t\t\tcreate_texture( mpars, \"normalMap\", m.mapNormal, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.mapSpecular && texturePath ) {\r\n\r\n\t\t\tcreate_texture( mpars, \"specularMap\", m.mapSpecular, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tif ( m.mapBumpScale ) {\r\n\r\n\t\t\tmpars.bumpScale = m.mapBumpScale;\r\n\r\n\t\t}\r\n\r\n\t\t// special case for normal mapped material\r\n\r\n\t\tif ( m.mapNormal ) {\r\n\r\n\t\t\tvar shader = THREE.ShaderLib[ \"normalmap\" ];\r\n\t\t\tvar uniforms = THREE.UniformsUtils.clone( shader.uniforms );\r\n\r\n\t\t\tuniforms[ \"tNormal\" ].value = mpars.normalMap;\r\n\r\n\t\t\tif ( m.mapNormalFactor ) {\r\n\r\n\t\t\t\tuniforms[ \"uNormalScale\" ].value.set( m.mapNormalFactor, m.mapNormalFactor );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( mpars.map ) {\r\n\r\n\t\t\t\tuniforms[ \"tDiffuse\" ].value = mpars.map;\r\n\t\t\t\tuniforms[ \"enableDiffuse\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( mpars.specularMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tSpecular\" ].value = mpars.specularMap;\r\n\t\t\t\tuniforms[ \"enableSpecular\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( mpars.lightMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tAO\" ].value = mpars.lightMap;\r\n\t\t\t\tuniforms[ \"enableAO\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// for the moment don't handle displacement texture\r\n\r\n\t\t\tuniforms[ \"uDiffuseColor\" ].value.setHex( mpars.color );\r\n\t\t\tuniforms[ \"uSpecularColor\" ].value.setHex( mpars.specular );\r\n\t\t\tuniforms[ \"uAmbientColor\" ].value.setHex( mpars.ambient );\r\n\r\n\t\t\tuniforms[ \"uShininess\" ].value = mpars.shininess;\r\n\r\n\t\t\tif ( mpars.opacity !== undefined ) {\r\n\r\n\t\t\t\tuniforms[ \"uOpacity\" ].value = mpars.opacity;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };\r\n\t\t\tvar material = new THREE.ShaderMaterial( parameters );\r\n\r\n\t\t\tif ( mpars.transparent ) {\r\n\r\n\t\t\t\tmaterial.transparent = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar material = new THREE[ mtype ]( mpars );\r\n\r\n\t\t}\r\n\r\n\t\tif ( m.DbgName !== undefined ) material.name = m.DbgName;\r\n\r\n\t\treturn material;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.ImageLoader = function () {\r\n\r\n\tthis.crossOrigin = null;\r\n\r\n};\r\n\r\nTHREE.ImageLoader.prototype = {\r\n\r\n\tconstructor: THREE.ImageLoader,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tload: function ( url, image ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tif ( image === undefined ) image = new Image();\r\n\r\n\t\timage.addEventListener( 'load', function () {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'load', content: image } );\r\n\r\n\t\t}, false );\r\n\r\n\t\timage.addEventListener( 'error', function () {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;\r\n\r\n\t\timage.src = url;\r\n\r\n\t}\r\n\r\n}\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.JSONLoader = function ( showStatus ) {\r\n\r\n\tTHREE.Loader.call( this, showStatus );\r\n\r\n\tthis.withCredentials = false;\r\n\r\n};\r\n\r\nTHREE.JSONLoader.prototype = Object.create( THREE.Loader.prototype );\r\n\r\nTHREE.JSONLoader.prototype.load = function ( url, callback, texturePath ) {\r\n\r\n\tvar scope = this;\r\n\r\n\t// todo: unify load API to for easier SceneLoader use\r\n\r\n\ttexturePath = texturePath && ( typeof texturePath === \"string\" ) ? texturePath : this.extractUrlBase( url );\r\n\r\n\tthis.onLoadStart();\r\n\tthis.loadAjaxJSON( this, url, callback, texturePath );\r\n\r\n};\r\n\r\nTHREE.JSONLoader.prototype.loadAjaxJSON = function ( context, url, callback, texturePath, callbackProgress ) {\r\n\r\n\tvar xhr = new XMLHttpRequest();\r\n\r\n\tvar length = 0;\r\n\r\n\txhr.onreadystatechange = function () {\r\n\r\n\t\tif ( xhr.readyState === xhr.DONE ) {\r\n\r\n\t\t\tif ( xhr.status === 200 || xhr.status === 0 ) {\r\n\r\n\t\t\t\tif ( xhr.responseText ) {\r\n\r\n\t\t\t\t\tvar json = JSON.parse( xhr.responseText );\r\n\t\t\t\t\tvar result = context.parse( json, texturePath );\r\n\t\t\t\t\tcallback( result.geometry, result.materials );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tconsole.warn( \"THREE.JSONLoader: [\" + url + \"] seems to be unreachable or file there is empty\" );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// in context of more complex asset initialization\r\n\t\t\t\t// do not block on single failed file\r\n\t\t\t\t// maybe should go even one more level up\r\n\r\n\t\t\t\tcontext.onLoadComplete();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.error( \"THREE.JSONLoader: Couldn't load [\" + url + \"] [\" + xhr.status + \"]\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( xhr.readyState === xhr.LOADING ) {\r\n\r\n\t\t\tif ( callbackProgress ) {\r\n\r\n\t\t\t\tif ( length === 0 ) {\r\n\r\n\t\t\t\t\tlength = xhr.getResponseHeader( \"Content-Length\" );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcallbackProgress( { total: length, loaded: xhr.responseText.length } );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( xhr.readyState === xhr.HEADERS_RECEIVED ) {\r\n\r\n\t\t\tif ( callbackProgress !== undefined ) {\r\n\r\n\t\t\t\tlength = xhr.getResponseHeader( \"Content-Length\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\txhr.open( \"GET\", url, true );\r\n\txhr.withCredentials = this.withCredentials;\r\n\txhr.send( null );\r\n\r\n};\r\n\r\nTHREE.JSONLoader.prototype.parse = function ( json, texturePath ) {\r\n\r\n\tvar scope = this,\r\n\tgeometry = new THREE.Geometry(),\r\n\tscale = ( json.scale !== undefined ) ? 1.0 / json.scale : 1.0;\r\n\r\n\tparseModel( scale );\r\n\r\n\tparseSkin();\r\n\tparseMorphing( scale );\r\n\r\n\tgeometry.computeCentroids();\r\n\tgeometry.computeFaceNormals();\r\n\r\n\tfunction parseModel( scale ) {\r\n\r\n\t\tfunction isBitSet( value, position ) {\r\n\r\n\t\t\treturn value & ( 1 << position );\r\n\r\n\t\t}\r\n\r\n\t\tvar i, j, fi,\r\n\r\n\t\toffset, zLength, nVertices,\r\n\r\n\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\r\n\r\n\t\ttype,\r\n\t\tisQuad,\r\n\t\thasMaterial,\r\n\t\thasFaceUv, hasFaceVertexUv,\r\n\t\thasFaceNormal, hasFaceVertexNormal,\r\n\t\thasFaceColor, hasFaceVertexColor,\r\n\r\n\t\tvertex, face, color, normal,\r\n\r\n\t\tuvLayer, uvs, u, v,\r\n\r\n\t\tfaces = json.faces,\r\n\t\tvertices = json.vertices,\r\n\t\tnormals = json.normals,\r\n\t\tcolors = json.colors,\r\n\r\n\t\tnUvLayers = 0;\r\n\r\n\t\t// disregard empty arrays\r\n\r\n\t\tfor ( i = 0; i < json.uvs.length; i++ ) {\r\n\r\n\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 0; i < nUvLayers; i++ ) {\r\n\r\n\t\t\tgeometry.faceUvs[ i ] = [];\r\n\t\t\tgeometry.faceVertexUvs[ i ] = [];\r\n\r\n\t\t}\r\n\r\n\t\toffset = 0;\r\n\t\tzLength = vertices.length;\r\n\r\n\t\twhile ( offset < zLength ) {\r\n\r\n\t\t\tvertex = new THREE.Vector3();\r\n\r\n\t\t\tvertex.x = vertices[ offset ++ ] * scale;\r\n\t\t\tvertex.y = vertices[ offset ++ ] * scale;\r\n\t\t\tvertex.z = vertices[ offset ++ ] * scale;\r\n\r\n\t\t\tgeometry.vertices.push( vertex );\r\n\r\n\t\t}\r\n\r\n\t\toffset = 0;\r\n\t\tzLength = faces.length;\r\n\r\n\t\twhile ( offset < zLength ) {\r\n\r\n\t\t\ttype = faces[ offset ++ ];\r\n\r\n\r\n\t\t\tisQuad = isBitSet( type, 0 );\r\n\t\t\thasMaterial = isBitSet( type, 1 );\r\n\t\t\thasFaceUv = isBitSet( type, 2 );\r\n\t\t\thasFaceVertexUv = isBitSet( type, 3 );\r\n\t\t\thasFaceNormal = isBitSet( type, 4 );\r\n\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\r\n\t\t\thasFaceColor\t = isBitSet( type, 6 );\r\n\t\t\thasFaceVertexColor = isBitSet( type, 7 );\r\n\r\n\t\t\t//console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceUv, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\r\n\r\n\t\t\tif ( isQuad ) {\r\n\r\n\t\t\t\tface = new THREE.Face4();\r\n\r\n\t\t\t\tface.a = faces[ offset ++ ];\r\n\t\t\t\tface.b = faces[ offset ++ ];\r\n\t\t\t\tface.c = faces[ offset ++ ];\r\n\t\t\t\tface.d = faces[ offset ++ ];\r\n\r\n\t\t\t\tnVertices = 4;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tface = new THREE.Face3();\r\n\r\n\t\t\t\tface.a = faces[ offset ++ ];\r\n\t\t\t\tface.b = faces[ offset ++ ];\r\n\t\t\t\tface.c = faces[ offset ++ ];\r\n\r\n\t\t\t\tnVertices = 3;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasMaterial ) {\r\n\r\n\t\t\t\tmaterialIndex = faces[ offset ++ ];\r\n\t\t\t\tface.materialIndex = materialIndex;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// to get face <=> uv index correspondence\r\n\r\n\t\t\tfi = geometry.faces.length;\r\n\r\n\t\t\tif ( hasFaceUv ) {\r\n\r\n\t\t\t\tfor ( i = 0; i < nUvLayers; i++ ) {\r\n\r\n\t\t\t\t\tuvLayer = json.uvs[ i ];\r\n\r\n\t\t\t\t\tuvIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\r\n\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\r\n\r\n\t\t\t\t\tgeometry.faceUvs[ i ][ fi ] = new THREE.Vector2( u, v );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexUv ) {\r\n\r\n\t\t\t\tfor ( i = 0; i < nUvLayers; i++ ) {\r\n\r\n\t\t\t\t\tuvLayer = json.uvs[ i ];\r\n\r\n\t\t\t\t\tuvs = [];\r\n\r\n\t\t\t\t\tfor ( j = 0; j < nVertices; j ++ ) {\r\n\r\n\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\r\n\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\r\n\r\n\t\t\t\t\t\tuvs[ j ] = new THREE.Vector2( u, v );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = uvs;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceNormal ) {\r\n\r\n\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\tnormal = new THREE.Vector3();\r\n\r\n\t\t\t\tnormal.x = normals[ normalIndex ++ ];\r\n\t\t\t\tnormal.y = normals[ normalIndex ++ ];\r\n\t\t\t\tnormal.z = normals[ normalIndex ];\r\n\r\n\t\t\t\tface.normal = normal;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( hasFaceVertexNormal ) {\r\n\r\n\t\t\t\tfor ( i = 0; i < nVertices; i++ ) {\r\n\r\n\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\r\n\r\n\t\t\t\t\tnormal = new THREE.Vector3();\r\n\r\n\t\t\t\t\tnormal.x = normals[ normalIndex ++ ];\r\n\t\t\t\t\tnormal.y = normals[ normalIndex ++ ];\r\n\t\t\t\t\tnormal.z = normals[ normalIndex ];\r\n\r\n\t\t\t\t\tface.vertexNormals.push( normal );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( hasFaceColor ) {\r\n\r\n\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\tcolor = new THREE.Color( colors[ colorIndex ] );\r\n\t\t\t\tface.color = color;\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tif ( hasFaceVertexColor ) {\r\n\r\n\t\t\t\tfor ( i = 0; i < nVertices; i++ ) {\r\n\r\n\t\t\t\t\tcolorIndex = faces[ offset ++ ];\r\n\r\n\t\t\t\t\tcolor = new THREE.Color( colors[ colorIndex ] );\r\n\t\t\t\t\tface.vertexColors.push( color );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.faces.push( face );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction parseSkin() {\r\n\r\n\t\tvar i, l, x, y, z, w, a, b, c, d;\r\n\r\n\t\tif ( json.skinWeights ) {\r\n\r\n\t\t\tfor ( i = 0, l = json.skinWeights.length; i < l; i += 2 ) {\r\n\r\n\t\t\t\tx = json.skinWeights[ i ];\r\n\t\t\t\ty = json.skinWeights[ i + 1 ];\r\n\t\t\t\tz = 0;\r\n\t\t\t\tw = 0;\r\n\r\n\t\t\t\tgeometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.skinIndices ) {\r\n\r\n\t\t\tfor ( i = 0, l = json.skinIndices.length; i < l; i += 2 ) {\r\n\r\n\t\t\t\ta = json.skinIndices[ i ];\r\n\t\t\t\tb = json.skinIndices[ i + 1 ];\r\n\t\t\t\tc = 0;\r\n\t\t\t\td = 0;\r\n\r\n\t\t\t\tgeometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tgeometry.bones = json.bones;\r\n\t\tgeometry.animation = json.animation;\r\n\r\n\t};\r\n\r\n\tfunction parseMorphing( scale ) {\r\n\r\n\t\tif ( json.morphTargets !== undefined ) {\r\n\r\n\t\t\tvar i, l, v, vl, dstVertices, srcVertices;\r\n\r\n\t\t\tfor ( i = 0, l = json.morphTargets.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tgeometry.morphTargets[ i ] = {};\r\n\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\r\n\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\r\n\r\n\t\t\t\tdstVertices = geometry.morphTargets[ i ].vertices;\r\n\t\t\t\tsrcVertices = json.morphTargets [ i ].vertices;\r\n\r\n\t\t\t\tfor( v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\r\n\r\n\t\t\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\r\n\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\r\n\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\r\n\r\n\t\t\t\t\tdstVertices.push( vertex );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( json.morphColors !== undefined ) {\r\n\r\n\t\t\tvar i, l, c, cl, dstColors, srcColors, color;\r\n\r\n\t\t\tfor ( i = 0, l = json.morphColors.length; i < l; i++ ) {\r\n\r\n\t\t\t\tgeometry.morphColors[ i ] = {};\r\n\t\t\t\tgeometry.morphColors[ i ].name = json.morphColors[ i ].name;\r\n\t\t\t\tgeometry.morphColors[ i ].colors = [];\r\n\r\n\t\t\t\tdstColors = geometry.morphColors[ i ].colors;\r\n\t\t\t\tsrcColors = json.morphColors [ i ].colors;\r\n\r\n\t\t\t\tfor ( c = 0, cl = srcColors.length; c < cl; c += 3 ) {\r\n\r\n\t\t\t\t\tcolor = new THREE.Color( 0xffaa00 );\r\n\t\t\t\t\tcolor.setRGB( srcColors[ c ], srcColors[ c + 1 ], srcColors[ c + 2 ] );\r\n\t\t\t\t\tdstColors.push( color );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tif ( json.materials === undefined ) {\r\n\r\n\t\treturn { geometry: geometry };\r\n\r\n\t} else {\r\n\r\n\t\tvar materials = this.initMaterials( json.materials, texturePath );\r\n\r\n\t\tif ( this.needsTangents( materials ) ) {\r\n\r\n\t\t\tgeometry.computeTangents();\r\n\r\n\t\t}\r\n\r\n\t\treturn { geometry: geometry, materials: materials };\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LoadingMonitor = function () {\r\n\r\n\tvar scope = this;\r\n\r\n\tvar loaded = 0;\r\n\tvar total = 0;\r\n\r\n\tvar onLoad = function ( event ) {\r\n\r\n\t\tloaded ++;\r\n\r\n\t\tscope.dispatchEvent( { type: 'progress', loaded: loaded, total: total } );\r\n\r\n\t\tif ( loaded === total ) {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'load' } );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.add = function ( loader ) {\r\n\r\n\t\ttotal ++;\r\n\r\n\t\tloader.addEventListener( 'load', onLoad, false );\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.LoadingMonitor.prototype = {\r\n\r\n\tconstructor: THREE.LoadingMonitor,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.GeometryLoader = function () {};\r\nTHREE.GeometryLoader.prototype = {\r\n\r\n\tconstructor: THREE.GeometryLoader,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tload: function ( url ) {\r\n\r\n\t\tvar scope = this;\r\n\t\tvar request = new XMLHttpRequest();\r\n\r\n\t\trequest.addEventListener( 'load', function ( event ) {\r\n\r\n\t\t\tvar response = scope.parse( JSON.parse( event.target.responseText ) );\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'load', content: response } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.addEventListener( 'progress', function ( event ) {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.addEventListener( 'error', function () {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.open( 'GET', url, true );\r\n\t\trequest.send( null );\r\n\r\n\t},\r\n\r\n\tparse: function ( json ) {\r\n\r\n\t\t\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.MaterialLoader = function () {};\r\n\r\nTHREE.MaterialLoader.prototype = {\r\n\r\n\tconstructor: THREE.MaterialLoader,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tload: function ( url ) {\r\n\r\n\t\tvar scope = this;\r\n\t\tvar request = new XMLHttpRequest();\r\n\r\n\t\trequest.addEventListener( 'load', function ( event ) {\r\n\r\n\t\t\tvar response = scope.parse( JSON.parse( event.target.responseText ) );\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'load', content: response } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.addEventListener( 'progress', function ( event ) {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.addEventListener( 'error', function () {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\r\n\r\n\t\t}, false );\r\n\r\n\t\trequest.open( 'GET', url, true );\r\n\t\trequest.send( null );\r\n\r\n\t},\r\n\r\n\tparse: function ( json ) {\r\n\r\n\t\tvar material;\r\n\r\n\t\tswitch ( json.type ) {\r\n\r\n\t\t\tcase 'MeshBasicMaterial':\r\n\r\n\t\t\t\tmaterial = new THREE.MeshBasicMaterial( {\r\n\r\n\t\t\t\t\tcolor: json.color,\r\n\t\t\t\t\topacity: json.opacity,\r\n\t\t\t\t\ttransparent: json.transparent,\r\n\t\t\t\t\twireframe: json.wireframe\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'MeshLambertMaterial':\r\n\r\n\t\t\t\tmaterial = new THREE.MeshLambertMaterial( {\r\n\r\n\t\t\t\t\tcolor: json.color,\r\n\t\t\t\t\tambient: json.ambient,\r\n\t\t\t\t\temissive: json.emissive,\r\n\t\t\t\t\topacity: json.opacity,\r\n\t\t\t\t\ttransparent: json.transparent,\r\n\t\t\t\t\twireframe: json.wireframe\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'MeshPhongMaterial':\r\n\r\n\t\t\t\tmaterial = new THREE.MeshPhongMaterial( {\r\n\r\n\t\t\t\t\tcolor: json.color,\r\n\t\t\t\t\tambient: json.ambient,\r\n\t\t\t\t\temissive: json.emissive,\r\n\t\t\t\t\tspecular: json.specular,\r\n\t\t\t\t\tshininess: json.shininess,\r\n\t\t\t\t\topacity: json.opacity,\r\n\t\t\t\t\ttransparent: json.transparent,\r\n\t\t\t\t\twireframe: json.wireframe\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'MeshNormalMaterial':\r\n\r\n\t\t\t\tmaterial = new THREE.MeshNormalMaterial( {\r\n\r\n\t\t\t\t\topacity: json.opacity,\r\n\t\t\t\t\ttransparent: json.transparent,\r\n\t\t\t\t\twireframe: json.wireframe\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'MeshDepthMaterial':\r\n\r\n\t\t\t\tmaterial = new THREE.MeshDepthMaterial( {\r\n\r\n\t\t\t\t\topacity: json.opacity,\r\n\t\t\t\t\ttransparent: json.transparent,\r\n\t\t\t\t\twireframe: json.wireframe\r\n\r\n\t\t\t\t} );\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t\treturn material;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SceneLoader = function () {\r\n\r\n\tthis.onLoadStart = function () {};\r\n\tthis.onLoadProgress = function() {};\r\n\tthis.onLoadComplete = function () {};\r\n\r\n\tthis.callbackSync = function () {};\r\n\tthis.callbackProgress = function () {};\r\n\r\n\tthis.geometryHandlerMap = {};\r\n\tthis.hierarchyHandlerMap = {};\r\n\r\n\tthis.addGeometryHandler( \"ascii\", THREE.JSONLoader );\r\n\r\n};\r\n\r\nTHREE.SceneLoader.prototype.constructor = THREE.SceneLoader;\r\n\r\nTHREE.SceneLoader.prototype.load = function ( url, callbackFinished ) {\r\n\r\n\tvar scope = this;\r\n\r\n\tvar xhr = new XMLHttpRequest();\r\n\r\n\txhr.onreadystatechange = function () {\r\n\r\n\t\tif ( xhr.readyState === 4 ) {\r\n\r\n\t\t\tif ( xhr.status === 200 || xhr.status === 0 ) {\r\n\r\n\t\t\t\tvar json = JSON.parse( xhr.responseText );\r\n\t\t\t\tscope.parse( json, callbackFinished, url );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.error( \"THREE.SceneLoader: Couldn't load [\" + url + \"] [\" + xhr.status + \"]\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\txhr.open( \"GET\", url, true );\r\n\txhr.send( null );\r\n\r\n};\r\n\r\nTHREE.SceneLoader.prototype.addGeometryHandler = function ( typeID, loaderClass ) {\r\n\r\n\tthis.geometryHandlerMap[ typeID ] = { \"loaderClass\": loaderClass };\r\n\r\n};\r\n\r\nTHREE.SceneLoader.prototype.addHierarchyHandler = function ( typeID, loaderClass ) {\r\n\r\n\tthis.hierarchyHandlerMap[ typeID ] = { \"loaderClass\": loaderClass };\r\n\r\n};\r\n\r\nTHREE.SceneLoader.prototype.parse = function ( json, callbackFinished, url ) {\r\n\r\n\tvar scope = this;\r\n\r\n\tvar urlBase = THREE.Loader.prototype.extractUrlBase( url );\r\n\r\n\tvar geometry, material, camera, fog,\r\n\t\ttexture, images, color,\r\n\t\tlight, hex, intensity,\r\n\t\tcounter_models, counter_textures,\r\n\t\ttotal_models, total_textures,\r\n\t\tresult;\r\n\r\n\tvar target_array = [];\r\n\r\n\tvar data = json;\r\n\r\n\t// async geometry loaders\r\n\r\n\tfor ( var typeID in this.geometryHandlerMap ) {\r\n\r\n\t\tvar loaderClass = this.geometryHandlerMap[ typeID ][ \"loaderClass\" ];\r\n\t\tthis.geometryHandlerMap[ typeID ][ \"loaderObject\" ] = new loaderClass();\r\n\r\n\t}\r\n\r\n\t// async hierachy loaders\r\n\r\n\tfor ( var typeID in this.hierarchyHandlerMap ) {\r\n\r\n\t\tvar loaderClass = this.hierarchyHandlerMap[ typeID ][ \"loaderClass\" ];\r\n\t\tthis.hierarchyHandlerMap[ typeID ][ \"loaderObject\" ] = new loaderClass();\r\n\r\n\t}\r\n\r\n\tcounter_models = 0;\r\n\tcounter_textures = 0;\r\n\r\n\tresult = {\r\n\r\n\t\tscene: new THREE.Scene(),\r\n\t\tgeometries: {},\r\n\t\tface_materials: {},\r\n\t\tmaterials: {},\r\n\t\ttextures: {},\r\n\t\tobjects: {},\r\n\t\tcameras: {},\r\n\t\tlights: {},\r\n\t\tfogs: {},\r\n\t\tempties: {},\r\n\t\tgroups: {}\r\n\r\n\t};\r\n\r\n\tif ( data.transform ) {\r\n\r\n\t\tvar position = data.transform.position,\r\n\t\t\trotation = data.transform.rotation,\r\n\t\t\tscale = data.transform.scale;\r\n\r\n\t\tif ( position ) {\r\n\r\n\t\t\tresult.scene.position.fromArray( position );\r\n\r\n\t\t}\r\n\r\n\t\tif ( rotation ) {\r\n\r\n\t\t\tresult.scene.rotation.fromArray( rotation );\r\n\r\n\t\t}\r\n\r\n\t\tif ( scale ) {\r\n\r\n\t\t\tresult.scene.scale.fromArray( scale );\r\n\r\n\t\t}\r\n\r\n\t\tif ( position || rotation || scale ) {\r\n\r\n\t\t\tresult.scene.updateMatrix();\r\n\t\t\tresult.scene.updateMatrixWorld();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction get_url( source_url, url_type ) {\r\n\r\n\t\tif ( url_type == \"relativeToHTML\" ) {\r\n\r\n\t\t\treturn source_url;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn urlBase + \"/\" + source_url;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// toplevel loader function, delegates to handle_children\r\n\r\n\tfunction handle_objects() {\r\n\r\n\t\thandle_children( result.scene, data.objects );\r\n\r\n\t}\r\n\r\n\t// handle all the children from the loaded json and attach them to given parent\r\n\r\n\tfunction handle_children( parent, children ) {\r\n\r\n\t\tvar mat, dst, pos, rot, scl, quat;\r\n\r\n\t\tfor ( var objID in children ) {\r\n\r\n\t\t\t// check by id if child has already been handled,\r\n\t\t\t// if not, create new object\r\n\r\n\t\t\tvar object = result.objects[ objID ];\r\n\t\t\tvar objJSON = children[ objID ];\r\n\r\n\t\t\tif ( object === undefined ) {\r\n\r\n\t\t\t\t// meshes\r\n\r\n\t\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) ) {\r\n\r\n\t\t\t\t\tif ( objJSON.loading === undefined ) {\r\n\r\n\t\t\t\t\t\tvar reservedTypes = {\r\n\t\t\t\t\t\t\t\"type\": 1, \"url\": 1, \"material\": 1,\r\n\t\t\t\t\t\t\t\"position\": 1, \"rotation\": 1, \"scale\" : 1,\r\n\t\t\t\t\t\t\t\"visible\": 1, \"children\": 1, \"userData\": 1,\r\n\t\t\t\t\t\t\t\"skin\": 1, \"morph\": 1, \"mirroredLoop\": 1, \"duration\": 1\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tvar loaderParameters = {};\r\n\r\n\t\t\t\t\t\tfor ( var parType in objJSON ) {\r\n\r\n\t\t\t\t\t\t\tif ( ! ( parType in reservedTypes ) ) {\r\n\r\n\t\t\t\t\t\t\t\tloaderParameters[ parType ] = objJSON[ parType ];\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\r\n\r\n\t\t\t\t\t\tobjJSON.loading = true;\r\n\r\n\t\t\t\t\t\tvar loader = scope.hierarchyHandlerMap[ objJSON.type ][ \"loaderObject\" ];\r\n\r\n\t\t\t\t\t\t// ColladaLoader\r\n\r\n\t\t\t\t\t\tif ( loader.options ) {\r\n\r\n\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );\r\n\r\n\t\t\t\t\t\t// UTF8Loader\r\n\t\t\t\t\t\t// OBJLoader\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ), loaderParameters );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if ( objJSON.geometry !== undefined ) {\r\n\r\n\t\t\t\t\tgeometry = result.geometries[ objJSON.geometry ];\r\n\r\n\t\t\t\t\t// geometry already loaded\r\n\r\n\t\t\t\t\tif ( geometry ) {\r\n\r\n\t\t\t\t\t\tvar needsTangents = false;\r\n\r\n\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\r\n\t\t\t\t\t\tneedsTangents = material instanceof THREE.ShaderMaterial;\r\n\r\n\t\t\t\t\t\tpos = objJSON.position;\r\n\t\t\t\t\t\trot = objJSON.rotation;\r\n\t\t\t\t\t\tscl = objJSON.scale;\r\n\t\t\t\t\t\tmat = objJSON.matrix;\r\n\t\t\t\t\t\tquat = objJSON.quaternion;\r\n\r\n\t\t\t\t\t\t// use materials from the model file\r\n\t\t\t\t\t\t// if there is no material specified in the object\r\n\r\n\t\t\t\t\t\tif ( ! objJSON.material ) {\r\n\r\n\t\t\t\t\t\t\tmaterial = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// use materials from the model file\r\n\t\t\t\t\t\t// if there is just empty face material\r\n\t\t\t\t\t\t// (must create new material as each model has its own face material)\r\n\r\n\t\t\t\t\t\tif ( ( material instanceof THREE.MeshFaceMaterial ) && material.materials.length === 0 ) {\r\n\r\n\t\t\t\t\t\t\tmaterial = new THREE.MeshFaceMaterial( result.face_materials[ objJSON.geometry ] );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif ( material instanceof THREE.MeshFaceMaterial ) {\r\n\r\n\t\t\t\t\t\t\tfor ( var i = 0; i < material.materials.length; i ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tneedsTangents = needsTangents || ( material.materials[ i ] instanceof THREE.ShaderMaterial );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif ( needsTangents ) {\r\n\r\n\t\t\t\t\t\t\tgeometry.computeTangents();\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif ( objJSON.skin ) {\r\n\r\n\t\t\t\t\t\t\tobject = new THREE.SkinnedMesh( geometry, material );\r\n\r\n\t\t\t\t\t\t} else if ( objJSON.morph ) {\r\n\r\n\t\t\t\t\t\t\tobject = new THREE.MorphAnimMesh( geometry, material );\r\n\r\n\t\t\t\t\t\t\tif ( objJSON.duration !== undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tobject.duration = objJSON.duration;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif ( objJSON.time !== undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tobject.time = objJSON.time;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif ( objJSON.mirroredLoop !== undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tobject.mirroredLoop = objJSON.mirroredLoop;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\t\t\t\t\t\tgeometry.computeMorphNormals();\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tobject = new THREE.Mesh( geometry, material );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tobject.name = objID;\r\n\r\n\t\t\t\t\t\tif ( mat ) {\r\n\r\n\t\t\t\t\t\t\tobject.matrixAutoUpdate = false;\r\n\t\t\t\t\t\t\tobject.matrix.set(\r\n\t\t\t\t\t\t\t\tmat[0], mat[1], mat[2], mat[3],\r\n\t\t\t\t\t\t\t\tmat[4], mat[5], mat[6], mat[7],\r\n\t\t\t\t\t\t\t\tmat[8], mat[9], mat[10], mat[11],\r\n\t\t\t\t\t\t\t\tmat[12], mat[13], mat[14], mat[15]\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tobject.position.fromArray( pos );\r\n\r\n\t\t\t\t\t\t\tif ( quat ) {\r\n\r\n\t\t\t\t\t\t\t\tobject.quaternion.fromArray( quat );\r\n\t\t\t\t\t\t\t\tobject.useQuaternion = true;\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tobject.rotation.fromArray( rot );\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tobject.scale.fromArray( scl );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tobject.visible = objJSON.visible;\r\n\t\t\t\t\t\tobject.castShadow = objJSON.castShadow;\r\n\t\t\t\t\t\tobject.receiveShadow = objJSON.receiveShadow;\r\n\r\n\t\t\t\t\t\tparent.add( object );\r\n\r\n\t\t\t\t\t\tresult.objects[ objID ] = object;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t// lights\r\n\r\n\t\t\t\t} else if ( objJSON.type === \"DirectionalLight\" || objJSON.type === \"PointLight\" || objJSON.type === \"AmbientLight\" ) {\r\n\r\n\t\t\t\t\thex = ( objJSON.color !== undefined ) ? objJSON.color : 0xffffff;\r\n\t\t\t\t\tintensity = ( objJSON.intensity !== undefined ) ? objJSON.intensity : 1;\r\n\r\n\t\t\t\t\tif ( objJSON.type === \"DirectionalLight\" ) {\r\n\r\n\t\t\t\t\t\tpos = objJSON.direction;\r\n\r\n\t\t\t\t\t\tlight = new THREE.DirectionalLight( hex, intensity );\r\n\t\t\t\t\t\tlight.position.fromArray( pos );\r\n\r\n\t\t\t\t\t\tif ( objJSON.target ) {\r\n\r\n\t\t\t\t\t\t\ttarget_array.push( { \"object\": light, \"targetName\" : objJSON.target } );\r\n\r\n\t\t\t\t\t\t\t// kill existing default target\r\n\t\t\t\t\t\t\t// otherwise it gets added to scene when parent gets added\r\n\r\n\t\t\t\t\t\t\tlight.target = null;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( objJSON.type === \"PointLight\" ) {\r\n\r\n\t\t\t\t\t\tpos = objJSON.position;\r\n\t\t\t\t\t\tdst = objJSON.distance;\r\n\r\n\t\t\t\t\t\tlight = new THREE.PointLight( hex, intensity, dst );\r\n\t\t\t\t\t\tlight.position.fromArray( pos );\r\n\r\n\t\t\t\t\t} else if ( objJSON.type === \"AmbientLight\" ) {\r\n\r\n\t\t\t\t\t\tlight = new THREE.AmbientLight( hex );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tparent.add( light );\r\n\r\n\t\t\t\t\tlight.name = objID;\r\n\t\t\t\t\tresult.lights[ objID ] = light;\r\n\t\t\t\t\tresult.objects[ objID ] = light;\r\n\r\n\t\t\t\t// cameras\r\n\r\n\t\t\t\t} else if ( objJSON.type === \"PerspectiveCamera\" || objJSON.type === \"OrthographicCamera\" ) {\r\n\r\n\t\t\t\t\tpos = objJSON.position;\r\n\t\t\t\t\trot = objJSON.rotation;\r\n\t\t\t\t\tquat = objJSON.quaternion;\r\n\r\n\t\t\t\t\tif ( objJSON.type === \"PerspectiveCamera\" ) {\r\n\r\n\t\t\t\t\t\tcamera = new THREE.PerspectiveCamera( objJSON.fov, objJSON.aspect, objJSON.near, objJSON.far );\r\n\r\n\t\t\t\t\t} else if ( objJSON.type === \"OrthographicCamera\" ) {\r\n\r\n\t\t\t\t\t\tcamera = new THREE.OrthographicCamera( objJSON.left, objJSON.right, objJSON.top, objJSON.bottom, objJSON.near, objJSON.far );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcamera.name = objID;\r\n\t\t\t\t\tcamera.position.fromArray( pos );\r\n\r\n\t\t\t\t\tif ( quat !== undefined ) {\r\n\r\n\t\t\t\t\t\tcamera.quaternion.fromArray( quat );\r\n\t\t\t\t\t\tcamera.useQuaternion = true;\r\n\r\n\t\t\t\t\t} else if ( rot !== undefined ) {\r\n\r\n\t\t\t\t\t\tcamera.rotation.fromArray( rot );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tparent.add( camera );\r\n\r\n\t\t\t\t\tresult.cameras[ objID ] = camera;\r\n\t\t\t\t\tresult.objects[ objID ] = camera;\r\n\r\n\t\t\t\t// pure Object3D\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tpos = objJSON.position;\r\n\t\t\t\t\trot = objJSON.rotation;\r\n\t\t\t\t\tscl = objJSON.scale;\r\n\t\t\t\t\tquat = objJSON.quaternion;\r\n\r\n\t\t\t\t\tobject = new THREE.Object3D();\r\n\t\t\t\t\tobject.name = objID;\r\n\t\t\t\t\tobject.position.fromArray( pos );\r\n\r\n\t\t\t\t\tif ( quat ) {\r\n\r\n\t\t\t\t\t\tobject.quaternion.fromArray( quat );\r\n\t\t\t\t\t\tobject.useQuaternion = true;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tobject.rotation.fromArray( rot );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobject.scale.fromArray( scl );\r\n\t\t\t\t\tobject.visible = ( objJSON.visible !== undefined ) ? objJSON.visible : false;\r\n\r\n\t\t\t\t\tparent.add( object );\r\n\r\n\t\t\t\t\tresult.objects[ objID ] = object;\r\n\t\t\t\t\tresult.empties[ objID ] = object;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( object ) {\r\n\r\n\t\t\t\t\tif ( objJSON.userData !== undefined ) {\r\n\r\n\t\t\t\t\t\tfor ( var key in objJSON.userData ) {\r\n\r\n\t\t\t\t\t\t\tvar value = objJSON.userData[ key ];\r\n\t\t\t\t\t\t\tobject.userData[ key ] = value;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( objJSON.groups !== undefined ) {\r\n\r\n\t\t\t\t\t\tfor ( var i = 0; i < objJSON.groups.length; i ++ ) {\r\n\r\n\t\t\t\t\t\t\tvar groupID = objJSON.groups[ i ];\r\n\r\n\t\t\t\t\t\t\tif ( result.groups[ groupID ] === undefined ) {\r\n\r\n\t\t\t\t\t\t\t\tresult.groups[ groupID ] = [];\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tresult.groups[ groupID ].push( objID );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( object !== undefined && objJSON.children !== undefined ) {\r\n\r\n\t\t\t\thandle_children( object, objJSON.children );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction handle_mesh( geo, mat, id ) {\r\n\r\n\t\tresult.geometries[ id ] = geo;\r\n\t\tresult.face_materials[ id ] = mat;\r\n\t\thandle_objects();\r\n\r\n\t};\r\n\r\n\tfunction handle_hierarchy( node, id, parent, material, obj ) {\r\n\r\n\t\tvar p = obj.position;\r\n\t\tvar r = obj.rotation;\r\n\t\tvar q = obj.quaternion;\r\n\t\tvar s = obj.scale;\r\n\r\n\t\tnode.position.fromArray( p );\r\n\r\n\t\tif ( q ) {\r\n\r\n\t\t\tnode.quaternion.fromArray( q );\r\n\t\t\tnode.useQuaternion = true;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tnode.rotation.fromArray( r );\r\n\r\n\t\t}\r\n\r\n\t\tnode.scale.fromArray( s );\r\n\r\n\t\t// override children materials\r\n\t\t// if object material was specified in JSON explicitly\r\n\r\n\t\tif ( material ) {\r\n\r\n\t\t\tnode.traverse( function ( child ) {\r\n\r\n\t\t\t\tchild.material = material;\r\n\r\n\t\t\t} );\r\n\r\n\t\t}\r\n\r\n\t\t// override children visibility\r\n\t\t// with root node visibility as specified in JSON\r\n\r\n\t\tvar visible = ( obj.visible !== undefined ) ? obj.visible : true;\r\n\r\n\t\tnode.traverse( function ( child ) {\r\n\r\n\t\t\tchild.visible = visible;\r\n\r\n\t\t} );\r\n\r\n\t\tparent.add( node );\r\n\r\n\t\tnode.name = id;\r\n\r\n\t\tresult.objects[ id ] = node;\r\n\t\thandle_objects();\r\n\r\n\t};\r\n\r\n\tfunction create_callback_geometry( id ) {\r\n\r\n\t\treturn function ( geo, mat ) {\r\n\r\n\t\t\tgeo.name = id;\r\n\r\n\t\t\thandle_mesh( geo, mat, id );\r\n\r\n\t\t\tcounter_models -= 1;\r\n\r\n\t\t\tscope.onLoadComplete();\r\n\r\n\t\t\tasync_callback_gate();\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction create_callback_hierachy( id, parent, material, obj ) {\r\n\r\n\t\treturn function ( event ) {\r\n\r\n\t\t\tvar result;\r\n\r\n\t\t\t// loaders which use EventDispatcher\r\n\r\n\t\t\tif ( event.content ) {\r\n\r\n\t\t\t\tresult = event.content;\r\n\r\n\t\t\t// ColladaLoader\r\n\r\n\t\t\t} else if ( event.dae ) {\r\n\r\n\t\t\t\tresult = event.scene;\r\n\r\n\r\n\t\t\t// UTF8Loader\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tresult = event;\r\n\r\n\t\t\t}\r\n\r\n\t\t\thandle_hierarchy( result, id, parent, material, obj );\r\n\r\n\t\t\tcounter_models -= 1;\r\n\r\n\t\t\tscope.onLoadComplete();\r\n\r\n\t\t\tasync_callback_gate();\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction create_callback_embed( id ) {\r\n\r\n\t\treturn function ( geo, mat ) {\r\n\r\n\t\t\tgeo.name = id;\r\n\r\n\t\t\tresult.geometries[ id ] = geo;\r\n\t\t\tresult.face_materials[ id ] = mat;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction async_callback_gate() {\r\n\r\n\t\tvar progress = {\r\n\r\n\t\t\ttotalModels : total_models,\r\n\t\t\ttotalTextures : total_textures,\r\n\t\t\tloadedModels : total_models - counter_models,\r\n\t\t\tloadedTextures : total_textures - counter_textures\r\n\r\n\t\t};\r\n\r\n\t\tscope.callbackProgress( progress, result );\r\n\r\n\t\tscope.onLoadProgress();\r\n\r\n\t\tif ( counter_models === 0 && counter_textures === 0 ) {\r\n\r\n\t\t\tfinalize();\r\n\t\t\tcallbackFinished( result );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction finalize() {\r\n\r\n\t\t// take care of targets which could be asynchronously loaded objects\r\n\r\n\t\tfor ( var i = 0; i < target_array.length; i ++ ) {\r\n\r\n\t\t\tvar ta = target_array[ i ];\r\n\r\n\t\t\tvar target = result.objects[ ta.targetName ];\r\n\r\n\t\t\tif ( target ) {\r\n\r\n\t\t\t\tta.object.target = target;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// if there was error and target of specified name doesn't exist in the scene file\r\n\t\t\t\t// create instead dummy target\r\n\t\t\t\t// (target must be added to scene explicitly as parent is already added)\r\n\r\n\t\t\t\tta.object.target = new THREE.Object3D();\r\n\t\t\t\tresult.scene.add( ta.object.target );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tta.object.target.userData.targetInverse = ta.object;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar callbackTexture = function ( count ) {\r\n\r\n\t\tcounter_textures -= count;\r\n\t\tasync_callback_gate();\r\n\r\n\t\tscope.onLoadComplete();\r\n\r\n\t};\r\n\r\n\t// must use this instead of just directly calling callbackTexture\r\n\t// because of closure in the calling context loop\r\n\r\n\tvar generateTextureCallback = function ( count ) {\r\n\r\n\t\treturn function () {\r\n\r\n\t\t\tcallbackTexture( count );\r\n\r\n\t\t};\r\n\r\n\t};\r\n\r\n\tfunction traverse_json_hierarchy( objJSON, callback ) {\r\n\r\n\t\tcallback( objJSON );\r\n\r\n\t\tif ( objJSON.children !== undefined ) {\r\n\r\n\t\t\tfor ( var objChildID in objJSON.children ) {\r\n\r\n\t\t\t\ttraverse_json_hierarchy( objJSON.children[ objChildID ], callback );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// first go synchronous elements\r\n\r\n\t// fogs\r\n\r\n\tvar fogID, fogJSON;\r\n\r\n\tfor ( fogID in data.fogs ) {\r\n\r\n\t\tfogJSON = data.fogs[ fogID ];\r\n\r\n\t\tif ( fogJSON.type === \"linear\" ) {\r\n\r\n\t\t\tfog = new THREE.Fog( 0x000000, fogJSON.near, fogJSON.far );\r\n\r\n\t\t} else if ( fogJSON.type === \"exp2\" ) {\r\n\r\n\t\t\tfog = new THREE.FogExp2( 0x000000, fogJSON.density );\r\n\r\n\t\t}\r\n\r\n\t\tcolor = fogJSON.color;\r\n\t\tfog.color.setRGB( color[0], color[1], color[2] );\r\n\r\n\t\tresult.fogs[ fogID ] = fog;\r\n\r\n\t}\r\n\r\n\t// now come potentially asynchronous elements\r\n\r\n\t// geometries\r\n\r\n\t// count how many geometries will be loaded asynchronously\r\n\r\n\tvar geoID, geoJSON;\r\n\r\n\tfor ( geoID in data.geometries ) {\r\n\r\n\t\tgeoJSON = data.geometries[ geoID ];\r\n\r\n\t\tif ( geoJSON.type in this.geometryHandlerMap ) {\r\n\r\n\t\t\tcounter_models += 1;\r\n\r\n\t\t\tscope.onLoadStart();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// count how many hierarchies will be loaded asynchronously\r\n\r\n\tfor ( var objID in data.objects ) {\r\n\r\n\t\ttraverse_json_hierarchy( data.objects[ objID ], function ( objJSON ) {\r\n\r\n\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlerMap ) ) {\r\n\r\n\t\t\t\tcounter_models += 1;\r\n\r\n\t\t\t\tscope.onLoadStart();\r\n\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t}\r\n\r\n\ttotal_models = counter_models;\r\n\r\n\tfor ( geoID in data.geometries ) {\r\n\r\n\t\tgeoJSON = data.geometries[ geoID ];\r\n\r\n\t\tif ( geoJSON.type === \"cube\" ) {\r\n\r\n\t\t\tgeometry = new THREE.CubeGeometry( geoJSON.width, geoJSON.height, geoJSON.depth, geoJSON.widthSegments, geoJSON.heightSegments, geoJSON.depthSegments );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type === \"plane\" ) {\r\n\r\n\t\t\tgeometry = new THREE.PlaneGeometry( geoJSON.width, geoJSON.height, geoJSON.widthSegments, geoJSON.heightSegments );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type === \"sphere\" ) {\r\n\r\n\t\t\tgeometry = new THREE.SphereGeometry( geoJSON.radius, geoJSON.widthSegments, geoJSON.heightSegments );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type === \"cylinder\" ) {\r\n\r\n\t\t\tgeometry = new THREE.CylinderGeometry( geoJSON.topRad, geoJSON.botRad, geoJSON.height, geoJSON.radSegs, geoJSON.heightSegs );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type === \"torus\" ) {\r\n\r\n\t\t\tgeometry = new THREE.TorusGeometry( geoJSON.radius, geoJSON.tube, geoJSON.segmentsR, geoJSON.segmentsT );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type === \"icosahedron\" ) {\r\n\r\n\t\t\tgeometry = new THREE.IcosahedronGeometry( geoJSON.radius, geoJSON.subdivisions );\r\n\t\t\tgeometry.name = geoID;\r\n\t\t\tresult.geometries[ geoID ] = geometry;\r\n\r\n\t\t} else if ( geoJSON.type in this.geometryHandlerMap ) {\r\n\r\n\t\t\tvar loaderParameters = {};\r\n\r\n\t\t\tfor ( var parType in geoJSON ) {\r\n\r\n\t\t\t\tif ( parType !== \"type\" && parType !== \"url\" ) {\r\n\r\n\t\t\t\t\tloaderParameters[ parType ] = geoJSON[ parType ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar loader = this.geometryHandlerMap[ geoJSON.type ][ \"loaderObject\" ];\r\n\t\t\tloader.load( get_url( geoJSON.url, data.urlBaseType ), create_callback_geometry( geoID ), loaderParameters );\r\n\r\n\t\t} else if ( geoJSON.type === \"embedded\" ) {\r\n\r\n\t\t\tvar modelJson = data.embeds[ geoJSON.id ],\r\n\t\t\t\ttexture_path = \"\";\r\n\r\n\t\t\t// pass metadata along to jsonLoader so it knows the format version\r\n\r\n\t\t\tmodelJson.metadata = data.metadata;\r\n\r\n\t\t\tif ( modelJson ) {\r\n\r\n\t\t\t\tvar jsonLoader = this.geometryHandlerMap[ \"ascii\" ][ \"loaderObject\" ];\r\n\t\t\t\tvar model = jsonLoader.parse( modelJson, texture_path );\r\n\t\t\t\tcreate_callback_embed( geoID )( model.geometry, model.materials );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// textures\r\n\r\n\t// count how many textures will be loaded asynchronously\r\n\r\n\tvar textureID, textureJSON;\r\n\r\n\tfor ( textureID in data.textures ) {\r\n\r\n\t\ttextureJSON = data.textures[ textureID ];\r\n\r\n\t\tif ( textureJSON.url instanceof Array ) {\r\n\r\n\t\t\tcounter_textures += textureJSON.url.length;\r\n\r\n\t\t\tfor( var n = 0; n < textureJSON.url.length; n ++ ) {\r\n\r\n\t\t\t\tscope.onLoadStart();\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tcounter_textures += 1;\r\n\r\n\t\t\tscope.onLoadStart();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\ttotal_textures = counter_textures;\r\n\r\n\tfor ( textureID in data.textures ) {\r\n\r\n\t\ttextureJSON = data.textures[ textureID ];\r\n\r\n\t\tif ( textureJSON.mapping !== undefined && THREE[ textureJSON.mapping ] !== undefined ) {\r\n\r\n\t\t\ttextureJSON.mapping = new THREE[ textureJSON.mapping ]();\r\n\r\n\t\t}\r\n\r\n\t\tif ( textureJSON.url instanceof Array ) {\r\n\r\n\t\t\tvar count = textureJSON.url.length;\r\n\t\t\tvar url_array = [];\r\n\r\n\t\t\tfor( var i = 0; i < count; i ++ ) {\r\n\r\n\t\t\t\turl_array[ i ] = get_url( textureJSON.url[ i ], data.urlBaseType );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar isCompressed = /\\.dds$/i.test( url_array[ 0 ] );\r\n\r\n\t\t\tif ( isCompressed ) {\r\n\r\n\t\t\t\ttexture = THREE.ImageUtils.loadCompressedTextureCube( url_array, textureJSON.mapping, generateTextureCallback( count ) );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttexture = THREE.ImageUtils.loadTextureCube( url_array, textureJSON.mapping, generateTextureCallback( count ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar isCompressed = /\\.dds$/i.test( textureJSON.url );\r\n\t\t\tvar fullUrl = get_url( textureJSON.url, data.urlBaseType );\r\n\t\t\tvar textureCallback = generateTextureCallback( 1 );\r\n\r\n\t\t\tif ( isCompressed ) {\r\n\r\n\t\t\t\ttexture = THREE.ImageUtils.loadCompressedTexture( fullUrl, textureJSON.mapping, textureCallback );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttexture = THREE.ImageUtils.loadTexture( fullUrl, textureJSON.mapping, textureCallback );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( THREE[ textureJSON.minFilter ] !== undefined )\r\n\t\t\t\ttexture.minFilter = THREE[ textureJSON.minFilter ];\r\n\r\n\t\t\tif ( THREE[ textureJSON.magFilter ] !== undefined )\r\n\t\t\t\ttexture.magFilter = THREE[ textureJSON.magFilter ];\r\n\r\n\t\t\tif ( textureJSON.anisotropy ) texture.anisotropy = textureJSON.anisotropy;\r\n\r\n\t\t\tif ( textureJSON.repeat ) {\r\n\r\n\t\t\t\ttexture.repeat.set( textureJSON.repeat[ 0 ], textureJSON.repeat[ 1 ] );\r\n\r\n\t\t\t\tif ( textureJSON.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;\r\n\t\t\t\tif ( textureJSON.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( textureJSON.offset ) {\r\n\r\n\t\t\t\ttexture.offset.set( textureJSON.offset[ 0 ], textureJSON.offset[ 1 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// handle wrap after repeat so that default repeat can be overriden\r\n\r\n\t\t\tif ( textureJSON.wrap ) {\r\n\r\n\t\t\t\tvar wrapMap = {\r\n\t\t\t\t\t\"repeat\": THREE.RepeatWrapping,\r\n\t\t\t\t\t\"mirror\": THREE.MirroredRepeatWrapping\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ textureJSON.wrap[ 0 ] ];\r\n\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ textureJSON.wrap[ 1 ] ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tresult.textures[ textureID ] = texture;\r\n\r\n\t}\r\n\r\n\t// materials\r\n\r\n\tvar matID, matJSON;\r\n\tvar parID;\r\n\r\n\tfor ( matID in data.materials ) {\r\n\r\n\t\tmatJSON = data.materials[ matID ];\r\n\r\n\t\tfor ( parID in matJSON.parameters ) {\r\n\r\n\t\t\tif ( parID === \"envMap\" || parID === \"map\" || parID === \"lightMap\" || parID === \"bumpMap\" ) {\r\n\r\n\t\t\t\tmatJSON.parameters[ parID ] = result.textures[ matJSON.parameters[ parID ] ];\r\n\r\n\t\t\t} else if ( parID === \"shading\" ) {\r\n\r\n\t\t\t\tmatJSON.parameters[ parID ] = ( matJSON.parameters[ parID ] === \"flat\" ) ? THREE.FlatShading : THREE.SmoothShading;\r\n\r\n\t\t\t} else if ( parID === \"side\" ) {\r\n\r\n\t\t\t\tif ( matJSON.parameters[ parID ] == \"double\" ) {\r\n\r\n\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.DoubleSide;\r\n\r\n\t\t\t\t} else if ( matJSON.parameters[ parID ] == \"back\" ) {\r\n\r\n\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.BackSide;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FrontSide;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( parID === \"blending\" ) {\r\n\r\n\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.NormalBlending;\r\n\r\n\t\t\t} else if ( parID === \"combine\" ) {\r\n\r\n\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.MultiplyOperation;\r\n\r\n\t\t\t} else if ( parID === \"vertexColors\" ) {\r\n\r\n\t\t\t\tif ( matJSON.parameters[ parID ] == \"face\" ) {\r\n\r\n\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FaceColors;\r\n\r\n\t\t\t\t// default to vertex colors if \"vertexColors\" is anything else face colors or 0 / null / false\r\n\r\n\t\t\t\t} else if ( matJSON.parameters[ parID ] ) {\r\n\r\n\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.VertexColors;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( parID === \"wrapRGB\" ) {\r\n\r\n\t\t\t\tvar v3 = matJSON.parameters[ parID ];\r\n\t\t\t\tmatJSON.parameters[ parID ] = new THREE.Vector3( v3[ 0 ], v3[ 1 ], v3[ 2 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( matJSON.parameters.opacity !== undefined && matJSON.parameters.opacity < 1.0 ) {\r\n\r\n\t\t\tmatJSON.parameters.transparent = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( matJSON.parameters.normalMap ) {\r\n\r\n\t\t\tvar shader = THREE.ShaderLib[ \"normalmap\" ];\r\n\t\t\tvar uniforms = THREE.UniformsUtils.clone( shader.uniforms );\r\n\r\n\t\t\tvar diffuse = matJSON.parameters.color;\r\n\t\t\tvar specular = matJSON.parameters.specular;\r\n\t\t\tvar ambient = matJSON.parameters.ambient;\r\n\t\t\tvar shininess = matJSON.parameters.shininess;\r\n\r\n\t\t\tuniforms[ \"tNormal\" ].value = result.textures[ matJSON.parameters.normalMap ];\r\n\r\n\t\t\tif ( matJSON.parameters.normalScale ) {\r\n\r\n\t\t\t\tuniforms[ \"uNormalScale\" ].value.set( matJSON.parameters.normalScale[ 0 ], matJSON.parameters.normalScale[ 1 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( matJSON.parameters.map ) {\r\n\r\n\t\t\t\tuniforms[ \"tDiffuse\" ].value = matJSON.parameters.map;\r\n\t\t\t\tuniforms[ \"enableDiffuse\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( matJSON.parameters.envMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tCube\" ].value = matJSON.parameters.envMap;\r\n\t\t\t\tuniforms[ \"enableReflection\" ].value = true;\r\n\t\t\t\tuniforms[ \"uReflectivity\" ].value = matJSON.parameters.reflectivity;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( matJSON.parameters.lightMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tAO\" ].value = matJSON.parameters.lightMap;\r\n\t\t\t\tuniforms[ \"enableAO\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( matJSON.parameters.specularMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tSpecular\" ].value = result.textures[ matJSON.parameters.specularMap ];\r\n\t\t\t\tuniforms[ \"enableSpecular\" ].value = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( matJSON.parameters.displacementMap ) {\r\n\r\n\t\t\t\tuniforms[ \"tDisplacement\" ].value = result.textures[ matJSON.parameters.displacementMap ];\r\n\t\t\t\tuniforms[ \"enableDisplacement\" ].value = true;\r\n\r\n\t\t\t\tuniforms[ \"uDisplacementBias\" ].value = matJSON.parameters.displacementBias;\r\n\t\t\t\tuniforms[ \"uDisplacementScale\" ].value = matJSON.parameters.displacementScale;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuniforms[ \"uDiffuseColor\" ].value.setHex( diffuse );\r\n\t\t\tuniforms[ \"uSpecularColor\" ].value.setHex( specular );\r\n\t\t\tuniforms[ \"uAmbientColor\" ].value.setHex( ambient );\r\n\r\n\t\t\tuniforms[ \"uShininess\" ].value = shininess;\r\n\r\n\t\t\tif ( matJSON.parameters.opacity ) {\r\n\r\n\t\t\t\tuniforms[ \"uOpacity\" ].value = matJSON.parameters.opacity;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };\r\n\r\n\t\t\tmaterial = new THREE.ShaderMaterial( parameters );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmaterial = new THREE[ matJSON.type ]( matJSON.parameters );\r\n\r\n\t\t}\r\n\r\n\t\tmaterial.name = matID;\r\n\r\n\t\tresult.materials[ matID ] = material;\r\n\r\n\t}\r\n\r\n\t// second pass through all materials to initialize MeshFaceMaterials\r\n\t// that could be referring to other materials out of order\r\n\r\n\tfor ( matID in data.materials ) {\r\n\r\n\t\tmatJSON = data.materials[ matID ];\r\n\r\n\t\tif ( matJSON.parameters.materials ) {\r\n\r\n\t\t\tvar materialArray = [];\r\n\r\n\t\t\tfor ( var i = 0; i < matJSON.parameters.materials.length; i ++ ) {\r\n\r\n\t\t\t\tvar label = matJSON.parameters.materials[ i ];\r\n\t\t\t\tmaterialArray.push( result.materials[ label ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tresult.materials[ matID ].materials = materialArray;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// objects ( synchronous init of procedural primitives )\r\n\r\n\thandle_objects();\r\n\r\n\t// defaults\r\n\r\n\tif ( result.cameras && data.defaults.camera ) {\r\n\r\n\t\tresult.currentCamera = result.cameras[ data.defaults.camera ];\r\n\r\n\t}\r\n\r\n\tif ( result.fogs && data.defaults.fog ) {\r\n\r\n\t\tresult.scene.fog = result.fogs[ data.defaults.fog ];\r\n\r\n\t}\r\n\r\n\t// synchronous callback\r\n\r\n\tscope.callbackSync( result );\r\n\r\n\t// just in case there are no async elements\r\n\r\n\tasync_callback_gate();\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.TextureLoader = function () {\r\n\r\n\tthis.crossOrigin = null;\r\n\r\n};\r\n\r\nTHREE.TextureLoader.prototype = {\r\n\r\n\tconstructor: THREE.TextureLoader,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tload: function ( url ) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar image = new Image();\r\n\r\n\t\timage.addEventListener( 'load', function () {\r\n\r\n\t\t\tvar texture = new THREE.Texture( image );\r\n\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'load', content: texture } );\r\n\r\n\t\t}, false );\r\n\r\n\t\timage.addEventListener( 'error', function () {\r\n\r\n\t\t\tscope.dispatchEvent( { type: 'error', message: 'Couldn\\'t load URL [' + url + ']' } );\r\n\r\n\t\t}, false );\r\n\r\n\t\tif ( scope.crossOrigin ) image.crossOrigin = scope.crossOrigin;\r\n\r\n\t\timage.src = url;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Material = function () {\r\n\r\n\tthis.id = THREE.MaterialIdCount ++;\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.side = THREE.FrontSide;\r\n\r\n\tthis.opacity = 1;\r\n\tthis.transparent = false;\r\n\r\n\tthis.blending = THREE.NormalBlending;\r\n\r\n\tthis.blendSrc = THREE.SrcAlphaFactor;\r\n\tthis.blendDst = THREE.OneMinusSrcAlphaFactor;\r\n\tthis.blendEquation = THREE.AddEquation;\r\n\r\n\tthis.depthTest = true;\r\n\tthis.depthWrite = true;\r\n\r\n\tthis.polygonOffset = false;\r\n\tthis.polygonOffsetFactor = 0;\r\n\tthis.polygonOffsetUnits = 0;\r\n\r\n\tthis.alphaTest = 0;\r\n\r\n\tthis.overdraw = false; // Boolean for fixing antialiasing gaps in CanvasRenderer\r\n\r\n\tthis.visible = true;\r\n\r\n\tthis.needsUpdate = true;\r\n\r\n};\r\n\r\nTHREE.Material.prototype = {\r\n\r\n\tconstructor: THREE.Material,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tsetValues: function ( values ) {\r\n\r\n\t\tif ( values === undefined ) return;\r\n\r\n\t\tfor ( var key in values ) {\r\n\r\n\t\t\tvar newValue = values[ key ];\r\n\r\n\t\t\tif ( newValue === undefined ) {\r\n\r\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( key in this ) {\r\n\r\n\t\t\t\tvar currentValue = this[ key ];\r\n\r\n\t\t\t\tif ( currentValue instanceof THREE.Color ) {\r\n\r\n\t\t\t\t\tcurrentValue.set( newValue );\r\n\r\n\t\t\t\t} else if ( currentValue instanceof THREE.Vector3 && newValue instanceof THREE.Vector3 ) {\r\n\r\n\t\t\t\t\tcurrentValue.copy( newValue );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthis[ key ] = newValue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tclone: function ( material ) {\r\n\r\n\t\tif ( material === undefined ) material = new THREE.Material();\r\n\r\n\t\tmaterial.name = this.name;\r\n\r\n\t\tmaterial.side = this.side;\r\n\r\n\t\tmaterial.opacity = this.opacity;\r\n\t\tmaterial.transparent = this.transparent;\r\n\r\n\t\tmaterial.blending = this.blending;\r\n\r\n\t\tmaterial.blendSrc = this.blendSrc;\r\n\t\tmaterial.blendDst = this.blendDst;\r\n\t\tmaterial.blendEquation = this.blendEquation;\r\n\r\n\t\tmaterial.depthTest = this.depthTest;\r\n\t\tmaterial.depthWrite = this.depthWrite;\r\n\r\n\t\tmaterial.polygonOffset = this.polygonOffset;\r\n\t\tmaterial.polygonOffsetFactor = this.polygonOffsetFactor;\r\n\t\tmaterial.polygonOffsetUnits = this.polygonOffsetUnits;\r\n\r\n\t\tmaterial.alphaTest = this.alphaTest;\r\n\r\n\t\tmaterial.overdraw = this.overdraw;\r\n\r\n\t\tmaterial.visible = this.visible;\r\n\r\n\t\treturn material;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MaterialIdCount = 0;\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * linewidth: ,\r\n * linecap: \"round\",\r\n * linejoin: \"round\",\r\n *\r\n * vertexColors: \r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.LineBasicMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.linewidth = 1;\r\n\tthis.linecap = 'round';\r\n\tthis.linejoin = 'round';\r\n\r\n\tthis.vertexColors = false;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.LineBasicMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.LineBasicMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.LineBasicMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\r\n\tmaterial.linewidth = this.linewidth;\r\n\tmaterial.linecap = this.linecap;\r\n\tmaterial.linejoin = this.linejoin;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * linewidth: ,\r\n *\r\n * scale: ,\r\n * dashSize: ,\r\n * gapSize: ,\r\n *\r\n * vertexColors: \r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.LineDashedMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.linewidth = 1;\r\n\r\n\tthis.scale = 1;\r\n\tthis.dashSize = 3;\r\n\tthis.gapSize = 1;\r\n\r\n\tthis.vertexColors = false;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.LineDashedMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.LineDashedMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.LineDashedMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\r\n\tmaterial.linewidth = this.linewidth;\r\n\r\n\tmaterial.scale = this.scale;\r\n\tmaterial.dashSize = this.dashSize;\r\n\tmaterial.gapSize = this.gapSize;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.MeshBasicMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // emissive\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshBasicMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.MeshBasicMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.MeshBasicMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\r\n\tmaterial.map = this.map;\r\n\r\n\tmaterial.lightMap = this.lightMap;\r\n\r\n\tmaterial.specularMap = this.specularMap;\r\n\r\n\tmaterial.envMap = this.envMap;\r\n\tmaterial.combine = this.combine;\r\n\tmaterial.reflectivity = this.reflectivity;\r\n\tmaterial.refractionRatio = this.refractionRatio;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\tmaterial.shading = this.shading;\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\tmaterial.wireframeLinecap = this.wireframeLinecap;\r\n\tmaterial.wireframeLinejoin = this.wireframeLinejoin;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.skinning = this.skinning;\r\n\tmaterial.morphTargets = this.morphTargets;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * ambient: ,\r\n * emissive: ,\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.MeshLambertMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // diffuse\r\n\tthis.ambient = new THREE.Color( 0xffffff );\r\n\tthis.emissive = new THREE.Color( 0x000000 );\r\n\r\n\tthis.wrapAround = false;\r\n\tthis.wrapRGB = new THREE.Vector3( 1, 1, 1 );\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\tthis.morphNormals = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshLambertMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.MeshLambertMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.MeshLambertMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\tmaterial.ambient.copy( this.ambient );\r\n\tmaterial.emissive.copy( this.emissive );\r\n\r\n\tmaterial.wrapAround = this.wrapAround;\r\n\tmaterial.wrapRGB.copy( this.wrapRGB );\r\n\r\n\tmaterial.map = this.map;\r\n\r\n\tmaterial.lightMap = this.lightMap;\r\n\r\n\tmaterial.specularMap = this.specularMap;\r\n\r\n\tmaterial.envMap = this.envMap;\r\n\tmaterial.combine = this.combine;\r\n\tmaterial.reflectivity = this.reflectivity;\r\n\tmaterial.refractionRatio = this.refractionRatio;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\tmaterial.shading = this.shading;\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\tmaterial.wireframeLinecap = this.wireframeLinecap;\r\n\tmaterial.wireframeLinejoin = this.wireframeLinejoin;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.skinning = this.skinning;\r\n\tmaterial.morphTargets = this.morphTargets;\r\n\tmaterial.morphNormals = this.morphNormals;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * ambient: ,\r\n * emissive: ,\r\n * specular: ,\r\n * shininess: ,\r\n * opacity: ,\r\n *\r\n * map: new THREE.Texture( ),\r\n *\r\n * lightMap: new THREE.Texture( ),\r\n *\r\n * bumpMap: new THREE.Texture( ),\r\n * bumpScale: ,\r\n *\r\n * normalMap: new THREE.Texture( ),\r\n * normalScale: ,\r\n *\r\n * specularMap: new THREE.Texture( ),\r\n *\r\n * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\r\n * combine: THREE.Multiply,\r\n * reflectivity: ,\r\n * refractionRatio: ,\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.MeshPhongMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff ); // diffuse\r\n\tthis.ambient = new THREE.Color( 0xffffff );\r\n\tthis.emissive = new THREE.Color( 0x000000 );\r\n\tthis.specular = new THREE.Color( 0x111111 );\r\n\tthis.shininess = 30;\r\n\r\n\tthis.metal = false;\r\n\tthis.perPixel = true;\r\n\r\n\tthis.wrapAround = false;\r\n\tthis.wrapRGB = new THREE.Vector3( 1, 1, 1 );\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.lightMap = null;\r\n\r\n\tthis.bumpMap = null;\r\n\tthis.bumpScale = 1;\r\n\r\n\tthis.normalMap = null;\r\n\tthis.normalScale = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.specularMap = null;\r\n\r\n\tthis.envMap = null;\r\n\tthis.combine = THREE.MultiplyOperation;\r\n\tthis.reflectivity = 1;\r\n\tthis.refractionRatio = 0.98;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\tthis.wireframeLinecap = 'round';\r\n\tthis.wireframeLinejoin = 'round';\r\n\r\n\tthis.vertexColors = THREE.NoColors;\r\n\r\n\tthis.skinning = false;\r\n\tthis.morphTargets = false;\r\n\tthis.morphNormals = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshPhongMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.MeshPhongMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.MeshPhongMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\tmaterial.ambient.copy( this.ambient );\r\n\tmaterial.emissive.copy( this.emissive );\r\n\tmaterial.specular.copy( this.specular );\r\n\tmaterial.shininess = this.shininess;\r\n\r\n\tmaterial.metal = this.metal;\r\n\tmaterial.perPixel = this.perPixel;\r\n\r\n\tmaterial.wrapAround = this.wrapAround;\r\n\tmaterial.wrapRGB.copy( this.wrapRGB );\r\n\r\n\tmaterial.map = this.map;\r\n\r\n\tmaterial.lightMap = this.lightMap;\r\n\r\n\tmaterial.bumpMap = this.bumpMap;\r\n\tmaterial.bumpScale = this.bumpScale;\r\n\r\n\tmaterial.normalMap = this.normalMap;\r\n\tmaterial.normalScale.copy( this.normalScale );\r\n\r\n\tmaterial.specularMap = this.specularMap;\r\n\r\n\tmaterial.envMap = this.envMap;\r\n\tmaterial.combine = this.combine;\r\n\tmaterial.reflectivity = this.reflectivity;\r\n\tmaterial.refractionRatio = this.refractionRatio;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\tmaterial.shading = this.shading;\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\tmaterial.wireframeLinecap = this.wireframeLinecap;\r\n\tmaterial.wireframeLinejoin = this.wireframeLinejoin;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.skinning = this.skinning;\r\n\tmaterial.morphTargets = this.morphTargets;\r\n\tmaterial.morphNormals = this.morphNormals;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * opacity: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: \r\n * }\r\n */\r\n\r\nTHREE.MeshDepthMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshDepthMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.MeshDepthMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.MeshDepthMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n *\r\n * parameters = {\r\n * opacity: ,\r\n *\r\n * shading: THREE.FlatShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: \r\n * }\r\n */\r\n\r\nTHREE.MeshNormalMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this, parameters );\r\n\r\n\tthis.shading = THREE.FlatShading;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.morphTargets = false;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.MeshNormalMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.MeshNormalMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.MeshNormalMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.shading = this.shading;\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.MeshFaceMaterial = function ( materials ) {\r\n\r\n\tthis.materials = materials instanceof Array ? materials : [];\r\n\r\n};\r\n\r\nTHREE.MeshFaceMaterial.prototype.clone = function () {\r\n\r\n\treturn new THREE.MeshFaceMaterial( this.materials.slice( 0 ) );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n * size: ,\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * vertexColors: ,\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.ParticleBasicMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\r\n\tthis.map = null;\r\n\r\n\tthis.size = 1;\r\n\tthis.sizeAttenuation = true;\r\n\r\n\tthis.vertexColors = false;\r\n\r\n\tthis.fog = true;\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.ParticleBasicMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.ParticleBasicMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.ParticleBasicMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\r\n\tmaterial.map = this.map;\r\n\r\n\tmaterial.size = this.size;\r\n\tmaterial.sizeAttenuation = this.sizeAttenuation;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * program: ,\r\n * opacity: ,\r\n * blending: THREE.NormalBlending\r\n * }\r\n */\r\n\r\nTHREE.ParticleCanvasMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\tthis.program = function ( context, color ) {};\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.ParticleCanvasMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.ParticleCanvasMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.ParticleCanvasMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\tmaterial.program = this.program;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * fragmentShader: ,\r\n * vertexShader: ,\r\n *\r\n * uniforms: { \"parameter1\": { type: \"f\", value: 1.0 }, \"parameter2\": { type: \"i\" value2: 2 } },\r\n *\r\n * defines: { \"label\" : \"value\" },\r\n *\r\n * shading: THREE.SmoothShading,\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * wireframe: ,\r\n * wireframeLinewidth: ,\r\n *\r\n * lights: ,\r\n *\r\n * vertexColors: THREE.NoColors / THREE.VertexColors / THREE.FaceColors,\r\n *\r\n * skinning: ,\r\n * morphTargets: ,\r\n * morphNormals: ,\r\n *\r\n *\tfog: \r\n * }\r\n */\r\n\r\nTHREE.ShaderMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\tthis.fragmentShader = \"void main() {}\";\r\n\tthis.vertexShader = \"void main() {}\";\r\n\tthis.uniforms = {};\r\n\tthis.defines = {};\r\n\tthis.attributes = null;\r\n\r\n\tthis.shading = THREE.SmoothShading;\r\n\r\n\tthis.linewidth = 1;\r\n\r\n\tthis.wireframe = false;\r\n\tthis.wireframeLinewidth = 1;\r\n\r\n\tthis.fog = false; // set to use scene fog\r\n\r\n\tthis.lights = false; // set to use scene lights\r\n\r\n\tthis.vertexColors = THREE.NoColors; // set to use \"color\" attribute stream\r\n\r\n\tthis.skinning = false; // set to use skinning attribute streams\r\n\r\n\tthis.morphTargets = false; // set to use morph targets\r\n\tthis.morphNormals = false; // set to use morph normals\r\n\r\n\tthis.setValues( parameters );\r\n\r\n};\r\n\r\nTHREE.ShaderMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.ShaderMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.ShaderMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.fragmentShader = this.fragmentShader;\r\n\tmaterial.vertexShader = this.vertexShader;\r\n\r\n\tmaterial.uniforms = THREE.UniformsUtils.clone( this.uniforms );\r\n\r\n\tmaterial.attributes = this.attributes;\r\n\tmaterial.defines = this.defines;\r\n\r\n\tmaterial.shading = this.shading;\r\n\r\n\tmaterial.wireframe = this.wireframe;\r\n\tmaterial.wireframeLinewidth = this.wireframeLinewidth;\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\tmaterial.lights = this.lights;\r\n\r\n\tmaterial.vertexColors = this.vertexColors;\r\n\r\n\tmaterial.skinning = this.skinning;\r\n\r\n\tmaterial.morphTargets = this.morphTargets;\r\n\tmaterial.morphNormals = this.morphNormals;\r\n\r\n\treturn material;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * parameters = {\r\n * color: ,\r\n * opacity: ,\r\n * map: new THREE.Texture( ),\r\n *\r\n * blending: THREE.NormalBlending,\r\n * depthTest: ,\r\n * depthWrite: ,\r\n *\r\n * useScreenCoordinates: ,\r\n * sizeAttenuation: ,\r\n * scaleByViewport: ,\r\n * alignment: THREE.SpriteAlignment.center,\r\n *\r\n *\tuvOffset: new THREE.Vector2(),\r\n *\tuvScale: new THREE.Vector2(),\r\n *\r\n * fog: \r\n * }\r\n */\r\n\r\nTHREE.SpriteMaterial = function ( parameters ) {\r\n\r\n\tTHREE.Material.call( this );\r\n\r\n\t// defaults\r\n\r\n\tthis.color = new THREE.Color( 0xffffff );\r\n\tthis.map = new THREE.Texture();\r\n\r\n\tthis.useScreenCoordinates = true;\r\n\tthis.depthTest = !this.useScreenCoordinates;\r\n\tthis.sizeAttenuation = !this.useScreenCoordinates;\r\n\tthis.scaleByViewport = !this.sizeAttenuation;\r\n\tthis.alignment = THREE.SpriteAlignment.center.clone();\r\n\r\n\tthis.fog = false;\r\n\r\n\tthis.uvOffset = new THREE.Vector2( 0, 0 );\r\n\tthis.uvScale = new THREE.Vector2( 1, 1 );\r\n\r\n\t// set parameters\r\n\r\n\tthis.setValues( parameters );\r\n\r\n\t// override coupled defaults if not specified explicitly by parameters\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tif ( parameters.depthTest === undefined ) this.depthTest = !this.useScreenCoordinates;\r\n\tif ( parameters.sizeAttenuation === undefined ) this.sizeAttenuation = !this.useScreenCoordinates;\r\n\tif ( parameters.scaleByViewport === undefined ) this.scaleByViewport = !this.sizeAttenuation;\r\n\r\n};\r\n\r\nTHREE.SpriteMaterial.prototype = Object.create( THREE.Material.prototype );\r\n\r\nTHREE.SpriteMaterial.prototype.clone = function () {\r\n\r\n\tvar material = new THREE.SpriteMaterial();\r\n\r\n\tTHREE.Material.prototype.clone.call( this, material );\r\n\r\n\tmaterial.color.copy( this.color );\r\n\tmaterial.map = this.map;\r\n\r\n\tmaterial.useScreenCoordinates = this.useScreenCoordinates;\r\n\tmaterial.sizeAttenuation = this.sizeAttenuation;\r\n\tmaterial.scaleByViewport = this.scaleByViewport;\r\n\tmaterial.alignment.copy( this.alignment );\r\n\r\n\tmaterial.uvOffset.copy( this.uvOffset );\r\n\tmaterial.uvScale.copy( this.uvScale );\r\n\r\n\tmaterial.fog = this.fog;\r\n\r\n\treturn material;\r\n\r\n};\r\n\r\n// Alignment enums\r\n\r\nTHREE.SpriteAlignment = {};\r\nTHREE.SpriteAlignment.topLeft = new THREE.Vector2( 1, -1 );\r\nTHREE.SpriteAlignment.topCenter = new THREE.Vector2( 0, -1 );\r\nTHREE.SpriteAlignment.topRight = new THREE.Vector2( -1, -1 );\r\nTHREE.SpriteAlignment.centerLeft = new THREE.Vector2( 1, 0 );\r\nTHREE.SpriteAlignment.center = new THREE.Vector2( 0, 0 );\r\nTHREE.SpriteAlignment.centerRight = new THREE.Vector2( -1, 0 );\r\nTHREE.SpriteAlignment.bottomLeft = new THREE.Vector2( 1, 1 );\r\nTHREE.SpriteAlignment.bottomCenter = new THREE.Vector2( 0, 1 );\r\nTHREE.SpriteAlignment.bottomRight = new THREE.Vector2( -1, 1 );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author szimek / https://github.com/szimek/\r\n */\r\n\r\nTHREE.Texture = function ( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\r\n\r\n\tthis.id = THREE.TextureIdCount ++;\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.image = image;\r\n\tthis.mipmaps = [];\r\n\r\n\tthis.mapping = mapping !== undefined ? mapping : new THREE.UVMapping();\r\n\r\n\tthis.wrapS = wrapS !== undefined ? wrapS : THREE.ClampToEdgeWrapping;\r\n\tthis.wrapT = wrapT !== undefined ? wrapT : THREE.ClampToEdgeWrapping;\r\n\r\n\tthis.magFilter = magFilter !== undefined ? magFilter : THREE.LinearFilter;\r\n\tthis.minFilter = minFilter !== undefined ? minFilter : THREE.LinearMipMapLinearFilter;\r\n\r\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\r\n\r\n\tthis.format = format !== undefined ? format : THREE.RGBAFormat;\r\n\tthis.type = type !== undefined ? type : THREE.UnsignedByteType;\r\n\r\n\tthis.offset = new THREE.Vector2( 0, 0 );\r\n\tthis.repeat = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.generateMipmaps = true;\r\n\tthis.premultiplyAlpha = false;\r\n\tthis.flipY = true;\r\n\tthis.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\r\n\r\n\tthis.needsUpdate = false;\r\n\tthis.onUpdate = null;\r\n\r\n};\r\n\r\nTHREE.Texture.prototype = {\r\n\r\n\tconstructor: THREE.Texture,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tclone: function ( texture ) {\r\n\r\n\t\tif ( texture === undefined ) texture = new THREE.Texture();\r\n\r\n\t\ttexture.image = this.image;\r\n\t\ttexture.mipmaps = this.mipmaps.slice(0);\r\n\r\n\t\ttexture.mapping = this.mapping;\r\n\r\n\t\ttexture.wrapS = this.wrapS;\r\n\t\ttexture.wrapT = this.wrapT;\r\n\r\n\t\ttexture.magFilter = this.magFilter;\r\n\t\ttexture.minFilter = this.minFilter;\r\n\r\n\t\ttexture.anisotropy = this.anisotropy;\r\n\r\n\t\ttexture.format = this.format;\r\n\t\ttexture.type = this.type;\r\n\r\n\t\ttexture.offset.copy( this.offset );\r\n\t\ttexture.repeat.copy( this.repeat );\r\n\r\n\t\ttexture.generateMipmaps = this.generateMipmaps;\r\n\t\ttexture.premultiplyAlpha = this.premultiplyAlpha;\r\n\t\ttexture.flipY = this.flipY;\r\n\t\ttexture.unpackAlignment = this.unpackAlignment;\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.TextureIdCount = 0;\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.CompressedTexture = function ( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) {\r\n\r\n\tTHREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\r\n\r\n\tthis.image = { width: width, height: height };\r\n\tthis.mipmaps = mipmaps;\r\n\r\n\tthis.generateMipmaps = false; // WebGL currently can't generate mipmaps for compressed textures, they must be embedded in DDS file\r\n\r\n};\r\n\r\nTHREE.CompressedTexture.prototype = Object.create( THREE.Texture.prototype );\r\n\r\nTHREE.CompressedTexture.prototype.clone = function () {\r\n\r\n\tvar texture = new THREE.CompressedTexture();\r\n\r\n\tTHREE.Texture.prototype.clone.call( this, texture );\r\n\r\n\treturn texture;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.DataTexture = function ( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy ) {\r\n\r\n\tTHREE.Texture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\r\n\r\n\tthis.image = { data: data, width: width, height: height };\r\n\r\n};\r\n\r\nTHREE.DataTexture.prototype = Object.create( THREE.Texture.prototype );\r\n\r\nTHREE.DataTexture.prototype.clone = function () {\r\n\r\n\tvar texture = new THREE.DataTexture();\r\n\r\n\tTHREE.Texture.prototype.clone.call( this, texture );\r\n\r\n\treturn texture;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Particle = function ( material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.material = material;\r\n\r\n};\r\n\r\nTHREE.Particle.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Particle.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.Particle( this.material );\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.ParticleSystem = function ( geometry, material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.geometry = geometry;\r\n\tthis.material = ( material !== undefined ) ? material : new THREE.ParticleBasicMaterial( { color: Math.random() * 0xffffff } );\r\n\r\n\tthis.sortParticles = false;\r\n\r\n\tif ( this.geometry ) {\r\n\r\n\t\t// calc bound radius\r\n\r\n\t\tif( this.geometry.boundingSphere === null ) {\r\n\r\n\t\t\tthis.geometry.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.frustumCulled = false;\r\n\r\n};\r\n\r\nTHREE.ParticleSystem.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.ParticleSystem.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.ParticleSystem( this.geometry, this.material );\r\n\tobject.sortParticles = this.sortParticles;\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Line = function ( geometry, material, type ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.geometry = geometry;\r\n\tthis.material = ( material !== undefined ) ? material : new THREE.LineBasicMaterial( { color: Math.random() * 0xffffff } );\r\n\tthis.type = ( type !== undefined ) ? type : THREE.LineStrip;\r\n\r\n\tif ( this.geometry ) {\r\n\r\n\t\tif ( ! this.geometry.boundingSphere ) {\r\n\r\n\t\t\tthis.geometry.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.LineStrip = 0;\r\nTHREE.LinePieces = 1;\r\n\r\nTHREE.Line.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Line.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.Line( this.geometry, this.material, this.type );\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author jonobr1 / http://jonobr1.com/\r\n */\r\n\r\nTHREE.Mesh = function ( geometry, material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.geometry = null;\r\n\tthis.material = null;\r\n\r\n\tthis.setGeometry( geometry );\r\n\tthis.setMaterial( material );\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Mesh.prototype.setGeometry = function ( geometry ) {\r\n\r\n\tif ( geometry !== undefined ) {\r\n\r\n\t\tthis.geometry = geometry;\r\n\r\n\t\tif ( this.geometry.boundingSphere === null ) {\r\n\r\n\t\t\tthis.geometry.computeBoundingSphere();\r\n\r\n\t\t}\r\n\r\n\t\tthis.updateMorphTargets();\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.setMaterial = function ( material ) {\r\n\r\n\tif ( material !== undefined ) {\r\n\r\n\t\tthis.material = material;\r\n\r\n\t} else {\r\n\r\n\t\tthis.material = new THREE.MeshBasicMaterial( { color: Math.random() * 0xffffff, wireframe: true } );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.updateMorphTargets = function () {\r\n\r\n\tif ( this.geometry.morphTargets.length > 0 ) {\r\n\r\n\t\tthis.morphTargetBase = -1;\r\n\t\tthis.morphTargetForcedOrder = [];\r\n\t\tthis.morphTargetInfluences = [];\r\n\t\tthis.morphTargetDictionary = {};\r\n\r\n\t\tfor ( var m = 0, ml = this.geometry.morphTargets.length; m < ml; m ++ ) {\r\n\r\n\t\t\tthis.morphTargetInfluences.push( 0 );\r\n\t\t\tthis.morphTargetDictionary[ this.geometry.morphTargets[ m ].name ] = m;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.getMorphTargetIndexByName = function ( name ) {\r\n\r\n\tif ( this.morphTargetDictionary[ name ] !== undefined ) {\r\n\r\n\t\treturn this.morphTargetDictionary[ name ];\r\n\r\n\t}\r\n\r\n\tconsole.log( \"THREE.Mesh.getMorphTargetIndexByName: morph target \" + name + \" does not exist. Returning 0.\" );\r\n\r\n\treturn 0;\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.Mesh( this.geometry, this.material );\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n\r\nTHREE.Mesh.prototype.bakeTransform = function () {\r\n\r\n\t// NOTE: this does not bake transform into child nodes\r\n\r\n\t// this is a trick to bake the transform in the resulting merged geometry.\r\n\tvar tempGeometry = new THREE.Geometry();\r\n\tTHREE.GeometryUtils.merge( tempGeometry, this );\r\n\tthis.setGeometry( tempGeometry );\r\n\r\n\t/*this.updateMatrix();\r\n\tthis.updateMatrixWorld();\r\n\tthis.geometry.applyMatrix( this.matrix );*/\r\n\r\n\t// reset transform to identify after baking.\r\n\tthis.position.set( 0, 0, 0 );\r\n\tthis.rotation.set( 0, 0, 0 );\r\n\tthis.quaternion.set( 0, 0, 0, 1 );\r\n\tthis.scale.set( 1, 1, 1 );\r\n\tthis.matrix.identity();\r\n\tthis.updateMatrixWorld( true );\r\n\r\n};/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Bone = function( belongsToSkin ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.skin = belongsToSkin;\r\n\tthis.skinMatrix = new THREE.Matrix4();\r\n\r\n};\r\n\r\nTHREE.Bone.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Bone.prototype.update = function ( parentSkinMatrix, forceUpdate ) {\r\n\r\n\t// update local\r\n\r\n\tif ( this.matrixAutoUpdate ) {\r\n\r\n\t\tforceUpdate |= this.updateMatrix();\r\n\r\n\t}\r\n\r\n\t// update skin matrix\r\n\r\n\tif ( forceUpdate || this.matrixWorldNeedsUpdate ) {\r\n\r\n\t\tif( parentSkinMatrix ) {\r\n\r\n\t\t\tthis.skinMatrix.multiplyMatrices( parentSkinMatrix, this.matrix );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.skinMatrix.copy( this.matrix );\r\n\r\n\t\t}\r\n\r\n\t\tthis.matrixWorldNeedsUpdate = false;\r\n\t\tforceUpdate = true;\r\n\r\n\t}\r\n\r\n\t// update children\r\n\r\n\tvar child, i, l = this.children.length;\r\n\r\n\tfor ( i = 0; i < l; i ++ ) {\r\n\r\n\t\tthis.children[ i ].update( this.skinMatrix, forceUpdate );\r\n\r\n\t}\r\n\r\n};\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SkinnedMesh = function ( geometry, material, useVertexTexture ) {\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\t//\r\n\r\n\tthis.useVertexTexture = useVertexTexture !== undefined ? useVertexTexture : true;\r\n\r\n\t// init bones\r\n\r\n\tthis.identityMatrix = new THREE.Matrix4();\r\n\r\n\tthis.bones = [];\r\n\tthis.boneMatrices = [];\r\n\r\n\tvar b, bone, gbone, p, q, s;\r\n\r\n\tif ( this.geometry && this.geometry.bones !== undefined ) {\r\n\r\n\t\tfor ( b = 0; b < this.geometry.bones.length; b ++ ) {\r\n\r\n\t\t\tgbone = this.geometry.bones[ b ];\r\n\r\n\t\t\tp = gbone.pos;\r\n\t\t\tq = gbone.rotq;\r\n\t\t\ts = gbone.scl;\r\n\r\n\t\t\tbone = this.addBone();\r\n\r\n\t\t\tbone.name = gbone.name;\r\n\t\t\tbone.position.set( p[0], p[1], p[2] );\r\n\t\t\tbone.quaternion.set( q[0], q[1], q[2], q[3] );\r\n\t\t\tbone.useQuaternion = true;\r\n\r\n\t\t\tif ( s !== undefined ) {\r\n\r\n\t\t\t\tbone.scale.set( s[0], s[1], s[2] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbone.scale.set( 1, 1, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( b = 0; b < this.bones.length; b ++ ) {\r\n\r\n\t\t\tgbone = this.geometry.bones[ b ];\r\n\t\t\tbone = this.bones[ b ];\r\n\r\n\t\t\tif ( gbone.parent === -1 ) {\r\n\r\n\t\t\t\tthis.add( bone );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.bones[ gbone.parent ].add( bone );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t//\r\n\r\n\t\tvar nBones = this.bones.length;\r\n\r\n\t\tif ( this.useVertexTexture ) {\r\n\r\n\t\t\t// layout (1 matrix = 4 pixels)\r\n\t\t\t//\tRGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\r\n\t\t\t// with 8x8 pixel texture max 16 bones (8 * 8 / 4)\r\n\t\t\t// \t 16x16 pixel texture max 64 bones (16 * 16 / 4)\r\n\t\t\t// \t 32x32 pixel texture max 256 bones (32 * 32 / 4)\r\n\t\t\t// \t 64x64 pixel texture max 1024 bones (64 * 64 / 4)\r\n\r\n\t\t\tvar size;\r\n\r\n\t\t\tif ( nBones > 256 )\r\n\t\t\t\tsize = 64;\r\n\t\t\telse if ( nBones > 64 )\r\n\t\t\t\tsize = 32;\r\n\t\t\telse if ( nBones > 16 )\r\n\t\t\t\tsize = 16;\r\n\t\t\telse\r\n\t\t\t\tsize = 8;\r\n\r\n\t\t\tthis.boneTextureWidth = size;\r\n\t\t\tthis.boneTextureHeight = size;\r\n\r\n\t\t\tthis.boneMatrices = new Float32Array( this.boneTextureWidth * this.boneTextureHeight * 4 ); // 4 floats per RGBA pixel\r\n\t\t\tthis.boneTexture = new THREE.DataTexture( this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, THREE.RGBAFormat, THREE.FloatType );\r\n\t\t\tthis.boneTexture.minFilter = THREE.NearestFilter;\r\n\t\t\tthis.boneTexture.magFilter = THREE.NearestFilter;\r\n\t\t\tthis.boneTexture.generateMipmaps = false;\r\n\t\t\tthis.boneTexture.flipY = false;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.boneMatrices = new Float32Array( 16 * nBones );\r\n\r\n\t\t}\r\n\r\n\t\tthis.pose();\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype = Object.create( THREE.Mesh.prototype );\r\n\r\nTHREE.SkinnedMesh.prototype.addBone = function( bone ) {\r\n\r\n\tif ( bone === undefined ) {\r\n\r\n\t\tbone = new THREE.Bone( this );\r\n\r\n\t}\r\n\r\n\tthis.bones.push( bone );\r\n\r\n\treturn bone;\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.updateMatrixWorld = function ( force ) {\r\n\r\n\tthis.matrixAutoUpdate && this.updateMatrix();\r\n\r\n\t// update matrixWorld\r\n\r\n\tif ( this.matrixWorldNeedsUpdate || force ) {\r\n\r\n\t\tif ( this.parent ) {\r\n\r\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.matrixWorld.copy( this.matrix );\r\n\r\n\t\t}\r\n\r\n\t\tthis.matrixWorldNeedsUpdate = false;\r\n\r\n\t\tforce = true;\r\n\r\n\t}\r\n\r\n\t// update children\r\n\r\n\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\tvar child = this.children[ i ];\r\n\r\n\t\tif ( child instanceof THREE.Bone ) {\r\n\r\n\t\t\tchild.update( this.identityMatrix, false );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tchild.updateMatrixWorld( true );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// make a snapshot of the bones' rest position\r\n\r\n\tif ( this.boneInverses == undefined ) {\r\n\r\n\t\tthis.boneInverses = [];\r\n\r\n\t\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\t\tvar inverse = new THREE.Matrix4();\r\n\r\n\t\t\tinverse.getInverse( this.bones[ b ].skinMatrix );\r\n\r\n\t\t\tthis.boneInverses.push( inverse );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// flatten bone matrices to array\r\n\r\n\tfor ( var b = 0, bl = this.bones.length; b < bl; b ++ ) {\r\n\r\n\t\t// compute the offset between the current and the original transform;\r\n\r\n\t\t//TODO: we could get rid of this multiplication step if the skinMatrix\r\n\t\t// was already representing the offset; however, this requires some\r\n\t\t// major changes to the animation system\r\n\r\n\t\tTHREE.SkinnedMesh.offsetMatrix.multiplyMatrices( this.bones[ b ].skinMatrix, this.boneInverses[ b ] );\r\n\r\n\t\tTHREE.SkinnedMesh.offsetMatrix.flattenToArrayOffset( this.boneMatrices, b * 16 );\r\n\r\n\t}\r\n\r\n\tif ( this.useVertexTexture ) {\r\n\r\n\t\tthis.boneTexture.needsUpdate = true;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.pose = function () {\r\n\r\n\tthis.updateMatrixWorld( true );\r\n\r\n\tfor ( var i = 0; i < this.geometry.skinIndices.length; i ++ ) {\r\n\r\n\t\t// normalize weights\r\n\r\n\t\tvar sw = this.geometry.skinWeights[ i ];\r\n\r\n\t\tvar scale = 1.0 / sw.lengthManhattan();\r\n\r\n\t\tif ( scale !== Infinity ) {\r\n\r\n\t\t\tsw.multiplyScalar( scale );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tsw.set( 1 ); // this will be normalized by the shader anyway\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.SkinnedMesh( this.geometry, this.material, this.useVertexTexture );\r\n\r\n\tTHREE.Mesh.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n\r\nTHREE.SkinnedMesh.offsetMatrix = new THREE.Matrix4();\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.MorphAnimMesh = function ( geometry, material ) {\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\t// API\r\n\r\n\tthis.duration = 1000; // milliseconds\r\n\tthis.mirroredLoop = false;\r\n\tthis.time = 0;\r\n\r\n\t// internals\r\n\r\n\tthis.lastKeyframe = 0;\r\n\tthis.currentKeyframe = 0;\r\n\r\n\tthis.direction = 1;\r\n\tthis.directionBackwards = false;\r\n\r\n\tthis.setFrameRange( 0, this.geometry.morphTargets.length - 1 );\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype = Object.create( THREE.Mesh.prototype );\r\n\r\nTHREE.MorphAnimMesh.prototype.setFrameRange = function ( start, end ) {\r\n\r\n\tthis.startKeyframe = start;\r\n\tthis.endKeyframe = end;\r\n\r\n\tthis.length = this.endKeyframe - this.startKeyframe + 1;\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.setDirectionForward = function () {\r\n\r\n\tthis.direction = 1;\r\n\tthis.directionBackwards = false;\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.setDirectionBackward = function () {\r\n\r\n\tthis.direction = -1;\r\n\tthis.directionBackwards = true;\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.parseAnimations = function () {\r\n\r\n\tvar geometry = this.geometry;\r\n\r\n\tif ( ! geometry.animations ) geometry.animations = {};\r\n\r\n\tvar firstAnimation, animations = geometry.animations;\r\n\r\n\tvar pattern = /([a-z]+)(\\d+)/;\r\n\r\n\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\tvar parts = morph.name.match( pattern );\r\n\r\n\t\tif ( parts && parts.length > 1 ) {\r\n\r\n\t\t\tvar label = parts[ 1 ];\r\n\t\t\tvar num = parts[ 2 ];\r\n\r\n\t\t\tif ( ! animations[ label ] ) animations[ label ] = { start: Infinity, end: -Infinity };\r\n\r\n\t\t\tvar animation = animations[ label ];\r\n\r\n\t\t\tif ( i < animation.start ) animation.start = i;\r\n\t\t\tif ( i > animation.end ) animation.end = i;\r\n\r\n\t\t\tif ( ! firstAnimation ) firstAnimation = label;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgeometry.firstAnimation = firstAnimation;\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.setAnimationLabel = function ( label, start, end ) {\r\n\r\n\tif ( ! this.geometry.animations ) this.geometry.animations = {};\r\n\r\n\tthis.geometry.animations[ label ] = { start: start, end: end };\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.playAnimation = function ( label, fps ) {\r\n\r\n\tvar animation = this.geometry.animations[ label ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tthis.setFrameRange( animation.start, animation.end );\r\n\t\tthis.duration = 1000 * ( ( animation.end - animation.start ) / fps );\r\n\t\tthis.time = 0;\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( \"animation[\" + label + \"] undefined\" );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) {\r\n\r\n\tvar frameTime = this.duration / this.length;\r\n\r\n\tthis.time += this.direction * delta;\r\n\r\n\tif ( this.mirroredLoop ) {\r\n\r\n\t\tif ( this.time > this.duration || this.time < 0 ) {\r\n\r\n\t\t\tthis.direction *= -1;\r\n\r\n\t\t\tif ( this.time > this.duration ) {\r\n\r\n\t\t\t\tthis.time = this.duration;\r\n\t\t\t\tthis.directionBackwards = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( this.time < 0 ) {\r\n\r\n\t\t\t\tthis.time = 0;\r\n\t\t\t\tthis.directionBackwards = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\tthis.time = this.time % this.duration;\r\n\r\n\t\tif ( this.time < 0 ) this.time += this.duration;\r\n\r\n\t}\r\n\r\n\tvar keyframe = this.startKeyframe + THREE.Math.clamp( Math.floor( this.time / frameTime ), 0, this.length - 1 );\r\n\r\n\tif ( keyframe !== this.currentKeyframe ) {\r\n\r\n\t\tthis.morphTargetInfluences[ this.lastKeyframe ] = 0;\r\n\t\tthis.morphTargetInfluences[ this.currentKeyframe ] = 1;\r\n\r\n\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\tthis.lastKeyframe = this.currentKeyframe;\r\n\t\tthis.currentKeyframe = keyframe;\r\n\r\n\t}\r\n\r\n\tvar mix = ( this.time % frameTime ) / frameTime;\r\n\r\n\tif ( this.directionBackwards ) {\r\n\r\n\t\tmix = 1 - mix;\r\n\r\n\t}\r\n\r\n\tthis.morphTargetInfluences[ this.currentKeyframe ] = mix;\r\n\tthis.morphTargetInfluences[ this.lastKeyframe ] = 1 - mix;\r\n\r\n};\r\n\r\nTHREE.MorphAnimMesh.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.MorphAnimMesh( this.geometry, this.material );\r\n\r\n\tobject.duration = this.duration;\r\n\tobject.mirroredLoop = this.mirroredLoop;\r\n\tobject.time = this.time;\r\n\r\n\tobject.lastKeyframe = this.lastKeyframe;\r\n\tobject.currentKeyframe = this.currentKeyframe;\r\n\r\n\tobject.direction = this.direction;\r\n\tobject.directionBackwards = this.directionBackwards;\r\n\r\n\tTHREE.Mesh.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Ribbon = function ( geometry, material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.geometry = geometry;\r\n\tthis.material = material;\r\n\r\n};\r\n\r\nTHREE.Ribbon.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Ribbon.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.Ribbon( this.geometry, this.material );\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.LOD = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.objects = [];\r\n\r\n};\r\n\r\n\r\nTHREE.LOD.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.LOD.prototype.addLevel = function ( object, distance ) {\r\n\r\n\tif ( distance === undefined ) distance = 0;\r\n\r\n\tdistance = Math.abs( distance );\r\n\r\n\tfor ( var l = 0; l < this.objects.length; l ++ ) {\r\n\r\n\t\tif ( distance < this.objects[ l ].distance ) {\r\n\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.objects.splice( l, 0, { distance: distance, object: object } );\r\n\tthis.add( object );\r\n\r\n};\r\n\r\nTHREE.LOD.prototype.getObjectForDistance = function ( distance ) {\r\n\r\n\tfor ( var i = 1, l = this.objects.length; i < l; i ++ ) {\r\n\r\n\t\tif ( distance < this.objects[ i ].distance ) {\r\n\r\n\t\t\tbreak;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn this.objects[ i - 1 ].object;\r\n\r\n};\r\n\r\nTHREE.LOD.prototype.update = function () {\r\n\r\n\tvar v1 = new THREE.Vector3();\r\n\tvar v2 = new THREE.Vector3();\r\n\r\n\treturn function ( camera ) {\r\n\r\n\t\tif ( this.objects.length > 1 ) {\r\n\r\n\t\t\tv1.getPositionFromMatrix( camera.matrixWorld );\r\n\t\t\tv2.getPositionFromMatrix( this.matrixWorld );\r\n\r\n\t\t\tvar distance = v1.distanceTo( v2 );\r\n\r\n\t\t\tthis.objects[ 0 ].object.visible = true;\r\n\r\n\t\t\tfor ( var i = 1, l = this.objects.length; i < l; i ++ ) {\r\n\r\n\t\t\t\tif ( distance >= this.objects[ i ].distance ) {\r\n\r\n\t\t\t\t\tthis.objects[ i - 1 ].object.visible = false;\r\n\t\t\t\t\tthis.objects[ i ].object.visible = true;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor( ; i < l; i ++ ) {\r\n\r\n\t\t\t\tthis.objects[ i ].object.visible = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.LOD.prototype.clone = function () {\r\n\r\n\t// TODO\r\n\r\n};\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Sprite = function ( material ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.material = ( material !== undefined ) ? material : new THREE.SpriteMaterial();\r\n\r\n\tthis.rotation3d = this.rotation;\r\n\tthis.rotation = 0;\r\n\r\n};\r\n\r\nTHREE.Sprite.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\n/*\r\n * Custom update matrix\r\n */\r\n\r\nTHREE.Sprite.prototype.updateMatrix = function () {\r\n\r\n\tthis.rotation3d.set( 0, 0, this.rotation );\r\n\tthis.quaternion.setFromEuler( this.rotation3d, this.eulerOrder );\r\n\tthis.matrix.makeFromPositionQuaternionScale( this.position, this.quaternion, this.scale );\r\n\r\n\tthis.matrixWorldNeedsUpdate = true;\r\n\r\n};\r\n\r\nTHREE.Sprite.prototype.clone = function ( object ) {\r\n\r\n\tif ( object === undefined ) object = new THREE.Sprite( this.material );\r\n\r\n\tTHREE.Object3D.prototype.clone.call( this, object );\r\n\r\n\treturn object;\r\n\r\n};\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.Scene = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.fog = null;\r\n\tthis.overrideMaterial = null;\r\n\r\n\tthis.autoUpdate = true; // checked by the renderer\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.__objects = [];\r\n\tthis.__lights = [];\r\n\r\n\tthis.__objectsAdded = [];\r\n\tthis.__objectsRemoved = [];\r\n\r\n};\r\n\r\nTHREE.Scene.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Scene.prototype.__addObject = function ( object ) {\r\n\r\n\tif ( object instanceof THREE.Light ) {\r\n\r\n\t\tif ( this.__lights.indexOf( object ) === - 1 ) {\r\n\r\n\t\t\tthis.__lights.push( object );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.target && object.target.parent === undefined ) {\r\n\r\n\t\t\tthis.add( object.target );\r\n\r\n\t\t}\r\n\r\n\t} else if ( !( object instanceof THREE.Camera || object instanceof THREE.Bone ) ) {\r\n\r\n\t\tif ( this.__objects.indexOf( object ) === - 1 ) {\r\n\r\n\t\t\tthis.__objects.push( object );\r\n\t\t\tthis.__objectsAdded.push( object );\r\n\r\n\t\t\t// check if previously removed\r\n\r\n\t\t\tvar i = this.__objectsRemoved.indexOf( object );\r\n\r\n\t\t\tif ( i !== -1 ) {\r\n\r\n\t\t\t\tthis.__objectsRemoved.splice( i, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( var c = 0; c < object.children.length; c ++ ) {\r\n\r\n\t\tthis.__addObject( object.children[ c ] );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Scene.prototype.__removeObject = function ( object ) {\r\n\r\n\tif ( object instanceof THREE.Light ) {\r\n\r\n\t\tvar i = this.__lights.indexOf( object );\r\n\r\n\t\tif ( i !== -1 ) {\r\n\r\n\t\t\tthis.__lights.splice( i, 1 );\r\n\r\n\t\t}\r\n\r\n\t} else if ( !( object instanceof THREE.Camera ) ) {\r\n\r\n\t\tvar i = this.__objects.indexOf( object );\r\n\r\n\t\tif( i !== -1 ) {\r\n\r\n\t\t\tthis.__objects.splice( i, 1 );\r\n\t\t\tthis.__objectsRemoved.push( object );\r\n\r\n\t\t\t// check if previously added\r\n\r\n\t\t\tvar ai = this.__objectsAdded.indexOf( object );\r\n\r\n\t\t\tif ( ai !== -1 ) {\r\n\r\n\t\t\t\tthis.__objectsAdded.splice( ai, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( var c = 0; c < object.children.length; c ++ ) {\r\n\r\n\t\tthis.__removeObject( object.children[ c ] );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Fog = function ( hex, near, far ) {\r\n\r\n\tthis.name = '';\r\n\r\n\tthis.color = new THREE.Color( hex );\r\n\r\n\tthis.near = ( near !== undefined ) ? near : 1;\r\n\tthis.far = ( far !== undefined ) ? far : 1000;\r\n\r\n};\r\n\r\nTHREE.Fog.prototype.clone = function () {\r\n\r\n\treturn new THREE.Fog( this.color.getHex(), this.near, this.far );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.FogExp2 = function ( hex, density ) {\r\n\r\n\tthis.name = '';\r\n\tthis.color = new THREE.Color( hex );\r\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\r\n\r\n};\r\n\r\nTHREE.FogExp2.prototype.clone = function () {\r\n\r\n\treturn new THREE.FogExp2( this.color.getHex(), this.density );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CanvasRenderer = function ( parameters ) {\r\n\r\n\tconsole.log( 'THREE.CanvasRenderer', THREE.REVISION );\r\n\r\n\tvar smoothstep = THREE.Math.smoothstep;\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar _this = this,\r\n\t_renderData, _elements, _lights,\r\n\t_projector = new THREE.Projector(),\r\n\r\n\t_canvas = parameters.canvas !== undefined\r\n\t\t\t? parameters.canvas\r\n\t\t\t: document.createElement( 'canvas' ),\r\n\r\n\t_canvasWidth, _canvasHeight, _canvasWidthHalf, _canvasHeightHalf,\r\n\t_context = _canvas.getContext( '2d' ),\r\n\r\n\t_clearColor = new THREE.Color( 0x000000 ),\r\n\t_clearAlpha = 0,\r\n\r\n\t_contextGlobalAlpha = 1,\r\n\t_contextGlobalCompositeOperation = 0,\r\n\t_contextStrokeStyle = null,\r\n\t_contextFillStyle = null,\r\n\t_contextLineWidth = null,\r\n\t_contextLineCap = null,\r\n\t_contextLineJoin = null,\r\n\t_contextDashSize = null,\r\n\t_contextGapSize = 0,\r\n\r\n\t_camera,\r\n\r\n\t_v1, _v2, _v3, _v4,\r\n\t_v5 = new THREE.RenderableVertex(),\r\n\t_v6 = new THREE.RenderableVertex(),\r\n\r\n\t_v1x, _v1y, _v2x, _v2y, _v3x, _v3y,\r\n\t_v4x, _v4y, _v5x, _v5y, _v6x, _v6y,\r\n\r\n\t_color = new THREE.Color(),\r\n\t_color1 = new THREE.Color(),\r\n\t_color2 = new THREE.Color(),\r\n\t_color3 = new THREE.Color(),\r\n\t_color4 = new THREE.Color(),\r\n\r\n\t_diffuseColor = new THREE.Color(),\r\n\t_emissiveColor = new THREE.Color(),\r\n\r\n\t_lightColor = new THREE.Color(),\r\n\r\n\t_patterns = {}, _imagedatas = {},\r\n\r\n\t_near, _far,\r\n\r\n\t_image, _uvs,\r\n\t_uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y,\r\n\r\n\t_clipBox = new THREE.Box2(),\r\n\t_clearBox = new THREE.Box2(),\r\n\t_elemBox = new THREE.Box2(),\r\n\r\n\t_ambientLight = new THREE.Color(),\r\n\t_directionalLights = new THREE.Color(),\r\n\t_pointLights = new THREE.Color(),\r\n\r\n\t_vector3 = new THREE.Vector3(), // Needed for PointLight\r\n\r\n\t_pixelMap, _pixelMapContext, _pixelMapImage, _pixelMapData,\r\n\t_gradientMap, _gradientMapContext, _gradientMapQuality = 16;\r\n\r\n\t_pixelMap = document.createElement( 'canvas' );\r\n\t_pixelMap.width = _pixelMap.height = 2;\r\n\r\n\t_pixelMapContext = _pixelMap.getContext( '2d' );\r\n\t_pixelMapContext.fillStyle = 'rgba(0,0,0,1)';\r\n\t_pixelMapContext.fillRect( 0, 0, 2, 2 );\r\n\r\n\t_pixelMapImage = _pixelMapContext.getImageData( 0, 0, 2, 2 );\r\n\t_pixelMapData = _pixelMapImage.data;\r\n\r\n\t_gradientMap = document.createElement( 'canvas' );\r\n\t_gradientMap.width = _gradientMap.height = _gradientMapQuality;\r\n\r\n\t_gradientMapContext = _gradientMap.getContext( '2d' );\r\n\t_gradientMapContext.translate( - _gradientMapQuality / 2, - _gradientMapQuality / 2 );\r\n\t_gradientMapContext.scale( _gradientMapQuality, _gradientMapQuality );\r\n\r\n\t_gradientMapQuality --; // Fix UVs\r\n\r\n\t// dash+gap fallbacks for Firefox and everything else\r\n\r\n\tif ( _context.setLineDash === undefined ) {\r\n\r\n\t\tif ( _context.mozDash !== undefined ) {\r\n\r\n\t\t\t_context.setLineDash = function ( values ) {\r\n\r\n\t\t\t\t_context.mozDash = values[ 0 ] !== null ? values : null;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_context.setLineDash = function () {}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.domElement = _canvas;\r\n\r\n\tthis.devicePixelRatio = parameters.devicePixelRatio !== undefined\r\n\t\t\t\t? parameters.devicePixelRatio\r\n\t\t\t\t: window.devicePixelRatio !== undefined\r\n\t\t\t\t\t? window.devicePixelRatio\r\n\t\t\t\t\t: 1;\r\n\r\n\tthis.autoClear = true;\r\n\tthis.sortObjects = true;\r\n\tthis.sortElements = true;\r\n\r\n\tthis.info = {\r\n\r\n\t\trender: {\r\n\r\n\t\t\tvertices: 0,\r\n\t\t\tfaces: 0\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// WebGLRenderer compatibility\r\n\r\n\tthis.supportsVertexTextures = function () {};\r\n\tthis.setFaceCulling = function () {};\r\n\r\n\tthis.setSize = function ( width, height, updateStyle ) {\r\n\r\n\t\t_canvasWidth = width * this.devicePixelRatio;\r\n\t\t_canvasHeight = height * this.devicePixelRatio;\r\n\r\n\t\t_canvasWidthHalf = Math.floor( _canvasWidth / 2 );\r\n\t\t_canvasHeightHalf = Math.floor( _canvasHeight / 2 );\r\n\r\n\t\t_canvas.width = _canvasWidth;\r\n\t\t_canvas.height = _canvasHeight;\r\n\r\n\t\tif ( this.devicePixelRatio !== 1 && updateStyle !== false ) {\r\n\r\n\t\t\t_canvas.style.width = width + 'px';\r\n\t\t\t_canvas.style.height = height + 'px';\r\n\r\n\t\t}\r\n\r\n\t\t_clipBox.set(\r\n\t\t\tnew THREE.Vector2( - _canvasWidthHalf, - _canvasHeightHalf ),\r\n\t\t\tnew THREE.Vector2( _canvasWidthHalf, _canvasHeightHalf )\r\n\t\t);\r\n\r\n\t\t_clearBox.set(\r\n\t\t\tnew THREE.Vector2( - _canvasWidthHalf, - _canvasHeightHalf ),\r\n\t\t\tnew THREE.Vector2( _canvasWidthHalf, _canvasHeightHalf )\r\n\t\t);\r\n\r\n\t\t_contextGlobalAlpha = 1;\r\n\t\t_contextGlobalCompositeOperation = 0;\r\n\t\t_contextStrokeStyle = null;\r\n\t\t_contextFillStyle = null;\r\n\t\t_contextLineWidth = null;\r\n\t\t_contextLineCap = null;\r\n\t\t_contextLineJoin = null;\r\n\r\n\t};\r\n\r\n\tthis.setClearColor = function ( color, alpha ) {\r\n\r\n\t\t_clearColor.set( color );\r\n\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\r\n\r\n\t\t_clearBox.set(\r\n\t\t\tnew THREE.Vector2( - _canvasWidthHalf, - _canvasHeightHalf ),\r\n\t\t\tnew THREE.Vector2( _canvasWidthHalf, _canvasHeightHalf )\r\n\t\t);\r\n\r\n\t};\r\n\r\n\tthis.setClearColorHex = function ( hex, alpha ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.' );\r\n\t\tthis.setClearColor( hex, alpha );\r\n\r\n\t};\r\n\r\n\tthis.getMaxAnisotropy = function () {\r\n\r\n\t\treturn 0;\r\n\r\n\t};\r\n\r\n\tthis.clear = function () {\r\n\r\n\t\t_context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );\r\n\r\n\t\tif ( _clearBox.empty() === false ) {\r\n\r\n\t\t\t_clearBox.intersect( _clipBox );\r\n\t\t\t_clearBox.expandByScalar( 2 );\r\n\r\n\t\t\tif ( _clearAlpha < 1 ) {\r\n\r\n\t\t\t\t_context.clearRect(\r\n\t\t\t\t\t_clearBox.min.x | 0,\r\n\t\t\t\t\t_clearBox.min.y | 0,\r\n\t\t\t\t\t( _clearBox.max.x - _clearBox.min.x ) | 0,\r\n\t\t\t\t\t( _clearBox.max.y - _clearBox.min.y ) | 0\r\n\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( _clearAlpha > 0 ) {\r\n\r\n\t\t\t\tsetBlending( THREE.NormalBlending );\r\n\t\t\t\tsetOpacity( 1 );\r\n\r\n\t\t\t\tsetFillStyle( 'rgba(' + Math.floor( _clearColor.r * 255 ) + ',' + Math.floor( _clearColor.g * 255 ) + ',' + Math.floor( _clearColor.b * 255 ) + ',' + _clearAlpha + ')' );\r\n\r\n\t\t\t\t_context.fillRect(\r\n\t\t\t\t\t_clearBox.min.x | 0,\r\n\t\t\t\t\t_clearBox.min.y | 0,\r\n\t\t\t\t\t( _clearBox.max.x - _clearBox.min.x ) | 0,\r\n\t\t\t\t\t( _clearBox.max.y - _clearBox.min.y ) | 0\r\n\t\t\t\t);\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_clearBox.makeEmpty();\r\n\r\n\t\t}\r\n\r\n\r\n\t};\r\n\r\n\tthis.render = function ( scene, camera ) {\r\n\r\n\t\tif ( camera instanceof THREE.Camera === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.CanvasRenderer.render: camera is not an instance of THREE.Camera.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.autoClear === true ) this.clear();\r\n\r\n\t\t_context.setTransform( 1, 0, 0, - 1, _canvasWidthHalf, _canvasHeightHalf );\r\n\r\n\t\t_this.info.render.vertices = 0;\r\n\t\t_this.info.render.faces = 0;\r\n\r\n\t\t_renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );\r\n\t\t_elements = _renderData.elements;\r\n\t\t_lights = _renderData.lights;\r\n\t\t_camera = camera;\r\n\r\n\t\t/* DEBUG\r\n\t\tsetFillStyle( 'rgba( 0, 255, 255, 0.5 )' );\r\n\t\t_context.fillRect( _clipBox.min.x, _clipBox.min.y, _clipBox.max.x - _clipBox.min.x, _clipBox.max.y - _clipBox.min.y );\r\n\t\t*/\r\n\r\n\t\tcalculateLights();\r\n\r\n\t\tfor ( var e = 0, el = _elements.length; e < el; e++ ) {\r\n\r\n\t\t\tvar element = _elements[ e ];\r\n\r\n\t\t\tvar material = element.material;\r\n\r\n\t\t\tif ( material === undefined || material.visible === false ) continue;\r\n\r\n\t\t\t_elemBox.makeEmpty();\r\n\r\n\t\t\tif ( element instanceof THREE.RenderableParticle ) {\r\n\r\n\t\t\t\t_v1 = element;\r\n\t\t\t\t_v1.x *= _canvasWidthHalf; _v1.y *= _canvasHeightHalf;\r\n\r\n\t\t\t\trenderParticle( _v1, element, material );\r\n\r\n\t\t\t} else if ( element instanceof THREE.RenderableLine ) {\r\n\r\n\t\t\t\t_v1 = element.v1; _v2 = element.v2;\r\n\r\n\t\t\t\t_v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;\r\n\r\n\t\t\t\t_elemBox.setFromPoints( [\r\n\t\t\t\t\t_v1.positionScreen,\r\n\t\t\t\t\t_v2.positionScreen\r\n\t\t\t\t] );\r\n\r\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === true ) {\r\n\r\n\t\t\t\t\trenderLine( _v1, _v2, element, material );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( element instanceof THREE.RenderableFace3 ) {\r\n\r\n\t\t\t\t_v1 = element.v1; _v2 = element.v2; _v3 = element.v3;\r\n\r\n\t\t\t\tif ( _v1.positionScreen.z < -1 || _v1.positionScreen.z > 1 ) continue;\r\n\t\t\t\tif ( _v2.positionScreen.z < -1 || _v2.positionScreen.z > 1 ) continue;\r\n\t\t\t\tif ( _v3.positionScreen.z < -1 || _v3.positionScreen.z > 1 ) continue;\r\n\r\n\t\t\t\t_v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf;\r\n\r\n\t\t\t\tif ( material.overdraw === true ) {\r\n\r\n\t\t\t\t\texpand( _v1.positionScreen, _v2.positionScreen );\r\n\t\t\t\t\texpand( _v2.positionScreen, _v3.positionScreen );\r\n\t\t\t\t\texpand( _v3.positionScreen, _v1.positionScreen );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_elemBox.setFromPoints( [\r\n\t\t\t\t\t_v1.positionScreen,\r\n\t\t\t\t\t_v2.positionScreen,\r\n\t\t\t\t\t_v3.positionScreen\r\n\t\t\t\t] );\r\n\r\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === true ) {\r\n\r\n\t\t\t\t\trenderFace3( _v1, _v2, _v3, 0, 1, 2, element, material );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( element instanceof THREE.RenderableFace4 ) {\r\n\r\n\t\t\t\t_v1 = element.v1; _v2 = element.v2; _v3 = element.v3; _v4 = element.v4;\r\n\r\n\t\t\t\tif ( _v1.positionScreen.z < -1 || _v1.positionScreen.z > 1 ) continue;\r\n\t\t\t\tif ( _v2.positionScreen.z < -1 || _v2.positionScreen.z > 1 ) continue;\r\n\t\t\t\tif ( _v3.positionScreen.z < -1 || _v3.positionScreen.z > 1 ) continue;\r\n\t\t\t\tif ( _v4.positionScreen.z < -1 || _v4.positionScreen.z > 1 ) continue;\r\n\r\n\t\t\t\t_v1.positionScreen.x *= _canvasWidthHalf; _v1.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v2.positionScreen.x *= _canvasWidthHalf; _v2.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v3.positionScreen.x *= _canvasWidthHalf; _v3.positionScreen.y *= _canvasHeightHalf;\r\n\t\t\t\t_v4.positionScreen.x *= _canvasWidthHalf; _v4.positionScreen.y *= _canvasHeightHalf;\r\n\r\n\t\t\t\t_v5.positionScreen.copy( _v2.positionScreen );\r\n\t\t\t\t_v6.positionScreen.copy( _v4.positionScreen );\r\n\r\n\t\t\t\tif ( material.overdraw === true ) {\r\n\r\n\t\t\t\t\texpand( _v1.positionScreen, _v2.positionScreen );\r\n\t\t\t\t\texpand( _v2.positionScreen, _v4.positionScreen );\r\n\t\t\t\t\texpand( _v4.positionScreen, _v1.positionScreen );\r\n\r\n\t\t\t\t\texpand( _v3.positionScreen, _v5.positionScreen );\r\n\t\t\t\t\texpand( _v3.positionScreen, _v6.positionScreen );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_elemBox.setFromPoints( [\r\n\t\t\t\t\t_v1.positionScreen,\r\n\t\t\t\t\t_v2.positionScreen,\r\n\t\t\t\t\t_v3.positionScreen,\r\n\t\t\t\t\t_v4.positionScreen\r\n\t\t\t\t] );\r\n\r\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === true ) {\r\n\r\n\t\t\t\t\trenderFace4( _v1, _v2, _v3, _v4, _v5, _v6, element, material );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t/* DEBUG\r\n\t\t\tsetLineWidth( 1 );\r\n\t\t\tsetStrokeStyle( 'rgba( 0, 255, 0, 0.5 )' );\r\n\t\t\t_context.strokeRect( _elemBox.min.x, _elemBox.min.y, _elemBox.max.x - _elemBox.min.x, _elemBox.max.y - _elemBox.min.y );\r\n\t\t\t*/\r\n\r\n\t\t\t_clearBox.union( _elemBox );\r\n\r\n\t\t}\r\n\r\n\t\t/* DEBUG\r\n\t\tsetLineWidth( 1 );\r\n\t\tsetStrokeStyle( 'rgba( 255, 0, 0, 0.5 )' );\r\n\t\t_context.strokeRect( _clearBox.min.x, _clearBox.min.y, _clearBox.max.x - _clearBox.min.x, _clearBox.max.y - _clearBox.min.y );\r\n\t\t*/\r\n\r\n\t\t_context.setTransform( 1, 0, 0, 1, 0, 0 );\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\tfunction calculateLights() {\r\n\r\n\t\t_ambientLight.setRGB( 0, 0, 0 );\r\n\t\t_directionalLights.setRGB( 0, 0, 0 );\r\n\t\t_pointLights.setRGB( 0, 0, 0 );\r\n\r\n\t\tfor ( var l = 0, ll = _lights.length; l < ll; l ++ ) {\r\n\r\n\t\t\tvar light = _lights[ l ];\r\n\t\t\tvar lightColor = light.color;\r\n\r\n\t\t\tif ( light instanceof THREE.AmbientLight ) {\r\n\r\n\t\t\t\t_ambientLight.add( lightColor );\r\n\r\n\t\t\t} else if ( light instanceof THREE.DirectionalLight ) {\r\n\r\n\t\t\t\t// for particles\r\n\r\n\t\t\t\t_directionalLights.add( lightColor );\r\n\r\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\r\n\r\n\t\t\t\t// for particles\r\n\r\n\t\t\t\t_pointLights.add( lightColor );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction calculateLight( position, normal, color ) {\r\n\r\n\t\tfor ( var l = 0, ll = _lights.length; l < ll; l ++ ) {\r\n\r\n\t\t\tvar light = _lights[ l ];\r\n\r\n\t\t\t_lightColor.copy( light.color );\r\n\r\n\t\t\tif ( light instanceof THREE.DirectionalLight ) {\r\n\r\n\t\t\t\tvar lightPosition = _vector3.getPositionFromMatrix( light.matrixWorld ).normalize();\r\n\r\n\t\t\t\tvar amount = normal.dot( lightPosition );\r\n\r\n\t\t\t\tif ( amount <= 0 ) continue;\r\n\r\n\t\t\t\tamount *= light.intensity;\r\n\r\n\t\t\t\tcolor.add( _lightColor.multiplyScalar( amount ) );\r\n\r\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\r\n\r\n\t\t\t\tvar lightPosition = _vector3.getPositionFromMatrix( light.matrixWorld );\r\n\r\n\t\t\t\tvar amount = normal.dot( _vector3.subVectors( lightPosition, position ).normalize() );\r\n\r\n\t\t\t\tif ( amount <= 0 ) continue;\r\n\r\n\t\t\t\tamount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 );\r\n\r\n\t\t\t\tif ( amount == 0 ) continue;\r\n\r\n\t\t\t\tamount *= light.intensity;\r\n\r\n\t\t\t\tcolor.add( _lightColor.multiplyScalar( amount ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction renderParticle( v1, element, material ) {\r\n\r\n\t\tsetOpacity( material.opacity );\r\n\t\tsetBlending( material.blending );\r\n\r\n\t\tvar width, height, scaleX, scaleY,\r\n\t\tbitmap, bitmapWidth, bitmapHeight;\r\n\r\n\t\tif ( material instanceof THREE.ParticleBasicMaterial ) {\r\n\r\n\t\t\tif ( material.map === null ) {\r\n\r\n\t\t\t\tscaleX = element.object.scale.x;\r\n\t\t\t\tscaleY = element.object.scale.y;\r\n\r\n\t\t\t\t// TODO: Be able to disable this\r\n\r\n\t\t\t\tscaleX *= element.scale.x * _canvasWidthHalf;\r\n\t\t\t\tscaleY *= element.scale.y * _canvasHeightHalf;\r\n\r\n\t\t\t\t_elemBox.min.set( v1.x - scaleX, v1.y - scaleY );\r\n\t\t\t\t_elemBox.max.set( v1.x + scaleX, v1.y + scaleY );\r\n\r\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === false ) {\r\n\r\n\t\t\t\t\t_elemBox.makeEmpty();\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetFillStyle( material.color.getStyle() );\r\n\r\n\t\t\t\t_context.save();\r\n\t\t\t\t_context.translate( v1.x, v1.y );\r\n\t\t\t\t_context.rotate( - element.rotation );\r\n\t\t\t\t_context.scale( scaleX, scaleY );\r\n\t\t\t\t_context.fillRect( -1, -1, 2, 2 );\r\n\t\t\t\t_context.restore();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbitmap = material.map.image;\r\n\t\t\t\tbitmapWidth = bitmap.width >> 1;\r\n\t\t\t\tbitmapHeight = bitmap.height >> 1;\r\n\r\n\t\t\t\tscaleX = element.scale.x * _canvasWidthHalf;\r\n\t\t\t\tscaleY = element.scale.y * _canvasHeightHalf;\r\n\r\n\t\t\t\twidth = scaleX * bitmapWidth;\r\n\t\t\t\theight = scaleY * bitmapHeight;\r\n\r\n\t\t\t\t// TODO: Rotations break this...\r\n\r\n\t\t\t\t_elemBox.min.set( v1.x - width, v1.y - height );\r\n\t\t\t\t_elemBox.max.set( v1.x + width, v1.y + height );\r\n\r\n\t\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === false ) {\r\n\r\n\t\t\t\t\t_elemBox.makeEmpty();\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_context.save();\r\n\t\t\t\t_context.translate( v1.x, v1.y );\r\n\t\t\t\t_context.rotate( - element.rotation );\r\n\t\t\t\t_context.scale( scaleX, - scaleY );\r\n\r\n\t\t\t\t_context.translate( - bitmapWidth, - bitmapHeight );\r\n\t\t\t\t_context.drawImage( bitmap, 0, 0 );\r\n\t\t\t\t_context.restore();\r\n\r\n\t\t\t}\r\n\r\n\t\t\t/* DEBUG\r\n\t\t\tsetStrokeStyle( 'rgb(255,255,0)' );\r\n\t\t\t_context.beginPath();\r\n\t\t\t_context.moveTo( v1.x - 10, v1.y );\r\n\t\t\t_context.lineTo( v1.x + 10, v1.y );\r\n\t\t\t_context.moveTo( v1.x, v1.y - 10 );\r\n\t\t\t_context.lineTo( v1.x, v1.y + 10 );\r\n\t\t\t_context.stroke();\r\n\t\t\t*/\r\n\r\n\t\t} else if ( material instanceof THREE.ParticleCanvasMaterial ) {\r\n\r\n\t\t\twidth = element.scale.x * _canvasWidthHalf;\r\n\t\t\theight = element.scale.y * _canvasHeightHalf;\r\n\r\n\t\t\t_elemBox.min.set( v1.x - width, v1.y - height );\r\n\t\t\t_elemBox.max.set( v1.x + width, v1.y + height );\r\n\r\n\t\t\tif ( _clipBox.isIntersectionBox( _elemBox ) === false ) {\r\n\r\n\t\t\t\t_elemBox.makeEmpty();\r\n\t\t\t\treturn;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tsetStrokeStyle( material.color.getStyle() );\r\n\t\t\tsetFillStyle( material.color.getStyle() );\r\n\r\n\t\t\t_context.save();\r\n\t\t\t_context.translate( v1.x, v1.y );\r\n\t\t\t_context.rotate( - element.rotation );\r\n\t\t\t_context.scale( width, height );\r\n\r\n\t\t\tmaterial.program( _context );\r\n\r\n\t\t\t_context.restore();\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction renderLine( v1, v2, element, material ) {\r\n\r\n\t\tsetOpacity( material.opacity );\r\n\t\tsetBlending( material.blending );\r\n\r\n\t\t_context.beginPath();\r\n\t\t_context.moveTo( v1.positionScreen.x, v1.positionScreen.y );\r\n\t\t_context.lineTo( v2.positionScreen.x, v2.positionScreen.y );\r\n\r\n\t\tif ( material instanceof THREE.LineBasicMaterial ) {\r\n\r\n\t\t\tsetLineWidth( material.linewidth );\r\n\t\t\tsetLineCap( material.linecap );\r\n\t\t\tsetLineJoin( material.linejoin );\r\n\r\n\t\t\tif ( material.vertexColors !== THREE.VertexColors ) {\r\n\r\n\t\t\t\tsetStrokeStyle( material.color.getStyle() );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar colorStyle1 = element.vertexColors[0].getStyle();\r\n\t\t\t\tvar colorStyle2 = element.vertexColors[1].getStyle();\r\n\r\n\t\t\t\tif ( colorStyle1 === colorStyle2 ) {\r\n\r\n\t\t\t\t\tsetStrokeStyle( colorStyle1 );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\ttry {\r\n\r\n\t\t\t\t\t\tvar grad = _context.createLinearGradient(\r\n\t\t\t\t\t\t\tv1.positionScreen.x,\r\n\t\t\t\t\t\t\tv1.positionScreen.y,\r\n\t\t\t\t\t\t\tv2.positionScreen.x,\r\n\t\t\t\t\t\t\tv2.positionScreen.y\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tgrad.addColorStop( 0, colorStyle1 );\r\n\t\t\t\t\t\tgrad.addColorStop( 1, colorStyle2 );\r\n\r\n\t\t\t\t\t} catch ( exception ) {\r\n\r\n\t\t\t\t\t\tgrad = colorStyle1;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsetStrokeStyle( grad );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_context.stroke();\r\n\t\t\t_elemBox.expandByScalar( material.linewidth * 2 );\r\n\r\n\t\t} else if ( material instanceof THREE.LineDashedMaterial ) {\r\n\r\n\t\t\tsetLineWidth( material.linewidth );\r\n\t\t\tsetLineCap( material.linecap );\r\n\t\t\tsetLineJoin( material.linejoin );\r\n\t\t\tsetStrokeStyle( material.color.getStyle() );\r\n\t\t\tsetDashAndGap( material.dashSize, material.gapSize );\r\n\r\n\t\t\t_context.stroke();\r\n\r\n\t\t\t_elemBox.expandByScalar( material.linewidth * 2 );\r\n\r\n\t\t\tsetDashAndGap( null, null );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction renderFace3( v1, v2, v3, uv1, uv2, uv3, element, material ) {\r\n\r\n\t\t_this.info.render.vertices += 3;\r\n\t\t_this.info.render.faces ++;\r\n\r\n\t\tsetOpacity( material.opacity );\r\n\t\tsetBlending( material.blending );\r\n\r\n\t\t_v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y;\r\n\t\t_v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y;\r\n\t\t_v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y;\r\n\r\n\t\tdrawTriangle( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y );\r\n\r\n\t\tif ( ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) && material.map === null ) {\r\n\r\n\t\t\t_diffuseColor.copy( material.color );\r\n\t\t\t_emissiveColor.copy( material.emissive );\r\n\r\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\r\n\r\n\t\t\t\t_diffuseColor.multiply( element.color );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material.wireframe === false && material.shading == THREE.SmoothShading && element.vertexNormalsLength == 3 ) {\r\n\r\n\t\t\t\t_color1.copy( _ambientLight );\r\n\t\t\t\t_color2.copy( _ambientLight );\r\n\t\t\t\t_color3.copy( _ambientLight );\r\n\r\n\t\t\t\tcalculateLight( element.v1.positionWorld, element.vertexNormalsModel[ 0 ], _color1 );\r\n\t\t\t\tcalculateLight( element.v2.positionWorld, element.vertexNormalsModel[ 1 ], _color2 );\r\n\t\t\t\tcalculateLight( element.v3.positionWorld, element.vertexNormalsModel[ 2 ], _color3 );\r\n\r\n\t\t\t\t_color1.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color2.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color3.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 );\r\n\r\n\t\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_color.copy( _ambientLight );\r\n\r\n\t\t\t\tcalculateLight( element.centroidModel, element.normalModel, _color );\r\n\r\n\t\t\t\t_color.multiply( _diffuseColor ).add( _emissiveColor );\r\n\r\n\t\t\t\tmaterial.wireframe === true\r\n\t\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t\t: fillPath( _color );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( material instanceof THREE.MeshBasicMaterial || material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\tif ( material.map !== null ) {\r\n\r\n\t\t\t\tif ( material.map.mapping instanceof THREE.UVMapping ) {\r\n\r\n\t\t\t\t\t_uvs = element.uvs[ 0 ];\r\n\t\t\t\t\tpatternPath( _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 );\r\n\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t} else if ( material.envMap !== null ) {\r\n\r\n\t\t\t\tif ( material.envMap.mapping instanceof THREE.SphericalReflectionMapping ) {\r\n\r\n\t\t\t\t\t_vector3.copy( element.vertexNormalsModelView[ uv1 ] );\r\n\t\t\t\t\t_uv1x = 0.5 * _vector3.x + 0.5;\r\n\t\t\t\t\t_uv1y = 0.5 * _vector3.y + 0.5;\r\n\r\n\t\t\t\t\t_vector3.copy( element.vertexNormalsModelView[ uv2 ] );\r\n\t\t\t\t\t_uv2x = 0.5 * _vector3.x + 0.5;\r\n\t\t\t\t\t_uv2y = 0.5 * _vector3.y + 0.5;\r\n\r\n\t\t\t\t\t_vector3.copy( element.vertexNormalsModelView[ uv3 ] );\r\n\t\t\t\t\t_uv3x = 0.5 * _vector3.x + 0.5;\r\n\t\t\t\t\t_uv3y = 0.5 * _vector3.y + 0.5;\r\n\r\n\t\t\t\t\tpatternPath( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _uv1x, _uv1y, _uv2x, _uv2y, _uv3x, _uv3y, material.envMap );\r\n\r\n\t\t\t\t}/* else if ( material.envMap.mapping == THREE.SphericalRefractionMapping ) {\r\n\r\n\r\n\r\n\t\t\t\t}*/\r\n\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_color.copy( material.color );\r\n\r\n\t\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\r\n\r\n\t\t\t\t\t_color.multiply( element.color );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmaterial.wireframe === true\r\n\t\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t\t: fillPath( _color );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\t_near = _camera.near;\r\n\t\t\t_far = _camera.far;\r\n\r\n\t\t\t_color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z * v1.positionScreen.w, _near, _far );\r\n\t\t\t_color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z * v2.positionScreen.w, _near, _far );\r\n\t\t\t_color3.r = _color3.g = _color3.b = 1 - smoothstep( v3.positionScreen.z * v3.positionScreen.w, _near, _far );\r\n\t\t\t_color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 );\r\n\r\n\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\r\n\r\n\t\t\tvar normal;\r\n\r\n\t\t\tif ( material.shading == THREE.FlatShading ) {\r\n\r\n\t\t\t\tnormal = element.normalModelView;\r\n\r\n\t\t\t\t_color.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tmaterial.wireframe === true\r\n\t\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t\t: fillPath( _color );\r\n\r\n\t\t\t} else if ( material.shading == THREE.SmoothShading ) {\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ uv1 ];\r\n\t\t\t\t_color1.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ uv2 ];\r\n\t\t\t\t_color2.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ uv3 ];\r\n\t\t\t\t_color3.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\t_color4.addColors( _color2, _color3 ).multiplyScalar( 0.5 );\r\n\r\n\t\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction renderFace4( v1, v2, v3, v4, v5, v6, element, material ) {\r\n\r\n\t\t_this.info.render.vertices += 4;\r\n\t\t_this.info.render.faces ++;\r\n\r\n\t\tsetOpacity( material.opacity );\r\n\t\tsetBlending( material.blending );\r\n\r\n\t\tif ( ( material.map !== undefined && material.map !== null ) || ( material.envMap !== undefined && material.envMap !== null ) ) {\r\n\r\n\t\t\t// Let renderFace3() handle this\r\n\r\n\t\t\trenderFace3( v1, v2, v4, 0, 1, 3, element, material );\r\n\t\t\trenderFace3( v5, v3, v6, 1, 2, 3, element, material );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\t_v1x = v1.positionScreen.x; _v1y = v1.positionScreen.y;\r\n\t\t_v2x = v2.positionScreen.x; _v2y = v2.positionScreen.y;\r\n\t\t_v3x = v3.positionScreen.x; _v3y = v3.positionScreen.y;\r\n\t\t_v4x = v4.positionScreen.x; _v4y = v4.positionScreen.y;\r\n\t\t_v5x = v5.positionScreen.x; _v5y = v5.positionScreen.y;\r\n\t\t_v6x = v6.positionScreen.x; _v6y = v6.positionScreen.y;\r\n\r\n\t\tif ( material instanceof THREE.MeshLambertMaterial || material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\t_diffuseColor.copy( material.color );\r\n\t\t\t_emissiveColor.copy( material.emissive );\r\n\r\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\r\n\r\n\t\t\t\t_diffuseColor.multiply( element.color );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material.wireframe === false && material.shading == THREE.SmoothShading && element.vertexNormalsLength == 4 ) {\r\n\r\n\t\t\t\t_color1.copy( _ambientLight );\r\n\t\t\t\t_color2.copy( _ambientLight );\r\n\t\t\t\t_color3.copy( _ambientLight );\r\n\t\t\t\t_color4.copy( _ambientLight );\r\n\r\n\t\t\t\tcalculateLight( element.v1.positionWorld, element.vertexNormalsModel[ 0 ], _color1 );\r\n\t\t\t\tcalculateLight( element.v2.positionWorld, element.vertexNormalsModel[ 1 ], _color2 );\r\n\t\t\t\tcalculateLight( element.v4.positionWorld, element.vertexNormalsModel[ 3 ], _color3 );\r\n\t\t\t\tcalculateLight( element.v3.positionWorld, element.vertexNormalsModel[ 2 ], _color4 );\r\n\r\n\t\t\t\t_color1.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color2.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color3.multiply( _diffuseColor ).add( _emissiveColor );\r\n\t\t\t\t_color4.multiply( _diffuseColor ).add( _emissiveColor );\r\n\r\n\t\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\t\t// TODO: UVs are incorrect, v4->v3?\r\n\r\n\t\t\t\tdrawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y );\r\n\t\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t\t\tdrawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y );\r\n\t\t\t\tclipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_color.copy( _ambientLight );\r\n\r\n\t\t\t\tcalculateLight( element.centroidModel, element.normalModel, _color );\r\n\r\n\t\t\t\t_color.multiply( _diffuseColor ).add( _emissiveColor );\r\n\r\n\t\t\t\tdrawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );\r\n\r\n\t\t\t\tmaterial.wireframe === true\r\n\t\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t\t: fillPath( _color );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( material instanceof THREE.MeshBasicMaterial ) {\r\n\r\n\t\t\t_color.copy( material.color );\r\n\r\n\t\t\tif ( material.vertexColors === THREE.FaceColors ) {\r\n\r\n\t\t\t\t_color.multiply( element.color );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdrawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );\r\n\r\n\t\t\tmaterial.wireframe === true\r\n\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t: fillPath( _color );\r\n\r\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\r\n\r\n\t\t\tvar normal;\r\n\r\n\t\t\tif ( material.shading == THREE.FlatShading ) {\r\n\r\n\t\t\t\tnormal = element.normalModelView;\r\n\t\t\t\t_color.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tdrawQuad( _v1x, _v1y, _v2x, _v2y, _v3x, _v3y, _v4x, _v4y );\r\n\r\n\t\t\t\tmaterial.wireframe === true\r\n\t\t\t\t\t? strokePath( _color, material.wireframeLinewidth, material.wireframeLinecap, material.wireframeLinejoin )\r\n\t\t\t\t\t: fillPath( _color );\r\n\r\n\t\t\t} else if ( material.shading == THREE.SmoothShading ) {\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ 0 ];\r\n\t\t\t\t_color1.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ 1 ];\r\n\t\t\t\t_color2.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ 3 ];\r\n\t\t\t\t_color3.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\tnormal = element.vertexNormalsModelView[ 2 ];\r\n\t\t\t\t_color4.setRGB( normal.x, normal.y, normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\r\n\r\n\t\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\t\tdrawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y );\r\n\t\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t\t\tdrawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y );\r\n\t\t\t\tclipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\t_near = _camera.near;\r\n\t\t\t_far = _camera.far;\r\n\r\n\t\t\t_color1.r = _color1.g = _color1.b = 1 - smoothstep( v1.positionScreen.z * v1.positionScreen.w, _near, _far );\r\n\t\t\t_color2.r = _color2.g = _color2.b = 1 - smoothstep( v2.positionScreen.z * v2.positionScreen.w, _near, _far );\r\n\t\t\t_color3.r = _color3.g = _color3.b = 1 - smoothstep( v4.positionScreen.z * v4.positionScreen.w, _near, _far );\r\n\t\t\t_color4.r = _color4.g = _color4.b = 1 - smoothstep( v3.positionScreen.z * v3.positionScreen.w, _near, _far );\r\n\r\n\t\t\t_image = getGradientTexture( _color1, _color2, _color3, _color4 );\r\n\r\n\t\t\t// TODO: UVs are incorrect, v4->v3?\r\n\r\n\t\t\tdrawTriangle( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y );\r\n\t\t\tclipImage( _v1x, _v1y, _v2x, _v2y, _v4x, _v4y, 0, 0, 1, 0, 0, 1, _image );\r\n\r\n\t\t\tdrawTriangle( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y );\r\n\t\t\tclipImage( _v5x, _v5y, _v3x, _v3y, _v6x, _v6y, 1, 0, 1, 1, 0, 1, _image );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tfunction drawTriangle( x0, y0, x1, y1, x2, y2 ) {\r\n\r\n\t\t_context.beginPath();\r\n\t\t_context.moveTo( x0, y0 );\r\n\t\t_context.lineTo( x1, y1 );\r\n\t\t_context.lineTo( x2, y2 );\r\n\t\t_context.closePath();\r\n\r\n\t}\r\n\r\n\tfunction drawQuad( x0, y0, x1, y1, x2, y2, x3, y3 ) {\r\n\r\n\t\t_context.beginPath();\r\n\t\t_context.moveTo( x0, y0 );\r\n\t\t_context.lineTo( x1, y1 );\r\n\t\t_context.lineTo( x2, y2 );\r\n\t\t_context.lineTo( x3, y3 );\r\n\t\t_context.closePath();\r\n\r\n\t}\r\n\r\n\tfunction strokePath( color, linewidth, linecap, linejoin ) {\r\n\r\n\t\tsetLineWidth( linewidth );\r\n\t\tsetLineCap( linecap );\r\n\t\tsetLineJoin( linejoin );\r\n\t\tsetStrokeStyle( color.getStyle() );\r\n\r\n\t\t_context.stroke();\r\n\r\n\t\t_elemBox.expandByScalar( linewidth * 2 );\r\n\r\n\t}\r\n\r\n\tfunction fillPath( color ) {\r\n\r\n\t\tsetFillStyle( color.getStyle() );\r\n\t\t_context.fill();\r\n\r\n\t}\r\n\r\n\tfunction patternPath( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, texture ) {\r\n\r\n\t\tif ( texture instanceof THREE.DataTexture || texture.image === undefined || texture.image.width == 0 ) return;\r\n\r\n\t\tif ( texture.needsUpdate === true ) {\r\n\r\n\t\t\tvar repeatX = texture.wrapS == THREE.RepeatWrapping;\r\n\t\t\tvar repeatY = texture.wrapT == THREE.RepeatWrapping;\r\n\r\n\t\t\t_patterns[ texture.id ] = _context.createPattern(\r\n\t\t\t\ttexture.image, repeatX === true && repeatY === true\r\n\t\t\t\t\t? 'repeat'\r\n\t\t\t\t\t: repeatX === true && repeatY === false\r\n\t\t\t\t\t\t? 'repeat-x'\r\n\t\t\t\t\t\t: repeatX === false && repeatY === true\r\n\t\t\t\t\t\t\t? 'repeat-y'\r\n\t\t\t\t\t\t\t: 'no-repeat'\r\n\t\t\t);\r\n\r\n\t\t\ttexture.needsUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\t_patterns[ texture.id ] === undefined\r\n\t\t\t? setFillStyle( 'rgba(0,0,0,1)' )\r\n\t\t\t: setFillStyle( _patterns[ texture.id ] );\r\n\r\n\t\t// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120\r\n\r\n\t\tvar a, b, c, d, e, f, det, idet,\r\n\t\toffsetX = texture.offset.x / texture.repeat.x,\r\n\t\toffsetY = texture.offset.y / texture.repeat.y,\r\n\t\twidth = texture.image.width * texture.repeat.x,\r\n\t\theight = texture.image.height * texture.repeat.y;\r\n\r\n\t\tu0 = ( u0 + offsetX ) * width;\r\n\t\tv0 = ( 1.0 - v0 + offsetY ) * height;\r\n\r\n\t\tu1 = ( u1 + offsetX ) * width;\r\n\t\tv1 = ( 1.0 - v1 + offsetY ) * height;\r\n\r\n\t\tu2 = ( u2 + offsetX ) * width;\r\n\t\tv2 = ( 1.0 - v2 + offsetY ) * height;\r\n\r\n\t\tx1 -= x0; y1 -= y0;\r\n\t\tx2 -= x0; y2 -= y0;\r\n\r\n\t\tu1 -= u0; v1 -= v0;\r\n\t\tu2 -= u0; v2 -= v0;\r\n\r\n\t\tdet = u1 * v2 - u2 * v1;\r\n\r\n\t\tif ( det === 0 ) {\r\n\r\n\t\t\tif ( _imagedatas[ texture.id ] === undefined ) {\r\n\r\n\t\t\t\tvar canvas = document.createElement( 'canvas' )\r\n\t\t\t\tcanvas.width = texture.image.width;\r\n\t\t\t\tcanvas.height = texture.image.height;\r\n\r\n\t\t\t\tvar context = canvas.getContext( '2d' );\r\n\t\t\t\tcontext.drawImage( texture.image, 0, 0 );\r\n\r\n\t\t\t\t_imagedatas[ texture.id ] = context.getImageData( 0, 0, texture.image.width, texture.image.height ).data;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar data = _imagedatas[ texture.id ];\r\n\t\t\tvar index = ( Math.floor( u0 ) + Math.floor( v0 ) * texture.image.width ) * 4;\r\n\r\n\t\t\t_color.setRGB( data[ index ] / 255, data[ index + 1 ] / 255, data[ index + 2 ] / 255 );\r\n\t\t\tfillPath( _color );\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tidet = 1 / det;\r\n\r\n\t\ta = ( v2 * x1 - v1 * x2 ) * idet;\r\n\t\tb = ( v2 * y1 - v1 * y2 ) * idet;\r\n\t\tc = ( u1 * x2 - u2 * x1 ) * idet;\r\n\t\td = ( u1 * y2 - u2 * y1 ) * idet;\r\n\r\n\t\te = x0 - a * u0 - c * v0;\r\n\t\tf = y0 - b * u0 - d * v0;\r\n\r\n\t\t_context.save();\r\n\t\t_context.transform( a, b, c, d, e, f );\r\n\t\t_context.fill();\r\n\t\t_context.restore();\r\n\r\n\t}\r\n\r\n\tfunction clipImage( x0, y0, x1, y1, x2, y2, u0, v0, u1, v1, u2, v2, image ) {\r\n\r\n\t\t// http://extremelysatisfactorytotalitarianism.com/blog/?p=2120\r\n\r\n\t\tvar a, b, c, d, e, f, det, idet,\r\n\t\twidth = image.width - 1,\r\n\t\theight = image.height - 1;\r\n\r\n\t\tu0 *= width; v0 *= height;\r\n\t\tu1 *= width; v1 *= height;\r\n\t\tu2 *= width; v2 *= height;\r\n\r\n\t\tx1 -= x0; y1 -= y0;\r\n\t\tx2 -= x0; y2 -= y0;\r\n\r\n\t\tu1 -= u0; v1 -= v0;\r\n\t\tu2 -= u0; v2 -= v0;\r\n\r\n\t\tdet = u1 * v2 - u2 * v1;\r\n\r\n\t\tidet = 1 / det;\r\n\r\n\t\ta = ( v2 * x1 - v1 * x2 ) * idet;\r\n\t\tb = ( v2 * y1 - v1 * y2 ) * idet;\r\n\t\tc = ( u1 * x2 - u2 * x1 ) * idet;\r\n\t\td = ( u1 * y2 - u2 * y1 ) * idet;\r\n\r\n\t\te = x0 - a * u0 - c * v0;\r\n\t\tf = y0 - b * u0 - d * v0;\r\n\r\n\t\t_context.save();\r\n\t\t_context.transform( a, b, c, d, e, f );\r\n\t\t_context.clip();\r\n\t\t_context.drawImage( image, 0, 0 );\r\n\t\t_context.restore();\r\n\r\n\t}\r\n\r\n\tfunction getGradientTexture( color1, color2, color3, color4 ) {\r\n\r\n\t\t// http://mrdoob.com/blog/post/710\r\n\r\n\t\t_pixelMapData[ 0 ] = ( color1.r * 255 ) | 0;\r\n\t\t_pixelMapData[ 1 ] = ( color1.g * 255 ) | 0;\r\n\t\t_pixelMapData[ 2 ] = ( color1.b * 255 ) | 0;\r\n\r\n\t\t_pixelMapData[ 4 ] = ( color2.r * 255 ) | 0;\r\n\t\t_pixelMapData[ 5 ] = ( color2.g * 255 ) | 0;\r\n\t\t_pixelMapData[ 6 ] = ( color2.b * 255 ) | 0;\r\n\r\n\t\t_pixelMapData[ 8 ] = ( color3.r * 255 ) | 0;\r\n\t\t_pixelMapData[ 9 ] = ( color3.g * 255 ) | 0;\r\n\t\t_pixelMapData[ 10 ] = ( color3.b * 255 ) | 0;\r\n\r\n\t\t_pixelMapData[ 12 ] = ( color4.r * 255 ) | 0;\r\n\t\t_pixelMapData[ 13 ] = ( color4.g * 255 ) | 0;\r\n\t\t_pixelMapData[ 14 ] = ( color4.b * 255 ) | 0;\r\n\r\n\t\t_pixelMapContext.putImageData( _pixelMapImage, 0, 0 );\r\n\t\t_gradientMapContext.drawImage( _pixelMap, 0, 0 );\r\n\r\n\t\treturn _gradientMap;\r\n\r\n\t}\r\n\r\n\t// Hide anti-alias gaps\r\n\r\n\tfunction expand( v1, v2 ) {\r\n\r\n\t\tvar x = v2.x - v1.x, y = v2.y - v1.y,\r\n\t\tdet = x * x + y * y, idet;\r\n\r\n\t\tif ( det === 0 ) return;\r\n\r\n\t\tidet = 1 / Math.sqrt( det );\r\n\r\n\t\tx *= idet; y *= idet;\r\n\r\n\t\tv2.x += x; v2.y += y;\r\n\t\tv1.x -= x; v1.y -= y;\r\n\r\n\t}\r\n\r\n\t// Context cached methods.\r\n\r\n\tfunction setOpacity( value ) {\r\n\r\n\t\tif ( _contextGlobalAlpha !== value ) {\r\n\r\n\t\t\t_context.globalAlpha = value;\r\n\t\t\t_contextGlobalAlpha = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setBlending( value ) {\r\n\r\n\t\tif ( _contextGlobalCompositeOperation !== value ) {\r\n\r\n\t\t\tif ( value === THREE.NormalBlending ) {\r\n\r\n\t\t\t\t_context.globalCompositeOperation = 'source-over';\r\n\r\n\t\t\t} else if ( value === THREE.AdditiveBlending ) {\r\n\r\n\t\t\t\t_context.globalCompositeOperation = 'lighter';\r\n\r\n\t\t\t} else if ( value === THREE.SubtractiveBlending ) {\r\n\r\n\t\t\t\t_context.globalCompositeOperation = 'darker';\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_contextGlobalCompositeOperation = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setLineWidth( value ) {\r\n\r\n\t\tif ( _contextLineWidth !== value ) {\r\n\r\n\t\t\t_context.lineWidth = value;\r\n\t\t\t_contextLineWidth = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setLineCap( value ) {\r\n\r\n\t\t// \"butt\", \"round\", \"square\"\r\n\r\n\t\tif ( _contextLineCap !== value ) {\r\n\r\n\t\t\t_context.lineCap = value;\r\n\t\t\t_contextLineCap = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setLineJoin( value ) {\r\n\r\n\t\t// \"round\", \"bevel\", \"miter\"\r\n\r\n\t\tif ( _contextLineJoin !== value ) {\r\n\r\n\t\t\t_context.lineJoin = value;\r\n\t\t\t_contextLineJoin = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setStrokeStyle( value ) {\r\n\r\n\t\tif ( _contextStrokeStyle !== value ) {\r\n\r\n\t\t\t_context.strokeStyle = value;\r\n\t\t\t_contextStrokeStyle = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setFillStyle( value ) {\r\n\r\n\t\tif ( _contextFillStyle !== value ) {\r\n\r\n\t\t\t_context.fillStyle = value;\r\n\t\t\t_contextFillStyle = value;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction setDashAndGap( dashSizeValue, gapSizeValue ) {\r\n\r\n\t\tif ( _contextDashSize !== dashSizeValue || _contextGapSize !== gapSizeValue ) {\r\n\r\n\t\t\t_context.setLineDash( [ dashSizeValue, gapSizeValue ] );\r\n\t\t\t_contextDashSize = dashSizeValue;\r\n\t\t\t_contextGapSize = gapSizeValue;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author mikael emtinger / http://gomo.se/\r\n */\r\n\r\nTHREE.ShaderChunk = {\r\n\r\n\t// FOG\r\n\r\n\tfog_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_FOG\",\r\n\r\n\t\t\t\"uniform vec3 fogColor;\",\r\n\r\n\t\t\t\"#ifdef FOG_EXP2\",\r\n\r\n\t\t\t\t\"uniform float fogDensity;\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"uniform float fogNear;\",\r\n\t\t\t\t\"uniform float fogFar;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tfog_fragment: [\r\n\r\n\t\t\"#ifdef USE_FOG\",\r\n\r\n\t\t\t\"float depth = gl_FragCoord.z / gl_FragCoord.w;\",\r\n\r\n\t\t\t\"#ifdef FOG_EXP2\",\r\n\r\n\t\t\t\t\"const float LOG2 = 1.442695;\",\r\n\t\t\t\t\"float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\",\r\n\t\t\t\t\"fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"float fogFactor = smoothstep( fogNear, fogFar, depth );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// ENVIRONMENT MAP\r\n\r\n\tenvmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_ENVMAP\",\r\n\r\n\t\t\t\"uniform float reflectivity;\",\r\n\t\t\t\"uniform samplerCube envMap;\",\r\n\t\t\t\"uniform float flipEnvMap;\",\r\n\t\t\t\"uniform int combine;\",\r\n\r\n\t\t\t\"#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\",\r\n\r\n\t\t\t\t\"uniform bool useRefract;\",\r\n\t\t\t\t\"uniform float refractionRatio;\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"varying vec3 vReflect;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tenvmap_fragment: [\r\n\r\n\t\t\"#ifdef USE_ENVMAP\",\r\n\r\n\t\t\t\"vec3 reflectVec;\",\r\n\r\n\t\t\t\"#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\",\r\n\r\n\t\t\t\t\"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\",\r\n\r\n\t\t\t\t\"if ( useRefract ) {\",\r\n\r\n\t\t\t\t\t\"reflectVec = refract( cameraToVertex, normal, refractionRatio );\",\r\n\r\n\t\t\t\t\"} else { \",\r\n\r\n\t\t\t\t\t\"reflectVec = reflect( cameraToVertex, normal );\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"reflectVec = vReflect;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\"float flipNormal = ( -1.0 + 2.0 * float( gl_FrontFacing ) );\",\r\n\t\t\t\t\"vec4 cubeColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"vec4 cubeColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\"cubeColor.xyz *= cubeColor.xyz;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"if ( combine == 1 ) {\",\r\n\r\n\t\t\t\t\"gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularStrength * reflectivity );\",\r\n\r\n\t\t\t\"} else if ( combine == 2 ) {\",\r\n\r\n\t\t\t\t\"gl_FragColor.xyz += cubeColor.xyz * specularStrength * reflectivity;\",\r\n\r\n\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\"gl_FragColor.xyz = mix( gl_FragColor.xyz, gl_FragColor.xyz * cubeColor.xyz, specularStrength * reflectivity );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tenvmap_pars_vertex: [\r\n\r\n\t\t\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\",\r\n\r\n\t\t\t\"varying vec3 vReflect;\",\r\n\r\n\t\t\t\"uniform float refractionRatio;\",\r\n\t\t\t\"uniform bool useRefract;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tworldpos_vertex : [\r\n\r\n\t\t\"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\",\r\n\r\n\t\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\t\"vec4 worldPosition = modelMatrix * skinned;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#if defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\",\r\n\r\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( morphed, 1.0 );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#if ! defined( USE_MORPHTARGETS ) && ! defined( USE_SKINNING )\",\r\n\r\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tenvmap_vertex : [\r\n\r\n\t\t\"#if defined( USE_ENVMAP ) && ! defined( USE_BUMPMAP ) && ! defined( USE_NORMALMAP )\",\r\n\r\n\t\t\t\"vec3 worldNormal = mat3( modelMatrix[ 0 ].xyz, modelMatrix[ 1 ].xyz, modelMatrix[ 2 ].xyz ) * objectNormal;\",\r\n\t\t\t\"worldNormal = normalize( worldNormal );\",\r\n\r\n\t\t\t\"vec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\",\r\n\r\n\t\t\t\"if ( useRefract ) {\",\r\n\r\n\t\t\t\t\"vReflect = refract( cameraToVertex, worldNormal, refractionRatio );\",\r\n\r\n\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\"vReflect = reflect( cameraToVertex, worldNormal );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// COLOR MAP (particles)\r\n\r\n\tmap_particle_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_MAP\",\r\n\r\n\t\t\t\"uniform sampler2D map;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\r\n\tmap_particle_fragment: [\r\n\r\n\t\t\"#ifdef USE_MAP\",\r\n\r\n\t\t\t\"gl_FragColor = gl_FragColor * texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// COLOR MAP (triangles)\r\n\r\n\tmap_pars_vertex: [\r\n\r\n\t\t\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\",\r\n\r\n\t\t\t\"varying vec2 vUv;\",\r\n\t\t\t\"uniform vec4 offsetRepeat;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tmap_pars_fragment: [\r\n\r\n\t\t\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\",\r\n\r\n\t\t\t\"varying vec2 vUv;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef USE_MAP\",\r\n\r\n\t\t\t\"uniform sampler2D map;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tmap_vertex: [\r\n\r\n\t\t\"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP )\",\r\n\r\n\t\t\t\"vUv = uv * offsetRepeat.zw + offsetRepeat.xy;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tmap_fragment: [\r\n\r\n\t\t\"#ifdef USE_MAP\",\r\n\r\n\t\t\t\"vec4 texelColor = texture2D( map, vUv );\",\r\n\r\n\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\"texelColor.xyz *= texelColor.xyz;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"gl_FragColor = gl_FragColor * texelColor;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// LIGHT MAP\r\n\r\n\tlightmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_LIGHTMAP\",\r\n\r\n\t\t\t\"varying vec2 vUv2;\",\r\n\t\t\t\"uniform sampler2D lightMap;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlightmap_pars_vertex: [\r\n\r\n\t\t\"#ifdef USE_LIGHTMAP\",\r\n\r\n\t\t\t\"varying vec2 vUv2;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlightmap_fragment: [\r\n\r\n\t\t\"#ifdef USE_LIGHTMAP\",\r\n\r\n\t\t\t\"gl_FragColor = gl_FragColor * texture2D( lightMap, vUv2 );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlightmap_vertex: [\r\n\r\n\t\t\"#ifdef USE_LIGHTMAP\",\r\n\r\n\t\t\t\"vUv2 = uv2;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// BUMP MAP\r\n\r\n\tbumpmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_BUMPMAP\",\r\n\r\n\t\t\t\"uniform sampler2D bumpMap;\",\r\n\t\t\t\"uniform float bumpScale;\",\r\n\r\n\t\t\t// Derivative maps - bump mapping unparametrized surfaces by Morten Mikkelsen\r\n\t\t\t//\thttp://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html\r\n\r\n\t\t\t// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\r\n\r\n\t\t\t\"vec2 dHdxy_fwd() {\",\r\n\r\n\t\t\t\t\"vec2 dSTdx = dFdx( vUv );\",\r\n\t\t\t\t\"vec2 dSTdy = dFdy( vUv );\",\r\n\r\n\t\t\t\t\"float Hll = bumpScale * texture2D( bumpMap, vUv ).x;\",\r\n\t\t\t\t\"float dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\",\r\n\t\t\t\t\"float dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\",\r\n\r\n\t\t\t\t\"return vec2( dBx, dBy );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\t\"vec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\",\r\n\r\n\t\t\t\t\"vec3 vSigmaX = dFdx( surf_pos );\",\r\n\t\t\t\t\"vec3 vSigmaY = dFdy( surf_pos );\",\r\n\t\t\t\t\"vec3 vN = surf_norm;\",\t\t// normalized\r\n\r\n\t\t\t\t\"vec3 R1 = cross( vSigmaY, vN );\",\r\n\t\t\t\t\"vec3 R2 = cross( vN, vSigmaX );\",\r\n\r\n\t\t\t\t\"float fDet = dot( vSigmaX, R1 );\",\r\n\r\n\t\t\t\t\"vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\",\r\n\t\t\t\t\"return normalize( abs( fDet ) * surf_norm - vGrad );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// NORMAL MAP\r\n\r\n\tnormalmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_NORMALMAP\",\r\n\r\n\t\t\t\"uniform sampler2D normalMap;\",\r\n\t\t\t\"uniform vec2 normalScale;\",\r\n\r\n\t\t\t// Per-Pixel Tangent Space Normal Mapping\r\n\t\t\t// http://hacksoflife.blogspot.ch/2009/11/per-pixel-tangent-space-normal-mapping.html\r\n\r\n\t\t\t\"vec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\",\r\n\r\n\t\t\t\t\"vec3 q0 = dFdx( eye_pos.xyz );\",\r\n\t\t\t\t\"vec3 q1 = dFdy( eye_pos.xyz );\",\r\n\t\t\t\t\"vec2 st0 = dFdx( vUv.st );\",\r\n\t\t\t\t\"vec2 st1 = dFdy( vUv.st );\",\r\n\r\n\t\t\t\t\"vec3 S = normalize( q0 * st1.t - q1 * st0.t );\",\r\n\t\t\t\t\"vec3 T = normalize( -q0 * st1.s + q1 * st0.s );\",\r\n\t\t\t\t\"vec3 N = normalize( surf_norm );\",\r\n\r\n\t\t\t\t\"vec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\",\r\n\t\t\t\t\"mapN.xy = normalScale * mapN.xy;\",\r\n\t\t\t\t\"mat3 tsn = mat3( S, T, N );\",\r\n\t\t\t\t\"return normalize( tsn * mapN );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// SPECULAR MAP\r\n\r\n\tspecularmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_SPECULARMAP\",\r\n\r\n\t\t\t\"uniform sampler2D specularMap;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tspecularmap_fragment: [\r\n\r\n\t\t\"float specularStrength;\",\r\n\r\n\t\t\"#ifdef USE_SPECULARMAP\",\r\n\r\n\t\t\t\"vec4 texelSpecular = texture2D( specularMap, vUv );\",\r\n\t\t\t\"specularStrength = texelSpecular.r;\",\r\n\r\n\t\t\"#else\",\r\n\r\n\t\t\t\"specularStrength = 1.0;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// LIGHTS LAMBERT\r\n\r\n\tlights_lambert_pars_vertex: [\r\n\r\n\t\t\"uniform vec3 ambient;\",\r\n\t\t\"uniform vec3 diffuse;\",\r\n\t\t\"uniform vec3 emissive;\",\r\n\r\n\t\t\"uniform vec3 ambientLightColor;\",\r\n\r\n\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\"uniform vec3 wrapRGB;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlights_lambert_vertex: [\r\n\r\n\t\t\"vLightFront = vec3( 0.0 );\",\r\n\r\n\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\"vLightBack = vec3( 0.0 );\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"transformedNormal = normalize( transformedNormal );\",\r\n\r\n\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\r\n\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\"float dotProduct = dot( transformedNormal, dirVector );\",\r\n\t\t\t\"vec3 directionalLightWeighting = vec3( max( dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\"vec3 directionalLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\"vec3 directionalLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\"vec3 directionalLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\t\t\t\t\"directionalLightWeighting = mix( directionalLightWeighting, directionalLightWeightingHalf, wrapRGB );\",\r\n\r\n\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\"directionalLightWeightingBack = mix( directionalLightWeightingBack, directionalLightWeightingHalfBack, wrapRGB );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"vLightFront += directionalLightColor[ i ] * directionalLightWeighting;\",\r\n\r\n\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\"vLightBack += directionalLightColor[ i ] * directionalLightWeightingBack;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\r\n\r\n\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\"lVector = normalize( lVector );\",\r\n\t\t\t\t\"float dotProduct = dot( transformedNormal, lVector );\",\r\n\r\n\t\t\t\t\"vec3 pointLightWeighting = vec3( max( dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\"vec3 pointLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\"vec3 pointLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\"vec3 pointLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\t\t\t\t\t\"pointLightWeighting = mix( pointLightWeighting, pointLightWeightingHalf, wrapRGB );\",\r\n\r\n\t\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\t\"pointLightWeightingBack = mix( pointLightWeightingBack, pointLightWeightingHalfBack, wrapRGB );\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"vLightFront += pointLightColor[ i ] * pointLightWeighting * lDistance;\",\r\n\r\n\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\"vLightBack += pointLightColor[ i ] * pointLightWeightingBack * lDistance;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\r\n\r\n\t\t\t\t\"float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - worldPosition.xyz ) );\",\r\n\r\n\t\t\t\t\"if ( spotEffect > spotLightAngleCos[ i ] ) {\",\r\n\r\n\t\t\t\t\t\"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\",\r\n\r\n\t\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\t\"if ( spotLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\t\"lVector = normalize( lVector );\",\r\n\r\n\t\t\t\t\t\"float dotProduct = dot( transformedNormal, lVector );\",\r\n\t\t\t\t\t\"vec3 spotLightWeighting = vec3( max( dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\t\"vec3 spotLightWeightingBack = vec3( max( -dotProduct, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 spotLightWeightingHalfBack = vec3( max( -0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\"vec3 spotLightWeightingHalf = vec3( max( 0.5 * dotProduct + 0.5, 0.0 ) );\",\r\n\t\t\t\t\t\t\"spotLightWeighting = mix( spotLightWeighting, spotLightWeightingHalf, wrapRGB );\",\r\n\r\n\t\t\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\t\t\"spotLightWeightingBack = mix( spotLightWeightingBack, spotLightWeightingHalfBack, wrapRGB );\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"vLightFront += spotLightColor[ i ] * spotLightWeighting * lDistance * spotEffect;\",\r\n\r\n\t\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\t\"vLightBack += spotLightColor[ i ] * spotLightWeightingBack * lDistance * spotEffect;\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\",\r\n\t\t\t\t\"vec3 lVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\t\"float dotProduct = dot( transformedNormal, lVector );\",\r\n\r\n\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\r\n\t\t\t\t\"float hemiDiffuseWeightBack = -0.5 * dotProduct + 0.5;\",\r\n\r\n\t\t\t\t\"vLightFront += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\",\r\n\r\n\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t\"vLightBack += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeightBack );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"vLightFront = vLightFront * diffuse + ambient * ambientLightColor + emissive;\",\r\n\r\n\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\"vLightBack = vLightBack * diffuse + ambient * ambientLightColor + emissive;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// LIGHTS PHONG\r\n\r\n\tlights_phong_pars_vertex: [\r\n\r\n\t\t\"#ifndef PHONG_PER_PIXEL\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\t\"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\t\"varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\",\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\r\n\tlights_phong_vertex: [\r\n\r\n\t\t\"#ifndef PHONG_PER_PIXEL\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\r\n\r\n\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\"vPointLight[ i ] = vec4( lVector, lDistance );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\"vec3 lVector = lPosition.xyz - mvPosition.xyz;\",\r\n\r\n\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\"if ( spotLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\"vSpotLight[ i ] = vec4( lVector, lDistance );\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\",\r\n\r\n\t\t\t\"vWorldPosition = worldPosition.xyz;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlights_phong_pars_fragment: [\r\n\r\n\t\t\"uniform vec3 ambientLightColor;\",\r\n\r\n\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\t\"#ifdef PHONG_PER_PIXEL\",\r\n\r\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\"uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\t\"#ifdef PHONG_PER_PIXEL\",\r\n\r\n\t\t\t\t\"uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"varying vec4 vSpotLight[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0 || defined( USE_BUMPMAP )\",\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\"uniform vec3 wrapRGB;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"varying vec3 vViewPosition;\",\r\n\t\t\"varying vec3 vNormal;\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tlights_phong_fragment: [\r\n\r\n\t\t\"vec3 normal = normalize( vNormal );\",\r\n\t\t\"vec3 viewPosition = normalize( vViewPosition );\",\r\n\r\n\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\"normal = normal * ( -1.0 + 2.0 * float( gl_FrontFacing ) );\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef USE_NORMALMAP\",\r\n\r\n\t\t\t\"normal = perturbNormal2Arb( -vViewPosition, normal );\",\r\n\r\n\t\t\"#elif defined( USE_BUMPMAP )\",\r\n\r\n\t\t\t\"normal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"vec3 pointDiffuse = vec3( 0.0 );\",\r\n\t\t\t\"vec3 pointSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"#ifdef PHONG_PER_PIXEL\",\r\n\r\n\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\t\"vec3 lVector = lPosition.xyz + vViewPosition.xyz;\",\r\n\r\n\t\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\t\"lVector = normalize( lVector );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"vec3 lVector = normalize( vPointLight[ i ].xyz );\",\r\n\t\t\t\t\t\"float lDistance = vPointLight[ i ].w;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\r\n\r\n\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\"float pointDiffuseWeightFull = max( dotProduct, 0.0 );\",\r\n\t\t\t\t\t\"float pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\"vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"float pointDiffuseWeight = max( dotProduct, 0.0 );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"pointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\",\r\n\r\n\t\t\t\t// specular\r\n\r\n\t\t\t\t\"vec3 pointHalfVector = normalize( lVector + viewPosition );\",\r\n\t\t\t\t\"float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\",\r\n\t\t\t\t\"float pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\",\r\n\r\n\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\"vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, pointHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\"pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"pointSpecular += specular * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"vec3 spotDiffuse = vec3( 0.0 );\",\r\n\t\t\t\"vec3 spotSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\"for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"#ifdef PHONG_PER_PIXEL\",\r\n\r\n\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\t\"vec3 lVector = lPosition.xyz + vViewPosition.xyz;\",\r\n\r\n\t\t\t\t\t\"float lDistance = 1.0;\",\r\n\t\t\t\t\t\"if ( spotLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\t\"lDistance = 1.0 - min( ( length( lVector ) / spotLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\t\"lVector = normalize( lVector );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"vec3 lVector = normalize( vSpotLight[ i ].xyz );\",\r\n\t\t\t\t\t\"float lDistance = vSpotLight[ i ].w;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\",\r\n\r\n\t\t\t\t\"if ( spotEffect > spotLightAngleCos[ i ] ) {\",\r\n\r\n\t\t\t\t\t\"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\",\r\n\r\n\t\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\r\n\r\n\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\"float spotDiffuseWeightFull = max( dotProduct, 0.0 );\",\r\n\t\t\t\t\t\t\"float spotDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"float spotDiffuseWeight = max( dotProduct, 0.0 );\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"spotDiffuse += diffuse * spotLightColor[ i ] * spotDiffuseWeight * lDistance * spotEffect;\",\r\n\r\n\t\t\t\t\t// specular\r\n\r\n\t\t\t\t\t\"vec3 spotHalfVector = normalize( lVector + viewPosition );\",\r\n\t\t\t\t\t\"float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\",\r\n\t\t\t\t\t\"float spotSpecularWeight = specularStrength * max( pow( spotDotNormalHalf, shininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\t\"vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, spotHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\t\"spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * specularNormalization * spotEffect;\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"spotSpecular += specular * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * lDistance * spotEffect;\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\"vec3 dirDiffuse = vec3( 0.0 );\",\r\n\t\t\t\"vec3 dirSpecular = vec3( 0.0 );\" ,\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\r\n\t\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\"float dotProduct = dot( normal, dirVector );\",\r\n\r\n\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\"float dirDiffuseWeightFull = max( dotProduct, 0.0 );\",\r\n\t\t\t\t\t\"float dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\"vec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"float dirDiffuseWeight = max( dotProduct, 0.0 );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"dirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\",\r\n\r\n\t\t\t\t// specular\r\n\r\n\t\t\t\t\"vec3 dirHalfVector = normalize( dirVector + viewPosition );\",\r\n\t\t\t\t\"float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\",\r\n\t\t\t\t\"float dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\",\r\n\r\n\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t// fresnel term from skin shader\r\n\t\t\t\t\t\"const float F0 = 0.128;\",\r\n\r\n\t\t\t\t\t\"float base = 1.0 - dot( viewPosition, dirHalfVector );\",\r\n\t\t\t\t\t\"float exponential = pow( base, 5.0 );\",\r\n\r\n\t\t\t\t\t\"float fresnel = exponential + F0 * ( 1.0 - exponential );\",\r\n\t\t\t\t\t*/\r\n\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t// fresnel term from fresnel shader\r\n\t\t\t\t\t\"const float mFresnelBias = 0.08;\",\r\n\t\t\t\t\t\"const float mFresnelScale = 0.3;\",\r\n\t\t\t\t\t\"const float mFresnelPower = 5.0;\",\r\n\r\n\t\t\t\t\t\"float fresnel = mFresnelBias + mFresnelScale * pow( 1.0 + dot( normalize( -viewPosition ), normal ), mFresnelPower );\",\r\n\t\t\t\t\t*/\r\n\r\n\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t//\"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization * fresnel;\",\r\n\r\n\t\t\t\t\t\"vec3 schlick = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\"dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"dirSpecular += specular * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\"vec3 hemiDiffuse = vec3( 0.0 );\",\r\n\t\t\t\"vec3 hemiSpecular = vec3( 0.0 );\" ,\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\",\r\n\t\t\t\t\"vec3 lVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\r\n\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\r\n\r\n\t\t\t\t\"vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\",\r\n\r\n\t\t\t\t\"hemiDiffuse += diffuse * hemiColor;\",\r\n\r\n\t\t\t\t// specular (sky light)\r\n\r\n\t\t\t\t\"vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\",\r\n\t\t\t\t\"float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\",\r\n\t\t\t\t\"float hemiSpecularWeightSky = specularStrength * max( pow( hemiDotNormalHalfSky, shininess ), 0.0 );\",\r\n\r\n\t\t\t\t// specular (ground light)\r\n\r\n\t\t\t\t\"vec3 lVectorGround = -lVector;\",\r\n\r\n\t\t\t\t\"vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\",\r\n\t\t\t\t\"float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\",\r\n\t\t\t\t\"float hemiSpecularWeightGround = specularStrength * max( pow( hemiDotNormalHalfGround, shininess ), 0.0 );\",\r\n\r\n\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\"float dotProductGround = dot( normal, lVectorGround );\",\r\n\r\n\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\"float specularNormalization = ( shininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\"vec3 schlickSky = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\",\r\n\t\t\t\t\t\"vec3 schlickGround = specular + vec3( 1.0 - specular ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\",\r\n\t\t\t\t\t\"hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"hemiSpecular += specular * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"vec3 totalDiffuse = vec3( 0.0 );\",\r\n\t\t\"vec3 totalSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\"totalDiffuse += dirDiffuse;\",\r\n\t\t\t\"totalSpecular += dirSpecular;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\"totalDiffuse += hemiDiffuse;\",\r\n\t\t\t\"totalSpecular += hemiSpecular;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\"totalDiffuse += pointDiffuse;\",\r\n\t\t\t\"totalSpecular += pointSpecular;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\"totalDiffuse += spotDiffuse;\",\r\n\t\t\t\"totalSpecular += spotSpecular;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef METAL\",\r\n\r\n\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient + totalSpecular );\",\r\n\r\n\t\t\"#else\",\r\n\r\n\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// VERTEX COLORS\r\n\r\n\tcolor_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_COLOR\",\r\n\r\n\t\t\t\"varying vec3 vColor;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\r\n\tcolor_fragment: [\r\n\r\n\t\t\"#ifdef USE_COLOR\",\r\n\r\n\t\t\t\"gl_FragColor = gl_FragColor * vec4( vColor, opacity );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tcolor_pars_vertex: [\r\n\r\n\t\t\"#ifdef USE_COLOR\",\r\n\r\n\t\t\t\"varying vec3 vColor;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\r\n\tcolor_vertex: [\r\n\r\n\t\t\"#ifdef USE_COLOR\",\r\n\r\n\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\"vColor = color * color;\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"vColor = color;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// SKINNING\r\n\r\n\tskinning_pars_vertex: [\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"#ifdef BONE_TEXTURE\",\r\n\r\n\t\t\t\t\"uniform sampler2D boneTexture;\",\r\n\r\n\t\t\t\t\"mat4 getBoneMatrix( const in float i ) {\",\r\n\r\n\t\t\t\t\t\"float j = i * 4.0;\",\r\n\t\t\t\t\t\"float x = mod( j, N_BONE_PIXEL_X );\",\r\n\t\t\t\t\t\"float y = floor( j / N_BONE_PIXEL_X );\",\r\n\r\n\t\t\t\t\t\"const float dx = 1.0 / N_BONE_PIXEL_X;\",\r\n\t\t\t\t\t\"const float dy = 1.0 / N_BONE_PIXEL_Y;\",\r\n\r\n\t\t\t\t\t\"y = dy * ( y + 0.5 );\",\r\n\r\n\t\t\t\t\t\"vec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\",\r\n\t\t\t\t\t\"vec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\",\r\n\t\t\t\t\t\"vec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\",\r\n\t\t\t\t\t\"vec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\",\r\n\r\n\t\t\t\t\t\"mat4 bone = mat4( v1, v2, v3, v4 );\",\r\n\r\n\t\t\t\t\t\"return bone;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\t\"uniform mat4 boneGlobalMatrices[ MAX_BONES ];\",\r\n\r\n\t\t\t\t\"mat4 getBoneMatrix( const in float i ) {\",\r\n\r\n\t\t\t\t\t\"mat4 bone = boneGlobalMatrices[ int(i) ];\",\r\n\t\t\t\t\t\"return bone;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tskinbase_vertex: [\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"mat4 boneMatX = getBoneMatrix( skinIndex.x );\",\r\n\t\t\t\"mat4 boneMatY = getBoneMatrix( skinIndex.y );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tskinning_vertex: [\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"#ifdef USE_MORPHTARGETS\",\r\n\r\n\t\t\t\"vec4 skinVertex = vec4( morphed, 1.0 );\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\"vec4 skinVertex = vec4( position, 1.0 );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"vec4 skinned = boneMatX * skinVertex * skinWeight.x;\",\r\n\t\t\t\"skinned \t += boneMatY * skinVertex * skinWeight.y;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// MORPHING\r\n\r\n\tmorphtarget_pars_vertex: [\r\n\r\n\t\t\"#ifdef USE_MORPHTARGETS\",\r\n\r\n\t\t\t\"#ifndef USE_MORPHNORMALS\",\r\n\r\n\t\t\t\"uniform float morphTargetInfluences[ 8 ];\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\"uniform float morphTargetInfluences[ 4 ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tmorphtarget_vertex: [\r\n\r\n\t\t\"#ifdef USE_MORPHTARGETS\",\r\n\r\n\t\t\t\"vec3 morphed = vec3( 0.0 );\",\r\n\t\t\t\"morphed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\",\r\n\t\t\t\"morphed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\",\r\n\t\t\t\"morphed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\",\r\n\t\t\t\"morphed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\",\r\n\r\n\t\t\t\"#ifndef USE_MORPHNORMALS\",\r\n\r\n\t\t\t\"morphed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\",\r\n\t\t\t\"morphed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\",\r\n\t\t\t\"morphed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\",\r\n\t\t\t\"morphed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"morphed += position;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tdefault_vertex : [\r\n\r\n\t\t\"vec4 mvPosition;\",\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"mvPosition = modelViewMatrix * skinned;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if !defined( USE_SKINNING ) && defined( USE_MORPHTARGETS )\",\r\n\r\n\t\t\t\"mvPosition = modelViewMatrix * vec4( morphed, 1.0 );\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if !defined( USE_SKINNING ) && ! defined( USE_MORPHTARGETS )\",\r\n\r\n\t\t\t\"mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"gl_Position = projectionMatrix * mvPosition;\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tmorphnormal_vertex: [\r\n\r\n\t\t\"#ifdef USE_MORPHNORMALS\",\r\n\r\n\t\t\t\"vec3 morphedNormal = vec3( 0.0 );\",\r\n\r\n\t\t\t\"morphedNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\",\r\n\t\t\t\"morphedNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\",\r\n\t\t\t\"morphedNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\",\r\n\t\t\t\"morphedNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\",\r\n\r\n\t\t\t\"morphedNormal += normal;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tskinnormal_vertex: [\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"mat4 skinMatrix = skinWeight.x * boneMatX;\",\r\n\t\t\t\"skinMatrix \t+= skinWeight.y * boneMatY;\",\r\n\r\n\t\t\t\"#ifdef USE_MORPHNORMALS\",\r\n\r\n\t\t\t\"vec4 skinnedNormal = skinMatrix * vec4( morphedNormal, 0.0 );\",\r\n\r\n\t\t\t\"#else\",\r\n\r\n\t\t\t\"vec4 skinnedNormal = skinMatrix * vec4( normal, 0.0 );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tdefaultnormal_vertex: [\r\n\r\n\t\t\"vec3 objectNormal;\",\r\n\r\n\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\"objectNormal = skinnedNormal.xyz;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if !defined( USE_SKINNING ) && defined( USE_MORPHNORMALS )\",\r\n\r\n\t\t\t\"objectNormal = morphedNormal;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#if !defined( USE_SKINNING ) && ! defined( USE_MORPHNORMALS )\",\r\n\r\n\t\t\t\"objectNormal = normal;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"#ifdef FLIP_SIDED\",\r\n\r\n\t\t\t\"objectNormal = -objectNormal;\",\r\n\r\n\t\t\"#endif\",\r\n\r\n\t\t\"vec3 transformedNormal = normalMatrix * objectNormal;\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// SHADOW MAP\r\n\r\n\t// based on SpiderGL shadow map and Fabien Sanglard's GLSL shadow mapping examples\r\n\t// http://spidergl.org/example.php?id=6\r\n\t// \thttp://fabiensanglard.net/shadowmapping\r\n\r\n\tshadowmap_pars_fragment: [\r\n\r\n\t\t\"#ifdef USE_SHADOWMAP\",\r\n\r\n\t\t\t\"uniform sampler2D shadowMap[ MAX_SHADOWS ];\",\r\n\t\t\t\"uniform vec2 shadowMapSize[ MAX_SHADOWS ];\",\r\n\r\n\t\t\t\"uniform float shadowDarkness[ MAX_SHADOWS ];\",\r\n\t\t\t\"uniform float shadowBias[ MAX_SHADOWS ];\",\r\n\r\n\t\t\t\"varying vec4 vShadowCoord[ MAX_SHADOWS ];\",\r\n\r\n\t\t\t\"float unpackDepth( const in vec4 rgba_depth ) {\",\r\n\r\n\t\t\t\t\"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 );\",\r\n\t\t\t\t\"float depth = dot( rgba_depth, bit_shift );\",\r\n\t\t\t\t\"return depth;\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tshadowmap_fragment: [\r\n\r\n\t\t\"#ifdef USE_SHADOWMAP\",\r\n\r\n\t\t\t\"#ifdef SHADOWMAP_DEBUG\",\r\n\r\n\t\t\t\t\"vec3 frustumColors[3];\",\r\n\t\t\t\t\"frustumColors[0] = vec3( 1.0, 0.5, 0.0 );\",\r\n\t\t\t\t\"frustumColors[1] = vec3( 0.0, 1.0, 0.8 );\",\r\n\t\t\t\t\"frustumColors[2] = vec3( 0.0, 0.5, 1.0 );\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef SHADOWMAP_CASCADE\",\r\n\r\n\t\t\t\t\"int inFrustumCount = 0;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"float fDepth;\",\r\n\t\t\t\"vec3 shadowColor = vec3( 1.0 );\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_SHADOWS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;\",\r\n\r\n\t\t\t\t// \"if ( something && something )\" \t\t breaks ATI OpenGL shader compiler\r\n\t\t\t\t// \"if ( all( something, something ) )\" using this instead\r\n\r\n\t\t\t\t\"bvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\",\r\n\t\t\t\t\"bool inFrustum = all( inFrustumVec );\",\r\n\r\n\t\t\t\t// don't shadow pixels outside of light frustum\r\n\t\t\t\t// use just first frustum (for cascades)\r\n\t\t\t\t// don't shadow pixels behind far plane of light frustum\r\n\r\n\t\t\t\t\"#ifdef SHADOWMAP_CASCADE\",\r\n\r\n\t\t\t\t\t\"inFrustumCount += int( inFrustum );\",\r\n\t\t\t\t\t\"bvec3 frustumTestVec = bvec3( inFrustum, inFrustumCount == 1, shadowCoord.z <= 1.0 );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"bvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"bool frustumTest = all( frustumTestVec );\",\r\n\r\n\t\t\t\t\"if ( frustumTest ) {\",\r\n\r\n\t\t\t\t\t\"shadowCoord.z += shadowBias[ i ];\",\r\n\r\n\t\t\t\t\t\"#if defined( SHADOWMAP_TYPE_PCF )\",\r\n\r\n\t\t\t\t\t\t// Percentage-close filtering\r\n\t\t\t\t\t\t// (9 pixel kernel)\r\n\t\t\t\t\t\t// http://fabiensanglard.net/shadowmappingPCF/\r\n\r\n\t\t\t\t\t\t\"float shadow = 0.0;\",\r\n\r\n\t\t\t\t\t\t/*\r\n\t\t\t\t\t\t// nested loops breaks shader compiler / validator on some ATI cards when using OpenGL\r\n\t\t\t\t\t\t// must enroll loop manually\r\n\r\n\t\t\t\t\t\t\"for ( float y = -1.25; y <= 1.25; y += 1.25 )\",\r\n\t\t\t\t\t\t\t\"for ( float x = -1.25; x <= 1.25; x += 1.25 ) {\",\r\n\r\n\t\t\t\t\t\t\t\t\"vec4 rgbaDepth = texture2D( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );\",\r\n\r\n\t\t\t\t\t\t\t\t// doesn't seem to produce any noticeable visual difference compared to simple \"texture2D\" lookup\r\n\t\t\t\t\t\t\t\t//\"vec4 rgbaDepth = texture2DProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );\",\r\n\r\n\t\t\t\t\t\t\t\t\"float fDepth = unpackDepth( rgbaDepth );\",\r\n\r\n\t\t\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z )\",\r\n\t\t\t\t\t\t\t\t\t\"shadow += 1.0;\",\r\n\r\n\t\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\t\t\"shadow /= 9.0;\",\r\n\r\n\t\t\t\t\t\t*/\r\n\r\n\t\t\t\t\t\t\"const float shadowDelta = 1.0 / 9.0;\",\r\n\r\n\t\t\t\t\t\t\"float xPixelOffset = 1.0 / shadowMapSize[ i ].x;\",\r\n\t\t\t\t\t\t\"float yPixelOffset = 1.0 / shadowMapSize[ i ].y;\",\r\n\r\n\t\t\t\t\t\t\"float dx0 = -1.25 * xPixelOffset;\",\r\n\t\t\t\t\t\t\"float dy0 = -1.25 * yPixelOffset;\",\r\n\t\t\t\t\t\t\"float dx1 = 1.25 * xPixelOffset;\",\r\n\t\t\t\t\t\t\"float dy1 = 1.25 * yPixelOffset;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"fDepth = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\",\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z ) shadow += shadowDelta;\",\r\n\r\n\t\t\t\t\t\t\"shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\",\r\n\r\n\t\t\t\t\t\"#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\",\r\n\r\n\t\t\t\t\t\t// Percentage-close filtering\r\n\t\t\t\t\t\t// (9 pixel kernel)\r\n\t\t\t\t\t\t// http://fabiensanglard.net/shadowmappingPCF/\r\n\r\n\t\t\t\t\t\t\"float shadow = 0.0;\",\r\n\r\n\t\t\t\t\t\t\"float xPixelOffset = 1.0 / shadowMapSize[ i ].x;\",\r\n\t\t\t\t\t\t\"float yPixelOffset = 1.0 / shadowMapSize[ i ].y;\",\r\n\r\n\t\t\t\t\t\t\"float dx0 = -1.0 * xPixelOffset;\",\r\n\t\t\t\t\t\t\"float dy0 = -1.0 * yPixelOffset;\",\r\n\t\t\t\t\t\t\"float dx1 = 1.0 * xPixelOffset;\",\r\n\t\t\t\t\t\t\"float dy1 = 1.0 * yPixelOffset;\",\r\n\r\n\t\t\t\t\t\t\"mat3 shadowKernel;\",\r\n\t\t\t\t\t\t\"mat3 depthKernel;\",\r\n\r\n\t\t\t\t\t\t\"depthKernel[0][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[0][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[0][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[1][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[1][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy ) );\",\r\n\t\t\t\t\t\t\"depthKernel[1][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[2][0] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[2][1] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );\",\r\n\t\t\t\t\t\t\"depthKernel[2][2] = unpackDepth( texture2D( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );\",\r\n\r\n\t\t\t\t\t\t\"vec3 shadowZ = vec3( shadowCoord.z );\",\r\n\t\t\t\t\t\t\"shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));\",\r\n\t\t\t\t\t\t\"shadowKernel[0] *= vec3(0.25);\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\"shadowKernel[1] = vec3(lessThan(depthKernel[1], shadowZ ));\",\r\n\t\t\t\t\t\t\"shadowKernel[1] *= vec3(0.25);\",\r\n\r\n\t\t\t\t\t\t\"shadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));\",\r\n\t\t\t\t\t\t\"shadowKernel[2] *= vec3(0.25);\",\r\n\r\n\t\t\t\t\t\t\"vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );\",\r\n\r\n\t\t\t\t\t\t\"shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );\",\r\n\t\t\t\t\t\t\"shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );\",\r\n\r\n\t\t\t\t\t\t\"vec4 shadowValues;\",\r\n\t\t\t\t\t\t\"shadowValues.x = mix( shadowKernel[0][1], shadowKernel[0][0], fractionalCoord.y );\",\r\n\t\t\t\t\t\t\"shadowValues.y = mix( shadowKernel[0][2], shadowKernel[0][1], fractionalCoord.y );\",\r\n\t\t\t\t\t\t\"shadowValues.z = mix( shadowKernel[1][1], shadowKernel[1][0], fractionalCoord.y );\",\r\n\t\t\t\t\t\t\"shadowValues.w = mix( shadowKernel[1][2], shadowKernel[1][1], fractionalCoord.y );\",\r\n\r\n\t\t\t\t\t\t\"shadow = dot( shadowValues, vec4( 1.0 ) );\",\r\n\r\n\t\t\t\t\t\t\"shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"vec4 rgbaDepth = texture2D( shadowMap[ i ], shadowCoord.xy );\",\r\n\t\t\t\t\t\t\"float fDepth = unpackDepth( rgbaDepth );\",\r\n\r\n\t\t\t\t\t\t\"if ( fDepth < shadowCoord.z )\",\r\n\r\n\t\t\t\t\t\t\t// spot with multiple shadows is darker\r\n\r\n\t\t\t\t\t\t\t\"shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );\",\r\n\r\n\t\t\t\t\t\t\t// spot with multiple shadows has the same color as single shadow spot\r\n\r\n\t\t\t\t\t\t\t//\"shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\r\n\t\t\t\t\"#ifdef SHADOWMAP_DEBUG\",\r\n\r\n\t\t\t\t\t\"#ifdef SHADOWMAP_CASCADE\",\r\n\r\n\t\t\t\t\t\t\"if ( inFrustum && inFrustumCount == 1 ) gl_FragColor.xyz *= frustumColors[ i ];\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"if ( inFrustum ) gl_FragColor.xyz *= frustumColors[ i ];\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\t\"#ifdef GAMMA_OUTPUT\",\r\n\r\n\t\t\t\t\"shadowColor *= shadowColor;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * shadowColor;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tshadowmap_pars_vertex: [\r\n\r\n\t\t\"#ifdef USE_SHADOWMAP\",\r\n\r\n\t\t\t\"varying vec4 vShadowCoord[ MAX_SHADOWS ];\",\r\n\t\t\t\"uniform mat4 shadowMatrix[ MAX_SHADOWS ];\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\tshadowmap_vertex: [\r\n\r\n\t\t\"#ifdef USE_SHADOWMAP\",\r\n\r\n\t\t\t\"for( int i = 0; i < MAX_SHADOWS; i ++ ) {\",\r\n\r\n\t\t\t\t\"vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// ALPHATEST\r\n\r\n\talphatest_fragment: [\r\n\r\n\t\t\"#ifdef ALPHATEST\",\r\n\r\n\t\t\t\"if ( gl_FragColor.a < ALPHATEST ) discard;\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\"),\r\n\r\n\t// LINEAR SPACE\r\n\r\n\tlinear_to_gamma_fragment: [\r\n\r\n\t\t\"#ifdef GAMMA_OUTPUT\",\r\n\r\n\t\t\t\"gl_FragColor.xyz = sqrt( gl_FragColor.xyz );\",\r\n\r\n\t\t\"#endif\"\r\n\r\n\t].join(\"\\n\")\r\n\r\n\r\n};\r\n\r\nTHREE.UniformsUtils = {\r\n\r\n\tmerge: function ( uniforms ) {\r\n\r\n\t\tvar u, p, tmp, merged = {};\r\n\r\n\t\tfor ( u = 0; u < uniforms.length; u ++ ) {\r\n\r\n\t\t\ttmp = this.clone( uniforms[ u ] );\r\n\r\n\t\t\tfor ( p in tmp ) {\r\n\r\n\t\t\t\tmerged[ p ] = tmp[ p ];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn merged;\r\n\r\n\t},\r\n\r\n\tclone: function ( uniforms_src ) {\r\n\r\n\t\tvar u, p, parameter, parameter_src, uniforms_dst = {};\r\n\r\n\t\tfor ( u in uniforms_src ) {\r\n\r\n\t\t\tuniforms_dst[ u ] = {};\r\n\r\n\t\t\tfor ( p in uniforms_src[ u ] ) {\r\n\r\n\t\t\t\tparameter_src = uniforms_src[ u ][ p ];\r\n\r\n\t\t\t\tif ( parameter_src instanceof THREE.Color ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector2 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector3 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Vector4 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Matrix4 ||\r\n\t\t\t\t\t parameter_src instanceof THREE.Texture ) {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\r\n\r\n\t\t\t\t} else if ( parameter_src instanceof Array ) {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn uniforms_dst;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.UniformsLib = {\r\n\r\n\tcommon: {\r\n\r\n\t\t\"diffuse\" : { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\r\n\t\t\"opacity\" : { type: \"f\", value: 1.0 },\r\n\r\n\t\t\"map\" : { type: \"t\", value: null },\r\n\t\t\"offsetRepeat\" : { type: \"v4\", value: new THREE.Vector4( 0, 0, 1, 1 ) },\r\n\r\n\t\t\"lightMap\" : { type: \"t\", value: null },\r\n\t\t\"specularMap\" : { type: \"t\", value: null },\r\n\r\n\t\t\"envMap\" : { type: \"t\", value: null },\r\n\t\t\"flipEnvMap\" : { type: \"f\", value: -1 },\r\n\t\t\"useRefract\" : { type: \"i\", value: 0 },\r\n\t\t\"reflectivity\" : { type: \"f\", value: 1.0 },\r\n\t\t\"refractionRatio\" : { type: \"f\", value: 0.98 },\r\n\t\t\"combine\" : { type: \"i\", value: 0 },\r\n\r\n\t\t\"morphTargetInfluences\" : { type: \"f\", value: 0 }\r\n\r\n\t},\r\n\r\n\tbump: {\r\n\r\n\t\t\"bumpMap\" : { type: \"t\", value: null },\r\n\t\t\"bumpScale\" : { type: \"f\", value: 1 }\r\n\r\n\t},\r\n\r\n\tnormalmap: {\r\n\r\n\t\t\"normalMap\" : { type: \"t\", value: null },\r\n\t\t\"normalScale\" : { type: \"v2\", value: new THREE.Vector2( 1, 1 ) }\r\n\t},\r\n\r\n\tfog : {\r\n\r\n\t\t\"fogDensity\" : { type: \"f\", value: 0.00025 },\r\n\t\t\"fogNear\" : { type: \"f\", value: 1 },\r\n\t\t\"fogFar\" : { type: \"f\", value: 2000 },\r\n\t\t\"fogColor\" : { type: \"c\", value: new THREE.Color( 0xffffff ) }\r\n\r\n\t},\r\n\r\n\tlights: {\r\n\r\n\t\t\"ambientLightColor\" : { type: \"fv\", value: [] },\r\n\r\n\t\t\"directionalLightDirection\" : { type: \"fv\", value: [] },\r\n\t\t\"directionalLightColor\" : { type: \"fv\", value: [] },\r\n\r\n\t\t\"hemisphereLightDirection\" : { type: \"fv\", value: [] },\r\n\t\t\"hemisphereLightSkyColor\" : { type: \"fv\", value: [] },\r\n\t\t\"hemisphereLightGroundColor\" : { type: \"fv\", value: [] },\r\n\r\n\t\t\"pointLightColor\" : { type: \"fv\", value: [] },\r\n\t\t\"pointLightPosition\" : { type: \"fv\", value: [] },\r\n\t\t\"pointLightDistance\" : { type: \"fv1\", value: [] },\r\n\r\n\t\t\"spotLightColor\" : { type: \"fv\", value: [] },\r\n\t\t\"spotLightPosition\" : { type: \"fv\", value: [] },\r\n\t\t\"spotLightDirection\" : { type: \"fv\", value: [] },\r\n\t\t\"spotLightDistance\" : { type: \"fv1\", value: [] },\r\n\t\t\"spotLightAngleCos\" : { type: \"fv1\", value: [] },\r\n\t\t\"spotLightExponent\" : { type: \"fv1\", value: [] }\r\n\r\n\t},\r\n\r\n\tparticle: {\r\n\r\n\t\t\"psColor\" : { type: \"c\", value: new THREE.Color( 0xeeeeee ) },\r\n\t\t\"opacity\" : { type: \"f\", value: 1.0 },\r\n\t\t\"size\" : { type: \"f\", value: 1.0 },\r\n\t\t\"scale\" : { type: \"f\", value: 1.0 },\r\n\t\t\"map\" : { type: \"t\", value: null },\r\n\r\n\t\t\"fogDensity\" : { type: \"f\", value: 0.00025 },\r\n\t\t\"fogNear\" : { type: \"f\", value: 1 },\r\n\t\t\"fogFar\" : { type: \"f\", value: 2000 },\r\n\t\t\"fogColor\" : { type: \"c\", value: new THREE.Color( 0xffffff ) }\r\n\r\n\t},\r\n\r\n\tshadowmap: {\r\n\r\n\t\t\"shadowMap\": { type: \"tv\", value: [] },\r\n\t\t\"shadowMapSize\": { type: \"v2v\", value: [] },\r\n\r\n\t\t\"shadowBias\" : { type: \"fv1\", value: [] },\r\n\t\t\"shadowDarkness\": { type: \"fv1\", value: [] },\r\n\r\n\t\t\"shadowMatrix\" : { type: \"m4v\", value: [] }\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ShaderLib = {\r\n\r\n\t'basic': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"common\" ],\r\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\r\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ]\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\r\n\r\n\t\t\t\t\"#ifdef USE_ENVMAP\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"defaultnormal_vertex\" ],\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"worldpos_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 diffuse;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"specularmap_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( diffuse, opacity );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"alphatest_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"specularmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'lambert': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"common\" ],\r\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\r\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\r\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"ambient\" : { type: \"c\", value: new THREE.Color( 0xffffff ) },\r\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) },\r\n\t\t\t\t\"wrapRGB\" : { type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"#define LAMBERT\",\r\n\r\n\t\t\t\"varying vec3 vLightFront;\",\r\n\r\n\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\"varying vec3 vLightBack;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lights_lambert_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"defaultnormal_vertex\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"worldpos_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lights_lambert_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\t\"varying vec3 vLightFront;\",\r\n\r\n\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\"varying vec3 vLightBack;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"specularmap_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"alphatest_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"specularmap_fragment\" ],\r\n\r\n\t\t\t\t\"#ifdef DOUBLE_SIDED\",\r\n\r\n\t\t\t\t\t//\"float isFront = float( gl_FrontFacing );\",\r\n\t\t\t\t\t//\"gl_FragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;\",\r\n\r\n\t\t\t\t\t\"if ( gl_FrontFacing )\",\r\n\t\t\t\t\t\t\"gl_FragColor.xyz *= vLightFront;\",\r\n\t\t\t\t\t\"else\",\r\n\t\t\t\t\t\t\"gl_FragColor.xyz *= vLightBack;\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"gl_FragColor.xyz *= vLightFront;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'phong': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"common\" ],\r\n\t\t\tTHREE.UniformsLib[ \"bump\" ],\r\n\t\t\tTHREE.UniformsLib[ \"normalmap\" ],\r\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\r\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\r\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"ambient\" : { type: \"c\", value: new THREE.Color( 0xffffff ) },\r\n\t\t\t\t\"emissive\" : { type: \"c\", value: new THREE.Color( 0x000000 ) },\r\n\t\t\t\t\"specular\" : { type: \"c\", value: new THREE.Color( 0x111111 ) },\r\n\t\t\t\t\"shininess\": { type: \"f\", value: 30 },\r\n\t\t\t\t\"wrapRGB\" : { type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"#define PHONG\",\r\n\r\n\t\t\t\"varying vec3 vViewPosition;\",\r\n\t\t\t\"varying vec3 vNormal;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lights_phong_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinnormal_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"defaultnormal_vertex\" ],\r\n\r\n\t\t\t\t\"vNormal = normalize( transformedNormal );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\r\n\r\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"worldpos_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"lights_phong_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 diffuse;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\t\"uniform vec3 ambient;\",\r\n\t\t\t\"uniform vec3 emissive;\",\r\n\t\t\t\"uniform vec3 specular;\",\r\n\t\t\t\"uniform float shininess;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"map_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lightmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"envmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"lights_phong_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"bumpmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"normalmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"specularmap_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( vec3 ( 1.0 ), opacity );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"alphatest_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"specularmap_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"lights_phong_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"lightmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"envmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'particle_basic': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"particle\" ],\r\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ]\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"uniform float size;\",\r\n\t\t\t\"uniform float scale;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\r\n\r\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\r\n\r\n\t\t\t\t\"#ifdef USE_SIZEATTENUATION\",\r\n\t\t\t\t\t\"gl_PointSize = size * ( scale / length( mvPosition.xyz ) );\",\r\n\t\t\t\t\"#else\",\r\n\t\t\t\t\t\"gl_PointSize = size;\",\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"worldpos_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 psColor;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"map_particle_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( psColor, opacity );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"map_particle_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"alphatest_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'dashed': {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"common\" ],\r\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\r\n\r\n\t\t\t{\r\n\t\t\t\t\"scale\": { type: \"f\", value: 1 },\r\n\t\t\t\t\"dashSize\": { type: \"f\", value: 1 },\r\n\t\t\t\t\"totalSize\": { type: \"f\", value: 2 }\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"uniform float scale;\",\r\n\t\t\t\"attribute float lineDistance;\",\r\n\r\n\t\t\t\"varying float vLineDistance;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_vertex\" ],\r\n\r\n\t\t\t\t\"vLineDistance = scale * lineDistance;\",\r\n\r\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\",\r\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 diffuse;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\t\"uniform float dashSize;\",\r\n\t\t\t\"uniform float totalSize;\",\r\n\r\n\t\t\t\"varying float vLineDistance;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"color_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"if ( mod( vLineDistance, totalSize ) > dashSize ) {\",\r\n\r\n\t\t\t\t\t\"discard;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( diffuse, opacity );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"color_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'depth': {\r\n\r\n\t\tuniforms: {\r\n\r\n\t\t\t\"mNear\": { type: \"f\", value: 1.0 },\r\n\t\t\t\"mFar\" : { type: \"f\", value: 2000.0 },\r\n\t\t\t\"opacity\" : { type: \"f\", value: 1.0 }\r\n\r\n\t\t},\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform float mNear;\",\r\n\t\t\t\"uniform float mFar;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"float depth = gl_FragCoord.z / gl_FragCoord.w;\",\r\n\t\t\t\t\"float color = 1.0 - smoothstep( mNear, mFar, depth );\",\r\n\t\t\t\t\"gl_FragColor = vec4( vec3( color ), opacity );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t'normal': {\r\n\r\n\t\tuniforms: {\r\n\r\n\t\t\t\"opacity\" : { type: \"f\", value: 1.0 }\r\n\r\n\t\t},\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"varying vec3 vNormal;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform float opacity;\",\r\n\t\t\t\"varying vec3 vNormal;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( 0.5 * normalize( vNormal ) + 0.5, opacity );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t/* -------------------------------------------------------------------------\r\n\t//\tNormal map shader\r\n\t//\t\t- Blinn-Phong\r\n\t//\t\t- normal + diffuse + specular + AO + displacement + reflection + shadow maps\r\n\t//\t\t- point and directional lights (use with \"lights: true\" material option)\r\n\t ------------------------------------------------------------------------- */\r\n\r\n\t'normalmap' : {\r\n\r\n\t\tuniforms: THREE.UniformsUtils.merge( [\r\n\r\n\t\t\tTHREE.UniformsLib[ \"fog\" ],\r\n\t\t\tTHREE.UniformsLib[ \"lights\" ],\r\n\t\t\tTHREE.UniformsLib[ \"shadowmap\" ],\r\n\r\n\t\t\t{\r\n\r\n\t\t\t\"enableAO\"\t\t : { type: \"i\", value: 0 },\r\n\t\t\t\"enableDiffuse\"\t : { type: \"i\", value: 0 },\r\n\t\t\t\"enableSpecular\" : { type: \"i\", value: 0 },\r\n\t\t\t\"enableReflection\": { type: \"i\", value: 0 },\r\n\t\t\t\"enableDisplacement\": { type: \"i\", value: 0 },\r\n\r\n\t\t\t\"tDisplacement\": { type: \"t\", value: null }, // must go first as this is vertex texture\r\n\t\t\t\"tDiffuse\"\t : { type: \"t\", value: null },\r\n\t\t\t\"tCube\"\t\t : { type: \"t\", value: null },\r\n\t\t\t\"tNormal\"\t : { type: \"t\", value: null },\r\n\t\t\t\"tSpecular\"\t : { type: \"t\", value: null },\r\n\t\t\t\"tAO\"\t\t : { type: \"t\", value: null },\r\n\r\n\t\t\t\"uNormalScale\": { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\r\n\r\n\t\t\t\"uDisplacementBias\": { type: \"f\", value: 0.0 },\r\n\t\t\t\"uDisplacementScale\": { type: \"f\", value: 1.0 },\r\n\r\n\t\t\t\"uDiffuseColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) },\r\n\t\t\t\"uSpecularColor\": { type: \"c\", value: new THREE.Color( 0x111111 ) },\r\n\t\t\t\"uAmbientColor\": { type: \"c\", value: new THREE.Color( 0xffffff ) },\r\n\t\t\t\"uShininess\": { type: \"f\", value: 30 },\r\n\t\t\t\"uOpacity\": { type: \"f\", value: 1 },\r\n\r\n\t\t\t\"useRefract\": { type: \"i\", value: 0 },\r\n\t\t\t\"uRefractionRatio\": { type: \"f\", value: 0.98 },\r\n\t\t\t\"uReflectivity\": { type: \"f\", value: 0.5 },\r\n\r\n\t\t\t\"uOffset\" : { type: \"v2\", value: new THREE.Vector2( 0, 0 ) },\r\n\t\t\t\"uRepeat\" : { type: \"v2\", value: new THREE.Vector2( 1, 1 ) },\r\n\r\n\t\t\t\"wrapRGB\" : { type: \"v3\", value: new THREE.Vector3( 1, 1, 1 ) }\r\n\r\n\t\t\t}\r\n\r\n\t\t] ),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 uAmbientColor;\",\r\n\t\t\t\"uniform vec3 uDiffuseColor;\",\r\n\t\t\t\"uniform vec3 uSpecularColor;\",\r\n\t\t\t\"uniform float uShininess;\",\r\n\t\t\t\"uniform float uOpacity;\",\r\n\r\n\t\t\t\"uniform bool enableDiffuse;\",\r\n\t\t\t\"uniform bool enableSpecular;\",\r\n\t\t\t\"uniform bool enableAO;\",\r\n\t\t\t\"uniform bool enableReflection;\",\r\n\r\n\t\t\t\"uniform sampler2D tDiffuse;\",\r\n\t\t\t\"uniform sampler2D tNormal;\",\r\n\t\t\t\"uniform sampler2D tSpecular;\",\r\n\t\t\t\"uniform sampler2D tAO;\",\r\n\r\n\t\t\t\"uniform samplerCube tCube;\",\r\n\r\n\t\t\t\"uniform vec2 uNormalScale;\",\r\n\r\n\t\t\t\"uniform bool useRefract;\",\r\n\t\t\t\"uniform float uRefractionRatio;\",\r\n\t\t\t\"uniform float uReflectivity;\",\r\n\r\n\t\t\t\"varying vec3 vTangent;\",\r\n\t\t\t\"varying vec3 vBinormal;\",\r\n\t\t\t\"varying vec3 vNormal;\",\r\n\t\t\t\"varying vec2 vUv;\",\r\n\r\n\t\t\t\"uniform vec3 ambientLightColor;\",\r\n\r\n\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\t\"uniform vec3 directionalLightColor[ MAX_DIR_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 directionalLightDirection[ MAX_DIR_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\t\"uniform vec3 hemisphereLightSkyColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 hemisphereLightGroundColor[ MAX_HEMI_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 hemisphereLightDirection[ MAX_HEMI_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];\",\r\n\t\t\t\t\"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\"uniform vec3 spotLightColor[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 spotLightPosition[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\t\"uniform vec3 spotLightDirection[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\t\"uniform float spotLightAngleCos[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\t\"uniform float spotLightExponent[ MAX_SPOT_LIGHTS ];\",\r\n\t\t\t\t\"uniform float spotLightDistance[ MAX_SPOT_LIGHTS ];\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\"uniform vec3 wrapRGB;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\t\t\t\"varying vec3 vViewPosition;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_fragment\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"fog_pars_fragment\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( vec3( 1.0 ), uOpacity );\",\r\n\r\n\t\t\t\t\"vec3 specularTex = vec3( 1.0 );\",\r\n\r\n\t\t\t\t\"vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;\",\r\n\t\t\t\t\"normalTex.xy *= uNormalScale;\",\r\n\t\t\t\t\"normalTex = normalize( normalTex );\",\r\n\r\n\t\t\t\t\"if( enableDiffuse ) {\",\r\n\r\n\t\t\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\t\t\"vec4 texelColor = texture2D( tDiffuse, vUv );\",\r\n\t\t\t\t\t\t\"texelColor.xyz *= texelColor.xyz;\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor = gl_FragColor * texelColor;\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor = gl_FragColor * texture2D( tDiffuse, vUv );\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"if( enableAO ) {\",\r\n\r\n\t\t\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\t\t\"vec4 aoColor = texture2D( tAO, vUv );\",\r\n\t\t\t\t\t\t\"aoColor.xyz *= aoColor.xyz;\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * aoColor.xyz;\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * texture2D( tAO, vUv ).xyz;\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"if( enableSpecular )\",\r\n\t\t\t\t\t\"specularTex = texture2D( tSpecular, vUv ).xyz;\",\r\n\r\n\t\t\t\t\"mat3 tsb = mat3( normalize( vTangent ), normalize( vBinormal ), normalize( vNormal ) );\",\r\n\t\t\t\t\"vec3 finalNormal = tsb * normalTex;\",\r\n\r\n\t\t\t\t\"#ifdef FLIP_SIDED\",\r\n\r\n\t\t\t\t\t\"finalNormal = -finalNormal;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"vec3 normal = normalize( finalNormal );\",\r\n\t\t\t\t\"vec3 viewPosition = normalize( vViewPosition );\",\r\n\r\n\t\t\t\t// point lights\r\n\r\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"vec3 pointDiffuse = vec3( 0.0 );\",\r\n\t\t\t\t\t\"vec3 pointSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\t\t\"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\t\t\"vec3 pointVector = lPosition.xyz + vViewPosition.xyz;\",\r\n\r\n\t\t\t\t\t\t\"float pointDistance = 1.0;\",\r\n\t\t\t\t\t\t\"if ( pointLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\t\t\"pointDistance = 1.0 - min( ( length( pointVector ) / pointLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\t\t\"pointVector = normalize( pointVector );\",\r\n\r\n\t\t\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\t\"float pointDiffuseWeightFull = max( dot( normal, pointVector ), 0.0 );\",\r\n\t\t\t\t\t\t\t\"float pointDiffuseWeightHalf = max( 0.5 * dot( normal, pointVector ) + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 pointDiffuseWeight = mix( vec3 ( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\t\"pointDiffuse += pointDistance * pointLightColor[ i ] * uDiffuseColor * pointDiffuseWeight;\",\r\n\r\n\t\t\t\t\t\t// specular\r\n\r\n\t\t\t\t\t\t\"vec3 pointHalfVector = normalize( pointVector + viewPosition );\",\r\n\t\t\t\t\t\t\"float pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\",\r\n\t\t\t\t\t\t\"float pointSpecularWeight = specularTex.r * max( pow( pointDotNormalHalf, uShininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\t\t\"float specularNormalization = ( uShininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( pointVector, pointHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\t\t\"pointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * pointDistance * specularNormalization;\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"pointSpecular += pointDistance * pointLightColor[ i ] * uSpecularColor * pointSpecularWeight * pointDiffuseWeight;\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t// spot lights\r\n\r\n\t\t\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"vec3 spotDiffuse = vec3( 0.0 );\",\r\n\t\t\t\t\t\"vec3 spotSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\t\t\"for ( int i = 0; i < MAX_SPOT_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\t\t\"vec4 lPosition = viewMatrix * vec4( spotLightPosition[ i ], 1.0 );\",\r\n\t\t\t\t\t\t\"vec3 spotVector = lPosition.xyz + vViewPosition.xyz;\",\r\n\r\n\t\t\t\t\t\t\"float spotDistance = 1.0;\",\r\n\t\t\t\t\t\t\"if ( spotLightDistance[ i ] > 0.0 )\",\r\n\t\t\t\t\t\t\t\"spotDistance = 1.0 - min( ( length( spotVector ) / spotLightDistance[ i ] ), 1.0 );\",\r\n\r\n\t\t\t\t\t\t\"spotVector = normalize( spotVector );\",\r\n\r\n\t\t\t\t\t\t\"float spotEffect = dot( spotLightDirection[ i ], normalize( spotLightPosition[ i ] - vWorldPosition ) );\",\r\n\r\n\t\t\t\t\t\t\"if ( spotEffect > spotLightAngleCos[ i ] ) {\",\r\n\r\n\t\t\t\t\t\t\t\"spotEffect = max( pow( spotEffect, spotLightExponent[ i ] ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\t\t\"float spotDiffuseWeightFull = max( dot( normal, spotVector ), 0.0 );\",\r\n\t\t\t\t\t\t\t\t\"float spotDiffuseWeightHalf = max( 0.5 * dot( normal, spotVector ) + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t\t\"vec3 spotDiffuseWeight = mix( vec3 ( spotDiffuseWeightFull ), vec3( spotDiffuseWeightHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\t\"float spotDiffuseWeight = max( dot( normal, spotVector ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\t\t\"spotDiffuse += spotDistance * spotLightColor[ i ] * uDiffuseColor * spotDiffuseWeight * spotEffect;\",\r\n\r\n\t\t\t\t\t\t\t// specular\r\n\r\n\t\t\t\t\t\t\t\"vec3 spotHalfVector = normalize( spotVector + viewPosition );\",\r\n\t\t\t\t\t\t\t\"float spotDotNormalHalf = max( dot( normal, spotHalfVector ), 0.0 );\",\r\n\t\t\t\t\t\t\t\"float spotSpecularWeight = specularTex.r * max( pow( spotDotNormalHalf, uShininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\t\t\t\"float specularNormalization = ( uShininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\t\t\t\"vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( spotVector, spotHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\t\t\t\"spotSpecular += schlick * spotLightColor[ i ] * spotSpecularWeight * spotDiffuseWeight * spotDistance * specularNormalization * spotEffect;\",\r\n\r\n\t\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\t\"spotSpecular += spotDistance * spotLightColor[ i ] * uSpecularColor * spotSpecularWeight * spotDiffuseWeight * spotEffect;\",\r\n\r\n\t\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t// directional lights\r\n\r\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"vec3 dirDiffuse = vec3( 0.0 );\",\r\n\t\t\t\t\t\"vec3 dirSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\t\t\"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {\",\r\n\r\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\",\r\n\t\t\t\t\t\t\"vec3 dirVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\t\t\"#ifdef WRAP_AROUND\",\r\n\r\n\t\t\t\t\t\t\t\"float directionalLightWeightingFull = max( dot( normal, dirVector ), 0.0 );\",\r\n\t\t\t\t\t\t\t\"float directionalLightWeightingHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 dirDiffuseWeight = mix( vec3( directionalLightWeightingFull ), vec3( directionalLightWeightingHalf ), wrapRGB );\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\t\"dirDiffuse += directionalLightColor[ i ] * uDiffuseColor * dirDiffuseWeight;\",\r\n\r\n\t\t\t\t\t\t// specular\r\n\r\n\t\t\t\t\t\t\"vec3 dirHalfVector = normalize( dirVector + viewPosition );\",\r\n\t\t\t\t\t\t\"float dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\",\r\n\t\t\t\t\t\t\"float dirSpecularWeight = specularTex.r * max( pow( dirDotNormalHalf, uShininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\t\t\"float specularNormalization = ( uShininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 schlick = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( dirVector, dirHalfVector ), 5.0 );\",\r\n\t\t\t\t\t\t\t\"dirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"dirSpecular += directionalLightColor[ i ] * uSpecularColor * dirSpecularWeight * dirDiffuseWeight;\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t// hemisphere lights\r\n\r\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"vec3 hemiDiffuse = vec3( 0.0 );\",\r\n\t\t\t\t\t\"vec3 hemiSpecular = vec3( 0.0 );\" ,\r\n\r\n\t\t\t\t\t\"for( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {\",\r\n\r\n\t\t\t\t\t\t\"vec4 lDirection = viewMatrix * vec4( hemisphereLightDirection[ i ], 0.0 );\",\r\n\t\t\t\t\t\t\"vec3 lVector = normalize( lDirection.xyz );\",\r\n\r\n\t\t\t\t\t\t// diffuse\r\n\r\n\t\t\t\t\t\t\"float dotProduct = dot( normal, lVector );\",\r\n\t\t\t\t\t\t\"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;\",\r\n\r\n\t\t\t\t\t\t\"vec3 hemiColor = mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );\",\r\n\r\n\t\t\t\t\t\t\"hemiDiffuse += uDiffuseColor * hemiColor;\",\r\n\r\n\t\t\t\t\t\t// specular (sky light)\r\n\r\n\r\n\t\t\t\t\t\t\"vec3 hemiHalfVectorSky = normalize( lVector + viewPosition );\",\r\n\t\t\t\t\t\t\"float hemiDotNormalHalfSky = 0.5 * dot( normal, hemiHalfVectorSky ) + 0.5;\",\r\n\t\t\t\t\t\t\"float hemiSpecularWeightSky = specularTex.r * max( pow( hemiDotNormalHalfSky, uShininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t// specular (ground light)\r\n\r\n\t\t\t\t\t\t\"vec3 lVectorGround = -lVector;\",\r\n\r\n\t\t\t\t\t\t\"vec3 hemiHalfVectorGround = normalize( lVectorGround + viewPosition );\",\r\n\t\t\t\t\t\t\"float hemiDotNormalHalfGround = 0.5 * dot( normal, hemiHalfVectorGround ) + 0.5;\",\r\n\t\t\t\t\t\t\"float hemiSpecularWeightGround = specularTex.r * max( pow( hemiDotNormalHalfGround, uShininess ), 0.0 );\",\r\n\r\n\t\t\t\t\t\t\"#ifdef PHYSICALLY_BASED_SHADING\",\r\n\r\n\t\t\t\t\t\t\t\"float dotProductGround = dot( normal, lVectorGround );\",\r\n\r\n\t\t\t\t\t\t\t// 2.0 => 2.0001 is hack to work around ANGLE bug\r\n\r\n\t\t\t\t\t\t\t\"float specularNormalization = ( uShininess + 2.0001 ) / 8.0;\",\r\n\r\n\t\t\t\t\t\t\t\"vec3 schlickSky = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVector, hemiHalfVectorSky ), 5.0 );\",\r\n\t\t\t\t\t\t\t\"vec3 schlickGround = uSpecularColor + vec3( 1.0 - uSpecularColor ) * pow( 1.0 - dot( lVectorGround, hemiHalfVectorGround ), 5.0 );\",\r\n\t\t\t\t\t\t\t\"hemiSpecular += hemiColor * specularNormalization * ( schlickSky * hemiSpecularWeightSky * max( dotProduct, 0.0 ) + schlickGround * hemiSpecularWeightGround * max( dotProductGround, 0.0 ) );\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"hemiSpecular += uSpecularColor * hemiColor * ( hemiSpecularWeightSky + hemiSpecularWeightGround ) * hemiDiffuseWeight;\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t// all lights contribution summation\r\n\r\n\t\t\t\t\"vec3 totalDiffuse = vec3( 0.0 );\",\r\n\t\t\t\t\"vec3 totalSpecular = vec3( 0.0 );\",\r\n\r\n\t\t\t\t\"#if MAX_DIR_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"totalDiffuse += dirDiffuse;\",\r\n\t\t\t\t\t\"totalSpecular += dirSpecular;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#if MAX_HEMI_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"totalDiffuse += hemiDiffuse;\",\r\n\t\t\t\t\t\"totalSpecular += hemiSpecular;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#if MAX_POINT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"totalDiffuse += pointDiffuse;\",\r\n\t\t\t\t\t\"totalSpecular += pointSpecular;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#if MAX_SPOT_LIGHTS > 0\",\r\n\r\n\t\t\t\t\t\"totalDiffuse += spotDiffuse;\",\r\n\t\t\t\t\t\"totalSpecular += spotSpecular;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#ifdef METAL\",\r\n\r\n\t\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor + totalSpecular );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"gl_FragColor.xyz = gl_FragColor.xyz * ( totalDiffuse + ambientLightColor * uAmbientColor ) + totalSpecular;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"if ( enableReflection ) {\",\r\n\r\n\t\t\t\t\t\"vec3 vReflect;\",\r\n\t\t\t\t\t\"vec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\",\r\n\r\n\t\t\t\t\t\"if ( useRefract ) {\",\r\n\r\n\t\t\t\t\t\t\"vReflect = refract( cameraToVertex, normal, uRefractionRatio );\",\r\n\r\n\t\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\t\"vReflect = reflect( cameraToVertex, normal );\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\t\"vec4 cubeColor = textureCube( tCube, vec3( -vReflect.x, vReflect.yz ) );\",\r\n\r\n\t\t\t\t\t\"#ifdef GAMMA_INPUT\",\r\n\r\n\t\t\t\t\t\t\"cubeColor.xyz *= cubeColor.xyz;\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"gl_FragColor.xyz = mix( gl_FragColor.xyz, cubeColor.xyz, specularTex.r * uReflectivity );\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"shadowmap_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"linear_to_gamma_fragment\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"fog_fragment\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"attribute vec4 tangent;\",\r\n\r\n\t\t\t\"uniform vec2 uOffset;\",\r\n\t\t\t\"uniform vec2 uRepeat;\",\r\n\r\n\t\t\t\"uniform bool enableDisplacement;\",\r\n\r\n\t\t\t\"#ifdef VERTEX_TEXTURES\",\r\n\r\n\t\t\t\t\"uniform sampler2D tDisplacement;\",\r\n\t\t\t\t\"uniform float uDisplacementScale;\",\r\n\t\t\t\t\"uniform float uDisplacementBias;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"varying vec3 vTangent;\",\r\n\t\t\t\"varying vec3 vBinormal;\",\r\n\t\t\t\"varying vec3 vNormal;\",\r\n\t\t\t\"varying vec2 vUv;\",\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\t\t\t\"varying vec3 vViewPosition;\",\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"shadowmap_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinnormal_vertex\" ],\r\n\r\n\t\t\t\t// normal, tangent and binormal vectors\r\n\r\n\t\t\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\t\t\"vNormal = normalize( normalMatrix * skinnedNormal.xyz );\",\r\n\r\n\t\t\t\t\t\"vec4 skinnedTangent = skinMatrix * vec4( tangent.xyz, 0.0 );\",\r\n\t\t\t\t\t\"vTangent = normalize( normalMatrix * skinnedTangent.xyz );\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"vNormal = normalize( normalMatrix * normal );\",\r\n\t\t\t\t\t\"vTangent = normalize( normalMatrix * tangent.xyz );\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"vBinormal = normalize( cross( vNormal, vTangent ) * tangent.w );\",\r\n\r\n\t\t\t\t\"vUv = uv * uRepeat + uOffset;\",\r\n\r\n\t\t\t\t// displacement mapping\r\n\r\n\t\t\t\t\"vec3 displacedPosition;\",\r\n\r\n\t\t\t\t\"#ifdef VERTEX_TEXTURES\",\r\n\r\n\t\t\t\t\t\"if ( enableDisplacement ) {\",\r\n\r\n\t\t\t\t\t\t\"vec3 dv = texture2D( tDisplacement, uv ).xyz;\",\r\n\t\t\t\t\t\t\"float df = uDisplacementScale * dv.x + uDisplacementBias;\",\r\n\t\t\t\t\t\t\"displacedPosition = position + normalize( normal ) * df;\",\r\n\r\n\t\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\t\t\t\t\"vec4 skinVertex = vec4( position, 1.0 );\",\r\n\r\n\t\t\t\t\t\t\t\"vec4 skinned = boneMatX * skinVertex * skinWeight.x;\",\r\n\t\t\t\t\t\t\t\"skinned \t += boneMatY * skinVertex * skinWeight.y;\",\r\n\r\n\t\t\t\t\t\t\t\"displacedPosition = skinned.xyz;\",\r\n\r\n\t\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\t\"displacedPosition = position;\",\r\n\r\n\t\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\t\t\t\"vec4 skinVertex = vec4( position, 1.0 );\",\r\n\r\n\t\t\t\t\t\t\"vec4 skinned = boneMatX * skinVertex * skinWeight.x;\",\r\n\t\t\t\t\t\t\"skinned \t += boneMatY * skinVertex * skinWeight.y;\",\r\n\r\n\t\t\t\t\t\t\"displacedPosition = skinned.xyz;\",\r\n\r\n\t\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\t\"displacedPosition = position;\",\r\n\r\n\t\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\t//\r\n\r\n\t\t\t\t\"vec4 mvPosition = modelViewMatrix * vec4( displacedPosition, 1.0 );\",\r\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( displacedPosition, 1.0 );\",\r\n\r\n\t\t\t\t\"gl_Position = projectionMatrix * mvPosition;\",\r\n\r\n\t\t\t\t//\r\n\r\n\t\t\t\t\"vWorldPosition = worldPosition.xyz;\",\r\n\t\t\t\t\"vViewPosition = -mvPosition.xyz;\",\r\n\r\n\t\t\t\t// shadows\r\n\r\n\t\t\t\t\"#ifdef USE_SHADOWMAP\",\r\n\r\n\t\t\t\t\t\"for( int i = 0; i < MAX_SHADOWS; i ++ ) {\",\r\n\r\n\t\t\t\t\t\t\"vShadowCoord[ i ] = shadowMatrix[ i ] * worldPosition;\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t/* -------------------------------------------------------------------------\r\n\t//\tCube map shader\r\n\t ------------------------------------------------------------------------- */\r\n\r\n\t'cube': {\r\n\r\n\t\tuniforms: { \"tCube\": { type: \"t\", value: null },\r\n\t\t\t\t\t\"tFlip\": { type: \"f\", value: -1 } },\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );\",\r\n\t\t\t\t\"vWorldPosition = worldPosition.xyz;\",\r\n\r\n\t\t\t\t\"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform samplerCube tCube;\",\r\n\t\t\t\"uniform float tFlip;\",\r\n\r\n\t\t\t\"varying vec3 vWorldPosition;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t},\r\n\r\n\t// Depth encoding into RGBA texture\r\n\t// \tbased on SpiderGL shadow map example\r\n\t// \t\thttp://spidergl.org/example.php?id=6\r\n\t// \toriginally from\r\n\t//\t\thttp://www.gamedev.net/topic/442138-packing-a-float-into-a-a8r8g8b8-texture-shader/page__whichpage__1%25EF%25BF%25BD\r\n\t// \tsee also here:\r\n\t//\t\thttp://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/\r\n\r\n\t'depthRGBA': {\r\n\r\n\t\tuniforms: {},\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\tTHREE.ShaderChunk[ \"morphtarget_pars_vertex\" ],\r\n\t\t\tTHREE.ShaderChunk[ \"skinning_pars_vertex\" ],\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinbase_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"morphtarget_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"skinning_vertex\" ],\r\n\t\t\t\tTHREE.ShaderChunk[ \"default_vertex\" ],\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\"),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"vec4 pack_depth( const in float depth ) {\",\r\n\r\n\t\t\t\t\"const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );\",\r\n\t\t\t\t\"const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );\",\r\n\t\t\t\t\"vec4 res = fract( depth * bit_shift );\",\r\n\t\t\t\t\"res -= res.xxyz * bit_mask;\",\r\n\t\t\t\t\"return res;\",\r\n\r\n\t\t\t\"}\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z );\",\r\n\r\n\t\t\t\t//\"gl_FragData[ 0 ] = pack_depth( gl_FragCoord.z / gl_FragCoord.w );\",\r\n\t\t\t\t//\"float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );\",\r\n\t\t\t\t//\"gl_FragData[ 0 ] = pack_depth( z );\",\r\n\t\t\t\t//\"gl_FragData[ 0 ] = vec4( z, z, z, 1.0 );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join(\"\\n\")\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author supereggbert / http://www.paulbrunt.co.uk/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author szimek / https://github.com/szimek/\r\n */\r\n\r\nTHREE.WebGLRenderer = function ( parameters ) {\r\n\r\n\tconsole.log( 'THREE.WebGLRenderer', THREE.REVISION );\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElement( 'canvas' ),\r\n\r\n\t_precision = parameters.precision !== undefined ? parameters.precision : 'highp',\r\n\r\n\t_alpha = parameters.alpha !== undefined ? parameters.alpha : true,\r\n\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\r\n\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\r\n\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\r\n\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\r\n\r\n\t_clearColor = new THREE.Color( 0x000000 ),\r\n\t_clearAlpha = 0;\r\n\r\n\tif ( parameters.clearColor !== undefined ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: clearColor in WebGLRenderer constructor parameters is being removed. Use .setClearColor() instead.' );\r\n\t\t_clearColor.setHex( parameters.clearColor );\r\n\r\n\t}\r\n\r\n\tif ( parameters.clearAlpha !== undefined ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: clearAlpha in WebGLRenderer constructor parameters is being removed. Use .setClearColor() instead.' );\r\n\t\t_clearAlpha = parameters.clearAlpha;\r\n\r\n\t}\r\n\r\n\t// public properties\r\n\r\n\tthis.domElement = _canvas;\r\n\tthis.context = null;\r\n\tthis.devicePixelRatio = parameters.devicePixelRatio !== undefined\r\n\t\t\t\t? parameters.devicePixelRatio\r\n\t\t\t\t: window.devicePixelRatio !== undefined\r\n\t\t\t\t\t? window.devicePixelRatio\r\n\t\t\t\t\t: 1;\r\n\r\n\t// clearing\r\n\r\n\tthis.autoClear = true;\r\n\tthis.autoClearColor = true;\r\n\tthis.autoClearDepth = true;\r\n\tthis.autoClearStencil = true;\r\n\r\n\t// scene graph\r\n\r\n\tthis.sortObjects = true;\r\n\tthis.autoUpdateObjects = true;\r\n\r\n\t// physically based shading\r\n\r\n\tthis.gammaInput = false;\r\n\tthis.gammaOutput = false;\r\n\tthis.physicallyBasedShading = false;\r\n\r\n\t// shadow map\r\n\r\n\tthis.shadowMapEnabled = false;\r\n\tthis.shadowMapAutoUpdate = true;\r\n\tthis.shadowMapType = THREE.PCFShadowMap;\r\n\tthis.shadowMapCullFace = THREE.CullFaceFront;\r\n\tthis.shadowMapDebug = false;\r\n\tthis.shadowMapCascade = false;\r\n\r\n\t// morphs\r\n\r\n\tthis.maxMorphTargets = 8;\r\n\tthis.maxMorphNormals = 4;\r\n\r\n\t// flags\r\n\r\n\tthis.autoScaleCubemaps = true;\r\n\r\n\t// custom render plugins\r\n\r\n\tthis.renderPluginsPre = [];\r\n\tthis.renderPluginsPost = [];\r\n\r\n\t// info\r\n\r\n\tthis.info = {\r\n\r\n\t\tmemory: {\r\n\r\n\t\t\tprograms: 0,\r\n\t\t\tgeometries: 0,\r\n\t\t\ttextures: 0\r\n\r\n\t\t},\r\n\r\n\t\trender: {\r\n\r\n\t\t\tcalls: 0,\r\n\t\t\tvertices: 0,\r\n\t\t\tfaces: 0,\r\n\t\t\tpoints: 0\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// internal properties\r\n\r\n\tvar _this = this,\r\n\r\n\t_programs = [],\r\n\t_programs_counter = 0,\r\n\r\n\t// internal state cache\r\n\r\n\t_currentProgram = null,\r\n\t_currentFramebuffer = null,\r\n\t_currentMaterialId = -1,\r\n\t_currentGeometryGroupHash = null,\r\n\t_currentCamera = null,\r\n\t_geometryGroupCounter = 0,\r\n\r\n\t_usedTextureUnits = 0,\r\n\r\n\t// GL state cache\r\n\r\n\t_oldDoubleSided = -1,\r\n\t_oldFlipSided = -1,\r\n\r\n\t_oldBlending = -1,\r\n\r\n\t_oldBlendEquation = -1,\r\n\t_oldBlendSrc = -1,\r\n\t_oldBlendDst = -1,\r\n\r\n\t_oldDepthTest = -1,\r\n\t_oldDepthWrite = -1,\r\n\r\n\t_oldPolygonOffset = null,\r\n\t_oldPolygonOffsetFactor = null,\r\n\t_oldPolygonOffsetUnits = null,\r\n\r\n\t_oldLineWidth = null,\r\n\r\n\t_viewportX = 0,\r\n\t_viewportY = 0,\r\n\t_viewportWidth = 0,\r\n\t_viewportHeight = 0,\r\n\t_currentWidth = 0,\r\n\t_currentHeight = 0,\r\n\r\n\t_enabledAttributes = {},\r\n\r\n\t// frustum\r\n\r\n\t_frustum = new THREE.Frustum(),\r\n\r\n\t // camera matrices cache\r\n\r\n\t_projScreenMatrix = new THREE.Matrix4(),\r\n\t_projScreenMatrixPS = new THREE.Matrix4(),\r\n\r\n\t_vector3 = new THREE.Vector3(),\r\n\r\n\t// light arrays cache\r\n\r\n\t_direction = new THREE.Vector3(),\r\n\r\n\t_lightsNeedUpdate = true,\r\n\r\n\t_lights = {\r\n\r\n\t\tambient: [ 0, 0, 0 ],\r\n\t\tdirectional: { length: 0, colors: new Array(), positions: new Array() },\r\n\t\tpoint: { length: 0, colors: new Array(), positions: new Array(), distances: new Array() },\r\n\t\tspot: { length: 0, colors: new Array(), positions: new Array(), distances: new Array(), directions: new Array(), anglesCos: new Array(), exponents: new Array() },\r\n\t\themi: { length: 0, skyColors: new Array(), groundColors: new Array(), positions: new Array() }\r\n\r\n\t};\r\n\r\n\t// initialize\r\n\r\n\tvar _gl;\r\n\r\n\tvar _glExtensionTextureFloat;\r\n\tvar _glExtensionStandardDerivatives;\r\n\tvar _glExtensionTextureFilterAnisotropic;\r\n\tvar _glExtensionCompressedTextureS3TC;\r\n\r\n\tinitGL();\r\n\r\n\tsetDefaultGLState();\r\n\r\n\tthis.context = _gl;\r\n\r\n\t// GPU capabilities\r\n\r\n\tvar _maxTextures = _gl.getParameter( _gl.MAX_TEXTURE_IMAGE_UNITS );\r\n\tvar _maxVertexTextures = _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\r\n\tvar _maxTextureSize = _gl.getParameter( _gl.MAX_TEXTURE_SIZE );\r\n\tvar _maxCubemapSize = _gl.getParameter( _gl.MAX_CUBE_MAP_TEXTURE_SIZE );\r\n\r\n\tvar _maxAnisotropy = _glExtensionTextureFilterAnisotropic ? _gl.getParameter( _glExtensionTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT ) : 0;\r\n\r\n\tvar _supportsVertexTextures = ( _maxVertexTextures > 0 );\r\n\tvar _supportsBoneTextures = _supportsVertexTextures && _glExtensionTextureFloat;\r\n\r\n\tvar _compressedTextureFormats = _glExtensionCompressedTextureS3TC ? _gl.getParameter( _gl.COMPRESSED_TEXTURE_FORMATS ) : [];\r\n\r\n\t//\r\n\r\n\tvar _vertexShaderPrecisionHighpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.HIGH_FLOAT );\r\n\tvar _vertexShaderPrecisionMediumpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.MEDIUM_FLOAT );\r\n\tvar _vertexShaderPrecisionLowpFloat = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.LOW_FLOAT );\r\n\r\n\tvar _fragmentShaderPrecisionHighpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.HIGH_FLOAT );\r\n\tvar _fragmentShaderPrecisionMediumpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.MEDIUM_FLOAT );\r\n\tvar _fragmentShaderPrecisionLowpFloat = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.LOW_FLOAT );\r\n\r\n\tvar _vertexShaderPrecisionHighpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.HIGH_INT );\r\n\tvar _vertexShaderPrecisionMediumpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.MEDIUM_INT );\r\n\tvar _vertexShaderPrecisionLowpInt = _gl.getShaderPrecisionFormat( _gl.VERTEX_SHADER, _gl.LOW_INT );\r\n\r\n\tvar _fragmentShaderPrecisionHighpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.HIGH_INT );\r\n\tvar _fragmentShaderPrecisionMediumpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.MEDIUM_INT );\r\n\tvar _fragmentShaderPrecisionLowpInt = _gl.getShaderPrecisionFormat( _gl.FRAGMENT_SHADER, _gl.LOW_INT );\r\n\r\n\t// clamp precision to maximum available\r\n\r\n\tvar highpAvailable = _vertexShaderPrecisionHighpFloat.precision > 0 && _fragmentShaderPrecisionHighpFloat.precision > 0;\r\n\tvar mediumpAvailable = _vertexShaderPrecisionMediumpFloat.precision > 0 && _fragmentShaderPrecisionMediumpFloat.precision > 0;\r\n\r\n\tif ( _precision === \"highp\" && ! highpAvailable ) {\r\n\r\n\t\tif ( mediumpAvailable ) {\r\n\r\n\t\t\t_precision = \"mediump\";\r\n\t\t\tconsole.warn( \"WebGLRenderer: highp not supported, using mediump\" );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_precision = \"lowp\";\r\n\t\t\tconsole.warn( \"WebGLRenderer: highp and mediump not supported, using lowp\" );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tif ( _precision === \"mediump\" && ! mediumpAvailable ) {\r\n\r\n\t\t_precision = \"lowp\";\r\n\t\tconsole.warn( \"WebGLRenderer: mediump not supported, using lowp\" );\r\n\r\n\t}\r\n\r\n\t// API\r\n\r\n\tthis.getContext = function () {\r\n\r\n\t\treturn _gl;\r\n\r\n\t};\r\n\r\n\tthis.supportsVertexTextures = function () {\r\n\r\n\t\treturn _supportsVertexTextures;\r\n\r\n\t};\r\n\r\n\tthis.supportsFloatTextures = function () {\r\n\r\n\t\treturn _glExtensionTextureFloat;\r\n\r\n\t};\r\n\r\n\tthis.supportsStandardDerivatives = function () {\r\n\r\n\t\treturn _glExtensionStandardDerivatives;\r\n\r\n\t};\r\n\r\n\tthis.supportsCompressedTextureS3TC = function () {\r\n\r\n\t\treturn _glExtensionCompressedTextureS3TC;\r\n\r\n\t};\r\n\r\n\tthis.getMaxAnisotropy = function () {\r\n\r\n\t\treturn _maxAnisotropy;\r\n\r\n\t};\r\n\r\n\tthis.getPrecision = function () {\r\n\r\n\t\treturn _precision;\r\n\r\n\t};\r\n\r\n\tthis.setSize = function ( width, height, updateStyle ) {\r\n\r\n\t\t_canvas.width = width * this.devicePixelRatio;\r\n\t\t_canvas.height = height * this.devicePixelRatio;\r\n\r\n\t\tif ( this.devicePixelRatio !== 1 && updateStyle !== false ) {\r\n\r\n\t\t\t_canvas.style.width = width + 'px';\r\n\t\t\t_canvas.style.height = height + 'px';\r\n\r\n\t\t}\r\n\r\n\t\tthis.setViewport( 0, 0, _canvas.width, _canvas.height );\r\n\r\n\t};\r\n\r\n\tthis.setViewport = function ( x, y, width, height ) {\r\n\r\n\t\t_viewportX = x !== undefined ? x : 0;\r\n\t\t_viewportY = y !== undefined ? y : 0;\r\n\r\n\t\t_viewportWidth = width !== undefined ? width : _canvas.width;\r\n\t\t_viewportHeight = height !== undefined ? height : _canvas.height;\r\n\r\n\t\t_gl.viewport( _viewportX, _viewportY, _viewportWidth, _viewportHeight );\r\n\r\n\t};\r\n\r\n\tthis.setScissor = function ( x, y, width, height ) {\r\n\r\n\t\t_gl.scissor( x, y, width, height );\r\n\r\n\t};\r\n\r\n\tthis.enableScissorTest = function ( enable ) {\r\n\r\n\t\tenable ? _gl.enable( _gl.SCISSOR_TEST ) : _gl.disable( _gl.SCISSOR_TEST );\r\n\r\n\t};\r\n\r\n\t// Clearing\r\n\r\n\tthis.setClearColor = function ( color, alpha ) {\r\n\r\n\t\t_clearColor.set( color );\r\n\t\t_clearAlpha = alpha !== undefined ? alpha : 1;\r\n\r\n\t\t_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\r\n\r\n\t};\r\n\r\n\tthis.setClearColorHex = function ( hex, alpha ) {\r\n\r\n\t\tconsole.warn( 'DEPRECATED: .setClearColorHex() is being removed. Use .setClearColor() instead.' );\r\n\t\tthis.setClearColor( hex, alpha );\r\n\r\n\t};\r\n\r\n\tthis.getClearColor = function () {\r\n\r\n\t\treturn _clearColor;\r\n\r\n\t};\r\n\r\n\tthis.getClearAlpha = function () {\r\n\r\n\t\treturn _clearAlpha;\r\n\r\n\t};\r\n\r\n\tthis.clear = function ( color, depth, stencil ) {\r\n\r\n\t\tvar bits = 0;\r\n\r\n\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\r\n\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\r\n\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\r\n\r\n\t\t_gl.clear( bits );\r\n\r\n\t};\r\n\r\n\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\r\n\r\n\t\tthis.setRenderTarget( renderTarget );\r\n\t\tthis.clear( color, depth, stencil );\r\n\r\n\t};\r\n\r\n\t// Plugins\r\n\r\n\tthis.addPostPlugin = function ( plugin ) {\r\n\r\n\t\tplugin.init( this );\r\n\t\tthis.renderPluginsPost.push( plugin );\r\n\r\n\t};\r\n\r\n\tthis.addPrePlugin = function ( plugin ) {\r\n\r\n\t\tplugin.init( this );\r\n\t\tthis.renderPluginsPre.push( plugin );\r\n\r\n\t};\r\n\r\n\t// Rendering\r\n\r\n\tthis.updateShadowMap = function ( scene, camera ) {\r\n\r\n\t\t_currentProgram = null;\r\n\t\t_oldBlending = -1;\r\n\t\t_oldDepthTest = -1;\r\n\t\t_oldDepthWrite = -1;\r\n\t\t_currentGeometryGroupHash = -1;\r\n\t\t_currentMaterialId = -1;\r\n\t\t_lightsNeedUpdate = true;\r\n\t\t_oldDoubleSided = -1;\r\n\t\t_oldFlipSided = -1;\r\n\r\n\t\tthis.shadowMapPlugin.update( scene, camera );\r\n\r\n\t};\r\n\r\n\t// Internal functions\r\n\r\n\t// Buffer allocation\r\n\r\n\tfunction createParticleBuffers ( geometry ) {\r\n\r\n\t\tgeometry.__webglVertexBuffer = _gl.createBuffer();\r\n\t\tgeometry.__webglColorBuffer = _gl.createBuffer();\r\n\r\n\t\t_this.info.memory.geometries ++;\r\n\r\n\t};\r\n\r\n\tfunction createLineBuffers ( geometry ) {\r\n\r\n\t\tgeometry.__webglVertexBuffer = _gl.createBuffer();\r\n\t\tgeometry.__webglColorBuffer = _gl.createBuffer();\r\n\t\tgeometry.__webglLineDistanceBuffer = _gl.createBuffer();\r\n\r\n\t\t_this.info.memory.geometries ++;\r\n\r\n\t};\r\n\r\n\tfunction createRibbonBuffers ( geometry ) {\r\n\r\n\t\tgeometry.__webglVertexBuffer = _gl.createBuffer();\r\n\t\tgeometry.__webglColorBuffer = _gl.createBuffer();\r\n\t\tgeometry.__webglNormalBuffer = _gl.createBuffer();\r\n\r\n\t\t_this.info.memory.geometries ++;\r\n\r\n\t};\r\n\r\n\tfunction createMeshBuffers ( geometryGroup ) {\r\n\r\n\t\tgeometryGroup.__webglVertexBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglNormalBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglTangentBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglColorBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglUVBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglUV2Buffer = _gl.createBuffer();\r\n\r\n\t\tgeometryGroup.__webglSkinIndicesBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglSkinWeightsBuffer = _gl.createBuffer();\r\n\r\n\t\tgeometryGroup.__webglFaceBuffer = _gl.createBuffer();\r\n\t\tgeometryGroup.__webglLineBuffer = _gl.createBuffer();\r\n\r\n\t\tvar m, ml;\r\n\r\n\t\tif ( geometryGroup.numMorphTargets ) {\r\n\r\n\t\t\tgeometryGroup.__webglMorphTargetsBuffers = [];\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {\r\n\r\n\t\t\t\tgeometryGroup.__webglMorphTargetsBuffers.push( _gl.createBuffer() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometryGroup.numMorphNormals ) {\r\n\r\n\t\t\tgeometryGroup.__webglMorphNormalsBuffers = [];\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {\r\n\r\n\t\t\t\tgeometryGroup.__webglMorphNormalsBuffers.push( _gl.createBuffer() );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t_this.info.memory.geometries ++;\r\n\r\n\t};\r\n\r\n\t// Events\r\n\r\n\tvar onGeometryDispose = function ( event ) {\r\n\r\n\t\tvar geometry = event.target;\r\n\r\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\r\n\r\n\t\tdeallocateGeometry( geometry );\r\n\r\n\t\t_this.info.memory.geometries --;\r\n\r\n\t};\r\n\r\n\tvar onTextureDispose = function ( event ) {\r\n\r\n\t\tvar texture = event.target;\r\n\r\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\r\n\r\n\t\tdeallocateTexture( texture );\r\n\r\n\t\t_this.info.memory.textures --;\r\n\r\n\r\n\t};\r\n\r\n\tvar onRenderTargetDispose = function ( event ) {\r\n\r\n\t\tvar renderTarget = event.target;\r\n\r\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\r\n\r\n\t\tdeallocateRenderTarget( renderTarget );\r\n\r\n\t\t_this.info.memory.textures --;\r\n\r\n\t};\r\n\r\n\tvar onMaterialDispose = function ( event ) {\r\n\r\n\t\tvar material = event.target;\r\n\r\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\r\n\r\n\t\tdeallocateMaterial( material );\r\n\r\n\t};\r\n\r\n\t// Buffer deallocation\r\n\r\n\tvar deallocateGeometry = function ( geometry ) {\r\n\r\n\t\tgeometry.__webglInit = undefined;\r\n\r\n\t\tif ( geometry.__webglVertexBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglVertexBuffer );\r\n\t\tif ( geometry.__webglNormalBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglNormalBuffer );\r\n\t\tif ( geometry.__webglTangentBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglTangentBuffer );\r\n\t\tif ( geometry.__webglColorBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglColorBuffer );\r\n\t\tif ( geometry.__webglUVBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglUVBuffer );\r\n\t\tif ( geometry.__webglUV2Buffer !== undefined ) _gl.deleteBuffer( geometry.__webglUV2Buffer );\r\n\r\n\t\tif ( geometry.__webglSkinIndicesBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglSkinIndicesBuffer );\r\n\t\tif ( geometry.__webglSkinWeightsBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglSkinWeightsBuffer );\r\n\r\n\t\tif ( geometry.__webglFaceBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglFaceBuffer );\r\n\t\tif ( geometry.__webglLineBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglLineBuffer );\r\n\r\n\t\tif ( geometry.__webglLineDistanceBuffer !== undefined ) _gl.deleteBuffer( geometry.__webglLineDistanceBuffer );\r\n\r\n\t\t// geometry groups\r\n\r\n\t\tif ( geometry.geometryGroups !== undefined ) {\r\n\r\n\t\t\tfor ( var g in geometry.geometryGroups ) {\r\n\r\n\t\t\t\tvar geometryGroup = geometry.geometryGroups[ g ];\r\n\r\n\t\t\t\tif ( geometryGroup.numMorphTargets !== undefined ) {\r\n\r\n\t\t\t\t\tfor ( var m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {\r\n\r\n\t\t\t\t\t\t_gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( geometryGroup.numMorphNormals !== undefined ) {\r\n\r\n\t\t\t\t\tfor ( var m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {\r\n\r\n\t\t\t\t\t\t_gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdeleteCustomAttributesBuffers( geometryGroup );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tdeleteCustomAttributesBuffers( geometry );\r\n\r\n\t};\r\n\r\n\tvar deallocateTexture = function ( texture ) {\r\n\r\n\t\tif ( texture.image && texture.image.__webglTextureCube ) {\r\n\r\n\t\t\t// cube texture\r\n\r\n\t\t\t_gl.deleteTexture( texture.image.__webglTextureCube );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// 2D texture\r\n\r\n\t\t\tif ( ! texture.__webglInit ) return;\r\n\r\n\t\t\ttexture.__webglInit = false;\r\n\t\t\t_gl.deleteTexture( texture.__webglTexture );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar deallocateRenderTarget = function ( renderTarget ) {\r\n\r\n\t\tif ( !renderTarget || ! renderTarget.__webglTexture ) return;\r\n\r\n\t\t_gl.deleteTexture( renderTarget.__webglTexture );\r\n\r\n\t\tif ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {\r\n\r\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t_gl.deleteFramebuffer( renderTarget.__webglFramebuffer[ i ] );\r\n\t\t\t\t_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer[ i ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.deleteFramebuffer( renderTarget.__webglFramebuffer );\r\n\t\t\t_gl.deleteRenderbuffer( renderTarget.__webglRenderbuffer );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tvar deallocateMaterial = function ( material ) {\r\n\r\n\t\tvar program = material.program;\r\n\r\n\t\tif ( program === undefined ) return;\r\n\r\n\t\tmaterial.program = undefined;\r\n\r\n\t\t// only deallocate GL program if this was the last use of shared program\r\n\t\t// assumed there is only single copy of any program in the _programs list\r\n\t\t// (that's how it's constructed)\r\n\r\n\t\tvar i, il, programInfo;\r\n\t\tvar deleteProgram = false;\r\n\r\n\t\tfor ( i = 0, il = _programs.length; i < il; i ++ ) {\r\n\r\n\t\t\tprogramInfo = _programs[ i ];\r\n\r\n\t\t\tif ( programInfo.program === program ) {\r\n\r\n\t\t\t\tprogramInfo.usedTimes --;\r\n\r\n\t\t\t\tif ( programInfo.usedTimes === 0 ) {\r\n\r\n\t\t\t\t\tdeleteProgram = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( deleteProgram === true ) {\r\n\r\n\t\t\t// avoid using array.splice, this is costlier than creating new array from scratch\r\n\r\n\t\t\tvar newPrograms = [];\r\n\r\n\t\t\tfor ( i = 0, il = _programs.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tprogramInfo = _programs[ i ];\r\n\r\n\t\t\t\tif ( programInfo.program !== program ) {\r\n\r\n\t\t\t\t\tnewPrograms.push( programInfo );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_programs = newPrograms;\r\n\r\n\t\t\t_gl.deleteProgram( program );\r\n\r\n\t\t\t_this.info.memory.programs --;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\t/*\r\n\tfunction deleteParticleBuffers ( geometry ) {\r\n\r\n\t\t_gl.deleteBuffer( geometry.__webglVertexBuffer );\r\n\t\t_gl.deleteBuffer( geometry.__webglColorBuffer );\r\n\r\n\t\tdeleteCustomAttributesBuffers( geometry );\r\n\r\n\t\t_this.info.memory.geometries --;\r\n\r\n\t};\r\n\r\n\tfunction deleteLineBuffers ( geometry ) {\r\n\r\n\t\t_gl.deleteBuffer( geometry.__webglVertexBuffer );\r\n\t\t_gl.deleteBuffer( geometry.__webglColorBuffer );\r\n\t\t_gl.deleteBuffer( geometry.__webglLineDistanceBuffer );\r\n\r\n\t\tdeleteCustomAttributesBuffers( geometry );\r\n\r\n\t\t_this.info.memory.geometries --;\r\n\r\n\t};\r\n\r\n\tfunction deleteRibbonBuffers ( geometry ) {\r\n\r\n\t\t_gl.deleteBuffer( geometry.__webglVertexBuffer );\r\n\t\t_gl.deleteBuffer( geometry.__webglColorBuffer );\r\n\t\t_gl.deleteBuffer( geometry.__webglNormalBuffer );\r\n\r\n\t\tdeleteCustomAttributesBuffers( geometry );\r\n\r\n\t\t_this.info.memory.geometries --;\r\n\r\n\t};\r\n\r\n\tfunction deleteMeshBuffers ( geometryGroup ) {\r\n\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglVertexBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglNormalBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglTangentBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglColorBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglUVBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglUV2Buffer );\r\n\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglSkinIndicesBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglSkinWeightsBuffer );\r\n\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglFaceBuffer );\r\n\t\t_gl.deleteBuffer( geometryGroup.__webglLineBuffer );\r\n\r\n\t\tvar m, ml;\r\n\r\n\t\tif ( geometryGroup.numMorphTargets ) {\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {\r\n\r\n\t\t\t\t_gl.deleteBuffer( geometryGroup.__webglMorphTargetsBuffers[ m ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometryGroup.numMorphNormals ) {\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {\r\n\r\n\t\t\t\t_gl.deleteBuffer( geometryGroup.__webglMorphNormalsBuffers[ m ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tdeleteCustomAttributesBuffers( geometryGroup );\r\n\r\n\t\t_this.info.memory.geometries --;\r\n\r\n\t};\r\n\t*/\r\n\r\n\tfunction deleteCustomAttributesBuffers( geometry ) {\r\n\r\n\t\tif ( geometry.__webglCustomAttributesList ) {\r\n\r\n\t\t\tfor ( var id in geometry.__webglCustomAttributesList ) {\r\n\r\n\t\t\t\t_gl.deleteBuffer( geometry.__webglCustomAttributesList[ id ].buffer );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Buffer initialization\r\n\r\n\tfunction initCustomAttributes ( geometry, object ) {\r\n\r\n\t\tvar nvertices = geometry.vertices.length;\r\n\r\n\t\tvar material = object.material;\r\n\r\n\t\tif ( material.attributes ) {\r\n\r\n\t\t\tif ( geometry.__webglCustomAttributesList === undefined ) {\r\n\r\n\t\t\t\tgeometry.__webglCustomAttributesList = [];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var a in material.attributes ) {\r\n\r\n\t\t\t\tvar attribute = material.attributes[ a ];\r\n\r\n\t\t\t\tif ( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {\r\n\r\n\t\t\t\t\tattribute.__webglInitialized = true;\r\n\r\n\t\t\t\t\tvar size = 1;\t\t// \"f\" and \"i\"\r\n\r\n\t\t\t\t\tif ( attribute.type === \"v2\" ) size = 2;\r\n\t\t\t\t\telse if ( attribute.type === \"v3\" ) size = 3;\r\n\t\t\t\t\telse if ( attribute.type === \"v4\" ) size = 4;\r\n\t\t\t\t\telse if ( attribute.type === \"c\" ) size = 3;\r\n\r\n\t\t\t\t\tattribute.size = size;\r\n\r\n\t\t\t\t\tattribute.array = new Float32Array( nvertices * size );\r\n\r\n\t\t\t\t\tattribute.buffer = _gl.createBuffer();\r\n\t\t\t\t\tattribute.buffer.belongsToAttribute = a;\r\n\r\n\t\t\t\t\tattribute.needsUpdate = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tgeometry.__webglCustomAttributesList.push( attribute );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction initParticleBuffers ( geometry, object ) {\r\n\r\n\t\tvar nvertices = geometry.vertices.length;\r\n\r\n\t\tgeometry.__vertexArray = new Float32Array( nvertices * 3 );\r\n\t\tgeometry.__colorArray = new Float32Array( nvertices * 3 );\r\n\r\n\t\tgeometry.__sortArray = [];\r\n\r\n\t\tgeometry.__webglParticleCount = nvertices;\r\n\r\n\t\tinitCustomAttributes ( geometry, object );\r\n\r\n\t};\r\n\r\n\tfunction initLineBuffers ( geometry, object ) {\r\n\r\n\t\tvar nvertices = geometry.vertices.length;\r\n\r\n\t\tgeometry.__vertexArray = new Float32Array( nvertices * 3 );\r\n\t\tgeometry.__colorArray = new Float32Array( nvertices * 3 );\r\n\t\tgeometry.__lineDistanceArray = new Float32Array( nvertices * 1 );\r\n\r\n\t\tgeometry.__webglLineCount = nvertices;\r\n\r\n\t\tinitCustomAttributes ( geometry, object );\r\n\r\n\t};\r\n\r\n\tfunction initRibbonBuffers ( geometry, object ) {\r\n\r\n\t\tvar nvertices = geometry.vertices.length;\r\n\r\n\t\tgeometry.__vertexArray = new Float32Array( nvertices * 3 );\r\n\t\tgeometry.__colorArray = new Float32Array( nvertices * 3 );\r\n\t\tgeometry.__normalArray = new Float32Array( nvertices * 3 );\r\n\r\n\t\tgeometry.__webglVertexCount = nvertices;\r\n\r\n\t\tinitCustomAttributes ( geometry, object );\r\n\r\n\t};\r\n\r\n\tfunction initMeshBuffers ( geometryGroup, object ) {\r\n\r\n\t\tvar geometry = object.geometry,\r\n\t\t\tfaces3 = geometryGroup.faces3,\r\n\t\t\tfaces4 = geometryGroup.faces4,\r\n\r\n\t\t\tnvertices = faces3.length * 3 + faces4.length * 4,\r\n\t\t\tntris = faces3.length * 1 + faces4.length * 2,\r\n\t\t\tnlines = faces3.length * 3 + faces4.length * 4,\r\n\r\n\t\t\tmaterial = getBufferMaterial( object, geometryGroup ),\r\n\r\n\t\t\tuvType = bufferGuessUVType( material ),\r\n\t\t\tnormalType = bufferGuessNormalType( material ),\r\n\t\t\tvertexColorType = bufferGuessVertexColorType( material );\r\n\r\n\t\t// console.log( \"uvType\", uvType, \"normalType\", normalType, \"vertexColorType\", vertexColorType, object, geometryGroup, material );\r\n\r\n\t\tgeometryGroup.__vertexArray = new Float32Array( nvertices * 3 );\r\n\r\n\t\tif ( normalType ) {\r\n\r\n\t\t\tgeometryGroup.__normalArray = new Float32Array( nvertices * 3 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometry.hasTangents ) {\r\n\r\n\t\t\tgeometryGroup.__tangentArray = new Float32Array( nvertices * 4 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( vertexColorType ) {\r\n\r\n\t\t\tgeometryGroup.__colorArray = new Float32Array( nvertices * 3 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( uvType ) {\r\n\r\n\t\t\tif ( geometry.faceUvs.length > 0 || geometry.faceVertexUvs.length > 0 ) {\r\n\r\n\t\t\t\tgeometryGroup.__uvArray = new Float32Array( nvertices * 2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( geometry.faceUvs.length > 1 || geometry.faceVertexUvs.length > 1 ) {\r\n\r\n\t\t\t\tgeometryGroup.__uv2Array = new Float32Array( nvertices * 2 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.geometry.skinWeights.length && object.geometry.skinIndices.length ) {\r\n\r\n\t\t\tgeometryGroup.__skinIndexArray = new Float32Array( nvertices * 4 );\r\n\t\t\tgeometryGroup.__skinWeightArray = new Float32Array( nvertices * 4 );\r\n\r\n\t\t}\r\n\r\n\t\tgeometryGroup.__faceArray = new Uint16Array( ntris * 3 );\r\n\t\tgeometryGroup.__lineArray = new Uint16Array( nlines * 2 );\r\n\r\n\t\tvar m, ml;\r\n\r\n\t\tif ( geometryGroup.numMorphTargets ) {\r\n\r\n\t\t\tgeometryGroup.__morphTargetsArrays = [];\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphTargets; m < ml; m ++ ) {\r\n\r\n\t\t\t\tgeometryGroup.__morphTargetsArrays.push( new Float32Array( nvertices * 3 ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( geometryGroup.numMorphNormals ) {\r\n\r\n\t\t\tgeometryGroup.__morphNormalsArrays = [];\r\n\r\n\t\t\tfor ( m = 0, ml = geometryGroup.numMorphNormals; m < ml; m ++ ) {\r\n\r\n\t\t\t\tgeometryGroup.__morphNormalsArrays.push( new Float32Array( nvertices * 3 ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tgeometryGroup.__webglFaceCount = ntris * 3;\r\n\t\tgeometryGroup.__webglLineCount = nlines * 2;\r\n\r\n\r\n\t\t// custom attributes\r\n\r\n\t\tif ( material.attributes ) {\r\n\r\n\t\t\tif ( geometryGroup.__webglCustomAttributesList === undefined ) {\r\n\r\n\t\t\t\tgeometryGroup.__webglCustomAttributesList = [];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var a in material.attributes ) {\r\n\r\n\t\t\t\t// Do a shallow copy of the attribute object so different geometryGroup chunks use different\r\n\t\t\t\t// attribute buffers which are correctly indexed in the setMeshBuffers function\r\n\r\n\t\t\t\tvar originalAttribute = material.attributes[ a ];\r\n\r\n\t\t\t\tvar attribute = {};\r\n\r\n\t\t\t\tfor ( var property in originalAttribute ) {\r\n\r\n\t\t\t\t\tattribute[ property ] = originalAttribute[ property ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( !attribute.__webglInitialized || attribute.createUniqueBuffers ) {\r\n\r\n\t\t\t\t\tattribute.__webglInitialized = true;\r\n\r\n\t\t\t\t\tvar size = 1;\t\t// \"f\" and \"i\"\r\n\r\n\t\t\t\t\tif( attribute.type === \"v2\" ) size = 2;\r\n\t\t\t\t\telse if( attribute.type === \"v3\" ) size = 3;\r\n\t\t\t\t\telse if( attribute.type === \"v4\" ) size = 4;\r\n\t\t\t\t\telse if( attribute.type === \"c\" ) size = 3;\r\n\r\n\t\t\t\t\tattribute.size = size;\r\n\r\n\t\t\t\t\tattribute.array = new Float32Array( nvertices * size );\r\n\r\n\t\t\t\t\tattribute.buffer = _gl.createBuffer();\r\n\t\t\t\t\tattribute.buffer.belongsToAttribute = a;\r\n\r\n\t\t\t\t\toriginalAttribute.needsUpdate = true;\r\n\t\t\t\t\tattribute.__original = originalAttribute;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tgeometryGroup.__webglCustomAttributesList.push( attribute );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tgeometryGroup.__inittedArrays = true;\r\n\r\n\t};\r\n\r\n\tfunction getBufferMaterial( object, geometryGroup ) {\r\n\r\n\t\treturn object.material instanceof THREE.MeshFaceMaterial\r\n\t\t\t? object.material.materials[ geometryGroup.materialIndex ]\r\n\t\t\t: object.material;\r\n\r\n\t};\r\n\r\n\tfunction materialNeedsSmoothNormals ( material ) {\r\n\r\n\t\treturn material && material.shading !== undefined && material.shading === THREE.SmoothShading;\r\n\r\n\t};\r\n\r\n\tfunction bufferGuessNormalType ( material ) {\r\n\r\n\t\t// only MeshBasicMaterial and MeshDepthMaterial don't need normals\r\n\r\n\t\tif ( ( material instanceof THREE.MeshBasicMaterial && !material.envMap ) || material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\treturn false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( materialNeedsSmoothNormals( material ) ) {\r\n\r\n\t\t\treturn THREE.SmoothShading;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn THREE.FlatShading;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction bufferGuessVertexColorType( material ) {\r\n\r\n\t\tif ( material.vertexColors ) {\r\n\r\n\t\t\treturn material.vertexColors;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t};\r\n\r\n\tfunction bufferGuessUVType( material ) {\r\n\r\n\t\t// material must use some texture to require uvs\r\n\r\n\t\tif ( material.map ||\r\n\t\t material.lightMap ||\r\n\t\t material.bumpMap ||\r\n\t\t material.normalMap ||\r\n\t\t material.specularMap ||\r\n\t\t material instanceof THREE.ShaderMaterial ) {\r\n\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\tfunction initDirectBuffers( geometry ) {\r\n\r\n\t\tvar a, attribute, type;\r\n\r\n\t\tfor ( a in geometry.attributes ) {\r\n\r\n\t\t\tif ( a === \"index\" ) {\r\n\r\n\t\t\t\ttype = _gl.ELEMENT_ARRAY_BUFFER;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttype = _gl.ARRAY_BUFFER;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tattribute = geometry.attributes[ a ];\r\n\r\n\t\t\tattribute.buffer = _gl.createBuffer();\r\n\r\n\t\t\t_gl.bindBuffer( type, attribute.buffer );\r\n\t\t\t_gl.bufferData( type, attribute.array, _gl.STATIC_DRAW );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Buffer setting\r\n\r\n\tfunction setParticleBuffers ( geometry, hint, object ) {\r\n\r\n\t\tvar v, c, vertex, offset, index, color,\r\n\r\n\t\tvertices = geometry.vertices,\r\n\t\tvl = vertices.length,\r\n\r\n\t\tcolors = geometry.colors,\r\n\t\tcl = colors.length,\r\n\r\n\t\tvertexArray = geometry.__vertexArray,\r\n\t\tcolorArray = geometry.__colorArray,\r\n\r\n\t\tsortArray = geometry.__sortArray,\r\n\r\n\t\tdirtyVertices = geometry.verticesNeedUpdate,\r\n\t\tdirtyElements = geometry.elementsNeedUpdate,\r\n\t\tdirtyColors = geometry.colorsNeedUpdate,\r\n\r\n\t\tcustomAttributes = geometry.__webglCustomAttributesList,\r\n\t\ti, il,\r\n\t\ta, ca, cal, value,\r\n\t\tcustomAttribute;\r\n\r\n\t\tif ( object.sortParticles ) {\r\n\r\n\t\t\t_projScreenMatrixPS.copy( _projScreenMatrix );\r\n\t\t\t_projScreenMatrixPS.multiply( object.matrixWorld );\r\n\r\n\t\t\tfor ( v = 0; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertex = vertices[ v ];\r\n\r\n\t\t\t\t_vector3.copy( vertex );\r\n\t\t\t\t_vector3.applyProjection( _projScreenMatrixPS );\r\n\r\n\t\t\t\tsortArray[ v ] = [ _vector3.z, v ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tsortArray.sort( numericalSort );\r\n\r\n\t\t\tfor ( v = 0; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertex = vertices[ sortArray[v][1] ];\r\n\r\n\t\t\t\toffset = v * 3;\r\n\r\n\t\t\t\tvertexArray[ offset ] = vertex.x;\r\n\t\t\t\tvertexArray[ offset + 1 ] = vertex.y;\r\n\t\t\t\tvertexArray[ offset + 2 ] = vertex.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( c = 0; c < cl; c ++ ) {\r\n\r\n\t\t\t\toffset = c * 3;\r\n\r\n\t\t\t\tcolor = colors[ sortArray[c][1] ];\r\n\r\n\t\t\t\tcolorArray[ offset ] = color.r;\r\n\t\t\t\tcolorArray[ offset + 1 ] = color.g;\r\n\t\t\t\tcolorArray[ offset + 2 ] = color.b;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( customAttributes ) {\r\n\r\n\t\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\t\tif ( ! ( customAttribute.boundTo === undefined || customAttribute.boundTo === \"vertices\" ) ) continue;\r\n\r\n\t\t\t\t\toffset = 0;\r\n\r\n\t\t\t\t\tcal = customAttribute.value.length;\r\n\r\n\t\t\t\t\tif ( customAttribute.size === 1 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tindex = sortArray[ ca ][ 1 ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ ca ] = customAttribute.value[ index ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 2 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tindex = sortArray[ ca ][ 1 ];\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ index ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\r\n\t\t\t\t\t\t\toffset += 2;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 3 ) {\r\n\r\n\t\t\t\t\t\tif ( customAttribute.type === \"c\" ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tindex = sortArray[ ca ][ 1 ];\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ index ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] = value.r;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.g;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.b;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tindex = sortArray[ ca ][ 1 ];\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ index ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 4 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tindex = sortArray[ ca ][ 1 ];\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ index ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] = value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 3 ] = value.w;\r\n\r\n\t\t\t\t\t\t\toffset += 4;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif ( dirtyVertices ) {\r\n\r\n\t\t\t\tfor ( v = 0; v < vl; v ++ ) {\r\n\r\n\t\t\t\t\tvertex = vertices[ v ];\r\n\r\n\t\t\t\t\toffset = v * 3;\r\n\r\n\t\t\t\t\tvertexArray[ offset ] = vertex.x;\r\n\t\t\t\t\tvertexArray[ offset + 1 ] = vertex.y;\r\n\t\t\t\t\tvertexArray[ offset + 2 ] = vertex.z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( dirtyColors ) {\r\n\r\n\t\t\t\tfor ( c = 0; c < cl; c ++ ) {\r\n\r\n\t\t\t\t\tcolor = colors[ c ];\r\n\r\n\t\t\t\t\toffset = c * 3;\r\n\r\n\t\t\t\t\tcolorArray[ offset ] = color.r;\r\n\t\t\t\t\tcolorArray[ offset + 1 ] = color.g;\r\n\t\t\t\t\tcolorArray[ offset + 2 ] = color.b;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( customAttributes ) {\r\n\r\n\t\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\t\tif ( customAttribute.needsUpdate &&\r\n\t\t\t\t\t\t ( customAttribute.boundTo === undefined ||\r\n\t\t\t\t\t\t customAttribute.boundTo === \"vertices\") ) {\r\n\r\n\t\t\t\t\t\tcal = customAttribute.value.length;\r\n\r\n\t\t\t\t\t\toffset = 0;\r\n\r\n\t\t\t\t\t\tif ( customAttribute.size === 1 ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ ca ] = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else if ( customAttribute.size === 2 ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\r\n\t\t\t\t\t\t\t\toffset += 2;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else if ( customAttribute.size === 3 ) {\r\n\r\n\t\t\t\t\t\t\tif ( customAttribute.type === \"c\" ) {\r\n\r\n\t\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.r;\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.g;\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.b;\r\n\r\n\t\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\r\n\t\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else if ( customAttribute.size === 4 ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] = value.x;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 3 ] = value.w;\r\n\r\n\t\t\t\t\t\t\t\toffset += 4;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyVertices || object.sortParticles ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyColors || object.sortParticles ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( customAttributes ) {\r\n\r\n\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\tif ( customAttribute.needsUpdate || object.sortParticles ) {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );\r\n\t\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\r\n\t};\r\n\r\n\tfunction setLineBuffers ( geometry, hint ) {\r\n\r\n\t\tvar v, c, d, vertex, offset, color,\r\n\r\n\t\tvertices = geometry.vertices,\r\n\t\tcolors = geometry.colors,\r\n\t\tlineDistances = geometry.lineDistances,\r\n\r\n\t\tvl = vertices.length,\r\n\t\tcl = colors.length,\r\n\t\tdl = lineDistances.length,\r\n\r\n\t\tvertexArray = geometry.__vertexArray,\r\n\t\tcolorArray = geometry.__colorArray,\r\n\t\tlineDistanceArray = geometry.__lineDistanceArray,\r\n\r\n\t\tdirtyVertices = geometry.verticesNeedUpdate,\r\n\t\tdirtyColors = geometry.colorsNeedUpdate,\r\n\t\tdirtyLineDistances = geometry.lineDistancesNeedUpdate,\r\n\r\n\t\tcustomAttributes = geometry.__webglCustomAttributesList,\r\n\r\n\t\ti, il,\r\n\t\ta, ca, cal, value,\r\n\t\tcustomAttribute;\r\n\r\n\t\tif ( dirtyVertices ) {\r\n\r\n\t\t\tfor ( v = 0; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertex = vertices[ v ];\r\n\r\n\t\t\t\toffset = v * 3;\r\n\r\n\t\t\t\tvertexArray[ offset ] = vertex.x;\r\n\t\t\t\tvertexArray[ offset + 1 ] = vertex.y;\r\n\t\t\t\tvertexArray[ offset + 2 ] = vertex.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyColors ) {\r\n\r\n\t\t\tfor ( c = 0; c < cl; c ++ ) {\r\n\r\n\t\t\t\tcolor = colors[ c ];\r\n\r\n\t\t\t\toffset = c * 3;\r\n\r\n\t\t\t\tcolorArray[ offset ] = color.r;\r\n\t\t\t\tcolorArray[ offset + 1 ] = color.g;\r\n\t\t\t\tcolorArray[ offset + 2 ] = color.b;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyLineDistances ) {\r\n\r\n\t\t\tfor ( d = 0; d < dl; d ++ ) {\r\n\r\n\t\t\t\tlineDistanceArray[ d ] = lineDistances[ d ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglLineDistanceBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, lineDistanceArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( customAttributes ) {\r\n\r\n\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\tif ( customAttribute.needsUpdate &&\r\n\t\t\t\t\t ( customAttribute.boundTo === undefined ||\r\n\t\t\t\t\t customAttribute.boundTo === \"vertices\" ) ) {\r\n\r\n\t\t\t\t\toffset = 0;\r\n\r\n\t\t\t\t\tcal = customAttribute.value.length;\r\n\r\n\t\t\t\t\tif ( customAttribute.size === 1 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ ca ] = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 2 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\r\n\t\t\t\t\t\t\toffset += 2;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 3 ) {\r\n\r\n\t\t\t\t\t\tif ( customAttribute.type === \"c\" ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.r;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.g;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.b;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 4 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t = value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 3 ] = value.w;\r\n\r\n\t\t\t\t\t\t\toffset += 4;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );\r\n\t\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setRibbonBuffers ( geometry, hint ) {\r\n\r\n\t\tvar v, c, n, vertex, offset, color, normal,\r\n\r\n\t\ti, il, ca, cal, customAttribute, value,\r\n\r\n\t\tvertices = geometry.vertices,\r\n\t\tcolors = geometry.colors,\r\n\t\tnormals = geometry.normals,\r\n\r\n\t\tvl = vertices.length,\r\n\t\tcl = colors.length,\r\n\t\tnl = normals.length,\r\n\r\n\t\tvertexArray = geometry.__vertexArray,\r\n\t\tcolorArray = geometry.__colorArray,\r\n\t\tnormalArray = geometry.__normalArray,\r\n\r\n\t\tdirtyVertices = geometry.verticesNeedUpdate,\r\n\t\tdirtyColors = geometry.colorsNeedUpdate,\r\n\t\tdirtyNormals = geometry.normalsNeedUpdate,\r\n\r\n\t\tcustomAttributes = geometry.__webglCustomAttributesList;\r\n\r\n\t\tif ( dirtyVertices ) {\r\n\r\n\t\t\tfor ( v = 0; v < vl; v ++ ) {\r\n\r\n\t\t\t\tvertex = vertices[ v ];\r\n\r\n\t\t\t\toffset = v * 3;\r\n\r\n\t\t\t\tvertexArray[ offset ] = vertex.x;\r\n\t\t\t\tvertexArray[ offset + 1 ] = vertex.y;\r\n\t\t\t\tvertexArray[ offset + 2 ] = vertex.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglVertexBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyColors ) {\r\n\r\n\t\t\tfor ( c = 0; c < cl; c ++ ) {\r\n\r\n\t\t\t\tcolor = colors[ c ];\r\n\r\n\t\t\t\toffset = c * 3;\r\n\r\n\t\t\t\tcolorArray[ offset ] = color.r;\r\n\t\t\t\tcolorArray[ offset + 1 ] = color.g;\r\n\t\t\t\tcolorArray[ offset + 2 ] = color.b;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglColorBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyNormals ) {\r\n\r\n\t\t\tfor ( n = 0; n < nl; n ++ ) {\r\n\r\n\t\t\t\tnormal = normals[ n ];\r\n\r\n\t\t\t\toffset = n * 3;\r\n\r\n\t\t\t\tnormalArray[ offset ] = normal.x;\r\n\t\t\t\tnormalArray[ offset + 1 ] = normal.y;\r\n\t\t\t\tnormalArray[ offset + 2 ] = normal.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometry.__webglNormalBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( customAttributes ) {\r\n\r\n\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\tif ( customAttribute.needsUpdate &&\r\n\t\t\t\t\t ( customAttribute.boundTo === undefined ||\r\n\t\t\t\t\t customAttribute.boundTo === \"vertices\" ) ) {\r\n\r\n\t\t\t\t\toffset = 0;\r\n\r\n\t\t\t\t\tcal = customAttribute.value.length;\r\n\r\n\t\t\t\t\tif ( customAttribute.size === 1 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ ca ] = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 2 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\r\n\t\t\t\t\t\t\toffset += 2;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 3 ) {\r\n\r\n\t\t\t\t\t\tif ( customAttribute.type === \"c\" ) {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.r;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.g;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.b;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t= value.x;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\r\n\t\t\t\t\t\t\t\toffset += 3;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.size === 4 ) {\r\n\r\n\t\t\t\t\t\tfor ( ca = 0; ca < cal; ca ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ ca ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset ] \t = value.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 1 ] = value.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 2 ] = value.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset + 3 ] = value.w;\r\n\r\n\t\t\t\t\t\t\toffset += 4;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );\r\n\t\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setMeshBuffers( geometryGroup, object, hint, dispose, material ) {\r\n\r\n\t\tif ( ! geometryGroup.__inittedArrays ) {\r\n\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar normalType = bufferGuessNormalType( material ),\r\n\t\tvertexColorType = bufferGuessVertexColorType( material ),\r\n\t\tuvType = bufferGuessUVType( material ),\r\n\r\n\t\tneedsSmoothNormals = ( normalType === THREE.SmoothShading );\r\n\r\n\t\tvar f, fl, fi, face,\r\n\t\tvertexNormals, faceNormal, normal,\r\n\t\tvertexColors, faceColor,\r\n\t\tvertexTangents,\r\n\t\tuv, uv2, v1, v2, v3, v4, t1, t2, t3, t4, n1, n2, n3, n4,\r\n\t\tc1, c2, c3, c4,\r\n\t\tsw1, sw2, sw3, sw4,\r\n\t\tsi1, si2, si3, si4,\r\n\t\tsa1, sa2, sa3, sa4,\r\n\t\tsb1, sb2, sb3, sb4,\r\n\t\tm, ml, i, il,\r\n\t\tvn, uvi, uv2i,\r\n\t\tvk, vkl, vka,\r\n\t\tnka, chf, faceVertexNormals,\r\n\t\ta,\r\n\r\n\t\tvertexIndex = 0,\r\n\r\n\t\toffset = 0,\r\n\t\toffset_uv = 0,\r\n\t\toffset_uv2 = 0,\r\n\t\toffset_face = 0,\r\n\t\toffset_normal = 0,\r\n\t\toffset_tangent = 0,\r\n\t\toffset_line = 0,\r\n\t\toffset_color = 0,\r\n\t\toffset_skin = 0,\r\n\t\toffset_morphTarget = 0,\r\n\t\toffset_custom = 0,\r\n\t\toffset_customSrc = 0,\r\n\r\n\t\tvalue,\r\n\r\n\t\tvertexArray = geometryGroup.__vertexArray,\r\n\t\tuvArray = geometryGroup.__uvArray,\r\n\t\tuv2Array = geometryGroup.__uv2Array,\r\n\t\tnormalArray = geometryGroup.__normalArray,\r\n\t\ttangentArray = geometryGroup.__tangentArray,\r\n\t\tcolorArray = geometryGroup.__colorArray,\r\n\r\n\t\tskinIndexArray = geometryGroup.__skinIndexArray,\r\n\t\tskinWeightArray = geometryGroup.__skinWeightArray,\r\n\r\n\t\tmorphTargetsArrays = geometryGroup.__morphTargetsArrays,\r\n\t\tmorphNormalsArrays = geometryGroup.__morphNormalsArrays,\r\n\r\n\t\tcustomAttributes = geometryGroup.__webglCustomAttributesList,\r\n\t\tcustomAttribute,\r\n\r\n\t\tfaceArray = geometryGroup.__faceArray,\r\n\t\tlineArray = geometryGroup.__lineArray,\r\n\r\n\t\tgeometry = object.geometry, // this is shared for all chunks\r\n\r\n\t\tdirtyVertices = geometry.verticesNeedUpdate,\r\n\t\tdirtyElements = geometry.elementsNeedUpdate,\r\n\t\tdirtyUvs = geometry.uvsNeedUpdate,\r\n\t\tdirtyNormals = geometry.normalsNeedUpdate,\r\n\t\tdirtyTangents = geometry.tangentsNeedUpdate,\r\n\t\tdirtyColors = geometry.colorsNeedUpdate,\r\n\t\tdirtyMorphTargets = geometry.morphTargetsNeedUpdate,\r\n\r\n\t\tvertices = geometry.vertices,\r\n\t\tchunk_faces3 = geometryGroup.faces3,\r\n\t\tchunk_faces4 = geometryGroup.faces4,\r\n\t\tobj_faces = geometry.faces,\r\n\r\n\t\tobj_uvs = geometry.faceVertexUvs[ 0 ],\r\n\t\tobj_uvs2 = geometry.faceVertexUvs[ 1 ],\r\n\r\n\t\tobj_colors = geometry.colors,\r\n\r\n\t\tobj_skinIndices = geometry.skinIndices,\r\n\t\tobj_skinWeights = geometry.skinWeights,\r\n\r\n\t\tmorphTargets = geometry.morphTargets,\r\n\t\tmorphNormals = geometry.morphNormals;\r\n\r\n\t\tif ( dirtyVertices ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\tv1 = vertices[ face.a ];\r\n\t\t\t\tv2 = vertices[ face.b ];\r\n\t\t\t\tv3 = vertices[ face.c ];\r\n\r\n\t\t\t\tvertexArray[ offset ] = v1.x;\r\n\t\t\t\tvertexArray[ offset + 1 ] = v1.y;\r\n\t\t\t\tvertexArray[ offset + 2 ] = v1.z;\r\n\r\n\t\t\t\tvertexArray[ offset + 3 ] = v2.x;\r\n\t\t\t\tvertexArray[ offset + 4 ] = v2.y;\r\n\t\t\t\tvertexArray[ offset + 5 ] = v2.z;\r\n\r\n\t\t\t\tvertexArray[ offset + 6 ] = v3.x;\r\n\t\t\t\tvertexArray[ offset + 7 ] = v3.y;\r\n\t\t\t\tvertexArray[ offset + 8 ] = v3.z;\r\n\r\n\t\t\t\toffset += 9;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\tv1 = vertices[ face.a ];\r\n\t\t\t\tv2 = vertices[ face.b ];\r\n\t\t\t\tv3 = vertices[ face.c ];\r\n\t\t\t\tv4 = vertices[ face.d ];\r\n\r\n\t\t\t\tvertexArray[ offset ] = v1.x;\r\n\t\t\t\tvertexArray[ offset + 1 ] = v1.y;\r\n\t\t\t\tvertexArray[ offset + 2 ] = v1.z;\r\n\r\n\t\t\t\tvertexArray[ offset + 3 ] = v2.x;\r\n\t\t\t\tvertexArray[ offset + 4 ] = v2.y;\r\n\t\t\t\tvertexArray[ offset + 5 ] = v2.z;\r\n\r\n\t\t\t\tvertexArray[ offset + 6 ] = v3.x;\r\n\t\t\t\tvertexArray[ offset + 7 ] = v3.y;\r\n\t\t\t\tvertexArray[ offset + 8 ] = v3.z;\r\n\r\n\t\t\t\tvertexArray[ offset + 9 ] = v4.x;\r\n\t\t\t\tvertexArray[ offset + 10 ] = v4.y;\r\n\t\t\t\tvertexArray[ offset + 11 ] = v4.z;\r\n\r\n\t\t\t\toffset += 12;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, vertexArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyMorphTargets ) {\r\n\r\n\t\t\tfor ( vk = 0, vkl = morphTargets.length; vk < vkl; vk ++ ) {\r\n\r\n\t\t\t\toffset_morphTarget = 0;\r\n\r\n\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\tchf = chunk_faces3[ f ];\r\n\t\t\t\t\tface = obj_faces[ chf ];\r\n\r\n\t\t\t\t\t// morph positions\r\n\r\n\t\t\t\t\tv1 = morphTargets[ vk ].vertices[ face.a ];\r\n\t\t\t\t\tv2 = morphTargets[ vk ].vertices[ face.b ];\r\n\t\t\t\t\tv3 = morphTargets[ vk ].vertices[ face.c ];\r\n\r\n\t\t\t\t\tvka = morphTargetsArrays[ vk ];\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget ] \t = v1.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 1 ] = v1.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 2 ] = v1.z;\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget + 3 ] = v2.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 4 ] = v2.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 5 ] = v2.z;\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget + 6 ] = v3.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 7 ] = v3.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 8 ] = v3.z;\r\n\r\n\t\t\t\t\t// morph normals\r\n\r\n\t\t\t\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\t\t\t\tif ( needsSmoothNormals ) {\r\n\r\n\t\t\t\t\t\t\tfaceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];\r\n\r\n\t\t\t\t\t\t\tn1 = faceVertexNormals.a;\r\n\t\t\t\t\t\t\tn2 = faceVertexNormals.b;\r\n\t\t\t\t\t\t\tn3 = faceVertexNormals.c;\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tn1 = morphNormals[ vk ].faceNormals[ chf ];\r\n\t\t\t\t\t\t\tn2 = n1;\r\n\t\t\t\t\t\t\tn3 = n1;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tnka = morphNormalsArrays[ vk ];\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget ] \t = n1.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 1 ] = n1.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 2 ] = n1.z;\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 3 ] = n2.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 4 ] = n2.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 5 ] = n2.z;\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 6 ] = n3.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 7 ] = n3.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 8 ] = n3.z;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//\r\n\r\n\t\t\t\t\toffset_morphTarget += 9;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\tchf = chunk_faces4[ f ];\r\n\t\t\t\t\tface = obj_faces[ chf ];\r\n\r\n\t\t\t\t\t// morph positions\r\n\r\n\t\t\t\t\tv1 = morphTargets[ vk ].vertices[ face.a ];\r\n\t\t\t\t\tv2 = morphTargets[ vk ].vertices[ face.b ];\r\n\t\t\t\t\tv3 = morphTargets[ vk ].vertices[ face.c ];\r\n\t\t\t\t\tv4 = morphTargets[ vk ].vertices[ face.d ];\r\n\r\n\t\t\t\t\tvka = morphTargetsArrays[ vk ];\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget ] \t = v1.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 1 ] = v1.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 2 ] = v1.z;\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget + 3 ] = v2.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 4 ] = v2.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 5 ] = v2.z;\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget + 6 ] = v3.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 7 ] = v3.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 8 ] = v3.z;\r\n\r\n\t\t\t\t\tvka[ offset_morphTarget + 9 ] = v4.x;\r\n\t\t\t\t\tvka[ offset_morphTarget + 10 ] = v4.y;\r\n\t\t\t\t\tvka[ offset_morphTarget + 11 ] = v4.z;\r\n\r\n\t\t\t\t\t// morph normals\r\n\r\n\t\t\t\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\t\t\t\tif ( needsSmoothNormals ) {\r\n\r\n\t\t\t\t\t\t\tfaceVertexNormals = morphNormals[ vk ].vertexNormals[ chf ];\r\n\r\n\t\t\t\t\t\t\tn1 = faceVertexNormals.a;\r\n\t\t\t\t\t\t\tn2 = faceVertexNormals.b;\r\n\t\t\t\t\t\t\tn3 = faceVertexNormals.c;\r\n\t\t\t\t\t\t\tn4 = faceVertexNormals.d;\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\tn1 = morphNormals[ vk ].faceNormals[ chf ];\r\n\t\t\t\t\t\t\tn2 = n1;\r\n\t\t\t\t\t\t\tn3 = n1;\r\n\t\t\t\t\t\t\tn4 = n1;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tnka = morphNormalsArrays[ vk ];\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget ] \t = n1.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 1 ] = n1.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 2 ] = n1.z;\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 3 ] = n2.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 4 ] = n2.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 5 ] = n2.z;\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 6 ] = n3.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 7 ] = n3.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 8 ] = n3.z;\r\n\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 9 ] = n4.x;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 10 ] = n4.y;\r\n\t\t\t\t\t\tnka[ offset_morphTarget + 11 ] = n4.z;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//\r\n\r\n\t\t\t\t\toffset_morphTarget += 12;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ vk ] );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, morphTargetsArrays[ vk ], hint );\r\n\r\n\t\t\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ vk ] );\r\n\t\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, morphNormalsArrays[ vk ], hint );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( obj_skinWeights.length ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\t// weights\r\n\r\n\t\t\t\tsw1 = obj_skinWeights[ face.a ];\r\n\t\t\t\tsw2 = obj_skinWeights[ face.b ];\r\n\t\t\t\tsw3 = obj_skinWeights[ face.c ];\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin ] = sw1.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 1 ] = sw1.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 2 ] = sw1.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 3 ] = sw1.w;\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin + 4 ] = sw2.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 5 ] = sw2.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 6 ] = sw2.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 7 ] = sw2.w;\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin + 8 ] = sw3.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 9 ] = sw3.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 10 ] = sw3.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 11 ] = sw3.w;\r\n\r\n\t\t\t\t// indices\r\n\r\n\t\t\t\tsi1 = obj_skinIndices[ face.a ];\r\n\t\t\t\tsi2 = obj_skinIndices[ face.b ];\r\n\t\t\t\tsi3 = obj_skinIndices[ face.c ];\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin ] = si1.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 1 ] = si1.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 2 ] = si1.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 3 ] = si1.w;\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin + 4 ] = si2.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 5 ] = si2.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 6 ] = si2.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 7 ] = si2.w;\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin + 8 ] = si3.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 9 ] = si3.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 10 ] = si3.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 11 ] = si3.w;\r\n\r\n\t\t\t\toffset_skin += 12;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t// weights\r\n\r\n\t\t\t\tsw1 = obj_skinWeights[ face.a ];\r\n\t\t\t\tsw2 = obj_skinWeights[ face.b ];\r\n\t\t\t\tsw3 = obj_skinWeights[ face.c ];\r\n\t\t\t\tsw4 = obj_skinWeights[ face.d ];\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin ] = sw1.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 1 ] = sw1.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 2 ] = sw1.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 3 ] = sw1.w;\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin + 4 ] = sw2.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 5 ] = sw2.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 6 ] = sw2.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 7 ] = sw2.w;\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin + 8 ] = sw3.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 9 ] = sw3.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 10 ] = sw3.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 11 ] = sw3.w;\r\n\r\n\t\t\t\tskinWeightArray[ offset_skin + 12 ] = sw4.x;\r\n\t\t\t\tskinWeightArray[ offset_skin + 13 ] = sw4.y;\r\n\t\t\t\tskinWeightArray[ offset_skin + 14 ] = sw4.z;\r\n\t\t\t\tskinWeightArray[ offset_skin + 15 ] = sw4.w;\r\n\r\n\t\t\t\t// indices\r\n\r\n\t\t\t\tsi1 = obj_skinIndices[ face.a ];\r\n\t\t\t\tsi2 = obj_skinIndices[ face.b ];\r\n\t\t\t\tsi3 = obj_skinIndices[ face.c ];\r\n\t\t\t\tsi4 = obj_skinIndices[ face.d ];\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin ] = si1.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 1 ] = si1.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 2 ] = si1.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 3 ] = si1.w;\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin + 4 ] = si2.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 5 ] = si2.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 6 ] = si2.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 7 ] = si2.w;\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin + 8 ] = si3.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 9 ] = si3.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 10 ] = si3.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 11 ] = si3.w;\r\n\r\n\t\t\t\tskinIndexArray[ offset_skin + 12 ] = si4.x;\r\n\t\t\t\tskinIndexArray[ offset_skin + 13 ] = si4.y;\r\n\t\t\t\tskinIndexArray[ offset_skin + 14 ] = si4.z;\r\n\t\t\t\tskinIndexArray[ offset_skin + 15 ] = si4.w;\r\n\r\n\t\t\t\toffset_skin += 16;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( offset_skin > 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, skinIndexArray, hint );\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, skinWeightArray, hint );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyColors && vertexColorType ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\tvertexColors = face.vertexColors;\r\n\t\t\t\tfaceColor = face.color;\r\n\r\n\t\t\t\tif ( vertexColors.length === 3 && vertexColorType === THREE.VertexColors ) {\r\n\r\n\t\t\t\t\tc1 = vertexColors[ 0 ];\r\n\t\t\t\t\tc2 = vertexColors[ 1 ];\r\n\t\t\t\t\tc3 = vertexColors[ 2 ];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tc1 = faceColor;\r\n\t\t\t\t\tc2 = faceColor;\r\n\t\t\t\t\tc3 = faceColor;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcolorArray[ offset_color ] = c1.r;\r\n\t\t\t\tcolorArray[ offset_color + 1 ] = c1.g;\r\n\t\t\t\tcolorArray[ offset_color + 2 ] = c1.b;\r\n\r\n\t\t\t\tcolorArray[ offset_color + 3 ] = c2.r;\r\n\t\t\t\tcolorArray[ offset_color + 4 ] = c2.g;\r\n\t\t\t\tcolorArray[ offset_color + 5 ] = c2.b;\r\n\r\n\t\t\t\tcolorArray[ offset_color + 6 ] = c3.r;\r\n\t\t\t\tcolorArray[ offset_color + 7 ] = c3.g;\r\n\t\t\t\tcolorArray[ offset_color + 8 ] = c3.b;\r\n\r\n\t\t\t\toffset_color += 9;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\tvertexColors = face.vertexColors;\r\n\t\t\t\tfaceColor = face.color;\r\n\r\n\t\t\t\tif ( vertexColors.length === 4 && vertexColorType === THREE.VertexColors ) {\r\n\r\n\t\t\t\t\tc1 = vertexColors[ 0 ];\r\n\t\t\t\t\tc2 = vertexColors[ 1 ];\r\n\t\t\t\t\tc3 = vertexColors[ 2 ];\r\n\t\t\t\t\tc4 = vertexColors[ 3 ];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tc1 = faceColor;\r\n\t\t\t\t\tc2 = faceColor;\r\n\t\t\t\t\tc3 = faceColor;\r\n\t\t\t\t\tc4 = faceColor;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcolorArray[ offset_color ] = c1.r;\r\n\t\t\t\tcolorArray[ offset_color + 1 ] = c1.g;\r\n\t\t\t\tcolorArray[ offset_color + 2 ] = c1.b;\r\n\r\n\t\t\t\tcolorArray[ offset_color + 3 ] = c2.r;\r\n\t\t\t\tcolorArray[ offset_color + 4 ] = c2.g;\r\n\t\t\t\tcolorArray[ offset_color + 5 ] = c2.b;\r\n\r\n\t\t\t\tcolorArray[ offset_color + 6 ] = c3.r;\r\n\t\t\t\tcolorArray[ offset_color + 7 ] = c3.g;\r\n\t\t\t\tcolorArray[ offset_color + 8 ] = c3.b;\r\n\r\n\t\t\t\tcolorArray[ offset_color + 9 ] = c4.r;\r\n\t\t\t\tcolorArray[ offset_color + 10 ] = c4.g;\r\n\t\t\t\tcolorArray[ offset_color + 11 ] = c4.b;\r\n\r\n\t\t\t\toffset_color += 12;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( offset_color > 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, colorArray, hint );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyTangents && geometry.hasTangents ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\tvertexTangents = face.vertexTangents;\r\n\r\n\t\t\t\tt1 = vertexTangents[ 0 ];\r\n\t\t\t\tt2 = vertexTangents[ 1 ];\r\n\t\t\t\tt3 = vertexTangents[ 2 ];\r\n\r\n\t\t\t\ttangentArray[ offset_tangent ] = t1.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 1 ] = t1.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 2 ] = t1.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 3 ] = t1.w;\r\n\r\n\t\t\t\ttangentArray[ offset_tangent + 4 ] = t2.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 5 ] = t2.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 6 ] = t2.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 7 ] = t2.w;\r\n\r\n\t\t\t\ttangentArray[ offset_tangent + 8 ] = t3.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 9 ] = t3.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 10 ] = t3.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 11 ] = t3.w;\r\n\r\n\t\t\t\toffset_tangent += 12;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\tvertexTangents = face.vertexTangents;\r\n\r\n\t\t\t\tt1 = vertexTangents[ 0 ];\r\n\t\t\t\tt2 = vertexTangents[ 1 ];\r\n\t\t\t\tt3 = vertexTangents[ 2 ];\r\n\t\t\t\tt4 = vertexTangents[ 3 ];\r\n\r\n\t\t\t\ttangentArray[ offset_tangent ] = t1.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 1 ] = t1.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 2 ] = t1.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 3 ] = t1.w;\r\n\r\n\t\t\t\ttangentArray[ offset_tangent + 4 ] = t2.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 5 ] = t2.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 6 ] = t2.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 7 ] = t2.w;\r\n\r\n\t\t\t\ttangentArray[ offset_tangent + 8 ] = t3.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 9 ] = t3.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 10 ] = t3.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 11 ] = t3.w;\r\n\r\n\t\t\t\ttangentArray[ offset_tangent + 12 ] = t4.x;\r\n\t\t\t\ttangentArray[ offset_tangent + 13 ] = t4.y;\r\n\t\t\t\ttangentArray[ offset_tangent + 14 ] = t4.z;\r\n\t\t\t\ttangentArray[ offset_tangent + 15 ] = t4.w;\r\n\r\n\t\t\t\toffset_tangent += 16;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, tangentArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyNormals && normalType ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\tvertexNormals = face.vertexNormals;\r\n\t\t\t\tfaceNormal = face.normal;\r\n\r\n\t\t\t\tif ( vertexNormals.length === 3 && needsSmoothNormals ) {\r\n\r\n\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\tvn = vertexNormals[ i ];\r\n\r\n\t\t\t\t\t\tnormalArray[ offset_normal ] = vn.x;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 1 ] = vn.y;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 2 ] = vn.z;\r\n\r\n\t\t\t\t\t\toffset_normal += 3;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\t\tnormalArray[ offset_normal ] = faceNormal.x;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 1 ] = faceNormal.y;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 2 ] = faceNormal.z;\r\n\r\n\t\t\t\t\t\toffset_normal += 3;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\tvertexNormals = face.vertexNormals;\r\n\t\t\t\tfaceNormal = face.normal;\r\n\r\n\t\t\t\tif ( vertexNormals.length === 4 && needsSmoothNormals ) {\r\n\r\n\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\t\tvn = vertexNormals[ i ];\r\n\r\n\t\t\t\t\t\tnormalArray[ offset_normal ] = vn.x;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 1 ] = vn.y;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 2 ] = vn.z;\r\n\r\n\t\t\t\t\t\toffset_normal += 3;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\t\tnormalArray[ offset_normal ] = faceNormal.x;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 1 ] = faceNormal.y;\r\n\t\t\t\t\t\tnormalArray[ offset_normal + 2 ] = faceNormal.z;\r\n\r\n\t\t\t\t\t\toffset_normal += 3;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, normalArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyUvs && obj_uvs && uvType ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfi = chunk_faces3[ f ];\r\n\r\n\t\t\t\tuv = obj_uvs[ fi ];\r\n\r\n\t\t\t\tif ( uv === undefined ) continue;\r\n\r\n\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\tuvi = uv[ i ];\r\n\r\n\t\t\t\t\tuvArray[ offset_uv ] = uvi.x;\r\n\t\t\t\t\tuvArray[ offset_uv + 1 ] = uvi.y;\r\n\r\n\t\t\t\t\toffset_uv += 2;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfi = chunk_faces4[ f ];\r\n\r\n\t\t\t\tuv = obj_uvs[ fi ];\r\n\r\n\t\t\t\tif ( uv === undefined ) continue;\r\n\r\n\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\tuvi = uv[ i ];\r\n\r\n\t\t\t\t\tuvArray[ offset_uv ] = uvi.x;\r\n\t\t\t\t\tuvArray[ offset_uv + 1 ] = uvi.y;\r\n\r\n\t\t\t\t\toffset_uv += 2;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( offset_uv > 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, uvArray, hint );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyUvs && obj_uvs2 && uvType ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfi = chunk_faces3[ f ];\r\n\r\n\t\t\t\tuv2 = obj_uvs2[ fi ];\r\n\r\n\t\t\t\tif ( uv2 === undefined ) continue;\r\n\r\n\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\r\n\r\n\t\t\t\t\tuv2i = uv2[ i ];\r\n\r\n\t\t\t\t\tuv2Array[ offset_uv2 ] = uv2i.x;\r\n\t\t\t\t\tuv2Array[ offset_uv2 + 1 ] = uv2i.y;\r\n\r\n\t\t\t\t\toffset_uv2 += 2;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfi = chunk_faces4[ f ];\r\n\r\n\t\t\t\tuv2 = obj_uvs2[ fi ];\r\n\r\n\t\t\t\tif ( uv2 === undefined ) continue;\r\n\r\n\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\r\n\r\n\t\t\t\t\tuv2i = uv2[ i ];\r\n\r\n\t\t\t\t\tuv2Array[ offset_uv2 ] = uv2i.x;\r\n\t\t\t\t\tuv2Array[ offset_uv2 + 1 ] = uv2i.y;\r\n\r\n\t\t\t\t\toffset_uv2 += 2;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( offset_uv2 > 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, uv2Array, hint );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dirtyElements ) {\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfaceArray[ offset_face ] \t = vertexIndex;\r\n\t\t\t\tfaceArray[ offset_face + 1 ] = vertexIndex + 1;\r\n\t\t\t\tfaceArray[ offset_face + 2 ] = vertexIndex + 2;\r\n\r\n\t\t\t\toffset_face += 3;\r\n\r\n\t\t\t\tlineArray[ offset_line ] = vertexIndex;\r\n\t\t\t\tlineArray[ offset_line + 1 ] = vertexIndex + 1;\r\n\r\n\t\t\t\tlineArray[ offset_line + 2 ] = vertexIndex;\r\n\t\t\t\tlineArray[ offset_line + 3 ] = vertexIndex + 2;\r\n\r\n\t\t\t\tlineArray[ offset_line + 4 ] = vertexIndex + 1;\r\n\t\t\t\tlineArray[ offset_line + 5 ] = vertexIndex + 2;\r\n\r\n\t\t\t\toffset_line += 6;\r\n\r\n\t\t\t\tvertexIndex += 3;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\tfaceArray[ offset_face ] = vertexIndex;\r\n\t\t\t\tfaceArray[ offset_face + 1 ] = vertexIndex + 1;\r\n\t\t\t\tfaceArray[ offset_face + 2 ] = vertexIndex + 3;\r\n\r\n\t\t\t\tfaceArray[ offset_face + 3 ] = vertexIndex + 1;\r\n\t\t\t\tfaceArray[ offset_face + 4 ] = vertexIndex + 2;\r\n\t\t\t\tfaceArray[ offset_face + 5 ] = vertexIndex + 3;\r\n\r\n\t\t\t\toffset_face += 6;\r\n\r\n\t\t\t\tlineArray[ offset_line ] = vertexIndex;\r\n\t\t\t\tlineArray[ offset_line + 1 ] = vertexIndex + 1;\r\n\r\n\t\t\t\tlineArray[ offset_line + 2 ] = vertexIndex;\r\n\t\t\t\tlineArray[ offset_line + 3 ] = vertexIndex + 3;\r\n\r\n\t\t\t\tlineArray[ offset_line + 4 ] = vertexIndex + 1;\r\n\t\t\t\tlineArray[ offset_line + 5 ] = vertexIndex + 2;\r\n\r\n\t\t\t\tlineArray[ offset_line + 6 ] = vertexIndex + 2;\r\n\t\t\t\tlineArray[ offset_line + 7 ] = vertexIndex + 3;\r\n\r\n\t\t\t\toffset_line += 8;\r\n\r\n\t\t\t\tvertexIndex += 4;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );\r\n\t\t\t_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, faceArray, hint );\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );\r\n\t\t\t_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, lineArray, hint );\r\n\r\n\t\t}\r\n\r\n\t\tif ( customAttributes ) {\r\n\r\n\t\t\tfor ( i = 0, il = customAttributes.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tcustomAttribute = customAttributes[ i ];\r\n\r\n\t\t\t\tif ( ! customAttribute.__original.needsUpdate ) continue;\r\n\r\n\t\t\t\toffset_custom = 0;\r\n\t\t\t\toffset_customSrc = 0;\r\n\r\n\t\t\t\tif ( customAttribute.size === 1 ) {\r\n\r\n\t\t\t\t\tif ( customAttribute.boundTo === undefined || customAttribute.boundTo === \"vertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 3;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = customAttribute.value[ face.c ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = customAttribute.value[ face.d ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 4;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faces\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = value;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = value;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = value;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 3;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = value;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = value;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = value;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = value;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 4;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if ( customAttribute.size === 2 ) {\r\n\r\n\t\t\t\t\tif ( customAttribute.boundTo === undefined || customAttribute.boundTo === \"vertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v3.y;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 6;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\t\t\t\t\t\t\tv4 = customAttribute.value[ face.d ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v3.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v4.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v4.y;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 8;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faces\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v3.y;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 6;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\t\t\t\t\t\t\tv4 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v3.y;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v4.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v4.y;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 8;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if ( customAttribute.size === 3 ) {\r\n\r\n\t\t\t\t\tvar pp;\r\n\r\n\t\t\t\t\tif ( customAttribute.type === \"c\" ) {\r\n\r\n\t\t\t\t\t\tpp = [ \"r\", \"g\", \"b\" ];\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tpp = [ \"x\", \"y\", \"z\" ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( customAttribute.boundTo === undefined || customAttribute.boundTo === \"vertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 9;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\t\t\t\t\t\t\tv4 = customAttribute.value[ face.d ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v4[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faces\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 9;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\t\t\t\t\t\t\tv4 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v4[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faceVertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value[ 0 ];\r\n\t\t\t\t\t\t\tv2 = value[ 1 ];\r\n\t\t\t\t\t\t\tv3 = value[ 2 ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t = v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 9;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value[ 0 ];\r\n\t\t\t\t\t\t\tv2 = value[ 1 ];\r\n\t\t\t\t\t\t\tv3 = value[ 2 ];\r\n\t\t\t\t\t\t\tv4 = value[ 3 ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v2[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v3[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v3[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v4[ pp[ 0 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v4[ pp[ 1 ] ];\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v4[ pp[ 2 ] ];\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if ( customAttribute.size === 4 ) {\r\n\r\n\t\t\t\t\tif ( customAttribute.boundTo === undefined || customAttribute.boundTo === \"vertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces3[ f ]\t];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tface = obj_faces[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = customAttribute.value[ face.a ];\r\n\t\t\t\t\t\t\tv2 = customAttribute.value[ face.b ];\r\n\t\t\t\t\t\t\tv3 = customAttribute.value[ face.c ];\r\n\t\t\t\t\t\t\tv4 = customAttribute.value[ face.d ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 12 ] = v4.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 13 ] = v4.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 14 ] = v4.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 15 ] = v4.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 16;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faces\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value;\r\n\t\t\t\t\t\t\tv2 = value;\r\n\t\t\t\t\t\t\tv3 = value;\r\n\t\t\t\t\t\t\tv4 = value;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 12 ] = v4.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 13 ] = v4.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 14 ] = v4.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 15 ] = v4.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 16;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( customAttribute.boundTo === \"faceVertices\" ) {\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces3.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces3[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value[ 0 ];\r\n\t\t\t\t\t\t\tv2 = value[ 1 ];\r\n\t\t\t\t\t\t\tv3 = value[ 2 ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 12;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfor ( f = 0, fl = chunk_faces4.length; f < fl; f ++ ) {\r\n\r\n\t\t\t\t\t\t\tvalue = customAttribute.value[ chunk_faces4[ f ] ];\r\n\r\n\t\t\t\t\t\t\tv1 = value[ 0 ];\r\n\t\t\t\t\t\t\tv2 = value[ 1 ];\r\n\t\t\t\t\t\t\tv3 = value[ 2 ];\r\n\t\t\t\t\t\t\tv4 = value[ 3 ];\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom ] \t= v1.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 1 ] = v1.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 2 ] = v1.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 3 ] = v1.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 4 ] = v2.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 5 ] = v2.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 6 ] = v2.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 7 ] = v2.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 8 ] = v3.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 9 ] = v3.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 10 ] = v3.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 11 ] = v3.w;\r\n\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 12 ] = v4.x;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 13 ] = v4.y;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 14 ] = v4.z;\r\n\t\t\t\t\t\t\tcustomAttribute.array[ offset_custom + 15 ] = v4.w;\r\n\r\n\t\t\t\t\t\t\toffset_custom += 16;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, customAttribute.buffer );\r\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, customAttribute.array, hint );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( dispose ) {\r\n\r\n\t\t\tdelete geometryGroup.__inittedArrays;\r\n\t\t\tdelete geometryGroup.__colorArray;\r\n\t\t\tdelete geometryGroup.__normalArray;\r\n\t\t\tdelete geometryGroup.__tangentArray;\r\n\t\t\tdelete geometryGroup.__uvArray;\r\n\t\t\tdelete geometryGroup.__uv2Array;\r\n\t\t\tdelete geometryGroup.__faceArray;\r\n\t\t\tdelete geometryGroup.__vertexArray;\r\n\t\t\tdelete geometryGroup.__lineArray;\r\n\t\t\tdelete geometryGroup.__skinIndexArray;\r\n\t\t\tdelete geometryGroup.__skinWeightArray;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setDirectBuffers ( geometry, hint, dispose ) {\r\n\r\n\t\tvar attributes = geometry.attributes;\r\n\r\n\t\tvar attributeName, attributeItem;\r\n\r\n\t\tfor ( attributeName in attributes ) {\r\n\r\n\t\t\tattributeItem = attributes[ attributeName ];\r\n\r\n\t\t\tif ( attributeItem.needsUpdate ) {\r\n\r\n\t\t\t\tif ( attributeName === 'index' ) {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, attributeItem.array, hint );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, attributeItem.array, hint );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tattributeItem.needsUpdate = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( dispose && ! attributeItem.dynamic ) {\r\n\r\n\t\t\t\tdelete attributeItem.array;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Buffer rendering\r\n\r\n\tthis.renderBufferImmediate = function ( object, program, material ) {\r\n\r\n\t\tif ( object.hasPositions && ! object.__webglVertexBuffer ) object.__webglVertexBuffer = _gl.createBuffer();\r\n\t\tif ( object.hasNormals && ! object.__webglNormalBuffer ) object.__webglNormalBuffer = _gl.createBuffer();\r\n\t\tif ( object.hasUvs && ! object.__webglUvBuffer ) object.__webglUvBuffer = _gl.createBuffer();\r\n\t\tif ( object.hasColors && ! object.__webglColorBuffer ) object.__webglColorBuffer = _gl.createBuffer();\r\n\r\n\t\tif ( object.hasPositions ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglVertexBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\r\n\t\t\t_gl.enableVertexAttribArray( program.attributes.position );\r\n\t\t\t_gl.vertexAttribPointer( program.attributes.position, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasNormals ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglNormalBuffer );\r\n\r\n\t\t\tif ( material.shading === THREE.FlatShading ) {\r\n\r\n\t\t\t\tvar nx, ny, nz,\r\n\t\t\t\t\tnax, nbx, ncx, nay, nby, ncy, naz, nbz, ncz,\r\n\t\t\t\t\tnormalArray,\r\n\t\t\t\t\ti, il = object.count * 3;\r\n\r\n\t\t\t\tfor( i = 0; i < il; i += 9 ) {\r\n\r\n\t\t\t\t\tnormalArray = object.normalArray;\r\n\r\n\t\t\t\t\tnax = normalArray[ i ];\r\n\t\t\t\t\tnay = normalArray[ i + 1 ];\r\n\t\t\t\t\tnaz = normalArray[ i + 2 ];\r\n\r\n\t\t\t\t\tnbx = normalArray[ i + 3 ];\r\n\t\t\t\t\tnby = normalArray[ i + 4 ];\r\n\t\t\t\t\tnbz = normalArray[ i + 5 ];\r\n\r\n\t\t\t\t\tncx = normalArray[ i + 6 ];\r\n\t\t\t\t\tncy = normalArray[ i + 7 ];\r\n\t\t\t\t\tncz = normalArray[ i + 8 ];\r\n\r\n\t\t\t\t\tnx = ( nax + nbx + ncx ) / 3;\r\n\t\t\t\t\tny = ( nay + nby + ncy ) / 3;\r\n\t\t\t\t\tnz = ( naz + nbz + ncz ) / 3;\r\n\r\n\t\t\t\t\tnormalArray[ i ] \t = nx;\r\n\t\t\t\t\tnormalArray[ i + 1 ] = ny;\r\n\t\t\t\t\tnormalArray[ i + 2 ] = nz;\r\n\r\n\t\t\t\t\tnormalArray[ i + 3 ] = nx;\r\n\t\t\t\t\tnormalArray[ i + 4 ] = ny;\r\n\t\t\t\t\tnormalArray[ i + 5 ] = nz;\r\n\r\n\t\t\t\t\tnormalArray[ i + 6 ] = nx;\r\n\t\t\t\t\tnormalArray[ i + 7 ] = ny;\r\n\t\t\t\t\tnormalArray[ i + 8 ] = nz;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\r\n\t\t\t_gl.enableVertexAttribArray( program.attributes.normal );\r\n\t\t\t_gl.vertexAttribPointer( program.attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasUvs && material.map ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglUvBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\r\n\t\t\t_gl.enableVertexAttribArray( program.attributes.uv );\r\n\t\t\t_gl.vertexAttribPointer( program.attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.hasColors && material.vertexColors !== THREE.NoColors ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, object.__webglColorBuffer );\r\n\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\r\n\t\t\t_gl.enableVertexAttribArray( program.attributes.color );\r\n\t\t\t_gl.vertexAttribPointer( program.attributes.color, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\r\n\r\n\t\tobject.count = 0;\r\n\r\n\t};\r\n\r\n\tthis.renderBufferDirect = function ( camera, lights, fog, material, geometry, object ) {\r\n\r\n\t\tif ( material.visible === false ) return;\r\n\r\n\t\tvar program, programAttributes, linewidth, primitives, a, attribute, geometryAttributes;\r\n\t\tvar attributeItem, attributeName, attributePointer, attributeSize;\r\n\r\n\t\tprogram = setProgram( camera, lights, fog, material, object );\r\n\r\n\t\tprogramAttributes = program.attributes;\r\n\t\tgeometryAttributes = geometry.attributes;\r\n\r\n\t\tvar updateBuffers = false,\r\n\t\t\twireframeBit = material.wireframe ? 1 : 0,\r\n\t\t\tgeometryHash = ( geometry.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit;\r\n\r\n\t\tif ( geometryHash !== _currentGeometryGroupHash ) {\r\n\r\n\t\t\t_currentGeometryGroupHash = geometryHash;\r\n\t\t\tupdateBuffers = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( updateBuffers ) {\r\n\r\n\t\t\tdisableAttributes();\r\n\r\n\t\t}\r\n\r\n\t\t// render mesh\r\n\r\n\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\tvar index = geometryAttributes[ \"index\" ];\r\n\r\n\t\t\t// indexed triangles\r\n\r\n\t\t\tif ( index ) {\r\n\r\n\t\t\t\tvar offsets = geometry.offsets;\r\n\r\n\t\t\t\t// if there is more than 1 chunk\r\n\t\t\t\t// must set attribute pointers to use new offsets for each chunk\r\n\t\t\t\t// even if geometry and materials didn't change\r\n\r\n\t\t\t\tif ( offsets.length > 1 ) updateBuffers = true;\r\n\r\n\t\t\t\tfor ( var i = 0, il = offsets.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tvar startIndex = offsets[ i ].index;\r\n\r\n\t\t\t\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t\t\t\tfor ( attributeName in geometryAttributes ) {\r\n\r\n\t\t\t\t\t\t\tif ( attributeName === 'index' ) continue;\r\n\r\n\t\t\t\t\t\t\tattributePointer = programAttributes[ attributeName ];\r\n\t\t\t\t\t\t\tattributeItem = geometryAttributes[ attributeName ];\r\n\t\t\t\t\t\t\tattributeSize = attributeItem.itemSize;\r\n\r\n\t\t\t\t\t\t\tif ( attributePointer >= 0 ) {\r\n\r\n\t\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t\t\t\tenableAttribute( attributePointer );\r\n\t\t\t\t\t\t\t\t_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, startIndex * attributeSize * 4 ); // 4 bytes per Float32\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// indices\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, index.buffer );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// render indexed triangles\r\n\r\n\t\t\t\t\t_gl.drawElements( _gl.TRIANGLES, offsets[ i ].count, _gl.UNSIGNED_SHORT, offsets[ i ].start * 2 ); // 2 bytes per Uint16\r\n\r\n\t\t\t\t\t_this.info.render.calls ++;\r\n\t\t\t\t\t_this.info.render.vertices += offsets[ i ].count; // not really true, here vertices can be shared\r\n\t\t\t\t\t_this.info.render.faces += offsets[ i ].count / 3;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t// non-indexed triangles\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t\t\tfor ( attributeName in geometryAttributes ) {\r\n\r\n\t\t\t\t\t\tif ( attributeName === 'index') continue;\r\n\r\n\t\t\t\t\t\tattributePointer = programAttributes[ attributeName ];\r\n\t\t\t\t\t\tattributeItem = geometryAttributes[ attributeName ];\r\n\t\t\t\t\t\tattributeSize = attributeItem.itemSize;\r\n\r\n\t\t\t\t\t\tif ( attributePointer >= 0 ) {\r\n\r\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t\t\tenableAttribute( attributePointer );\r\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar position = geometry.attributes[ \"position\" ];\r\n\r\n\t\t\t\t// render non-indexed triangles\r\n\r\n\t\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, position.numItems / 3 );\r\n\r\n\t\t\t\t_this.info.render.calls ++;\r\n\t\t\t\t_this.info.render.vertices += position.numItems / 3;\r\n\t\t\t\t_this.info.render.faces += position.numItems / 3 / 3;\r\n\r\n\t\t\t}\r\n\r\n\t\t// render particles\r\n\r\n\t\t} else if ( object instanceof THREE.ParticleSystem ) {\r\n\r\n\t\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t\tfor ( attributeName in geometryAttributes ) {\r\n\r\n\t\t\t\t\tattributePointer = programAttributes[ attributeName ];\r\n\t\t\t\t\tattributeItem = geometryAttributes[ attributeName ];\r\n\t\t\t\t\tattributeSize = attributeItem.itemSize;\r\n\r\n\t\t\t\t\tif ( attributePointer >= 0 ) {\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t\tenableAttribute( attributePointer );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar position = geometryAttributes[ \"position\" ];\r\n\r\n\t\t\t\t// render particles\r\n\r\n\t\t\t\t_gl.drawArrays( _gl.POINTS, 0, position.numItems / 3 );\r\n\r\n\t\t\t\t_this.info.render.calls ++;\r\n\t\t\t\t_this.info.render.points += position.numItems / 3;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t\tfor ( attributeName in geometryAttributes ) {\r\n\r\n\t\t\t\t\tattributePointer = programAttributes[ attributeName ];\r\n\t\t\t\t\tattributeItem = geometryAttributes[ attributeName ];\r\n\t\t\t\t\tattributeSize = attributeItem.itemSize;\r\n\r\n\t\t\t\t\tif ( attributePointer >= 0 ) {\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attributeItem.buffer );\r\n\t\t\t\t\t\tenableAttribute( attributePointer );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributePointer, attributeSize, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render lines\r\n\r\n\t\t\t\tsetLineWidth( material.linewidth );\r\n\r\n\t\t\t\tvar position = geometryAttributes[ \"position\" ];\r\n\r\n\t\t\t\t_gl.drawArrays( _gl.LINE_STRIP, 0, position.numItems / 3 );\r\n\r\n\t\t\t\t_this.info.render.calls ++;\r\n\t\t\t\t_this.info.render.points += position.numItems;\r\n\r\n\t\t\t}\r\n\r\n \t}\r\n\r\n\t};\r\n\r\n\tthis.renderBuffer = function ( camera, lights, fog, material, geometryGroup, object ) {\r\n\r\n\t\tif ( material.visible === false ) return;\r\n\r\n\t\tvar program, attributes, linewidth, primitives, a, attribute, i, il;\r\n\r\n\t\tprogram = setProgram( camera, lights, fog, material, object );\r\n\r\n\t\tattributes = program.attributes;\r\n\r\n\t\tvar updateBuffers = false,\r\n\t\t\twireframeBit = material.wireframe ? 1 : 0,\r\n\t\t\tgeometryGroupHash = ( geometryGroup.id * 0xffffff ) + ( program.id * 2 ) + wireframeBit;\r\n\r\n\t\tif ( geometryGroupHash !== _currentGeometryGroupHash ) {\r\n\r\n\t\t\t_currentGeometryGroupHash = geometryGroupHash;\r\n\t\t\tupdateBuffers = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( updateBuffers ) {\r\n\r\n\t\t\tdisableAttributes();\r\n\r\n\t\t}\r\n\r\n\t\t// vertices\r\n\r\n\t\tif ( !material.morphTargets && attributes.position >= 0 ) {\r\n\r\n\t\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );\r\n\t\t\t\tenableAttribute( attributes.position );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif ( object.morphTargetBase ) {\r\n\r\n\t\t\t\tsetupMorphTargets( material, geometryGroup, object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\r\n\t\tif ( updateBuffers ) {\r\n\r\n\t\t\t// custom attributes\r\n\r\n\t\t\t// Use the per-geometryGroup custom attribute arrays which are setup in initMeshBuffers\r\n\r\n\t\t\tif ( geometryGroup.__webglCustomAttributesList ) {\r\n\r\n\t\t\t\tfor ( i = 0, il = geometryGroup.__webglCustomAttributesList.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tattribute = geometryGroup.__webglCustomAttributesList[ i ];\r\n\r\n\t\t\t\t\tif ( attributes[ attribute.buffer.belongsToAttribute ] >= 0 ) {\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, attribute.buffer );\r\n\t\t\t\t\t\tenableAttribute( attributes[ attribute.buffer.belongsToAttribute ] );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributes[ attribute.buffer.belongsToAttribute ], attribute.size, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\t// colors\r\n\r\n\t\t\tif ( attributes.color >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglColorBuffer );\r\n\t\t\t\tenableAttribute( attributes.color );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.color, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// normals\r\n\r\n\t\t\tif ( attributes.normal >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglNormalBuffer );\r\n\t\t\t\tenableAttribute( attributes.normal );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.normal, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// tangents\r\n\r\n\t\t\tif ( attributes.tangent >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglTangentBuffer );\r\n\t\t\t\tenableAttribute( attributes.tangent );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.tangent, 4, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// uvs\r\n\r\n\t\t\tif ( attributes.uv >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUVBuffer );\r\n\t\t\t\tenableAttribute( attributes.uv );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( attributes.uv2 >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglUV2Buffer );\r\n\t\t\t\tenableAttribute( attributes.uv2 );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.uv2, 2, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material.skinning &&\r\n\t\t\t\t attributes.skinIndex >= 0 && attributes.skinWeight >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinIndicesBuffer );\r\n\t\t\t\tenableAttribute( attributes.skinIndex );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.skinIndex, 4, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglSkinWeightsBuffer );\r\n\t\t\t\tenableAttribute( attributes.skinWeight );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.skinWeight, 4, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// line distances\r\n\r\n\t\t\tif ( attributes.lineDistance >= 0 ) {\r\n\r\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglLineDistanceBuffer );\r\n\t\t\t\tenableAttribute( attributes.lineDistance );\r\n\t\t\t\t_gl.vertexAttribPointer( attributes.lineDistance, 1, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// render mesh\r\n\r\n\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t// wireframe\r\n\r\n\t\t\tif ( material.wireframe ) {\r\n\r\n\t\t\t\tsetLineWidth( material.wireframeLinewidth );\r\n\r\n\t\t\t\tif ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglLineBuffer );\r\n\t\t\t\t_gl.drawElements( _gl.LINES, geometryGroup.__webglLineCount, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t\t// triangles\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( updateBuffers ) _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, geometryGroup.__webglFaceBuffer );\r\n\t\t\t\t_gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_this.info.render.calls ++;\r\n\t\t\t_this.info.render.vertices += geometryGroup.__webglFaceCount;\r\n\t\t\t_this.info.render.faces += geometryGroup.__webglFaceCount / 3;\r\n\r\n\t\t// render lines\r\n\r\n\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\tprimitives = ( object.type === THREE.LineStrip ) ? _gl.LINE_STRIP : _gl.LINES;\r\n\r\n\t\t\tsetLineWidth( material.linewidth );\r\n\r\n\t\t\t_gl.drawArrays( primitives, 0, geometryGroup.__webglLineCount );\r\n\r\n\t\t\t_this.info.render.calls ++;\r\n\r\n\t\t// render particles\r\n\r\n\t\t} else if ( object instanceof THREE.ParticleSystem ) {\r\n\r\n\t\t\t_gl.drawArrays( _gl.POINTS, 0, geometryGroup.__webglParticleCount );\r\n\r\n\t\t\t_this.info.render.calls ++;\r\n\t\t\t_this.info.render.points += geometryGroup.__webglParticleCount;\r\n\r\n\t\t// render ribbon\r\n\r\n\t\t} else if ( object instanceof THREE.Ribbon ) {\r\n\r\n\t\t\t_gl.drawArrays( _gl.TRIANGLE_STRIP, 0, geometryGroup.__webglVertexCount );\r\n\r\n\t\t\t_this.info.render.calls ++;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction enableAttribute( attribute ) {\r\n\r\n\t\tif ( ! _enabledAttributes[ attribute ] ) {\r\n\r\n\t\t\t_gl.enableVertexAttribArray( attribute );\r\n\t\t\t_enabledAttributes[ attribute ] = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction disableAttributes() {\r\n\r\n\t\tfor ( var attribute in _enabledAttributes ) {\r\n\r\n\t\t\tif ( _enabledAttributes[ attribute ] ) {\r\n\r\n\t\t\t\t_gl.disableVertexAttribArray( attribute );\r\n\t\t\t\t_enabledAttributes[ attribute ] = false;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setupMorphTargets ( material, geometryGroup, object ) {\r\n\r\n\t\t// set base\r\n\r\n\t\tvar attributes = material.program.attributes;\r\n\r\n\t\tif ( object.morphTargetBase !== -1 && attributes.position >= 0 ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ object.morphTargetBase ] );\r\n\t\t\tenableAttribute( attributes.position );\r\n\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t} else if ( attributes.position >= 0 ) {\r\n\r\n\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglVertexBuffer );\r\n\t\t\tenableAttribute( attributes.position );\r\n\t\t\t_gl.vertexAttribPointer( attributes.position, 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.morphTargetForcedOrder.length ) {\r\n\r\n\t\t\t// set forced order\r\n\r\n\t\t\tvar m = 0;\r\n\t\t\tvar order = object.morphTargetForcedOrder;\r\n\t\t\tvar influences = object.morphTargetInfluences;\r\n\r\n\t\t\twhile ( m < material.numSupportedMorphTargets && m < order.length ) {\r\n\r\n\t\t\t\tif ( attributes[ \"morphTarget\" + m ] >= 0 ) {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ order[ m ] ] );\r\n\t\t\t\t\tenableAttribute( attributes[ \"morphTarget\" + m ] );\r\n\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphTarget\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( attributes[ \"morphNormal\" + m ] >= 0 && material.morphNormals ) {\r\n\r\n\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ order[ m ] ] );\r\n\t\t\t\t\tenableAttribute( attributes[ \"morphNormal\" + m ] );\r\n\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphNormal\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobject.__webglMorphTargetInfluences[ m ] = influences[ order[ m ] ];\r\n\r\n\t\t\t\tm ++;\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// find the most influencing\r\n\r\n\t\t\tvar influence, activeInfluenceIndices = [];\r\n\t\t\tvar influences = object.morphTargetInfluences;\r\n\t\t\tvar i, il = influences.length;\r\n\r\n\t\t\tfor ( i = 0; i < il; i ++ ) {\r\n\r\n\t\t\t\tinfluence = influences[ i ];\r\n\r\n\t\t\t\tif ( influence > 0 ) {\r\n\r\n\t\t\t\t\tactiveInfluenceIndices.push( [ influence, i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( activeInfluenceIndices.length > material.numSupportedMorphTargets ) {\r\n\r\n\t\t\t\tactiveInfluenceIndices.sort( numericalSort );\r\n\t\t\t\tactiveInfluenceIndices.length = material.numSupportedMorphTargets;\r\n\r\n\t\t\t} else if ( activeInfluenceIndices.length > material.numSupportedMorphNormals ) {\r\n\r\n\t\t\t\tactiveInfluenceIndices.sort( numericalSort );\r\n\r\n\t\t\t} else if ( activeInfluenceIndices.length === 0 ) {\r\n\r\n\t\t\t\tactiveInfluenceIndices.push( [ 0, 0 ] );\r\n\r\n\t\t\t};\r\n\r\n\t\t\tvar influenceIndex, m = 0;\r\n\r\n\t\t\twhile ( m < material.numSupportedMorphTargets ) {\r\n\r\n\t\t\t\tif ( activeInfluenceIndices[ m ] ) {\r\n\r\n\t\t\t\t\tinfluenceIndex = activeInfluenceIndices[ m ][ 1 ];\r\n\r\n\t\t\t\t\tif ( attributes[ \"morphTarget\" + m ] >= 0 ) {\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphTargetsBuffers[ influenceIndex ] );\r\n\t\t\t\t\t\tenableAttribute( attributes[ \"morphTarget\" + m ] );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphTarget\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( attributes[ \"morphNormal\" + m ] >= 0 && material.morphNormals ) {\r\n\r\n\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, geometryGroup.__webglMorphNormalsBuffers[ influenceIndex ] );\r\n\t\t\t\t\t\tenableAttribute( attributes[ \"morphNormal\" + m ] );\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphNormal\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobject.__webglMorphTargetInfluences[ m ] = influences[ influenceIndex ];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphTarget\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\t\t\t\t_gl.vertexAttribPointer( attributes[ \"morphNormal\" + m ], 3, _gl.FLOAT, false, 0, 0 );\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t\t*/\r\n\r\n\t\t\t\t\tobject.__webglMorphTargetInfluences[ m ] = 0;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tm ++;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// load updated influences uniform\r\n\r\n\t\tif ( material.program.uniforms.morphTargetInfluences !== null ) {\r\n\r\n\t\t\t_gl.uniform1fv( material.program.uniforms.morphTargetInfluences, object.__webglMorphTargetInfluences );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Sorting\r\n\r\n\tfunction painterSortStable ( a, b ) {\r\n\r\n\t\tif ( a.z !== b.z ) {\r\n\r\n\t\t\treturn b.z - a.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn a.id - b.id;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction numericalSort ( a, b ) {\r\n\r\n\t\treturn b[ 0 ] - a[ 0 ];\r\n\r\n\t};\r\n\r\n\r\n\t// Rendering\r\n\r\n\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\r\n\r\n\t\tif ( camera instanceof THREE.Camera === false ) {\r\n\r\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\r\n\t\t\treturn;\r\n\r\n\t\t}\r\n\r\n\t\tvar i, il,\r\n\r\n\t\twebglObject, object,\r\n\t\trenderList,\r\n\r\n\t\tlights = scene.__lights,\r\n\t\tfog = scene.fog;\r\n\r\n\t\t// reset caching for this frame\r\n\r\n\t\t_currentMaterialId = -1;\r\n\t\t_lightsNeedUpdate = true;\r\n\r\n\t\t// update scene graph\r\n\r\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n\r\n\t\t// update camera matrices and frustum\r\n\r\n\t\tif ( camera.parent === undefined ) camera.updateMatrixWorld();\r\n\r\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\r\n\r\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\r\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\r\n\r\n\t\t// update WebGL objects\r\n\r\n\t\tif ( this.autoUpdateObjects ) this.initWebGLObjects( scene );\r\n\r\n\t\t// custom render plugins (pre pass)\r\n\r\n\t\trenderPlugins( this.renderPluginsPre, scene, camera );\r\n\r\n\t\t//\r\n\r\n\t\t_this.info.render.calls = 0;\r\n\t\t_this.info.render.vertices = 0;\r\n\t\t_this.info.render.faces = 0;\r\n\t\t_this.info.render.points = 0;\r\n\r\n\t\tthis.setRenderTarget( renderTarget );\r\n\r\n\t\tif ( this.autoClear || forceClear ) {\r\n\r\n\t\t\tthis.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil );\r\n\r\n\t\t}\r\n\r\n\t\t// set matrices for regular objects (frustum culled)\r\n\r\n\t\trenderList = scene.__webglObjects;\r\n\r\n\t\tfor ( i = 0, il = renderList.length; i < il; i ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ i ];\r\n\t\t\tobject = webglObject.object;\r\n\r\n\t\t\twebglObject.id = i;\r\n\t\t\twebglObject.render = false;\r\n\r\n\t\t\tif ( object.visible ) {\r\n\r\n\t\t\t\tif ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) {\r\n\r\n\t\t\t\t\tsetupMatrices( object, camera );\r\n\r\n\t\t\t\t\tunrollBufferMaterial( webglObject );\r\n\r\n\t\t\t\t\twebglObject.render = true;\r\n\r\n\t\t\t\t\tif ( this.sortObjects === true ) {\r\n\r\n\t\t\t\t\t\tif ( object.renderDepth !== null ) {\r\n\r\n\t\t\t\t\t\t\twebglObject.z = object.renderDepth;\r\n\r\n\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t_vector3.getPositionFromMatrix( object.matrixWorld );\r\n\t\t\t\t\t\t\t_vector3.applyProjection( _projScreenMatrix );\r\n\r\n\t\t\t\t\t\t\twebglObject.z = _vector3.z;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( this.sortObjects ) {\r\n\r\n\t\t\trenderList.sort( painterSortStable );\r\n\r\n\t\t}\r\n\r\n\t\t// set matrices for immediate objects\r\n\r\n\t\trenderList = scene.__webglObjectsImmediate;\r\n\r\n\t\tfor ( i = 0, il = renderList.length; i < il; i ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ i ];\r\n\t\t\tobject = webglObject.object;\r\n\r\n\t\t\tif ( object.visible ) {\r\n\r\n\t\t\t\tsetupMatrices( object, camera );\r\n\r\n\t\t\t\tunrollImmediateBufferMaterial( webglObject );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( scene.overrideMaterial ) {\r\n\r\n\t\t\tvar material = scene.overrideMaterial;\r\n\r\n\t\t\tthis.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\r\n\t\t\tthis.setDepthTest( material.depthTest );\r\n\t\t\tthis.setDepthWrite( material.depthWrite );\r\n\t\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\r\n\r\n\t\t\trenderObjects( scene.__webglObjects, false, \"\", camera, lights, fog, true, material );\r\n\t\t\trenderObjectsImmediate( scene.__webglObjectsImmediate, \"\", camera, lights, fog, false, material );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar material = null;\r\n\r\n\t\t\t// opaque pass (front-to-back order)\r\n\r\n\t\t\tthis.setBlending( THREE.NoBlending );\r\n\r\n\t\t\trenderObjects( scene.__webglObjects, true, \"opaque\", camera, lights, fog, false, material );\r\n\t\t\trenderObjectsImmediate( scene.__webglObjectsImmediate, \"opaque\", camera, lights, fog, false, material );\r\n\r\n\t\t\t// transparent pass (back-to-front order)\r\n\r\n\t\t\trenderObjects( scene.__webglObjects, false, \"transparent\", camera, lights, fog, true, material );\r\n\t\t\trenderObjectsImmediate( scene.__webglObjectsImmediate, \"transparent\", camera, lights, fog, true, material );\r\n\r\n\t\t}\r\n\r\n\t\t// custom render plugins (post pass)\r\n\r\n\t\trenderPlugins( this.renderPluginsPost, scene, camera );\r\n\r\n\r\n\t\t// Generate mipmap if we're using any kind of mipmap filtering\r\n\r\n\t\tif ( renderTarget && renderTarget.generateMipmaps && renderTarget.minFilter !== THREE.NearestFilter && renderTarget.minFilter !== THREE.LinearFilter ) {\r\n\r\n\t\t\tupdateRenderTargetMipmap( renderTarget );\r\n\r\n\t\t}\r\n\r\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\r\n\r\n\t\tthis.setDepthTest( true );\r\n\t\tthis.setDepthWrite( true );\r\n\r\n\t\t// _gl.finish();\r\n\r\n\t};\r\n\r\n\tfunction renderPlugins( plugins, scene, camera ) {\r\n\r\n\t\tif ( ! plugins.length ) return;\r\n\r\n\t\tfor ( var i = 0, il = plugins.length; i < il; i ++ ) {\r\n\r\n\t\t\t// reset state for plugin (to start from clean slate)\r\n\r\n\t\t\t_currentProgram = null;\r\n\t\t\t_currentCamera = null;\r\n\r\n\t\t\t_oldBlending = -1;\r\n\t\t\t_oldDepthTest = -1;\r\n\t\t\t_oldDepthWrite = -1;\r\n\t\t\t_oldDoubleSided = -1;\r\n\t\t\t_oldFlipSided = -1;\r\n\t\t\t_currentGeometryGroupHash = -1;\r\n\t\t\t_currentMaterialId = -1;\r\n\r\n\t\t\t_lightsNeedUpdate = true;\r\n\r\n\t\t\tplugins[ i ].render( scene, camera, _currentWidth, _currentHeight );\r\n\r\n\t\t\t// reset state after plugin (anything could have changed)\r\n\r\n\t\t\t_currentProgram = null;\r\n\t\t\t_currentCamera = null;\r\n\r\n\t\t\t_oldBlending = -1;\r\n\t\t\t_oldDepthTest = -1;\r\n\t\t\t_oldDepthWrite = -1;\r\n\t\t\t_oldDoubleSided = -1;\r\n\t\t\t_oldFlipSided = -1;\r\n\t\t\t_currentGeometryGroupHash = -1;\r\n\t\t\t_currentMaterialId = -1;\r\n\r\n\t\t\t_lightsNeedUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction renderObjects ( renderList, reverse, materialType, camera, lights, fog, useBlending, overrideMaterial ) {\r\n\r\n\t\tvar webglObject, object, buffer, material, start, end, delta;\r\n\r\n\t\tif ( reverse ) {\r\n\r\n\t\t\tstart = renderList.length - 1;\r\n\t\t\tend = -1;\r\n\t\t\tdelta = -1;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tstart = 0;\r\n\t\t\tend = renderList.length;\r\n\t\t\tdelta = 1;\r\n\t\t}\r\n\r\n\t\tfor ( var i = start; i !== end; i += delta ) {\r\n\r\n\t\t\twebglObject = renderList[ i ];\r\n\r\n\t\t\tif ( webglObject.render ) {\r\n\r\n\t\t\t\tobject = webglObject.object;\r\n\t\t\t\tbuffer = webglObject.buffer;\r\n\r\n\t\t\t\tif ( overrideMaterial ) {\r\n\r\n\t\t\t\t\tmaterial = overrideMaterial;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmaterial = webglObject[ materialType ];\r\n\r\n\t\t\t\t\tif ( ! material ) continue;\r\n\r\n\t\t\t\t\tif ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\r\n\r\n\t\t\t\t\t_this.setDepthTest( material.depthTest );\r\n\t\t\t\t\t_this.setDepthWrite( material.depthWrite );\r\n\t\t\t\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_this.setMaterialFaces( material );\r\n\r\n\t\t\t\tif ( buffer instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\t\t\t_this.renderBufferDirect( camera, lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_this.renderBuffer( camera, lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction renderObjectsImmediate ( renderList, materialType, camera, lights, fog, useBlending, overrideMaterial ) {\r\n\r\n\t\tvar webglObject, object, material, program;\r\n\r\n\t\tfor ( var i = 0, il = renderList.length; i < il; i ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ i ];\r\n\t\t\tobject = webglObject.object;\r\n\r\n\t\t\tif ( object.visible ) {\r\n\r\n\t\t\t\tif ( overrideMaterial ) {\r\n\r\n\t\t\t\t\tmaterial = overrideMaterial;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmaterial = webglObject[ materialType ];\r\n\r\n\t\t\t\t\tif ( ! material ) continue;\r\n\r\n\t\t\t\t\tif ( useBlending ) _this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\r\n\r\n\t\t\t\t\t_this.setDepthTest( material.depthTest );\r\n\t\t\t\t\t_this.setDepthWrite( material.depthWrite );\r\n\t\t\t\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_this.renderImmediateObject( camera, lights, fog, material, object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.renderImmediateObject = function ( camera, lights, fog, material, object ) {\r\n\r\n\t\tvar program = setProgram( camera, lights, fog, material, object );\r\n\r\n\t\t_currentGeometryGroupHash = -1;\r\n\r\n\t\t_this.setMaterialFaces( material );\r\n\r\n\t\tif ( object.immediateRenderCallback ) {\r\n\r\n\t\t\tobject.immediateRenderCallback( program, _gl, _frustum );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tobject.render( function( object ) { _this.renderBufferImmediate( object, program, material ); } );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction unrollImmediateBufferMaterial ( globject ) {\r\n\r\n\t\tvar object = globject.object,\r\n\t\t\tmaterial = object.material;\r\n\r\n\t\tif ( material.transparent ) {\r\n\r\n\t\t\tglobject.transparent = material;\r\n\t\t\tglobject.opaque = null;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tglobject.opaque = material;\r\n\t\t\tglobject.transparent = null;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction unrollBufferMaterial ( globject ) {\r\n\r\n\t\tvar object = globject.object,\r\n\t\t\tbuffer = globject.buffer,\r\n\t\t\tmaterial, materialIndex, meshMaterial;\r\n\r\n\t\tmeshMaterial = object.material;\r\n\r\n\t\tif ( meshMaterial instanceof THREE.MeshFaceMaterial ) {\r\n\r\n\t\t\tmaterialIndex = buffer.materialIndex;\r\n\r\n\t\t\tmaterial = meshMaterial.materials[ materialIndex ];\r\n\r\n\t\t\tif ( material.transparent ) {\r\n\r\n\t\t\t\tglobject.transparent = material;\r\n\t\t\t\tglobject.opaque = null;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tglobject.opaque = material;\r\n\t\t\t\tglobject.transparent = null;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tmaterial = meshMaterial;\r\n\r\n\t\t\tif ( material ) {\r\n\r\n\t\t\t\tif ( material.transparent ) {\r\n\r\n\t\t\t\t\tglobject.transparent = material;\r\n\t\t\t\t\tglobject.opaque = null;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tglobject.opaque = material;\r\n\t\t\t\t\tglobject.transparent = null;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Geometry splitting\r\n\r\n\tfunction sortFacesByMaterial ( geometry, material ) {\r\n\r\n\t\tvar f, fl, face, materialIndex, vertices,\r\n\t\t\tgroupHash, hash_map = {};\r\n\r\n\t\tvar numMorphTargets = geometry.morphTargets.length;\r\n\t\tvar numMorphNormals = geometry.morphNormals.length;\r\n\r\n\t\tvar usesFaceMaterial = material instanceof THREE.MeshFaceMaterial;\r\n\r\n\t\tgeometry.geometryGroups = {};\r\n\r\n\t\tfor ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {\r\n\r\n\t\t\tface = geometry.faces[ f ];\r\n\t\t\tmaterialIndex = usesFaceMaterial ? face.materialIndex : 0;\r\n\r\n\t\t\tif ( hash_map[ materialIndex ] === undefined ) {\r\n\r\n\t\t\t\thash_map[ materialIndex ] = { 'hash': materialIndex, 'counter': 0 };\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgroupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;\r\n\r\n\t\t\tif ( geometry.geometryGroups[ groupHash ] === undefined ) {\r\n\r\n\t\t\t\tgeometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvertices = face instanceof THREE.Face3 ? 3 : 4;\r\n\r\n\t\t\tif ( geometry.geometryGroups[ groupHash ].vertices + vertices > 65535 ) {\r\n\r\n\t\t\t\thash_map[ materialIndex ].counter += 1;\r\n\t\t\t\tgroupHash = hash_map[ materialIndex ].hash + '_' + hash_map[ materialIndex ].counter;\r\n\r\n\t\t\t\tif ( geometry.geometryGroups[ groupHash ] === undefined ) {\r\n\r\n\t\t\t\t\tgeometry.geometryGroups[ groupHash ] = { 'faces3': [], 'faces4': [], 'materialIndex': materialIndex, 'vertices': 0, 'numMorphTargets': numMorphTargets, 'numMorphNormals': numMorphNormals };\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tgeometry.geometryGroups[ groupHash ].faces3.push( f );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tgeometry.geometryGroups[ groupHash ].faces4.push( f );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.geometryGroups[ groupHash ].vertices += vertices;\r\n\r\n\t\t}\r\n\r\n\t\tgeometry.geometryGroupsList = [];\r\n\r\n\t\tfor ( var g in geometry.geometryGroups ) {\r\n\r\n\t\t\tgeometry.geometryGroups[ g ].id = _geometryGroupCounter ++;\r\n\r\n\t\t\tgeometry.geometryGroupsList.push( geometry.geometryGroups[ g ] );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Objects refresh\r\n\r\n\tthis.initWebGLObjects = function ( scene ) {\r\n\r\n\t\tif ( !scene.__webglObjects ) {\r\n\r\n\t\t\tscene.__webglObjects = [];\r\n\t\t\tscene.__webglObjectsImmediate = [];\r\n\t\t\tscene.__webglSprites = [];\r\n\t\t\tscene.__webglFlares = [];\r\n\r\n\t\t}\r\n\r\n\t\twhile ( scene.__objectsAdded.length ) {\r\n\r\n\t\t\taddObject( scene.__objectsAdded[ 0 ], scene );\r\n\t\t\tscene.__objectsAdded.splice( 0, 1 );\r\n\r\n\t\t}\r\n\r\n\t\twhile ( scene.__objectsRemoved.length ) {\r\n\r\n\t\t\tremoveObject( scene.__objectsRemoved[ 0 ], scene );\r\n\t\t\tscene.__objectsRemoved.splice( 0, 1 );\r\n\r\n\t\t}\r\n\r\n\t\t// update must be called after objects adding / removal\r\n\r\n\t\tfor ( var o = 0, ol = scene.__webglObjects.length; o < ol; o ++ ) {\r\n\r\n\t\t\tvar object = scene.__webglObjects[ o ].object;\r\n\r\n\t\t\t// TODO: Remove this hack (WebGLRenderer refactoring)\r\n\r\n\t\t\tif ( object.__webglInit === undefined ) {\r\n\r\n\t\t\t\tif ( object.__webglActive !== undefined ) {\r\n\r\n\t\t\t\t\tremoveObject( object, scene );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\taddObject( object, scene );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tupdateObject( object );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Objects adding\r\n\r\n\tfunction addObject( object, scene ) {\r\n\r\n\t\tvar g, geometry, material, geometryGroup;\r\n\r\n\t\tif ( object.__webglInit === undefined ) {\r\n\r\n\t\t\tobject.__webglInit = true;\r\n\r\n\t\t\tobject._modelViewMatrix = new THREE.Matrix4();\r\n\t\t\tobject._normalMatrix = new THREE.Matrix3();\r\n\r\n\t\t\tif ( object.geometry !== undefined && object.geometry.__webglInit === undefined ) {\r\n\r\n\t\t\t\tobject.geometry.__webglInit = true;\r\n\t\t\t\tobject.geometry.addEventListener( 'dispose', onGeometryDispose );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry = object.geometry;\r\n\r\n\t\t\tif ( geometry === undefined ) {\r\n\r\n\t\t\t\t// fail silently for now\r\n\r\n\t\t\t} else if ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\t\tinitDirectBuffers( geometry );\r\n\r\n\t\t\t} else if ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t\tmaterial = object.material;\r\n\r\n\t\t\t\tif ( geometry.geometryGroups === undefined ) {\r\n\r\n\t\t\t\t\tsortFacesByMaterial( geometry, material );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// create separate VBOs per geometry chunk\r\n\r\n\t\t\t\tfor ( g in geometry.geometryGroups ) {\r\n\r\n\t\t\t\t\tgeometryGroup = geometry.geometryGroups[ g ];\r\n\r\n\t\t\t\t\t// initialise VBO on the first access\r\n\r\n\t\t\t\t\tif ( ! geometryGroup.__webglVertexBuffer ) {\r\n\r\n\t\t\t\t\t\tcreateMeshBuffers( geometryGroup );\r\n\t\t\t\t\t\tinitMeshBuffers( geometryGroup, object );\r\n\r\n\t\t\t\t\t\tgeometry.verticesNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.morphTargetsNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.elementsNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.uvsNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.normalsNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.tangentsNeedUpdate = true;\r\n\t\t\t\t\t\tgeometry.colorsNeedUpdate = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.Ribbon ) {\r\n\r\n\t\t\t\tif ( ! geometry.__webglVertexBuffer ) {\r\n\r\n\t\t\t\t\tcreateRibbonBuffers( geometry );\r\n\t\t\t\t\tinitRibbonBuffers( geometry, object );\r\n\r\n\t\t\t\t\tgeometry.verticesNeedUpdate = true;\r\n\t\t\t\t\tgeometry.colorsNeedUpdate = true;\r\n\t\t\t\t\tgeometry.normalsNeedUpdate = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\t\tif ( ! geometry.__webglVertexBuffer ) {\r\n\r\n\t\t\t\t\tcreateLineBuffers( geometry );\r\n\t\t\t\t\tinitLineBuffers( geometry, object );\r\n\r\n\t\t\t\t\tgeometry.verticesNeedUpdate = true;\r\n\t\t\t\t\tgeometry.colorsNeedUpdate = true;\r\n\t\t\t\t\tgeometry.lineDistancesNeedUpdate = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.ParticleSystem ) {\r\n\r\n\t\t\t\tif ( ! geometry.__webglVertexBuffer ) {\r\n\r\n\t\t\t\t\tcreateParticleBuffers( geometry );\r\n\t\t\t\t\tinitParticleBuffers( geometry, object );\r\n\r\n\t\t\t\t\tgeometry.verticesNeedUpdate = true;\r\n\t\t\t\t\tgeometry.colorsNeedUpdate = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( object.__webglActive === undefined ) {\r\n\r\n\t\t\tif ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t\tgeometry = object.geometry;\r\n\r\n\t\t\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\t\t\taddBuffer( scene.__webglObjects, geometry, object );\r\n\r\n\t\t\t\t} else if ( geometry instanceof THREE.Geometry ) {\r\n\r\n\t\t\t\t\tfor ( g in geometry.geometryGroups ) {\r\n\r\n\t\t\t\t\t\tgeometryGroup = geometry.geometryGroups[ g ];\r\n\r\n\t\t\t\t\t\taddBuffer( scene.__webglObjects, geometryGroup, object );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( object instanceof THREE.Ribbon ||\r\n\t\t\t\t\t\tobject instanceof THREE.Line ||\r\n\t\t\t\t\t\tobject instanceof THREE.ParticleSystem ) {\r\n\r\n\t\t\t\tgeometry = object.geometry;\r\n\t\t\t\taddBuffer( scene.__webglObjects, geometry, object );\r\n\r\n\t\t\t} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {\r\n\r\n\t\t\t\taddBufferImmediate( scene.__webglObjectsImmediate, object );\r\n\r\n\t\t\t} else if ( object instanceof THREE.Sprite ) {\r\n\r\n\t\t\t\tscene.__webglSprites.push( object );\r\n\r\n\t\t\t} else if ( object instanceof THREE.LensFlare ) {\r\n\r\n\t\t\t\tscene.__webglFlares.push( object );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobject.__webglActive = true;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction addBuffer( objlist, buffer, object ) {\r\n\r\n\t\tobjlist.push(\r\n\t\t\t{\r\n\t\t\t\tbuffer: buffer,\r\n\t\t\t\tobject: object,\r\n\t\t\t\topaque: null,\r\n\t\t\t\ttransparent: null\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t};\r\n\r\n\tfunction addBufferImmediate( objlist, object ) {\r\n\r\n\t\tobjlist.push(\r\n\t\t\t{\r\n\t\t\t\tobject: object,\r\n\t\t\t\topaque: null,\r\n\t\t\t\ttransparent: null\r\n\t\t\t}\r\n\t\t);\r\n\r\n\t};\r\n\r\n\t// Objects updates\r\n\r\n\tfunction updateObject( object ) {\r\n\r\n\t\tvar geometry = object.geometry,\r\n\t\t\tgeometryGroup, customAttributesDirty, material;\r\n\r\n\t\tif ( geometry instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\tsetDirectBuffers( geometry, _gl.DYNAMIC_DRAW, !geometry.dynamic );\r\n\r\n\t\t} else if ( object instanceof THREE.Mesh ) {\r\n\r\n\t\t\t// check all geometry groups\r\n\r\n\t\t\tfor( var i = 0, il = geometry.geometryGroupsList.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tgeometryGroup = geometry.geometryGroupsList[ i ];\r\n\r\n\t\t\t\tmaterial = getBufferMaterial( object, geometryGroup );\r\n\r\n\t\t\t\tif ( geometry.buffersNeedUpdate ) {\r\n\r\n\t\t\t\t\tinitMeshBuffers( geometryGroup, object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcustomAttributesDirty = material.attributes && areCustomAttributesDirty( material );\r\n\r\n\t\t\t\tif ( geometry.verticesNeedUpdate || geometry.morphTargetsNeedUpdate || geometry.elementsNeedUpdate ||\r\n\t\t\t\t\t geometry.uvsNeedUpdate || geometry.normalsNeedUpdate ||\r\n\t\t\t\t\t geometry.colorsNeedUpdate || geometry.tangentsNeedUpdate || customAttributesDirty ) {\r\n\r\n\t\t\t\t\tsetMeshBuffers( geometryGroup, object, _gl.DYNAMIC_DRAW, !geometry.dynamic, material );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\t\t\tgeometry.morphTargetsNeedUpdate = false;\r\n\t\t\tgeometry.elementsNeedUpdate = false;\r\n\t\t\tgeometry.uvsNeedUpdate = false;\r\n\t\t\tgeometry.normalsNeedUpdate = false;\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\t\t\tgeometry.tangentsNeedUpdate = false;\r\n\r\n\t\t\tgeometry.buffersNeedUpdate = false;\r\n\r\n\t\t\tmaterial.attributes && clearCustomAttributes( material );\r\n\r\n\t\t} else if ( object instanceof THREE.Ribbon ) {\r\n\r\n\t\t\tmaterial = getBufferMaterial( object, geometry );\r\n\r\n\t\t\tcustomAttributesDirty = material.attributes && areCustomAttributesDirty( material );\r\n\r\n\t\t\tif ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.normalsNeedUpdate || customAttributesDirty ) {\r\n\r\n\t\t\t\tsetRibbonBuffers( geometry, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\t\t\tgeometry.normalsNeedUpdate = false;\r\n\r\n\t\t\tmaterial.attributes && clearCustomAttributes( material );\r\n\r\n\t\t} else if ( object instanceof THREE.Line ) {\r\n\r\n\t\t\tmaterial = getBufferMaterial( object, geometry );\r\n\r\n\t\t\tcustomAttributesDirty = material.attributes && areCustomAttributesDirty( material );\r\n\r\n\t\t\tif ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || geometry.lineDistancesNeedUpdate || customAttributesDirty ) {\r\n\r\n\t\t\t\tsetLineBuffers( geometry, _gl.DYNAMIC_DRAW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\r\n\r\n\t\t\tmaterial.attributes && clearCustomAttributes( material );\r\n\r\n\r\n\t\t} else if ( object instanceof THREE.ParticleSystem ) {\r\n\r\n\t\t\tmaterial = getBufferMaterial( object, geometry );\r\n\r\n\t\t\tcustomAttributesDirty = material.attributes && areCustomAttributesDirty( material );\r\n\r\n\t\t\tif ( geometry.verticesNeedUpdate || geometry.colorsNeedUpdate || object.sortParticles || customAttributesDirty ) {\r\n\r\n\t\t\t\tsetParticleBuffers( geometry, _gl.DYNAMIC_DRAW, object );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgeometry.verticesNeedUpdate = false;\r\n\t\t\tgeometry.colorsNeedUpdate = false;\r\n\r\n\t\t\tmaterial.attributes && clearCustomAttributes( material );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Objects updates - custom attributes check\r\n\r\n\tfunction areCustomAttributesDirty( material ) {\r\n\r\n\t\tfor ( var a in material.attributes ) {\r\n\r\n\t\t\tif ( material.attributes[ a ].needsUpdate ) return true;\r\n\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t};\r\n\r\n\tfunction clearCustomAttributes( material ) {\r\n\r\n\t\tfor ( var a in material.attributes ) {\r\n\r\n\t\t\tmaterial.attributes[ a ].needsUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Objects removal\r\n\r\n\tfunction removeObject( object, scene ) {\r\n\r\n\t\tif ( object instanceof THREE.Mesh ||\r\n\t\t\t object instanceof THREE.ParticleSystem ||\r\n\t\t\t object instanceof THREE.Ribbon ||\r\n\t\t\t object instanceof THREE.Line ) {\r\n\r\n\t\t\tremoveInstances( scene.__webglObjects, object );\r\n\r\n\t\t} else if ( object instanceof THREE.Sprite ) {\r\n\r\n\t\t\tremoveInstancesDirect( scene.__webglSprites, object );\r\n\r\n\t\t} else if ( object instanceof THREE.LensFlare ) {\r\n\r\n\t\t\tremoveInstancesDirect( scene.__webglFlares, object );\r\n\r\n\t\t} else if ( object instanceof THREE.ImmediateRenderObject || object.immediateRenderCallback ) {\r\n\r\n\t\t\tremoveInstances( scene.__webglObjectsImmediate, object );\r\n\r\n\t\t}\r\n\r\n\t\tdelete object.__webglActive;\r\n\r\n\t};\r\n\r\n\tfunction removeInstances( objlist, object ) {\r\n\r\n\t\tfor ( var o = objlist.length - 1; o >= 0; o -- ) {\r\n\r\n\t\t\tif ( objlist[ o ].object === object ) {\r\n\r\n\t\t\t\tobjlist.splice( o, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction removeInstancesDirect( objlist, object ) {\r\n\r\n\t\tfor ( var o = objlist.length - 1; o >= 0; o -- ) {\r\n\r\n\t\t\tif ( objlist[ o ] === object ) {\r\n\r\n\t\t\t\tobjlist.splice( o, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Materials\r\n\r\n\tthis.initMaterial = function ( material, lights, fog, object ) {\r\n\r\n\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\r\n\r\n\t\tvar u, a, identifiers, i, parameters, maxLightCount, maxBones, maxShadows, shaderID;\r\n\r\n\t\tif ( material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\tshaderID = 'depth';\r\n\r\n\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\r\n\r\n\t\t\tshaderID = 'normal';\r\n\r\n\t\t} else if ( material instanceof THREE.MeshBasicMaterial ) {\r\n\r\n\t\t\tshaderID = 'basic';\r\n\r\n\t\t} else if ( material instanceof THREE.MeshLambertMaterial ) {\r\n\r\n\t\t\tshaderID = 'lambert';\r\n\r\n\t\t} else if ( material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\tshaderID = 'phong';\r\n\r\n\t\t} else if ( material instanceof THREE.LineBasicMaterial ) {\r\n\r\n\t\t\tshaderID = 'basic';\r\n\r\n\t\t} else if ( material instanceof THREE.LineDashedMaterial ) {\r\n\r\n\t\t\tshaderID = 'dashed';\r\n\r\n\t\t} else if ( material instanceof THREE.ParticleBasicMaterial ) {\r\n\r\n\t\t\tshaderID = 'particle_basic';\r\n\r\n\t\t}\r\n\r\n\t\tif ( shaderID ) {\r\n\r\n\t\t\tsetMaterialShaders( material, THREE.ShaderLib[ shaderID ] );\r\n\r\n\t\t}\r\n\r\n\t\t// heuristics to create shader parameters according to lights in the scene\r\n\t\t// (not to blow over maxLights budget)\r\n\r\n\t\tmaxLightCount = allocateLights( lights );\r\n\r\n\t\tmaxShadows = allocateShadows( lights );\r\n\r\n\t\tmaxBones = allocateBones( object );\r\n\r\n\t\tparameters = {\r\n\r\n\t\t\tmap: !!material.map,\r\n\t\t\tenvMap: !!material.envMap,\r\n\t\t\tlightMap: !!material.lightMap,\r\n\t\t\tbumpMap: !!material.bumpMap,\r\n\t\t\tnormalMap: !!material.normalMap,\r\n\t\t\tspecularMap: !!material.specularMap,\r\n\r\n\t\t\tvertexColors: material.vertexColors,\r\n\r\n\t\t\tfog: fog,\r\n\t\t\tuseFog: material.fog,\r\n\t\t\tfogExp: fog instanceof THREE.FogExp2,\r\n\r\n\t\t\tsizeAttenuation: material.sizeAttenuation,\r\n\r\n\t\t\tskinning: material.skinning,\r\n\t\t\tmaxBones: maxBones,\r\n\t\t\tuseVertexTexture: _supportsBoneTextures && object && object.useVertexTexture,\r\n\t\t\tboneTextureWidth: object && object.boneTextureWidth,\r\n\t\t\tboneTextureHeight: object && object.boneTextureHeight,\r\n\r\n\t\t\tmorphTargets: material.morphTargets,\r\n\t\t\tmorphNormals: material.morphNormals,\r\n\t\t\tmaxMorphTargets: this.maxMorphTargets,\r\n\t\t\tmaxMorphNormals: this.maxMorphNormals,\r\n\r\n\t\t\tmaxDirLights: maxLightCount.directional,\r\n\t\t\tmaxPointLights: maxLightCount.point,\r\n\t\t\tmaxSpotLights: maxLightCount.spot,\r\n\t\t\tmaxHemiLights: maxLightCount.hemi,\r\n\r\n\t\t\tmaxShadows: maxShadows,\r\n\t\t\tshadowMapEnabled: this.shadowMapEnabled && object.receiveShadow,\r\n\t\t\tshadowMapType: this.shadowMapType,\r\n\t\t\tshadowMapDebug: this.shadowMapDebug,\r\n\t\t\tshadowMapCascade: this.shadowMapCascade,\r\n\r\n\t\t\talphaTest: material.alphaTest,\r\n\t\t\tmetal: material.metal,\r\n\t\t\tperPixel: material.perPixel,\r\n\t\t\twrapAround: material.wrapAround,\r\n\t\t\tdoubleSided: material.side === THREE.DoubleSide,\r\n\t\t\tflipSided: material.side === THREE.BackSide\r\n\r\n\t\t};\r\n\r\n\t\tmaterial.program = buildProgram( shaderID, material.fragmentShader, material.vertexShader, material.uniforms, material.attributes, material.defines, parameters );\r\n\r\n\t\tvar attributes = material.program.attributes;\r\n\r\n\t\tif ( material.morphTargets ) {\r\n\r\n\t\t\tmaterial.numSupportedMorphTargets = 0;\r\n\r\n\t\t\tvar id, base = \"morphTarget\";\r\n\r\n\t\t\tfor ( i = 0; i < this.maxMorphTargets; i ++ ) {\r\n\r\n\t\t\t\tid = base + i;\r\n\r\n\t\t\t\tif ( attributes[ id ] >= 0 ) {\r\n\r\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.morphNormals ) {\r\n\r\n\t\t\tmaterial.numSupportedMorphNormals = 0;\r\n\r\n\t\t\tvar id, base = \"morphNormal\";\r\n\r\n\t\t\tfor ( i = 0; i < this.maxMorphNormals; i ++ ) {\r\n\r\n\t\t\t\tid = base + i;\r\n\r\n\t\t\t\tif ( attributes[ id ] >= 0 ) {\r\n\r\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tmaterial.uniformsList = [];\r\n\r\n\t\tfor ( u in material.uniforms ) {\r\n\r\n\t\t\tmaterial.uniformsList.push( [ material.uniforms[ u ], u ] );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setMaterialShaders( material, shaders ) {\r\n\r\n\t\tmaterial.uniforms = THREE.UniformsUtils.clone( shaders.uniforms );\r\n\t\tmaterial.vertexShader = shaders.vertexShader;\r\n\t\tmaterial.fragmentShader = shaders.fragmentShader;\r\n\r\n\t};\r\n\r\n\tfunction setProgram( camera, lights, fog, material, object ) {\r\n\r\n\t\t_usedTextureUnits = 0;\r\n\r\n\t\tif ( material.needsUpdate ) {\r\n\r\n\t\t\tif ( material.program ) deallocateMaterial( material );\r\n\r\n\t\t\t_this.initMaterial( material, lights, fog, object );\r\n\t\t\tmaterial.needsUpdate = false;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.morphTargets ) {\r\n\r\n\t\t\tif ( ! object.__webglMorphTargetInfluences ) {\r\n\r\n\t\t\t\tobject.__webglMorphTargetInfluences = new Float32Array( _this.maxMorphTargets );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar refreshMaterial = false;\r\n\r\n\t\tvar program = material.program,\r\n\t\t\tp_uniforms = program.uniforms,\r\n\t\t\tm_uniforms = material.uniforms;\r\n\r\n\t\tif ( program !== _currentProgram ) {\r\n\r\n\t\t\t_gl.useProgram( program );\r\n\t\t\t_currentProgram = program;\r\n\r\n\t\t\trefreshMaterial = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.id !== _currentMaterialId ) {\r\n\r\n\t\t\t_currentMaterialId = material.id;\r\n\t\t\trefreshMaterial = true;\r\n\r\n\t\t}\r\n\r\n\t\tif ( refreshMaterial || camera !== _currentCamera ) {\r\n\r\n\t\t\t_gl.uniformMatrix4fv( p_uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\r\n\r\n\t\t\tif ( camera !== _currentCamera ) _currentCamera = camera;\r\n\r\n\t\t}\r\n\r\n\t\t// skinning uniforms must be set even if material didn't change\r\n\t\t// auto-setting of texture unit for bone texture must go before other textures\r\n\t\t// not sure why, but otherwise weird things happen\r\n\r\n\t\tif ( material.skinning ) {\r\n\r\n\t\t\tif ( _supportsBoneTextures && object.useVertexTexture ) {\r\n\r\n\t\t\t\tif ( p_uniforms.boneTexture !== null ) {\r\n\r\n\t\t\t\t\tvar textureUnit = getTextureUnit();\r\n\r\n\t\t\t\t\t_gl.uniform1i( p_uniforms.boneTexture, textureUnit );\r\n\t\t\t\t\t_this.setTexture( object.boneTexture, textureUnit );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif ( p_uniforms.boneGlobalMatrices !== null ) {\r\n\r\n\t\t\t\t\t_gl.uniformMatrix4fv( p_uniforms.boneGlobalMatrices, false, object.boneMatrices );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( refreshMaterial ) {\r\n\r\n\t\t\t// refresh uniforms common to several materials\r\n\r\n\t\t\tif ( fog && material.fog ) {\r\n\r\n\t\t\t\trefreshUniformsFog( m_uniforms, fog );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material.lights ) {\r\n\r\n\t\t\t\tif ( _lightsNeedUpdate ) {\r\n\r\n\t\t\t\t\tsetupLights( program, lights );\r\n\t\t\t\t\t_lightsNeedUpdate = false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\trefreshUniformsLights( m_uniforms, _lights );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material instanceof THREE.MeshBasicMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// refresh single material specific uniforms\r\n\r\n\t\t\tif ( material instanceof THREE.LineBasicMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.LineDashedMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\r\n\t\t\t\trefreshUniformsDash( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.ParticleBasicMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsParticle( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshPhongMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsPhong( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshLambertMaterial ) {\r\n\r\n\t\t\t\trefreshUniformsLambert( m_uniforms, material );\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshDepthMaterial ) {\r\n\r\n\t\t\t\tm_uniforms.mNear.value = camera.near;\r\n\t\t\t\tm_uniforms.mFar.value = camera.far;\r\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\r\n\r\n\t\t\t} else if ( material instanceof THREE.MeshNormalMaterial ) {\r\n\r\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( object.receiveShadow && ! material._shadowPass ) {\r\n\r\n\t\t\t\trefreshUniformsShadow( m_uniforms, lights );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// load common uniforms\r\n\r\n\t\t\tloadUniformsGeneric( program, material.uniformsList );\r\n\r\n\t\t\t// load material specific uniforms\r\n\t\t\t// (shader material also gets them for the sake of genericity)\r\n\r\n\t\t\tif ( material instanceof THREE.ShaderMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material.envMap ) {\r\n\r\n\t\t\t\tif ( p_uniforms.cameraPosition !== null ) {\r\n\r\n\t\t\t\t\t_vector3.getPositionFromMatrix( camera.matrixWorld );\r\n\t\t\t\t\t_gl.uniform3f( p_uniforms.cameraPosition, _vector3.x, _vector3.y, _vector3.z );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( material instanceof THREE.MeshPhongMaterial ||\r\n\t\t\t\t material instanceof THREE.MeshLambertMaterial ||\r\n\t\t\t\t material instanceof THREE.ShaderMaterial ||\r\n\t\t\t\t material.skinning ) {\r\n\r\n\t\t\t\tif ( p_uniforms.viewMatrix !== null ) {\r\n\r\n\t\t\t\t\t_gl.uniformMatrix4fv( p_uniforms.viewMatrix, false, camera.matrixWorldInverse.elements );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tloadUniformsMatrices( p_uniforms, object );\r\n\r\n\t\tif ( p_uniforms.modelMatrix !== null ) {\r\n\r\n\t\t\t_gl.uniformMatrix4fv( p_uniforms.modelMatrix, false, object.matrixWorld.elements );\r\n\r\n\t\t}\r\n\r\n\t\treturn program;\r\n\r\n\t};\r\n\r\n\t// Uniforms (refresh uniforms objects)\r\n\r\n\tfunction refreshUniformsCommon ( uniforms, material ) {\r\n\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\r\n\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\tuniforms.diffuse.value.copyGammaToLinear( material.color );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tuniforms.diffuse.value = material.color;\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.map.value = material.map;\r\n\t\tuniforms.lightMap.value = material.lightMap;\r\n\t\tuniforms.specularMap.value = material.specularMap;\r\n\r\n\t\tif ( material.bumpMap ) {\r\n\r\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\r\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.normalMap ) {\r\n\r\n\t\t\tuniforms.normalMap.value = material.normalMap;\r\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\r\n\r\n\t\t}\r\n\r\n\t\t// uv repeat and offset setting priorities\r\n\t\t//\t1. color map\r\n\t\t//\t2. specular map\r\n\t\t//\t3. normal map\r\n\t\t//\t4. bump map\r\n\r\n\t\tvar uvScaleMap;\r\n\r\n\t\tif ( material.map ) {\r\n\r\n\t\t\tuvScaleMap = material.map;\r\n\r\n\t\t} else if ( material.specularMap ) {\r\n\r\n\t\t\tuvScaleMap = material.specularMap;\r\n\r\n\t\t} else if ( material.normalMap ) {\r\n\r\n\t\t\tuvScaleMap = material.normalMap;\r\n\r\n\t\t} else if ( material.bumpMap ) {\r\n\r\n\t\t\tuvScaleMap = material.bumpMap;\r\n\r\n\t\t}\r\n\r\n\t\tif ( uvScaleMap !== undefined ) {\r\n\r\n\t\t\tvar offset = uvScaleMap.offset;\r\n\t\t\tvar repeat = uvScaleMap.repeat;\r\n\r\n\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.envMap.value = material.envMap;\r\n\t\tuniforms.flipEnvMap.value = ( material.envMap instanceof THREE.WebGLRenderTargetCube ) ? 1 : -1;\r\n\r\n\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t//uniforms.reflectivity.value = material.reflectivity * material.reflectivity;\r\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\r\n\r\n\t\t}\r\n\r\n\t\tuniforms.refractionRatio.value = material.refractionRatio;\r\n\t\tuniforms.combine.value = material.combine;\r\n\t\tuniforms.useRefract.value = material.envMap && material.envMap.mapping instanceof THREE.CubeRefractionMapping;\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsLine ( uniforms, material ) {\r\n\r\n\t\tuniforms.diffuse.value = material.color;\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsDash ( uniforms, material ) {\r\n\r\n\t\tuniforms.dashSize.value = material.dashSize;\r\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\r\n\t\tuniforms.scale.value = material.scale;\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsParticle ( uniforms, material ) {\r\n\r\n\t\tuniforms.psColor.value = material.color;\r\n\t\tuniforms.opacity.value = material.opacity;\r\n\t\tuniforms.size.value = material.size;\r\n\t\tuniforms.scale.value = _canvas.height / 2.0; // TODO: Cache this.\r\n\r\n\t\tuniforms.map.value = material.map;\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsFog ( uniforms, fog ) {\r\n\r\n\t\tuniforms.fogColor.value = fog.color;\r\n\r\n\t\tif ( fog instanceof THREE.Fog ) {\r\n\r\n\t\t\tuniforms.fogNear.value = fog.near;\r\n\t\t\tuniforms.fogFar.value = fog.far;\r\n\r\n\t\t} else if ( fog instanceof THREE.FogExp2 ) {\r\n\r\n\t\t\tuniforms.fogDensity.value = fog.density;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsPhong ( uniforms, material ) {\r\n\r\n\t\tuniforms.shininess.value = material.shininess;\r\n\r\n\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\tuniforms.ambient.value.copyGammaToLinear( material.ambient );\r\n\t\t\tuniforms.emissive.value.copyGammaToLinear( material.emissive );\r\n\t\t\tuniforms.specular.value.copyGammaToLinear( material.specular );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tuniforms.ambient.value = material.ambient;\r\n\t\t\tuniforms.emissive.value = material.emissive;\r\n\t\t\tuniforms.specular.value = material.specular;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.wrapAround ) {\r\n\r\n\t\t\tuniforms.wrapRGB.value.copy( material.wrapRGB );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsLambert ( uniforms, material ) {\r\n\r\n\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\tuniforms.ambient.value.copyGammaToLinear( material.ambient );\r\n\t\t\tuniforms.emissive.value.copyGammaToLinear( material.emissive );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tuniforms.ambient.value = material.ambient;\r\n\t\t\tuniforms.emissive.value = material.emissive;\r\n\r\n\t\t}\r\n\r\n\t\tif ( material.wrapAround ) {\r\n\r\n\t\t\tuniforms.wrapRGB.value.copy( material.wrapRGB );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsLights ( uniforms, lights ) {\r\n\r\n\t\tuniforms.ambientLightColor.value = lights.ambient;\r\n\r\n\t\tuniforms.directionalLightColor.value = lights.directional.colors;\r\n\t\tuniforms.directionalLightDirection.value = lights.directional.positions;\r\n\r\n\t\tuniforms.pointLightColor.value = lights.point.colors;\r\n\t\tuniforms.pointLightPosition.value = lights.point.positions;\r\n\t\tuniforms.pointLightDistance.value = lights.point.distances;\r\n\r\n\t\tuniforms.spotLightColor.value = lights.spot.colors;\r\n\t\tuniforms.spotLightPosition.value = lights.spot.positions;\r\n\t\tuniforms.spotLightDistance.value = lights.spot.distances;\r\n\t\tuniforms.spotLightDirection.value = lights.spot.directions;\r\n\t\tuniforms.spotLightAngleCos.value = lights.spot.anglesCos;\r\n\t\tuniforms.spotLightExponent.value = lights.spot.exponents;\r\n\r\n\t\tuniforms.hemisphereLightSkyColor.value = lights.hemi.skyColors;\r\n\t\tuniforms.hemisphereLightGroundColor.value = lights.hemi.groundColors;\r\n\t\tuniforms.hemisphereLightDirection.value = lights.hemi.positions;\r\n\r\n\t};\r\n\r\n\tfunction refreshUniformsShadow ( uniforms, lights ) {\r\n\r\n\t\tif ( uniforms.shadowMatrix ) {\r\n\r\n\t\t\tvar j = 0;\r\n\r\n\t\t\tfor ( var i = 0, il = lights.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tvar light = lights[ i ];\r\n\r\n\t\t\t\tif ( ! light.castShadow ) continue;\r\n\r\n\t\t\t\tif ( light instanceof THREE.SpotLight || ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) ) {\r\n\r\n\t\t\t\t\tuniforms.shadowMap.value[ j ] = light.shadowMap;\r\n\t\t\t\t\tuniforms.shadowMapSize.value[ j ] = light.shadowMapSize;\r\n\r\n\t\t\t\t\tuniforms.shadowMatrix.value[ j ] = light.shadowMatrix;\r\n\r\n\t\t\t\t\tuniforms.shadowDarkness.value[ j ] = light.shadowDarkness;\r\n\t\t\t\t\tuniforms.shadowBias.value[ j ] = light.shadowBias;\r\n\r\n\t\t\t\t\tj ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Uniforms (load to GPU)\r\n\r\n\tfunction loadUniformsMatrices ( uniforms, object ) {\r\n\r\n\t\t_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, object._modelViewMatrix.elements );\r\n\r\n\t\tif ( uniforms.normalMatrix ) {\r\n\r\n\t\t\t_gl.uniformMatrix3fv( uniforms.normalMatrix, false, object._normalMatrix.elements );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction getTextureUnit() {\r\n\r\n\t\tvar textureUnit = _usedTextureUnits;\r\n\r\n\t\tif ( textureUnit >= _maxTextures ) {\r\n\r\n\t\t\tconsole.warn( \"WebGLRenderer: trying to use \" + textureUnit + \" texture units while this GPU supports only \" + _maxTextures );\r\n\r\n\t\t}\r\n\r\n\t\t_usedTextureUnits += 1;\r\n\r\n\t\treturn textureUnit;\r\n\r\n\t};\r\n\r\n\tfunction loadUniformsGeneric ( program, uniforms ) {\r\n\r\n\t\tvar uniform, value, type, location, texture, textureUnit, i, il, j, jl, offset;\r\n\r\n\t\tfor ( j = 0, jl = uniforms.length; j < jl; j ++ ) {\r\n\r\n\t\t\tlocation = program.uniforms[ uniforms[ j ][ 1 ] ];\r\n\t\t\tif ( !location ) continue;\r\n\r\n\t\t\tuniform = uniforms[ j ][ 0 ];\r\n\r\n\t\t\ttype = uniform.type;\r\n\t\t\tvalue = uniform.value;\r\n\r\n\t\t\tif ( type === \"i\" ) { // single integer\r\n\r\n\t\t\t\t_gl.uniform1i( location, value );\r\n\r\n\t\t\t} else if ( type === \"f\" ) { // single float\r\n\r\n\t\t\t\t_gl.uniform1f( location, value );\r\n\r\n\t\t\t} else if ( type === \"v2\" ) { // single THREE.Vector2\r\n\r\n\t\t\t\t_gl.uniform2f( location, value.x, value.y );\r\n\r\n\t\t\t} else if ( type === \"v3\" ) { // single THREE.Vector3\r\n\r\n\t\t\t\t_gl.uniform3f( location, value.x, value.y, value.z );\r\n\r\n\t\t\t} else if ( type === \"v4\" ) { // single THREE.Vector4\r\n\r\n\t\t\t\t_gl.uniform4f( location, value.x, value.y, value.z, value.w );\r\n\r\n\t\t\t} else if ( type === \"c\" ) { // single THREE.Color\r\n\r\n\t\t\t\t_gl.uniform3f( location, value.r, value.g, value.b );\r\n\r\n\t\t\t} else if ( type === \"iv1\" ) { // flat array of integers (JS or typed array)\r\n\r\n\t\t\t\t_gl.uniform1iv( location, value );\r\n\r\n\t\t\t} else if ( type === \"iv\" ) { // flat array of integers with 3 x N size (JS or typed array)\r\n\r\n\t\t\t\t_gl.uniform3iv( location, value );\r\n\r\n\t\t\t} else if ( type === \"fv1\" ) { // flat array of floats (JS or typed array)\r\n\r\n\t\t\t\t_gl.uniform1fv( location, value );\r\n\r\n\t\t\t} else if ( type === \"fv\" ) { // flat array of floats with 3 x N size (JS or typed array)\r\n\r\n\t\t\t\t_gl.uniform3fv( location, value );\r\n\r\n\t\t\t} else if ( type === \"v2v\" ) { // array of THREE.Vector2\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = new Float32Array( 2 * value.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, il = value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\toffset = i * 2;\r\n\r\n\t\t\t\t\tuniform._array[ offset ] \t = value[ i ].x;\r\n\t\t\t\t\tuniform._array[ offset + 1 ] = value[ i ].y;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.uniform2fv( location, uniform._array );\r\n\r\n\t\t\t} else if ( type === \"v3v\" ) { // array of THREE.Vector3\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = new Float32Array( 3 * value.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, il = value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\toffset = i * 3;\r\n\r\n\t\t\t\t\tuniform._array[ offset ] \t = value[ i ].x;\r\n\t\t\t\t\tuniform._array[ offset + 1 ] = value[ i ].y;\r\n\t\t\t\t\tuniform._array[ offset + 2 ] = value[ i ].z;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.uniform3fv( location, uniform._array );\r\n\r\n\t\t\t} else if ( type === \"v4v\" ) { // array of THREE.Vector4\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = new Float32Array( 4 * value.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, il = value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\toffset = i * 4;\r\n\r\n\t\t\t\t\tuniform._array[ offset ] \t = value[ i ].x;\r\n\t\t\t\t\tuniform._array[ offset + 1 ] = value[ i ].y;\r\n\t\t\t\t\tuniform._array[ offset + 2 ] = value[ i ].z;\r\n\t\t\t\t\tuniform._array[ offset + 3 ] = value[ i ].w;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.uniform4fv( location, uniform._array );\r\n\r\n\t\t\t} else if ( type === \"m4\") { // single THREE.Matrix4\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = new Float32Array( 16 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvalue.flattenToArray( uniform._array );\r\n\t\t\t\t_gl.uniformMatrix4fv( location, false, uniform._array );\r\n\r\n\t\t\t} else if ( type === \"m4v\" ) { // array of THREE.Matrix4\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = new Float32Array( 16 * value.length );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( i = 0, il = value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tvalue[ i ].flattenToArrayOffset( uniform._array, i * 16 );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.uniformMatrix4fv( location, false, uniform._array );\r\n\r\n\t\t\t} else if ( type === \"t\" ) { // single THREE.Texture (2d or cube)\r\n\r\n\t\t\t\ttexture = value;\r\n\t\t\t\ttextureUnit = getTextureUnit();\r\n\r\n\t\t\t\t_gl.uniform1i( location, textureUnit );\r\n\r\n\t\t\t\tif ( !texture ) continue;\r\n\r\n\t\t\t\tif ( texture.image instanceof Array && texture.image.length === 6 ) {\r\n\r\n\t\t\t\t\tsetCubeTexture( texture, textureUnit );\r\n\r\n\t\t\t\t} else if ( texture instanceof THREE.WebGLRenderTargetCube ) {\r\n\r\n\t\t\t\t\tsetCubeTextureDynamic( texture, textureUnit );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_this.setTexture( texture, textureUnit );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( type === \"tv\" ) { // array of THREE.Texture (2d)\r\n\r\n\t\t\t\tif ( uniform._array === undefined ) {\r\n\r\n\t\t\t\t\tuniform._array = [];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor( i = 0, il = uniform.value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tuniform._array[ i ] = getTextureUnit();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.uniform1iv( location, uniform._array );\r\n\r\n\t\t\t\tfor( i = 0, il = uniform.value.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\ttexture = uniform.value[ i ];\r\n\t\t\t\t\ttextureUnit = uniform._array[ i ];\r\n\r\n\t\t\t\t\tif ( !texture ) continue;\r\n\r\n\t\t\t\t\t_this.setTexture( texture, textureUnit );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setupMatrices ( object, camera ) {\r\n\r\n\t\tobject._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\r\n\t\tobject._normalMatrix.getNormalMatrix( object._modelViewMatrix );\r\n\r\n\t};\r\n\r\n\t//\r\n\r\n\tfunction setColorGamma( array, offset, color, intensitySq ) {\r\n\r\n\t\tarray[ offset ] = color.r * color.r * intensitySq;\r\n\t\tarray[ offset + 1 ] = color.g * color.g * intensitySq;\r\n\t\tarray[ offset + 2 ] = color.b * color.b * intensitySq;\r\n\r\n\t};\r\n\r\n\tfunction setColorLinear( array, offset, color, intensity ) {\r\n\r\n\t\tarray[ offset ] = color.r * intensity;\r\n\t\tarray[ offset + 1 ] = color.g * intensity;\r\n\t\tarray[ offset + 2 ] = color.b * intensity;\r\n\r\n\t};\r\n\r\n\tfunction setupLights ( program, lights ) {\r\n\r\n\t\tvar l, ll, light, n,\r\n\t\tr = 0, g = 0, b = 0,\r\n\t\tcolor, skyColor, groundColor,\r\n\t\tintensity, intensitySq,\r\n\t\tposition,\r\n\t\tdistance,\r\n\r\n\t\tzlights = _lights,\r\n\r\n\t\tdirColors = zlights.directional.colors,\r\n\t\tdirPositions = zlights.directional.positions,\r\n\r\n\t\tpointColors = zlights.point.colors,\r\n\t\tpointPositions = zlights.point.positions,\r\n\t\tpointDistances = zlights.point.distances,\r\n\r\n\t\tspotColors = zlights.spot.colors,\r\n\t\tspotPositions = zlights.spot.positions,\r\n\t\tspotDistances = zlights.spot.distances,\r\n\t\tspotDirections = zlights.spot.directions,\r\n\t\tspotAnglesCos = zlights.spot.anglesCos,\r\n\t\tspotExponents = zlights.spot.exponents,\r\n\r\n\t\themiSkyColors = zlights.hemi.skyColors,\r\n\t\themiGroundColors = zlights.hemi.groundColors,\r\n\t\themiPositions = zlights.hemi.positions,\r\n\r\n\t\tdirLength = 0,\r\n\t\tpointLength = 0,\r\n\t\tspotLength = 0,\r\n\t\themiLength = 0,\r\n\r\n\t\tdirCount = 0,\r\n\t\tpointCount = 0,\r\n\t\tspotCount = 0,\r\n\t\themiCount = 0,\r\n\r\n\t\tdirOffset = 0,\r\n\t\tpointOffset = 0,\r\n\t\tspotOffset = 0,\r\n\t\themiOffset = 0;\r\n\r\n\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\r\n\r\n\t\t\tlight = lights[ l ];\r\n\r\n\t\t\tif ( light.onlyShadow ) continue;\r\n\r\n\t\t\tcolor = light.color;\r\n\t\t\tintensity = light.intensity;\r\n\t\t\tdistance = light.distance;\r\n\r\n\t\t\tif ( light instanceof THREE.AmbientLight ) {\r\n\r\n\t\t\t\tif ( ! light.visible ) continue;\r\n\r\n\t\t\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t\t\tr += color.r * color.r;\r\n\t\t\t\t\tg += color.g * color.g;\r\n\t\t\t\t\tb += color.b * color.b;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tr += color.r;\r\n\t\t\t\t\tg += color.g;\r\n\t\t\t\t\tb += color.b;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( light instanceof THREE.DirectionalLight ) {\r\n\r\n\t\t\t\tdirCount += 1;\r\n\r\n\t\t\t\tif ( ! light.visible ) continue;\r\n\r\n\t\t\t\t_direction.getPositionFromMatrix( light.matrixWorld );\r\n\t\t\t\t_vector3.getPositionFromMatrix( light.target.matrixWorld );\r\n\t\t\t\t_direction.sub( _vector3 );\r\n\t\t\t\t_direction.normalize();\r\n\r\n\t\t\t\t// skip lights with undefined direction\r\n\t\t\t\t// these create troubles in OpenGL (making pixel black)\r\n\r\n\t\t\t\tif ( _direction.x === 0 && _direction.y === 0 && _direction.z === 0 ) continue;\r\n\r\n\t\t\t\tdirOffset = dirLength * 3;\r\n\r\n\t\t\t\tdirPositions[ dirOffset ] = _direction.x;\r\n\t\t\t\tdirPositions[ dirOffset + 1 ] = _direction.y;\r\n\t\t\t\tdirPositions[ dirOffset + 2 ] = _direction.z;\r\n\r\n\t\t\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t\t\tsetColorGamma( dirColors, dirOffset, color, intensity * intensity );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tsetColorLinear( dirColors, dirOffset, color, intensity );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdirLength += 1;\r\n\r\n\t\t\t} else if ( light instanceof THREE.PointLight ) {\r\n\r\n\t\t\t\tpointCount += 1;\r\n\r\n\t\t\t\tif ( ! light.visible ) continue;\r\n\r\n\t\t\t\tpointOffset = pointLength * 3;\r\n\r\n\t\t\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t\t\tsetColorGamma( pointColors, pointOffset, color, intensity * intensity );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tsetColorLinear( pointColors, pointOffset, color, intensity );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_vector3.getPositionFromMatrix( light.matrixWorld );\r\n\r\n\t\t\t\tpointPositions[ pointOffset ] = _vector3.x;\r\n\t\t\t\tpointPositions[ pointOffset + 1 ] = _vector3.y;\r\n\t\t\t\tpointPositions[ pointOffset + 2 ] = _vector3.z;\r\n\r\n\t\t\t\tpointDistances[ pointLength ] = distance;\r\n\r\n\t\t\t\tpointLength += 1;\r\n\r\n\t\t\t} else if ( light instanceof THREE.SpotLight ) {\r\n\r\n\t\t\t\tspotCount += 1;\r\n\r\n\t\t\t\tif ( ! light.visible ) continue;\r\n\r\n\t\t\t\tspotOffset = spotLength * 3;\r\n\r\n\t\t\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t\t\tsetColorGamma( spotColors, spotOffset, color, intensity * intensity );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tsetColorLinear( spotColors, spotOffset, color, intensity );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_vector3.getPositionFromMatrix( light.matrixWorld );\r\n\r\n\t\t\t\tspotPositions[ spotOffset ] = _vector3.x;\r\n\t\t\t\tspotPositions[ spotOffset + 1 ] = _vector3.y;\r\n\t\t\t\tspotPositions[ spotOffset + 2 ] = _vector3.z;\r\n\r\n\t\t\t\tspotDistances[ spotLength ] = distance;\r\n\r\n\t\t\t\t_direction.copy( _vector3 );\r\n\t\t\t\t_vector3.getPositionFromMatrix( light.target.matrixWorld );\r\n\t\t\t\t_direction.sub( _vector3 );\r\n\t\t\t\t_direction.normalize();\r\n\r\n\t\t\t\tspotDirections[ spotOffset ] = _direction.x;\r\n\t\t\t\tspotDirections[ spotOffset + 1 ] = _direction.y;\r\n\t\t\t\tspotDirections[ spotOffset + 2 ] = _direction.z;\r\n\r\n\t\t\t\tspotAnglesCos[ spotLength ] = Math.cos( light.angle );\r\n\t\t\t\tspotExponents[ spotLength ] = light.exponent;\r\n\r\n\t\t\t\tspotLength += 1;\r\n\r\n\t\t\t} else if ( light instanceof THREE.HemisphereLight ) {\r\n\r\n\t\t\t\themiCount += 1;\r\n\r\n\t\t\t\tif ( ! light.visible ) continue;\r\n\r\n\t\t\t\t_direction.getPositionFromMatrix( light.matrixWorld );\r\n\t\t\t\t_direction.normalize();\r\n\r\n\t\t\t\t// skip lights with undefined direction\r\n\t\t\t\t// these create troubles in OpenGL (making pixel black)\r\n\r\n\t\t\t\tif ( _direction.x === 0 && _direction.y === 0 && _direction.z === 0 ) continue;\r\n\r\n\t\t\t\themiOffset = hemiLength * 3;\r\n\r\n\t\t\t\themiPositions[ hemiOffset ] = _direction.x;\r\n\t\t\t\themiPositions[ hemiOffset + 1 ] = _direction.y;\r\n\t\t\t\themiPositions[ hemiOffset + 2 ] = _direction.z;\r\n\r\n\t\t\t\tskyColor = light.color;\r\n\t\t\t\tgroundColor = light.groundColor;\r\n\r\n\t\t\t\tif ( _this.gammaInput ) {\r\n\r\n\t\t\t\t\tintensitySq = intensity * intensity;\r\n\r\n\t\t\t\t\tsetColorGamma( hemiSkyColors, hemiOffset, skyColor, intensitySq );\r\n\t\t\t\t\tsetColorGamma( hemiGroundColors, hemiOffset, groundColor, intensitySq );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tsetColorLinear( hemiSkyColors, hemiOffset, skyColor, intensity );\r\n\t\t\t\t\tsetColorLinear( hemiGroundColors, hemiOffset, groundColor, intensity );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\themiLength += 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// null eventual remains from removed lights\r\n\t\t// (this is to avoid if in shader)\r\n\r\n\t\tfor ( l = dirLength * 3, ll = Math.max( dirColors.length, dirCount * 3 ); l < ll; l ++ ) dirColors[ l ] = 0.0;\r\n\t\tfor ( l = pointLength * 3, ll = Math.max( pointColors.length, pointCount * 3 ); l < ll; l ++ ) pointColors[ l ] = 0.0;\r\n\t\tfor ( l = spotLength * 3, ll = Math.max( spotColors.length, spotCount * 3 ); l < ll; l ++ ) spotColors[ l ] = 0.0;\r\n\t\tfor ( l = hemiLength * 3, ll = Math.max( hemiSkyColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiSkyColors[ l ] = 0.0;\r\n\t\tfor ( l = hemiLength * 3, ll = Math.max( hemiGroundColors.length, hemiCount * 3 ); l < ll; l ++ ) hemiGroundColors[ l ] = 0.0;\r\n\r\n\t\tzlights.directional.length = dirLength;\r\n\t\tzlights.point.length = pointLength;\r\n\t\tzlights.spot.length = spotLength;\r\n\t\tzlights.hemi.length = hemiLength;\r\n\r\n\t\tzlights.ambient[ 0 ] = r;\r\n\t\tzlights.ambient[ 1 ] = g;\r\n\t\tzlights.ambient[ 2 ] = b;\r\n\r\n\t};\r\n\r\n\t// GL state setting\r\n\r\n\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\r\n\r\n\t\tif ( cullFace === THREE.CullFaceNone ) {\r\n\r\n\t\t\t_gl.disable( _gl.CULL_FACE );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif ( frontFaceDirection === THREE.FrontFaceDirectionCW ) {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CW );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CCW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( cullFace === THREE.CullFaceBack ) {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.BACK );\r\n\r\n\t\t\t} else if ( cullFace === THREE.CullFaceFront ) {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.FRONT );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.cullFace( _gl.FRONT_AND_BACK );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.enable( _gl.CULL_FACE );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setMaterialFaces = function ( material ) {\r\n\r\n\t\tvar doubleSided = material.side === THREE.DoubleSide;\r\n\t\tvar flipSided = material.side === THREE.BackSide;\r\n\r\n\t\tif ( _oldDoubleSided !== doubleSided ) {\r\n\r\n\t\t\tif ( doubleSided ) {\r\n\r\n\t\t\t\t_gl.disable( _gl.CULL_FACE );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.enable( _gl.CULL_FACE );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_oldDoubleSided = doubleSided;\r\n\r\n\t\t}\r\n\r\n\t\tif ( _oldFlipSided !== flipSided ) {\r\n\r\n\t\t\tif ( flipSided ) {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CW );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.frontFace( _gl.CCW );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_oldFlipSided = flipSided;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setDepthTest = function ( depthTest ) {\r\n\r\n\t\tif ( _oldDepthTest !== depthTest ) {\r\n\r\n\t\t\tif ( depthTest ) {\r\n\r\n\t\t\t\t_gl.enable( _gl.DEPTH_TEST );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.disable( _gl.DEPTH_TEST );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_oldDepthTest = depthTest;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setDepthWrite = function ( depthWrite ) {\r\n\r\n\t\tif ( _oldDepthWrite !== depthWrite ) {\r\n\r\n\t\t\t_gl.depthMask( depthWrite );\r\n\t\t\t_oldDepthWrite = depthWrite;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setLineWidth ( width ) {\r\n\r\n\t\tif ( width !== _oldLineWidth ) {\r\n\r\n\t\t\t_gl.lineWidth( width );\r\n\r\n\t\t\t_oldLineWidth = width;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setPolygonOffset ( polygonoffset, factor, units ) {\r\n\r\n\t\tif ( _oldPolygonOffset !== polygonoffset ) {\r\n\r\n\t\t\tif ( polygonoffset ) {\r\n\r\n\t\t\t\t_gl.enable( _gl.POLYGON_OFFSET_FILL );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.disable( _gl.POLYGON_OFFSET_FILL );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_oldPolygonOffset = polygonoffset;\r\n\r\n\t\t}\r\n\r\n\t\tif ( polygonoffset && ( _oldPolygonOffsetFactor !== factor || _oldPolygonOffsetUnits !== units ) ) {\r\n\r\n\t\t\t_gl.polygonOffset( factor, units );\r\n\r\n\t\t\t_oldPolygonOffsetFactor = factor;\r\n\t\t\t_oldPolygonOffsetUnits = units;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setBlending = function ( blending, blendEquation, blendSrc, blendDst ) {\r\n\r\n\t\tif ( blending !== _oldBlending ) {\r\n\r\n\t\t\tif ( blending === THREE.NoBlending ) {\r\n\r\n\t\t\t\t_gl.disable( _gl.BLEND );\r\n\r\n\t\t\t} else if ( blending === THREE.AdditiveBlending ) {\r\n\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\t\t\t\t_gl.blendEquation( _gl.FUNC_ADD );\r\n\t\t\t\t_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE );\r\n\r\n\t\t\t} else if ( blending === THREE.SubtractiveBlending ) {\r\n\r\n\t\t\t\t// TODO: Find blendFuncSeparate() combination\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\t\t\t\t_gl.blendEquation( _gl.FUNC_ADD );\r\n\t\t\t\t_gl.blendFunc( _gl.ZERO, _gl.ONE_MINUS_SRC_COLOR );\r\n\r\n\t\t\t} else if ( blending === THREE.MultiplyBlending ) {\r\n\r\n\t\t\t\t// TODO: Find blendFuncSeparate() combination\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\t\t\t\t_gl.blendEquation( _gl.FUNC_ADD );\r\n\t\t\t\t_gl.blendFunc( _gl.ZERO, _gl.SRC_COLOR );\r\n\r\n\t\t\t} else if ( blending === THREE.CustomBlending ) {\r\n\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\t\t\t\t_gl.blendEquationSeparate( _gl.FUNC_ADD, _gl.FUNC_ADD );\r\n\t\t\t\t_gl.blendFuncSeparate( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA, _gl.ONE, _gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_oldBlending = blending;\r\n\r\n\t\t}\r\n\r\n\t\tif ( blending === THREE.CustomBlending ) {\r\n\r\n\t\t\tif ( blendEquation !== _oldBlendEquation ) {\r\n\r\n\t\t\t\t_gl.blendEquation( paramThreeToGL( blendEquation ) );\r\n\r\n\t\t\t\t_oldBlendEquation = blendEquation;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( blendSrc !== _oldBlendSrc || blendDst !== _oldBlendDst ) {\r\n\r\n\t\t\t\t_gl.blendFunc( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ) );\r\n\r\n\t\t\t\t_oldBlendSrc = blendSrc;\r\n\t\t\t\t_oldBlendDst = blendDst;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_oldBlendEquation = null;\r\n\t\t\t_oldBlendSrc = null;\r\n\t\t\t_oldBlendDst = null;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Defines\r\n\r\n\tfunction generateDefines ( defines ) {\r\n\r\n\t\tvar value, chunk, chunks = [];\r\n\r\n\t\tfor ( var d in defines ) {\r\n\r\n\t\t\tvalue = defines[ d ];\r\n\t\t\tif ( value === false ) continue;\r\n\r\n\t\t\tchunk = \"#define \" + d + \" \" + value;\r\n\t\t\tchunks.push( chunk );\r\n\r\n\t\t}\r\n\r\n\t\treturn chunks.join( \"\\n\" );\r\n\r\n\t};\r\n\r\n\t// Shaders\r\n\r\n\tfunction buildProgram ( shaderID, fragmentShader, vertexShader, uniforms, attributes, defines, parameters ) {\r\n\r\n\t\tvar p, pl, d, program, code;\r\n\t\tvar chunks = [];\r\n\r\n\t\t// Generate code\r\n\r\n\t\tif ( shaderID ) {\r\n\r\n\t\t\tchunks.push( shaderID );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tchunks.push( fragmentShader );\r\n\t\t\tchunks.push( vertexShader );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( d in defines ) {\r\n\r\n\t\t\tchunks.push( d );\r\n\t\t\tchunks.push( defines[ d ] );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( p in parameters ) {\r\n\r\n\t\t\tchunks.push( p );\r\n\t\t\tchunks.push( parameters[ p ] );\r\n\r\n\t\t}\r\n\r\n\t\tcode = chunks.join();\r\n\r\n\t\t// Check if code has been already compiled\r\n\r\n\t\tfor ( p = 0, pl = _programs.length; p < pl; p ++ ) {\r\n\r\n\t\t\tvar programInfo = _programs[ p ];\r\n\r\n\t\t\tif ( programInfo.code === code ) {\r\n\r\n\t\t\t\t// console.log( \"Code already compiled.\" /*: \\n\\n\" + code*/ );\r\n\r\n\t\t\t\tprogramInfo.usedTimes ++;\r\n\r\n\t\t\t\treturn programInfo.program;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar shadowMapTypeDefine = \"SHADOWMAP_TYPE_BASIC\";\r\n\r\n\t\tif ( parameters.shadowMapType === THREE.PCFShadowMap ) {\r\n\r\n\t\t\tshadowMapTypeDefine = \"SHADOWMAP_TYPE_PCF\";\r\n\r\n\t\t} else if ( parameters.shadowMapType === THREE.PCFSoftShadowMap ) {\r\n\r\n\t\t\tshadowMapTypeDefine = \"SHADOWMAP_TYPE_PCF_SOFT\";\r\n\r\n\t\t}\r\n\r\n\t\t// console.log( \"building new program \" );\r\n\r\n\t\t//\r\n\r\n\t\tvar customDefines = generateDefines( defines );\r\n\r\n\t\t//\r\n\r\n\t\tprogram = _gl.createProgram();\r\n\r\n\t\tvar prefix_vertex = [\r\n\r\n\t\t\t\"precision \" + _precision + \" float;\",\r\n\r\n\t\t\tcustomDefines,\r\n\r\n\t\t\t_supportsVertexTextures ? \"#define VERTEX_TEXTURES\" : \"\",\r\n\r\n\t\t\t_this.gammaInput ? \"#define GAMMA_INPUT\" : \"\",\r\n\t\t\t_this.gammaOutput ? \"#define GAMMA_OUTPUT\" : \"\",\r\n\t\t\t_this.physicallyBasedShading ? \"#define PHYSICALLY_BASED_SHADING\" : \"\",\r\n\r\n\t\t\t\"#define MAX_DIR_LIGHTS \" + parameters.maxDirLights,\r\n\t\t\t\"#define MAX_POINT_LIGHTS \" + parameters.maxPointLights,\r\n\t\t\t\"#define MAX_SPOT_LIGHTS \" + parameters.maxSpotLights,\r\n\t\t\t\"#define MAX_HEMI_LIGHTS \" + parameters.maxHemiLights,\r\n\r\n\t\t\t\"#define MAX_SHADOWS \" + parameters.maxShadows,\r\n\r\n\t\t\t\"#define MAX_BONES \" + parameters.maxBones,\r\n\r\n\t\t\tparameters.map ? \"#define USE_MAP\" : \"\",\r\n\t\t\tparameters.envMap ? \"#define USE_ENVMAP\" : \"\",\r\n\t\t\tparameters.lightMap ? \"#define USE_LIGHTMAP\" : \"\",\r\n\t\t\tparameters.bumpMap ? \"#define USE_BUMPMAP\" : \"\",\r\n\t\t\tparameters.normalMap ? \"#define USE_NORMALMAP\" : \"\",\r\n\t\t\tparameters.specularMap ? \"#define USE_SPECULARMAP\" : \"\",\r\n\t\t\tparameters.vertexColors ? \"#define USE_COLOR\" : \"\",\r\n\r\n\t\t\tparameters.skinning ? \"#define USE_SKINNING\" : \"\",\r\n\t\t\tparameters.useVertexTexture ? \"#define BONE_TEXTURE\" : \"\",\r\n\t\t\tparameters.boneTextureWidth ? \"#define N_BONE_PIXEL_X \" + parameters.boneTextureWidth.toFixed( 1 ) : \"\",\r\n\t\t\tparameters.boneTextureHeight ? \"#define N_BONE_PIXEL_Y \" + parameters.boneTextureHeight.toFixed( 1 ) : \"\",\r\n\r\n\t\t\tparameters.morphTargets ? \"#define USE_MORPHTARGETS\" : \"\",\r\n\t\t\tparameters.morphNormals ? \"#define USE_MORPHNORMALS\" : \"\",\r\n\t\t\tparameters.perPixel ? \"#define PHONG_PER_PIXEL\" : \"\",\r\n\t\t\tparameters.wrapAround ? \"#define WRAP_AROUND\" : \"\",\r\n\t\t\tparameters.doubleSided ? \"#define DOUBLE_SIDED\" : \"\",\r\n\t\t\tparameters.flipSided ? \"#define FLIP_SIDED\" : \"\",\r\n\r\n\t\t\tparameters.shadowMapEnabled ? \"#define USE_SHADOWMAP\" : \"\",\r\n\t\t\tparameters.shadowMapEnabled ? \"#define \" + shadowMapTypeDefine : \"\",\r\n\t\t\tparameters.shadowMapDebug ? \"#define SHADOWMAP_DEBUG\" : \"\",\r\n\t\t\tparameters.shadowMapCascade ? \"#define SHADOWMAP_CASCADE\" : \"\",\r\n\r\n\t\t\tparameters.sizeAttenuation ? \"#define USE_SIZEATTENUATION\" : \"\",\r\n\r\n\t\t\t\"uniform mat4 modelMatrix;\",\r\n\t\t\t\"uniform mat4 modelViewMatrix;\",\r\n\t\t\t\"uniform mat4 projectionMatrix;\",\r\n\t\t\t\"uniform mat4 viewMatrix;\",\r\n\t\t\t\"uniform mat3 normalMatrix;\",\r\n\t\t\t\"uniform vec3 cameraPosition;\",\r\n\r\n\t\t\t\"attribute vec3 position;\",\r\n\t\t\t\"attribute vec3 normal;\",\r\n\t\t\t\"attribute vec2 uv;\",\r\n\t\t\t\"attribute vec2 uv2;\",\r\n\r\n\t\t\t\"#ifdef USE_COLOR\",\r\n\r\n\t\t\t\t\"attribute vec3 color;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef USE_MORPHTARGETS\",\r\n\r\n\t\t\t\t\"attribute vec3 morphTarget0;\",\r\n\t\t\t\t\"attribute vec3 morphTarget1;\",\r\n\t\t\t\t\"attribute vec3 morphTarget2;\",\r\n\t\t\t\t\"attribute vec3 morphTarget3;\",\r\n\r\n\t\t\t\t\"#ifdef USE_MORPHNORMALS\",\r\n\r\n\t\t\t\t\t\"attribute vec3 morphNormal0;\",\r\n\t\t\t\t\t\"attribute vec3 morphNormal1;\",\r\n\t\t\t\t\t\"attribute vec3 morphNormal2;\",\r\n\t\t\t\t\t\"attribute vec3 morphNormal3;\",\r\n\r\n\t\t\t\t\"#else\",\r\n\r\n\t\t\t\t\t\"attribute vec3 morphTarget4;\",\r\n\t\t\t\t\t\"attribute vec3 morphTarget5;\",\r\n\t\t\t\t\t\"attribute vec3 morphTarget6;\",\r\n\t\t\t\t\t\"attribute vec3 morphTarget7;\",\r\n\r\n\t\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"#ifdef USE_SKINNING\",\r\n\r\n\t\t\t\t\"attribute vec4 skinIndex;\",\r\n\t\t\t\t\"attribute vec4 skinWeight;\",\r\n\r\n\t\t\t\"#endif\",\r\n\r\n\t\t\t\"\"\r\n\r\n\t\t].join(\"\\n\");\r\n\r\n\t\tvar prefix_fragment = [\r\n\r\n\t\t\t\"precision \" + _precision + \" float;\",\r\n\r\n\t\t\t( parameters.bumpMap || parameters.normalMap ) ? \"#extension GL_OES_standard_derivatives : enable\" : \"\",\r\n\r\n\t\t\tcustomDefines,\r\n\r\n\t\t\t\"#define MAX_DIR_LIGHTS \" + parameters.maxDirLights,\r\n\t\t\t\"#define MAX_POINT_LIGHTS \" + parameters.maxPointLights,\r\n\t\t\t\"#define MAX_SPOT_LIGHTS \" + parameters.maxSpotLights,\r\n\t\t\t\"#define MAX_HEMI_LIGHTS \" + parameters.maxHemiLights,\r\n\r\n\t\t\t\"#define MAX_SHADOWS \" + parameters.maxShadows,\r\n\r\n\t\t\tparameters.alphaTest ? \"#define ALPHATEST \" + parameters.alphaTest: \"\",\r\n\r\n\t\t\t_this.gammaInput ? \"#define GAMMA_INPUT\" : \"\",\r\n\t\t\t_this.gammaOutput ? \"#define GAMMA_OUTPUT\" : \"\",\r\n\t\t\t_this.physicallyBasedShading ? \"#define PHYSICALLY_BASED_SHADING\" : \"\",\r\n\r\n\t\t\t( parameters.useFog && parameters.fog ) ? \"#define USE_FOG\" : \"\",\r\n\t\t\t( parameters.useFog && parameters.fogExp ) ? \"#define FOG_EXP2\" : \"\",\r\n\r\n\t\t\tparameters.map ? \"#define USE_MAP\" : \"\",\r\n\t\t\tparameters.envMap ? \"#define USE_ENVMAP\" : \"\",\r\n\t\t\tparameters.lightMap ? \"#define USE_LIGHTMAP\" : \"\",\r\n\t\t\tparameters.bumpMap ? \"#define USE_BUMPMAP\" : \"\",\r\n\t\t\tparameters.normalMap ? \"#define USE_NORMALMAP\" : \"\",\r\n\t\t\tparameters.specularMap ? \"#define USE_SPECULARMAP\" : \"\",\r\n\t\t\tparameters.vertexColors ? \"#define USE_COLOR\" : \"\",\r\n\r\n\t\t\tparameters.metal ? \"#define METAL\" : \"\",\r\n\t\t\tparameters.perPixel ? \"#define PHONG_PER_PIXEL\" : \"\",\r\n\t\t\tparameters.wrapAround ? \"#define WRAP_AROUND\" : \"\",\r\n\t\t\tparameters.doubleSided ? \"#define DOUBLE_SIDED\" : \"\",\r\n\t\t\tparameters.flipSided ? \"#define FLIP_SIDED\" : \"\",\r\n\r\n\t\t\tparameters.shadowMapEnabled ? \"#define USE_SHADOWMAP\" : \"\",\r\n\t\t\tparameters.shadowMapEnabled ? \"#define \" + shadowMapTypeDefine : \"\",\r\n\t\t\tparameters.shadowMapDebug ? \"#define SHADOWMAP_DEBUG\" : \"\",\r\n\t\t\tparameters.shadowMapCascade ? \"#define SHADOWMAP_CASCADE\" : \"\",\r\n\r\n\t\t\t\"uniform mat4 viewMatrix;\",\r\n\t\t\t\"uniform vec3 cameraPosition;\",\r\n\t\t\t\"\"\r\n\r\n\t\t].join(\"\\n\");\r\n\r\n\t\tvar glVertexShader = getShader( \"vertex\", prefix_vertex + vertexShader );\r\n\t\tvar glFragmentShader = getShader( \"fragment\", prefix_fragment + fragmentShader );\r\n\r\n\t\t_gl.attachShader( program, glVertexShader );\r\n\t\t_gl.attachShader( program, glFragmentShader );\r\n\r\n\t\t_gl.linkProgram( program );\r\n\r\n\t\tif ( !_gl.getProgramParameter( program, _gl.LINK_STATUS ) ) {\r\n\r\n\t\t\tconsole.error( \"Could not initialise shader\\n\" + \"VALIDATE_STATUS: \" + _gl.getProgramParameter( program, _gl.VALIDATE_STATUS ) + \", gl error [\" + _gl.getError() + \"]\" );\r\n\r\n\t\t}\r\n\r\n\t\t// clean up\r\n\r\n\t\t_gl.deleteShader( glFragmentShader );\r\n\t\t_gl.deleteShader( glVertexShader );\r\n\r\n\t\t// console.log( prefix_fragment + fragmentShader );\r\n\t\t// console.log( prefix_vertex + vertexShader );\r\n\r\n\t\tprogram.uniforms = {};\r\n\t\tprogram.attributes = {};\r\n\r\n\t\tvar identifiers, u, a, i;\r\n\r\n\t\t// cache uniform locations\r\n\r\n\t\tidentifiers = [\r\n\r\n\t\t\t'viewMatrix', 'modelViewMatrix', 'projectionMatrix', 'normalMatrix', 'modelMatrix', 'cameraPosition',\r\n\t\t\t'morphTargetInfluences'\r\n\r\n\t\t];\r\n\r\n\t\tif ( parameters.useVertexTexture ) {\r\n\r\n\t\t\tidentifiers.push( 'boneTexture' );\r\n\r\n\t\t} else {\r\n\r\n\t\t\tidentifiers.push( 'boneGlobalMatrices' );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( u in uniforms ) {\r\n\r\n\t\t\tidentifiers.push( u );\r\n\r\n\t\t}\r\n\r\n\t\tcacheUniformLocations( program, identifiers );\r\n\r\n\t\t// cache attributes locations\r\n\r\n\t\tidentifiers = [\r\n\r\n\t\t\t\"position\", \"normal\", \"uv\", \"uv2\", \"tangent\", \"color\",\r\n\t\t\t\"skinIndex\", \"skinWeight\", \"lineDistance\"\r\n\r\n\t\t];\r\n\r\n\t\tfor ( i = 0; i < parameters.maxMorphTargets; i ++ ) {\r\n\r\n\t\t\tidentifiers.push( \"morphTarget\" + i );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 0; i < parameters.maxMorphNormals; i ++ ) {\r\n\r\n\t\t\tidentifiers.push( \"morphNormal\" + i );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( a in attributes ) {\r\n\r\n\t\t\tidentifiers.push( a );\r\n\r\n\t\t}\r\n\r\n\t\tcacheAttributeLocations( program, identifiers );\r\n\r\n\t\tprogram.id = _programs_counter ++;\r\n\r\n\t\t_programs.push( { program: program, code: code, usedTimes: 1 } );\r\n\r\n\t\t_this.info.memory.programs = _programs.length;\r\n\r\n\t\treturn program;\r\n\r\n\t};\r\n\r\n\t// Shader parameters cache\r\n\r\n\tfunction cacheUniformLocations ( program, identifiers ) {\r\n\r\n\t\tvar i, l, id;\r\n\r\n\t\tfor( i = 0, l = identifiers.length; i < l; i ++ ) {\r\n\r\n\t\t\tid = identifiers[ i ];\r\n\t\t\tprogram.uniforms[ id ] = _gl.getUniformLocation( program, id );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction cacheAttributeLocations ( program, identifiers ) {\r\n\r\n\t\tvar i, l, id;\r\n\r\n\t\tfor( i = 0, l = identifiers.length; i < l; i ++ ) {\r\n\r\n\t\t\tid = identifiers[ i ];\r\n\t\t\tprogram.attributes[ id ] = _gl.getAttribLocation( program, id );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction addLineNumbers ( string ) {\r\n\r\n\t\tvar chunks = string.split( \"\\n\" );\r\n\r\n\t\tfor ( var i = 0, il = chunks.length; i < il; i ++ ) {\r\n\r\n\t\t\t// Chrome reports shader errors on lines\r\n\t\t\t// starting counting from 1\r\n\r\n\t\t\tchunks[ i ] = ( i + 1 ) + \": \" + chunks[ i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn chunks.join( \"\\n\" );\r\n\r\n\t};\r\n\r\n\tfunction getShader ( type, string ) {\r\n\r\n\t\tvar shader;\r\n\r\n\t\tif ( type === \"fragment\" ) {\r\n\r\n\t\t\tshader = _gl.createShader( _gl.FRAGMENT_SHADER );\r\n\r\n\t\t} else if ( type === \"vertex\" ) {\r\n\r\n\t\t\tshader = _gl.createShader( _gl.VERTEX_SHADER );\r\n\r\n\t\t}\r\n\r\n\t\t_gl.shaderSource( shader, string );\r\n\t\t_gl.compileShader( shader );\r\n\r\n\t\tif ( !_gl.getShaderParameter( shader, _gl.COMPILE_STATUS ) ) {\r\n\r\n\t\t\tconsole.error( _gl.getShaderInfoLog( shader ) );\r\n\t\t\tconsole.error( addLineNumbers( string ) );\r\n\t\t\treturn null;\r\n\r\n\t\t}\r\n\r\n\t\treturn shader;\r\n\r\n\t};\r\n\r\n\t// Textures\r\n\r\n\r\n\tfunction isPowerOfTwo ( value ) {\r\n\r\n\t\treturn ( value & ( value - 1 ) ) === 0;\r\n\r\n\t};\r\n\r\n\tfunction setTextureParameters ( textureType, texture, isImagePowerOfTwo ) {\r\n\r\n\t\tif ( isImagePowerOfTwo ) {\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, paramThreeToGL( texture.wrapS ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) );\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( texture.minFilter ) );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\r\n\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\r\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\r\n\r\n\t\t}\r\n\r\n\t\tif ( _glExtensionTextureFilterAnisotropic && texture.type !== THREE.FloatType ) {\r\n\r\n\t\t\tif ( texture.anisotropy > 1 || texture.__oldAnisotropy ) {\r\n\r\n\t\t\t\t_gl.texParameterf( textureType, _glExtensionTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, _maxAnisotropy ) );\r\n\t\t\t\ttexture.__oldAnisotropy = texture.anisotropy;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setTexture = function ( texture, slot ) {\r\n\r\n\t\tif ( texture.needsUpdate ) {\r\n\r\n\t\t\tif ( ! texture.__webglInit ) {\r\n\r\n\t\t\t\ttexture.__webglInit = true;\r\n\r\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\r\n\r\n\t\t\t\ttexture.__webglTexture = _gl.createTexture();\r\n\r\n\t\t\t\t_this.info.memory.textures ++;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );\r\n\r\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\r\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\r\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\r\n\r\n\t\t\tvar image = texture.image,\r\n\t\t\tisImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ),\r\n\t\t\tglFormat = paramThreeToGL( texture.format ),\r\n\t\t\tglType = paramThreeToGL( texture.type );\r\n\r\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );\r\n\r\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\r\n\r\n\t\t\tif ( texture instanceof THREE.DataTexture ) {\r\n\r\n\t\t\t\t// use manually created mipmaps if available\r\n\t\t\t\t// if there are no manual mipmaps\r\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\r\n\r\n\t\t\t\tif ( mipmaps.length > 0 && isImagePowerOfTwo ) {\r\n\r\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\r\n\t\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttexture.generateMipmaps = false;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( texture instanceof THREE.CompressedTexture ) {\r\n\r\n\t\t\t\t// compressed textures can only use manually created mipmaps\r\n\t\t\t\t// WebGL can't generate mipmaps for DDS textures\r\n\r\n\t\t\t\tfor( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tmipmap = mipmaps[ i ];\r\n\t\t\t\t\t_gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else { // regular Texture (image, video, canvas)\r\n\r\n\t\t\t\t// use manually created mipmaps if available\r\n\t\t\t\t// if there are no manual mipmaps\r\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\r\n\r\n\t\t\t\tif ( mipmaps.length > 0 && isImagePowerOfTwo ) {\r\n\r\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\r\n\t\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttexture.generateMipmaps = false;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\r\n\r\n\t\t\ttexture.needsUpdate = false;\r\n\r\n\t\t\tif ( texture.onUpdate ) texture.onUpdate();\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction clampToMaxSize ( image, maxSize ) {\r\n\r\n\t\tif ( image.width <= maxSize && image.height <= maxSize ) {\r\n\r\n\t\t\treturn image;\r\n\r\n\t\t}\r\n\r\n\t\t// Warning: Scaling through the canvas will only work with images that use\r\n\t\t// premultiplied alpha.\r\n\r\n\t\tvar maxDimension = Math.max( image.width, image.height );\r\n\t\tvar newWidth = Math.floor( image.width * maxSize / maxDimension );\r\n\t\tvar newHeight = Math.floor( image.height * maxSize / maxDimension );\r\n\r\n\t\tvar canvas = document.createElement( 'canvas' );\r\n\t\tcanvas.width = newWidth;\r\n\t\tcanvas.height = newHeight;\r\n\r\n\t\tvar ctx = canvas.getContext( \"2d\" );\r\n\t\tctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, newWidth, newHeight );\r\n\r\n\t\treturn canvas;\r\n\r\n\t}\r\n\r\n\tfunction setCubeTexture ( texture, slot ) {\r\n\r\n\t\tif ( texture.image.length === 6 ) {\r\n\r\n\t\t\tif ( texture.needsUpdate ) {\r\n\r\n\t\t\t\tif ( ! texture.image.__webglTextureCube ) {\r\n\r\n\t\t\t\t\ttexture.image.__webglTextureCube = _gl.createTexture();\r\n\r\n\t\t\t\t\t_this.info.memory.textures ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );\r\n\r\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\r\n\r\n\t\t\t\tvar isCompressed = texture instanceof THREE.CompressedTexture;\r\n\r\n\t\t\t\tvar cubeImage = [];\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\tif ( _this.autoScaleCubemaps && ! isCompressed ) {\r\n\r\n\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], _maxCubemapSize );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tcubeImage[ i ] = texture.image[ i ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar image = cubeImage[ 0 ],\r\n\t\t\t\tisImagePowerOfTwo = isPowerOfTwo( image.width ) && isPowerOfTwo( image.height ),\r\n\t\t\t\tglFormat = paramThreeToGL( texture.format ),\r\n\t\t\t\tglType = paramThreeToGL( texture.type );\r\n\r\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isImagePowerOfTwo );\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\tif ( isCompressed ) {\r\n\r\n\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\r\n\r\n\t\t\t\t\t\tfor( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\r\n\t\t\t\t\t\t\t_gl.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( texture.generateMipmaps && isImagePowerOfTwo ) {\r\n\r\n\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttexture.needsUpdate = false;\r\n\r\n\t\t\t\tif ( texture.onUpdate ) texture.onUpdate();\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.image.__webglTextureCube );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setCubeTextureDynamic ( texture, slot ) {\r\n\r\n\t\t_gl.activeTexture( _gl.TEXTURE0 + slot );\r\n\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, texture.__webglTexture );\r\n\r\n\t};\r\n\r\n\t// Render targets\r\n\r\n\tfunction setupFrameBuffer ( framebuffer, renderTarget, textureTarget ) {\r\n\r\n\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, textureTarget, renderTarget.__webglTexture, 0 );\r\n\r\n\t};\r\n\r\n\tfunction setupRenderBuffer ( renderbuffer, renderTarget ) {\r\n\r\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\r\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\t/* For some reason this is not working. Defaulting to RGBA4.\r\n\t\t} else if( ! renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.STENCIL_INDEX8, renderTarget.width, renderTarget.height );\r\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\r\n\t\t*/\r\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\r\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tthis.setRenderTarget = function ( renderTarget ) {\r\n\r\n\t\tvar isCube = ( renderTarget instanceof THREE.WebGLRenderTargetCube );\r\n\r\n\t\tif ( renderTarget && ! renderTarget.__webglFramebuffer ) {\r\n\r\n\t\t\tif ( renderTarget.depthBuffer === undefined ) renderTarget.depthBuffer = true;\r\n\t\t\tif ( renderTarget.stencilBuffer === undefined ) renderTarget.stencilBuffer = true;\r\n\r\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\r\n\r\n\t\t\trenderTarget.__webglTexture = _gl.createTexture();\r\n\r\n\t\t\t_this.info.memory.textures ++;\r\n\r\n\t\t\t// Setup texture, create render and frame buffers\r\n\r\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget.width ) && isPowerOfTwo( renderTarget.height ),\r\n\t\t\t\tglFormat = paramThreeToGL( renderTarget.format ),\r\n\t\t\t\tglType = paramThreeToGL( renderTarget.type );\r\n\r\n\t\t\tif ( isCube ) {\r\n\r\n\t\t\t\trenderTarget.__webglFramebuffer = [];\r\n\t\t\t\trenderTarget.__webglRenderbuffer = [];\r\n\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );\r\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget, isTargetPowerOfTwo );\r\n\r\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\r\n\r\n\t\t\t\t\trenderTarget.__webglFramebuffer[ i ] = _gl.createFramebuffer();\r\n\t\t\t\t\trenderTarget.__webglRenderbuffer[ i ] = _gl.createRenderbuffer();\r\n\r\n\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\r\n\r\n\t\t\t\t\tsetupFrameBuffer( renderTarget.__webglFramebuffer[ i ], renderTarget, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\r\n\t\t\t\t\tsetupRenderBuffer( renderTarget.__webglRenderbuffer[ i ], renderTarget );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\trenderTarget.__webglFramebuffer = _gl.createFramebuffer();\r\n\r\n\t\t\t\tif ( renderTarget.shareDepthFrom ) {\r\n\r\n\t\t\t\t\trenderTarget.__webglRenderbuffer = renderTarget.shareDepthFrom.__webglRenderbuffer;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\trenderTarget.__webglRenderbuffer = _gl.createRenderbuffer();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );\r\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget, isTargetPowerOfTwo );\r\n\r\n\t\t\t\t_gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\r\n\r\n\t\t\t\tsetupFrameBuffer( renderTarget.__webglFramebuffer, renderTarget, _gl.TEXTURE_2D );\r\n\r\n\t\t\t\tif ( renderTarget.shareDepthFrom ) {\r\n\r\n\t\t\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer );\r\n\r\n\t\t\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\r\n\r\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderTarget.__webglRenderbuffer );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tsetupRenderBuffer( renderTarget.__webglRenderbuffer, renderTarget );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Release everything\r\n\r\n\t\t\tif ( isCube ) {\r\n\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, null );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\r\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\r\n\r\n\t\t}\r\n\r\n\t\tvar framebuffer, width, height, vx, vy;\r\n\r\n\t\tif ( renderTarget ) {\r\n\r\n\t\t\tif ( isCube ) {\r\n\r\n\t\t\t\tframebuffer = renderTarget.__webglFramebuffer[ renderTarget.activeCubeFace ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tframebuffer = renderTarget.__webglFramebuffer;\r\n\r\n\t\t\t}\r\n\r\n\t\t\twidth = renderTarget.width;\r\n\t\t\theight = renderTarget.height;\r\n\r\n\t\t\tvx = 0;\r\n\t\t\tvy = 0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tframebuffer = null;\r\n\r\n\t\t\twidth = _viewportWidth;\r\n\t\t\theight = _viewportHeight;\r\n\r\n\t\t\tvx = _viewportX;\r\n\t\t\tvy = _viewportY;\r\n\r\n\t\t}\r\n\r\n\t\tif ( framebuffer !== _currentFramebuffer ) {\r\n\r\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\r\n\t\t\t_gl.viewport( vx, vy, width, height );\r\n\r\n\t\t\t_currentFramebuffer = framebuffer;\r\n\r\n\t\t}\r\n\r\n\t\t_currentWidth = width;\r\n\t\t_currentHeight = height;\r\n\r\n\t};\r\n\r\n\tfunction updateRenderTargetMipmap ( renderTarget ) {\r\n\r\n\t\tif ( renderTarget instanceof THREE.WebGLRenderTargetCube ) {\r\n\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, renderTarget.__webglTexture );\r\n\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, renderTarget.__webglTexture );\r\n\t\t\t_gl.generateMipmap( _gl.TEXTURE_2D );\r\n\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, null );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\t// Fallback filters for non-power-of-2 textures\r\n\r\n\tfunction filterFallback ( f ) {\r\n\r\n\t\tif ( f === THREE.NearestFilter || f === THREE.NearestMipMapNearestFilter || f === THREE.NearestMipMapLinearFilter ) {\r\n\r\n\t\t\treturn _gl.NEAREST;\r\n\r\n\t\t}\r\n\r\n\t\treturn _gl.LINEAR;\r\n\r\n\t};\r\n\r\n\t// Map three.js constants to WebGL constants\r\n\r\n\tfunction paramThreeToGL ( p ) {\r\n\r\n\t\tif ( p === THREE.RepeatWrapping ) return _gl.REPEAT;\r\n\t\tif ( p === THREE.ClampToEdgeWrapping ) return _gl.CLAMP_TO_EDGE;\r\n\t\tif ( p === THREE.MirroredRepeatWrapping ) return _gl.MIRRORED_REPEAT;\r\n\r\n\t\tif ( p === THREE.NearestFilter ) return _gl.NEAREST;\r\n\t\tif ( p === THREE.NearestMipMapNearestFilter ) return _gl.NEAREST_MIPMAP_NEAREST;\r\n\t\tif ( p === THREE.NearestMipMapLinearFilter ) return _gl.NEAREST_MIPMAP_LINEAR;\r\n\r\n\t\tif ( p === THREE.LinearFilter ) return _gl.LINEAR;\r\n\t\tif ( p === THREE.LinearMipMapNearestFilter ) return _gl.LINEAR_MIPMAP_NEAREST;\r\n\t\tif ( p === THREE.LinearMipMapLinearFilter ) return _gl.LINEAR_MIPMAP_LINEAR;\r\n\r\n\t\tif ( p === THREE.UnsignedByteType ) return _gl.UNSIGNED_BYTE;\r\n\t\tif ( p === THREE.UnsignedShort4444Type ) return _gl.UNSIGNED_SHORT_4_4_4_4;\r\n\t\tif ( p === THREE.UnsignedShort5551Type ) return _gl.UNSIGNED_SHORT_5_5_5_1;\r\n\t\tif ( p === THREE.UnsignedShort565Type ) return _gl.UNSIGNED_SHORT_5_6_5;\r\n\r\n\t\tif ( p === THREE.ByteType ) return _gl.BYTE;\r\n\t\tif ( p === THREE.ShortType ) return _gl.SHORT;\r\n\t\tif ( p === THREE.UnsignedShortType ) return _gl.UNSIGNED_SHORT;\r\n\t\tif ( p === THREE.IntType ) return _gl.INT;\r\n\t\tif ( p === THREE.UnsignedIntType ) return _gl.UNSIGNED_INT;\r\n\t\tif ( p === THREE.FloatType ) return _gl.FLOAT;\r\n\r\n\t\tif ( p === THREE.AlphaFormat ) return _gl.ALPHA;\r\n\t\tif ( p === THREE.RGBFormat ) return _gl.RGB;\r\n\t\tif ( p === THREE.RGBAFormat ) return _gl.RGBA;\r\n\t\tif ( p === THREE.LuminanceFormat ) return _gl.LUMINANCE;\r\n\t\tif ( p === THREE.LuminanceAlphaFormat ) return _gl.LUMINANCE_ALPHA;\r\n\r\n\t\tif ( p === THREE.AddEquation ) return _gl.FUNC_ADD;\r\n\t\tif ( p === THREE.SubtractEquation ) return _gl.FUNC_SUBTRACT;\r\n\t\tif ( p === THREE.ReverseSubtractEquation ) return _gl.FUNC_REVERSE_SUBTRACT;\r\n\r\n\t\tif ( p === THREE.ZeroFactor ) return _gl.ZERO;\r\n\t\tif ( p === THREE.OneFactor ) return _gl.ONE;\r\n\t\tif ( p === THREE.SrcColorFactor ) return _gl.SRC_COLOR;\r\n\t\tif ( p === THREE.OneMinusSrcColorFactor ) return _gl.ONE_MINUS_SRC_COLOR;\r\n\t\tif ( p === THREE.SrcAlphaFactor ) return _gl.SRC_ALPHA;\r\n\t\tif ( p === THREE.OneMinusSrcAlphaFactor ) return _gl.ONE_MINUS_SRC_ALPHA;\r\n\t\tif ( p === THREE.DstAlphaFactor ) return _gl.DST_ALPHA;\r\n\t\tif ( p === THREE.OneMinusDstAlphaFactor ) return _gl.ONE_MINUS_DST_ALPHA;\r\n\r\n\t\tif ( p === THREE.DstColorFactor ) return _gl.DST_COLOR;\r\n\t\tif ( p === THREE.OneMinusDstColorFactor ) return _gl.ONE_MINUS_DST_COLOR;\r\n\t\tif ( p === THREE.SrcAlphaSaturateFactor ) return _gl.SRC_ALPHA_SATURATE;\r\n\r\n\t\tif ( _glExtensionCompressedTextureS3TC !== undefined ) {\r\n\r\n\t\t\tif ( p === THREE.RGB_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT1_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT3_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT;\r\n\t\t\tif ( p === THREE.RGBA_S3TC_DXT5_Format ) return _glExtensionCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT;\r\n\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\r\n\t};\r\n\r\n\t// Allocations\r\n\r\n\tfunction allocateBones ( object ) {\r\n\r\n\t\tif ( _supportsBoneTextures && object && object.useVertexTexture ) {\r\n\r\n\t\t\treturn 1024;\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// default for when object is not specified\r\n\t\t\t// ( for example when prebuilding shader\r\n\t\t\t// to be used with multiple objects )\r\n\t\t\t//\r\n\t\t\t// \t- leave some extra space for other uniforms\r\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\r\n\t\t\t// (up to 54 should be safe)\r\n\r\n\t\t\tvar nVertexUniforms = _gl.getParameter( _gl.MAX_VERTEX_UNIFORM_VECTORS );\r\n\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\r\n\r\n\t\t\tvar maxBones = nVertexMatrices;\r\n\r\n\t\t\tif ( object !== undefined && object instanceof THREE.SkinnedMesh ) {\r\n\r\n\t\t\t\tmaxBones = Math.min( object.bones.length, maxBones );\r\n\r\n\t\t\t\tif ( maxBones < object.bones.length ) {\r\n\r\n\t\t\t\t\tconsole.warn( \"WebGLRenderer: too many bones - \" + object.bones.length + \", this GPU supports just \" + maxBones + \" (try OpenGL instead of ANGLE)\" );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\treturn maxBones;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction allocateLights ( lights ) {\r\n\r\n\t\tvar l, ll, light, dirLights, pointLights, spotLights, hemiLights;\r\n\r\n\t\tdirLights = pointLights = spotLights = hemiLights = 0;\r\n\r\n\t\tfor ( l = 0, ll = lights.length; l < ll; l ++ ) {\r\n\r\n\t\t\tlight = lights[ l ];\r\n\r\n\t\t\tif ( light.onlyShadow ) continue;\r\n\r\n\t\t\tif ( light instanceof THREE.DirectionalLight ) dirLights ++;\r\n\t\t\tif ( light instanceof THREE.PointLight ) pointLights ++;\r\n\t\t\tif ( light instanceof THREE.SpotLight ) spotLights ++;\r\n\t\t\tif ( light instanceof THREE.HemisphereLight ) hemiLights ++;\r\n\r\n\t\t}\r\n\r\n\t\treturn { 'directional' : dirLights, 'point' : pointLights, 'spot': spotLights, 'hemi': hemiLights };\r\n\r\n\t};\r\n\r\n\tfunction allocateShadows ( lights ) {\r\n\r\n\t\tvar l, ll, light, maxShadows = 0;\r\n\r\n\t\tfor ( l = 0, ll = lights.length; l < ll; l++ ) {\r\n\r\n\t\t\tlight = lights[ l ];\r\n\r\n\t\t\tif ( ! light.castShadow ) continue;\r\n\r\n\t\t\tif ( light instanceof THREE.SpotLight ) maxShadows ++;\r\n\t\t\tif ( light instanceof THREE.DirectionalLight && ! light.shadowCascade ) maxShadows ++;\r\n\r\n\t\t}\r\n\r\n\t\treturn maxShadows;\r\n\r\n\t};\r\n\r\n\t// Initialization\r\n\r\n\tfunction initGL () {\r\n\r\n\t\ttry {\r\n\r\n\t\t\tif ( ! ( _gl = _canvas.getContext( 'experimental-webgl', { alpha: _alpha, premultipliedAlpha: _premultipliedAlpha, antialias: _antialias, stencil: _stencil, preserveDrawingBuffer: _preserveDrawingBuffer } ) ) ) {\r\n\r\n\t\t\t\tthrow 'Error creating WebGL context.';\r\n\r\n\t\t\t}\r\n\r\n\t\t} catch ( error ) {\r\n\r\n\t\t\tconsole.error( error );\r\n\r\n\t\t}\r\n\r\n\t\t_glExtensionTextureFloat = _gl.getExtension( 'OES_texture_float' );\r\n\t\t_glExtensionStandardDerivatives = _gl.getExtension( 'OES_standard_derivatives' );\r\n\r\n\t\t_glExtensionTextureFilterAnisotropic = _gl.getExtension( 'EXT_texture_filter_anisotropic' ) ||\r\n\t\t\t\t\t\t\t\t\t\t\t _gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) ||\r\n\t\t\t\t\t\t\t\t\t\t\t _gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\r\n\r\n\r\n\t\t_glExtensionCompressedTextureS3TC = _gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) ||\r\n\t\t\t\t\t\t\t\t\t\t\t_gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) ||\r\n\t\t\t\t\t\t\t\t\t\t\t_gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\r\n\r\n\t\tif ( ! _glExtensionTextureFloat ) {\r\n\r\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Float textures not supported.' );\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! _glExtensionStandardDerivatives ) {\r\n\r\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Standard derivatives not supported.' );\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! _glExtensionTextureFilterAnisotropic ) {\r\n\r\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Anisotropic texture filtering not supported.' );\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! _glExtensionCompressedTextureS3TC ) {\r\n\r\n\t\t\tconsole.log( 'THREE.WebGLRenderer: S3TC compressed textures not supported.' );\r\n\r\n\t\t}\r\n\r\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\r\n\r\n\t\t\t_gl.getShaderPrecisionFormat = function() {\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\t\"rangeMin\" : 1,\r\n\t\t\t\t\t\"rangeMax\" : 1,\r\n\t\t\t\t\t\"precision\" : 1\r\n\t\t\t\t};\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction setDefaultGLState () {\r\n\r\n\t\t_gl.clearColor( 0, 0, 0, 1 );\r\n\t\t_gl.clearDepth( 1 );\r\n\t\t_gl.clearStencil( 0 );\r\n\r\n\t\t_gl.enable( _gl.DEPTH_TEST );\r\n\t\t_gl.depthFunc( _gl.LEQUAL );\r\n\r\n\t\t_gl.frontFace( _gl.CCW );\r\n\t\t_gl.cullFace( _gl.BACK );\r\n\t\t_gl.enable( _gl.CULL_FACE );\r\n\r\n\t\t_gl.enable( _gl.BLEND );\r\n\t\t_gl.blendEquation( _gl.FUNC_ADD );\r\n\t\t_gl.blendFunc( _gl.SRC_ALPHA, _gl.ONE_MINUS_SRC_ALPHA );\r\n\r\n\t\t_gl.clearColor( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha );\r\n\r\n\t};\r\n\r\n\t// default plugins (order is important)\r\n\r\n\tthis.shadowMapPlugin = new THREE.ShadowMapPlugin();\r\n\tthis.addPrePlugin( this.shadowMapPlugin );\r\n\r\n\tthis.addPostPlugin( new THREE.SpritePlugin() );\r\n\tthis.addPostPlugin( new THREE.LensFlarePlugin() );\r\n\r\n};\r\n/**\r\n * @author szimek / https://github.com/szimek/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.WebGLRenderTarget = function ( width, height, options ) {\r\n\r\n\tthis.width = width;\r\n\tthis.height = height;\r\n\r\n\toptions = options || {};\r\n\r\n\tthis.wrapS = options.wrapS !== undefined ? options.wrapS : THREE.ClampToEdgeWrapping;\r\n\tthis.wrapT = options.wrapT !== undefined ? options.wrapT : THREE.ClampToEdgeWrapping;\r\n\r\n\tthis.magFilter = options.magFilter !== undefined ? options.magFilter : THREE.LinearFilter;\r\n\tthis.minFilter = options.minFilter !== undefined ? options.minFilter : THREE.LinearMipMapLinearFilter;\r\n\r\n\tthis.anisotropy = options.anisotropy !== undefined ? options.anisotropy : 1;\r\n\r\n\tthis.offset = new THREE.Vector2( 0, 0 );\r\n\tthis.repeat = new THREE.Vector2( 1, 1 );\r\n\r\n\tthis.format = options.format !== undefined ? options.format : THREE.RGBAFormat;\r\n\tthis.type = options.type !== undefined ? options.type : THREE.UnsignedByteType;\r\n\r\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\r\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\r\n\r\n\tthis.generateMipmaps = true;\r\n\r\n\tthis.shareDepthFrom = null;\r\n\r\n};\r\n\r\nTHREE.WebGLRenderTarget.prototype = {\r\n\r\n\tconstructor: THREE.WebGLRenderTarget,\r\n\r\n\taddEventListener: THREE.EventDispatcher.prototype.addEventListener,\r\n\thasEventListener: THREE.EventDispatcher.prototype.hasEventListener,\r\n\tremoveEventListener: THREE.EventDispatcher.prototype.removeEventListener,\r\n\tdispatchEvent: THREE.EventDispatcher.prototype.dispatchEvent,\r\n\r\n\tclone: function () {\r\n\r\n\t\tvar tmp = new THREE.WebGLRenderTarget( this.width, this.height );\r\n\r\n\t\ttmp.wrapS = this.wrapS;\r\n\t\ttmp.wrapT = this.wrapT;\r\n\r\n\t\ttmp.magFilter = this.magFilter;\r\n\t\ttmp.minFilter = this.minFilter;\r\n\r\n\t\ttmp.anisotropy = this.anisotropy;\r\n\r\n\t\ttmp.offset.copy( this.offset );\r\n\t\ttmp.repeat.copy( this.repeat );\r\n\r\n\t\ttmp.format = this.format;\r\n\t\ttmp.type = this.type;\r\n\r\n\t\ttmp.depthBuffer = this.depthBuffer;\r\n\t\ttmp.stencilBuffer = this.stencilBuffer;\r\n\r\n\t\ttmp.generateMipmaps = this.generateMipmaps;\r\n\r\n\t\ttmp.shareDepthFrom = this.shareDepthFrom;\r\n\r\n\t\treturn tmp;\r\n\r\n\t},\r\n\r\n\tdispose: function () {\r\n\r\n\t\tthis.dispatchEvent( { type: 'dispose' } );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com\r\n */\r\n\r\nTHREE.WebGLRenderTargetCube = function ( width, height, options ) {\r\n\r\n\tTHREE.WebGLRenderTarget.call( this, width, height, options );\r\n\r\n\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\r\n\r\n};\r\n\r\nTHREE.WebGLRenderTargetCube.prototype = Object.create( THREE.WebGLRenderTarget.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableVertex = function () {\r\n\r\n\tthis.positionWorld = new THREE.Vector3();\r\n\tthis.positionScreen = new THREE.Vector4();\r\n\r\n\tthis.visible = true;\r\n\r\n};\r\n\r\nTHREE.RenderableVertex.prototype.copy = function ( vertex ) {\r\n\r\n\tthis.positionWorld.copy( vertex.positionWorld );\r\n\tthis.positionScreen.copy( vertex.positionScreen );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableFace3 = function () {\r\n\r\n\tthis.v1 = new THREE.RenderableVertex();\r\n\tthis.v2 = new THREE.RenderableVertex();\r\n\tthis.v3 = new THREE.RenderableVertex();\r\n\r\n\tthis.centroidModel = new THREE.Vector3();\r\n\r\n\tthis.normalModel = new THREE.Vector3();\r\n\tthis.normalModelView = new THREE.Vector3();\r\n\r\n\tthis.vertexNormalsLength = 0;\r\n\tthis.vertexNormalsModel = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\tthis.vertexNormalsModelView = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\r\n\tthis.color = null;\r\n\tthis.material = null;\r\n\tthis.uvs = [[]];\r\n\r\n\tthis.z = null;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableFace4 = function () {\r\n\r\n\tthis.v1 = new THREE.RenderableVertex();\r\n\tthis.v2 = new THREE.RenderableVertex();\r\n\tthis.v3 = new THREE.RenderableVertex();\r\n\tthis.v4 = new THREE.RenderableVertex();\r\n\r\n\tthis.centroidModel = new THREE.Vector3();\r\n\r\n\tthis.normalModel = new THREE.Vector3();\r\n\tthis.normalModelView = new THREE.Vector3();\r\n\r\n\tthis.vertexNormalsLength = 0;\r\n\tthis.vertexNormalsModel = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\tthis.vertexNormalsModelView = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\r\n\r\n\tthis.color = null;\r\n\tthis.material = null;\r\n\tthis.uvs = [[]];\r\n\r\n\tthis.z = null;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableObject = function () {\r\n\r\n\tthis.object = null;\r\n\tthis.z = null;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableParticle = function () {\r\n\r\n\tthis.object = null;\r\n\r\n\tthis.x = null;\r\n\tthis.y = null;\r\n\tthis.z = null;\r\n\r\n\tthis.rotation = null;\r\n\tthis.scale = new THREE.Vector2();\r\n\r\n\tthis.material = null;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.RenderableLine = function () {\r\n\r\n\tthis.z = null;\r\n\r\n\tthis.v1 = new THREE.RenderableVertex();\r\n\tthis.v2 = new THREE.RenderableVertex();\r\n\r\n\tthis.vertexColors = [ new THREE.Color(), new THREE.Color() ];\r\n\tthis.material = null;\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.GeometryUtils = {\r\n\r\n\t// Merge two geometries or geometry and geometry from object (using object's transform)\r\n\r\n\tmerge: function ( geometry1, object2 /* mesh | geometry */, materialIndexOffset ) {\r\n\r\n\t\tvar matrix, normalMatrix,\r\n\t\tvertexOffset = geometry1.vertices.length,\r\n\t\tuvPosition = geometry1.faceVertexUvs[ 0 ].length,\r\n\t\tgeometry2 = object2 instanceof THREE.Mesh ? object2.geometry : object2,\r\n\t\tvertices1 = geometry1.vertices,\r\n\t\tvertices2 = geometry2.vertices,\r\n\t\tfaces1 = geometry1.faces,\r\n\t\tfaces2 = geometry2.faces,\r\n\t\tuvs1 = geometry1.faceVertexUvs[ 0 ],\r\n\t\tuvs2 = geometry2.faceVertexUvs[ 0 ];\r\n\r\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\r\n\r\n\t\tif ( object2 instanceof THREE.Mesh ) {\r\n\r\n\t\t\tobject2.matrixAutoUpdate && object2.updateMatrix();\r\n\r\n\t\t\tmatrix = object2.matrix;\r\n\r\n\t\t\tnormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\r\n\r\n\t\t}\r\n\r\n\t\t// vertices\r\n\r\n\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar vertex = vertices2[ i ];\r\n\r\n\t\t\tvar vertexCopy = vertex.clone();\r\n\r\n\t\t\tif ( matrix ) vertexCopy.applyMatrix4( matrix );\r\n\r\n\t\t\tvertices1.push( vertexCopy );\r\n\r\n\t\t}\r\n\r\n\t\t// faces\r\n\r\n\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\r\n\t\t\tfaceVertexNormals = face.vertexNormals,\r\n\t\t\tfaceVertexColors = face.vertexColors;\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tfaceCopy = new THREE.Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tfaceCopy = new THREE.Face4( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset, face.d + vertexOffset );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaceCopy.normal.copy( face.normal );\r\n\r\n\t\t\tif ( normalMatrix ) {\r\n\r\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\r\n\r\n\t\t\t\tif ( normalMatrix ) {\r\n\r\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaceCopy.color.copy( face.color );\r\n\r\n\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tcolor = faceVertexColors[ j ];\r\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\r\n\r\n\t\t\tfaceCopy.centroid.copy( face.centroid );\r\n\r\n\t\t\tif ( matrix ) {\r\n\r\n\t\t\t\tfaceCopy.centroid.applyMatrix4( matrix );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfaces1.push( faceCopy );\r\n\r\n\t\t}\r\n\r\n\t\t// uvs\r\n\r\n\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar uv = uvs2[ i ], uvCopy = [];\r\n\r\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\tuvCopy.push( new THREE.Vector2( uv[ j ].x, uv[ j ].y ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tuvs1.push( uvCopy );\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\tremoveMaterials: function ( geometry, materialIndexArray ) {\r\n\r\n\t\tvar materialIndexMap = {};\r\n\r\n\t\tfor ( var i = 0, il = materialIndexArray.length; i < il; i ++ ) {\r\n\r\n\t\t\tmaterialIndexMap[ materialIndexArray[i] ] = true;\r\n\r\n\t\t}\r\n\r\n\t\tvar face, newFaces = [];\r\n\r\n\t\tfor ( var i = 0, il = geometry.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = geometry.faces[ i ];\r\n\t\t\tif ( ! ( face.materialIndex in materialIndexMap ) ) newFaces.push( face );\r\n\r\n\t\t}\r\n\r\n\t\tgeometry.faces = newFaces;\r\n\r\n\t},\r\n\r\n\t// Get random point in triangle (via barycentric coordinates)\r\n\t// \t(uniform distribution)\r\n\t// \thttp://www.cgafaq.info/wiki/Random_Point_In_Triangle\r\n\r\n\trandomPointInTriangle: function ( vectorA, vectorB, vectorC ) {\r\n\r\n\t\tvar a, b, c,\r\n\t\t\tpoint = new THREE.Vector3(),\r\n\t\t\ttmp = THREE.GeometryUtils.__v1;\r\n\r\n\t\ta = THREE.GeometryUtils.random();\r\n\t\tb = THREE.GeometryUtils.random();\r\n\r\n\t\tif ( ( a + b ) > 1 ) {\r\n\r\n\t\t\ta = 1 - a;\r\n\t\t\tb = 1 - b;\r\n\r\n\t\t}\r\n\r\n\t\tc = 1 - a - b;\r\n\r\n\t\tpoint.copy( vectorA );\r\n\t\tpoint.multiplyScalar( a );\r\n\r\n\t\ttmp.copy( vectorB );\r\n\t\ttmp.multiplyScalar( b );\r\n\r\n\t\tpoint.add( tmp );\r\n\r\n\t\ttmp.copy( vectorC );\r\n\t\ttmp.multiplyScalar( c );\r\n\r\n\t\tpoint.add( tmp );\r\n\r\n\t\treturn point;\r\n\r\n\t},\r\n\r\n\t// Get random point in face (triangle / quad)\r\n\t// (uniform distribution)\r\n\r\n\trandomPointInFace: function ( face, geometry, useCachedAreas ) {\r\n\r\n\t\tvar vA, vB, vC, vD;\r\n\r\n\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\tvA = geometry.vertices[ face.a ];\r\n\t\t\tvB = geometry.vertices[ face.b ];\r\n\t\t\tvC = geometry.vertices[ face.c ];\r\n\r\n\t\t\treturn THREE.GeometryUtils.randomPointInTriangle( vA, vB, vC );\r\n\r\n\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\tvA = geometry.vertices[ face.a ];\r\n\t\t\tvB = geometry.vertices[ face.b ];\r\n\t\t\tvC = geometry.vertices[ face.c ];\r\n\t\t\tvD = geometry.vertices[ face.d ];\r\n\r\n\t\t\tvar area1, area2;\r\n\r\n\t\t\tif ( useCachedAreas ) {\r\n\r\n\t\t\t\tif ( face._area1 && face._area2 ) {\r\n\r\n\t\t\t\t\tarea1 = face._area1;\r\n\t\t\t\t\tarea2 = face._area2;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tarea1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );\r\n\t\t\t\t\tarea2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );\r\n\r\n\t\t\t\t\tface._area1 = area1;\r\n\t\t\t\t\tface._area2 = area2;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tarea1 = THREE.GeometryUtils.triangleArea( vA, vB, vD ),\r\n\t\t\t\tarea2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar r = THREE.GeometryUtils.random() * ( area1 + area2 );\r\n\r\n\t\t\tif ( r < area1 ) {\r\n\r\n\t\t\t\treturn THREE.GeometryUtils.randomPointInTriangle( vA, vB, vD );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\treturn THREE.GeometryUtils.randomPointInTriangle( vB, vC, vD );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t// Get uniformly distributed random points in mesh\r\n\t// \t- create array with cumulative sums of face areas\r\n\t// - pick random number from 0 to total area\r\n\t// - find corresponding place in area array by binary search\r\n\t//\t- get random point in face\r\n\r\n\trandomPointsInGeometry: function ( geometry, n ) {\r\n\r\n\t\tvar face, i,\r\n\t\t\tfaces = geometry.faces,\r\n\t\t\tvertices = geometry.vertices,\r\n\t\t\til = faces.length,\r\n\t\t\ttotalArea = 0,\r\n\t\t\tcumulativeAreas = [],\r\n\t\t\tvA, vB, vC, vD;\r\n\r\n\t\t// precompute face areas\r\n\r\n\t\tfor ( i = 0; i < il; i ++ ) {\r\n\r\n\t\t\tface = faces[ i ];\r\n\r\n\t\t\tif ( face instanceof THREE.Face3 ) {\r\n\r\n\t\t\t\tvA = vertices[ face.a ];\r\n\t\t\t\tvB = vertices[ face.b ];\r\n\t\t\t\tvC = vertices[ face.c ];\r\n\r\n\t\t\t\tface._area = THREE.GeometryUtils.triangleArea( vA, vB, vC );\r\n\r\n\t\t\t} else if ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tvA = vertices[ face.a ];\r\n\t\t\t\tvB = vertices[ face.b ];\r\n\t\t\t\tvC = vertices[ face.c ];\r\n\t\t\t\tvD = vertices[ face.d ];\r\n\r\n\t\t\t\tface._area1 = THREE.GeometryUtils.triangleArea( vA, vB, vD );\r\n\t\t\t\tface._area2 = THREE.GeometryUtils.triangleArea( vB, vC, vD );\r\n\r\n\t\t\t\tface._area = face._area1 + face._area2;\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttotalArea += face._area;\r\n\r\n\t\t\tcumulativeAreas[ i ] = totalArea;\r\n\r\n\t\t}\r\n\r\n\t\t// binary search cumulative areas array\r\n\r\n\t\tfunction binarySearchIndices( value ) {\r\n\r\n\t\t\tfunction binarySearch( start, end ) {\r\n\r\n\t\t\t\t// return closest larger index\r\n\t\t\t\t// if exact number is not found\r\n\r\n\t\t\t\tif ( end < start )\r\n\t\t\t\t\treturn start;\r\n\r\n\t\t\t\tvar mid = start + Math.floor( ( end - start ) / 2 );\r\n\r\n\t\t\t\tif ( cumulativeAreas[ mid ] > value ) {\r\n\r\n\t\t\t\t\treturn binarySearch( start, mid - 1 );\r\n\r\n\t\t\t\t} else if ( cumulativeAreas[ mid ] < value ) {\r\n\r\n\t\t\t\t\treturn binarySearch( mid + 1, end );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\treturn mid;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar result = binarySearch( 0, cumulativeAreas.length - 1 )\r\n\t\t\treturn result;\r\n\r\n\t\t}\r\n\r\n\t\t// pick random face weighted by face area\r\n\r\n\t\tvar r, index,\r\n\t\t\tresult = [];\r\n\r\n\t\tvar stats = {};\r\n\r\n\t\tfor ( i = 0; i < n; i ++ ) {\r\n\r\n\t\t\tr = THREE.GeometryUtils.random() * totalArea;\r\n\r\n\t\t\tindex = binarySearchIndices( r );\r\n\r\n\t\t\tresult[ i ] = THREE.GeometryUtils.randomPointInFace( faces[ index ], geometry, true );\r\n\r\n\t\t\tif ( ! stats[ index ] ) {\r\n\r\n\t\t\t\tstats[ index ] = 1;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tstats[ index ] += 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t},\r\n\r\n\t// Get triangle area (half of parallelogram)\r\n\t//\thttp://mathworld.wolfram.com/TriangleArea.html\r\n\r\n\ttriangleArea: function ( vectorA, vectorB, vectorC ) {\r\n\r\n\t\tvar tmp1 = THREE.GeometryUtils.__v1,\r\n\t\t\ttmp2 = THREE.GeometryUtils.__v2;\r\n\r\n\t\ttmp1.subVectors( vectorB, vectorA );\r\n\t\ttmp2.subVectors( vectorC, vectorA );\r\n\t\ttmp1.cross( tmp2 );\r\n\r\n\t\treturn 0.5 * tmp1.length();\r\n\r\n\t},\r\n\r\n\t// Center geometry so that 0,0,0 is in center of bounding box\r\n\r\n\tcenter: function ( geometry ) {\r\n\r\n\t\tgeometry.computeBoundingBox();\r\n\r\n\t\tvar bb = geometry.boundingBox;\r\n\r\n\t\tvar offset = new THREE.Vector3();\r\n\r\n\t\toffset.addVectors( bb.min, bb.max );\r\n\t\toffset.multiplyScalar( -0.5 );\r\n\r\n\t\tgeometry.applyMatrix( new THREE.Matrix4().makeTranslation( offset.x, offset.y, offset.z ) );\r\n\t\tgeometry.computeBoundingBox();\r\n\r\n\t\treturn offset;\r\n\r\n\t},\r\n\r\n\t// Normalize UVs to be from <0,1>\r\n\t// (for now just the first set of UVs)\r\n\r\n\tnormalizeUVs: function ( geometry ) {\r\n\r\n\t\tvar uvSet = geometry.faceVertexUvs[ 0 ];\r\n\r\n\t\tfor ( var i = 0, il = uvSet.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar uvs = uvSet[ i ];\r\n\r\n\t\t\tfor ( var j = 0, jl = uvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t// texture repeat\r\n\r\n\t\t\t\tif( uvs[ j ].x !== 1.0 ) uvs[ j ].x = uvs[ j ].x - Math.floor( uvs[ j ].x );\r\n\t\t\t\tif( uvs[ j ].y !== 1.0 ) uvs[ j ].y = uvs[ j ].y - Math.floor( uvs[ j ].y );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\ttriangulateQuads: function ( geometry ) {\r\n\r\n\t\tvar i, il, j, jl;\r\n\r\n\t\tvar faces = [];\r\n\t\tvar faceUvs = [];\r\n\t\tvar faceVertexUvs = [];\r\n\r\n\t\tfor ( i = 0, il = geometry.faceUvs.length; i < il; i ++ ) {\r\n\r\n\t\t\tfaceUvs[ i ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {\r\n\r\n\t\t\tfaceVertexUvs[ i ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 0, il = geometry.faces.length; i < il; i ++ ) {\r\n\r\n\t\t\tvar face = geometry.faces[ i ];\r\n\r\n\t\t\tif ( face instanceof THREE.Face4 ) {\r\n\r\n\t\t\t\tvar a = face.a;\r\n\t\t\t\tvar b = face.b;\r\n\t\t\t\tvar c = face.c;\r\n\t\t\t\tvar d = face.d;\r\n\r\n\t\t\t\tvar triA = new THREE.Face3();\r\n\t\t\t\tvar triB = new THREE.Face3();\r\n\r\n\t\t\t\ttriA.color.copy( face.color );\r\n\t\t\t\ttriB.color.copy( face.color );\r\n\r\n\t\t\t\ttriA.materialIndex = face.materialIndex;\r\n\t\t\t\ttriB.materialIndex = face.materialIndex;\r\n\r\n\t\t\t\ttriA.a = a;\r\n\t\t\t\ttriA.b = b;\r\n\t\t\t\ttriA.c = d;\r\n\r\n\t\t\t\ttriB.a = b;\r\n\t\t\t\ttriB.b = c;\r\n\t\t\t\ttriB.c = d;\r\n\r\n\t\t\t\tif ( face.vertexColors.length === 4 ) {\r\n\r\n\t\t\t\t\ttriA.vertexColors[ 0 ] = face.vertexColors[ 0 ].clone();\r\n\t\t\t\t\ttriA.vertexColors[ 1 ] = face.vertexColors[ 1 ].clone();\r\n\t\t\t\t\ttriA.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();\r\n\r\n\t\t\t\t\ttriB.vertexColors[ 0 ] = face.vertexColors[ 1 ].clone();\r\n\t\t\t\t\ttriB.vertexColors[ 1 ] = face.vertexColors[ 2 ].clone();\r\n\t\t\t\t\ttriB.vertexColors[ 2 ] = face.vertexColors[ 3 ].clone();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfaces.push( triA, triB );\r\n\r\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tif ( geometry.faceVertexUvs[ j ].length ) {\r\n\r\n\t\t\t\t\t\tvar uvs = geometry.faceVertexUvs[ j ][ i ];\r\n\r\n\t\t\t\t\t\tvar uvA = uvs[ 0 ];\r\n\t\t\t\t\t\tvar uvB = uvs[ 1 ];\r\n\t\t\t\t\t\tvar uvC = uvs[ 2 ];\r\n\t\t\t\t\t\tvar uvD = uvs[ 3 ];\r\n\r\n\t\t\t\t\t\tvar uvsTriA = [ uvA.clone(), uvB.clone(), uvD.clone() ];\r\n\t\t\t\t\t\tvar uvsTriB = [ uvB.clone(), uvC.clone(), uvD.clone() ];\r\n\r\n\t\t\t\t\t\tfaceVertexUvs[ j ].push( uvsTriA, uvsTriB );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tif ( geometry.faceUvs[ j ].length ) {\r\n\r\n\t\t\t\t\t\tvar faceUv = geometry.faceUvs[ j ][ i ];\r\n\r\n\t\t\t\t\t\tfaceUvs[ j ].push( faceUv, faceUv );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfaces.push( face );\r\n\r\n\t\t\t\tfor ( j = 0, jl = geometry.faceUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tfaceUvs[ j ].push( geometry.faceUvs[ j ][ i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor ( j = 0, jl = geometry.faceVertexUvs.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tfaceVertexUvs[ j ].push( geometry.faceVertexUvs[ j ][ i ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tgeometry.faces = faces;\r\n\t\tgeometry.faceUvs = faceUvs;\r\n\t\tgeometry.faceVertexUvs = faceVertexUvs;\r\n\r\n\t\tgeometry.computeCentroids();\r\n\t\tgeometry.computeFaceNormals();\r\n\t\tgeometry.computeVertexNormals();\r\n\r\n\t\tif ( geometry.hasTangents ) geometry.computeTangents();\r\n\r\n\t},\r\n\r\n\tsetMaterialIndex: function ( geometry, index, startFace, endFace ){\r\n\r\n\t\tvar faces = geometry.faces;\r\n\t\tvar start = startFace || 0;\r\n\t\tvar end = endFace || faces.length - 1;\r\n\r\n\t\tfor ( var i = start; i <= end; i ++ ) {\r\n\r\n\t\t\tfaces[i].materialIndex = index;\r\n\r\n\t\t}\r\n\r\n }\r\n\r\n};\r\n\r\nTHREE.GeometryUtils.random = THREE.Math.random16;\r\n\r\nTHREE.GeometryUtils.__v1 = new THREE.Vector3();\r\nTHREE.GeometryUtils.__v2 = new THREE.Vector3();\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.ImageUtils = {\r\n\r\n\tcrossOrigin: 'anonymous',\r\n\r\n\tloadTexture: function ( url, mapping, onLoad, onError ) {\r\n\r\n\t\tvar image = new Image();\r\n\t\tvar texture = new THREE.Texture( image, mapping );\r\n\r\n\t\tvar loader = new THREE.ImageLoader();\r\n\r\n\t\tloader.addEventListener( 'load', function ( event ) {\r\n\r\n\t\t\ttexture.image = event.content;\r\n\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t} );\r\n\r\n\t\tloader.addEventListener( 'error', function ( event ) {\r\n\r\n\t\t\tif ( onError ) onError( event.message );\r\n\r\n\t\t} );\r\n\r\n\t\tloader.crossOrigin = this.crossOrigin;\r\n\t\tloader.load( url, image );\r\n\r\n\t\ttexture.sourceFile = url;\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tloadCompressedTexture: function ( url, mapping, onLoad, onError ) {\r\n\r\n\t\tvar texture = new THREE.CompressedTexture();\r\n\t\ttexture.mapping = mapping;\r\n\r\n\t\tvar request = new XMLHttpRequest();\r\n\r\n\t\trequest.onload = function () {\r\n\r\n\t\t\tvar buffer = request.response;\r\n\t\t\tvar dds = THREE.ImageUtils.parseDDS( buffer, true );\r\n\r\n\t\t\ttexture.format = dds.format;\r\n\r\n\t\t\ttexture.mipmaps = dds.mipmaps;\r\n\t\t\ttexture.image.width = dds.width;\r\n\t\t\ttexture.image.height = dds.height;\r\n\r\n\t\t\t// gl.generateMipmap fails for compressed textures\r\n\t\t\t// mipmaps must be embedded in the DDS file\r\n\t\t\t// or texture filters must not use mipmapping\r\n\r\n\t\t\ttexture.generateMipmaps = false;\r\n\r\n\t\t\ttexture.needsUpdate = true;\r\n\r\n\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t}\r\n\r\n\t\trequest.onerror = onError;\r\n\r\n\t\trequest.open( 'GET', url, true );\r\n\t\trequest.responseType = \"arraybuffer\";\r\n\t\trequest.send( null );\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tloadTextureCube: function ( array, mapping, onLoad, onError ) {\r\n\r\n\t\tvar images = [];\r\n\t\timages.loadCount = 0;\r\n\r\n\t\tvar texture = new THREE.Texture();\r\n\t\ttexture.image = images;\r\n\t\tif ( mapping !== undefined ) texture.mapping = mapping;\r\n\r\n\t\t// no flipping needed for cube textures\r\n\r\n\t\ttexture.flipY = false;\r\n\r\n\t\tfor ( var i = 0, il = array.length; i < il; ++ i ) {\r\n\r\n\t\t\tvar cubeImage = new Image();\r\n\t\t\timages[ i ] = cubeImage;\r\n\r\n\t\t\tcubeImage.onload = function () {\r\n\r\n\t\t\t\timages.loadCount += 1;\r\n\r\n\t\t\t\tif ( images.loadCount === 6 ) {\r\n\r\n\t\t\t\t\ttexture.needsUpdate = true;\r\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\r\n\t\t\tcubeImage.onerror = onError;\r\n\r\n\t\t\tcubeImage.crossOrigin = this.crossOrigin;\r\n\t\t\tcubeImage.src = array[ i ];\r\n\r\n\t\t}\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tloadCompressedTextureCube: function ( array, mapping, onLoad, onError ) {\r\n\r\n\t\tvar images = [];\r\n\t\timages.loadCount = 0;\r\n\r\n\t\tvar texture = new THREE.CompressedTexture();\r\n\t\ttexture.image = images;\r\n\t\tif ( mapping !== undefined ) texture.mapping = mapping;\r\n\r\n\t\t// no flipping for cube textures\r\n\t\t// (also flipping doesn't work for compressed textures )\r\n\r\n\t\ttexture.flipY = false;\r\n\r\n\t\t// can't generate mipmaps for compressed textures\r\n\t\t// mips must be embedded in DDS files\r\n\r\n\t\ttexture.generateMipmaps = false;\r\n\r\n\t\tvar generateCubeFaceCallback = function ( rq, img ) {\r\n\r\n\t\t\treturn function () {\r\n\r\n\t\t\t\tvar buffer = rq.response;\r\n\t\t\t\tvar dds = THREE.ImageUtils.parseDDS( buffer, true );\r\n\r\n\t\t\t\timg.format = dds.format;\r\n\r\n\t\t\t\timg.mipmaps = dds.mipmaps;\r\n\t\t\t\timg.width = dds.width;\r\n\t\t\t\timg.height = dds.height;\r\n\r\n\t\t\t\timages.loadCount += 1;\r\n\r\n\t\t\t\tif ( images.loadCount === 6 ) {\r\n\r\n\t\t\t\t\ttexture.format = dds.format;\r\n\t\t\t\t\ttexture.needsUpdate = true;\r\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// compressed cubemap textures as 6 separate DDS files\r\n\r\n\t\tif ( array instanceof Array ) {\r\n\r\n\t\t\tfor ( var i = 0, il = array.length; i < il; ++ i ) {\r\n\r\n\t\t\t\tvar cubeImage = {};\r\n\t\t\t\timages[ i ] = cubeImage;\r\n\r\n\t\t\t\tvar request = new XMLHttpRequest();\r\n\r\n\t\t\t\trequest.onload = generateCubeFaceCallback( request, cubeImage );\r\n\t\t\t\trequest.onerror = onError;\r\n\r\n\t\t\t\tvar url = array[ i ];\r\n\r\n\t\t\t\trequest.open( 'GET', url, true );\r\n\t\t\t\trequest.responseType = \"arraybuffer\";\r\n\t\t\t\trequest.send( null );\r\n\r\n\t\t\t}\r\n\r\n\t\t// compressed cubemap texture stored in a single DDS file\r\n\r\n\t\t} else {\r\n\r\n\t\t\tvar url = array;\r\n\t\t\tvar request = new XMLHttpRequest();\r\n\r\n\t\t\trequest.onload = function( ) {\r\n\r\n\t\t\t\tvar buffer = request.response;\r\n\t\t\t\tvar dds = THREE.ImageUtils.parseDDS( buffer, true );\r\n\r\n\t\t\t\tif ( dds.isCubemap ) {\r\n\r\n\t\t\t\t\tvar faces = dds.mipmaps.length / dds.mipmapCount;\r\n\r\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\r\n\r\n\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\r\n\r\n\t\t\t\t\t\tfor ( var i = 0; i < dds.mipmapCount; i ++ ) {\r\n\r\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( dds.mipmaps[ f * dds.mipmapCount + i ] );\r\n\t\t\t\t\t\t\timages[ f ].format = dds.format;\r\n\t\t\t\t\t\t\timages[ f ].width = dds.width;\r\n\t\t\t\t\t\t\timages[ f ].height = dds.height;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttexture.format = dds.format;\r\n\t\t\t\t\ttexture.needsUpdate = true;\r\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\trequest.onerror = onError;\r\n\r\n\t\t\trequest.open( 'GET', url, true );\r\n\t\t\trequest.responseType = \"arraybuffer\";\r\n\t\t\trequest.send( null );\r\n\r\n\t\t}\r\n\r\n\t\treturn texture;\r\n\r\n\t},\r\n\r\n\tparseDDS: function ( buffer, loadMipmaps ) {\r\n\r\n\t\tvar dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 };\r\n\r\n\t\t// Adapted from @toji's DDS utils\r\n\t\t//\thttps://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js\r\n\r\n\t\t// All values and structures referenced from:\r\n\t\t// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\r\n\r\n\t\tvar DDS_MAGIC = 0x20534444;\r\n\r\n\t\tvar DDSD_CAPS = 0x1,\r\n\t\t\tDDSD_HEIGHT = 0x2,\r\n\t\t\tDDSD_WIDTH = 0x4,\r\n\t\t\tDDSD_PITCH = 0x8,\r\n\t\t\tDDSD_PIXELFORMAT = 0x1000,\r\n\t\t\tDDSD_MIPMAPCOUNT = 0x20000,\r\n\t\t\tDDSD_LINEARSIZE = 0x80000,\r\n\t\t\tDDSD_DEPTH = 0x800000;\r\n\r\n\t\tvar DDSCAPS_COMPLEX = 0x8,\r\n\t\t\tDDSCAPS_MIPMAP = 0x400000,\r\n\t\t\tDDSCAPS_TEXTURE = 0x1000;\r\n\r\n\t\tvar DDSCAPS2_CUBEMAP = 0x200,\r\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEX = 0x400,\r\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,\r\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,\r\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,\r\n\t\t\tDDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,\r\n\t\t\tDDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,\r\n\t\t\tDDSCAPS2_VOLUME = 0x200000;\r\n\r\n\t\tvar DDPF_ALPHAPIXELS = 0x1,\r\n\t\t\tDDPF_ALPHA = 0x2,\r\n\t\t\tDDPF_FOURCC = 0x4,\r\n\t\t\tDDPF_RGB = 0x40,\r\n\t\t\tDDPF_YUV = 0x200,\r\n\t\t\tDDPF_LUMINANCE = 0x20000;\r\n\r\n\t\tfunction fourCCToInt32( value ) {\r\n\r\n\t\t\treturn value.charCodeAt(0) +\r\n\t\t\t\t(value.charCodeAt(1) << 8) +\r\n\t\t\t\t(value.charCodeAt(2) << 16) +\r\n\t\t\t\t(value.charCodeAt(3) << 24);\r\n\r\n\t\t}\r\n\r\n\t\tfunction int32ToFourCC( value ) {\r\n\r\n\t\t\treturn String.fromCharCode(\r\n\t\t\t\tvalue & 0xff,\r\n\t\t\t\t(value >> 8) & 0xff,\r\n\t\t\t\t(value >> 16) & 0xff,\r\n\t\t\t\t(value >> 24) & 0xff\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tvar FOURCC_DXT1 = fourCCToInt32(\"DXT1\");\r\n\t\tvar FOURCC_DXT3 = fourCCToInt32(\"DXT3\");\r\n\t\tvar FOURCC_DXT5 = fourCCToInt32(\"DXT5\");\r\n\r\n\t\tvar headerLengthInt = 31; // The header length in 32 bit ints\r\n\r\n\t\t// Offsets into the header array\r\n\r\n\t\tvar off_magic = 0;\r\n\r\n\t\tvar off_size = 1;\r\n\t\tvar off_flags = 2;\r\n\t\tvar off_height = 3;\r\n\t\tvar off_width = 4;\r\n\r\n\t\tvar off_mipmapCount = 7;\r\n\r\n\t\tvar off_pfFlags = 20;\r\n\t\tvar off_pfFourCC = 21;\r\n\r\n\t\tvar off_caps = 27;\r\n\t\tvar off_caps2 = 28;\r\n\t\tvar off_caps3 = 29;\r\n\t\tvar off_caps4 = 30;\r\n\r\n\t\t// Parse header\r\n\r\n\t\tvar header = new Int32Array( buffer, 0, headerLengthInt );\r\n\r\n\t\tif ( header[ off_magic ] !== DDS_MAGIC ) {\r\n\r\n\t\t\tconsole.error( \"ImageUtils.parseDDS(): Invalid magic number in DDS header\" );\r\n\t\t\treturn dds;\r\n\r\n\t\t}\r\n\r\n\t\tif ( ! header[ off_pfFlags ] & DDPF_FOURCC ) {\r\n\r\n\t\t\tconsole.error( \"ImageUtils.parseDDS(): Unsupported format, must contain a FourCC code\" );\r\n\t\t\treturn dds;\r\n\r\n\t\t}\r\n\r\n\t\tvar blockBytes;\r\n\r\n\t\tvar fourCC = header[ off_pfFourCC ];\r\n\r\n\t\tswitch ( fourCC ) {\r\n\r\n\t\t\tcase FOURCC_DXT1:\r\n\r\n\t\t\t\tblockBytes = 8;\r\n\t\t\t\tdds.format = THREE.RGB_S3TC_DXT1_Format;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase FOURCC_DXT3:\r\n\r\n\t\t\t\tblockBytes = 16;\r\n\t\t\t\tdds.format = THREE.RGBA_S3TC_DXT3_Format;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase FOURCC_DXT5:\r\n\r\n\t\t\t\tblockBytes = 16;\r\n\t\t\t\tdds.format = THREE.RGBA_S3TC_DXT5_Format;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\r\n\t\t\t\tconsole.error( \"ImageUtils.parseDDS(): Unsupported FourCC code: \", int32ToFourCC( fourCC ) );\r\n\t\t\t\treturn dds;\r\n\r\n\t\t}\r\n\r\n\t\tdds.mipmapCount = 1;\r\n\r\n\t\tif ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {\r\n\r\n\t\t\tdds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );\r\n\r\n\t\t}\r\n\r\n\t\t//TODO: Verify that all faces of the cubemap are present with DDSCAPS2_CUBEMAP_POSITIVEX, etc.\r\n\r\n\t\tdds.isCubemap = header[ off_caps2 ] & DDSCAPS2_CUBEMAP ? true : false;\r\n\r\n\t\tdds.width = header[ off_width ];\r\n\t\tdds.height = header[ off_height ];\r\n\r\n\t\tvar dataOffset = header[ off_size ] + 4;\r\n\r\n\t\t// Extract mipmaps buffers\r\n\r\n\t\tvar width = dds.width;\r\n\t\tvar height = dds.height;\r\n\r\n\t\tvar faces = dds.isCubemap ? 6 : 1;\r\n\r\n\t\tfor ( var face = 0; face < faces; face ++ ) {\r\n\r\n\t\t\tfor ( var i = 0; i < dds.mipmapCount; i ++ ) {\r\n\r\n\t\t\t\tvar dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;\r\n\t\t\t\tvar byteArray = new Uint8Array( buffer, dataOffset, dataLength );\r\n\r\n\t\t\t\tvar mipmap = { \"data\": byteArray, \"width\": width, \"height\": height };\r\n\t\t\t\tdds.mipmaps.push( mipmap );\r\n\r\n\t\t\t\tdataOffset += dataLength;\r\n\r\n\t\t\t\twidth = Math.max( width * 0.5, 1 );\r\n\t\t\t\theight = Math.max( height * 0.5, 1 );\r\n\r\n\t\t\t}\r\n\r\n\t\t\twidth = dds.width;\r\n\t\t\theight = dds.height;\r\n\r\n\t\t}\r\n\r\n\t\treturn dds;\r\n\r\n\t},\r\n\r\n\tgetNormalMap: function ( image, depth ) {\r\n\r\n\t\t// Adapted from http://www.paulbrunt.co.uk/lab/heightnormal/\r\n\r\n\t\tvar cross = function ( a, b ) {\r\n\r\n\t\t\treturn [ a[ 1 ] * b[ 2 ] - a[ 2 ] * b[ 1 ], a[ 2 ] * b[ 0 ] - a[ 0 ] * b[ 2 ], a[ 0 ] * b[ 1 ] - a[ 1 ] * b[ 0 ] ];\r\n\r\n\t\t}\r\n\r\n\t\tvar subtract = function ( a, b ) {\r\n\r\n\t\t\treturn [ a[ 0 ] - b[ 0 ], a[ 1 ] - b[ 1 ], a[ 2 ] - b[ 2 ] ];\r\n\r\n\t\t}\r\n\r\n\t\tvar normalize = function ( a ) {\r\n\r\n\t\t\tvar l = Math.sqrt( a[ 0 ] * a[ 0 ] + a[ 1 ] * a[ 1 ] + a[ 2 ] * a[ 2 ] );\r\n\t\t\treturn [ a[ 0 ] / l, a[ 1 ] / l, a[ 2 ] / l ];\r\n\r\n\t\t}\r\n\r\n\t\tdepth = depth | 1;\r\n\r\n\t\tvar width = image.width;\r\n\t\tvar height = image.height;\r\n\r\n\t\tvar canvas = document.createElement( 'canvas' );\r\n\t\tcanvas.width = width;\r\n\t\tcanvas.height = height;\r\n\r\n\t\tvar context = canvas.getContext( '2d' );\r\n\t\tcontext.drawImage( image, 0, 0 );\r\n\r\n\t\tvar data = context.getImageData( 0, 0, width, height ).data;\r\n\t\tvar imageData = context.createImageData( width, height );\r\n\t\tvar output = imageData.data;\r\n\r\n\t\tfor ( var x = 0; x < width; x ++ ) {\r\n\r\n\t\t\tfor ( var y = 0; y < height; y ++ ) {\r\n\r\n\t\t\t\tvar ly = y - 1 < 0 ? 0 : y - 1;\r\n\t\t\t\tvar uy = y + 1 > height - 1 ? height - 1 : y + 1;\r\n\t\t\t\tvar lx = x - 1 < 0 ? 0 : x - 1;\r\n\t\t\t\tvar ux = x + 1 > width - 1 ? width - 1 : x + 1;\r\n\r\n\t\t\t\tvar points = [];\r\n\t\t\t\tvar origin = [ 0, 0, data[ ( y * width + x ) * 4 ] / 255 * depth ];\r\n\t\t\t\tpoints.push( [ - 1, 0, data[ ( y * width + lx ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ - 1, - 1, data[ ( ly * width + lx ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ 0, - 1, data[ ( ly * width + x ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ 1, - 1, data[ ( ly * width + ux ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ 1, 0, data[ ( y * width + ux ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ 1, 1, data[ ( uy * width + ux ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ 0, 1, data[ ( uy * width + x ) * 4 ] / 255 * depth ] );\r\n\t\t\t\tpoints.push( [ - 1, 1, data[ ( uy * width + lx ) * 4 ] / 255 * depth ] );\r\n\r\n\t\t\t\tvar normals = [];\r\n\t\t\t\tvar num_points = points.length;\r\n\r\n\t\t\t\tfor ( var i = 0; i < num_points; i ++ ) {\r\n\r\n\t\t\t\t\tvar v1 = points[ i ];\r\n\t\t\t\t\tvar v2 = points[ ( i + 1 ) % num_points ];\r\n\t\t\t\t\tv1 = subtract( v1, origin );\r\n\t\t\t\t\tv2 = subtract( v2, origin );\r\n\t\t\t\t\tnormals.push( normalize( cross( v1, v2 ) ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar normal = [ 0, 0, 0 ];\r\n\r\n\t\t\t\tfor ( var i = 0; i < normals.length; i ++ ) {\r\n\r\n\t\t\t\t\tnormal[ 0 ] += normals[ i ][ 0 ];\r\n\t\t\t\t\tnormal[ 1 ] += normals[ i ][ 1 ];\r\n\t\t\t\t\tnormal[ 2 ] += normals[ i ][ 2 ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnormal[ 0 ] /= normals.length;\r\n\t\t\t\tnormal[ 1 ] /= normals.length;\r\n\t\t\t\tnormal[ 2 ] /= normals.length;\r\n\r\n\t\t\t\tvar idx = ( y * width + x ) * 4;\r\n\r\n\t\t\t\toutput[ idx ] = ( ( normal[ 0 ] + 1.0 ) / 2.0 * 255 ) | 0;\r\n\t\t\t\toutput[ idx + 1 ] = ( ( normal[ 1 ] + 1.0 ) / 2.0 * 255 ) | 0;\r\n\t\t\t\toutput[ idx + 2 ] = ( normal[ 2 ] * 255 ) | 0;\r\n\t\t\t\toutput[ idx + 3 ] = 255;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcontext.putImageData( imageData, 0, 0 );\r\n\r\n\t\treturn canvas;\r\n\r\n\t},\r\n\r\n\tgenerateDataTexture: function ( width, height, color ) {\r\n\r\n\t\tvar size = width * height;\r\n\t\tvar data = new Uint8Array( 3 * size );\r\n\r\n\t\tvar r = Math.floor( color.r * 255 );\r\n\t\tvar g = Math.floor( color.g * 255 );\r\n\t\tvar b = Math.floor( color.b * 255 );\r\n\r\n\t\tfor ( var i = 0; i < size; i ++ ) {\r\n\r\n\t\t\tdata[ i * 3 ] \t = r;\r\n\t\t\tdata[ i * 3 + 1 ] = g;\r\n\t\t\tdata[ i * 3 + 2 ] = b;\r\n\r\n\t\t}\r\n\r\n\t\tvar texture = new THREE.DataTexture( data, width, height, THREE.RGBFormat );\r\n\t\ttexture.needsUpdate = true;\r\n\r\n\t\treturn texture;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SceneUtils = {\r\n\r\n\tcreateMultiMaterialObject: function ( geometry, materials ) {\r\n\r\n\t\tvar group = new THREE.Object3D();\r\n\r\n\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\r\n\r\n\t\t\tgroup.add( new THREE.Mesh( geometry, materials[ i ] ) );\r\n\r\n\t\t}\r\n\r\n\t\treturn group;\r\n\r\n\t},\r\n\r\n\tdetach : function ( child, parent, scene ) {\r\n\r\n\t\tchild.applyMatrix( parent.matrixWorld );\r\n\t\tparent.remove( child );\r\n\t\tscene.add( child );\r\n\r\n\t},\r\n\r\n\tattach: function ( child, scene, parent ) {\r\n\r\n\t\tvar matrixWorldInverse = new THREE.Matrix4();\r\n\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\r\n\t\tchild.applyMatrix( matrixWorldInverse );\r\n\r\n\t\tscene.remove( child );\r\n\t\tparent.add( child );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * For Text operations in three.js (See TextGeometry)\r\n *\r\n * It uses techniques used in:\r\n *\r\n * \ttypeface.js and canvastext\r\n * \t\tFor converting fonts and rendering with javascript\r\n *\t\thttp://typeface.neocracy.org\r\n *\r\n *\tTriangulation ported from AS3\r\n *\t\tSimple Polygon Triangulation\r\n *\t\thttp://actionsnippet.com/?p=1462\r\n *\r\n * \tA Method to triangulate shapes with holes\r\n *\t\thttp://www.sakri.net/blog/2009/06/12/an-approach-to-triangulating-polygons-with-holes/\r\n *\r\n */\r\n\r\nTHREE.FontUtils = {\r\n\r\n\tfaces : {},\r\n\r\n\t// Just for now. face[weight][style]\r\n\r\n\tface : \"helvetiker\",\r\n\tweight: \"normal\",\r\n\tstyle : \"normal\",\r\n\tsize : 150,\r\n\tdivisions : 10,\r\n\r\n\tgetFace : function() {\r\n\r\n\t\treturn this.faces[ this.face ][ this.weight ][ this.style ];\r\n\r\n\t},\r\n\r\n\tloadFace : function( data ) {\r\n\r\n\t\tvar family = data.familyName.toLowerCase();\r\n\r\n\t\tvar ThreeFont = this;\r\n\r\n\t\tThreeFont.faces[ family ] = ThreeFont.faces[ family ] || {};\r\n\r\n\t\tThreeFont.faces[ family ][ data.cssFontWeight ] = ThreeFont.faces[ family ][ data.cssFontWeight ] || {};\r\n\t\tThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data;\r\n\r\n\t\tvar face = ThreeFont.faces[ family ][ data.cssFontWeight ][ data.cssFontStyle ] = data;\r\n\r\n\t\treturn data;\r\n\r\n\t},\r\n\r\n\tdrawText : function( text ) {\r\n\r\n\t\tvar characterPts = [], allPts = [];\r\n\r\n\t\t// RenderText\r\n\r\n\t\tvar i, p,\r\n\t\t\tface = this.getFace(),\r\n\t\t\tscale = this.size / face.resolution,\r\n\t\t\toffset = 0,\r\n\t\t\tchars = String( text ).split( '' ),\r\n\t\t\tlength = chars.length;\r\n\r\n\t\tvar fontPaths = [];\r\n\r\n\t\tfor ( i = 0; i < length; i ++ ) {\r\n\r\n\t\t\tvar path = new THREE.Path();\r\n\r\n\t\t\tvar ret = this.extractGlyphPoints( chars[ i ], face, scale, offset, path );\r\n\t\t\toffset += ret.offset;\r\n\r\n\t\t\tfontPaths.push( ret.path );\r\n\r\n\t\t}\r\n\r\n\t\t// get the width\r\n\r\n\t\tvar width = offset / 2;\r\n\t\t//\r\n\t\t// for ( p = 0; p < allPts.length; p++ ) {\r\n\t\t//\r\n\t\t// \tallPts[ p ].x -= width;\r\n\t\t//\r\n\t\t// }\r\n\r\n\t\t//var extract = this.extractPoints( allPts, characterPts );\r\n\t\t//extract.contour = allPts;\r\n\r\n\t\t//extract.paths = fontPaths;\r\n\t\t//extract.offset = width;\r\n\r\n\t\treturn { paths : fontPaths, offset : width };\r\n\r\n\t},\r\n\r\n\r\n\r\n\r\n\textractGlyphPoints : function( c, face, scale, offset, path ) {\r\n\r\n\t\tvar pts = [];\r\n\r\n\t\tvar i, i2, divisions,\r\n\t\t\toutline, action, length,\r\n\t\t\tscaleX, scaleY,\r\n\t\t\tx, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2,\r\n\t\t\tlaste,\r\n\t\t\tglyph = face.glyphs[ c ] || face.glyphs[ '?' ];\r\n\r\n\t\tif ( !glyph ) return;\r\n\r\n\t\tif ( glyph.o ) {\r\n\r\n\t\t\toutline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\r\n\t\t\tlength = outline.length;\r\n\r\n\t\t\tscaleX = scale;\r\n\t\t\tscaleY = scale;\r\n\r\n\t\t\tfor ( i = 0; i < length; ) {\r\n\r\n\t\t\t\taction = outline[ i ++ ];\r\n\r\n\t\t\t\t//console.log( action );\r\n\r\n\t\t\t\tswitch( action ) {\r\n\r\n\t\t\t\tcase 'm':\r\n\r\n\t\t\t\t\t// Move To\r\n\r\n\t\t\t\t\tx = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\ty = outline[ i++ ] * scaleY;\r\n\r\n\t\t\t\t\tpath.moveTo( x, y );\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'l':\r\n\r\n\t\t\t\t\t// Line To\r\n\r\n\t\t\t\t\tx = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\ty = outline[ i++ ] * scaleY;\r\n\t\t\t\t\tpath.lineTo(x,y);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'q':\r\n\r\n\t\t\t\t\t// QuadraticCurveTo\r\n\r\n\t\t\t\t\tcpx = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\tcpy = outline[ i++ ] * scaleY;\r\n\t\t\t\t\tcpx1 = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\tcpy1 = outline[ i++ ] * scaleY;\r\n\r\n\t\t\t\t\tpath.quadraticCurveTo(cpx1, cpy1, cpx, cpy);\r\n\r\n\t\t\t\t\tlaste = pts[ pts.length - 1 ];\r\n\r\n\t\t\t\t\tif ( laste ) {\r\n\r\n\t\t\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t\t\t\tfor ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) {\r\n\r\n\t\t\t\t\t\t\tvar t = i2 / divisions;\r\n\t\t\t\t\t\t\tvar tx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx );\r\n\t\t\t\t\t\t\tvar ty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy );\r\n\t\t\t\t\t }\r\n\r\n\t\t\t\t }\r\n\r\n\t\t\t\t break;\r\n\r\n\t\t\t\tcase 'b':\r\n\r\n\t\t\t\t\t// Cubic Bezier Curve\r\n\r\n\t\t\t\t\tcpx = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\tcpy = outline[ i++ ] * scaleY;\r\n\t\t\t\t\tcpx1 = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\tcpy1 = outline[ i++ ] * -scaleY;\r\n\t\t\t\t\tcpx2 = outline[ i++ ] * scaleX + offset;\r\n\t\t\t\t\tcpy2 = outline[ i++ ] * -scaleY;\r\n\r\n\t\t\t\t\tpath.bezierCurveTo( cpx, cpy, cpx1, cpy1, cpx2, cpy2 );\r\n\r\n\t\t\t\t\tlaste = pts[ pts.length - 1 ];\r\n\r\n\t\t\t\t\tif ( laste ) {\r\n\r\n\t\t\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t\t\t\tfor ( i2 = 1, divisions = this.divisions; i2 <= divisions; i2 ++ ) {\r\n\r\n\t\t\t\t\t\t\tvar t = i2 / divisions;\r\n\t\t\t\t\t\t\tvar tx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx );\r\n\t\t\t\t\t\t\tvar ty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy );\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\r\n\t\treturn { offset: glyph.ha*scale, path:path};\r\n\t}\r\n\r\n};\r\n\r\n\r\nTHREE.FontUtils.generateShapes = function( text, parameters ) {\r\n\r\n\t// Parameters \r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar size = parameters.size !== undefined ? parameters.size : 100;\r\n\tvar curveSegments = parameters.curveSegments !== undefined ? parameters.curveSegments: 4;\r\n\r\n\tvar font = parameters.font !== undefined ? parameters.font : \"helvetiker\";\r\n\tvar weight = parameters.weight !== undefined ? parameters.weight : \"normal\";\r\n\tvar style = parameters.style !== undefined ? parameters.style : \"normal\";\r\n\r\n\tTHREE.FontUtils.size = size;\r\n\tTHREE.FontUtils.divisions = curveSegments;\r\n\r\n\tTHREE.FontUtils.face = font;\r\n\tTHREE.FontUtils.weight = weight;\r\n\tTHREE.FontUtils.style = style;\r\n\r\n\t// Get a Font data json object\r\n\r\n\tvar data = THREE.FontUtils.drawText( text );\r\n\r\n\tvar paths = data.paths;\r\n\tvar shapes = [];\r\n\r\n\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\r\n\r\n\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\r\n\r\n\t}\r\n\r\n\treturn shapes;\r\n\r\n};\r\n\r\n\r\n/**\r\n * This code is a quick port of code written in C++ which was submitted to\r\n * flipcode.com by John W. Ratcliff // July 22, 2000\r\n * See original code and more information here:\r\n * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\r\n *\r\n * ported to actionscript by Zevan Rosser\r\n * www.actionsnippet.com\r\n *\r\n * ported to javascript by Joshua Koo\r\n * http://www.lab4games.net/zz85/blog\r\n *\r\n */\r\n\r\n\r\n( function( namespace ) {\r\n\r\n\tvar EPSILON = 0.0000000001;\r\n\r\n\t// takes in an contour array and returns\r\n\r\n\tvar process = function( contour, indices ) {\r\n\r\n\t\tvar n = contour.length;\r\n\r\n\t\tif ( n < 3 ) return null;\r\n\r\n\t\tvar result = [],\r\n\t\t\tverts = [],\r\n\t\t\tvertIndices = [];\r\n\r\n\t\t/* we want a counter-clockwise polygon in verts */\r\n\r\n\t\tvar u, v, w;\r\n\r\n\t\tif ( area( contour ) > 0.0 ) {\r\n\r\n\t\t\tfor ( v = 0; v < n; v++ ) verts[ v ] = v;\r\n\r\n\t\t} else {\r\n\r\n\t\t\tfor ( v = 0; v < n; v++ ) verts[ v ] = ( n - 1 ) - v;\r\n\r\n\t\t}\r\n\r\n\t\tvar nv = n;\r\n\r\n\t\t/* remove nv - 2 vertices, creating 1 triangle every time */\r\n\r\n\t\tvar count = 2 * nv; /* error detection */\r\n\r\n\t\tfor( v = nv - 1; nv > 2; ) {\r\n\r\n\t\t\t/* if we loop, it is probably a non-simple polygon */\r\n\r\n\t\t\tif ( ( count-- ) <= 0 ) {\r\n\r\n\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\r\n\r\n\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\r\n\t\t\t\t//return null;\r\n\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\r\n\t\t\t\tconsole.log( \"Warning, unable to triangulate polygon!\" );\r\n\r\n\t\t\t\tif ( indices ) return vertIndices;\r\n\t\t\t\treturn result;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t/* three consecutive vertices in current polygon, */\r\n\r\n\t\t\tu = v; \t \tif ( nv <= u ) u = 0; /* previous */\r\n\t\t\tv = u + 1; if ( nv <= v ) v = 0; /* new v */\r\n\t\t\tw = v + 1; if ( nv <= w ) w = 0; /* next */\r\n\r\n\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\r\n\r\n\t\t\t\tvar a, b, c, s, t;\r\n\r\n\t\t\t\t/* true names of the vertices */\r\n\r\n\t\t\t\ta = verts[ u ];\r\n\t\t\t\tb = verts[ v ];\r\n\t\t\t\tc = verts[ w ];\r\n\r\n\t\t\t\t/* output Triangle */\r\n\r\n\t\t\t\tresult.push( [ contour[ a ],\r\n\t\t\t\t\tcontour[ b ],\r\n\t\t\t\t\tcontour[ c ] ] );\r\n\r\n\r\n\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\r\n\r\n\t\t\t\t/* remove v from the remaining polygon */\r\n\r\n\t\t\t\tfor( s = v, t = v + 1; t < nv; s++, t++ ) {\r\n\r\n\t\t\t\t\tverts[ s ] = verts[ t ];\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tnv--;\r\n\r\n\t\t\t\t/* reset error detection counter */\r\n\r\n\t\t\t\tcount = 2 * nv;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif ( indices ) return vertIndices;\r\n\t\treturn result;\r\n\r\n\t};\r\n\r\n\t// calculate area of the contour polygon\r\n\r\n\tvar area = function ( contour ) {\r\n\r\n\t\tvar n = contour.length;\r\n\t\tvar a = 0.0;\r\n\r\n\t\tfor( var p = n - 1, q = 0; q < n; p = q++ ) {\r\n\r\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\r\n\r\n\t\t}\r\n\r\n\t\treturn a * 0.5;\r\n\r\n\t};\r\n\r\n\tvar snip = function ( contour, u, v, w, n, verts ) {\r\n\r\n\t\tvar p;\r\n\t\tvar ax, ay, bx, by;\r\n\t\tvar cx, cy, px, py;\r\n\r\n\t\tax = contour[ verts[ u ] ].x;\r\n\t\tay = contour[ verts[ u ] ].y;\r\n\r\n\t\tbx = contour[ verts[ v ] ].x;\r\n\t\tby = contour[ verts[ v ] ].y;\r\n\r\n\t\tcx = contour[ verts[ w ] ].x;\r\n\t\tcy = contour[ verts[ w ] ].y;\r\n\r\n\t\tif ( EPSILON > (((bx-ax)*(cy-ay)) - ((by-ay)*(cx-ax))) ) return false;\r\n\r\n\t\tvar aX, aY, bX, bY, cX, cY;\r\n\t\tvar apx, apy, bpx, bpy, cpx, cpy;\r\n\t\tvar cCROSSap, bCROSScp, aCROSSbp;\r\n\r\n\t\taX = cx - bx; aY = cy - by;\r\n\t\tbX = ax - cx; bY = ay - cy;\r\n\t\tcX = bx - ax; cY = by - ay;\r\n\r\n\t\tfor ( p = 0; p < n; p++ ) {\r\n\r\n\t\t\tif( (p === u) || (p === v) || (p === w) ) continue;\r\n\r\n\t\t\tpx = contour[ verts[ p ] ].x\r\n\t\t\tpy = contour[ verts[ p ] ].y\r\n\r\n\t\t\tapx = px - ax; apy = py - ay;\r\n\t\t\tbpx = px - bx; bpy = py - by;\r\n\t\t\tcpx = px - cx; cpy = py - cy;\r\n\r\n\t\t\t// see if p is inside triangle abc\r\n\r\n\t\t\taCROSSbp = aX*bpy - aY*bpx;\r\n\t\t\tcCROSSap = cX*apy - cY*apx;\r\n\t\t\tbCROSScp = bX*cpy - bY*cpx;\r\n\r\n\t\t\tif ( (aCROSSbp >= 0.0) && (bCROSScp >= 0.0) && (cCROSSap >= 0.0) ) return false;\r\n\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\r\n\t};\r\n\r\n\r\n\tnamespace.Triangulate = process;\r\n\tnamespace.Triangulate.area = area;\r\n\r\n\treturn namespace;\r\n\r\n})(THREE.FontUtils);\r\n\r\n// To use the typeface.js face files, hook up the API\r\nself._typeface_js = { faces: THREE.FontUtils.faces, loadFace: THREE.FontUtils.loadFace };\r\nTHREE.typeface_js = self._typeface_js;\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * Extensible curve object\r\n *\r\n * Some common of Curve methods\r\n * .getPoint(t), getTangent(t)\r\n * .getPointAt(u), getTagentAt(u)\r\n * .getPoints(), .getSpacedPoints()\r\n * .getLength()\r\n * .updateArcLengths()\r\n *\r\n * This file contains following classes:\r\n *\r\n * -- 2d classes --\r\n * THREE.Curve\r\n * THREE.LineCurve\r\n * THREE.QuadraticBezierCurve\r\n * THREE.CubicBezierCurve\r\n * THREE.SplineCurve\r\n * THREE.ArcCurve\r\n * THREE.EllipseCurve\r\n *\r\n * -- 3d classes --\r\n * THREE.LineCurve3\r\n * THREE.QuadraticBezierCurve3\r\n * THREE.CubicBezierCurve3\r\n * THREE.SplineCurve3\r\n * THREE.ClosedSplineCurve3\r\n *\r\n * A series of curves can be represented as a THREE.CurvePath\r\n *\r\n **/\r\n\r\n/**************************************************************\r\n *\tAbstract Curve base class\r\n **************************************************************/\r\n\r\nTHREE.Curve = function () {\r\n\r\n};\r\n\r\n// Virtual base class method to overwrite and implement in subclasses\r\n//\t- t [0 .. 1]\r\n\r\nTHREE.Curve.prototype.getPoint = function ( t ) {\r\n\r\n\tconsole.log( \"Warning, getPoint() not implemented!\" );\r\n\treturn null;\r\n\r\n};\r\n\r\n// Get point at relative position in curve according to arc length\r\n// - u [0 .. 1]\r\n\r\nTHREE.Curve.prototype.getPointAt = function ( u ) {\r\n\r\n\tvar t = this.getUtoTmapping( u );\r\n\treturn this.getPoint( t );\r\n\r\n};\r\n\r\n// Get sequence of points using getPoint( t )\r\n\r\nTHREE.Curve.prototype.getPoints = function ( divisions ) {\r\n\r\n\tif ( !divisions ) divisions = 5;\r\n\r\n\tvar d, pts = [];\r\n\r\n\tfor ( d = 0; d <= divisions; d ++ ) {\r\n\r\n\t\tpts.push( this.getPoint( d / divisions ) );\r\n\r\n\t}\r\n\r\n\treturn pts;\r\n\r\n};\r\n\r\n// Get sequence of points using getPointAt( u )\r\n\r\nTHREE.Curve.prototype.getSpacedPoints = function ( divisions ) {\r\n\r\n\tif ( !divisions ) divisions = 5;\r\n\r\n\tvar d, pts = [];\r\n\r\n\tfor ( d = 0; d <= divisions; d ++ ) {\r\n\r\n\t\tpts.push( this.getPointAt( d / divisions ) );\r\n\r\n\t}\r\n\r\n\treturn pts;\r\n\r\n};\r\n\r\n// Get total curve arc length\r\n\r\nTHREE.Curve.prototype.getLength = function () {\r\n\r\n\tvar lengths = this.getLengths();\r\n\treturn lengths[ lengths.length - 1 ];\r\n\r\n};\r\n\r\n// Get list of cumulative segment lengths\r\n\r\nTHREE.Curve.prototype.getLengths = function ( divisions ) {\r\n\r\n\tif ( !divisions ) divisions = (this.__arcLengthDivisions) ? (this.__arcLengthDivisions): 200;\r\n\r\n\tif ( this.cacheArcLengths\r\n\t\t&& ( this.cacheArcLengths.length == divisions + 1 )\r\n\t\t&& !this.needsUpdate) {\r\n\r\n\t\t//console.log( \"cached\", this.cacheArcLengths );\r\n\t\treturn this.cacheArcLengths;\r\n\r\n\t}\r\n\r\n\tthis.needsUpdate = false;\r\n\r\n\tvar cache = [];\r\n\tvar current, last = this.getPoint( 0 );\r\n\tvar p, sum = 0;\r\n\r\n\tcache.push( 0 );\r\n\r\n\tfor ( p = 1; p <= divisions; p ++ ) {\r\n\r\n\t\tcurrent = this.getPoint ( p / divisions );\r\n\t\tsum += current.distanceTo( last );\r\n\t\tcache.push( sum );\r\n\t\tlast = current;\r\n\r\n\t}\r\n\r\n\tthis.cacheArcLengths = cache;\r\n\r\n\treturn cache; // { sums: cache, sum:sum }; Sum is in the last element.\r\n\r\n};\r\n\r\n\r\nTHREE.Curve.prototype.updateArcLengths = function() {\r\n\tthis.needsUpdate = true;\r\n\tthis.getLengths();\r\n};\r\n\r\n// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equi distance\r\n\r\nTHREE.Curve.prototype.getUtoTmapping = function ( u, distance ) {\r\n\r\n\tvar arcLengths = this.getLengths();\r\n\r\n\tvar i = 0, il = arcLengths.length;\r\n\r\n\tvar targetArcLength; // The targeted u distance value to get\r\n\r\n\tif ( distance ) {\r\n\r\n\t\ttargetArcLength = distance;\r\n\r\n\t} else {\r\n\r\n\t\ttargetArcLength = u * arcLengths[ il - 1 ];\r\n\r\n\t}\r\n\r\n\t//var time = Date.now();\r\n\r\n\t// binary search for the index with largest value smaller than target u distance\r\n\r\n\tvar low = 0, high = il - 1, comparison;\r\n\r\n\twhile ( low <= high ) {\r\n\r\n\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\r\n\r\n\t\tcomparison = arcLengths[ i ] - targetArcLength;\r\n\r\n\t\tif ( comparison < 0 ) {\r\n\r\n\t\t\tlow = i + 1;\r\n\t\t\tcontinue;\r\n\r\n\t\t} else if ( comparison > 0 ) {\r\n\r\n\t\t\thigh = i - 1;\r\n\t\t\tcontinue;\r\n\r\n\t\t} else {\r\n\r\n\t\t\thigh = i;\r\n\t\t\tbreak;\r\n\r\n\t\t\t// DONE\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\ti = high;\r\n\r\n\t//console.log('b' , i, low, high, Date.now()- time);\r\n\r\n\tif ( arcLengths[ i ] == targetArcLength ) {\r\n\r\n\t\tvar t = i / ( il - 1 );\r\n\t\treturn t;\r\n\r\n\t}\r\n\r\n\t// we could get finer grain at lengths, or use simple interpolatation between two points\r\n\r\n\tvar lengthBefore = arcLengths[ i ];\r\n var lengthAfter = arcLengths[ i + 1 ];\r\n\r\n var segmentLength = lengthAfter - lengthBefore;\r\n\r\n // determine where we are between the 'before' and 'after' points\r\n\r\n var segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\r\n\r\n // add that fractional amount to t\r\n\r\n var t = ( i + segmentFraction ) / ( il -1 );\r\n\r\n\treturn t;\r\n\r\n};\r\n\r\n// Returns a unit vector tangent at t\r\n// In case any sub curve does not implement its tangent derivation,\r\n// 2 points a small delta apart will be used to find its gradient\r\n// which seems to give a reasonable approximation\r\n\r\nTHREE.Curve.prototype.getTangent = function( t ) {\r\n\r\n\tvar delta = 0.0001;\r\n\tvar t1 = t - delta;\r\n\tvar t2 = t + delta;\r\n\r\n\t// Capping in case of danger\r\n\r\n\tif ( t1 < 0 ) t1 = 0;\r\n\tif ( t2 > 1 ) t2 = 1;\r\n\r\n\tvar pt1 = this.getPoint( t1 );\r\n\tvar pt2 = this.getPoint( t2 );\r\n\r\n\tvar vec = pt2.clone().sub(pt1);\r\n\treturn vec.normalize();\r\n\r\n};\r\n\r\n\r\nTHREE.Curve.prototype.getTangentAt = function ( u ) {\r\n\r\n\tvar t = this.getUtoTmapping( u );\r\n\treturn this.getTangent( t );\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tLine\r\n **************************************************************/\r\n\r\nTHREE.LineCurve = function ( v1, v2 ) {\r\n\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\r\n};\r\n\r\nTHREE.LineCurve.prototype = Object.create( THREE.Curve.prototype );\r\n\r\nTHREE.LineCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar point = this.v2.clone().sub(this.v1);\r\n\tpoint.multiplyScalar( t ).add( this.v1 );\r\n\r\n\treturn point;\r\n\r\n};\r\n\r\n// Line curve is linear, so we can overwrite default getPointAt\r\n\r\nTHREE.LineCurve.prototype.getPointAt = function ( u ) {\r\n\r\n\treturn this.getPoint( u );\r\n\r\n};\r\n\r\nTHREE.LineCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tangent = this.v2.clone().sub(this.v1);\r\n\r\n\treturn tangent.normalize();\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tQuadratic Bezier curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.QuadraticBezierCurve = function ( v0, v1, v2 ) {\r\n\r\n\tthis.v0 = v0;\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\r\n};\r\n\r\nTHREE.QuadraticBezierCurve.prototype = Object.create( THREE.Curve.prototype );\r\n\r\n\r\nTHREE.QuadraticBezierCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar tx, ty;\r\n\r\n\ttx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x );\r\n\tty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y );\r\n\r\n\treturn new THREE.Vector2( tx, ty );\r\n\r\n};\r\n\r\n\r\nTHREE.QuadraticBezierCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tx, ty;\r\n\r\n\ttx = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.x, this.v1.x, this.v2.x );\r\n\tty = THREE.Curve.Utils.tangentQuadraticBezier( t, this.v0.y, this.v1.y, this.v2.y );\r\n\r\n\t// returns unit vector\r\n\r\n\tvar tangent = new THREE.Vector2( tx, ty );\r\n\ttangent.normalize();\r\n\r\n\treturn tangent;\r\n\r\n};\r\n\r\n\r\n/**************************************************************\r\n *\tCubic Bezier curve\r\n **************************************************************/\r\n\r\nTHREE.CubicBezierCurve = function ( v0, v1, v2, v3 ) {\r\n\r\n\tthis.v0 = v0;\r\n\tthis.v1 = v1;\r\n\tthis.v2 = v2;\r\n\tthis.v3 = v3;\r\n\r\n};\r\n\r\nTHREE.CubicBezierCurve.prototype = Object.create( THREE.Curve.prototype );\r\n\r\nTHREE.CubicBezierCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar tx, ty;\r\n\r\n\ttx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );\r\n\tty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );\r\n\r\n\treturn new THREE.Vector2( tx, ty );\r\n\r\n};\r\n\r\nTHREE.CubicBezierCurve.prototype.getTangent = function( t ) {\r\n\r\n\tvar tx, ty;\r\n\r\n\ttx = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );\r\n\tty = THREE.Curve.Utils.tangentCubicBezier( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );\r\n\r\n\tvar tangent = new THREE.Vector2( tx, ty );\r\n\ttangent.normalize();\r\n\r\n\treturn tangent;\r\n\r\n};\r\n\r\n\r\n/**************************************************************\r\n *\tSpline curve\r\n **************************************************************/\r\n\r\nTHREE.SplineCurve = function ( points /* array of Vector2 */ ) {\r\n\r\n\tthis.points = (points == undefined) ? [] : points;\r\n\r\n};\r\n\r\nTHREE.SplineCurve.prototype = Object.create( THREE.Curve.prototype );\r\n\r\nTHREE.SplineCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar v = new THREE.Vector2();\r\n\tvar c = [];\r\n\tvar points = this.points, point, intPoint, weight;\r\n\tpoint = ( points.length - 1 ) * t;\r\n\r\n\tintPoint = Math.floor( point );\r\n\tweight = point - intPoint;\r\n\r\n\tc[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;\r\n\tc[ 1 ] = intPoint;\r\n\tc[ 2 ] = intPoint > points.length - 2 ? points.length -1 : intPoint + 1;\r\n\tc[ 3 ] = intPoint > points.length - 3 ? points.length -1 : intPoint + 2;\r\n\r\n\tv.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );\r\n\tv.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );\r\n\r\n\treturn v;\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tEllipse curve\r\n **************************************************************/\r\n\r\nTHREE.EllipseCurve = function ( aX, aY, xRadius, yRadius,\r\n\t\t\t\t\t\t\taStartAngle, aEndAngle,\r\n\t\t\t\t\t\t\taClockwise ) {\r\n\r\n\tthis.aX = aX;\r\n\tthis.aY = aY;\r\n\r\n\tthis.xRadius = xRadius;\r\n\tthis.yRadius = yRadius;\r\n\r\n\tthis.aStartAngle = aStartAngle;\r\n\tthis.aEndAngle = aEndAngle;\r\n\r\n\tthis.aClockwise = aClockwise;\r\n\r\n};\r\n\r\nTHREE.EllipseCurve.prototype = Object.create( THREE.Curve.prototype );\r\n\r\nTHREE.EllipseCurve.prototype.getPoint = function ( t ) {\r\n\r\n\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\r\n\r\n\tif ( !this.aClockwise ) {\r\n\r\n\t\tt = 1 - t;\r\n\r\n\t}\r\n\r\n\tvar angle = this.aStartAngle + t * deltaAngle;\r\n\r\n\tvar tx = this.aX + this.xRadius * Math.cos( angle );\r\n\tvar ty = this.aY + this.yRadius * Math.sin( angle );\r\n\r\n\treturn new THREE.Vector2( tx, ty );\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tArc curve\r\n **************************************************************/\r\n\r\nTHREE.ArcCurve = function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\r\n\r\n\tTHREE.EllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\r\n};\r\n\r\nTHREE.ArcCurve.prototype = Object.create( THREE.EllipseCurve.prototype );\r\n\r\n\r\n/**************************************************************\r\n *\tUtils\r\n **************************************************************/\r\n\r\nTHREE.Curve.Utils = {\r\n\r\n\ttangentQuadraticBezier: function ( t, p0, p1, p2 ) {\r\n\r\n\t\treturn 2 * ( 1 - t ) * ( p1 - p0 ) + 2 * t * ( p2 - p1 );\r\n\r\n\t},\r\n\r\n\t// Puay Bing, thanks for helping with this derivative!\r\n\r\n\ttangentCubicBezier: function (t, p0, p1, p2, p3 ) {\r\n\r\n\t\treturn -3 * p0 * (1 - t) * (1 - t) +\r\n\t\t\t3 * p1 * (1 - t) * (1-t) - 6 *t *p1 * (1-t) +\r\n\t\t\t6 * t * p2 * (1-t) - 3 * t * t * p2 +\r\n\t\t\t3 * t * t * p3;\r\n\t},\r\n\r\n\r\n\ttangentSpline: function ( t, p0, p1, p2, p3 ) {\r\n\r\n\t\t// To check if my formulas are correct\r\n\r\n\t\tvar h00 = 6 * t * t - 6 * t; \t// derived from 2t^3 − 3t^2 + 1\r\n\t\tvar h10 = 3 * t * t - 4 * t + 1; // t^3 − 2t^2 + t\r\n\t\tvar h01 = -6 * t * t + 6 * t; \t// − 2t3 + 3t2\r\n\t\tvar h11 = 3 * t * t - 2 * t;\t// t3 − t2\r\n\r\n\t\treturn h00 + h10 + h01 + h11;\r\n\r\n\t},\r\n\r\n\t// Catmull-Rom\r\n\r\n\tinterpolate: function( p0, p1, p2, p3, t ) {\r\n\r\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\r\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\r\n\t\tvar t2 = t * t;\r\n\t\tvar t3 = t * t2;\r\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n// TODO: Transformation for Curves?\r\n\r\n/**************************************************************\r\n *\t3D Curves\r\n **************************************************************/\r\n\r\n// A Factory method for creating new curve subclasses\r\n\r\nTHREE.Curve.create = function ( constructor, getPointFunc ) {\r\n\r\n\tconstructor.prototype = Object.create( THREE.Curve.prototype );\r\n\tconstructor.prototype.getPoint = getPointFunc;\r\n\r\n\treturn constructor;\r\n\r\n};\r\n\r\n\r\n/**************************************************************\r\n *\tLine3D\r\n **************************************************************/\r\n\r\nTHREE.LineCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v1, v2 ) {\r\n\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar r = new THREE.Vector3();\r\n\r\n\r\n\t\tr.subVectors( this.v2, this.v1 ); // diff\r\n\t\tr.multiplyScalar( t );\r\n\t\tr.add( this.v1 );\r\n\r\n\t\treturn r;\r\n\r\n\t}\r\n\r\n);\r\n\r\n\r\n/**************************************************************\r\n *\tQuadratic Bezier 3D curve\r\n **************************************************************/\r\n\r\nTHREE.QuadraticBezierCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v0, v1, v2 ) {\r\n\r\n\t\tthis.v0 = v0;\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar tx, ty, tz;\r\n\r\n\t\ttx = THREE.Shape.Utils.b2( t, this.v0.x, this.v1.x, this.v2.x );\r\n\t\tty = THREE.Shape.Utils.b2( t, this.v0.y, this.v1.y, this.v2.y );\r\n\t\ttz = THREE.Shape.Utils.b2( t, this.v0.z, this.v1.z, this.v2.z );\r\n\r\n\t\treturn new THREE.Vector3( tx, ty, tz );\r\n\r\n\t}\r\n\r\n);\r\n\r\n\r\n\r\n/**************************************************************\r\n *\tCubic Bezier 3D curve\r\n **************************************************************/\r\n\r\nTHREE.CubicBezierCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( v0, v1, v2, v3 ) {\r\n\r\n\t\tthis.v0 = v0;\r\n\t\tthis.v1 = v1;\r\n\t\tthis.v2 = v2;\r\n\t\tthis.v3 = v3;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar tx, ty, tz;\r\n\r\n\t\ttx = THREE.Shape.Utils.b3( t, this.v0.x, this.v1.x, this.v2.x, this.v3.x );\r\n\t\tty = THREE.Shape.Utils.b3( t, this.v0.y, this.v1.y, this.v2.y, this.v3.y );\r\n\t\ttz = THREE.Shape.Utils.b3( t, this.v0.z, this.v1.z, this.v2.z, this.v3.z );\r\n\r\n\t\treturn new THREE.Vector3( tx, ty, tz );\r\n\r\n\t}\r\n\r\n);\r\n\r\n\r\n\r\n/**************************************************************\r\n *\tSpline 3D curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.SplineCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( points /* array of Vector3 */) {\r\n\r\n\t\tthis.points = (points == undefined) ? [] : points;\r\n\r\n\t},\r\n\r\n\tfunction ( t ) {\r\n\r\n\t\tvar v = new THREE.Vector3();\r\n\t\tvar c = [];\r\n\t\tvar points = this.points, point, intPoint, weight;\r\n\t\tpoint = ( points.length - 1 ) * t;\r\n\r\n\t\tintPoint = Math.floor( point );\r\n\t\tweight = point - intPoint;\r\n\r\n\t\tc[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;\r\n\t\tc[ 1 ] = intPoint;\r\n\t\tc[ 2 ] = intPoint > points.length - 2 ? points.length - 1 : intPoint + 1;\r\n\t\tc[ 3 ] = intPoint > points.length - 3 ? points.length - 1 : intPoint + 2;\r\n\r\n\t\tvar pt0 = points[ c[0] ],\r\n\t\t\tpt1 = points[ c[1] ],\r\n\t\t\tpt2 = points[ c[2] ],\r\n\t\t\tpt3 = points[ c[3] ];\r\n\r\n\t\tv.x = THREE.Curve.Utils.interpolate(pt0.x, pt1.x, pt2.x, pt3.x, weight);\r\n\t\tv.y = THREE.Curve.Utils.interpolate(pt0.y, pt1.y, pt2.y, pt3.y, weight);\r\n\t\tv.z = THREE.Curve.Utils.interpolate(pt0.z, pt1.z, pt2.z, pt3.z, weight);\r\n\r\n\t\treturn v;\r\n\r\n\t}\r\n\r\n);\r\n\r\n\r\n// THREE.SplineCurve3.prototype.getTangent = function(t) {\r\n// \t\tvar v = new THREE.Vector3();\r\n// \t\tvar c = [];\r\n// \t\tvar points = this.points, point, intPoint, weight;\r\n// \t\tpoint = ( points.length - 1 ) * t;\r\n\r\n// \t\tintPoint = Math.floor( point );\r\n// \t\tweight = point - intPoint;\r\n\r\n// \t\tc[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;\r\n// \t\tc[ 1 ] = intPoint;\r\n// \t\tc[ 2 ] = intPoint > points.length - 2 ? points.length - 1 : intPoint + 1;\r\n// \t\tc[ 3 ] = intPoint > points.length - 3 ? points.length - 1 : intPoint + 2;\r\n\r\n// \t\tvar pt0 = points[ c[0] ],\r\n// \t\t\tpt1 = points[ c[1] ],\r\n// \t\t\tpt2 = points[ c[2] ],\r\n// \t\t\tpt3 = points[ c[3] ];\r\n\r\n// \t// t = weight;\r\n// \tv.x = THREE.Curve.Utils.tangentSpline( t, pt0.x, pt1.x, pt2.x, pt3.x );\r\n// \tv.y = THREE.Curve.Utils.tangentSpline( t, pt0.y, pt1.y, pt2.y, pt3.y );\r\n// \tv.z = THREE.Curve.Utils.tangentSpline( t, pt0.z, pt1.z, pt2.z, pt3.z );\r\n\r\n// \treturn v;\r\n\r\n// }\r\n\r\n/**************************************************************\r\n *\tClosed Spline 3D curve\r\n **************************************************************/\r\n\r\n\r\nTHREE.ClosedSplineCurve3 = THREE.Curve.create(\r\n\r\n\tfunction ( points /* array of Vector3 */) {\r\n\r\n\t\tthis.points = (points == undefined) ? [] : points;\r\n\r\n\t},\r\n\r\n function ( t ) {\r\n\r\n var v = new THREE.Vector3();\r\n var c = [];\r\n var points = this.points, point, intPoint, weight;\r\n point = ( points.length - 0 ) * t;\r\n // This needs to be from 0-length +1\r\n\r\n intPoint = Math.floor( point );\r\n weight = point - intPoint;\r\n\r\n intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\r\n c[ 0 ] = ( intPoint - 1 ) % points.length;\r\n c[ 1 ] = ( intPoint ) % points.length;\r\n c[ 2 ] = ( intPoint + 1 ) % points.length;\r\n c[ 3 ] = ( intPoint + 2 ) % points.length;\r\n\r\n v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );\r\n v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );\r\n v.z = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].z, points[ c[ 1 ] ].z, points[ c[ 2 ] ].z, points[ c[ 3 ] ].z, weight );\r\n\r\n return v;\r\n\r\n }\r\n\r\n);\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n *\r\n **/\r\n\r\n/**************************************************************\r\n *\tCurved Path - a curve path is simply a array of connected\r\n * curves, but retains the api of a curve\r\n **************************************************************/\r\n\r\nTHREE.CurvePath = function () {\r\n\r\n\tthis.curves = [];\r\n\tthis.bends = [];\r\n\t\r\n\tthis.autoClose = false; // Automatically closes the path\r\n};\r\n\r\nTHREE.CurvePath.prototype = Object.create( THREE.Curve.prototype );\r\n\r\nTHREE.CurvePath.prototype.add = function ( curve ) {\r\n\r\n\tthis.curves.push( curve );\r\n\r\n};\r\n\r\nTHREE.CurvePath.prototype.checkConnection = function() {\r\n\t// TODO\r\n\t// If the ending of curve is not connected to the starting\r\n\t// or the next curve, then, this is not a real path\r\n};\r\n\r\nTHREE.CurvePath.prototype.closePath = function() {\r\n\t// TODO Test\r\n\t// and verify for vector3 (needs to implement equals)\r\n\t// Add a line curve if start and end of lines are not connected\r\n\tvar startPoint = this.curves[0].getPoint(0);\r\n\tvar endPoint = this.curves[this.curves.length-1].getPoint(1);\r\n\t\r\n\tif (!startPoint.equals(endPoint)) {\r\n\t\tthis.curves.push( new THREE.LineCurve(endPoint, startPoint) );\r\n\t}\r\n\t\r\n};\r\n\r\n// To get accurate point with reference to\r\n// entire path distance at time t,\r\n// following has to be done:\r\n\r\n// 1. Length of each sub path have to be known\r\n// 2. Locate and identify type of curve\r\n// 3. Get t for the curve\r\n// 4. Return curve.getPointAt(t')\r\n\r\nTHREE.CurvePath.prototype.getPoint = function( t ) {\r\n\r\n\tvar d = t * this.getLength();\r\n\tvar curveLengths = this.getCurveLengths();\r\n\tvar i = 0, diff, curve;\r\n\r\n\t// To think about boundaries points.\r\n\r\n\twhile ( i < curveLengths.length ) {\r\n\r\n\t\tif ( curveLengths[ i ] >= d ) {\r\n\r\n\t\t\tdiff = curveLengths[ i ] - d;\r\n\t\t\tcurve = this.curves[ i ];\r\n\r\n\t\t\tvar u = 1 - diff / curve.getLength();\r\n\r\n\t\t\treturn curve.getPointAt( u );\r\n\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\ti ++;\r\n\r\n\t}\r\n\r\n\treturn null;\r\n\r\n\t// loop where sum != 0, sum > d , sum+1 maxX ) maxX = p.x;\r\n\t\telse if ( p.x < minX ) minX = p.x;\r\n\r\n\t\tif ( p.y > maxY ) maxY = p.y;\r\n\t\telse if ( p.y < minY ) minY = p.y;\r\n\r\n\t\tif ( v3 ) {\r\n\r\n\t\t\tif ( p.z > maxZ ) maxZ = p.z;\r\n\t\t\telse if ( p.z < minZ ) minZ = p.z;\r\n\r\n\t\t}\r\n\r\n\t\tsum.add( p );\r\n\r\n\t}\r\n\r\n\tvar ret = {\r\n\r\n\t\tminX: minX,\r\n\t\tminY: minY,\r\n\t\tmaxX: maxX,\r\n\t\tmaxY: maxY,\r\n\t\tcentroid: sum.divideScalar( il )\r\n\r\n\t};\r\n\r\n\tif ( v3 ) {\r\n\r\n\t\tret.maxZ = maxZ;\r\n\t\tret.minZ = minZ;\r\n\r\n\t}\r\n\r\n\treturn ret;\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tCreate Geometries Helpers\r\n **************************************************************/\r\n\r\n/// Generate geometry from path points (for Line or ParticleSystem objects)\r\n\r\nTHREE.CurvePath.prototype.createPointsGeometry = function( divisions ) {\r\n\r\n\tvar pts = this.getPoints( divisions, true );\r\n\treturn this.createGeometry( pts );\r\n\r\n};\r\n\r\n// Generate geometry from equidistance sampling along the path\r\n\r\nTHREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) {\r\n\r\n\tvar pts = this.getSpacedPoints( divisions, true );\r\n\treturn this.createGeometry( pts );\r\n\r\n};\r\n\r\nTHREE.CurvePath.prototype.createGeometry = function( points ) {\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\r\n\tfor ( var i = 0; i < points.length; i ++ ) {\r\n\r\n\t\tgeometry.vertices.push( new THREE.Vector3( points[ i ].x, points[ i ].y, points[ i ].z || 0) );\r\n\r\n\t}\r\n\r\n\treturn geometry;\r\n\r\n};\r\n\r\n\r\n/**************************************************************\r\n *\tBend / Wrap Helper Methods\r\n **************************************************************/\r\n\r\n// Wrap path / Bend modifiers?\r\n\r\nTHREE.CurvePath.prototype.addWrapPath = function ( bendpath ) {\r\n\r\n\tthis.bends.push( bendpath );\r\n\r\n};\r\n\r\nTHREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) {\r\n\r\n\tvar oldPts = this.getPoints( segments ); // getPoints getSpacedPoints\r\n\tvar i, il;\r\n\r\n\tif ( !bends ) {\r\n\r\n\t\tbends = this.bends;\r\n\r\n\t}\r\n\r\n\tfor ( i = 0, il = bends.length; i < il; i ++ ) {\r\n\r\n\t\toldPts = this.getWrapPoints( oldPts, bends[ i ] );\r\n\r\n\t}\r\n\r\n\treturn oldPts;\r\n\r\n};\r\n\r\nTHREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) {\r\n\r\n\tvar oldPts = this.getSpacedPoints( segments );\r\n\r\n\tvar i, il;\r\n\r\n\tif ( !bends ) {\r\n\r\n\t\tbends = this.bends;\r\n\r\n\t}\r\n\r\n\tfor ( i = 0, il = bends.length; i < il; i ++ ) {\r\n\r\n\t\toldPts = this.getWrapPoints( oldPts, bends[ i ] );\r\n\r\n\t}\r\n\r\n\treturn oldPts;\r\n\r\n};\r\n\r\n// This returns getPoints() bend/wrapped around the contour of a path.\r\n// Read http://www.planetclegg.com/projects/WarpingTextToSplines.html\r\n\r\nTHREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) {\r\n\r\n\tvar bounds = this.getBoundingBox();\r\n\r\n\tvar i, il, p, oldX, oldY, xNorm;\r\n\r\n\tfor ( i = 0, il = oldPts.length; i < il; i ++ ) {\r\n\r\n\t\tp = oldPts[ i ];\r\n\r\n\t\toldX = p.x;\r\n\t\toldY = p.y;\r\n\r\n\t\txNorm = oldX / bounds.maxX;\r\n\r\n\t\t// If using actual distance, for length > path, requires line extrusions\r\n\t\t//xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance\r\n\r\n\t\txNorm = path.getUtoTmapping( xNorm, oldX );\r\n\r\n\t\t// check for out of bounds?\r\n\r\n\t\tvar pathPt = path.getPoint( xNorm );\r\n\t\tvar normal = path.getNormalVector( xNorm ).multiplyScalar( oldY );\r\n\r\n\t\tp.x = pathPt.x + normal.x;\r\n\t\tp.y = pathPt.y + normal.y;\r\n\r\n\t}\r\n\r\n\treturn oldPts;\r\n\r\n};\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.Gyroscope = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n};\r\n\r\nTHREE.Gyroscope.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.Gyroscope.prototype.updateMatrixWorld = function ( force ) {\r\n\r\n\tthis.matrixAutoUpdate && this.updateMatrix();\r\n\r\n\t// update matrixWorld\r\n\r\n\tif ( this.matrixWorldNeedsUpdate || force ) {\r\n\r\n\t\tif ( this.parent ) {\r\n\r\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\r\n\r\n\t\t\tthis.matrixWorld.decompose( this.translationWorld, this.rotationWorld, this.scaleWorld );\r\n\t\t\tthis.matrix.decompose( this.translationObject, this.rotationObject, this.scaleObject );\r\n\r\n\t\t\tthis.matrixWorld.makeFromPositionQuaternionScale( this.translationWorld, this.rotationObject, this.scaleWorld );\r\n\r\n\r\n\t\t} else {\r\n\r\n\t\t\tthis.matrixWorld.copy( this.matrix );\r\n\r\n\t\t}\r\n\r\n\r\n\t\tthis.matrixWorldNeedsUpdate = false;\r\n\r\n\t\tforce = true;\r\n\r\n\t}\r\n\r\n\t// update children\r\n\r\n\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\r\n\r\n\t\tthis.children[ i ].updateMatrixWorld( force );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Gyroscope.prototype.translationWorld = new THREE.Vector3();\r\nTHREE.Gyroscope.prototype.translationObject = new THREE.Vector3();\r\nTHREE.Gyroscope.prototype.rotationWorld = new THREE.Quaternion();\r\nTHREE.Gyroscope.prototype.rotationObject = new THREE.Quaternion();\r\nTHREE.Gyroscope.prototype.scaleWorld = new THREE.Vector3();\r\nTHREE.Gyroscope.prototype.scaleObject = new THREE.Vector3();\r\n\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * Creates free form 2d path using series of points, lines or curves.\r\n *\r\n **/\r\n\r\nTHREE.Path = function ( points ) {\r\n\r\n\tTHREE.CurvePath.call(this);\r\n\r\n\tthis.actions = [];\r\n\r\n\tif ( points ) {\r\n\r\n\t\tthis.fromPoints( points );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.Path.prototype = Object.create( THREE.CurvePath.prototype );\r\n\r\nTHREE.PathActions = {\r\n\r\n\tMOVE_TO: 'moveTo',\r\n\tLINE_TO: 'lineTo',\r\n\tQUADRATIC_CURVE_TO: 'quadraticCurveTo', // Bezier quadratic curve\r\n\tBEZIER_CURVE_TO: 'bezierCurveTo', \t\t// Bezier cubic curve\r\n\tCSPLINE_THRU: 'splineThru',\t\t\t\t// Catmull-rom spline\r\n\tARC: 'arc',\t\t\t\t\t\t\t\t// Circle\r\n\tELLIPSE: 'ellipse'\r\n};\r\n\r\n// TODO Clean up PATH API\r\n\r\n// Create path using straight lines to connect all points\r\n// - vectors: array of Vector2\r\n\r\nTHREE.Path.prototype.fromPoints = function ( vectors ) {\r\n\r\n\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\r\n\r\n\tfor ( var v = 1, vlen = vectors.length; v < vlen; v ++ ) {\r\n\r\n\t\tthis.lineTo( vectors[ v ].x, vectors[ v ].y );\r\n\r\n\t};\r\n\r\n};\r\n\r\n// startPath() endPath()?\r\n\r\nTHREE.Path.prototype.moveTo = function ( x, y ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\tthis.actions.push( { action: THREE.PathActions.MOVE_TO, args: args } );\r\n\r\n};\r\n\r\nTHREE.Path.prototype.lineTo = function ( x, y ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\r\n\tvar lastargs = this.actions[ this.actions.length - 1 ].args;\r\n\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n\r\n\tvar curve = new THREE.LineCurve( new THREE.Vector2( x0, y0 ), new THREE.Vector2( x, y ) );\r\n\tthis.curves.push( curve );\r\n\r\n\tthis.actions.push( { action: THREE.PathActions.LINE_TO, args: args } );\r\n\r\n};\r\n\r\nTHREE.Path.prototype.quadraticCurveTo = function( aCPx, aCPy, aX, aY ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\r\n\tvar lastargs = this.actions[ this.actions.length - 1 ].args;\r\n\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n\r\n\tvar curve = new THREE.QuadraticBezierCurve( new THREE.Vector2( x0, y0 ),\r\n\t\t\t\t\t\t\t\t\t\t\t\tnew THREE.Vector2( aCPx, aCPy ),\r\n\t\t\t\t\t\t\t\t\t\t\t\tnew THREE.Vector2( aX, aY ) );\r\n\tthis.curves.push( curve );\r\n\r\n\tthis.actions.push( { action: THREE.PathActions.QUADRATIC_CURVE_TO, args: args } );\r\n\r\n};\r\n\r\nTHREE.Path.prototype.bezierCurveTo = function( aCP1x, aCP1y,\r\n aCP2x, aCP2y,\r\n aX, aY ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\r\n\tvar lastargs = this.actions[ this.actions.length - 1 ].args;\r\n\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n\r\n\tvar curve = new THREE.CubicBezierCurve( new THREE.Vector2( x0, y0 ),\r\n\t\t\t\t\t\t\t\t\t\t\tnew THREE.Vector2( aCP1x, aCP1y ),\r\n\t\t\t\t\t\t\t\t\t\t\tnew THREE.Vector2( aCP2x, aCP2y ),\r\n\t\t\t\t\t\t\t\t\t\t\tnew THREE.Vector2( aX, aY ) );\r\n\tthis.curves.push( curve );\r\n\r\n\tthis.actions.push( { action: THREE.PathActions.BEZIER_CURVE_TO, args: args } );\r\n\r\n};\r\n\r\nTHREE.Path.prototype.splineThru = function( pts /*Array of Vector*/ ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\tvar lastargs = this.actions[ this.actions.length - 1 ].args;\r\n\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n//---\r\n\tvar npts = [ new THREE.Vector2( x0, y0 ) ];\r\n\tArray.prototype.push.apply( npts, pts );\r\n\r\n\tvar curve = new THREE.SplineCurve( npts );\r\n\tthis.curves.push( curve );\r\n\r\n\tthis.actions.push( { action: THREE.PathActions.CSPLINE_THRU, args: args } );\r\n\r\n};\r\n\r\n// FUTURE: Change the API or follow canvas API?\r\n\r\nTHREE.Path.prototype.arc = function ( aX, aY, aRadius,\r\n\t\t\t\t\t\t\t\t\t aStartAngle, aEndAngle, aClockwise ) {\r\n\r\n\tvar lastargs = this.actions[ this.actions.length - 1].args;\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n\r\n\tthis.absarc(aX + x0, aY + y0, aRadius,\r\n\t\taStartAngle, aEndAngle, aClockwise );\r\n\t\r\n };\r\n\r\n THREE.Path.prototype.absarc = function ( aX, aY, aRadius,\r\n\t\t\t\t\t\t\t\t\t aStartAngle, aEndAngle, aClockwise ) {\r\n\tthis.absellipse(aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise);\r\n };\r\n \r\nTHREE.Path.prototype.ellipse = function ( aX, aY, xRadius, yRadius,\r\n\t\t\t\t\t\t\t\t\t aStartAngle, aEndAngle, aClockwise ) {\r\n\r\n\tvar lastargs = this.actions[ this.actions.length - 1].args;\r\n\tvar x0 = lastargs[ lastargs.length - 2 ];\r\n\tvar y0 = lastargs[ lastargs.length - 1 ];\r\n\r\n\tthis.absellipse(aX + x0, aY + y0, xRadius, yRadius,\r\n\t\taStartAngle, aEndAngle, aClockwise );\r\n\r\n };\r\n \r\n\r\nTHREE.Path.prototype.absellipse = function ( aX, aY, xRadius, yRadius,\r\n\t\t\t\t\t\t\t\t\t aStartAngle, aEndAngle, aClockwise ) {\r\n\r\n\tvar args = Array.prototype.slice.call( arguments );\r\n\tvar curve = new THREE.EllipseCurve( aX, aY, xRadius, yRadius,\r\n\t\t\t\t\t\t\t\t\taStartAngle, aEndAngle, aClockwise );\r\n\tthis.curves.push( curve );\r\n\r\n\tvar lastPoint = curve.getPoint(aClockwise ? 1 : 0);\r\n\targs.push(lastPoint.x);\r\n\targs.push(lastPoint.y);\r\n\r\n\tthis.actions.push( { action: THREE.PathActions.ELLIPSE, args: args } );\r\n\r\n };\r\n\r\nTHREE.Path.prototype.getSpacedPoints = function ( divisions, closedPath ) {\r\n\r\n\tif ( ! divisions ) divisions = 40;\r\n\r\n\tvar points = [];\r\n\r\n\tfor ( var i = 0; i < divisions; i ++ ) {\r\n\r\n\t\tpoints.push( this.getPoint( i / divisions ) );\r\n\r\n\t\t//if( !this.getPoint( i / divisions ) ) throw \"DIE\";\r\n\r\n\t}\r\n\r\n\t// if ( closedPath ) {\r\n\t//\r\n\t// \tpoints.push( points[ 0 ] );\r\n\t//\r\n\t// }\r\n\r\n\treturn points;\r\n\r\n};\r\n\r\n/* Return an array of vectors based on contour of the path */\r\n\r\nTHREE.Path.prototype.getPoints = function( divisions, closedPath ) {\r\n\r\n\tif (this.useSpacedPoints) {\r\n\t\tconsole.log('tata');\r\n\t\treturn this.getSpacedPoints( divisions, closedPath );\r\n\t}\r\n\r\n\tdivisions = divisions || 12;\r\n\r\n\tvar points = [];\r\n\r\n\tvar i, il, item, action, args;\r\n\tvar cpx, cpy, cpx2, cpy2, cpx1, cpy1, cpx0, cpy0,\r\n\t\tlaste, j,\r\n\t\tt, tx, ty;\r\n\r\n\tfor ( i = 0, il = this.actions.length; i < il; i ++ ) {\r\n\r\n\t\titem = this.actions[ i ];\r\n\r\n\t\taction = item.action;\r\n\t\targs = item.args;\r\n\r\n\t\tswitch( action ) {\r\n\r\n\t\tcase THREE.PathActions.MOVE_TO:\r\n\r\n\t\t\tpoints.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) );\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase THREE.PathActions.LINE_TO:\r\n\r\n\t\t\tpoints.push( new THREE.Vector2( args[ 0 ], args[ 1 ] ) );\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase THREE.PathActions.QUADRATIC_CURVE_TO:\r\n\r\n\t\t\tcpx = args[ 2 ];\r\n\t\t\tcpy = args[ 3 ];\r\n\r\n\t\t\tcpx1 = args[ 0 ];\r\n\t\t\tcpy1 = args[ 1 ];\r\n\r\n\t\t\tif ( points.length > 0 ) {\r\n\r\n\t\t\t\tlaste = points[ points.length - 1 ];\r\n\r\n\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\t\tcpx0 = laste[ laste.length - 2 ];\r\n\t\t\t\tcpy0 = laste[ laste.length - 1 ];\r\n\r\n\t\t\t}\r\n\r\n\t\t\tfor ( j = 1; j <= divisions; j ++ ) {\r\n\r\n\t\t\t\tt = j / divisions;\r\n\r\n\t\t\t\ttx = THREE.Shape.Utils.b2( t, cpx0, cpx1, cpx );\r\n\t\t\t\tty = THREE.Shape.Utils.b2( t, cpy0, cpy1, cpy );\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t \t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase THREE.PathActions.BEZIER_CURVE_TO:\r\n\r\n\t\t\tcpx = args[ 4 ];\r\n\t\t\tcpy = args[ 5 ];\r\n\r\n\t\t\tcpx1 = args[ 0 ];\r\n\t\t\tcpy1 = args[ 1 ];\r\n\r\n\t\t\tcpx2 = args[ 2 ];\r\n\t\t\tcpy2 = args[ 3 ];\r\n\r\n\t\t\tif ( points.length > 0 ) {\r\n\r\n\t\t\t\tlaste = points[ points.length - 1 ];\r\n\r\n\t\t\t\tcpx0 = laste.x;\r\n\t\t\t\tcpy0 = laste.y;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\t\tcpx0 = laste[ laste.length - 2 ];\r\n\t\t\t\tcpy0 = laste[ laste.length - 1 ];\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t\tfor ( j = 1; j <= divisions; j ++ ) {\r\n\r\n\t\t\t\tt = j / divisions;\r\n\r\n\t\t\t\ttx = THREE.Shape.Utils.b3( t, cpx0, cpx1, cpx2, cpx );\r\n\t\t\t\tty = THREE.Shape.Utils.b3( t, cpy0, cpy1, cpy2, cpy );\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase THREE.PathActions.CSPLINE_THRU:\r\n\r\n\t\t\tlaste = this.actions[ i - 1 ].args;\r\n\r\n\t\t\tvar last = new THREE.Vector2( laste[ laste.length - 2 ], laste[ laste.length - 1 ] );\r\n\t\t\tvar spts = [ last ];\r\n\r\n\t\t\tvar n = divisions * args[ 0 ].length;\r\n\r\n\t\t\tspts = spts.concat( args[ 0 ] );\r\n\r\n\t\t\tvar spline = new THREE.SplineCurve( spts );\r\n\r\n\t\t\tfor ( j = 1; j <= n; j ++ ) {\r\n\r\n\t\t\t\tpoints.push( spline.getPointAt( j / n ) ) ;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tbreak;\r\n\r\n\t\tcase THREE.PathActions.ARC:\r\n\r\n\t\t\tvar aX = args[ 0 ], aY = args[ 1 ],\r\n\t\t\t\taRadius = args[ 2 ],\r\n\t\t\t\taStartAngle = args[ 3 ], aEndAngle = args[ 4 ],\r\n\t\t\t\taClockwise = !!args[ 5 ];\r\n\r\n\t\t\tvar deltaAngle = aEndAngle - aStartAngle;\r\n\t\t\tvar angle;\r\n\t\t\tvar tdivisions = divisions * 2;\r\n\r\n\t\t\tfor ( j = 1; j <= tdivisions; j ++ ) {\r\n\r\n\t\t\t\tt = j / tdivisions;\r\n\r\n\t\t\t\tif ( ! aClockwise ) {\r\n\r\n\t\t\t\t\tt = 1 - t;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tangle = aStartAngle + t * deltaAngle;\r\n\r\n\t\t\t\ttx = aX + aRadius * Math.cos( angle );\r\n\t\t\t\tty = aY + aRadius * Math.sin( angle );\r\n\r\n\t\t\t\t//console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//console.log(points);\r\n\r\n\t\t break;\r\n\t\t \r\n\t\tcase THREE.PathActions.ELLIPSE:\r\n\r\n\t\t\tvar aX = args[ 0 ], aY = args[ 1 ],\r\n\t\t\t\txRadius = args[ 2 ],\r\n\t\t\t\tyRadius = args[ 3 ],\r\n\t\t\t\taStartAngle = args[ 4 ], aEndAngle = args[ 5 ],\r\n\t\t\t\taClockwise = !!args[ 6 ];\r\n\r\n\r\n\t\t\tvar deltaAngle = aEndAngle - aStartAngle;\r\n\t\t\tvar angle;\r\n\t\t\tvar tdivisions = divisions * 2;\r\n\r\n\t\t\tfor ( j = 1; j <= tdivisions; j ++ ) {\r\n\r\n\t\t\t\tt = j / tdivisions;\r\n\r\n\t\t\t\tif ( ! aClockwise ) {\r\n\r\n\t\t\t\t\tt = 1 - t;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tangle = aStartAngle + t * deltaAngle;\r\n\r\n\t\t\t\ttx = aX + xRadius * Math.cos( angle );\r\n\t\t\t\tty = aY + yRadius * Math.sin( angle );\r\n\r\n\t\t\t\t//console.log('t', t, 'angle', angle, 'tx', tx, 'ty', ty);\r\n\r\n\t\t\t\tpoints.push( new THREE.Vector2( tx, ty ) );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//console.log(points);\r\n\r\n\t\t break;\r\n\r\n\t\t} // end switch\r\n\r\n\t}\r\n\r\n\r\n\r\n\t// Normalize to remove the closing point by default.\r\n\tvar lastPoint = points[ points.length - 1];\r\n\tvar EPSILON = 0.0000000001;\r\n\tif ( Math.abs(lastPoint.x - points[ 0 ].x) < EPSILON &&\r\n Math.abs(lastPoint.y - points[ 0 ].y) < EPSILON)\r\n\t\tpoints.splice( points.length - 1, 1);\r\n\tif ( closedPath ) {\r\n\r\n\t\tpoints.push( points[ 0 ] );\r\n\r\n\t}\r\n\r\n\treturn points;\r\n\r\n};\r\n\r\n// Breaks path into shapes\r\n\r\nTHREE.Path.prototype.toShapes = function() {\r\n\r\n\tvar i, il, item, action, args;\r\n\r\n\tvar subPaths = [], lastPath = new THREE.Path();\r\n\r\n\tfor ( i = 0, il = this.actions.length; i < il; i ++ ) {\r\n\r\n\t\titem = this.actions[ i ];\r\n\r\n\t\targs = item.args;\r\n\t\taction = item.action;\r\n\r\n\t\tif ( action == THREE.PathActions.MOVE_TO ) {\r\n\r\n\t\t\tif ( lastPath.actions.length != 0 ) {\r\n\r\n\t\t\t\tsubPaths.push( lastPath );\r\n\t\t\t\tlastPath = new THREE.Path();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tlastPath[ action ].apply( lastPath, args );\r\n\r\n\t}\r\n\r\n\tif ( lastPath.actions.length != 0 ) {\r\n\r\n\t\tsubPaths.push( lastPath );\r\n\r\n\t}\r\n\r\n\t// console.log(subPaths);\r\n\r\n\tif ( subPaths.length == 0 ) return [];\r\n\r\n\tvar tmpPath, tmpShape, shapes = [];\r\n\r\n\tvar holesFirst = !THREE.Shape.Utils.isClockWise( subPaths[ 0 ].getPoints() );\r\n\t// console.log(\"Holes first\", holesFirst);\r\n\r\n\tif ( subPaths.length == 1) {\r\n\t\ttmpPath = subPaths[0];\r\n\t\ttmpShape = new THREE.Shape();\r\n\t\ttmpShape.actions = tmpPath.actions;\r\n\t\ttmpShape.curves = tmpPath.curves;\r\n\t\tshapes.push( tmpShape );\r\n\t\treturn shapes;\r\n\t};\r\n\r\n\tif ( holesFirst ) {\r\n\r\n\t\ttmpShape = new THREE.Shape();\r\n\r\n\t\tfor ( i = 0, il = subPaths.length; i < il; i ++ ) {\r\n\r\n\t\t\ttmpPath = subPaths[ i ];\r\n\r\n\t\t\tif ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) {\r\n\r\n\t\t\t\ttmpShape.actions = tmpPath.actions;\r\n\t\t\t\ttmpShape.curves = tmpPath.curves;\r\n\r\n\t\t\t\tshapes.push( tmpShape );\r\n\t\t\t\ttmpShape = new THREE.Shape();\r\n\r\n\t\t\t\t//console.log('cw', i);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttmpShape.holes.push( tmpPath );\r\n\r\n\t\t\t\t//console.log('ccw', i);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t} else {\r\n\r\n\t\t// Shapes first\r\n\r\n\t\tfor ( i = 0, il = subPaths.length; i < il; i ++ ) {\r\n\r\n\t\t\ttmpPath = subPaths[ i ];\r\n\r\n\t\t\tif ( THREE.Shape.Utils.isClockWise( tmpPath.getPoints() ) ) {\r\n\r\n\r\n\t\t\t\tif ( tmpShape ) shapes.push( tmpShape );\r\n\r\n\t\t\t\ttmpShape = new THREE.Shape();\r\n\t\t\t\ttmpShape.actions = tmpPath.actions;\r\n\t\t\t\ttmpShape.curves = tmpPath.curves;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\ttmpShape.holes.push( tmpPath );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tshapes.push( tmpShape );\r\n\r\n\t}\r\n\r\n\t//console.log(\"shape\", shapes);\r\n\r\n\treturn shapes;\r\n\r\n};\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * Defines a 2d shape plane using paths.\r\n **/\r\n\r\n// STEP 1 Create a path.\r\n// STEP 2 Turn path into shape.\r\n// STEP 3 ExtrudeGeometry takes in Shape/Shapes\r\n// STEP 3a - Extract points from each shape, turn to vertices\r\n// STEP 3b - Triangulate each shape, add faces.\r\n\r\nTHREE.Shape = function () {\r\n\r\n\tTHREE.Path.apply( this, arguments );\r\n\tthis.holes = [];\r\n\r\n};\r\n\r\nTHREE.Shape.prototype = Object.create( THREE.Path.prototype );\r\n\r\n// Convenience method to return ExtrudeGeometry\r\n\r\nTHREE.Shape.prototype.extrude = function ( options ) {\r\n\r\n\tvar extruded = new THREE.ExtrudeGeometry( this, options );\r\n\treturn extruded;\r\n\r\n};\r\n\r\n// Convenience method to return ShapeGeometry\r\n\r\nTHREE.Shape.prototype.makeGeometry = function ( options ) {\r\n\r\n\tvar geometry = new THREE.ShapeGeometry( this, options );\r\n\treturn geometry;\r\n\r\n};\r\n\r\n// Get points of holes\r\n\r\nTHREE.Shape.prototype.getPointsHoles = function ( divisions ) {\r\n\r\n\tvar i, il = this.holes.length, holesPts = [];\r\n\r\n\tfor ( i = 0; i < il; i ++ ) {\r\n\r\n\t\tholesPts[ i ] = this.holes[ i ].getTransformedPoints( divisions, this.bends );\r\n\r\n\t}\r\n\r\n\treturn holesPts;\r\n\r\n};\r\n\r\n// Get points of holes (spaced by regular distance)\r\n\r\nTHREE.Shape.prototype.getSpacedPointsHoles = function ( divisions ) {\r\n\r\n\tvar i, il = this.holes.length, holesPts = [];\r\n\r\n\tfor ( i = 0; i < il; i ++ ) {\r\n\r\n\t\tholesPts[ i ] = this.holes[ i ].getTransformedSpacedPoints( divisions, this.bends );\r\n\r\n\t}\r\n\r\n\treturn holesPts;\r\n\r\n};\r\n\r\n\r\n// Get points of shape and holes (keypoints based on segments parameter)\r\n\r\nTHREE.Shape.prototype.extractAllPoints = function ( divisions ) {\r\n\r\n\treturn {\r\n\r\n\t\tshape: this.getTransformedPoints( divisions ),\r\n\t\tholes: this.getPointsHoles( divisions )\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.Shape.prototype.extractPoints = function ( divisions ) {\r\n\r\n\tif (this.useSpacedPoints) {\r\n\t\treturn this.extractAllSpacedPoints(divisions);\r\n\t}\r\n\r\n\treturn this.extractAllPoints(divisions);\r\n\r\n};\r\n\r\n//\r\n// THREE.Shape.prototype.extractAllPointsWithBend = function ( divisions, bend ) {\r\n//\r\n// \treturn {\r\n//\r\n// \t\tshape: this.transform( bend, divisions ),\r\n// \t\tholes: this.getPointsHoles( divisions, bend )\r\n//\r\n// \t};\r\n//\r\n// };\r\n\r\n// Get points of shape and holes (spaced by regular distance)\r\n\r\nTHREE.Shape.prototype.extractAllSpacedPoints = function ( divisions ) {\r\n\r\n\treturn {\r\n\r\n\t\tshape: this.getTransformedSpacedPoints( divisions ),\r\n\t\tholes: this.getSpacedPointsHoles( divisions )\r\n\r\n\t};\r\n\r\n};\r\n\r\n/**************************************************************\r\n *\tUtils\r\n **************************************************************/\r\n\r\nTHREE.Shape.Utils = {\r\n\r\n\t/*\r\n\t\tcontour - array of vector2 for contour\r\n\t\tholes - array of array of vector2\r\n\t*/\r\n\r\n\tremoveHoles: function ( contour, holes ) {\r\n\r\n\t\tvar shape = contour.concat(); // work on this shape\r\n\t\tvar allpoints = shape.concat();\r\n\r\n\t\t/* For each isolated shape, find the closest points and break to the hole to allow triangulation */\r\n\r\n\r\n\t\tvar prevShapeVert, nextShapeVert,\r\n\t\t\tprevHoleVert, nextHoleVert,\r\n\t\t\tholeIndex, shapeIndex,\r\n\t\t\tshapeId, shapeGroup,\r\n\t\t\th, h2,\r\n\t\t\thole, shortest, d,\r\n\t\t\tp, pts1, pts2,\r\n\t\t\ttmpShape1, tmpShape2,\r\n\t\t\ttmpHole1, tmpHole2,\r\n\t\t\tverts = [];\r\n\r\n\t\tfor ( h = 0; h < holes.length; h ++ ) {\r\n\r\n\t\t\thole = holes[ h ];\r\n\r\n\t\t\t/*\r\n\t\t\tshapeholes[ h ].concat(); // preserves original\r\n\t\t\tholes.push( hole );\r\n\t\t\t*/\r\n\r\n\t\t\tArray.prototype.push.apply( allpoints, hole );\r\n\r\n\t\t\tshortest = Number.POSITIVE_INFINITY;\r\n\r\n\r\n\t\t\t// Find the shortest pair of pts between shape and hole\r\n\r\n\t\t\t// Note: Actually, I'm not sure now if we could optimize this to be faster than O(m*n)\r\n\t\t\t// Using distanceToSquared() intead of distanceTo() should speed a little\r\n\t\t\t// since running square roots operations are reduced.\r\n\r\n\t\t\tfor ( h2 = 0; h2 < hole.length; h2 ++ ) {\r\n\r\n\t\t\t\tpts1 = hole[ h2 ];\r\n\t\t\t\tvar dist = [];\r\n\r\n\t\t\t\tfor ( p = 0; p < shape.length; p++ ) {\r\n\r\n\t\t\t\t\tpts2 = shape[ p ];\r\n\t\t\t\t\td = pts1.distanceToSquared( pts2 );\r\n\t\t\t\t\tdist.push( d );\r\n\r\n\t\t\t\t\tif ( d < shortest ) {\r\n\r\n\t\t\t\t\t\tshortest = d;\r\n\t\t\t\t\t\tholeIndex = h2;\r\n\t\t\t\t\t\tshapeIndex = p;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t//console.log(\"shortest\", shortest, dist);\r\n\r\n\t\t\tprevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;\r\n\t\t\tprevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;\r\n\r\n\t\t\tvar areaapts = [\r\n\r\n\t\t\t\thole[ holeIndex ],\r\n\t\t\t\tshape[ shapeIndex ],\r\n\t\t\t\tshape[ prevShapeVert ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tvar areaa = THREE.FontUtils.Triangulate.area( areaapts );\r\n\r\n\t\t\tvar areabpts = [\r\n\r\n\t\t\t\thole[ holeIndex ],\r\n\t\t\t\thole[ prevHoleVert ],\r\n\t\t\t\tshape[ shapeIndex ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tvar areab = THREE.FontUtils.Triangulate.area( areabpts );\r\n\r\n\t\t\tvar shapeOffset = 1;\r\n\t\t\tvar holeOffset = -1;\r\n\r\n\t\t\tvar oldShapeIndex = shapeIndex, oldHoleIndex = holeIndex;\r\n\t\t\tshapeIndex += shapeOffset;\r\n\t\t\tholeIndex += holeOffset;\r\n\r\n\t\t\tif ( shapeIndex < 0 ) { shapeIndex += shape.length; }\r\n\t\t\tshapeIndex %= shape.length;\r\n\r\n\t\t\tif ( holeIndex < 0 ) { holeIndex += hole.length; }\r\n\t\t\tholeIndex %= hole.length;\r\n\r\n\t\t\tprevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;\r\n\t\t\tprevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;\r\n\r\n\t\t\tareaapts = [\r\n\r\n\t\t\t\thole[ holeIndex ],\r\n\t\t\t\tshape[ shapeIndex ],\r\n\t\t\t\tshape[ prevShapeVert ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tvar areaa2 = THREE.FontUtils.Triangulate.area( areaapts );\r\n\r\n\t\t\tareabpts = [\r\n\r\n\t\t\t\thole[ holeIndex ],\r\n\t\t\t\thole[ prevHoleVert ],\r\n\t\t\t\tshape[ shapeIndex ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tvar areab2 = THREE.FontUtils.Triangulate.area( areabpts );\r\n\t\t\t//console.log(areaa,areab ,areaa2,areab2, ( areaa + areab ), ( areaa2 + areab2 ));\r\n\r\n\t\t\tif ( ( areaa + areab ) > ( areaa2 + areab2 ) ) {\r\n\r\n\t\t\t\t// In case areas are not correct.\r\n\t\t\t\t//console.log(\"USE THIS\");\r\n\r\n\t\t\t\tshapeIndex = oldShapeIndex;\r\n\t\t\t\tholeIndex = oldHoleIndex ;\r\n\r\n\t\t\t\tif ( shapeIndex < 0 ) { shapeIndex += shape.length; }\r\n\t\t\t\tshapeIndex %= shape.length;\r\n\r\n\t\t\t\tif ( holeIndex < 0 ) { holeIndex += hole.length; }\r\n\t\t\t\tholeIndex %= hole.length;\r\n\r\n\t\t\t\tprevShapeVert = ( shapeIndex - 1 ) >= 0 ? shapeIndex - 1 : shape.length - 1;\r\n\t\t\t\tprevHoleVert = ( holeIndex - 1 ) >= 0 ? holeIndex - 1 : hole.length - 1;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t//console.log(\"USE THAT \")\r\n\r\n\t\t\t}\r\n\r\n\t\t\ttmpShape1 = shape.slice( 0, shapeIndex );\r\n\t\t\ttmpShape2 = shape.slice( shapeIndex );\r\n\t\t\ttmpHole1 = hole.slice( holeIndex );\r\n\t\t\ttmpHole2 = hole.slice( 0, holeIndex );\r\n\r\n\t\t\t// Should check orders here again?\r\n\r\n\t\t\tvar trianglea = [\r\n\r\n\t\t\t\thole[ holeIndex ],\r\n\t\t\t\tshape[ shapeIndex ],\r\n\t\t\t\tshape[ prevShapeVert ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tvar triangleb = [\r\n\r\n\t\t\t\thole[ holeIndex ] ,\r\n\t\t\t\thole[ prevHoleVert ],\r\n\t\t\t\tshape[ shapeIndex ]\r\n\r\n\t\t\t];\r\n\r\n\t\t\tverts.push( trianglea );\r\n\t\t\tverts.push( triangleb );\r\n\r\n\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\r\n\r\n\t\t}\r\n\r\n\t\treturn {\r\n\r\n\t\t\tshape:shape, \t\t/* shape with no holes */\r\n\t\t\tisolatedPts: verts, /* isolated faces */\r\n\t\t\tallpoints: allpoints\r\n\r\n\t\t}\r\n\r\n\r\n\t},\r\n\r\n\ttriangulateShape: function ( contour, holes ) {\r\n\r\n\t\tvar shapeWithoutHoles = THREE.Shape.Utils.removeHoles( contour, holes );\r\n\r\n\t\tvar shape = shapeWithoutHoles.shape,\r\n\t\t\tallpoints = shapeWithoutHoles.allpoints,\r\n\t\t\tisolatedPts = shapeWithoutHoles.isolatedPts;\r\n\r\n\t\tvar triangles = THREE.FontUtils.Triangulate( shape, false ); // True returns indices for points of spooled shape\r\n\r\n\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\r\n\r\n\t\t//console.log( \"triangles\",triangles, triangles.length );\r\n\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\r\n\r\n\t\tvar i, il, f, face,\r\n\t\t\tkey, index,\r\n\t\t\tallPointsMap = {},\r\n\t\t\tisolatedPointsMap = {};\r\n\r\n\t\t// prepare all points map\r\n\r\n\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\r\n\r\n\t\t\tkey = allpoints[ i ].x + \":\" + allpoints[ i ].y;\r\n\r\n\t\t\tif ( allPointsMap[ key ] !== undefined ) {\r\n\r\n\t\t\t\tconsole.log( \"Duplicate point\", key );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tallPointsMap[ key ] = i;\r\n\r\n\t\t}\r\n\r\n\t\t// check all face vertices against all points map\r\n\r\n\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = triangles[ i ];\r\n\r\n\t\t\tfor ( f = 0; f < 3; f ++ ) {\r\n\r\n\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\r\n\r\n\t\t\t\tindex = allPointsMap[ key ];\r\n\r\n\t\t\t\tif ( index !== undefined ) {\r\n\r\n\t\t\t\t\tface[ f ] = index;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// check isolated points vertices against all points map\r\n\r\n\t\tfor ( i = 0, il = isolatedPts.length; i < il; i ++ ) {\r\n\r\n\t\t\tface = isolatedPts[ i ];\r\n\r\n\t\t\tfor ( f = 0; f < 3; f ++ ) {\r\n\r\n\t\t\t\tkey = face[ f ].x + \":\" + face[ f ].y;\r\n\r\n\t\t\t\tindex = allPointsMap[ key ];\r\n\r\n\t\t\t\tif ( index !== undefined ) {\r\n\r\n\t\t\t\t\tface[ f ] = index;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn triangles.concat( isolatedPts );\r\n\r\n\t}, // end triangulate shapes\r\n\r\n\t/*\r\n\ttriangulate2 : function( pts, holes ) {\r\n\r\n\t\t// For use with Poly2Tri.js\r\n\r\n\t\tvar allpts = pts.concat();\r\n\t\tvar shape = [];\r\n\t\tfor (var p in pts) {\r\n\t\t\tshape.push(new js.poly2tri.Point(pts[p].x, pts[p].y));\r\n\t\t}\r\n\r\n\t\tvar swctx = new js.poly2tri.SweepContext(shape);\r\n\r\n\t\tfor (var h in holes) {\r\n\t\t\tvar aHole = holes[h];\r\n\t\t\tvar newHole = []\r\n\t\t\tfor (i in aHole) {\r\n\t\t\t\tnewHole.push(new js.poly2tri.Point(aHole[i].x, aHole[i].y));\r\n\t\t\t\tallpts.push(aHole[i]);\r\n\t\t\t}\r\n\t\t\tswctx.AddHole(newHole);\r\n\t\t}\r\n\r\n\t\tvar find;\r\n\t\tvar findIndexForPt = function (pt) {\r\n\t\t\tfind = new THREE.Vector2(pt.x, pt.y);\r\n\t\t\tvar p;\r\n\t\t\tfor (p=0, pl = allpts.length; p 1 ) {\r\n\r\n\t\t\t\tconsole.log( \"THREE.Animation.update: Warning! Scale out of bounds:\" + scale + \" on bone \" + h );\r\n\t\t\t\tscale = scale < 0 ? 0 : 1;\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// interpolate\r\n\r\n\t\t\tif ( type === \"pos\" ) {\r\n\r\n\t\t\t\tvector = object.position;\r\n\r\n\t\t\t\tif ( this.interpolationType === THREE.AnimationHandler.LINEAR ) {\r\n\r\n\t\t\t\t\tvector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale;\r\n\t\t\t\t\tvector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale;\r\n\t\t\t\t\tvector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale;\r\n\r\n\t\t\t\t} else if ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||\r\n\t\t\t\t\t\t this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {\r\n\r\n\t\t\t\t\tthis.points[ 0 ] = this.getPrevKeyWith( \"pos\", h, prevKey.index - 1 )[ \"pos\" ];\r\n\t\t\t\t\tthis.points[ 1 ] = prevXYZ;\r\n\t\t\t\t\tthis.points[ 2 ] = nextXYZ;\r\n\t\t\t\t\tthis.points[ 3 ] = this.getNextKeyWith( \"pos\", h, nextKey.index + 1 )[ \"pos\" ];\r\n\r\n\t\t\t\t\tscale = scale * 0.33 + 0.33;\r\n\r\n\t\t\t\t\tcurrentPoint = this.interpolateCatmullRom( this.points, scale );\r\n\r\n\t\t\t\t\tvector.x = currentPoint[ 0 ];\r\n\t\t\t\t\tvector.y = currentPoint[ 1 ];\r\n\t\t\t\t\tvector.z = currentPoint[ 2 ];\r\n\r\n\t\t\t\t\tif ( this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {\r\n\r\n\t\t\t\t\t\tforwardPoint = this.interpolateCatmullRom( this.points, scale * 1.01 );\r\n\r\n\t\t\t\t\t\tthis.target.set( forwardPoint[ 0 ], forwardPoint[ 1 ], forwardPoint[ 2 ] );\r\n\t\t\t\t\t\tthis.target.sub( vector );\r\n\t\t\t\t\t\tthis.target.y = 0;\r\n\t\t\t\t\t\tthis.target.normalize();\r\n\r\n\t\t\t\t\t\tangle = Math.atan2( this.target.x, this.target.z );\r\n\t\t\t\t\t\tobject.rotation.set( 0, angle, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if ( type === \"rot\" ) {\r\n\r\n\t\t\t\tTHREE.Quaternion.slerp( prevXYZ, nextXYZ, object.quaternion, scale );\r\n\r\n\t\t\t} else if ( type === \"scl\" ) {\r\n\r\n\t\t\t\tvector = object.scale;\r\n\r\n\t\t\t\tvector.x = prevXYZ[ 0 ] + ( nextXYZ[ 0 ] - prevXYZ[ 0 ] ) * scale;\r\n\t\t\t\tvector.y = prevXYZ[ 1 ] + ( nextXYZ[ 1 ] - prevXYZ[ 1 ] ) * scale;\r\n\t\t\t\tvector.z = prevXYZ[ 2 ] + ( nextXYZ[ 2 ] - prevXYZ[ 2 ] ) * scale;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Catmull-Rom spline\r\n\r\nTHREE.Animation.prototype.interpolateCatmullRom = function ( points, scale ) {\r\n\r\n\tvar c = [], v3 = [],\r\n\tpoint, intPoint, weight, w2, w3,\r\n\tpa, pb, pc, pd;\r\n\r\n\tpoint = ( points.length - 1 ) * scale;\r\n\tintPoint = Math.floor( point );\r\n\tweight = point - intPoint;\r\n\r\n\tc[ 0 ] = intPoint === 0 ? intPoint : intPoint - 1;\r\n\tc[ 1 ] = intPoint;\r\n\tc[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1;\r\n\tc[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2;\r\n\r\n\tpa = points[ c[ 0 ] ];\r\n\tpb = points[ c[ 1 ] ];\r\n\tpc = points[ c[ 2 ] ];\r\n\tpd = points[ c[ 3 ] ];\r\n\r\n\tw2 = weight * weight;\r\n\tw3 = weight * w2;\r\n\r\n\tv3[ 0 ] = this.interpolate( pa[ 0 ], pb[ 0 ], pc[ 0 ], pd[ 0 ], weight, w2, w3 );\r\n\tv3[ 1 ] = this.interpolate( pa[ 1 ], pb[ 1 ], pc[ 1 ], pd[ 1 ], weight, w2, w3 );\r\n\tv3[ 2 ] = this.interpolate( pa[ 2 ], pb[ 2 ], pc[ 2 ], pd[ 2 ], weight, w2, w3 );\r\n\r\n\treturn v3;\r\n\r\n};\r\n\r\nTHREE.Animation.prototype.interpolate = function ( p0, p1, p2, p3, t, t2, t3 ) {\r\n\r\n\tvar v0 = ( p2 - p0 ) * 0.5,\r\n\t\tv1 = ( p3 - p1 ) * 0.5;\r\n\r\n\treturn ( 2 * ( p1 - p2 ) + v0 + v1 ) * t3 + ( - 3 * ( p1 - p2 ) - 2 * v0 - v1 ) * t2 + v0 * t + p1;\r\n\r\n};\r\n\r\n\r\n\r\n// Get next key with\r\n\r\nTHREE.Animation.prototype.getNextKeyWith = function ( type, h, key ) {\r\n\r\n\tvar keys = this.data.hierarchy[ h ].keys;\r\n\r\n\tif ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||\r\n\t\t this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {\r\n\r\n\t\tkey = key < keys.length - 1 ? key : keys.length - 1;\r\n\r\n\t} else {\r\n\r\n\t\tkey = key % keys.length;\r\n\r\n\t}\r\n\r\n\tfor ( ; key < keys.length; key++ ) {\r\n\r\n\t\tif ( keys[ key ][ type ] !== undefined ) {\r\n\r\n\t\t\treturn keys[ key ];\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn this.data.hierarchy[ h ].keys[ 0 ];\r\n\r\n};\r\n\r\n// Get previous key with\r\n\r\nTHREE.Animation.prototype.getPrevKeyWith = function ( type, h, key ) {\r\n\r\n\tvar keys = this.data.hierarchy[ h ].keys;\r\n\r\n\tif ( this.interpolationType === THREE.AnimationHandler.CATMULLROM ||\r\n\t\t this.interpolationType === THREE.AnimationHandler.CATMULLROM_FORWARD ) {\r\n\r\n\t\tkey = key > 0 ? key : 0;\r\n\r\n\t} else {\r\n\r\n\t\tkey = key >= 0 ? key : key + keys.length;\r\n\r\n\t}\r\n\r\n\r\n\tfor ( ; key >= 0; key -- ) {\r\n\r\n\t\tif ( keys[ key ][ type ] !== undefined ) {\r\n\r\n\t\t\treturn keys[ key ];\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn this.data.hierarchy[ h ].keys[ keys.length - 1 ];\r\n\r\n};\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author khang duong\r\n * @author erik kitson\r\n */\r\n\r\nTHREE.KeyFrameAnimation = function( root, data, JITCompile ) {\r\n\r\n\tthis.root = root;\r\n\tthis.data = THREE.AnimationHandler.get( data );\r\n\tthis.hierarchy = THREE.AnimationHandler.parse( root );\r\n\tthis.currentTime = 0;\r\n\tthis.timeScale = 0.001;\r\n\tthis.isPlaying = false;\r\n\tthis.isPaused = true;\r\n\tthis.loop = true;\r\n\tthis.JITCompile = JITCompile !== undefined ? JITCompile : true;\r\n\r\n\t// initialize to first keyframes\r\n\r\n\tfor ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {\r\n\r\n\t\tvar keys = this.data.hierarchy[h].keys,\r\n\t\t\tsids = this.data.hierarchy[h].sids,\r\n\t\t\tobj = this.hierarchy[h];\r\n\r\n\t\tif ( keys.length && sids ) {\r\n\r\n\t\t\tfor ( var s = 0; s < sids.length; s++ ) {\r\n\r\n\t\t\t\tvar sid = sids[ s ],\r\n\t\t\t\t\tnext = this.getNextKeyWith( sid, h, 0 );\r\n\r\n\t\t\t\tif ( next ) {\r\n\r\n\t\t\t\t\tnext.apply( sid );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tobj.matrixAutoUpdate = false;\r\n\t\t\tthis.data.hierarchy[h].node.updateMatrix();\r\n\t\t\tobj.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Play\r\n\r\nTHREE.KeyFrameAnimation.prototype.play = function( loop, startTimeMS ) {\r\n\r\n\tif( !this.isPlaying ) {\r\n\r\n\t\tthis.isPlaying = true;\r\n\t\tthis.loop = loop !== undefined ? loop : true;\r\n\t\tthis.currentTime = startTimeMS !== undefined ? startTimeMS : 0;\r\n\t\tthis.startTimeMs = startTimeMS;\r\n\t\tthis.startTime = 10000000;\r\n\t\tthis.endTime = -this.startTime;\r\n\r\n\r\n\t\t// reset key cache\r\n\r\n\t\tvar h, hl = this.hierarchy.length,\r\n\t\t\tobject,\r\n\t\t\tnode;\r\n\r\n\t\tfor ( h = 0; h < hl; h++ ) {\r\n\r\n\t\t\tobject = this.hierarchy[ h ];\r\n\t\t\tnode = this.data.hierarchy[ h ];\r\n\t\t\tobject.useQuaternion = true;\r\n\r\n\t\t\tif ( node.animationCache === undefined ) {\r\n\r\n\t\t\t\tnode.animationCache = {};\r\n\t\t\t\tnode.animationCache.prevKey = null;\r\n\t\t\t\tnode.animationCache.nextKey = null;\r\n\t\t\t\tnode.animationCache.originalMatrix = object instanceof THREE.Bone ? object.skinMatrix : object.matrix;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar keys = this.data.hierarchy[h].keys;\r\n\r\n\t\t\tif (keys.length) {\r\n\r\n\t\t\t\tnode.animationCache.prevKey = keys[ 0 ];\r\n\t\t\t\tnode.animationCache.nextKey = keys[ 1 ];\r\n\r\n\t\t\t\tthis.startTime = Math.min( keys[0].time, this.startTime );\r\n\t\t\t\tthis.endTime = Math.max( keys[keys.length - 1].time, this.endTime );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.update( 0 );\r\n\r\n\t}\r\n\r\n\tthis.isPaused = false;\r\n\r\n\tTHREE.AnimationHandler.addToUpdate( this );\r\n\r\n};\r\n\r\n\r\n\r\n// Pause\r\n\r\nTHREE.KeyFrameAnimation.prototype.pause = function() {\r\n\r\n\tif( this.isPaused ) {\r\n\r\n\t\tTHREE.AnimationHandler.addToUpdate( this );\r\n\r\n\t} else {\r\n\r\n\t\tTHREE.AnimationHandler.removeFromUpdate( this );\r\n\r\n\t}\r\n\r\n\tthis.isPaused = !this.isPaused;\r\n\r\n};\r\n\r\n\r\n// Stop\r\n\r\nTHREE.KeyFrameAnimation.prototype.stop = function() {\r\n\r\n\tthis.isPlaying = false;\r\n\tthis.isPaused = false;\r\n\tTHREE.AnimationHandler.removeFromUpdate( this );\r\n\r\n\r\n\t// reset JIT matrix and remove cache\r\n\r\n\tfor ( var h = 0; h < this.data.hierarchy.length; h++ ) {\r\n \r\n var obj = this.hierarchy[ h ];\r\n\t\tvar node = this.data.hierarchy[ h ];\r\n\r\n\t\tif ( node.animationCache !== undefined ) {\r\n\r\n\t\t\tvar original = node.animationCache.originalMatrix;\r\n\r\n\t\t\tif( obj instanceof THREE.Bone ) {\r\n\r\n\t\t\t\toriginal.copy( obj.skinMatrix );\r\n\t\t\t\tobj.skinMatrix = original;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\toriginal.copy( obj.matrix );\r\n\t\t\t\tobj.matrix = original;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tdelete node.animationCache;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n// Update\r\n\r\nTHREE.KeyFrameAnimation.prototype.update = function( deltaTimeMS ) {\r\n\r\n\t// early out\r\n\r\n\tif( !this.isPlaying ) return;\r\n\r\n\r\n\t// vars\r\n\r\n\tvar prevKey, nextKey;\r\n\tvar object;\r\n\tvar node;\r\n\tvar frame;\r\n\tvar JIThierarchy = this.data.JIT.hierarchy;\r\n\tvar currentTime, unloopedCurrentTime;\r\n\tvar looped;\r\n\r\n\r\n\t// update\r\n\r\n\tthis.currentTime += deltaTimeMS * this.timeScale;\r\n\r\n\tunloopedCurrentTime = this.currentTime;\r\n\tcurrentTime = this.currentTime = this.currentTime % this.data.length;\r\n\r\n\t// if looped around, the current time should be based on the startTime\r\n\tif ( currentTime < this.startTimeMs ) {\r\n\r\n\t\tcurrentTime = this.currentTime = this.startTimeMs + currentTime;\r\n\r\n\t}\r\n\r\n\tframe = parseInt( Math.min( currentTime * this.data.fps, this.data.length * this.data.fps ), 10 );\r\n\tlooped \t\t\t\t= currentTime < unloopedCurrentTime;\r\n\r\n\tif ( looped && !this.loop ) {\r\n\r\n\t\t// Set the animation to the last keyframes and stop\r\n\t\tfor ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {\r\n\r\n\t\t\tvar keys = this.data.hierarchy[h].keys,\r\n\t\t\t\tsids = this.data.hierarchy[h].sids,\r\n\t\t\t\tend = keys.length-1,\r\n\t\t\t\tobj = this.hierarchy[h];\r\n\r\n\t\t\tif ( keys.length ) {\r\n\r\n\t\t\t\tfor ( var s = 0; s < sids.length; s++ ) {\r\n\r\n\t\t\t\t\tvar sid = sids[ s ],\r\n\t\t\t\t\t\tprev = this.getPrevKeyWith( sid, h, end );\r\n\r\n\t\t\t\t\tif ( prev ) {\r\n\t\t\t\t\t\tprev.apply( sid );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.data.hierarchy[h].node.updateMatrix();\r\n\t\t\t\tobj.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.stop();\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\t// check pre-infinity\r\n\tif ( currentTime < this.startTime ) {\r\n\r\n\t\treturn;\r\n\r\n\t}\r\n\r\n\t// update\r\n\r\n\tfor ( var h = 0, hl = this.hierarchy.length; h < hl; h++ ) {\r\n\r\n\t\tobject = this.hierarchy[ h ];\r\n\t\tnode = this.data.hierarchy[ h ];\r\n\r\n\t\tvar keys = node.keys,\r\n\t\t\tanimationCache = node.animationCache;\r\n\r\n\t\t// use JIT?\r\n\r\n\t\tif ( this.JITCompile && JIThierarchy[ h ][ frame ] !== undefined ) {\r\n\r\n\t\t\tif( object instanceof THREE.Bone ) {\r\n\r\n\t\t\t\tobject.skinMatrix = JIThierarchy[ h ][ frame ];\r\n\t\t\t\tobject.matrixWorldNeedsUpdate = false;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tobject.matrix = JIThierarchy[ h ][ frame ];\r\n\t\t\t\tobject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t\t}\r\n\r\n\t\t// use interpolation\r\n\r\n\t\t} else if ( keys.length ) {\r\n\r\n\t\t\t// make sure so original matrix and not JIT matrix is set\r\n\r\n\t\t\tif ( this.JITCompile && animationCache ) {\r\n\r\n\t\t\t\tif( object instanceof THREE.Bone ) {\r\n\r\n\t\t\t\t\tobject.skinMatrix = animationCache.originalMatrix;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tobject.matrix = animationCache.originalMatrix;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tprevKey = animationCache.prevKey;\r\n\t\t\tnextKey = animationCache.nextKey;\r\n\r\n\t\t\tif ( prevKey && nextKey ) {\r\n\r\n\t\t\t\t// switch keys?\r\n\r\n\t\t\t\tif ( nextKey.time <= unloopedCurrentTime ) {\r\n\r\n\t\t\t\t\t// did we loop?\r\n\r\n\t\t\t\t\tif ( looped && this.loop ) {\r\n\r\n\t\t\t\t\t\tprevKey = keys[ 0 ];\r\n\t\t\t\t\t\tnextKey = keys[ 1 ];\r\n\r\n\t\t\t\t\t\twhile ( nextKey.time < currentTime ) {\r\n\r\n\t\t\t\t\t\t\tprevKey = nextKey;\r\n\t\t\t\t\t\t\tnextKey = keys[ prevKey.index + 1 ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if ( !looped ) {\r\n\r\n\t\t\t\t\t\tvar lastIndex = keys.length - 1;\r\n\r\n\t\t\t\t\t\twhile ( nextKey.time < currentTime && nextKey.index !== lastIndex ) {\r\n\r\n\t\t\t\t\t\t\tprevKey = nextKey;\r\n\t\t\t\t\t\t\tnextKey = keys[ prevKey.index + 1 ];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tanimationCache.prevKey = prevKey;\r\n\t\t\t\t\tanimationCache.nextKey = nextKey;\r\n\r\n\t\t\t\t}\r\n if(nextKey.time >= currentTime)\r\n prevKey.interpolate( nextKey, currentTime );\r\n else\r\n prevKey.interpolate( nextKey, nextKey.time);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.data.hierarchy[h].node.updateMatrix();\r\n\t\t\tobject.matrixWorldNeedsUpdate = true;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// update JIT?\r\n\r\n\tif ( this.JITCompile ) {\r\n\r\n\t\tif ( JIThierarchy[ 0 ][ frame ] === undefined ) {\r\n\r\n\t\t\tthis.hierarchy[ 0 ].updateMatrixWorld( true );\r\n\r\n\t\t\tfor ( var h = 0; h < this.hierarchy.length; h++ ) {\r\n\r\n\t\t\t\tif( this.hierarchy[ h ] instanceof THREE.Bone ) {\r\n\r\n\t\t\t\t\tJIThierarchy[ h ][ frame ] = this.hierarchy[ h ].skinMatrix.clone();\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tJIThierarchy[ h ][ frame ] = this.hierarchy[ h ].matrix.clone();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Get next key with\r\n\r\nTHREE.KeyFrameAnimation.prototype.getNextKeyWith = function( sid, h, key ) {\r\n\r\n\tvar keys = this.data.hierarchy[ h ].keys;\r\n\tkey = key % keys.length;\r\n\r\n\tfor ( ; key < keys.length; key++ ) {\r\n\r\n\t\tif ( keys[ key ].hasTarget( sid ) ) {\r\n\r\n\t\t\treturn keys[ key ];\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn keys[ 0 ];\r\n\r\n};\r\n\r\n// Get previous key with\r\n\r\nTHREE.KeyFrameAnimation.prototype.getPrevKeyWith = function( sid, h, key ) {\r\n\r\n\tvar keys = this.data.hierarchy[ h ].keys;\r\n\tkey = key >= 0 ? key : key + keys.length;\r\n\r\n\tfor ( ; key >= 0; key-- ) {\r\n\r\n\t\tif ( keys[ key ].hasTarget( sid ) ) {\r\n\r\n\t\t\treturn keys[ key ];\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\treturn keys[ keys.length - 1 ];\r\n\r\n};\r\n/**\r\n * Camera for rendering cube maps\r\n *\t- renders scene into axis-aligned cube\r\n *\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.CubeCamera = function ( near, far, cubeResolution ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tvar fov = 90, aspect = 1;\r\n\r\n\tvar cameraPX = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPX.up.set( 0, -1, 0 );\r\n\tcameraPX.lookAt( new THREE.Vector3( 1, 0, 0 ) );\r\n\tthis.add( cameraPX );\r\n\r\n\tvar cameraNX = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNX.up.set( 0, -1, 0 );\r\n\tcameraNX.lookAt( new THREE.Vector3( -1, 0, 0 ) );\r\n\tthis.add( cameraNX );\r\n\r\n\tvar cameraPY = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPY.up.set( 0, 0, 1 );\r\n\tcameraPY.lookAt( new THREE.Vector3( 0, 1, 0 ) );\r\n\tthis.add( cameraPY );\r\n\r\n\tvar cameraNY = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNY.up.set( 0, 0, -1 );\r\n\tcameraNY.lookAt( new THREE.Vector3( 0, -1, 0 ) );\r\n\tthis.add( cameraNY );\r\n\r\n\tvar cameraPZ = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraPZ.up.set( 0, -1, 0 );\r\n\tcameraPZ.lookAt( new THREE.Vector3( 0, 0, 1 ) );\r\n\tthis.add( cameraPZ );\r\n\r\n\tvar cameraNZ = new THREE.PerspectiveCamera( fov, aspect, near, far );\r\n\tcameraNZ.up.set( 0, -1, 0 );\r\n\tcameraNZ.lookAt( new THREE.Vector3( 0, 0, -1 ) );\r\n\tthis.add( cameraNZ );\r\n\r\n\tthis.renderTarget = new THREE.WebGLRenderTargetCube( cubeResolution, cubeResolution, { format: THREE.RGBFormat, magFilter: THREE.LinearFilter, minFilter: THREE.LinearFilter } );\r\n\r\n\tthis.updateCubeMap = function ( renderer, scene ) {\r\n\r\n\t\tvar renderTarget = this.renderTarget;\r\n\t\tvar generateMipmaps = renderTarget.generateMipmaps;\r\n\r\n\t\trenderTarget.generateMipmaps = false;\r\n\r\n\t\trenderTarget.activeCubeFace = 0;\r\n\t\trenderer.render( scene, cameraPX, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 1;\r\n\t\trenderer.render( scene, cameraNX, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 2;\r\n\t\trenderer.render( scene, cameraPY, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 3;\r\n\t\trenderer.render( scene, cameraNY, renderTarget );\r\n\r\n\t\trenderTarget.activeCubeFace = 4;\r\n\t\trenderer.render( scene, cameraPZ, renderTarget );\r\n\r\n\t\trenderTarget.generateMipmaps = generateMipmaps;\r\n\r\n\t\trenderTarget.activeCubeFace = 5;\r\n\t\trenderer.render( scene, cameraNZ, renderTarget );\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.CubeCamera.prototype = Object.create( THREE.Object3D.prototype );\r\n/*\r\n *\t@author zz85 / http://twitter.com/blurspline / http://www.lab4games.net/zz85/blog\r\n *\r\n *\tA general perpose camera, for setting FOV, Lens Focal Length,\r\n *\t\tand switching between perspective and orthographic views easily.\r\n *\t\tUse this only if you do not wish to manage\r\n *\t\tboth a Orthographic and Perspective Camera\r\n *\r\n */\r\n\r\n\r\nTHREE.CombinedCamera = function ( width, height, fov, near, far, orthoNear, orthoFar ) {\r\n\r\n\tTHREE.Camera.call( this );\r\n\r\n\tthis.fov = fov;\r\n\r\n\tthis.left = -width / 2;\r\n\tthis.right = width / 2\r\n\tthis.top = height / 2;\r\n\tthis.bottom = -height / 2;\r\n\r\n\t// We could also handle the projectionMatrix internally, but just wanted to test nested camera objects\r\n\r\n\tthis.cameraO = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, \torthoNear, orthoFar );\r\n\tthis.cameraP = new THREE.PerspectiveCamera( fov, width / height, near, far );\r\n\r\n\tthis.zoom = 1;\r\n\r\n\tthis.toPerspective();\r\n\r\n\tvar aspect = width/height;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype = Object.create( THREE.Camera.prototype );\r\n\r\nTHREE.CombinedCamera.prototype.toPerspective = function () {\r\n\r\n\t// Switches to the Perspective Camera\r\n\r\n\tthis.near = this.cameraP.near;\r\n\tthis.far = this.cameraP.far;\r\n\r\n\tthis.cameraP.fov = this.fov / this.zoom ;\r\n\r\n\tthis.cameraP.updateProjectionMatrix();\r\n\r\n\tthis.projectionMatrix = this.cameraP.projectionMatrix;\r\n\r\n\tthis.inPerspectiveMode = true;\r\n\tthis.inOrthographicMode = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toOrthographic = function () {\r\n\r\n\t// Switches to the Orthographic camera estimating viewport from Perspective\r\n\r\n\tvar fov = this.fov;\r\n\tvar aspect = this.cameraP.aspect;\r\n\tvar near = this.cameraP.near;\r\n\tvar far = this.cameraP.far;\r\n\r\n\t// The size that we set is the mid plane of the viewing frustum\r\n\r\n\tvar hyperfocus = ( near + far ) / 2;\r\n\r\n\tvar halfHeight = Math.tan( fov / 2 ) * hyperfocus;\r\n\tvar planeHeight = 2 * halfHeight;\r\n\tvar planeWidth = planeHeight * aspect;\r\n\tvar halfWidth = planeWidth / 2;\r\n\r\n\thalfHeight /= this.zoom;\r\n\thalfWidth /= this.zoom;\r\n\r\n\tthis.cameraO.left = -halfWidth;\r\n\tthis.cameraO.right = halfWidth;\r\n\tthis.cameraO.top = halfHeight;\r\n\tthis.cameraO.bottom = -halfHeight;\r\n\r\n\t// this.cameraO.left = -farHalfWidth;\r\n\t// this.cameraO.right = farHalfWidth;\r\n\t// this.cameraO.top = farHalfHeight;\r\n\t// this.cameraO.bottom = -farHalfHeight;\r\n\r\n\t// this.cameraO.left = this.left / this.zoom;\r\n\t// this.cameraO.right = this.right / this.zoom;\r\n\t// this.cameraO.top = this.top / this.zoom;\r\n\t// this.cameraO.bottom = this.bottom / this.zoom;\r\n\r\n\tthis.cameraO.updateProjectionMatrix();\r\n\r\n\tthis.near = this.cameraO.near;\r\n\tthis.far = this.cameraO.far;\r\n\tthis.projectionMatrix = this.cameraO.projectionMatrix;\r\n\r\n\tthis.inPerspectiveMode = false;\r\n\tthis.inOrthographicMode = true;\r\n\r\n};\r\n\r\n\r\nTHREE.CombinedCamera.prototype.setSize = function( width, height ) {\r\n\r\n\tthis.cameraP.aspect = width / height;\r\n\tthis.left = -width / 2;\r\n\tthis.right = width / 2\r\n\tthis.top = height / 2;\r\n\tthis.bottom = -height / 2;\r\n\r\n};\r\n\r\n\r\nTHREE.CombinedCamera.prototype.setFov = function( fov ) {\r\n\r\n\tthis.fov = fov;\r\n\r\n\tif ( this.inPerspectiveMode ) {\r\n\r\n\t\tthis.toPerspective();\r\n\r\n\t} else {\r\n\r\n\t\tthis.toOrthographic();\r\n\r\n\t}\r\n\r\n};\r\n\r\n// For mantaining similar API with PerspectiveCamera\r\n\r\nTHREE.CombinedCamera.prototype.updateProjectionMatrix = function() {\r\n\r\n\tif ( this.inPerspectiveMode ) {\r\n\r\n\t\tthis.toPerspective();\r\n\r\n\t} else {\r\n\r\n\t\tthis.toPerspective();\r\n\t\tthis.toOrthographic();\r\n\r\n\t}\r\n\r\n};\r\n\r\n/*\r\n* Uses Focal Length (in mm) to estimate and set FOV\r\n* 35mm (fullframe) camera is used if frame size is not specified;\r\n* Formula based on http://www.bobatkins.com/photography/technical/field_of_view.html\r\n*/\r\nTHREE.CombinedCamera.prototype.setLens = function ( focalLength, frameHeight ) {\r\n\r\n\tif ( frameHeight === undefined ) frameHeight = 24;\r\n\r\n\tvar fov = 2 * THREE.Math.radToDeg( Math.atan( frameHeight / ( focalLength * 2 ) ) );\r\n\r\n\tthis.setFov( fov );\r\n\r\n\treturn fov;\r\n};\r\n\r\n\r\nTHREE.CombinedCamera.prototype.setZoom = function( zoom ) {\r\n\r\n\tthis.zoom = zoom;\r\n\r\n\tif ( this.inPerspectiveMode ) {\r\n\r\n\t\tthis.toPerspective();\r\n\r\n\t} else {\r\n\r\n\t\tthis.toOrthographic();\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toFrontView = function() {\r\n\r\n\tthis.rotation.x = 0;\r\n\tthis.rotation.y = 0;\r\n\tthis.rotation.z = 0;\r\n\r\n\t// should we be modifing the matrix instead?\r\n\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toBackView = function() {\r\n\r\n\tthis.rotation.x = 0;\r\n\tthis.rotation.y = Math.PI;\r\n\tthis.rotation.z = 0;\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toLeftView = function() {\r\n\r\n\tthis.rotation.x = 0;\r\n\tthis.rotation.y = - Math.PI / 2;\r\n\tthis.rotation.z = 0;\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toRightView = function() {\r\n\r\n\tthis.rotation.x = 0;\r\n\tthis.rotation.y = Math.PI / 2;\r\n\tthis.rotation.z = 0;\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toTopView = function() {\r\n\r\n\tthis.rotation.x = - Math.PI / 2;\r\n\tthis.rotation.y = 0;\r\n\tthis.rotation.z = 0;\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\nTHREE.CombinedCamera.prototype.toBottomView = function() {\r\n\r\n\tthis.rotation.x = Math.PI / 2;\r\n\tthis.rotation.y = 0;\r\n\tthis.rotation.z = 0;\r\n\tthis.rotationAutoUpdate = false;\r\n\r\n};\r\n\r\n/**\r\n * @author hughes\r\n */\r\n\r\nTHREE.CircleGeometry = function ( radius, segments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tradius = radius || 50;\r\n\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\r\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\r\n\r\n\tvar i, uvs = [],\r\n\tcenter = new THREE.Vector3(), centerUV = new THREE.Vector2( 0.5, 0.5 );\r\n\r\n\tthis.vertices.push(center);\r\n\tuvs.push( centerUV );\r\n\r\n\tfor ( i = 0; i <= segments; i ++ ) {\r\n\r\n\t\tvar vertex = new THREE.Vector3();\r\n\t\tvar segment = thetaStart + i / segments * thetaLength;\r\n\r\n\t\tvertex.x = radius * Math.cos( segment );\r\n\t\tvertex.y = radius * Math.sin( segment );\r\n\r\n\t\tthis.vertices.push( vertex );\r\n\t\tuvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, ( vertex.y / radius + 1 ) / 2 ) );\r\n\r\n\t}\r\n\r\n\tvar n = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\tfor ( i = 1; i <= segments; i ++ ) {\r\n\r\n\t\tvar v1 = i;\r\n\t\tvar v2 = i + 1 ;\r\n\t\tvar v3 = 0;\r\n\r\n\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );\r\n\t\tthis.faceVertexUvs[ 0 ].push( [ uvs[ i ], uvs[ i + 1 ], centerUV ] );\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n};\r\n\r\nTHREE.CircleGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Cube.as\r\n */\r\n\r\nTHREE.CubeGeometry = function ( width, height, depth, widthSegments, heightSegments, depthSegments ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tvar scope = this;\r\n\r\n\tthis.width = width;\r\n\tthis.height = height;\r\n\tthis.depth = depth;\r\n\r\n\tthis.widthSegments = widthSegments || 1;\r\n\tthis.heightSegments = heightSegments || 1;\r\n\tthis.depthSegments = depthSegments || 1;\r\n\r\n\tvar width_half = this.width / 2;\r\n\tvar height_half = this.height / 2;\r\n\tvar depth_half = this.depth / 2;\r\n\r\n\tbuildPlane( 'z', 'y', - 1, - 1, this.depth, this.height, width_half, 0 ); // px\r\n\tbuildPlane( 'z', 'y', 1, - 1, this.depth, this.height, - width_half, 1 ); // nx\r\n\tbuildPlane( 'x', 'z', 1, 1, this.width, this.depth, height_half, 2 ); // py\r\n\tbuildPlane( 'x', 'z', 1, - 1, this.width, this.depth, - height_half, 3 ); // ny\r\n\tbuildPlane( 'x', 'y', 1, - 1, this.width, this.height, depth_half, 4 ); // pz\r\n\tbuildPlane( 'x', 'y', - 1, - 1, this.width, this.height, - depth_half, 5 ); // nz\r\n\r\n\tfunction buildPlane( u, v, udir, vdir, width, height, depth, materialIndex ) {\r\n\r\n\t\tvar w, ix, iy,\r\n\t\tgridX = scope.widthSegments,\r\n\t\tgridY = scope.heightSegments,\r\n\t\twidth_half = width / 2,\r\n\t\theight_half = height / 2,\r\n\t\toffset = scope.vertices.length;\r\n\r\n\t\tif ( ( u === 'x' && v === 'y' ) || ( u === 'y' && v === 'x' ) ) {\r\n\r\n\t\t\tw = 'z';\r\n\r\n\t\t} else if ( ( u === 'x' && v === 'z' ) || ( u === 'z' && v === 'x' ) ) {\r\n\r\n\t\t\tw = 'y';\r\n\t\t\tgridY = scope.depthSegments;\r\n\r\n\t\t} else if ( ( u === 'z' && v === 'y' ) || ( u === 'y' && v === 'z' ) ) {\r\n\r\n\t\t\tw = 'x';\r\n\t\t\tgridX = scope.depthSegments;\r\n\r\n\t\t}\r\n\r\n\t\tvar gridX1 = gridX + 1,\r\n\t\tgridY1 = gridY + 1,\r\n\t\tsegment_width = width / gridX,\r\n\t\tsegment_height = height / gridY,\r\n\t\tnormal = new THREE.Vector3();\r\n\r\n\t\tnormal[ w ] = depth > 0 ? 1 : - 1;\r\n\r\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\r\n\r\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\r\n\r\n\t\t\t\tvar vector = new THREE.Vector3();\r\n\t\t\t\tvector[ u ] = ( ix * segment_width - width_half ) * udir;\r\n\t\t\t\tvector[ v ] = ( iy * segment_height - height_half ) * vdir;\r\n\t\t\t\tvector[ w ] = depth;\r\n\r\n\t\t\t\tscope.vertices.push( vector );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tfor ( iy = 0; iy < gridY; iy++ ) {\r\n\r\n\t\t\tfor ( ix = 0; ix < gridX; ix++ ) {\r\n\r\n\t\t\t\tvar a = ix + gridX1 * iy;\r\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\r\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\r\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\r\n\r\n\t\t\t\tvar face = new THREE.Face4( a + offset, b + offset, c + offset, d + offset );\r\n\t\t\t\tface.normal.copy( normal );\r\n\t\t\t\tface.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() );\r\n\t\t\t\tface.materialIndex = materialIndex;\r\n\r\n\t\t\t\tscope.faces.push( face );\r\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\r\n\t\t\t\t\t\t\tnew THREE.Vector2( ix / gridX, 1 - iy / gridY ),\r\n\t\t\t\t\t\t\tnew THREE.Vector2( ix / gridX, 1 - ( iy + 1 ) / gridY ),\r\n\t\t\t\t\t\t\tnew THREE.Vector2( ( ix + 1 ) / gridX, 1- ( iy + 1 ) / gridY ),\r\n\t\t\t\t\t\t\tnew THREE.Vector2( ( ix + 1 ) / gridX, 1 - iy / gridY )\r\n\t\t\t\t\t\t] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.mergeVertices();\r\n\r\n};\r\n\r\nTHREE.CubeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.CylinderGeometry = function ( radiusTop, radiusBottom, height, radiusSegments, heightSegments, openEnded ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.radiusTop = radiusTop = radiusTop !== undefined ? radiusTop : 20;\r\n\tthis.radiusBottom = radiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\r\n\tthis.height = height = height !== undefined ? height : 100;\r\n\r\n\tthis.radiusSegments = radiusSegments = radiusSegments || 8;\r\n\tthis.heightSegments = heightSegments = heightSegments || 1;\r\n\r\n\tthis.openEnded = openEnded = openEnded !== undefined ? openEnded : false;\r\n\r\n\tvar heightHalf = height / 2;\r\n\r\n\tvar x, y, vertices = [], uvs = [];\r\n\r\n\tfor ( y = 0; y <= heightSegments; y ++ ) {\r\n\r\n\t\tvar verticesRow = [];\r\n\t\tvar uvsRow = [];\r\n\r\n\t\tvar v = y / heightSegments;\r\n\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\r\n\r\n\t\tfor ( x = 0; x <= radiusSegments; x ++ ) {\r\n\r\n\t\t\tvar u = x / radiusSegments;\r\n\r\n\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\tvertex.x = radius * Math.sin( u * Math.PI * 2 );\r\n\t\t\tvertex.y = - v * height + heightHalf;\r\n\t\t\tvertex.z = radius * Math.cos( u * Math.PI * 2 );\r\n\r\n\t\t\tthis.vertices.push( vertex );\r\n\r\n\t\t\tverticesRow.push( this.vertices.length - 1 );\r\n\t\t\tuvsRow.push( new THREE.Vector2( u, 1 - v ) );\r\n\r\n\t\t}\r\n\r\n\t\tvertices.push( verticesRow );\r\n\t\tuvs.push( uvsRow );\r\n\r\n\t}\r\n\r\n\tvar tanTheta = ( radiusBottom - radiusTop ) / height;\r\n\tvar na, nb;\r\n\r\n\tfor ( x = 0; x < radiusSegments; x ++ ) {\r\n\r\n\t\tif ( radiusTop !== 0 ) {\r\n\r\n\t\t\tna = this.vertices[ vertices[ 0 ][ x ] ].clone();\r\n\t\t\tnb = this.vertices[ vertices[ 0 ][ x + 1 ] ].clone();\r\n\r\n\t\t} else {\r\n\r\n\t\t\tna = this.vertices[ vertices[ 1 ][ x ] ].clone();\r\n\t\t\tnb = this.vertices[ vertices[ 1 ][ x + 1 ] ].clone();\r\n\r\n\t\t}\r\n\r\n\t\tna.setY( Math.sqrt( na.x * na.x + na.z * na.z ) * tanTheta ).normalize();\r\n\t\tnb.setY( Math.sqrt( nb.x * nb.x + nb.z * nb.z ) * tanTheta ).normalize();\r\n\r\n\t\tfor ( y = 0; y < heightSegments; y ++ ) {\r\n\r\n\t\t\tvar v1 = vertices[ y ][ x ];\r\n\t\t\tvar v2 = vertices[ y + 1 ][ x ];\r\n\t\t\tvar v3 = vertices[ y + 1 ][ x + 1 ];\r\n\t\t\tvar v4 = vertices[ y ][ x + 1 ];\r\n\r\n\t\t\tvar n1 = na.clone();\r\n\t\t\tvar n2 = na.clone();\r\n\t\t\tvar n3 = nb.clone();\r\n\t\t\tvar n4 = nb.clone();\r\n\r\n\t\t\tvar uv1 = uvs[ y ][ x ].clone();\r\n\t\t\tvar uv2 = uvs[ y + 1 ][ x ].clone();\r\n\t\t\tvar uv3 = uvs[ y + 1 ][ x + 1 ].clone();\r\n\t\t\tvar uv4 = uvs[ y ][ x + 1 ].clone();\r\n\r\n\t\t\tthis.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// top cap\r\n\r\n\tif ( openEnded === false && radiusTop > 0 ) {\r\n\r\n\t\tthis.vertices.push( new THREE.Vector3( 0, heightHalf, 0 ) );\r\n\r\n\t\tfor ( x = 0; x < radiusSegments; x ++ ) {\r\n\r\n\t\t\tvar v1 = vertices[ 0 ][ x ];\r\n\t\t\tvar v2 = vertices[ 0 ][ x + 1 ];\r\n\t\t\tvar v3 = this.vertices.length - 1;\r\n\r\n\t\t\tvar n1 = new THREE.Vector3( 0, 1, 0 );\r\n\t\t\tvar n2 = new THREE.Vector3( 0, 1, 0 );\r\n\t\t\tvar n3 = new THREE.Vector3( 0, 1, 0 );\r\n\r\n\t\t\tvar uv1 = uvs[ 0 ][ x ].clone();\r\n\t\t\tvar uv2 = uvs[ 0 ][ x + 1 ].clone();\r\n\t\t\tvar uv3 = new THREE.Vector2( uv2.u, 0 );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// bottom cap\r\n\r\n\tif ( openEnded === false && radiusBottom > 0 ) {\r\n\r\n\t\tthis.vertices.push( new THREE.Vector3( 0, - heightHalf, 0 ) );\r\n\r\n\t\tfor ( x = 0; x < radiusSegments; x ++ ) {\r\n\r\n\t\t\tvar v1 = vertices[ y ][ x + 1 ];\r\n\t\t\tvar v2 = vertices[ y ][ x ];\r\n\t\t\tvar v3 = this.vertices.length - 1;\r\n\r\n\t\t\tvar n1 = new THREE.Vector3( 0, - 1, 0 );\r\n\t\t\tvar n2 = new THREE.Vector3( 0, - 1, 0 );\r\n\t\t\tvar n3 = new THREE.Vector3( 0, - 1, 0 );\r\n\r\n\t\t\tvar uv1 = uvs[ y ][ x + 1 ].clone();\r\n\t\t\tvar uv2 = uvs[ y ][ x ].clone();\r\n\t\t\tvar uv3 = new THREE.Vector2( uv2.u, 1 );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n}\r\n\r\nTHREE.CylinderGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n *\r\n * Creates extruded geometry from a path shape.\r\n *\r\n * parameters = {\r\n *\r\n * size: , // size of the text\r\n * height: , // thickness to extrude text\r\n * curveSegments: , // number of points on the curves\r\n * steps: , // number of points for z-side extrusions / used for subdividing segements of extrude spline too\r\n * amount: , // Amount\r\n *\r\n * bevelEnabled: , // turn on bevel\r\n * bevelThickness: , // how deep into text bevel goes\r\n * bevelSize: , // how far from text outline is bevel\r\n * bevelSegments: , // number of bevel layers\r\n *\r\n * extrudePath: // 3d spline path to extrude shape along. (creates Frames if .frames aren't defined)\r\n * frames: // containing arrays of tangents, normals, binormals\r\n *\r\n * material: // material index for front and back faces\r\n * extrudeMaterial: // material index for extrusion and beveled faces\r\n * uvGenerator: // object that provides UV generator functions\r\n *\r\n * }\r\n **/\r\n\r\nTHREE.ExtrudeGeometry = function ( shapes, options ) {\r\n\r\n\tif ( typeof( shapes ) === \"undefined\" ) {\r\n\t\tshapes = [];\r\n\t\treturn;\r\n\t}\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tshapes = shapes instanceof Array ? shapes : [ shapes ];\r\n\r\n\tthis.shapebb = shapes[ shapes.length - 1 ].getBoundingBox();\r\n\r\n\tthis.addShapeList( shapes, options );\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n\t// can't really use automatic vertex normals\r\n\t// as then front and back sides get smoothed too\r\n\t// should do separate smoothing just for sides\r\n\r\n\t//this.computeVertexNormals();\r\n\r\n\t//console.log( \"took\", ( Date.now() - startTime ) );\r\n\r\n};\r\n\r\nTHREE.ExtrudeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n\r\nTHREE.ExtrudeGeometry.prototype.addShapeList = function ( shapes, options ) {\r\n\tvar sl = shapes.length;\r\n\r\n\tfor ( var s = 0; s < sl; s ++ ) {\r\n\t\tvar shape = shapes[ s ];\r\n\t\tthis.addShape( shape, options );\r\n\t}\r\n};\r\n\r\nTHREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) {\r\n\r\n\tvar amount = options.amount !== undefined ? options.amount : 100;\r\n\r\n\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\r\n\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\r\n\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\r\n\r\n\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\r\n\r\n\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\r\n\r\n\tvar steps = options.steps !== undefined ? options.steps : 1;\r\n\r\n\tvar extrudePath = options.extrudePath;\r\n\tvar extrudePts, extrudeByPath = false;\r\n\r\n\tvar material = options.material;\r\n\tvar extrudeMaterial = options.extrudeMaterial;\r\n\r\n\t// Use default WorldUVGenerator if no UV generators are specified.\r\n\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : THREE.ExtrudeGeometry.WorldUVGenerator;\r\n\r\n\tvar shapebb = this.shapebb;\r\n\t//shapebb = shape.getBoundingBox();\r\n\r\n\r\n\r\n\tvar splineTube, binormal, normal, position2;\r\n\tif ( extrudePath ) {\r\n\r\n\t\textrudePts = extrudePath.getSpacedPoints( steps );\r\n\r\n\t\textrudeByPath = true;\r\n\t\tbevelEnabled = false; // bevels not supported for path extrusion\r\n\r\n\t\t// SETUP TNB variables\r\n\r\n\t\t// Reuse TNB from TubeGeomtry for now.\r\n\t\t// TODO1 - have a .isClosed in spline?\r\n\r\n\t\tsplineTube = options.frames !== undefined ? options.frames : new THREE.TubeGeometry.FrenetFrames(extrudePath, steps, false);\r\n\r\n\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\r\n\r\n\t\tbinormal = new THREE.Vector3();\r\n\t\tnormal = new THREE.Vector3();\r\n\t\tposition2 = new THREE.Vector3();\r\n\r\n\t}\r\n\r\n\t// Safeguards if bevels are not enabled\r\n\r\n\tif ( ! bevelEnabled ) {\r\n\r\n\t\tbevelSegments = 0;\r\n\t\tbevelThickness = 0;\r\n\t\tbevelSize = 0;\r\n\r\n\t}\r\n\r\n\t// Variables initalization\r\n\r\n\tvar ahole, h, hl; // looping of holes\r\n\tvar scope = this;\r\n\tvar bevelPoints = [];\r\n\r\n\tvar shapesOffset = this.vertices.length;\r\n\r\n\tvar shapePoints = shape.extractPoints( curveSegments );\r\n\r\n\tvar vertices = shapePoints.shape;\r\n\tvar holes = shapePoints.holes;\r\n\r\n\tvar reverse = !THREE.Shape.Utils.isClockWise( vertices ) ;\r\n\r\n\tif ( reverse ) {\r\n\r\n\t\tvertices = vertices.reverse();\r\n\r\n\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\r\n\t\t\tif ( THREE.Shape.Utils.isClockWise( ahole ) ) {\r\n\r\n\t\t\t\tholes[ h ] = ahole.reverse();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)!\r\n\r\n\t}\r\n\r\n\r\n\tvar faces = THREE.Shape.Utils.triangulateShape ( vertices, holes );\r\n\r\n\t/* Vertices */\r\n\r\n\tvar contour = vertices; // vertices has all points but contour has only points of circumference\r\n\r\n\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\tahole = holes[ h ];\r\n\r\n\t\tvertices = vertices.concat( ahole );\r\n\r\n\t}\r\n\r\n\r\n\tfunction scalePt2 ( pt, vec, size ) {\r\n\r\n\t\tif ( !vec ) console.log( \"die\" );\r\n\r\n\t\treturn vec.clone().multiplyScalar( size ).add( pt );\r\n\r\n\t}\r\n\r\n\tvar b, bs, t, z,\r\n\t\tvert, vlen = vertices.length,\r\n\t\tface, flen = faces.length,\r\n\t\tcont, clen = contour.length;\r\n\r\n\r\n\t// Find directions for point movement\r\n\r\n\tvar RAD_TO_DEGREES = 180 / Math.PI;\r\n\r\n\r\n\tfunction getBevelVec( pt_i, pt_j, pt_k ) {\r\n\r\n\t\t// Algorithm 2\r\n\r\n\t\treturn getBevelVec2( pt_i, pt_j, pt_k );\r\n\r\n\t}\r\n\r\n\tfunction getBevelVec1( pt_i, pt_j, pt_k ) {\r\n\r\n\t\tvar anglea = Math.atan2( pt_j.y - pt_i.y, pt_j.x - pt_i.x );\r\n\t\tvar angleb = Math.atan2( pt_k.y - pt_i.y, pt_k.x - pt_i.x );\r\n\r\n\t\tif ( anglea > angleb ) {\r\n\r\n\t\t\tangleb += Math.PI * 2;\r\n\r\n\t\t}\r\n\r\n\t\tvar anglec = ( anglea + angleb ) / 2;\r\n\r\n\r\n\t\t//console.log('angle1', anglea * RAD_TO_DEGREES,'angle2', angleb * RAD_TO_DEGREES, 'anglec', anglec *RAD_TO_DEGREES);\r\n\r\n\t\tvar x = - Math.cos( anglec );\r\n\t\tvar y = - Math.sin( anglec );\r\n\r\n\t\tvar vec = new THREE.Vector2( x, y ); //.normalize();\r\n\r\n\t\treturn vec;\r\n\r\n\t}\r\n\r\n\tfunction getBevelVec2( pt_i, pt_j, pt_k ) {\r\n\r\n\t\tvar a = THREE.ExtrudeGeometry.__v1,\r\n\t\t\tb = THREE.ExtrudeGeometry.__v2,\r\n\t\t\tv_hat = THREE.ExtrudeGeometry.__v3,\r\n\t\t\tw_hat = THREE.ExtrudeGeometry.__v4,\r\n\t\t\tp = THREE.ExtrudeGeometry.__v5,\r\n\t\t\tq = THREE.ExtrudeGeometry.__v6,\r\n\t\t\tv, w,\r\n\t\t\tv_dot_w_hat, q_sub_p_dot_w_hat,\r\n\t\t\ts, intersection;\r\n\r\n\t\t// good reading for line-line intersection\r\n\t\t// http://sputsoft.com/blog/2010/03/line-line-intersection.html\r\n\r\n\t\t// define a as vector j->i\r\n\t\t// define b as vectot k->i\r\n\r\n\t\ta.set( pt_i.x - pt_j.x, pt_i.y - pt_j.y );\r\n\t\tb.set( pt_i.x - pt_k.x, pt_i.y - pt_k.y );\r\n\r\n\t\t// get unit vectors\r\n\r\n\t\tv = a.normalize();\r\n\t\tw = b.normalize();\r\n\r\n\t\t// normals from pt i\r\n\r\n\t\tv_hat.set( -v.y, v.x );\r\n\t\tw_hat.set( w.y, -w.x );\r\n\r\n\t\t// pts from i\r\n\r\n\t\tp.copy( pt_i ).add( v_hat );\r\n\t\tq.copy( pt_i ).add( w_hat );\r\n\r\n\t\tif ( p.equals( q ) ) {\r\n\r\n\t\t\t//console.log(\"Warning: lines are straight\");\r\n\t\t\treturn w_hat.clone();\r\n\r\n\t\t}\r\n\r\n\t\t// Points from j, k. helps prevents points cross overover most of the time\r\n\r\n\t\tp.copy( pt_j ).add( v_hat );\r\n\t\tq.copy( pt_k ).add( w_hat );\r\n\r\n\t\tv_dot_w_hat = v.dot( w_hat );\r\n\t\tq_sub_p_dot_w_hat = q.sub( p ).dot( w_hat );\r\n\r\n\t\t// We should not reach these conditions\r\n\r\n\t\tif ( v_dot_w_hat === 0 ) {\r\n\r\n\t\t\tconsole.log( \"Either infinite or no solutions!\" );\r\n\r\n\t\t\tif ( q_sub_p_dot_w_hat === 0 ) {\r\n\r\n\t\t\t\tconsole.log( \"Its finite solutions.\" );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tconsole.log( \"Too bad, no solutions.\" );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\ts = q_sub_p_dot_w_hat / v_dot_w_hat;\r\n\r\n\t\tif ( s < 0 ) {\r\n\r\n\t\t\t// in case of emergecy, revert to algorithm 1.\r\n\r\n\t\t\treturn getBevelVec1( pt_i, pt_j, pt_k );\r\n\r\n\t\t}\r\n\r\n\t\tintersection = v.multiplyScalar( s ).add( p );\r\n\r\n\t\treturn intersection.sub( pt_i ).clone(); // Don't normalize!, otherwise sharp corners become ugly\r\n\r\n\t}\r\n\r\n\tvar contourMovements = [];\r\n\r\n\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\r\n\r\n\t\tif ( j === il ) j = 0;\r\n\t\tif ( k === il ) k = 0;\r\n\r\n\t\t// (j)---(i)---(k)\r\n\t\t// console.log('i,j,k', i, j , k)\r\n\r\n\t\tvar pt_i = contour[ i ];\r\n\t\tvar pt_j = contour[ j ];\r\n\t\tvar pt_k = contour[ k ];\r\n\r\n\t\tcontourMovements[ i ]= getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\r\n\r\n\t}\r\n\r\n\tvar holesMovements = [], oneHoleMovements, verticesMovements = contourMovements.concat();\r\n\r\n\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\tahole = holes[ h ];\r\n\r\n\t\toneHoleMovements = [];\r\n\r\n\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\r\n\r\n\t\t\tif ( j === il ) j = 0;\r\n\t\t\tif ( k === il ) k = 0;\r\n\r\n\t\t\t// (j)---(i)---(k)\r\n\t\t\toneHoleMovements[ i ]= getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\r\n\r\n\t\t}\r\n\r\n\t\tholesMovements.push( oneHoleMovements );\r\n\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\r\n\r\n\t}\r\n\r\n\r\n\t// Loop bevelSegments, 1 for the front, 1 for the back\r\n\r\n\tfor ( b = 0; b < bevelSegments; b ++ ) {\r\n\t//for ( b = bevelSegments; b > 0; b -- ) {\r\n\r\n\t\tt = b / bevelSegments;\r\n\t\tz = bevelThickness * ( 1 - t );\r\n\r\n\t\t//z = bevelThickness * t;\r\n\t\tbs = bevelSize * ( Math.sin ( t * Math.PI/2 ) ) ; // curved\r\n\t\t//bs = bevelSize * t ; // linear\r\n\r\n\t\t// contract shape\r\n\r\n\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\r\n\r\n\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\r\n\t\t\t//vert = scalePt( contour[ i ], contourCentroid, bs, false );\r\n\t\t\tv( vert.x, vert.y, - z );\r\n\r\n\t\t}\r\n\r\n\t\t// expand holes\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\toneHoleMovements = holesMovements[ h ];\r\n\r\n\t\t\tfor ( i = 0, il = ahole.length; i < il; i++ ) {\r\n\r\n\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\r\n\t\t\t\t//vert = scalePt( ahole[ i ], holesCentroids[ h ], bs, true );\r\n\r\n\t\t\t\tv( vert.x, vert.y, -z );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tbs = bevelSize;\r\n\r\n\t// Back facing vertices\r\n\r\n\tfor ( i = 0; i < vlen; i ++ ) {\r\n\r\n\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\r\n\r\n\t\tif ( !extrudeByPath ) {\r\n\r\n\t\t\tv( vert.x, vert.y, 0 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\r\n\r\n\t\t\tnormal.copy( splineTube.normals[0] ).multiplyScalar(vert.x);\r\n\t\t\tbinormal.copy( splineTube.binormals[0] ).multiplyScalar(vert.y);\r\n\r\n\t\t\tposition2.copy( extrudePts[0] ).add(normal).add(binormal);\r\n\r\n\t\t\tv( position2.x, position2.y, position2.z );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Add stepped vertices...\r\n\t// Including front facing vertices\r\n\r\n\tvar s;\r\n\r\n\tfor ( s = 1; s <= steps; s ++ ) {\r\n\r\n\t\tfor ( i = 0; i < vlen; i ++ ) {\r\n\r\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\r\n\r\n\t\t\tif ( !extrudeByPath ) {\r\n\r\n\t\t\t\tv( vert.x, vert.y, amount / steps * s );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\r\n\r\n\t\t\t\tnormal.copy( splineTube.normals[s] ).multiplyScalar( vert.x );\r\n\t\t\t\tbinormal.copy( splineTube.binormals[s] ).multiplyScalar( vert.y );\r\n\r\n\t\t\t\tposition2.copy( extrudePts[s] ).add( normal ).add( binormal );\r\n\r\n\t\t\t\tv( position2.x, position2.y, position2.z );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Add bevel segments planes\r\n\r\n\t//for ( b = 1; b <= bevelSegments; b ++ ) {\r\n\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\r\n\r\n\t\tt = b / bevelSegments;\r\n\t\tz = bevelThickness * ( 1 - t );\r\n\t\t//bs = bevelSize * ( 1-Math.sin ( ( 1 - t ) * Math.PI/2 ) );\r\n\t\tbs = bevelSize * Math.sin ( t * Math.PI/2 ) ;\r\n\r\n\t\t// contract shape\r\n\r\n\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\r\n\r\n\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\r\n\t\t\tv( vert.x, vert.y, amount + z );\r\n\r\n\t\t}\r\n\r\n\t\t// expand holes\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\toneHoleMovements = holesMovements[ h ];\r\n\r\n\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\r\n\r\n\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\r\n\r\n\t\t\t\tif ( !extrudeByPath ) {\r\n\r\n\t\t\t\t\tv( vert.x, vert.y, amount + z );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t/* Faces */\r\n\r\n\t// Top and bottom faces\r\n\r\n\tbuildLidFaces();\r\n\r\n\t// Sides faces\r\n\r\n\tbuildSideFaces();\r\n\r\n\r\n\t///// Internal functions\r\n\r\n\tfunction buildLidFaces() {\r\n\r\n\t\tif ( bevelEnabled ) {\r\n\r\n\t\t\tvar layer = 0 ; // steps + 1\r\n\t\t\tvar offset = vlen * layer;\r\n\r\n\t\t\t// Bottom faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset, true );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tlayer = steps + bevelSegments * 2;\r\n\t\t\toffset = vlen * layer;\r\n\r\n\t\t\t// Top faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset, false );\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t// Bottom faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ], true );\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Top faces\r\n\r\n\t\t\tfor ( i = 0; i < flen; i ++ ) {\r\n\r\n\t\t\t\tface = faces[ i ];\r\n\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps, false );\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// Create faces for the z-sides of the shape\r\n\r\n\tfunction buildSideFaces() {\r\n\r\n\t\tvar layeroffset = 0;\r\n\t\tsidewalls( contour, layeroffset );\r\n\t\tlayeroffset += contour.length;\r\n\r\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\r\n\r\n\t\t\tahole = holes[ h ];\r\n\t\t\tsidewalls( ahole, layeroffset );\r\n\r\n\t\t\t//, true\r\n\t\t\tlayeroffset += ahole.length;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfunction sidewalls( contour, layeroffset ) {\r\n\r\n\t\tvar j, k;\r\n\t\ti = contour.length;\r\n\r\n\t\twhile ( --i >= 0 ) {\r\n\r\n\t\t\tj = i;\r\n\t\t\tk = i - 1;\r\n\t\t\tif ( k < 0 ) k = contour.length - 1;\r\n\r\n\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\r\n\r\n\t\t\tvar s = 0, sl = steps + bevelSegments * 2;\r\n\r\n\t\t\tfor ( s = 0; s < sl; s ++ ) {\r\n\r\n\t\t\t\tvar slen1 = vlen * s;\r\n\t\t\t\tvar slen2 = vlen * ( s + 1 );\r\n\r\n\t\t\t\tvar a = layeroffset + j + slen1,\r\n\t\t\t\t\tb = layeroffset + k + slen1,\r\n\t\t\t\t\tc = layeroffset + k + slen2,\r\n\t\t\t\t\td = layeroffset + j + slen2;\r\n\r\n\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\tfunction v( x, y, z ) {\r\n\r\n\t\tscope.vertices.push( new THREE.Vector3( x, y, z ) );\r\n\r\n\t}\r\n\r\n\tfunction f3( a, b, c, isBottom ) {\r\n\r\n\t\ta += shapesOffset;\r\n\t\tb += shapesOffset;\r\n\t\tc += shapesOffset;\r\n\r\n\t\t// normal, color, material\r\n\t\tscope.faces.push( new THREE.Face3( a, b, c, null, null, material ) );\r\n\r\n\t\tvar uvs = isBottom ? uvgen.generateBottomUV( scope, shape, options, a, b, c ) : uvgen.generateTopUV( scope, shape, options, a, b, c );\r\n\r\n \t\tscope.faceVertexUvs[ 0 ].push( uvs );\r\n\r\n\t}\r\n\r\n\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\r\n\r\n\t\ta += shapesOffset;\r\n\t\tb += shapesOffset;\r\n\t\tc += shapesOffset;\r\n\t\td += shapesOffset;\r\n\r\n \t\tscope.faces.push( new THREE.Face4( a, b, c, d, null, null, extrudeMaterial ) );\r\n\r\n \t\tvar uvs = uvgen.generateSideWallUV( scope, shape, wallContour, options, a, b, c, d,\r\n \t\t stepIndex, stepsLength, contourIndex1, contourIndex2 );\r\n \t\tscope.faceVertexUvs[ 0 ].push( uvs );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.ExtrudeGeometry.WorldUVGenerator = {\r\n\r\n\tgenerateTopUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) {\r\n\t\tvar ax = geometry.vertices[ indexA ].x,\r\n\t\t\tay = geometry.vertices[ indexA ].y,\r\n\r\n\t\t\tbx = geometry.vertices[ indexB ].x,\r\n\t\t\tby = geometry.vertices[ indexB ].y,\r\n\r\n\t\t\tcx = geometry.vertices[ indexC ].x,\r\n\t\t\tcy = geometry.vertices[ indexC ].y;\r\n\r\n\t\treturn [\r\n\t\t\tnew THREE.Vector2( ax, ay ),\r\n\t\t\tnew THREE.Vector2( bx, by ),\r\n\t\t\tnew THREE.Vector2( cx, cy )\r\n\t\t];\r\n\r\n\t},\r\n\r\n\tgenerateBottomUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC ) {\r\n\r\n\t\treturn this.generateTopUV( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC );\r\n\r\n\t},\r\n\r\n\tgenerateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions,\r\n\t indexA, indexB, indexC, indexD, stepIndex, stepsLength,\r\n\t contourIndex1, contourIndex2 ) {\r\n\r\n\t\tvar ax = geometry.vertices[ indexA ].x,\r\n\t\t\tay = geometry.vertices[ indexA ].y,\r\n\t\t\taz = geometry.vertices[ indexA ].z,\r\n\r\n\t\t\tbx = geometry.vertices[ indexB ].x,\r\n\t\t\tby = geometry.vertices[ indexB ].y,\r\n\t\t\tbz = geometry.vertices[ indexB ].z,\r\n\r\n\t\t\tcx = geometry.vertices[ indexC ].x,\r\n\t\t\tcy = geometry.vertices[ indexC ].y,\r\n\t\t\tcz = geometry.vertices[ indexC ].z,\r\n\r\n\t\t\tdx = geometry.vertices[ indexD ].x,\r\n\t\t\tdy = geometry.vertices[ indexD ].y,\r\n\t\t\tdz = geometry.vertices[ indexD ].z;\r\n\r\n\t\tif ( Math.abs( ay - by ) < 0.01 ) {\r\n\t\t\treturn [\r\n\t\t\t\tnew THREE.Vector2( ax, 1 - az ),\r\n\t\t\t\tnew THREE.Vector2( bx, 1 - bz ),\r\n\t\t\t\tnew THREE.Vector2( cx, 1 - cz ),\r\n\t\t\t\tnew THREE.Vector2( dx, 1 - dz )\r\n\t\t\t];\r\n\t\t} else {\r\n\t\t\treturn [\r\n\t\t\t\tnew THREE.Vector2( ay, 1 - az ),\r\n\t\t\t\tnew THREE.Vector2( by, 1 - bz ),\r\n\t\t\t\tnew THREE.Vector2( cy, 1 - cz ),\r\n\t\t\t\tnew THREE.Vector2( dy, 1 - dz )\r\n\t\t\t];\r\n\t\t}\r\n\t}\r\n};\r\n\r\nTHREE.ExtrudeGeometry.__v1 = new THREE.Vector2();\r\nTHREE.ExtrudeGeometry.__v2 = new THREE.Vector2();\r\nTHREE.ExtrudeGeometry.__v3 = new THREE.Vector2();\r\nTHREE.ExtrudeGeometry.__v4 = new THREE.Vector2();\r\nTHREE.ExtrudeGeometry.__v5 = new THREE.Vector2();\r\nTHREE.ExtrudeGeometry.__v6 = new THREE.Vector2();\r\n/**\r\n * @author jonobr1 / http://jonobr1.com\r\n *\r\n * Creates a one-sided polygonal geometry from a path shape. Similar to\r\n * ExtrudeGeometry.\r\n *\r\n * parameters = {\r\n *\r\n *\tcurveSegments: , // number of points on the curves. NOT USED AT THE MOMENT.\r\n *\r\n *\tmaterial: // material index for front and back faces\r\n *\tuvGenerator: // object that provides UV generator functions\r\n *\r\n * }\r\n **/\r\n\r\nTHREE.ShapeGeometry = function ( shapes, options ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tif ( shapes instanceof Array === false ) shapes = [ shapes ];\r\n\r\n\tthis.shapebb = shapes[ shapes.length - 1 ].getBoundingBox();\r\n\r\n\tthis.addShapeList( shapes, options );\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n};\r\n\r\nTHREE.ShapeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n\r\n/**\r\n * Add an array of shapes to THREE.ShapeGeometry.\r\n */\r\nTHREE.ShapeGeometry.prototype.addShapeList = function ( shapes, options ) {\r\n\r\n\tfor ( var i = 0, l = shapes.length; i < l; i++ ) {\r\n\r\n\t\tthis.addShape( shapes[ i ], options );\r\n\r\n\t}\r\n\r\n\treturn this;\r\n\r\n};\r\n\r\n/**\r\n * Adds a shape to THREE.ShapeGeometry, based on THREE.ExtrudeGeometry.\r\n */\r\nTHREE.ShapeGeometry.prototype.addShape = function ( shape, options ) {\r\n\r\n\tif ( options === undefined ) options = {};\r\n\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\r\n\r\n\tvar material = options.material;\r\n\tvar uvgen = options.UVGenerator === undefined ? THREE.ExtrudeGeometry.WorldUVGenerator : options.UVGenerator;\r\n\r\n\tvar shapebb = this.shapebb;\r\n\r\n\t//\r\n\r\n\tvar i, l, hole, s;\r\n\r\n\tvar shapesOffset = this.vertices.length;\r\n\tvar shapePoints = shape.extractPoints( curveSegments );\r\n\r\n\tvar vertices = shapePoints.shape;\r\n\tvar holes = shapePoints.holes;\r\n\r\n\tvar reverse = !THREE.Shape.Utils.isClockWise( vertices );\r\n\r\n\tif ( reverse ) {\r\n\r\n\t\tvertices = vertices.reverse();\r\n\r\n\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe...\r\n\r\n\t\tfor ( i = 0, l = holes.length; i < l; i++ ) {\r\n\r\n\t\t\thole = holes[ i ];\r\n\r\n\t\t\tif ( THREE.Shape.Utils.isClockWise( hole ) ) {\r\n\r\n\t\t\t\tholes[ i ] = hole.reverse();\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treverse = false;\r\n\r\n\t}\r\n\r\n\tvar faces = THREE.Shape.Utils.triangulateShape( vertices, holes );\r\n\r\n\t// Vertices\r\n\r\n\tvar contour = vertices;\r\n\r\n\tfor ( i = 0, l = holes.length; i < l; i++ ) {\r\n\r\n\t\thole = holes[ i ];\r\n\t\tvertices = vertices.concat( hole );\r\n\r\n\t}\r\n\r\n\t//\r\n\r\n\tvar vert, vlen = vertices.length;\r\n\tvar face, flen = faces.length;\r\n\tvar cont, clen = contour.length;\r\n\r\n\tfor ( i = 0; i < vlen; i++ ) {\r\n\r\n\t\tvert = vertices[ i ];\r\n\r\n\t\tthis.vertices.push( new THREE.Vector3( vert.x, vert.y, 0 ) );\r\n\r\n\t}\r\n\r\n\tfor ( i = 0; i < flen; i++ ) {\r\n\r\n\t\tface = faces[ i ];\r\n\r\n\t\tvar a = face[ 0 ] + shapesOffset;\r\n\t\tvar b = face[ 1 ] + shapesOffset;\r\n\t\tvar c = face[ 2 ] + shapesOffset;\r\n\r\n\t\tthis.faces.push( new THREE.Face3( a, b, c, null, null, material ) );\r\n\t\tthis.faceVertexUvs[ 0 ].push( uvgen.generateBottomUV( this, shape, options, a, b, c ) );\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author astrodud / http://astrodud.isgreat.org/\r\n * @author zz85 / https://github.com/zz85\r\n * @author bhouston / http://exocortex.com\r\n */\r\n\r\n// points - to create a closed torus, one must use a set of points \r\n// like so: [ a, b, c, d, a ], see first is the same as last.\r\n// segments - the number of circumference segments to create\r\n// phiStart - the starting radian\r\n// phiLength - the radian (0 to 2*PI) range of the lathed section\r\n// 2*pi is a closed lathe, less than 2PI is a portion.\r\nTHREE.LatheGeometry = function ( points, segments, phiStart, phiLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tsegments = segments || 12;\r\n\tphiStart = phiStart || 0;\r\n\tphiLength = phiLength || 2 * Math.PI;\r\n\r\n\tvar inversePointLength = 1.0 / ( points.length - 1 );\r\n\tvar inverseSegments = 1.0 / segments;\r\n\r\n\tfor ( var i = 0, il = segments; i <= il; i ++ ) {\r\n\r\n\t\tvar phi = phiStart + i * inverseSegments * phiLength;\r\n\r\n\t\tvar c = Math.cos( phi ),\r\n\t\t\ts = Math.sin( phi );\r\n\r\n\t\tfor ( var j = 0, jl = points.length; j < jl; j ++ ) {\r\n\r\n\t\t\tvar pt = points[ j ];\r\n\r\n\t\t\tvar vertex = new THREE.Vector3();\r\n\r\n\t\t\tvertex.x = c * pt.x - s * pt.y;\r\n\t\t\tvertex.y = s * pt.x + c * pt.y;\r\n\t\t\tvertex.z = pt.z;\r\n\r\n\t\t\tthis.vertices.push( vertex );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tvar np = points.length;\r\n\r\n\tfor ( var i = 0, il = segments; i < il; i ++ ) {\r\n\r\n\t\tfor ( var j = 0, jl = points.length - 1; j < jl; j ++ ) {\r\n\r\n\t\t\tvar base = j + np * i;\r\n\t\t\tvar a = base;\r\n\t\t\tvar b = base + np;\r\n\t\t\tvar c = base + 1 + np;\r\n\t\t\tvar d = base + 1;\r\n\r\n\t\t\tthis.faces.push( new THREE.Face4( a, b, c, d ) );\r\n\r\n\t\t\tvar u0 = i * inverseSegments;\r\n\t\t\tvar v0 = j * inversePointLength;\r\n\t\t\tvar u1 = u0 + inverseSegments;\r\n\t\t\tvar v1 = v0 + inversePointLength;\r\n\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [\r\n\r\n\t\t\t\tnew THREE.Vector2( u0, v0 ), \r\n\t\t\t\tnew THREE.Vector2( u1, v0 ),\r\n\t\t\t\tnew THREE.Vector2( u1, v1 ),\r\n\t\t\t\tnew THREE.Vector2( u0, v1 )\r\n\r\n\t\t\t] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.mergeVertices();\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.LatheGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Plane.as\r\n */\r\n\r\nTHREE.PlaneGeometry = function ( width, height, widthSegments, heightSegments ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.width = width;\r\n\tthis.height = height;\r\n\r\n\tthis.widthSegments = widthSegments || 1;\r\n\tthis.heightSegments = heightSegments || 1;\r\n\r\n\tvar ix, iz;\r\n\tvar width_half = width / 2;\r\n\tvar height_half = height / 2;\r\n\r\n\tvar gridX = this.widthSegments;\r\n\tvar gridZ = this.heightSegments;\r\n\r\n\tvar gridX1 = gridX + 1;\r\n\tvar gridZ1 = gridZ + 1;\r\n\r\n\tvar segment_width = this.width / gridX;\r\n\tvar segment_height = this.height / gridZ;\r\n\r\n\tvar normal = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\tfor ( iz = 0; iz < gridZ1; iz ++ ) {\r\n\r\n\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\r\n\r\n\t\t\tvar x = ix * segment_width - width_half;\r\n\t\t\tvar y = iz * segment_height - height_half;\r\n\r\n\t\t\tthis.vertices.push( new THREE.Vector3( x, - y, 0 ) );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( iz = 0; iz < gridZ; iz ++ ) {\r\n\r\n\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\r\n\r\n\t\t\tvar a = ix + gridX1 * iz;\r\n\t\t\tvar b = ix + gridX1 * ( iz + 1 );\r\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iz + 1 );\r\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iz;\r\n\r\n\t\t\tvar face = new THREE.Face4( a, b, c, d );\r\n\t\t\tface.normal.copy( normal );\r\n\t\t\tface.vertexNormals.push( normal.clone(), normal.clone(), normal.clone(), normal.clone() );\r\n\r\n\t\t\tthis.faces.push( face );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [\r\n\t\t\t\tnew THREE.Vector2( ix / gridX, 1 - iz / gridZ ),\r\n\t\t\t\tnew THREE.Vector2( ix / gridX, 1 - ( iz + 1 ) / gridZ ),\r\n\t\t\t\tnew THREE.Vector2( ( ix + 1 ) / gridX, 1 - ( iz + 1 ) / gridZ ),\r\n\t\t\t\tnew THREE.Vector2( ( ix + 1 ) / gridX, 1 - iz / gridZ )\r\n\t\t\t] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\r\n};\r\n\r\nTHREE.PlaneGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author Kaleb Murphy\r\n */\r\n\r\nTHREE.RingGeometry = function ( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tinnerRadius = innerRadius || 0;\r\n\touterRadius = outerRadius || 50;\r\n\r\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\r\n\r\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\r\n\tphiSegments = phiSegments !== undefined ? Math.max( 3, phiSegments ) : 8;\r\n\r\n\tvar i, o, uvs = [], radius = innerRadius, radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\r\n\r\n\tfor ( i = 0; i <= phiSegments; i ++ ) { // concentric circles inside ring\r\n\r\n\t\tfor ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle\r\n\r\n\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\tvar segment = thetaStart + o / thetaSegments * thetaLength;\r\n\r\n\t\t\tvertex.x = radius * Math.cos( segment );\r\n\t\t\tvertex.y = radius * Math.sin( segment );\r\n\r\n\t\t\tthis.vertices.push( vertex );\r\n\t\t\tuvs.push( new THREE.Vector2( ( vertex.x / radius + 1 ) / 2, - ( vertex.y / radius + 1 ) / 2 + 1 ) );\r\n\t\t}\r\n\r\n\t\tradius += radiusStep;\r\n\r\n\t}\r\n\r\n\tvar n = new THREE.Vector3( 0, 0, 1 );\r\n\r\n\tfor ( i = 0; i < phiSegments; i ++ ) { // concentric circles inside ring\r\n\r\n\t\tvar thetaSegment = i * thetaSegments;\r\n\r\n\t\tfor ( o = 0; o <= thetaSegments; o ++ ) { // number of segments per circle\r\n\r\n\t\t\tvar segment = o + thetaSegment;\r\n\r\n\t\t\tvar v1 = segment + i;\r\n\t\t\tvar v2 = segment + thetaSegments + i;\r\n\t\t\tvar v3 = segment + thetaSegments + 1 + i;\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);\r\n\r\n\t\t\tv1 = segment + i;\r\n\t\t\tv2 = segment + thetaSegments + 1 + i;\r\n\t\t\tv3 = segment + 1 + i;\r\n\r\n\t\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n, n, n ] ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uvs[ v1 ], uvs[ v2 ], uvs[ v3 ] ]);\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n};\r\n\r\nTHREE.RingGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.SphereGeometry = function ( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.radius = radius = radius || 50;\r\n\r\n\tthis.widthSegments = widthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\r\n\tthis.heightSegments = heightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\r\n\r\n\tthis.phiStart = phiStart = phiStart !== undefined ? phiStart : 0;\r\n\tthis.phiLength = phiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\r\n\r\n\tthis.thetaStart = thetaStart = thetaStart !== undefined ? thetaStart : 0;\r\n\tthis.thetaLength = thetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\r\n\r\n\tvar x, y, vertices = [], uvs = [];\r\n\r\n\tfor ( y = 0; y <= heightSegments; y ++ ) {\r\n\r\n\t\tvar verticesRow = [];\r\n\t\tvar uvsRow = [];\r\n\r\n\t\tfor ( x = 0; x <= widthSegments; x ++ ) {\r\n\r\n\t\t\tvar u = x / widthSegments;\r\n\t\t\tvar v = y / heightSegments;\r\n\r\n\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\r\n\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\r\n\r\n\t\t\tthis.vertices.push( vertex );\r\n\r\n\t\t\tverticesRow.push( this.vertices.length - 1 );\r\n\t\t\tuvsRow.push( new THREE.Vector2( u, 1 - v ) );\r\n\r\n\t\t}\r\n\r\n\t\tvertices.push( verticesRow );\r\n\t\tuvs.push( uvsRow );\r\n\r\n\t}\r\n\r\n\tfor ( y = 0; y < this.heightSegments; y ++ ) {\r\n\r\n\t\tfor ( x = 0; x < this.widthSegments; x ++ ) {\r\n\r\n\t\t\tvar v1 = vertices[ y ][ x + 1 ];\r\n\t\t\tvar v2 = vertices[ y ][ x ];\r\n\t\t\tvar v3 = vertices[ y + 1 ][ x ];\r\n\t\t\tvar v4 = vertices[ y + 1 ][ x + 1 ];\r\n\r\n\t\t\tvar n1 = this.vertices[ v1 ].clone().normalize();\r\n\t\t\tvar n2 = this.vertices[ v2 ].clone().normalize();\r\n\t\t\tvar n3 = this.vertices[ v3 ].clone().normalize();\r\n\t\t\tvar n4 = this.vertices[ v4 ].clone().normalize();\r\n\r\n\t\t\tvar uv1 = uvs[ y ][ x + 1 ].clone();\r\n\t\t\tvar uv2 = uvs[ y ][ x ].clone();\r\n\t\t\tvar uv3 = uvs[ y + 1 ][ x ].clone();\r\n\t\t\tvar uv4 = uvs[ y + 1 ][ x + 1 ].clone();\r\n\r\n\t\t\tif ( Math.abs( this.vertices[ v1 ].y ) === this.radius ) {\r\n\r\n\t\t\t\tthis.faces.push( new THREE.Face3( v1, v3, v4, [ n1, n3, n4 ] ) );\r\n\t\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv3, uv4 ] );\r\n\r\n\t\t\t} else if ( Math.abs( this.vertices[ v3 ].y ) === this.radius ) {\r\n\r\n\t\t\t\tthis.faces.push( new THREE.Face3( v1, v2, v3, [ n1, n2, n3 ] ) );\r\n\t\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3 ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tthis.faces.push( new THREE.Face4( v1, v2, v3, v4, [ n1, n2, n3, n4 ] ) );\r\n\t\t\t\tthis.faceVertexUvs[ 0 ].push( [ uv1, uv2, uv3, uv4 ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n};\r\n\r\nTHREE.SphereGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author zz85 / http://www.lab4games.net/zz85/blog\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n * For creating 3D text geometry in three.js\r\n *\r\n * Text = 3D Text\r\n *\r\n * parameters = {\r\n * size: \t\t\t, \t// size of the text\r\n * height: \t\t, \t// thickness to extrude text\r\n * curveSegments: \t,\t\t// number of points on the curves\r\n *\r\n * font: \t\t\t,\t\t// font name\r\n * weight: \t\t,\t\t// font weight (normal, bold)\r\n * style: \t\t\t,\t\t// font style (normal, italics)\r\n *\r\n * bevelEnabled:\t,\t\t\t// turn on bevel\r\n * bevelThickness: , \t\t// how deep into text bevel goes\r\n * bevelSize:\t\t, \t\t// how far from text outline is bevel\r\n * }\r\n *\r\n */\r\n\r\n/*\tUsage Examples\r\n\r\n\t// TextGeometry wrapper\r\n\r\n\tvar text3d = new TextGeometry( text, options );\r\n\r\n\t// Complete manner\r\n\r\n\tvar textShapes = THREE.FontUtils.generateShapes( text, options );\r\n\tvar text3d = new ExtrudeGeometry( textShapes, options );\r\n\r\n*/\r\n\r\n\r\nTHREE.TextGeometry = function ( text, parameters ) {\r\n\r\n\tparameters = parameters || {};\r\n\r\n\tvar textShapes = THREE.FontUtils.generateShapes( text, parameters );\r\n\r\n\t// translate parameters to ExtrudeGeometry API\r\n\r\n\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\r\n\r\n\t// defaults\r\n\r\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\r\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\r\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\r\n\r\n\tTHREE.ExtrudeGeometry.call( this, textShapes, parameters );\r\n\r\n};\r\n\r\nTHREE.TextGeometry.prototype = Object.create( THREE.ExtrudeGeometry.prototype );\r\n/**\r\n * @author oosmoxiecode\r\n * @author mrdoob / http://mrdoob.com/\r\n * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3DLite/src/away3dlite/primitives/Torus.as?r=2888\r\n */\r\n\r\nTHREE.TorusGeometry = function ( radius, tube, radialSegments, tubularSegments, arc ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tvar scope = this;\r\n\r\n\tthis.radius = radius || 100;\r\n\tthis.tube = tube || 40;\r\n\tthis.radialSegments = radialSegments || 8;\r\n\tthis.tubularSegments = tubularSegments || 6;\r\n\tthis.arc = arc || Math.PI * 2;\r\n\r\n\tvar center = new THREE.Vector3(), uvs = [], normals = [];\r\n\r\n\tfor ( var j = 0; j <= this.radialSegments; j ++ ) {\r\n\r\n\t\tfor ( var i = 0; i <= this.tubularSegments; i ++ ) {\r\n\r\n\t\t\tvar u = i / this.tubularSegments * this.arc;\r\n\t\t\tvar v = j / this.radialSegments * Math.PI * 2;\r\n\r\n\t\t\tcenter.x = this.radius * Math.cos( u );\r\n\t\t\tcenter.y = this.radius * Math.sin( u );\r\n\r\n\t\t\tvar vertex = new THREE.Vector3();\r\n\t\t\tvertex.x = ( this.radius + this.tube * Math.cos( v ) ) * Math.cos( u );\r\n\t\t\tvertex.y = ( this.radius + this.tube * Math.cos( v ) ) * Math.sin( u );\r\n\t\t\tvertex.z = this.tube * Math.sin( v );\r\n\r\n\t\t\tthis.vertices.push( vertex );\r\n\r\n\t\t\tuvs.push( new THREE.Vector2( i / this.tubularSegments, j / this.radialSegments ) );\r\n\t\t\tnormals.push( vertex.clone().sub( center ).normalize() );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfor ( var j = 1; j <= this.radialSegments; j ++ ) {\r\n\r\n\t\tfor ( var i = 1; i <= this.tubularSegments; i ++ ) {\r\n\r\n\t\t\tvar a = ( this.tubularSegments + 1 ) * j + i - 1;\r\n\t\t\tvar b = ( this.tubularSegments + 1 ) * ( j - 1 ) + i - 1;\r\n\t\t\tvar c = ( this.tubularSegments + 1 ) * ( j - 1 ) + i;\r\n\t\t\tvar d = ( this.tubularSegments + 1 ) * j + i;\r\n\r\n\t\t\tvar face = new THREE.Face4( a, b, c, d, [ normals[ a ], normals[ b ], normals[ c ], normals[ d ] ] );\r\n\t\t\tface.normal.add( normals[ a ] );\r\n\t\t\tface.normal.add( normals[ b ] );\r\n\t\t\tface.normal.add( normals[ c ] );\r\n\t\t\tface.normal.add( normals[ d ] );\r\n\t\t\tface.normal.normalize();\r\n\r\n\t\t\tthis.faces.push( face );\r\n\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uvs[ a ].clone(), uvs[ b ].clone(), uvs[ c ].clone(), uvs[ d ].clone() ] );\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\r\n};\r\n\r\nTHREE.TorusGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author oosmoxiecode\r\n * based on http://code.google.com/p/away3d/source/browse/trunk/fp10/Away3D/src/away3d/primitives/TorusKnot.as?spec=svn2473&r=2473\r\n */\r\n\r\nTHREE.TorusKnotGeometry = function ( radius, tube, radialSegments, tubularSegments, p, q, heightScale ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tvar scope = this;\r\n\r\n\tthis.radius = radius || 100;\r\n\tthis.tube = tube || 40;\r\n\tthis.radialSegments = radialSegments || 64;\r\n\tthis.tubularSegments = tubularSegments || 8;\r\n\tthis.p = p || 2;\r\n\tthis.q = q || 3;\r\n\tthis.heightScale = heightScale || 1;\r\n\tthis.grid = new Array( this.radialSegments );\r\n\r\n\tvar tang = new THREE.Vector3();\r\n\tvar n = new THREE.Vector3();\r\n\tvar bitan = new THREE.Vector3();\r\n\r\n\tfor ( var i = 0; i < this.radialSegments; ++ i ) {\r\n\r\n\t\tthis.grid[ i ] = new Array( this.tubularSegments );\r\n\r\n\t\tfor ( var j = 0; j < this.tubularSegments; ++ j ) {\r\n\r\n\t\t\tvar u = i / this.radialSegments * 2 * this.p * Math.PI;\r\n\t\t\tvar v = j / this.tubularSegments * 2 * Math.PI;\r\n\t\t\tvar p1 = getPos( u, v, this.q, this.p, this.radius, this.heightScale );\r\n\t\t\tvar p2 = getPos( u + 0.01, v, this.q, this.p, this.radius, this.heightScale );\r\n\t\t\tvar cx, cy;\r\n\r\n\t\t\ttang.subVectors( p2, p1 );\r\n\t\t\tn.addVectors( p2, p1 );\r\n\r\n\t\t\tbitan.crossVectors( tang, n );\r\n\t\t\tn.crossVectors( bitan, tang );\r\n\t\t\tbitan.normalize();\r\n\t\t\tn.normalize();\r\n\r\n\t\t\tcx = - this.tube * Math.cos( v ); // TODO: Hack: Negating it so it faces outside.\r\n\t\t\tcy = this.tube * Math.sin( v );\r\n\r\n\t\t\tp1.x += cx * n.x + cy * bitan.x;\r\n\t\t\tp1.y += cx * n.y + cy * bitan.y;\r\n\t\t\tp1.z += cx * n.z + cy * bitan.z;\r\n\r\n\t\t\tthis.grid[ i ][ j ] = vert( p1.x, p1.y, p1.z );\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( var i = 0; i < this.radialSegments; ++ i ) {\r\n\r\n\t\tfor ( var j = 0; j < this.tubularSegments; ++ j ) {\r\n\r\n\t\t\tvar ip = ( i + 1 ) % this.radialSegments;\r\n\t\t\tvar jp = ( j + 1 ) % this.tubularSegments;\r\n\r\n\t\t\tvar a = this.grid[ i ][ j ];\r\n\t\t\tvar b = this.grid[ ip ][ j ];\r\n\t\t\tvar c = this.grid[ ip ][ jp ];\r\n\t\t\tvar d = this.grid[ i ][ jp ];\r\n\r\n\t\t\tvar uva = new THREE.Vector2( i / this.radialSegments, j / this.tubularSegments );\r\n\t\t\tvar uvb = new THREE.Vector2( ( i + 1 ) / this.radialSegments, j / this.tubularSegments );\r\n\t\t\tvar uvc = new THREE.Vector2( ( i + 1 ) / this.radialSegments, ( j + 1 ) / this.tubularSegments );\r\n\t\t\tvar uvd = new THREE.Vector2( i / this.radialSegments, ( j + 1 ) / this.tubularSegments );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face4( a, b, c, d ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uva,uvb,uvc, uvd ] );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n\tfunction vert( x, y, z ) {\r\n\r\n\t\treturn scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1;\r\n\r\n\t}\r\n\r\n\tfunction getPos( u, v, in_q, in_p, radius, heightScale ) {\r\n\r\n\t\tvar cu = Math.cos( u );\r\n\t\tvar cv = Math.cos( v );\r\n\t\tvar su = Math.sin( u );\r\n\t\tvar quOverP = in_q / in_p * u;\r\n\t\tvar cs = Math.cos( quOverP );\r\n\r\n\t\tvar tx = radius * ( 2 + cs ) * 0.5 * cu;\r\n\t\tvar ty = radius * ( 2 + cs ) * su * 0.5;\r\n\t\tvar tz = heightScale * radius * Math.sin( quOverP ) * 0.5;\r\n\r\n\t\treturn new THREE.Vector3( tx, ty, tz );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.TorusKnotGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author WestLangley / https://github.com/WestLangley\r\n * @author zz85 / https://github.com/zz85\r\n * @author miningold / https://github.com/miningold\r\n *\r\n * Modified from the TorusKnotGeometry by @oosmoxiecode\r\n *\r\n * Creates a tube which extrudes along a 3d spline\r\n *\r\n * Uses parallel transport frames as described in\r\n * http://www.cs.indiana.edu/pub/techreports/TR425.pdf\r\n */\r\n\r\nTHREE.TubeGeometry = function( path, segments, radius, radiusSegments, closed, debug ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tthis.path = path;\r\n\tthis.segments = segments || 64;\r\n\tthis.radius = radius || 1;\r\n\tthis.radiusSegments = radiusSegments || 8;\r\n\tthis.closed = closed || false;\r\n\r\n\tif ( debug ) this.debug = new THREE.Object3D();\r\n\r\n\tthis.grid = [];\r\n\r\n\tvar scope = this,\r\n\r\n\t\ttangent,\r\n\t\tnormal,\r\n\t\tbinormal,\r\n\r\n\t\tnumpoints = this.segments + 1,\r\n\r\n\t\tx, y, z,\r\n\t\ttx, ty, tz,\r\n\t\tu, v,\r\n\r\n\t\tcx, cy,\r\n\t\tpos, pos2 = new THREE.Vector3(),\r\n\t\ti, j,\r\n\t\tip, jp,\r\n\t\ta, b, c, d,\r\n\t\tuva, uvb, uvc, uvd;\r\n\r\n\tvar frames = new THREE.TubeGeometry.FrenetFrames( this.path, this.segments, this.closed ),\r\n\t\ttangents = frames.tangents,\r\n\t\tnormals = frames.normals,\r\n\t\tbinormals = frames.binormals;\r\n\r\n\t// proxy internals\r\n\tthis.tangents = tangents;\r\n\tthis.normals = normals;\r\n\tthis.binormals = binormals;\r\n\r\n\tfunction vert( x, y, z ) {\r\n\r\n\t\treturn scope.vertices.push( new THREE.Vector3( x, y, z ) ) - 1;\r\n\r\n\t}\r\n\r\n\r\n\t// consruct the grid\r\n\r\n\tfor ( i = 0; i < numpoints; i++ ) {\r\n\r\n\t\tthis.grid[ i ] = [];\r\n\r\n\t\tu = i / ( numpoints - 1 );\r\n\r\n\t\tpos = path.getPointAt( u );\r\n\r\n\t\ttangent = tangents[ i ];\r\n\t\tnormal = normals[ i ];\r\n\t\tbinormal = binormals[ i ];\r\n\r\n\t\tif ( this.debug ) {\r\n\r\n\t\t\tthis.debug.add( new THREE.ArrowHelper(tangent, pos, radius, 0x0000ff ) );\r\n\t\t\tthis.debug.add( new THREE.ArrowHelper(normal, pos, radius, 0xff0000 ) );\r\n\t\t\tthis.debug.add( new THREE.ArrowHelper(binormal, pos, radius, 0x00ff00 ) );\r\n\r\n\t\t}\r\n\r\n\t\tfor ( j = 0; j < this.radiusSegments; j++ ) {\r\n\r\n\t\t\tv = j / this.radiusSegments * 2 * Math.PI;\r\n\r\n\t\t\tcx = -this.radius * Math.cos( v ); // TODO: Hack: Negating it so it faces outside.\r\n\t\t\tcy = this.radius * Math.sin( v );\r\n\r\n\t\t\tpos2.copy( pos );\r\n\t\t\tpos2.x += cx * normal.x + cy * binormal.x;\r\n\t\t\tpos2.y += cx * normal.y + cy * binormal.y;\r\n\t\t\tpos2.z += cx * normal.z + cy * binormal.z;\r\n\r\n\t\t\tthis.grid[ i ][ j ] = vert( pos2.x, pos2.y, pos2.z );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t// construct the mesh\r\n\r\n\tfor ( i = 0; i < this.segments; i++ ) {\r\n\r\n\t\tfor ( j = 0; j < this.radiusSegments; j++ ) {\r\n\r\n\t\t\tip = ( this.closed ) ? (i + 1) % this.segments : i + 1;\r\n\t\t\tjp = (j + 1) % this.radiusSegments;\r\n\r\n\t\t\ta = this.grid[ i ][ j ];\t\t// *** NOT NECESSARILY PLANAR ! ***\r\n\t\t\tb = this.grid[ ip ][ j ];\r\n\t\t\tc = this.grid[ ip ][ jp ];\r\n\t\t\td = this.grid[ i ][ jp ];\r\n\r\n\t\t\tuva = new THREE.Vector2( i / this.segments, j / this.radiusSegments );\r\n\t\t\tuvb = new THREE.Vector2( ( i + 1 ) / this.segments, j / this.radiusSegments );\r\n\t\t\tuvc = new THREE.Vector2( ( i + 1 ) / this.segments, ( j + 1 ) / this.radiusSegments );\r\n\t\t\tuvd = new THREE.Vector2( i / this.segments, ( j + 1 ) / this.radiusSegments );\r\n\r\n\t\t\tthis.faces.push( new THREE.Face4( a, b, c, d ) );\r\n\t\t\tthis.faceVertexUvs[ 0 ].push( [ uva, uvb, uvc, uvd ] );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.TubeGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n\r\n\r\n// For computing of Frenet frames, exposing the tangents, normals and binormals the spline\r\nTHREE.TubeGeometry.FrenetFrames = function(path, segments, closed) {\r\n\r\n\tvar\ttangent = new THREE.Vector3(),\r\n\t\tnormal = new THREE.Vector3(),\r\n\t\tbinormal = new THREE.Vector3(),\r\n\r\n\t\ttangents = [],\r\n\t\tnormals = [],\r\n\t\tbinormals = [],\r\n\r\n\t\tvec = new THREE.Vector3(),\r\n\t\tmat = new THREE.Matrix4(),\r\n\r\n\t\tnumpoints = segments + 1,\r\n\t\ttheta,\r\n\t\tepsilon = 0.0001,\r\n\t\tsmallest,\r\n\r\n\t\ttx, ty, tz,\r\n\t\ti, u, v;\r\n\r\n\r\n\t// expose internals\r\n\tthis.tangents = tangents;\r\n\tthis.normals = normals;\r\n\tthis.binormals = binormals;\r\n\r\n\t// compute the tangent vectors for each segment on the path\r\n\r\n\tfor ( i = 0; i < numpoints; i++ ) {\r\n\r\n\t\tu = i / ( numpoints - 1 );\r\n\r\n\t\ttangents[ i ] = path.getTangentAt( u );\r\n\t\ttangents[ i ].normalize();\r\n\r\n\t}\r\n\r\n\tinitialNormal3();\r\n\r\n\tfunction initialNormal1(lastBinormal) {\r\n\t\t// fixed start binormal. Has dangers of 0 vectors\r\n\t\tnormals[ 0 ] = new THREE.Vector3();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3();\r\n\t\tif (lastBinormal===undefined) lastBinormal = new THREE.Vector3( 0, 0, 1 );\r\n\t\tnormals[ 0 ].crossVectors( lastBinormal, tangents[ 0 ] ).normalize();\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize();\r\n\t}\r\n\r\n\tfunction initialNormal2() {\r\n\r\n\t\t// This uses the Frenet-Serret formula for deriving binormal\r\n\t\tvar t2 = path.getTangentAt( epsilon );\r\n\r\n\t\tnormals[ 0 ] = new THREE.Vector3().subVectors( t2, tangents[ 0 ] ).normalize();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3().crossVectors( tangents[ 0 ], normals[ 0 ] );\r\n\r\n\t\tnormals[ 0 ].crossVectors( binormals[ 0 ], tangents[ 0 ] ).normalize(); // last binormal x tangent\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] ).normalize();\r\n\r\n\t}\r\n\r\n\tfunction initialNormal3() {\r\n\t\t// select an initial normal vector perpenicular to the first tangent vector,\r\n\t\t// and in the direction of the smallest tangent xyz component\r\n\r\n\t\tnormals[ 0 ] = new THREE.Vector3();\r\n\t\tbinormals[ 0 ] = new THREE.Vector3();\r\n\t\tsmallest = Number.MAX_VALUE;\r\n\t\ttx = Math.abs( tangents[ 0 ].x );\r\n\t\tty = Math.abs( tangents[ 0 ].y );\r\n\t\ttz = Math.abs( tangents[ 0 ].z );\r\n\r\n\t\tif ( tx <= smallest ) {\r\n\t\t\tsmallest = tx;\r\n\t\t\tnormal.set( 1, 0, 0 );\r\n\t\t}\r\n\r\n\t\tif ( ty <= smallest ) {\r\n\t\t\tsmallest = ty;\r\n\t\t\tnormal.set( 0, 1, 0 );\r\n\t\t}\r\n\r\n\t\tif ( tz <= smallest ) {\r\n\t\t\tnormal.set( 0, 0, 1 );\r\n\t\t}\r\n\r\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\r\n\r\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\r\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\r\n\t}\r\n\r\n\r\n\t// compute the slowly-varying normal and binormal vectors for each segment on the path\r\n\r\n\tfor ( i = 1; i < numpoints; i++ ) {\r\n\r\n\t\tnormals[ i ] = normals[ i-1 ].clone();\r\n\r\n\t\tbinormals[ i ] = binormals[ i-1 ].clone();\r\n\r\n\t\tvec.crossVectors( tangents[ i-1 ], tangents[ i ] );\r\n\r\n\t\tif ( vec.length() > epsilon ) {\r\n\r\n\t\t\tvec.normalize();\r\n\r\n\t\t\ttheta = Math.acos( tangents[ i-1 ].dot( tangents[ i ] ) );\r\n\r\n\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\r\n\r\n\t\t}\r\n\r\n\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\r\n\r\n\t}\r\n\r\n\r\n\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\r\n\r\n\tif ( closed ) {\r\n\r\n\t\ttheta = Math.acos( normals[ 0 ].dot( normals[ numpoints-1 ] ) );\r\n\t\ttheta /= ( numpoints - 1 );\r\n\r\n\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ numpoints-1 ] ) ) > 0 ) {\r\n\r\n\t\t\ttheta = -theta;\r\n\r\n\t\t}\r\n\r\n\t\tfor ( i = 1; i < numpoints; i++ ) {\r\n\r\n\t\t\t// twist a little...\r\n\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\r\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\r\n\r\n\t\t}\r\n\r\n\t}\r\n};\r\n/**\r\n * @author clockworkgeek / https://github.com/clockworkgeek\r\n * @author timothypratley / https://github.com/timothypratley\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.PolyhedronGeometry = function ( vertices, faces, radius, detail ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tradius = radius || 1;\r\n\tdetail = detail || 0;\r\n\r\n\tvar that = this;\r\n\r\n\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\r\n\r\n\t\tprepare( new THREE.Vector3( vertices[ i ][ 0 ], vertices[ i ][ 1 ], vertices[ i ][ 2 ] ) );\r\n\r\n\t}\r\n\r\n\tvar midpoints = [], p = this.vertices;\r\n\r\n\tvar f = [];\r\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\r\n\r\n\t\tvar v1 = p[ faces[ i ][ 0 ] ];\r\n\t\tvar v2 = p[ faces[ i ][ 1 ] ];\r\n\t\tvar v3 = p[ faces[ i ][ 2 ] ];\r\n\r\n\t\tf[ i ] = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] );\r\n\r\n\t}\r\n\r\n\tfor ( var i = 0, l = f.length; i < l; i ++ ) {\r\n\r\n\t\tsubdivide(f[ i ], detail);\r\n\r\n\t}\r\n\r\n\r\n\t// Handle case when face straddles the seam\r\n\r\n\tfor ( var i = 0, l = this.faceVertexUvs[ 0 ].length; i < l; i ++ ) {\r\n\r\n\t\tvar uvs = this.faceVertexUvs[ 0 ][ i ];\r\n\r\n\t\tvar x0 = uvs[ 0 ].x;\r\n\t\tvar x1 = uvs[ 1 ].x;\r\n\t\tvar x2 = uvs[ 2 ].x;\r\n\r\n\t\tvar max = Math.max( x0, Math.max( x1, x2 ) );\r\n\t\tvar min = Math.min( x0, Math.min( x1, x2 ) );\r\n\r\n\t\tif ( max > 0.9 && min < 0.1 ) { // 0.9 is somewhat arbitrary\r\n\r\n\t\t\tif ( x0 < 0.2 ) uvs[ 0 ].x += 1;\r\n\t\t\tif ( x1 < 0.2 ) uvs[ 1 ].x += 1;\r\n\t\t\tif ( x2 < 0.2 ) uvs[ 2 ].x += 1;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Apply radius\r\n\r\n\tfor ( var i = 0, l = this.vertices.length; i < l; i ++ ) {\r\n\r\n\t\tthis.vertices[ i ].multiplyScalar( radius );\r\n\r\n\t}\r\n\r\n\r\n\t// Merge vertices\r\n\r\n\tthis.mergeVertices();\r\n\r\n\tthis.computeCentroids();\r\n\r\n\tthis.computeFaceNormals();\r\n\r\n\tthis.boundingSphere = new THREE.Sphere( new THREE.Vector3(), radius );\r\n\r\n\r\n\t// Project vector onto sphere's surface\r\n\r\n\tfunction prepare( vector ) {\r\n\r\n\t\tvar vertex = vector.normalize().clone();\r\n\t\tvertex.index = that.vertices.push( vertex ) - 1;\r\n\r\n\t\t// Texture coords are equivalent to map coords, calculate angle and convert to fraction of a circle.\r\n\r\n\t\tvar u = azimuth( vector ) / 2 / Math.PI + 0.5;\r\n\t\tvar v = inclination( vector ) / Math.PI + 0.5;\r\n\t\tvertex.uv = new THREE.Vector2( u, 1 - v );\r\n\r\n\t\treturn vertex;\r\n\r\n\t}\r\n\r\n\r\n\t// Approximate a curved face with recursively sub-divided triangles.\r\n\r\n\tfunction make( v1, v2, v3 ) {\r\n\r\n\t\tvar face = new THREE.Face3( v1.index, v2.index, v3.index, [ v1.clone(), v2.clone(), v3.clone() ] );\r\n\t\tface.centroid.add( v1 ).add( v2 ).add( v3 ).divideScalar( 3 );\r\n\t\tthat.faces.push( face );\r\n\r\n\t\tvar azi = azimuth( face.centroid );\r\n\r\n\t\tthat.faceVertexUvs[ 0 ].push( [\r\n\t\t\tcorrectUV( v1.uv, v1, azi ),\r\n\t\t\tcorrectUV( v2.uv, v2, azi ),\r\n\t\t\tcorrectUV( v3.uv, v3, azi )\r\n\t\t] );\r\n\r\n\t}\r\n\r\n\r\n\t// Analytically subdivide a face to the required detail level.\r\n\r\n\tfunction subdivide(face, detail ) {\r\n\r\n\t\tvar cols = Math.pow(2, detail);\r\n\t\tvar cells = Math.pow(4, detail);\r\n\t\tvar a = prepare( that.vertices[ face.a ] );\r\n\t\tvar b = prepare( that.vertices[ face.b ] );\r\n\t\tvar c = prepare( that.vertices[ face.c ] );\r\n\t\tvar v = [];\r\n\r\n\t\t// Construct all of the vertices for this subdivision.\r\n\r\n\t\tfor ( var i = 0 ; i <= cols; i ++ ) {\r\n\r\n\t\t\tv[ i ] = [];\r\n\r\n\t\t\tvar aj = prepare( a.clone().lerp( c, i / cols ) );\r\n\t\t\tvar bj = prepare( b.clone().lerp( c, i / cols ) );\r\n\t\t\tvar rows = cols - i;\r\n\r\n\t\t\tfor ( var j = 0; j <= rows; j ++) {\r\n\r\n\t\t\t\tif ( j == 0 && i == cols ) {\r\n\r\n\t\t\t\t\tv[ i ][ j ] = aj;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tv[ i ][ j ] = prepare( aj.clone().lerp( bj, j / rows ) );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// Construct all of the faces.\r\n\r\n\t\tfor ( var i = 0; i < cols ; i ++ ) {\r\n\r\n\t\t\tfor ( var j = 0; j < 2 * (cols - i) - 1; j ++ ) {\r\n\r\n\t\t\t\tvar k = Math.floor( j / 2 );\r\n\r\n\t\t\t\tif ( j % 2 == 0 ) {\r\n\r\n\t\t\t\t\tmake(\r\n\t\t\t\t\t\tv[ i ][ k + 1],\r\n\t\t\t\t\t\tv[ i + 1 ][ k ],\r\n\t\t\t\t\t\tv[ i ][ k ]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmake(\r\n\t\t\t\t\t\tv[ i ][ k + 1 ],\r\n\t\t\t\t\t\tv[ i + 1][ k + 1],\r\n\t\t\t\t\t\tv[ i + 1 ][ k ]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t// Angle around the Y axis, counter-clockwise when looking from above.\r\n\r\n\tfunction azimuth( vector ) {\r\n\r\n\t\treturn Math.atan2( vector.z, -vector.x );\r\n\r\n\t}\r\n\r\n\r\n\t// Angle above the XZ plane.\r\n\r\n\tfunction inclination( vector ) {\r\n\r\n\t\treturn Math.atan2( -vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\r\n\r\n\t}\r\n\r\n\r\n\t// Texture fixing helper. Spheres have some odd behaviours.\r\n\r\n\tfunction correctUV( uv, vector, azimuth ) {\r\n\r\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) uv = new THREE.Vector2( uv.x - 1, uv.y );\r\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) uv = new THREE.Vector2( azimuth / 2 / Math.PI + 0.5, uv.y );\r\n\t\treturn uv.clone();\r\n\r\n\t}\r\n\r\n\r\n};\r\n\r\nTHREE.PolyhedronGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.IcosahedronGeometry = function ( radius, detail ) {\r\n\r\n\tthis.radius = radius;\r\n\tthis.detail = detail;\r\n\r\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\r\n\r\n\tvar vertices = [\r\n\t\t[ -1, t, 0 ], [ 1, t, 0 ], [ -1, -t, 0 ], [ 1, -t, 0 ],\r\n\t\t[ 0, -1, t ], [ 0, 1, t ], [ 0, -1, -t ], [ 0, 1, -t ],\r\n\t\t[ t, 0, -1 ], [ t, 0, 1 ], [ -t, 0, -1 ], [ -t, 0, 1 ]\r\n\t];\r\n\r\n\tvar faces = [\r\n\t\t[ 0, 11, 5 ], [ 0, 5, 1 ], [ 0, 1, 7 ], [ 0, 7, 10 ], [ 0, 10, 11 ],\r\n\t\t[ 1, 5, 9 ], [ 5, 11, 4 ], [ 11, 10, 2 ], [ 10, 7, 6 ], [ 7, 1, 8 ],\r\n\t\t[ 3, 9, 4 ], [ 3, 4, 2 ], [ 3, 2, 6 ], [ 3, 6, 8 ], [ 3, 8, 9 ],\r\n\t\t[ 4, 9, 5 ], [ 2, 4, 11 ], [ 6, 2, 10 ], [ 8, 6, 7 ], [ 9, 8, 1 ]\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );\r\n\r\n};\r\n\r\nTHREE.IcosahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.OctahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar vertices = [\r\n\t\t[ 1, 0, 0 ], [ -1, 0, 0 ], [ 0, 1, 0 ], [ 0, -1, 0 ], [ 0, 0, 1 ], [ 0, 0, -1 ]\r\n\t];\r\n\r\n\tvar faces = [\r\n\t\t[ 0, 2, 4 ], [ 0, 4, 3 ], [ 0, 3, 5 ], [ 0, 5, 2 ], [ 1, 2, 5 ], [ 1, 5, 3 ], [ 1, 3, 4 ], [ 1, 4, 2 ]\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );\r\n};\r\n\r\nTHREE.OctahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author timothypratley / https://github.com/timothypratley\r\n */\r\n\r\nTHREE.TetrahedronGeometry = function ( radius, detail ) {\r\n\r\n\tvar vertices = [\r\n\t\t[ 1, 1, 1 ], [ -1, -1, 1 ], [ -1, 1, -1 ], [ 1, -1, -1 ]\r\n\t];\r\n\r\n\tvar faces = [\r\n\t\t[ 2, 1, 0 ], [ 0, 3, 2 ], [ 1, 3, 0 ], [ 2, 3, 1 ]\r\n\t];\r\n\r\n\tTHREE.PolyhedronGeometry.call( this, vertices, faces, radius, detail );\r\n\r\n};\r\n\r\nTHREE.TetrahedronGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author zz85 / https://github.com/zz85\r\n * Parametric Surfaces Geometry\r\n * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\r\n *\r\n * new THREE.ParametricGeometry( parametricFunction, uSegments, ySegements, useTris );\r\n *\r\n */\r\n\r\nTHREE.ParametricGeometry = function ( func, slices, stacks, useTris ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tvar verts = this.vertices;\r\n\tvar faces = this.faces;\r\n\tvar uvs = this.faceVertexUvs[ 0 ];\r\n\r\n\tuseTris = (useTris === undefined) ? false : useTris;\r\n\r\n\tvar i, il, j, p;\r\n\tvar u, v;\r\n\r\n\tvar stackCount = stacks + 1;\r\n\tvar sliceCount = slices + 1;\r\n\r\n\tfor ( i = 0; i <= stacks; i ++ ) {\r\n\r\n\t\tv = i / stacks;\r\n\r\n\t\tfor ( j = 0; j <= slices; j ++ ) {\r\n\r\n\t\t\tu = j / slices;\r\n\r\n\t\t\tp = func( u, v );\r\n\t\t\tverts.push( p );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\tvar a, b, c, d;\r\n\tvar uva, uvb, uvc, uvd;\r\n\r\n\tfor ( i = 0; i < stacks; i ++ ) {\r\n\r\n\t\tfor ( j = 0; j < slices; j ++ ) {\r\n\r\n\t\t\ta = i * sliceCount + j;\r\n\t\t\tb = i * sliceCount + j + 1;\r\n\t\t\tc = (i + 1) * sliceCount + j;\r\n\t\t\td = (i + 1) * sliceCount + j + 1;\r\n\r\n\t\t\tuva = new THREE.Vector2( j / slices, i / stacks );\r\n\t\t\tuvb = new THREE.Vector2( ( j + 1 ) / slices, i / stacks );\r\n\t\t\tuvc = new THREE.Vector2( j / slices, ( i + 1 ) / stacks );\r\n\t\t\tuvd = new THREE.Vector2( ( j + 1 ) / slices, ( i + 1 ) / stacks );\r\n\r\n\t\t\tif ( useTris ) {\r\n\r\n\t\t\t\tfaces.push( new THREE.Face3( a, b, c ) );\r\n\t\t\t\tfaces.push( new THREE.Face3( b, d, c ) );\r\n\r\n\t\t\t\tuvs.push( [ uva, uvb, uvc ] );\r\n\t\t\t\tuvs.push( [ uvb, uvd, uvc ] );\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tfaces.push( new THREE.Face4( a, b, d, c ) );\r\n\t\t\t\tuvs.push( [ uva, uvb, uvd, uvc ] );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\t// console.log(this);\r\n\r\n\t// magic bullet\r\n\t// var diff = this.mergeVertices();\r\n\t// console.log('removed ', diff, ' vertices by merging');\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.ParametricGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author qiao / https://github.com/qiao\r\n * @fileoverview This is a convex hull generator using the incremental method. \r\n * The complexity is O(n^2) where n is the number of vertices.\r\n * O(nlogn) algorithms do exist, but they are much more complicated.\r\n *\r\n * Benchmark: \r\n *\r\n * Platform: CPU: P7350 @2.00GHz Engine: V8\r\n *\r\n * Num Vertices\tTime(ms)\r\n *\r\n * 10 1\r\n * 20 3\r\n * 30 19\r\n * 40 48\r\n * 50 107\r\n */\r\n\r\nTHREE.ConvexGeometry = function( vertices ) {\r\n\r\n\tTHREE.Geometry.call( this );\r\n\r\n\tvar faces = [ [ 0, 1, 2 ], [ 0, 2, 1 ] ]; \r\n\r\n\tfor ( var i = 3; i < vertices.length; i++ ) {\r\n\r\n\t\taddPoint( i );\r\n\r\n\t}\r\n\r\n\r\n\tfunction addPoint( vertexId ) {\r\n\r\n\t\tvar vertex = vertices[ vertexId ].clone();\r\n\r\n\t\tvar mag = vertex.length();\r\n\t\tvertex.x += mag * randomOffset();\r\n\t\tvertex.y += mag * randomOffset();\r\n\t\tvertex.z += mag * randomOffset();\r\n\r\n\t\tvar hole = [];\r\n\r\n\t\tfor ( var f = 0; f < faces.length; ) {\r\n\r\n\t\t\tvar face = faces[ f ];\r\n\r\n\t\t\t// for each face, if the vertex can see it,\r\n\t\t\t// then we try to add the face's edges into the hole.\r\n\t\t\tif ( visible( face, vertex ) ) {\r\n\r\n\t\t\t\tfor ( var e = 0; e < 3; e++ ) {\r\n\r\n\t\t\t\t\tvar edge = [ face[ e ], face[ ( e + 1 ) % 3 ] ];\r\n\t\t\t\t\tvar boundary = true;\r\n\r\n\t\t\t\t\t// remove duplicated edges.\r\n\t\t\t\t\tfor ( var h = 0; h < hole.length; h++ ) {\r\n\r\n\t\t\t\t\t\tif ( equalEdge( hole[ h ], edge ) ) {\r\n\r\n\t\t\t\t\t\t\thole[ h ] = hole[ hole.length - 1 ];\r\n\t\t\t\t\t\t\thole.pop();\r\n\t\t\t\t\t\t\tboundary = false;\r\n\t\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( boundary ) {\r\n\r\n\t\t\t\t\t\thole.push( edge );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// remove faces[ f ]\r\n\t\t\t\tfaces[ f ] = faces[ faces.length - 1 ];\r\n\t\t\t\tfaces.pop();\r\n\r\n\t\t\t} else { // not visible\r\n\r\n\t\t\t\tf++;\r\n\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// construct the new faces formed by the edges of the hole and the vertex\r\n\t\tfor ( var h = 0; h < hole.length; h++ ) {\r\n\r\n\t\t\tfaces.push( [ \r\n\t\t\t\thole[ h ][ 0 ],\r\n\t\t\t\thole[ h ][ 1 ],\r\n\t\t\t\tvertexId\r\n\t\t\t] );\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Whether the face is visible from the vertex\r\n\t */\r\n\tfunction visible( face, vertex ) {\r\n\r\n\t\tvar va = vertices[ face[ 0 ] ];\r\n\t\tvar vb = vertices[ face[ 1 ] ];\r\n\t\tvar vc = vertices[ face[ 2 ] ];\r\n\r\n\t\tvar n = normal( va, vb, vc );\r\n\r\n\t\t// distance from face to origin\r\n\t\tvar dist = n.dot( va );\r\n\r\n\t\treturn n.dot( vertex ) >= dist; \r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Face normal\r\n\t */\r\n\tfunction normal( va, vb, vc ) {\r\n\r\n\t\tvar cb = new THREE.Vector3();\r\n\t\tvar ab = new THREE.Vector3();\r\n\r\n\t\tcb.subVectors( vc, vb );\r\n\t\tab.subVectors( va, vb );\r\n\t\tcb.cross( ab );\r\n\r\n\t\tcb.normalize();\r\n\r\n\t\treturn cb;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Detect whether two edges are equal.\r\n\t * Note that when constructing the convex hull, two same edges can only\r\n\t * be of the negative direction.\r\n\t */\r\n\tfunction equalEdge( ea, eb ) {\r\n\r\n\t\treturn ea[ 0 ] === eb[ 1 ] && ea[ 1 ] === eb[ 0 ]; \r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Create a random offset between -1e-6 and 1e-6.\r\n\t */\r\n\tfunction randomOffset() {\r\n\r\n\t\treturn ( Math.random() - 0.5 ) * 2 * 1e-6;\r\n\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * XXX: Not sure if this is the correct approach. Need someone to review.\r\n\t */\r\n\tfunction vertexUv( vertex ) {\r\n\r\n\t\tvar mag = vertex.length();\r\n\t\treturn new THREE.Vector2( vertex.x / mag, vertex.y / mag );\r\n\r\n\t}\r\n\r\n\t// Push vertices into `this.vertices`, skipping those inside the hull\r\n\tvar id = 0;\r\n\tvar newId = new Array( vertices.length ); // map from old vertex id to new id\r\n\r\n\tfor ( var i = 0; i < faces.length; i++ ) {\r\n\r\n\t\t var face = faces[ i ];\r\n\r\n\t\t for ( var j = 0; j < 3; j++ ) {\r\n\r\n\t\t\t\tif ( newId[ face[ j ] ] === undefined ) {\r\n\r\n\t\t\t\t\t\tnewId[ face[ j ] ] = id++;\r\n\t\t\t\t\t\tthis.vertices.push( vertices[ face[ j ] ] );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tface[ j ] = newId[ face[ j ] ];\r\n\r\n\t\t }\r\n\r\n\t}\r\n\r\n\t// Convert faces into instances of THREE.Face3\r\n\tfor ( var i = 0; i < faces.length; i++ ) {\r\n\r\n\t\tthis.faces.push( new THREE.Face3( \r\n\t\t\t\tfaces[ i ][ 0 ],\r\n\t\t\t\tfaces[ i ][ 1 ],\r\n\t\t\t\tfaces[ i ][ 2 ]\r\n\t\t) );\r\n\r\n\t}\r\n\r\n\t// Compute UVs\r\n\tfor ( var i = 0; i < this.faces.length; i++ ) {\r\n\r\n\t\tvar face = this.faces[ i ];\r\n\r\n\t\tthis.faceVertexUvs[ 0 ].push( [\r\n\t\t\tvertexUv( this.vertices[ face.a ] ),\r\n\t\t\tvertexUv( this.vertices[ face.b ] ),\r\n\t\t\tvertexUv( this.vertices[ face.c ])\r\n\t\t] );\r\n\r\n\t}\r\n\r\n\r\n\tthis.computeCentroids();\r\n\tthis.computeFaceNormals();\r\n\tthis.computeVertexNormals();\r\n\r\n};\r\n\r\nTHREE.ConvexGeometry.prototype = Object.create( THREE.Geometry.prototype );\r\n/**\r\n * @author sroucheray / http://sroucheray.org/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.AxisHelper = function ( size ) {\r\n\r\n\tsize = size || 1;\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\r\n\tgeometry.vertices.push(\r\n\t\tnew THREE.Vector3(), new THREE.Vector3( size, 0, 0 ),\r\n\t\tnew THREE.Vector3(), new THREE.Vector3( 0, size, 0 ),\r\n\t\tnew THREE.Vector3(), new THREE.Vector3( 0, 0, size )\r\n\t);\r\n\r\n\tgeometry.colors.push(\r\n\t\tnew THREE.Color( 0xff0000 ), new THREE.Color( 0xffaa00 ),\r\n\t\tnew THREE.Color( 0x00ff00 ), new THREE.Color( 0xaaff00 ),\r\n\t\tnew THREE.Color( 0x0000ff ), new THREE.Color( 0x00aaff )\r\n\t);\r\n\r\n\tvar material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );\r\n\r\n\tTHREE.Line.call( this, geometry, material, THREE.LinePieces );\r\n\r\n};\r\n\r\nTHREE.AxisHelper.prototype = Object.create( THREE.Line.prototype );\r\n/**\r\n * @author WestLangley / http://github.com/WestLangley\r\n * @author zz85 / http://github.com/zz85\r\n * @author bhouston / http://exocortex.com\r\n *\r\n * Creates an arrow for visualizing directions\r\n *\r\n * Parameters:\r\n * dir - Vector3\r\n * origin - Vector3\r\n * length - Number\r\n * hex - color in hex value\r\n */\r\n\r\nTHREE.ArrowHelper = function ( dir, origin, length, hex ) {\r\n\r\n\t// dir is assumed to be normalized\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tif ( hex === undefined ) hex = 0xffff00;\r\n\tif ( length === undefined ) length = 1;\r\n\r\n\tthis.position = origin;\r\n\r\n\tthis.useQuaternion = true;\r\n\r\n\tvar lineGeometry = new THREE.Geometry();\r\n\tlineGeometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) );\r\n\tlineGeometry.vertices.push( new THREE.Vector3( 0, 1, 0 ) );\r\n\r\n\tthis.line = new THREE.Line( lineGeometry, new THREE.LineBasicMaterial( { color: hex } ) );\r\n\tthis.line.matrixAutoUpdate = false;\r\n\tthis.add( this.line );\r\n\r\n\tvar coneGeometry = new THREE.CylinderGeometry( 0, 0.05, 0.25, 5, 1 );\r\n\tconeGeometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, 0.875, 0 ) );\r\n\r\n\tthis.cone = new THREE.Mesh( coneGeometry, new THREE.MeshBasicMaterial( { color: hex } ) );\r\n\tthis.cone.matrixAutoUpdate = false;\r\n\tthis.add( this.cone );\r\n\r\n\tthis.setDirection( dir );\r\n\tthis.setLength( length );\r\n\r\n};\r\n\r\nTHREE.ArrowHelper.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.ArrowHelper.prototype.setDirection = function () {\r\n\r\n\tvar axis = new THREE.Vector3();\r\n\tvar radians;\r\n\r\n\treturn function ( dir ) {\r\n\r\n\t\t// dir is assumed to be normalized\r\n\r\n\t\tif ( dir.y > 0.999 ) {\r\n\r\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\r\n\r\n\t\t} else if ( dir.y < - 0.999 ) {\r\n\r\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\r\n\r\n\t\t} else {\r\n\r\n\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\r\n\r\n\t\t\tradians = Math.acos( dir.y );\r\n\r\n\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n}();\r\n\r\nTHREE.ArrowHelper.prototype.setLength = function ( length ) {\r\n\r\n\tthis.scale.set( length, length, length );\r\n\r\n};\r\n\r\nTHREE.ArrowHelper.prototype.setColor = function ( hex ) {\r\n\r\n\tthis.line.material.color.setHex( hex );\r\n\tthis.cone.material.color.setHex( hex );\r\n\r\n};\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.BoxHelper = function ( size ) {\r\n\r\n\tsize = size || 1;\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\r\n\t// 5____4\r\n\t// 1/___0/|\r\n\t// | 6__|_7\r\n\t// 2/___3/\r\n\r\n\tvar vertices = [\r\n\t\tnew THREE.Vector3( size, size, size ),\r\n\t\tnew THREE.Vector3( - size, size, size ),\r\n\t\tnew THREE.Vector3( - size, - size, size ),\r\n\t\tnew THREE.Vector3( size, - size, size ),\r\n\r\n\t\tnew THREE.Vector3( size, size, - size ),\r\n\t\tnew THREE.Vector3( - size, size, - size ),\r\n\t\tnew THREE.Vector3( - size, - size, - size ),\r\n\t\tnew THREE.Vector3( size, - size, - size )\r\n\t];\r\n\r\n\t// TODO: Wouldn't be nice if Line had .segments?\r\n\r\n\tgeometry.vertices.push(\r\n\t\tvertices[ 0 ], vertices[ 1 ],\r\n\t\tvertices[ 1 ], vertices[ 2 ],\r\n\t\tvertices[ 2 ], vertices[ 3 ],\r\n\t\tvertices[ 3 ], vertices[ 0 ],\r\n\r\n\t\tvertices[ 4 ], vertices[ 5 ],\r\n\t\tvertices[ 5 ], vertices[ 6 ],\r\n\t\tvertices[ 6 ], vertices[ 7 ],\r\n\t\tvertices[ 7 ], vertices[ 4 ],\r\n\r\n\t\tvertices[ 0 ], vertices[ 4 ],\r\n\t\tvertices[ 1 ], vertices[ 5 ],\r\n\t\tvertices[ 2 ], vertices[ 6 ],\r\n\t\tvertices[ 3 ], vertices[ 7 ]\r\n\t);\r\n\r\n\tthis.vertices = vertices;\r\n\r\n\tTHREE.Line.call( this, geometry, new THREE.LineBasicMaterial(), THREE.LinePieces );\r\n\r\n};\r\n\r\nTHREE.BoxHelper.prototype = Object.create( THREE.Line.prototype );\r\n\r\nTHREE.BoxHelper.prototype.update = function ( object ) {\r\n\r\n\tvar geometry = object.geometry;\r\n\r\n\tif ( geometry.boundingBox === null ) {\r\n\r\n\t\tgeometry.computeBoundingBox();\r\n\r\n\t}\r\n\r\n\tvar min = geometry.boundingBox.min;\r\n\tvar max = geometry.boundingBox.max;\r\n\tvar vertices = this.vertices;\r\n\r\n\tvertices[ 0 ].set( max.x, max.y, max.z );\r\n\tvertices[ 1 ].set( min.x, max.y, max.z );\r\n\tvertices[ 2 ].set( min.x, min.y, max.z );\r\n\tvertices[ 3 ].set( max.x, min.y, max.z );\r\n\tvertices[ 4 ].set( max.x, max.y, min.z );\r\n\tvertices[ 5 ].set( min.x, max.y, min.z );\r\n\tvertices[ 6 ].set( min.x, min.y, min.z );\r\n\tvertices[ 7 ].set( max.x, min.y, min.z );\r\n\r\n\tthis.geometry.computeBoundingSphere();\r\n\tthis.geometry.verticesNeedUpdate = true;\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\tthis.matrixWorld = object.matrixWorld;\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n *\t- shows frustum, line of sight and up of the camera\r\n *\t- suitable for fast updates\r\n * \t- based on frustum visualization in lightgl.js shadowmap example\r\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\r\n */\r\n\r\nTHREE.CameraHelper = function ( camera ) {\r\n\r\n\tTHREE.Line.call( this );\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\tvar material = new THREE.LineBasicMaterial( { color: 0xffffff, vertexColors: THREE.FaceColors } );\r\n\r\n\tvar pointMap = {};\r\n\r\n\t// colors\r\n\r\n\tvar hexFrustum = 0xffaa00;\r\n\tvar hexCone = 0xff0000;\r\n\tvar hexUp = 0x00aaff;\r\n\tvar hexTarget = 0xffffff;\r\n\tvar hexCross = 0x333333;\r\n\r\n\t// near\r\n\r\n\taddLine( \"n1\", \"n2\", hexFrustum );\r\n\taddLine( \"n2\", \"n4\", hexFrustum );\r\n\taddLine( \"n4\", \"n3\", hexFrustum );\r\n\taddLine( \"n3\", \"n1\", hexFrustum );\r\n\r\n\t// far\r\n\r\n\taddLine( \"f1\", \"f2\", hexFrustum );\r\n\taddLine( \"f2\", \"f4\", hexFrustum );\r\n\taddLine( \"f4\", \"f3\", hexFrustum );\r\n\taddLine( \"f3\", \"f1\", hexFrustum );\r\n\r\n\t// sides\r\n\r\n\taddLine( \"n1\", \"f1\", hexFrustum );\r\n\taddLine( \"n2\", \"f2\", hexFrustum );\r\n\taddLine( \"n3\", \"f3\", hexFrustum );\r\n\taddLine( \"n4\", \"f4\", hexFrustum );\r\n\r\n\t// cone\r\n\r\n\taddLine( \"p\", \"n1\", hexCone );\r\n\taddLine( \"p\", \"n2\", hexCone );\r\n\taddLine( \"p\", \"n3\", hexCone );\r\n\taddLine( \"p\", \"n4\", hexCone );\r\n\r\n\t// up\r\n\r\n\taddLine( \"u1\", \"u2\", hexUp );\r\n\taddLine( \"u2\", \"u3\", hexUp );\r\n\taddLine( \"u3\", \"u1\", hexUp );\r\n\r\n\t// target\r\n\r\n\taddLine( \"c\", \"t\", hexTarget );\r\n\taddLine( \"p\", \"c\", hexCross );\r\n\r\n\t// cross\r\n\r\n\taddLine( \"cn1\", \"cn2\", hexCross );\r\n\taddLine( \"cn3\", \"cn4\", hexCross );\r\n\r\n\taddLine( \"cf1\", \"cf2\", hexCross );\r\n\taddLine( \"cf3\", \"cf4\", hexCross );\r\n\r\n\tfunction addLine( a, b, hex ) {\r\n\r\n\t\taddPoint( a, hex );\r\n\t\taddPoint( b, hex );\r\n\r\n\t}\r\n\r\n\tfunction addPoint( id, hex ) {\r\n\r\n\t\tgeometry.vertices.push( new THREE.Vector3() );\r\n\t\tgeometry.colors.push( new THREE.Color( hex ) );\r\n\r\n\t\tif ( pointMap[ id ] === undefined ) {\r\n\r\n\t\t\tpointMap[ id ] = [];\r\n\r\n\t\t}\r\n\r\n\t\tpointMap[ id ].push( geometry.vertices.length - 1 );\r\n\r\n\t}\r\n\r\n\tTHREE.Line.call( this, geometry, material, THREE.LinePieces );\r\n\r\n\tthis.camera = camera;\r\n\tthis.matrixWorld = camera.matrixWorld;\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.pointMap = pointMap;\r\n\r\n\tthis.update();\r\n\r\n};\r\n\r\nTHREE.CameraHelper.prototype = Object.create( THREE.Line.prototype );\r\n\r\nTHREE.CameraHelper.prototype.update = function () {\r\n\r\n\tvar vector = new THREE.Vector3();\r\n\tvar camera = new THREE.Camera();\r\n\tvar projector = new THREE.Projector();\r\n\r\n\treturn function () {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar w = 1, h = 1;\r\n\r\n\t\t// we need just camera projection matrix\r\n\t\t// world matrix must be identity\r\n\r\n\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\r\n\r\n\t\t// center / target\r\n\r\n\t\tsetPoint( \"c\", 0, 0, -1 );\r\n\t\tsetPoint( \"t\", 0, 0, 1 );\r\n\r\n\t\t// near\r\n\r\n\t\tsetPoint( \"n1\", -w, -h, -1 );\r\n\t\tsetPoint( \"n2\", w, -h, -1 );\r\n\t\tsetPoint( \"n3\", -w, h, -1 );\r\n\t\tsetPoint( \"n4\", w, h, -1 );\r\n\r\n\t\t// far\r\n\r\n\t\tsetPoint( \"f1\", -w, -h, 1 );\r\n\t\tsetPoint( \"f2\", w, -h, 1 );\r\n\t\tsetPoint( \"f3\", -w, h, 1 );\r\n\t\tsetPoint( \"f4\", w, h, 1 );\r\n\r\n\t\t// up\r\n\r\n\t\tsetPoint( \"u1\", w * 0.7, h * 1.1, -1 );\r\n\t\tsetPoint( \"u2\", -w * 0.7, h * 1.1, -1 );\r\n\t\tsetPoint( \"u3\", 0, h * 2, -1 );\r\n\r\n\t\t// cross\r\n\r\n\t\tsetPoint( \"cf1\", -w, 0, 1 );\r\n\t\tsetPoint( \"cf2\", w, 0, 1 );\r\n\t\tsetPoint( \"cf3\", 0, -h, 1 );\r\n\t\tsetPoint( \"cf4\", 0, h, 1 );\r\n\r\n\t\tsetPoint( \"cn1\", -w, 0, -1 );\r\n\t\tsetPoint( \"cn2\", w, 0, -1 );\r\n\t\tsetPoint( \"cn3\", 0, -h, -1 );\r\n\t\tsetPoint( \"cn4\", 0, h, -1 );\r\n\r\n\t\tfunction setPoint( point, x, y, z ) {\r\n\r\n\t\t\tvector.set( x, y, z );\r\n\t\t\tprojector.unprojectVector( vector, camera );\r\n\r\n\t\t\tvar points = scope.pointMap[ point ];\r\n\r\n\t\t\tif ( points !== undefined ) {\r\n\r\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\r\n\r\n\t\t\t\t\tscope.geometry.vertices[ points[ i ] ].copy( vector );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.geometry.verticesNeedUpdate = true;\r\n\r\n\t};\r\n\r\n}();\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.DirectionalLightHelper = function ( light, sphereSize ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.light = light;\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tvar material = new THREE.MeshBasicMaterial( { fog: false, wireframe: true } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( geometry, material );\r\n\tthis.lightSphere.matrixWorld = this.light.matrixWorld;\r\n\tthis.lightSphere.matrixAutoUpdate = false;\r\n\tthis.add( this.lightSphere );\r\n\r\n\t/*\r\n\tthis.targetSphere = new THREE.Mesh( geometry, material );\r\n\tthis.targetSphere.position = this.light.target.position;\r\n\tthis.add( this.targetSphere );\r\n\t*/\r\n\r\n\tgeometry = new THREE.Geometry();\r\n\tgeometry.vertices.push( this.light.position );\r\n\tgeometry.vertices.push( this.light.target.position );\r\n\tgeometry.computeLineDistances();\r\n\r\n\tmaterial = new THREE.LineDashedMaterial( { dashSize: 4, gapSize: 4, opacity: 0.75, transparent: true, fog: false } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.targetLine = new THREE.Line( geometry, material );\r\n\tthis.add( this.targetLine );\r\n\r\n}\r\n\r\nTHREE.DirectionalLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.DirectionalLightHelper.prototype.update = function () {\r\n\r\n\tthis.lightSphere.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.targetLine.geometry.computeLineDistances();\r\n\tthis.targetLine.geometry.verticesNeedUpdate = true;\r\n\tthis.targetLine.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n};\r\n\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.FaceNormalsHelper = function ( object, size ) {\r\n\r\n\tsize = size || 20;\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\r\n\tfor( var i = 0, l = object.geometry.faces.length; i < l; i ++ ) {\r\n\r\n\t\tvar face = object.geometry.faces[ i ];\r\n\r\n\t\tgeometry.vertices.push( face.centroid );\r\n\t\tgeometry.vertices.push( face.normal.clone().multiplyScalar( size ).add( face.centroid ) );\r\n\r\n\t}\r\n\r\n\tTHREE.Line.call( this, geometry, new THREE.LineBasicMaterial( { color: 0x0000ff } ), THREE.LinePieces );\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\tthis.matrixWorld = object.matrixWorld;\r\n\r\n};\r\n\r\nTHREE.FaceNormalsHelper.prototype = Object.create( THREE.Line.prototype );\r\n/**\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.GridHelper = function ( size, step ) {\r\n\r\n\tvar geometry = new THREE.Geometry();\r\n\tvar material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );\r\n\tvar color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0x888888 );\r\n\r\n\tfor ( var i = - size; i <= size; i += step ) {\r\n\r\n\t\tgeometry.vertices.push(\r\n\t\t\tnew THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ),\r\n\t\t\tnew THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size )\r\n\t\t);\r\n\r\n\t\tvar color = i === 0 ? color1 : color2;\r\n\r\n\t\tgeometry.colors.push( color, color, color, color );\r\n\r\n\t}\r\n\r\n\tTHREE.Line.call( this, geometry, material, THREE.LinePieces );\r\n\r\n};\r\n\r\nTHREE.GridHelper.prototype = Object.create( THREE.Line.prototype );\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.HemisphereLightHelper = function ( light, sphereSize, arrowLength, domeSize ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.light = light;\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tgeometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );\r\n\r\n\tfor ( var i = 0, il = 8; i < il; i ++ ) {\r\n\r\n\t\tgeometry.faces[ i ].materialIndex = i < 4 ? 0 : 1;\r\n\r\n\t}\r\n\r\n\tvar materialSky = new THREE.MeshBasicMaterial( { fog: false, wireframe: true } );\r\n\tmaterialSky.color.copy( light.color ).multiplyScalar( light.intensity );\r\n\r\n\tvar materialGround = new THREE.MeshBasicMaterial( { fog: false, wireframe: true } );\r\n\tmaterialGround.color.copy( light.groundColor ).multiplyScalar( light.intensity );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial( [ materialSky, materialGround ] ) );\r\n\tthis.lightSphere.position = light.position;\r\n\tthis.lightSphere.lookAt( new THREE.Vector3() );\r\n\tthis.add( this.lightSphere );\r\n\r\n};\r\n\r\nTHREE.HemisphereLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.HemisphereLightHelper.prototype.update = function () {\r\n\r\n\tthis.lightSphere.lookAt( new THREE.Vector3() );\r\n\r\n\tthis.lightSphere.material.materials[ 0 ].color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\tthis.lightSphere.material.materials[ 1 ].color.copy( this.light.groundColor ).multiplyScalar( this.light.intensity );\r\n\r\n};\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n */\r\n\r\nTHREE.PointLightHelper = function ( light, sphereSize ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.light = light;\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tvar material = new THREE.MeshBasicMaterial( { fog: false, wireframe: true } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( geometry, material );\r\n\tthis.lightSphere.matrixWorld = this.light.matrixWorld;\r\n\tthis.lightSphere.matrixAutoUpdate = false;\r\n\tthis.add( this.lightSphere );\r\n\r\n\t/*\r\n\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\r\n\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\r\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\r\n\r\n\tvar d = light.distance;\r\n\r\n\tif ( d === 0.0 ) {\r\n\r\n\t\tthis.lightDistance.visible = false;\r\n\r\n\t} else {\r\n\r\n\t\tthis.lightDistance.scale.set( d, d, d );\r\n\r\n\t}\r\n\r\n\tthis.add( this.lightDistance );\r\n\t*/\r\n\r\n};\r\n\r\nTHREE.PointLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.PointLightHelper.prototype.update = function () {\r\n\r\n\tthis.lightSphere.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\t/*\r\n\tthis.lightDistance.material.color.copy( this.color );\r\n\r\n\tvar d = this.light.distance;\r\n\r\n\tif ( d === 0.0 ) {\r\n\r\n\t\tthis.lightDistance.visible = false;\r\n\r\n\t} else {\r\n\r\n\t\tthis.lightDistance.visible = true;\r\n\t\tthis.lightDistance.scale.set( d, d, d );\r\n\r\n\t}\r\n\t*/\r\n\r\n};\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n * @author mrdoob / http://mrdoob.com/\r\n * @author WestLangley / http://github.com/WestLangley\r\n*/\r\n\r\nTHREE.SpotLightHelper = function ( light, sphereSize ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.matrixAutoUpdate = false;\r\n\r\n\tthis.light = light;\r\n\r\n\tvar geometry = new THREE.SphereGeometry( sphereSize, 4, 2 );\r\n\tvar material = new THREE.MeshBasicMaterial( { fog: false, wireframe: true } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.lightSphere = new THREE.Mesh( geometry, material );\r\n\tthis.lightSphere.matrixWorld = this.light.matrixWorld;\r\n\tthis.lightSphere.matrixAutoUpdate = false;\r\n\tthis.add( this.lightSphere );\r\n\r\n\tgeometry = new THREE.CylinderGeometry( 0.0001, 1, 1, 8, 1, true );\r\n\tgeometry.applyMatrix( new THREE.Matrix4().makeTranslation( 0, -0.5, 0 ) );\r\n\tgeometry.applyMatrix( new THREE.Matrix4().makeRotationX( - Math.PI / 2 ) );\r\n\r\n\tmaterial = new THREE.MeshBasicMaterial( { fog: false, wireframe: true, opacity: 0.3, transparent: true } );\r\n\tmaterial.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n\tthis.lightCone = new THREE.Mesh( geometry, material );\r\n\tthis.lightCone.position = this.light.position;\r\n\r\n\tvar coneLength = light.distance ? light.distance : 10000;\r\n\tvar coneWidth = coneLength * Math.tan( light.angle );\r\n\r\n\tthis.lightCone.scale.set( coneWidth, coneWidth, coneLength );\r\n\tthis.lightCone.lookAt( this.light.target.position );\r\n\r\n\tthis.add( this.lightCone );\r\n\r\n};\r\n\r\nTHREE.SpotLightHelper.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\nTHREE.SpotLightHelper.prototype.update = function () {\r\n\r\n\tvar coneLength = this.light.distance ? this.light.distance : 10000;\r\n\tvar coneWidth = coneLength * Math.tan( this.light.angle );\r\n\r\n\tthis.lightCone.scale.set( coneWidth, coneWidth, coneLength );\r\n\tthis.lightCone.lookAt( this.light.target.position );\r\n\r\n\tthis.lightSphere.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\tthis.lightCone.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.ImmediateRenderObject = function () {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.render = function ( renderCallback ) { };\r\n\r\n};\r\n\r\nTHREE.ImmediateRenderObject.prototype = Object.create( THREE.Object3D.prototype );\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.LensFlare = function ( texture, size, distance, blending, color ) {\r\n\r\n\tTHREE.Object3D.call( this );\r\n\r\n\tthis.lensFlares = [];\r\n\r\n\tthis.positionScreen = new THREE.Vector3();\r\n\tthis.customUpdateCallback = undefined;\r\n\r\n\tif( texture !== undefined ) {\r\n\r\n\t\tthis.add( texture, size, distance, blending, color );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.LensFlare.prototype = Object.create( THREE.Object3D.prototype );\r\n\r\n\r\n/*\r\n * Add: adds another flare\r\n */\r\n\r\nTHREE.LensFlare.prototype.add = function ( texture, size, distance, blending, color, opacity ) {\r\n\r\n\tif( size === undefined ) size = -1;\r\n\tif( distance === undefined ) distance = 0;\r\n\tif( opacity === undefined ) opacity = 1;\r\n\tif( color === undefined ) color = new THREE.Color( 0xffffff );\r\n\tif( blending === undefined ) blending = THREE.NormalBlending;\r\n\r\n\tdistance = Math.min( distance, Math.max( 0, distance ) );\r\n\r\n\tthis.lensFlares.push( { texture: texture, \t\t\t// THREE.Texture\r\n\t\t size: size, \t\t\t\t// size in pixels (-1 = use texture.width)\r\n\t\t distance: distance, \t\t// distance (0-1) from light source (0=at light source)\r\n\t\t x: 0, y: 0, z: 0,\t\t\t// screen position (-1 => 1) z = 0 is ontop z = 1 is back\r\n\t\t scale: 1, \t\t\t\t\t// scale\r\n\t\t rotation: 1, \t\t\t\t// rotation\r\n\t\t opacity: opacity,\t\t\t// opacity\r\n\t\t\t\t\t\t\tcolor: color,\t\t\t\t// color\r\n\t\t blending: blending } );\t\t// blending\r\n\r\n};\r\n\r\n\r\n/*\r\n * Update lens flares update positions on all flares based on the screen position\r\n * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\r\n */\r\n\r\nTHREE.LensFlare.prototype.updateLensFlares = function () {\r\n\r\n\tvar f, fl = this.lensFlares.length;\r\n\tvar flare;\r\n\tvar vecX = -this.positionScreen.x * 2;\r\n\tvar vecY = -this.positionScreen.y * 2;\r\n\r\n\tfor( f = 0; f < fl; f ++ ) {\r\n\r\n\t\tflare = this.lensFlares[ f ];\r\n\r\n\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\r\n\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\r\n\r\n\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\r\n\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\r\n\r\n\t}\r\n\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.MorphBlendMesh = function( geometry, material ) {\r\n\r\n\tTHREE.Mesh.call( this, geometry, material );\r\n\r\n\tthis.animationsMap = {};\r\n\tthis.animationsList = [];\r\n\r\n\t// prepare default animation\r\n\t// (all frames played together in 1 second)\r\n\r\n\tvar numFrames = this.geometry.morphTargets.length;\r\n\r\n\tvar name = \"__default\";\r\n\r\n\tvar startFrame = 0;\r\n\tvar endFrame = numFrames - 1;\r\n\r\n\tvar fps = numFrames / 1;\r\n\r\n\tthis.createAnimation( name, startFrame, endFrame, fps );\r\n\tthis.setAnimationWeight( name, 1 );\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype = Object.create( THREE.Mesh.prototype );\r\n\r\nTHREE.MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) {\r\n\r\n\tvar animation = {\r\n\r\n\t\tstartFrame: start,\r\n\t\tendFrame: end,\r\n\r\n\t\tlength: end - start + 1,\r\n\r\n\t\tfps: fps,\r\n\t\tduration: ( end - start ) / fps,\r\n\r\n\t\tlastFrame: 0,\r\n\t\tcurrentFrame: 0,\r\n\r\n\t\tactive: false,\r\n\r\n\t\ttime: 0,\r\n\t\tdirection: 1,\r\n\t\tweight: 1,\r\n\r\n\t\tdirectionBackwards: false,\r\n\t\tmirroredLoop: false\r\n\r\n\t};\r\n\r\n\tthis.animationsMap[ name ] = animation;\r\n\tthis.animationsList.push( animation );\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) {\r\n\r\n\tvar pattern = /([a-z]+)(\\d+)/;\r\n\r\n\tvar firstAnimation, frameRanges = {};\r\n\r\n\tvar geometry = this.geometry;\r\n\r\n\tfor ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) {\r\n\r\n\t\tvar morph = geometry.morphTargets[ i ];\r\n\t\tvar chunks = morph.name.match( pattern );\r\n\r\n\t\tif ( chunks && chunks.length > 1 ) {\r\n\r\n\t\t\tvar name = chunks[ 1 ];\r\n\t\t\tvar num = chunks[ 2 ];\r\n\r\n\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: -Infinity };\r\n\r\n\t\t\tvar range = frameRanges[ name ];\r\n\r\n\t\t\tif ( i < range.start ) range.start = i;\r\n\t\t\tif ( i > range.end ) range.end = i;\r\n\r\n\t\t\tif ( ! firstAnimation ) firstAnimation = name;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tfor ( var name in frameRanges ) {\r\n\r\n\t\tvar range = frameRanges[ name ];\r\n\t\tthis.createAnimation( name, range.start, range.end, fps );\r\n\r\n\t}\r\n\r\n\tthis.firstAnimation = firstAnimation;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.direction = 1;\r\n\t\tanimation.directionBackwards = false;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.direction = -1;\r\n\t\tanimation.directionBackwards = true;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.fps = fps;\r\n\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.duration = duration;\r\n\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.weight = weight;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.time = time;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.getAnimationTime = function ( name ) {\r\n\r\n\tvar time = 0;\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\ttime = animation.time;\r\n\r\n\t}\r\n\r\n\treturn time;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.getAnimationDuration = function ( name ) {\r\n\r\n\tvar duration = -1;\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tduration = animation.duration;\r\n\r\n\t}\r\n\r\n\treturn duration;\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.playAnimation = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.time = 0;\r\n\t\tanimation.active = true;\r\n\r\n\t} else {\r\n\r\n\t\tconsole.warn( \"animation[\" + name + \"] undefined\" );\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.stopAnimation = function ( name ) {\r\n\r\n\tvar animation = this.animationsMap[ name ];\r\n\r\n\tif ( animation ) {\r\n\r\n\t\tanimation.active = false;\r\n\r\n\t}\r\n\r\n};\r\n\r\nTHREE.MorphBlendMesh.prototype.update = function ( delta ) {\r\n\r\n\tfor ( var i = 0, il = this.animationsList.length; i < il; i ++ ) {\r\n\r\n\t\tvar animation = this.animationsList[ i ];\r\n\r\n\t\tif ( ! animation.active ) continue;\r\n\r\n\t\tvar frameTime = animation.duration / animation.length;\r\n\r\n\t\tanimation.time += animation.direction * delta;\r\n\r\n\t\tif ( animation.mirroredLoop ) {\r\n\r\n\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\r\n\r\n\t\t\t\tanimation.direction *= -1;\r\n\r\n\t\t\t\tif ( animation.time > animation.duration ) {\r\n\r\n\t\t\t\t\tanimation.time = animation.duration;\r\n\t\t\t\t\tanimation.directionBackwards = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( animation.time < 0 ) {\r\n\r\n\t\t\t\t\tanimation.time = 0;\r\n\t\t\t\t\tanimation.directionBackwards = false;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tanimation.time = animation.time % animation.duration;\r\n\r\n\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\r\n\r\n\t\t}\r\n\r\n\t\tvar keyframe = animation.startFrame + THREE.Math.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\r\n\t\tvar weight = animation.weight;\r\n\r\n\t\tif ( keyframe !== animation.currentFrame ) {\r\n\r\n\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\r\n\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\r\n\r\n\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\r\n\r\n\t\t\tanimation.lastFrame = animation.currentFrame;\r\n\t\t\tanimation.currentFrame = keyframe;\r\n\r\n\t\t}\r\n\r\n\t\tvar mix = ( animation.time % frameTime ) / frameTime;\r\n\r\n\t\tif ( animation.directionBackwards ) mix = 1 - mix;\r\n\r\n\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\r\n\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.LensFlarePlugin = function () {\r\n\r\n\tvar _gl, _renderer, _precision, _lensFlare = {};\r\n\r\n\tthis.init = function ( renderer ) {\r\n\r\n\t\t_gl = renderer.context;\r\n\t\t_renderer = renderer;\r\n\r\n\t\t_precision = renderer.getPrecision();\r\n\r\n\t\t_lensFlare.vertices = new Float32Array( 8 + 8 );\r\n\t\t_lensFlare.faces = new Uint16Array( 6 );\r\n\r\n\t\tvar i = 0;\r\n\t\t_lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = -1;\t// vertex\r\n\t\t_lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 0;\t// uv... etc.\r\n\r\n\t\t_lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = -1;\r\n\t\t_lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 0;\r\n\r\n\t\t_lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1;\r\n\t\t_lensFlare.vertices[ i++ ] = 1; _lensFlare.vertices[ i++ ] = 1;\r\n\r\n\t\t_lensFlare.vertices[ i++ ] = -1; _lensFlare.vertices[ i++ ] = 1;\r\n\t\t_lensFlare.vertices[ i++ ] = 0; _lensFlare.vertices[ i++ ] = 1;\r\n\r\n\t\ti = 0;\r\n\t\t_lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 1; _lensFlare.faces[ i++ ] = 2;\r\n\t\t_lensFlare.faces[ i++ ] = 0; _lensFlare.faces[ i++ ] = 2; _lensFlare.faces[ i++ ] = 3;\r\n\r\n\t\t// buffers\r\n\r\n\t\t_lensFlare.vertexBuffer = _gl.createBuffer();\r\n\t\t_lensFlare.elementBuffer = _gl.createBuffer();\r\n\r\n\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer );\r\n\t\t_gl.bufferData( _gl.ARRAY_BUFFER, _lensFlare.vertices, _gl.STATIC_DRAW );\r\n\r\n\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer );\r\n\t\t_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.faces, _gl.STATIC_DRAW );\r\n\r\n\t\t// textures\r\n\r\n\t\t_lensFlare.tempTexture = _gl.createTexture();\r\n\t\t_lensFlare.occlusionTexture = _gl.createTexture();\r\n\r\n\t\t_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );\r\n\t\t_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, 16, 16, 0, _gl.RGB, _gl.UNSIGNED_BYTE, null );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );\r\n\r\n\t\t_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture );\r\n\t\t_gl.texImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, 16, 16, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );\r\n\t\t_gl.texParameteri( _gl.TEXTURE_2D, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );\r\n\r\n\t\tif ( _gl.getParameter( _gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS ) <= 0 ) {\r\n\r\n\t\t\t_lensFlare.hasVertexTexture = false;\r\n\t\t\t_lensFlare.program = createProgram( THREE.ShaderFlares[ \"lensFlare\" ], _precision );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_lensFlare.hasVertexTexture = true;\r\n\t\t\t_lensFlare.program = createProgram( THREE.ShaderFlares[ \"lensFlareVertexTexture\" ], _precision );\r\n\r\n\t\t}\r\n\r\n\t\t_lensFlare.attributes = {};\r\n\t\t_lensFlare.uniforms = {};\r\n\r\n\t\t_lensFlare.attributes.vertex = _gl.getAttribLocation ( _lensFlare.program, \"position\" );\r\n\t\t_lensFlare.attributes.uv = _gl.getAttribLocation ( _lensFlare.program, \"uv\" );\r\n\r\n\t\t_lensFlare.uniforms.renderType = _gl.getUniformLocation( _lensFlare.program, \"renderType\" );\r\n\t\t_lensFlare.uniforms.map = _gl.getUniformLocation( _lensFlare.program, \"map\" );\r\n\t\t_lensFlare.uniforms.occlusionMap = _gl.getUniformLocation( _lensFlare.program, \"occlusionMap\" );\r\n\t\t_lensFlare.uniforms.opacity = _gl.getUniformLocation( _lensFlare.program, \"opacity\" );\r\n\t\t_lensFlare.uniforms.color = _gl.getUniformLocation( _lensFlare.program, \"color\" );\r\n\t\t_lensFlare.uniforms.scale = _gl.getUniformLocation( _lensFlare.program, \"scale\" );\r\n\t\t_lensFlare.uniforms.rotation = _gl.getUniformLocation( _lensFlare.program, \"rotation\" );\r\n\t\t_lensFlare.uniforms.screenPosition = _gl.getUniformLocation( _lensFlare.program, \"screenPosition\" );\r\n\r\n\t};\r\n\r\n\r\n\t/*\r\n\t * Render lens flares\r\n\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\r\n\t * reads these back and calculates occlusion.\r\n\t * Then _lensFlare.update_lensFlares() is called to re-position and\r\n\t * update transparency of flares. Then they are rendered.\r\n\t *\r\n\t */\r\n\r\n\tthis.render = function ( scene, camera, viewportWidth, viewportHeight ) {\r\n\r\n\t\tvar flares = scene.__webglFlares,\r\n\t\t\tnFlares = flares.length;\r\n\r\n\t\tif ( ! nFlares ) return;\r\n\r\n\t\tvar tempPosition = new THREE.Vector3();\r\n\r\n\t\tvar invAspect = viewportHeight / viewportWidth,\r\n\t\t\thalfViewportWidth = viewportWidth * 0.5,\r\n\t\t\thalfViewportHeight = viewportHeight * 0.5;\r\n\r\n\t\tvar size = 16 / viewportHeight,\r\n\t\t\tscale = new THREE.Vector2( size * invAspect, size );\r\n\r\n\t\tvar screenPosition = new THREE.Vector3( 1, 1, 0 ),\r\n\t\t\tscreenPositionPixels = new THREE.Vector2( 1, 1 );\r\n\r\n\t\tvar uniforms = _lensFlare.uniforms,\r\n\t\t\tattributes = _lensFlare.attributes;\r\n\r\n\t\t// set _lensFlare program and reset blending\r\n\r\n\t\t_gl.useProgram( _lensFlare.program );\r\n\r\n\t\t_gl.enableVertexAttribArray( _lensFlare.attributes.vertex );\r\n\t\t_gl.enableVertexAttribArray( _lensFlare.attributes.uv );\r\n\r\n\t\t// loop through all lens flares to update their occlusion and positions\r\n\t\t// setup gl and common used attribs/unforms\r\n\r\n\t\t_gl.uniform1i( uniforms.occlusionMap, 0 );\r\n\t\t_gl.uniform1i( uniforms.map, 1 );\r\n\r\n\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, _lensFlare.vertexBuffer );\r\n\t\t_gl.vertexAttribPointer( attributes.vertex, 2, _gl.FLOAT, false, 2 * 8, 0 );\r\n\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 );\r\n\r\n\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _lensFlare.elementBuffer );\r\n\r\n\t\t_gl.disable( _gl.CULL_FACE );\r\n\t\t_gl.depthMask( false );\r\n\r\n\t\tvar i, j, jl, flare, sprite;\r\n\r\n\t\tfor ( i = 0; i < nFlares; i ++ ) {\r\n\r\n\t\t\tsize = 16 / viewportHeight;\r\n\t\t\tscale.set( size * invAspect, size );\r\n\r\n\t\t\t// calc object screen position\r\n\r\n\t\t\tflare = flares[ i ];\r\n\r\n\t\t\ttempPosition.set( flare.matrixWorld.elements[12], flare.matrixWorld.elements[13], flare.matrixWorld.elements[14] );\r\n\r\n\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\r\n\t\t\ttempPosition.applyProjection( camera.projectionMatrix );\r\n\r\n\t\t\t// setup arrays for gl programs\r\n\r\n\t\t\tscreenPosition.copy( tempPosition )\r\n\r\n\t\t\tscreenPositionPixels.x = screenPosition.x * halfViewportWidth + halfViewportWidth;\r\n\t\t\tscreenPositionPixels.y = screenPosition.y * halfViewportHeight + halfViewportHeight;\r\n\r\n\t\t\t// screen cull\r\n\r\n\t\t\tif ( _lensFlare.hasVertexTexture || (\r\n\t\t\t\tscreenPositionPixels.x > 0 &&\r\n\t\t\t\tscreenPositionPixels.x < viewportWidth &&\r\n\t\t\t\tscreenPositionPixels.y > 0 &&\r\n\t\t\t\tscreenPositionPixels.y < viewportHeight ) ) {\r\n\r\n\t\t\t\t// save current RGB to temp texture\r\n\r\n\t\t\t\t_gl.activeTexture( _gl.TEXTURE1 );\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );\r\n\t\t\t\t_gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGB, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );\r\n\r\n\r\n\t\t\t\t// render pink quad\r\n\r\n\t\t\t\t_gl.uniform1i( uniforms.renderType, 0 );\r\n\t\t\t\t_gl.uniform2f( uniforms.scale, scale.x, scale.y );\r\n\t\t\t\t_gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\r\n\r\n\t\t\t\t_gl.disable( _gl.BLEND );\r\n\t\t\t\t_gl.enable( _gl.DEPTH_TEST );\r\n\r\n\t\t\t\t_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\r\n\t\t\t\t// copy result to occlusionMap\r\n\r\n\t\t\t\t_gl.activeTexture( _gl.TEXTURE0 );\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.occlusionTexture );\r\n\t\t\t\t_gl.copyTexImage2D( _gl.TEXTURE_2D, 0, _gl.RGBA, screenPositionPixels.x - 8, screenPositionPixels.y - 8, 16, 16, 0 );\r\n\r\n\r\n\t\t\t\t// restore graphics\r\n\r\n\t\t\t\t_gl.uniform1i( uniforms.renderType, 1 );\r\n\t\t\t\t_gl.disable( _gl.DEPTH_TEST );\r\n\r\n\t\t\t\t_gl.activeTexture( _gl.TEXTURE1 );\r\n\t\t\t\t_gl.bindTexture( _gl.TEXTURE_2D, _lensFlare.tempTexture );\r\n\t\t\t\t_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\r\n\t\t\t\t// update object positions\r\n\r\n\t\t\t\tflare.positionScreen.copy( screenPosition )\r\n\r\n\t\t\t\tif ( flare.customUpdateCallback ) {\r\n\r\n\t\t\t\t\tflare.customUpdateCallback( flare );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tflare.updateLensFlares();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// render flares\r\n\r\n\t\t\t\t_gl.uniform1i( uniforms.renderType, 2 );\r\n\t\t\t\t_gl.enable( _gl.BLEND );\r\n\r\n\t\t\t\tfor ( j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\t\tsprite = flare.lensFlares[ j ];\r\n\r\n\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\r\n\r\n\t\t\t\t\t\tscreenPosition.x = sprite.x;\r\n\t\t\t\t\t\tscreenPosition.y = sprite.y;\r\n\t\t\t\t\t\tscreenPosition.z = sprite.z;\r\n\r\n\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewportHeight;\r\n\r\n\t\t\t\t\t\tscale.x = size * invAspect;\r\n\t\t\t\t\t\tscale.y = size;\r\n\r\n\t\t\t\t\t\t_gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\r\n\t\t\t\t\t\t_gl.uniform2f( uniforms.scale, scale.x, scale.y );\r\n\t\t\t\t\t\t_gl.uniform1f( uniforms.rotation, sprite.rotation );\r\n\r\n\t\t\t\t\t\t_gl.uniform1f( uniforms.opacity, sprite.opacity );\r\n\t\t\t\t\t\t_gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\r\n\r\n\t\t\t\t\t\t_renderer.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\r\n\t\t\t\t\t\t_renderer.setTexture( sprite.texture, 1 );\r\n\r\n\t\t\t\t\t\t_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore gl\r\n\r\n\t\t_gl.enable( _gl.CULL_FACE );\r\n\t\t_gl.enable( _gl.DEPTH_TEST );\r\n\t\t_gl.depthMask( true );\r\n\r\n\t};\r\n\r\n\tfunction createProgram ( shader, precision ) {\r\n\r\n\t\tvar program = _gl.createProgram();\r\n\r\n\t\tvar fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );\r\n\t\tvar vertexShader = _gl.createShader( _gl.VERTEX_SHADER );\r\n\r\n\t\tvar prefix = \"precision \" + precision + \" float;\\n\";\r\n\r\n\t\t_gl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\r\n\t\t_gl.shaderSource( vertexShader, prefix + shader.vertexShader );\r\n\r\n\t\t_gl.compileShader( fragmentShader );\r\n\t\t_gl.compileShader( vertexShader );\r\n\r\n\t\t_gl.attachShader( program, fragmentShader );\r\n\t\t_gl.attachShader( program, vertexShader );\r\n\r\n\t\t_gl.linkProgram( program );\r\n\r\n\t\treturn program;\r\n\r\n\t};\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.ShadowMapPlugin = function () {\r\n\r\n\tvar _gl,\r\n\t_renderer,\r\n\t_depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,\r\n\r\n\t_frustum = new THREE.Frustum(),\r\n\t_projScreenMatrix = new THREE.Matrix4(),\r\n\r\n\t_min = new THREE.Vector3(),\r\n\t_max = new THREE.Vector3(),\r\n\r\n\t_matrixPosition = new THREE.Vector3();\r\n\r\n\tthis.init = function ( renderer ) {\r\n\r\n\t\t_gl = renderer.context;\r\n\t\t_renderer = renderer;\r\n\r\n\t\tvar depthShader = THREE.ShaderLib[ \"depthRGBA\" ];\r\n\t\tvar depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );\r\n\r\n\t\t_depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );\r\n\t\t_depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );\r\n\t\t_depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } );\r\n\t\t_depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } );\r\n\r\n\t\t_depthMaterial._shadowPass = true;\r\n\t\t_depthMaterialMorph._shadowPass = true;\r\n\t\t_depthMaterialSkin._shadowPass = true;\r\n\t\t_depthMaterialMorphSkin._shadowPass = true;\r\n\r\n\t};\r\n\r\n\tthis.render = function ( scene, camera ) {\r\n\r\n\t\tif ( ! ( _renderer.shadowMapEnabled && _renderer.shadowMapAutoUpdate ) ) return;\r\n\r\n\t\tthis.update( scene, camera );\r\n\r\n\t};\r\n\r\n\tthis.update = function ( scene, camera ) {\r\n\r\n\t\tvar i, il, j, jl, n,\r\n\r\n\t\tshadowMap, shadowMatrix, shadowCamera,\r\n\t\tprogram, buffer, material,\r\n\t\twebglObject, object, light,\r\n\t\trenderList,\r\n\r\n\t\tlights = [],\r\n\t\tk = 0,\r\n\r\n\t\tfog = null;\r\n\r\n\t\t// set GL state for depth map\r\n\r\n\t\t_gl.clearColor( 1, 1, 1, 1 );\r\n\t\t_gl.disable( _gl.BLEND );\r\n\r\n\t\t_gl.enable( _gl.CULL_FACE );\r\n\t\t_gl.frontFace( _gl.CCW );\r\n\r\n\t\tif ( _renderer.shadowMapCullFace === THREE.CullFaceFront ) {\r\n\r\n\t\t\t_gl.cullFace( _gl.FRONT );\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.cullFace( _gl.BACK );\r\n\r\n\t\t}\r\n\r\n\t\t_renderer.setDepthTest( true );\r\n\r\n\t\t// preprocess lights\r\n\t\t// \t- skip lights that are not casting shadows\r\n\t\t//\t- create virtual lights for cascaded shadow maps\r\n\r\n\t\tfor ( i = 0, il = scene.__lights.length; i < il; i ++ ) {\r\n\r\n\t\t\tlight = scene.__lights[ i ];\r\n\r\n\t\t\tif ( ! light.castShadow ) continue;\r\n\r\n\t\t\tif ( ( light instanceof THREE.DirectionalLight ) && light.shadowCascade ) {\r\n\r\n\t\t\t\tfor ( n = 0; n < light.shadowCascadeCount; n ++ ) {\r\n\r\n\t\t\t\t\tvar virtualLight;\r\n\r\n\t\t\t\t\tif ( ! light.shadowCascadeArray[ n ] ) {\r\n\r\n\t\t\t\t\t\tvirtualLight = createVirtualLight( light, n );\r\n\t\t\t\t\t\tvirtualLight.originalCamera = camera;\r\n\r\n\t\t\t\t\t\tvar gyro = new THREE.Gyroscope();\r\n\t\t\t\t\t\tgyro.position = light.shadowCascadeOffset;\r\n\r\n\t\t\t\t\t\tgyro.add( virtualLight );\r\n\t\t\t\t\t\tgyro.add( virtualLight.target );\r\n\r\n\t\t\t\t\t\tcamera.add( gyro );\r\n\r\n\t\t\t\t\t\tlight.shadowCascadeArray[ n ] = virtualLight;\r\n\r\n\t\t\t\t\t\tconsole.log( \"Created virtualLight\", virtualLight );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tvirtualLight = light.shadowCascadeArray[ n ];\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tupdateVirtualLight( light, n );\r\n\r\n\t\t\t\t\tlights[ k ] = virtualLight;\r\n\t\t\t\t\tk ++;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tlights[ k ] = light;\r\n\t\t\t\tk ++;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// render depth map\r\n\r\n\t\tfor ( i = 0, il = lights.length; i < il; i ++ ) {\r\n\r\n\t\t\tlight = lights[ i ];\r\n\r\n\t\t\tif ( ! light.shadowMap ) {\r\n\r\n\t\t\t\tvar shadowFilter = THREE.LinearFilter;\r\n\r\n\t\t\t\tif ( _renderer.shadowMapType === THREE.PCFSoftShadowMap ) {\r\n\r\n\t\t\t\t\tshadowFilter = THREE.NearestFilter;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar pars = { minFilter: shadowFilter, magFilter: shadowFilter, format: THREE.RGBAFormat };\r\n\r\n\t\t\t\tlight.shadowMap = new THREE.WebGLRenderTarget( light.shadowMapWidth, light.shadowMapHeight, pars );\r\n\t\t\t\tlight.shadowMapSize = new THREE.Vector2( light.shadowMapWidth, light.shadowMapHeight );\r\n\r\n\t\t\t\tlight.shadowMatrix = new THREE.Matrix4();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( ! light.shadowCamera ) {\r\n\r\n\t\t\t\tif ( light instanceof THREE.SpotLight ) {\r\n\r\n\t\t\t\t\tlight.shadowCamera = new THREE.PerspectiveCamera( light.shadowCameraFov, light.shadowMapWidth / light.shadowMapHeight, light.shadowCameraNear, light.shadowCameraFar );\r\n\r\n\t\t\t\t} else if ( light instanceof THREE.DirectionalLight ) {\r\n\r\n\t\t\t\t\tlight.shadowCamera = new THREE.OrthographicCamera( light.shadowCameraLeft, light.shadowCameraRight, light.shadowCameraTop, light.shadowCameraBottom, light.shadowCameraNear, light.shadowCameraFar );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tconsole.error( \"Unsupported light type for shadow\" );\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscene.add( light.shadowCamera );\r\n\r\n\t\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( light.shadowCameraVisible && ! light.cameraHelper ) {\r\n\r\n\t\t\t\tlight.cameraHelper = new THREE.CameraHelper( light.shadowCamera );\r\n\t\t\t\tlight.shadowCamera.add( light.cameraHelper );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif ( light.isVirtual && virtualLight.originalCamera == camera ) {\r\n\r\n\t\t\t\tupdateShadowCamera( camera, light );\r\n\r\n\t\t\t}\r\n\r\n\t\t\tshadowMap = light.shadowMap;\r\n\t\t\tshadowMatrix = light.shadowMatrix;\r\n\t\t\tshadowCamera = light.shadowCamera;\r\n\r\n\t\t\tshadowCamera.position.getPositionFromMatrix( light.matrixWorld );\r\n\t\t\t_matrixPosition.getPositionFromMatrix( light.target.matrixWorld );\r\n\t\t\tshadowCamera.lookAt( _matrixPosition );\r\n\t\t\tshadowCamera.updateMatrixWorld();\r\n\r\n\t\t\tshadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld );\r\n\r\n\t\t\tif ( light.cameraHelper ) light.cameraHelper.visible = light.shadowCameraVisible;\r\n\t\t\tif ( light.shadowCameraVisible ) light.cameraHelper.update();\r\n\r\n\t\t\t// compute shadow matrix\r\n\r\n\t\t\tshadowMatrix.set( 0.5, 0.0, 0.0, 0.5,\r\n\t\t\t\t\t\t\t 0.0, 0.5, 0.0, 0.5,\r\n\t\t\t\t\t\t\t 0.0, 0.0, 0.5, 0.5,\r\n\t\t\t\t\t\t\t 0.0, 0.0, 0.0, 1.0 );\r\n\r\n\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\r\n\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\r\n\r\n\t\t\t// update camera matrices and frustum\r\n\r\n\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\r\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\r\n\r\n\t\t\t// render shadow map\r\n\r\n\t\t\t_renderer.setRenderTarget( shadowMap );\r\n\t\t\t_renderer.clear();\r\n\r\n\t\t\t// set object matrices & frustum culling\r\n\r\n\t\t\trenderList = scene.__webglObjects;\r\n\r\n\t\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\twebglObject = renderList[ j ];\r\n\t\t\t\tobject = webglObject.object;\r\n\r\n\t\t\t\twebglObject.render = false;\r\n\r\n\t\t\t\tif ( object.visible && object.castShadow ) {\r\n\r\n\t\t\t\t\tif ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) {\r\n\r\n\t\t\t\t\t\tobject._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\r\n\r\n\t\t\t\t\t\twebglObject.render = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// render regular objects\r\n\r\n\t\t\tvar objectMaterial, useMorphing, useSkinning;\r\n\r\n\t\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\twebglObject = renderList[ j ];\r\n\r\n\t\t\t\tif ( webglObject.render ) {\r\n\r\n\t\t\t\t\tobject = webglObject.object;\r\n\t\t\t\t\tbuffer = webglObject.buffer;\r\n\r\n\t\t\t\t\t// culling is overriden globally for all objects\r\n\t\t\t\t\t// while rendering depth map\r\n\r\n\t\t\t\t\t// need to deal with MeshFaceMaterial somehow\r\n\t\t\t\t\t// in that case just use the first of material.materials for now\r\n\t\t\t\t\t// (proper solution would require to break objects by materials\r\n\t\t\t\t\t// similarly to regular rendering and then set corresponding\r\n\t\t\t\t\t// depth materials per each chunk instead of just once per object)\r\n\r\n\t\t\t\t\tobjectMaterial = getObjectMaterial( object );\r\n\r\n\t\t\t\t\tuseMorphing = object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;\r\n\t\t\t\t\tuseSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;\r\n\r\n\t\t\t\t\tif ( object.customDepthMaterial ) {\r\n\r\n\t\t\t\t\t\tmaterial = object.customDepthMaterial;\r\n\r\n\t\t\t\t\t} else if ( useSkinning ) {\r\n\r\n\t\t\t\t\t\tmaterial = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;\r\n\r\n\t\t\t\t\t} else if ( useMorphing ) {\r\n\r\n\t\t\t\t\t\tmaterial = _depthMaterialMorph;\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tmaterial = _depthMaterial;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( buffer instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, scene.__lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t_renderer.renderBuffer( shadowCamera, scene.__lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// set matrices and render immediate objects\r\n\r\n\t\t\trenderList = scene.__webglObjectsImmediate;\r\n\r\n\t\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\t\twebglObject = renderList[ j ];\r\n\t\t\t\tobject = webglObject.object;\r\n\r\n\t\t\t\tif ( object.visible && object.castShadow ) {\r\n\r\n\t\t\t\t\tobject._modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\r\n\r\n\t\t\t\t\t_renderer.renderImmediateObject( shadowCamera, scene.__lights, fog, _depthMaterial, object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore GL state\r\n\r\n\t\tvar clearColor = _renderer.getClearColor(),\r\n\t\tclearAlpha = _renderer.getClearAlpha();\r\n\r\n\t\t_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );\r\n\t\t_gl.enable( _gl.BLEND );\r\n\r\n\t\tif ( _renderer.shadowMapCullFace === THREE.CullFaceFront ) {\r\n\r\n\t\t\t_gl.cullFace( _gl.BACK );\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n\tfunction createVirtualLight( light, cascade ) {\r\n\r\n\t\tvar virtualLight = new THREE.DirectionalLight();\r\n\r\n\t\tvirtualLight.isVirtual = true;\r\n\r\n\t\tvirtualLight.onlyShadow = true;\r\n\t\tvirtualLight.castShadow = true;\r\n\r\n\t\tvirtualLight.shadowCameraNear = light.shadowCameraNear;\r\n\t\tvirtualLight.shadowCameraFar = light.shadowCameraFar;\r\n\r\n\t\tvirtualLight.shadowCameraLeft = light.shadowCameraLeft;\r\n\t\tvirtualLight.shadowCameraRight = light.shadowCameraRight;\r\n\t\tvirtualLight.shadowCameraBottom = light.shadowCameraBottom;\r\n\t\tvirtualLight.shadowCameraTop = light.shadowCameraTop;\r\n\r\n\t\tvirtualLight.shadowCameraVisible = light.shadowCameraVisible;\r\n\r\n\t\tvirtualLight.shadowDarkness = light.shadowDarkness;\r\n\r\n\t\tvirtualLight.shadowBias = light.shadowCascadeBias[ cascade ];\r\n\t\tvirtualLight.shadowMapWidth = light.shadowCascadeWidth[ cascade ];\r\n\t\tvirtualLight.shadowMapHeight = light.shadowCascadeHeight[ cascade ];\r\n\r\n\t\tvirtualLight.pointsWorld = [];\r\n\t\tvirtualLight.pointsFrustum = [];\r\n\r\n\t\tvar pointsWorld = virtualLight.pointsWorld,\r\n\t\t\tpointsFrustum = virtualLight.pointsFrustum;\r\n\r\n\t\tfor ( var i = 0; i < 8; i ++ ) {\r\n\r\n\t\t\tpointsWorld[ i ] = new THREE.Vector3();\r\n\t\t\tpointsFrustum[ i ] = new THREE.Vector3();\r\n\r\n\t\t}\r\n\r\n\t\tvar nearZ = light.shadowCascadeNearZ[ cascade ];\r\n\t\tvar farZ = light.shadowCascadeFarZ[ cascade ];\r\n\r\n\t\tpointsFrustum[ 0 ].set( -1, -1, nearZ );\r\n\t\tpointsFrustum[ 1 ].set( 1, -1, nearZ );\r\n\t\tpointsFrustum[ 2 ].set( -1, 1, nearZ );\r\n\t\tpointsFrustum[ 3 ].set( 1, 1, nearZ );\r\n\r\n\t\tpointsFrustum[ 4 ].set( -1, -1, farZ );\r\n\t\tpointsFrustum[ 5 ].set( 1, -1, farZ );\r\n\t\tpointsFrustum[ 6 ].set( -1, 1, farZ );\r\n\t\tpointsFrustum[ 7 ].set( 1, 1, farZ );\r\n\r\n\t\treturn virtualLight;\r\n\r\n\t}\r\n\r\n\t// Synchronize virtual light with the original light\r\n\r\n\tfunction updateVirtualLight( light, cascade ) {\r\n\r\n\t\tvar virtualLight = light.shadowCascadeArray[ cascade ];\r\n\r\n\t\tvirtualLight.position.copy( light.position );\r\n\t\tvirtualLight.target.position.copy( light.target.position );\r\n\t\tvirtualLight.lookAt( virtualLight.target );\r\n\r\n\t\tvirtualLight.shadowCameraVisible = light.shadowCameraVisible;\r\n\t\tvirtualLight.shadowDarkness = light.shadowDarkness;\r\n\r\n\t\tvirtualLight.shadowBias = light.shadowCascadeBias[ cascade ];\r\n\r\n\t\tvar nearZ = light.shadowCascadeNearZ[ cascade ];\r\n\t\tvar farZ = light.shadowCascadeFarZ[ cascade ];\r\n\r\n\t\tvar pointsFrustum = virtualLight.pointsFrustum;\r\n\r\n\t\tpointsFrustum[ 0 ].z = nearZ;\r\n\t\tpointsFrustum[ 1 ].z = nearZ;\r\n\t\tpointsFrustum[ 2 ].z = nearZ;\r\n\t\tpointsFrustum[ 3 ].z = nearZ;\r\n\r\n\t\tpointsFrustum[ 4 ].z = farZ;\r\n\t\tpointsFrustum[ 5 ].z = farZ;\r\n\t\tpointsFrustum[ 6 ].z = farZ;\r\n\t\tpointsFrustum[ 7 ].z = farZ;\r\n\r\n\t}\r\n\r\n\t// Fit shadow camera's ortho frustum to camera frustum\r\n\r\n\tfunction updateShadowCamera( camera, light ) {\r\n\r\n\t\tvar shadowCamera = light.shadowCamera,\r\n\t\t\tpointsFrustum = light.pointsFrustum,\r\n\t\t\tpointsWorld = light.pointsWorld;\r\n\r\n\t\t_min.set( Infinity, Infinity, Infinity );\r\n\t\t_max.set( -Infinity, -Infinity, -Infinity );\r\n\r\n\t\tfor ( var i = 0; i < 8; i ++ ) {\r\n\r\n\t\t\tvar p = pointsWorld[ i ];\r\n\r\n\t\t\tp.copy( pointsFrustum[ i ] );\r\n\t\t\tTHREE.ShadowMapPlugin.__projector.unprojectVector( p, camera );\r\n\r\n\t\t\tp.applyMatrix4( shadowCamera.matrixWorldInverse );\r\n\r\n\t\t\tif ( p.x < _min.x ) _min.x = p.x;\r\n\t\t\tif ( p.x > _max.x ) _max.x = p.x;\r\n\r\n\t\t\tif ( p.y < _min.y ) _min.y = p.y;\r\n\t\t\tif ( p.y > _max.y ) _max.y = p.y;\r\n\r\n\t\t\tif ( p.z < _min.z ) _min.z = p.z;\r\n\t\t\tif ( p.z > _max.z ) _max.z = p.z;\r\n\r\n\t\t}\r\n\r\n\t\tshadowCamera.left = _min.x;\r\n\t\tshadowCamera.right = _max.x;\r\n\t\tshadowCamera.top = _max.y;\r\n\t\tshadowCamera.bottom = _min.y;\r\n\r\n\t\t// can't really fit near/far\r\n\t\t//shadowCamera.near = _min.z;\r\n\t\t//shadowCamera.far = _max.z;\r\n\r\n\t\tshadowCamera.updateProjectionMatrix();\r\n\r\n\t}\r\n\r\n\t// For the moment just ignore objects that have multiple materials with different animation methods\r\n\t// Only the first material will be taken into account for deciding which depth material to use for shadow maps\r\n\r\n\tfunction getObjectMaterial( object ) {\r\n\r\n\t\treturn object.material instanceof THREE.MeshFaceMaterial\r\n\t\t\t? object.material.materials[ 0 ]\r\n\t\t\t: object.material;\r\n\r\n\t};\r\n\r\n};\r\n\r\nTHREE.ShadowMapPlugin.__projector = new THREE.Projector();\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.SpritePlugin = function () {\r\n\r\n\tvar _gl, _renderer, _precision, _sprite = {};\r\n\r\n\tthis.init = function ( renderer ) {\r\n\r\n\t\t_gl = renderer.context;\r\n\t\t_renderer = renderer;\r\n\r\n\t\t_precision = renderer.getPrecision();\r\n\r\n\t\t_sprite.vertices = new Float32Array( 8 + 8 );\r\n\t\t_sprite.faces = new Uint16Array( 6 );\r\n\r\n\t\tvar i = 0;\r\n\r\n\t\t_sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = -1;\t// vertex 0\r\n\t\t_sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 0;\t// uv 0\r\n\r\n\t\t_sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = -1;\t// vertex 1\r\n\t\t_sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 0;\t// uv 1\r\n\r\n\t\t_sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1;\t// vertex 2\r\n\t\t_sprite.vertices[ i++ ] = 1; _sprite.vertices[ i++ ] = 1;\t// uv 2\r\n\r\n\t\t_sprite.vertices[ i++ ] = -1; _sprite.vertices[ i++ ] = 1;\t// vertex 3\r\n\t\t_sprite.vertices[ i++ ] = 0; _sprite.vertices[ i++ ] = 1;\t// uv 3\r\n\r\n\t\ti = 0;\r\n\r\n\t\t_sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 1; _sprite.faces[ i++ ] = 2;\r\n\t\t_sprite.faces[ i++ ] = 0; _sprite.faces[ i++ ] = 2; _sprite.faces[ i++ ] = 3;\r\n\r\n\t\t_sprite.vertexBuffer = _gl.createBuffer();\r\n\t\t_sprite.elementBuffer = _gl.createBuffer();\r\n\r\n\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer );\r\n\t\t_gl.bufferData( _gl.ARRAY_BUFFER, _sprite.vertices, _gl.STATIC_DRAW );\r\n\r\n\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );\r\n\t\t_gl.bufferData( _gl.ELEMENT_ARRAY_BUFFER, _sprite.faces, _gl.STATIC_DRAW );\r\n\r\n\t\t_sprite.program = createProgram( THREE.ShaderSprite[ \"sprite\" ], _precision );\r\n\r\n\t\t_sprite.attributes = {};\r\n\t\t_sprite.uniforms = {};\r\n\r\n\t\t_sprite.attributes.position = _gl.getAttribLocation ( _sprite.program, \"position\" );\r\n\t\t_sprite.attributes.uv = _gl.getAttribLocation ( _sprite.program, \"uv\" );\r\n\r\n\t\t_sprite.uniforms.uvOffset = _gl.getUniformLocation( _sprite.program, \"uvOffset\" );\r\n\t\t_sprite.uniforms.uvScale = _gl.getUniformLocation( _sprite.program, \"uvScale\" );\r\n\r\n\t\t_sprite.uniforms.rotation = _gl.getUniformLocation( _sprite.program, \"rotation\" );\r\n\t\t_sprite.uniforms.scale = _gl.getUniformLocation( _sprite.program, \"scale\" );\r\n\t\t_sprite.uniforms.alignment = _gl.getUniformLocation( _sprite.program, \"alignment\" );\r\n\r\n\t\t_sprite.uniforms.color = _gl.getUniformLocation( _sprite.program, \"color\" );\r\n\t\t_sprite.uniforms.map = _gl.getUniformLocation( _sprite.program, \"map\" );\r\n\t\t_sprite.uniforms.opacity = _gl.getUniformLocation( _sprite.program, \"opacity\" );\r\n\r\n\t\t_sprite.uniforms.useScreenCoordinates = _gl.getUniformLocation( _sprite.program, \"useScreenCoordinates\" );\r\n\t\t_sprite.uniforms.sizeAttenuation \t = _gl.getUniformLocation( _sprite.program, \"sizeAttenuation\" );\r\n\t\t_sprite.uniforms.screenPosition \t = _gl.getUniformLocation( _sprite.program, \"screenPosition\" );\r\n\t\t_sprite.uniforms.modelViewMatrix = _gl.getUniformLocation( _sprite.program, \"modelViewMatrix\" );\r\n\t\t_sprite.uniforms.projectionMatrix = _gl.getUniformLocation( _sprite.program, \"projectionMatrix\" );\r\n\r\n\t\t_sprite.uniforms.fogType \t\t \t = _gl.getUniformLocation( _sprite.program, \"fogType\" );\r\n\t\t_sprite.uniforms.fogDensity \t\t = _gl.getUniformLocation( _sprite.program, \"fogDensity\" );\r\n\t\t_sprite.uniforms.fogNear \t\t \t = _gl.getUniformLocation( _sprite.program, \"fogNear\" );\r\n\t\t_sprite.uniforms.fogFar \t\t \t = _gl.getUniformLocation( _sprite.program, \"fogFar\" );\r\n\t\t_sprite.uniforms.fogColor \t\t \t = _gl.getUniformLocation( _sprite.program, \"fogColor\" );\r\n\r\n\t\t_sprite.uniforms.alphaTest \t\t \t = _gl.getUniformLocation( _sprite.program, \"alphaTest\" );\r\n\r\n\t};\r\n\r\n\tthis.render = function ( scene, camera, viewportWidth, viewportHeight ) {\r\n\r\n\t\tvar sprites = scene.__webglSprites,\r\n\t\t\tnSprites = sprites.length;\r\n\r\n\t\tif ( ! nSprites ) return;\r\n\r\n\t\tvar attributes = _sprite.attributes,\r\n\t\t\tuniforms = _sprite.uniforms;\r\n\r\n\t\tvar invAspect = viewportHeight / viewportWidth;\r\n\r\n\t\tvar halfViewportWidth = viewportWidth * 0.5,\r\n\t\t\thalfViewportHeight = viewportHeight * 0.5;\r\n\r\n\t\t// setup gl\r\n\r\n\t\t_gl.useProgram( _sprite.program );\r\n\r\n\t\t_gl.enableVertexAttribArray( attributes.position );\r\n\t\t_gl.enableVertexAttribArray( attributes.uv );\r\n\r\n\t\t_gl.disable( _gl.CULL_FACE );\r\n\t\t_gl.enable( _gl.BLEND );\r\n\r\n\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, _sprite.vertexBuffer );\r\n\t\t_gl.vertexAttribPointer( attributes.position, 2, _gl.FLOAT, false, 2 * 8, 0 );\r\n\t\t_gl.vertexAttribPointer( attributes.uv, 2, _gl.FLOAT, false, 2 * 8, 8 );\r\n\r\n\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, _sprite.elementBuffer );\r\n\r\n\t\t_gl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\r\n\r\n\t\t_gl.activeTexture( _gl.TEXTURE0 );\r\n\t\t_gl.uniform1i( uniforms.map, 0 );\r\n\r\n\t\tvar oldFogType = 0;\r\n\t\tvar sceneFogType = 0;\r\n\t\tvar fog = scene.fog;\r\n\r\n\t\tif ( fog ) {\r\n\r\n\t\t\t_gl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\r\n\r\n\t\t\tif ( fog instanceof THREE.Fog ) {\r\n\r\n\t\t\t\t_gl.uniform1f( uniforms.fogNear, fog.near );\r\n\t\t\t\t_gl.uniform1f( uniforms.fogFar, fog.far );\r\n\r\n\t\t\t\t_gl.uniform1i( uniforms.fogType, 1 );\r\n\t\t\t\toldFogType = 1;\r\n\t\t\t\tsceneFogType = 1;\r\n\r\n\t\t\t} else if ( fog instanceof THREE.FogExp2 ) {\r\n\r\n\t\t\t\t_gl.uniform1f( uniforms.fogDensity, fog.density );\r\n\r\n\t\t\t\t_gl.uniform1i( uniforms.fogType, 2 );\r\n\t\t\t\toldFogType = 2;\r\n\t\t\t\tsceneFogType = 2;\r\n\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\t_gl.uniform1i( uniforms.fogType, 0 );\r\n\t\t\toldFogType = 0;\r\n\t\t\tsceneFogType = 0;\r\n\r\n\t\t}\r\n\r\n\r\n\t\t// update positions and sort\r\n\r\n\t\tvar i, sprite, material, screenPosition, size, fogType, scale = [];\r\n\r\n\t\tfor( i = 0; i < nSprites; i ++ ) {\r\n\r\n\t\t\tsprite = sprites[ i ];\r\n\t\t\tmaterial = sprite.material;\r\n\r\n\t\t\tif ( ! sprite.visible || material.opacity === 0 ) continue;\r\n\r\n\t\t\tif ( ! material.useScreenCoordinates ) {\r\n\r\n\t\t\t\tsprite._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\r\n\t\t\t\tsprite.z = - sprite._modelViewMatrix.elements[ 14 ];\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tsprite.z = - sprite.position.z;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tsprites.sort( painterSortStable );\r\n\r\n\t\t// render all sprites\r\n\r\n\t\tfor( i = 0; i < nSprites; i ++ ) {\r\n\r\n\t\t\tsprite = sprites[ i ];\r\n\t\t\tmaterial = sprite.material;\r\n\r\n\t\t\tif ( ! sprite.visible || material.opacity === 0 ) continue;\r\n\r\n\t\t\tif ( material.map && material.map.image && material.map.image.width ) {\r\n\r\n\t\t\t\t_gl.uniform1f( uniforms.alphaTest, material.alphaTest );\r\n\r\n\t\t\t\tif ( material.useScreenCoordinates === true ) {\r\n\r\n\t\t\t\t\t_gl.uniform1i( uniforms.useScreenCoordinates, 1 );\r\n\t\t\t\t\t_gl.uniform3f(\r\n\t\t\t\t\t\tuniforms.screenPosition,\r\n\t\t\t\t\t\t( ( sprite.position.x * _renderer.devicePixelRatio ) - halfViewportWidth ) / halfViewportWidth,\r\n\t\t\t\t\t\t( halfViewportHeight - ( sprite.position.y * _renderer.devicePixelRatio ) ) / halfViewportHeight,\r\n\t\t\t\t\t\tMath.max( 0, Math.min( 1, sprite.position.z ) )\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tscale[ 0 ] = _renderer.devicePixelRatio;\r\n\t\t\t\t\tscale[ 1 ] = _renderer.devicePixelRatio;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_gl.uniform1i( uniforms.useScreenCoordinates, 0 );\r\n\t\t\t\t\t_gl.uniform1i( uniforms.sizeAttenuation, material.sizeAttenuation ? 1 : 0 );\r\n\t\t\t\t\t_gl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite._modelViewMatrix.elements );\r\n\r\n\t\t\t\t\tscale[ 0 ] = 1;\r\n\t\t\t\t\tscale[ 1 ] = 1;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( scene.fog && material.fog ) {\r\n\r\n\t\t\t\t\tfogType = sceneFogType;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tfogType = 0;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( oldFogType !== fogType ) {\r\n\r\n\t\t\t\t\t_gl.uniform1i( uniforms.fogType, fogType );\r\n\t\t\t\t\toldFogType = fogType;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsize = 1 / ( material.scaleByViewport ? viewportHeight : 1 );\r\n\r\n\t\t\t\tscale[ 0 ] *= size * invAspect * sprite.scale.x\r\n\t\t\t\tscale[ 1 ] *= size * sprite.scale.y;\r\n\r\n\t\t\t\t_gl.uniform2f( uniforms.uvScale, material.uvScale.x, material.uvScale.y );\r\n\t\t\t\t_gl.uniform2f( uniforms.uvOffset, material.uvOffset.x, material.uvOffset.y );\r\n\t\t\t\t_gl.uniform2f( uniforms.alignment, material.alignment.x, material.alignment.y );\r\n\r\n\t\t\t\t_gl.uniform1f( uniforms.opacity, material.opacity );\r\n\t\t\t\t_gl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\r\n\r\n\t\t\t\t_gl.uniform1f( uniforms.rotation, sprite.rotation );\r\n\t\t\t\t_gl.uniform2fv( uniforms.scale, scale );\r\n\r\n\t\t\t\t_renderer.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst );\r\n\t\t\t\t_renderer.setDepthTest( material.depthTest );\r\n\t\t\t\t_renderer.setDepthWrite( material.depthWrite );\r\n\t\t\t\t_renderer.setTexture( material.map, 0 );\r\n\r\n\t\t\t\t_gl.drawElements( _gl.TRIANGLES, 6, _gl.UNSIGNED_SHORT, 0 );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore gl\r\n\r\n\t\t_gl.enable( _gl.CULL_FACE );\r\n\r\n\t};\r\n\r\n\tfunction createProgram ( shader, precision ) {\r\n\r\n\t\tvar program = _gl.createProgram();\r\n\r\n\t\tvar fragmentShader = _gl.createShader( _gl.FRAGMENT_SHADER );\r\n\t\tvar vertexShader = _gl.createShader( _gl.VERTEX_SHADER );\r\n\r\n\t\tvar prefix = \"precision \" + precision + \" float;\\n\";\r\n\r\n\t\t_gl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\r\n\t\t_gl.shaderSource( vertexShader, prefix + shader.vertexShader );\r\n\r\n\t\t_gl.compileShader( fragmentShader );\r\n\t\t_gl.compileShader( vertexShader );\r\n\r\n\t\t_gl.attachShader( program, fragmentShader );\r\n\t\t_gl.attachShader( program, vertexShader );\r\n\r\n\t\t_gl.linkProgram( program );\r\n\r\n\t\treturn program;\r\n\r\n\t};\r\n\r\n\tfunction painterSortStable ( a, b ) {\r\n\r\n\t\tif ( a.z !== b.z ) {\r\n\r\n\t\t\treturn b.z - a.z;\r\n\r\n\t\t} else {\r\n\r\n\t\t\treturn b.id - a.id;\r\n\r\n\t\t}\r\n\r\n\t};\r\n\r\n};\r\n/**\r\n * @author alteredq / http://alteredqualia.com/\r\n */\r\n\r\nTHREE.DepthPassPlugin = function () {\r\n\r\n\tthis.enabled = false;\r\n\tthis.renderTarget = null;\r\n\r\n\tvar _gl,\r\n\t_renderer,\r\n\t_depthMaterial, _depthMaterialMorph, _depthMaterialSkin, _depthMaterialMorphSkin,\r\n\r\n\t_frustum = new THREE.Frustum(),\r\n\t_projScreenMatrix = new THREE.Matrix4();\r\n\r\n\tthis.init = function ( renderer ) {\r\n\r\n\t\t_gl = renderer.context;\r\n\t\t_renderer = renderer;\r\n\r\n\t\tvar depthShader = THREE.ShaderLib[ \"depthRGBA\" ];\r\n\t\tvar depthUniforms = THREE.UniformsUtils.clone( depthShader.uniforms );\r\n\r\n\t\t_depthMaterial = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms } );\r\n\t\t_depthMaterialMorph = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true } );\r\n\t\t_depthMaterialSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, skinning: true } );\r\n\t\t_depthMaterialMorphSkin = new THREE.ShaderMaterial( { fragmentShader: depthShader.fragmentShader, vertexShader: depthShader.vertexShader, uniforms: depthUniforms, morphTargets: true, skinning: true } );\r\n\r\n\t\t_depthMaterial._shadowPass = true;\r\n\t\t_depthMaterialMorph._shadowPass = true;\r\n\t\t_depthMaterialSkin._shadowPass = true;\r\n\t\t_depthMaterialMorphSkin._shadowPass = true;\r\n\r\n\t};\r\n\r\n\tthis.render = function ( scene, camera ) {\r\n\r\n\t\tif ( ! this.enabled ) return;\r\n\r\n\t\tthis.update( scene, camera );\r\n\r\n\t};\r\n\r\n\tthis.update = function ( scene, camera ) {\r\n\r\n\t\tvar i, il, j, jl, n,\r\n\r\n\t\tprogram, buffer, material,\r\n\t\twebglObject, object, light,\r\n\t\trenderList,\r\n\r\n\t\tfog = null;\r\n\r\n\t\t// set GL state for depth map\r\n\r\n\t\t_gl.clearColor( 1, 1, 1, 1 );\r\n\t\t_gl.disable( _gl.BLEND );\r\n\r\n\t\t_renderer.setDepthTest( true );\r\n\r\n\t\t// update scene\r\n\r\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\r\n\r\n\t\t// update camera matrices and frustum\r\n\r\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\r\n\r\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\r\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\r\n\r\n\t\t// render depth map\r\n\r\n\t\t_renderer.setRenderTarget( this.renderTarget );\r\n\t\t_renderer.clear();\r\n\r\n\t\t// set object matrices & frustum culling\r\n\r\n\t\trenderList = scene.__webglObjects;\r\n\r\n\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ j ];\r\n\t\t\tobject = webglObject.object;\r\n\r\n\t\t\twebglObject.render = false;\r\n\r\n\t\t\tif ( object.visible ) {\r\n\r\n\t\t\t\tif ( ! ( object instanceof THREE.Mesh || object instanceof THREE.ParticleSystem ) || ! ( object.frustumCulled ) || _frustum.intersectsObject( object ) ) {\r\n\r\n\t\t\t\t\tobject._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\r\n\r\n\t\t\t\t\twebglObject.render = true;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// render regular objects\r\n\r\n\t\tvar objectMaterial, useMorphing, useSkinning;\r\n\r\n\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ j ];\r\n\r\n\t\t\tif ( webglObject.render ) {\r\n\r\n\t\t\t\tobject = webglObject.object;\r\n\t\t\t\tbuffer = webglObject.buffer;\r\n\r\n\t\t\t\t// todo: create proper depth material for particles\r\n\r\n\t\t\t\tif ( object instanceof THREE.ParticleSystem && !object.customDepthMaterial ) continue;\r\n\r\n\t\t\t\tobjectMaterial = getObjectMaterial( object );\r\n\r\n\t\t\t\tif ( objectMaterial ) _renderer.setMaterialFaces( object.material );\r\n\r\n\t\t\t\tuseMorphing = object.geometry.morphTargets.length > 0 && objectMaterial.morphTargets;\r\n\t\t\t\tuseSkinning = object instanceof THREE.SkinnedMesh && objectMaterial.skinning;\r\n\r\n\t\t\t\tif ( object.customDepthMaterial ) {\r\n\r\n\t\t\t\t\tmaterial = object.customDepthMaterial;\r\n\r\n\t\t\t\t} else if ( useSkinning ) {\r\n\r\n\t\t\t\t\tmaterial = useMorphing ? _depthMaterialMorphSkin : _depthMaterialSkin;\r\n\r\n\t\t\t\t} else if ( useMorphing ) {\r\n\r\n\t\t\t\t\tmaterial = _depthMaterialMorph;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tmaterial = _depthMaterial;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( buffer instanceof THREE.BufferGeometry ) {\r\n\r\n\t\t\t\t\t_renderer.renderBufferDirect( camera, scene.__lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t_renderer.renderBuffer( camera, scene.__lights, fog, material, buffer, object );\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// set matrices and render immediate objects\r\n\r\n\t\trenderList = scene.__webglObjectsImmediate;\r\n\r\n\t\tfor ( j = 0, jl = renderList.length; j < jl; j ++ ) {\r\n\r\n\t\t\twebglObject = renderList[ j ];\r\n\t\t\tobject = webglObject.object;\r\n\r\n\t\t\tif ( object.visible ) {\r\n\r\n\t\t\t\tobject._modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\r\n\r\n\t\t\t\t_renderer.renderImmediateObject( camera, scene.__lights, fog, _depthMaterial, object );\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// restore GL state\r\n\r\n\t\tvar clearColor = _renderer.getClearColor(),\r\n\t\tclearAlpha = _renderer.getClearAlpha();\r\n\r\n\t\t_gl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearAlpha );\r\n\t\t_gl.enable( _gl.BLEND );\r\n\r\n\t};\r\n\r\n\t// For the moment just ignore objects that have multiple materials with different animation methods\r\n\t// Only the first material will be taken into account for deciding which depth material to use\r\n\r\n\tfunction getObjectMaterial( object ) {\r\n\r\n\t\treturn object.material instanceof THREE.MeshFaceMaterial\r\n\t\t\t? object.material.materials[ 0 ]\r\n\t\t\t: object.material;\r\n\r\n\t};\r\n\r\n};\r\n\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n *\r\n */\r\n\r\nTHREE.ShaderFlares = {\r\n\r\n\t'lensFlareVertexTexture': {\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\"uniform vec3 screenPosition;\",\r\n\t\t\t\"uniform vec2 scale;\",\r\n\t\t\t\"uniform float rotation;\",\r\n\r\n\t\t\t\"uniform sampler2D occlusionMap;\",\r\n\r\n\t\t\t\"attribute vec2 position;\",\r\n\t\t\t\"attribute vec2 uv;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\t\t\t\"varying float vVisibility;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vUV = uv;\",\r\n\r\n\t\t\t\t\"vec2 pos = position;\",\r\n\r\n\t\t\t\t\"if( renderType == 2 ) {\",\r\n\r\n\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.5, 0.1 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.9, 0.1 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.9, 0.5 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.9, 0.9 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.5, 0.9 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.1, 0.9 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.1, 0.5 ) ) +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\r\n\r\n\t\t\t\t\t\"vVisibility = ( visibility.r / 9.0 ) *\",\r\n\t\t\t\t\t\t\t\t \"( 1.0 - visibility.g / 9.0 ) *\",\r\n\t\t\t\t\t\t\t\t \"( visibility.b / 9.0 ) *\",\r\n\t\t\t\t\t\t\t\t \"( 1.0 - visibility.a / 9.0 );\",\r\n\r\n\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\r\n\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join( \"\\n\" ),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\"uniform sampler2D map;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\t\t\t\"uniform vec3 color;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\t\t\t\"varying float vVisibility;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t// pink square\r\n\r\n\t\t\t\t\"if( renderType == 0 ) {\",\r\n\r\n\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\r\n\r\n\t\t\t\t// restore\r\n\r\n\t\t\t\t\"} else if( renderType == 1 ) {\",\r\n\r\n\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\r\n\r\n\t\t\t\t// flare\r\n\r\n\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\r\n\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\r\n\t\t\t\t\t\"gl_FragColor = texture;\",\r\n\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"}\"\r\n\t\t].join( \"\\n\" )\r\n\r\n\t},\r\n\r\n\r\n\t'lensFlare': {\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\"uniform vec3 screenPosition;\",\r\n\t\t\t\"uniform vec2 scale;\",\r\n\t\t\t\"uniform float rotation;\",\r\n\r\n\t\t\t\"attribute vec2 position;\",\r\n\t\t\t\"attribute vec2 uv;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vUV = uv;\",\r\n\r\n\t\t\t\t\"vec2 pos = position;\",\r\n\r\n\t\t\t\t\"if( renderType == 2 ) {\",\r\n\r\n\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\r\n\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join( \"\\n\" ),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"precision mediump float;\",\r\n\r\n\t\t\t\"uniform lowp int renderType;\",\r\n\r\n\t\t\t\"uniform sampler2D map;\",\r\n\t\t\t\"uniform sampler2D occlusionMap;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\t\t\t\"uniform vec3 color;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t// pink square\r\n\r\n\t\t\t\t\"if( renderType == 0 ) {\",\r\n\r\n\t\t\t\t\t\"gl_FragColor = vec4( texture2D( map, vUV ).rgb, 0.0 );\",\r\n\r\n\t\t\t\t// restore\r\n\r\n\t\t\t\t\"} else if( renderType == 1 ) {\",\r\n\r\n\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\r\n\r\n\t\t\t\t// flare\r\n\r\n\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\"float visibility = texture2D( occlusionMap, vec2( 0.5, 0.1 ) ).a +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.9, 0.5 ) ).a +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.5, 0.9 ) ).a +\",\r\n\t\t\t\t\t\t\t\t\t \"texture2D( occlusionMap, vec2( 0.1, 0.5 ) ).a;\",\r\n\r\n\t\t\t\t\t\"visibility = ( 1.0 - visibility / 4.0 );\",\r\n\r\n\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\r\n\t\t\t\t\t\"texture.a *= opacity * visibility;\",\r\n\t\t\t\t\t\"gl_FragColor = texture;\",\r\n\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join( \"\\n\" )\r\n\r\n\t}\r\n\r\n};\r\n/**\r\n * @author mikael emtinger / http://gomo.se/\r\n * @author alteredq / http://alteredqualia.com/\r\n *\r\n */\r\n\r\nTHREE.ShaderSprite = {\r\n\r\n\t'sprite': {\r\n\r\n\t\tvertexShader: [\r\n\r\n\t\t\t\"uniform int useScreenCoordinates;\",\r\n\t\t\t\"uniform int sizeAttenuation;\",\r\n\t\t\t\"uniform vec3 screenPosition;\",\r\n\t\t\t\"uniform mat4 modelViewMatrix;\",\r\n\t\t\t\"uniform mat4 projectionMatrix;\",\r\n\t\t\t\"uniform float rotation;\",\r\n\t\t\t\"uniform vec2 scale;\",\r\n\t\t\t\"uniform vec2 alignment;\",\r\n\t\t\t\"uniform vec2 uvOffset;\",\r\n\t\t\t\"uniform vec2 uvScale;\",\r\n\r\n\t\t\t\"attribute vec2 position;\",\r\n\t\t\t\"attribute vec2 uv;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vUV = uvOffset + uv * uvScale;\",\r\n\r\n\t\t\t\t\"vec2 alignedPosition = position + alignment;\",\r\n\r\n\t\t\t\t\"vec2 rotatedPosition;\",\r\n\t\t\t\t\"rotatedPosition.x = ( cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y ) * scale.x;\",\r\n\t\t\t\t\"rotatedPosition.y = ( sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y ) * scale.y;\",\r\n\r\n\t\t\t\t\"vec4 finalPosition;\",\r\n\r\n\t\t\t\t\"if( useScreenCoordinates != 0 ) {\",\r\n\r\n\t\t\t\t\t\"finalPosition = vec4( screenPosition.xy + rotatedPosition, screenPosition.z, 1.0 );\",\r\n\r\n\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\"finalPosition = projectionMatrix * modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\",\r\n\t\t\t\t\t\"finalPosition.xy += rotatedPosition * ( sizeAttenuation == 1 ? 1.0 : finalPosition.z );\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\"gl_Position = finalPosition;\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join( \"\\n\" ),\r\n\r\n\t\tfragmentShader: [\r\n\r\n\t\t\t\"uniform vec3 color;\",\r\n\t\t\t\"uniform sampler2D map;\",\r\n\t\t\t\"uniform float opacity;\",\r\n\r\n\t\t\t\"uniform int fogType;\",\r\n\t\t\t\"uniform vec3 fogColor;\",\r\n\t\t\t\"uniform float fogDensity;\",\r\n\t\t\t\"uniform float fogNear;\",\r\n\t\t\t\"uniform float fogFar;\",\r\n\t\t\t\"uniform float alphaTest;\",\r\n\r\n\t\t\t\"varying vec2 vUV;\",\r\n\r\n\t\t\t\"void main() {\",\r\n\r\n\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\r\n\r\n\t\t\t\t\"if ( texture.a < alphaTest ) discard;\",\r\n\r\n\t\t\t\t\"gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\",\r\n\r\n\t\t\t\t\"if ( fogType > 0 ) {\",\r\n\r\n\t\t\t\t\t\"float depth = gl_FragCoord.z / gl_FragCoord.w;\",\r\n\t\t\t\t\t\"float fogFactor = 0.0;\",\r\n\r\n\t\t\t\t\t\"if ( fogType == 1 ) {\",\r\n\r\n\t\t\t\t\t\t\"fogFactor = smoothstep( fogNear, fogFar, depth );\",\r\n\r\n\t\t\t\t\t\"} else {\",\r\n\r\n\t\t\t\t\t\t\"const float LOG2 = 1.442695;\",\r\n\t\t\t\t\t\t\"float fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\",\r\n\t\t\t\t\t\t\"fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\",\r\n\r\n\t\t\t\t\t\"}\",\r\n\r\n\t\t\t\t\t\"gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\",\r\n\r\n\t\t\t\t\"}\",\r\n\r\n\t\t\t\"}\"\r\n\r\n\t\t].join( \"\\n\" )\r\n\r\n\t}\r\n\r\n};\r\n\r\n// Export the THREE object for **Node.js**, with\r\n// backwards-compatibility for the old `require()` API. If we're in\r\n// the browser, add `_` as a global object via a string identifier,\r\n// for Closure Compiler \"advanced\" mode.\r\nif (typeof exports !== 'undefined') {\r\n if (typeof module !== 'undefined' && module.exports) {\r\n exports = module.exports = THREE;\r\n }\r\n exports.THREE = THREE;\r\n} else {\r\n this['THREE'] = THREE;\r\n}\r\n","\r\n\r\n\r\n\r\n\n","import { render } from \"./LangCanvas.vue?vue&type=template&id=d476a852\"\nimport script from \"./LangCanvas.vue?vue&type=script&lang=js\"\nexport * from \"./LangCanvas.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"E:\\\\办公\\\\项目\\\\大众物流官网\\\\node_modules\\\\@vue\\\\cli-service\\\\node_modules\\\\vue-loader-v16\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"sourceRoot":""}