{"mappings":"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","names":["length","a","x","y","z","copy","out","set","add","b","subtract","multiply","divide","scale","distance","squaredDistance","squaredLength","negate","inverse","normalize","len","dot","cross","ax","ay","az","bx","by","bz","lerp","t","smoothLerp","decay","dt","exp","transformMat4","m","w","scaleRotateMat4","transformMat3","transformQuat","q","qx","qy","qz","qw","uvx","uvy","uvz","uuvx","uuvy","uuvz","w2","angle","tempA","tempB","cosine","exactEquals","Vec3","_Vec3","x","y","z","v","set","copy","va","vb","add","subtract","multiply","scale","divide","inverse","length","distance","squaredLength","squaredDistance","negate","cross","normalize","dot","exactEquals","mat3","transformMat3","mat4","transformMat4","scaleRotateMat4","q","transformQuat","angle","t","lerp","decay","dt","smoothLerp","a","o","tempVec3","Vec3","ID","ATTR_ID","isBoundsWarned","Geometry","gl","attributes","key","attr","isNewBuffer","value","start","count","program","location","name","type","numLoc","size","stride","offset","i","mode","indexBytesPerElement","array","min","max","center","scale","x","y","z","maxRadiusSq","l","ID","arrayCacheF32","Program","gl","vertex","fragment","uniforms","transparent","cullFace","frontFace","depthTest","depthWrite","depthFunc","addLineNumbers","numUniforms","uIndex","uniform","split","locations","numAttribs","aIndex","attribute","location","src","dst","srcAlpha","dstAlpha","modeRGB","modeAlpha","func","ref","mask","stencilFail","depthFail","depthPass","flipFaces","textureUnit","activeUniform","component","warn","setUniform","textureUnits","value","type","flatten","setValue","arraysEqual","setArray","string","lines","i","a","arrayLen","valueLen","length","b","l","warnCount","message","tempVec3","Vec3","ID","Renderer","canvas","width","height","dpr","alpha","depth","stencil","antialias","premultipliedAlpha","preserveDrawingBuffer","powerPreference","autoClear","webgl","attributes","x","y","id","src","dst","srcAlpha","dstAlpha","modeRGB","modeAlpha","value","func","ref","mask","stencilFail","depthFail","depthPass","target","buffer","extension","webgl2Func","extFunc","a","b","scene","camera","frustumCull","sort","renderList","node","opaque","transparent","ui","update","clear","copy","out","a","set","x","y","z","w","scale","out","a","b","normalize","out","a","x","y","z","w","len","dot","b","identity","out","setAxisAngle","axis","rad","s","multiply","a","b","ax","ay","az","aw","bx","by","bz","bw","rotateX","rotateY","rotateZ","slerp","t","omega","cosom","sinom","scale0","scale1","invert","a0","a1","a2","a3","dot","invDot","conjugate","fromMat3","m","fTrace","fRoot","i","j","k","fromEuler","euler","order","sx","cx","sy","cy","sz","cz","copy","set","dot","normalize","Quat","x","y","z","w","triggerProps","target","property","success","v","identity","set","a","rotateX","rotateY","rotateZ","q","invert","conjugate","copy","normalize","qA","qB","multiply","dot","matrix3","fromMat3","euler","isInternal","fromEuler","axis","setAxisAngle","t","slerp","o","EPSILON","copy","out","a","set","m00","m01","m02","m03","m10","m11","m12","m13","m20","m21","m22","m23","m30","m31","m32","m33","identity","invert","out","a","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b00","b01","b02","b03","b04","b05","b06","b07","b08","b09","b10","b11","det","determinant","multiply","b","b0","b1","b2","b3","translate","v","x","y","z","scale","rotate","rad","axis","len","s","c","t","b12","b20","b21","b22","EPSILON","getTranslation","mat","getScaling","m11","m12","m13","m21","m22","m23","m31","m32","m33","getMaxScaleOnAxis","getRotation","temp","scaling","is1","is2","is3","sm11","sm12","sm13","sm21","sm22","sm23","sm31","sm32","sm33","trace","S","decompose","srcMat","dstRotation","dstTranslation","dstScale","sx","length","sy","sz","_m1","invSX","invSY","invSZ","compose","dstMat","srcRotation","srcTranslation","srcScale","te","w","x2","y2","z2","xx","xy","xz","yy","yz","zz","wx","wy","wz","fromQuat","out","q","x","y","z","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","perspective","fovy","aspect","near","far","f","nf","ortho","left","right","bottom","top","lr","bt","targetTo","eye","target","up","eyex","eyey","eyez","upx","upy","upz","z0","z1","len","x0","x1","add","a","b","subtract","multiplyScalar","Mat4","m00","m01","m02","m03","m10","m11","m12","m13","m20","m21","m22","m23","m30","m31","m32","m33","v","set","m","translate","axis","rotate","scale","ma","mb","add","subtract","multiply","multiplyScalar","identity","copy","fov","aspect","near","far","perspective","left","right","bottom","top","ortho","q","fromQuat","invert","pos","compose","decompose","getRotation","getTranslation","getScaling","getMaxScaleOnAxis","eye","target","up","targetTo","determinant","a","o","fromRotationMatrix","out","m","order","tmpMat4","Mat4","Euler","x","y","z","order","triggerProps","target","property","success","v","m","fromRotationMatrix","q","isInternal","a","o","Transform","Mat4","Vec3","Quat","Euler","parent","notifyParent","child","notifyChild","force","i","l","callback","target","invert","tempMat4","Mat4","tempVec3a","Vec3","tempVec3b","Camera","Transform","gl","near","far","fov","aspect","left","right","bottom","top","zoom","target","v","m","i","invLen","node","worldMatrix","center","radius","normal","plane","fromMat4","out","a","fromQuat","q","x","y","z","w","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","copy","set","m00","m01","m02","m10","m11","m12","m20","m21","m22","identity","invert","out","a","a00","a01","a02","a10","a11","a12","a20","a21","a22","b01","b11","b21","det","multiply","out","a","b","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","translate","v","x","y","rotate","rad","s","c","scale","normalFromMat4","a03","a13","a23","a30","a31","a32","a33","b03","b04","b05","b06","b07","b08","b09","det","Mat3","m00","m01","m02","m10","m11","m12","m20","m21","m22","set","v","m","translate","rotate","scale","ma","mb","multiply","identity","copy","fromMat4","q","fromQuat","vec3a","vec3b","vec3c","invert","normalFromMat4","ID","Mesh","Transform","gl","geometry","program","mode","frustumCulled","renderOrder","Mat4","Mat3","f","camera","flipFaces","emptyPixel","isPowerOf2","value","ID","Texture","gl","image","target","type","format","internalFormat","wrapS","wrapT","wrapR","generateMipmaps","minFilter","magFilter","premultiplyAlpha","unpackAlignment","flipY","anisotropy","level","width","height","length","textureUnit","needsUpdate","i","RenderTarget","gl","width","height","target","color","depth","stencil","depthTexture","wrapS","wrapT","wrapR","minFilter","magFilter","type","format","internalFormat","unpackAlignment","premultiplyAlpha","drawBuffers","i","Texture","NAMES","hexToRGB","hex","rgb","numberToRGB","num","parseColor","color","Color","color","parseColor","v","copy","out","a","set","x","y","add","b","subtract","multiply","divide","scale","distance","squaredDistance","length","squaredLength","negate","inverse","normalize","len","dot","cross","lerp","t","ax","ay","smoothLerp","decay","dt","exp","transformMat3","out","a","m","x","y","transformMat4","exactEquals","b","Vec2","_Vec2","x","y","v","set","copy","va","vb","add","subtract","multiply","scale","divide","inverse","length","distance","squaredDistance","squaredLength","negate","cross","normalize","dot","exactEquals","mat3","transformMat3","mat4","transformMat4","a","lerp","decay","dt","smoothLerp","o","Vec4","x","y","z","w","v","set","copy","normalize","scale","dot","a","o","Plane","_Plane","Geometry","gl","width","height","widthSegments","heightSegments","attributes","wSegs","hSegs","num","numIndices","position","normal","uv","index","depth","u","v","w","uDir","vDir","i","ii","io","segW","segH","iy","y","ix","x","a","b","c","d","Box","Geometry","gl","width","height","depth","widthSegments","heightSegments","depthSegments","attributes","wSegs","hSegs","dSegs","num","numIndices","position","normal","uv","index","i","ii","Plane","Sphere","Geometry","gl","radius","widthSegments","heightSegments","phiStart","phiLength","thetaStart","thetaLength","attributes","wSegs","hSegs","pStart","pLength","tStart","tLength","num","numIndices","position","normal","uv","index","i","iv","ii","te","grid","n","Vec3","iy","vRow","v","ix","u","x","y","z","a","b","c","d","Cylinder","Geometry","gl","radiusTop","radiusBottom","height","radialSegments","heightSegments","openEnded","thetaStart","thetaLength","attributes","rSegs","hSegs","tStart","tLength","numCaps","num","numIndices","position","normal","uv","index","i","ii","indexArray","addHeight","addCap","x","y","n","Vec3","slope","indexRow","v","r","u","theta","sinTheta","cosTheta","a","b","c","d","isTop","sign","centerIndex","j","Triangle","Geometry","gl","attributes","Torus","Geometry","gl","radius","tube","radialSegments","tubularSegments","arc","attributes","num","numIndices","vertices","normals","uvs","indices","center","Vec3","vertex","normal","idx","j","i","u","v","a","b","c","d","STATE","tempVec3","Vec3","tempVec2a","Vec2","tempVec2b","Orbit","object","element","enabled","target","ease","inertia","enableRotate","rotateSpeed","autoRotate","autoRotateSpeed","enableZoom","zoomSpeed","zoomStyle","enablePan","panSpeed","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","minDistance","maxDistance","sphericalDelta","sphericalTarget","spherical","panDelta","offset","handleAutoRotate","sinPhiRadius","rotateStart","panStart","dollyStart","state","getZoomScale","panLeft","distance","m","panUp","pan","deltaX","deltaY","el","targetDistance","dolly","dollyScale","angle","handleMoveRotate","x","y","handleMouseMoveDolly","e","handleMovePan","handleTouchStartDollyPan","dx","dy","handleTouchMoveDollyPan","onMouseDown","onMouseMove","onMouseUp","onMouseWheel","onTouchStart","onTouchMove","onTouchEnd","onContextMenu","addHandlers","tempVec2a","Vec2","tempVec2b","tempVec2c","tempVec3a","Vec3","tempVec3b","tempVec3c","tempVec3d","tempVec3e","tempVec3f","tempVec3g","tempVec3h","tempVec3i","tempVec3j","tempVec3k","tempMat4","Mat4","Raycast","camera","mouse","left","right","bottom","top","zoom","x","y","meshes","maxDistance","output","invWorldMat4","origin","direction","hits","mesh","bounds","localMaxDistance","localDistance","a","b","cullFace","includeUV","includeNormal","c","closestFaceNormal","faceNormal","barycoord","uvA","uvB","uvC","i","closestA","closestB","closestC","geometry","attributes","index","position","start","end","stride","j","ai","bi","ci","distance","plane","xminp","delta","sphere","ray","tca","d2","radius2","thc","t0","t1","box","tmin","tmax","tYmin","tYmax","tZmin","tZmax","invdirx","invdiry","invdirz","min","max","backfaceCulling","normal","edge1","edge2","diff","DdN","sign","DdQxE2","DdE1xQ","QdN","point","target","v0","v1","v2","dot00","dot01","dot02","dot11","dot12","denom","invDenom","u","v","CATMULLROM","CUBICBEZIER","QUADRATICBEZIER","_a0","Vec3","_a1","_a2","_a3","getCtrlPoint","points","i","a","b","last","getQuadraticBezierPoint","t","p0","c0","p1","k","ret","getCubicBezierPoint","c1","Curve","_Curve","divisions","type","count","p","offset","c","BaseSegment","source","T_VALUES","C_VALUES","toRadian","a","toDegrees","clamp","val","min","max","mat4fromRotationSinCos","out","axis","sin","cos","x","y","z","t","rotateNormalBinormal","angle","norm","binorm","outNorm","outBinorm","s","c","nx","ny","nz","bx","by","bz","tempVec3","Vec3","cubicBezier","t","p0","p1","p2","p3","k","cubicBezierDeriv","CubicBezierSegment","BaseSegment","tiltStart","tiltEnd","len","T_VALUES","sum","i","C_VALUES","out","tempVec3","Vec3","quadraticBezier","t","p0","p1","p2","k","quadraticBezierDeriv","QuadraticBezierSegment","BaseSegment","tiltStart","tiltEnd","len","T_VALUES","sum","i","C_VALUES","out","tempVec3","Vec3","LineSegment","BaseSegment","p0","p1","tiltStart","tiltEnd","out","lerp","tempVec3","Vec3","tempMat4","Mat4","throwIfNullProperty","property","message","Path","p","tilt","cp1","cp2","seg","CubicBezierSegment","cp","QuadraticBezierSegment","LineSegment","segment","n","offset","i","len","totalLength","start","end","index","mid","segLen","t","out","divisions","points","closed","tangents","tilts","tiltFunction","a","si","st","tx","ty","tz","normal","normals","binormals","crossLen","cosTheta","clamp","sinTheta","mat4fromRotationSinCos","rotateNormalBinormal","toRadian","normalLast","step","angle","toDegrees","vertex","Vec3","normal","uv","Vec2","point","Tube","Geometry","gl","path","radius","tubularSegments","radialSegments","closed","attributes","numVertices","numIndices","i","ci","N","B","j","v","sin","cos","idx","a","b","c","d","Post","gl","width","height","dpr","wrapS","wrapT","minFilter","magFilter","geometry","Triangle","targetOnly","depth","options","fbo","RenderTarget","temp","vertex","defaultVertex","fragment","defaultFragment","uniforms","textureUniform","enabled","program","Program","pass","Mesh","scene","camera","texture","target","update","sort","frustumCull","beforePostCallbacks","enabledPasses","f","i","prevPos","Vec3","prevRot","Quat","prevScl","nextPos","nextRot","nextScl","Animation","objects","data","totalWeight","isSet","weight","elapsed","floorFrame","blend","prevKey","nextKey","object","i","tempMat4","Mat4","Skin","Mesh","gl","rig","geometry","program","mode","Transform","i","bone","data","size","Texture","animation","Animation","total","camera","Text","font","text","width","align","size","letterSpacing","lineHeight","wordSpacing","wordBreak","_this","glyphs","buffers","fontHeight","baseline","scale","newline","whitespace","parseFont","createGeometry","d","numChars","i","layout","lines","cursor","wordCursor","wordWidth","line","newLine","maxTimes","count","char","glyph","prevGlyph","kern","getKernPairOffset","advance","numGlyphs","populateBuffers","texW","texH","y","j","lineIndex","x","w","h","u","uw","v","vh","id1","id2","k","options","vertex","fragment","NormalProgram","gl","Program","Flowmap","gl","size","falloff","alpha","dissipation","type","_this","temp","createFBOs","Vec2","initProgram","minFilter","options","RenderTarget","Mesh","Triangle","Program","vertex","fragment","GPGPU","gl","data","geometry","Triangle","type","initialData","i","x","y","floatArray","a","Texture","options","RenderTarget","temp","vertex","defaultVertex","fragment","defaultFragment","uniforms","textureUniform","enabled","program","Program","pass","Mesh","tmp","Vec3","Polyline","gl","points","vertex","defaultVertex","fragment","defaultFragment","uniforms","attributes","side","uv","index","i","v","ind","geometry","Geometry","Vec2","Color","program","Program","Mesh","p","Shadow","gl","light","Camera","width","height","RenderTarget","Program","defaultVertex","defaultFragment","mesh","receive","cast","vertex","fragment","uniformProjection","uniformView","uniformTexture","scene","node","KTXTexture","Texture","gl","buffer","wrapS","wrapT","anisotropy","minFilter","magFilter","ktx","KhronosTextureContainer","idCheck","id","i","size","head","littleEndian","width","height","bytesOfKeyValueData","offset","level","levelSize","face","data","cache","supportedExtensions","TextureLoader","gl","src","wrapS","wrapT","anisotropy","format","internalFormat","generateMipmaps","minFilter","magFilter","premultiplyAlpha","unpackAlignment","flipY","support","ext","prop","cacheID","texture","KTXTexture","Texture","extensions","res","buffer","decodeImage","imgBmp","powerOfTwo","value","resolve","reject","isCreateImageBitmap","r","b","err","img","type","tmpVec3A","Vec3","tmpVec3B","tmpVec3C","tmpVec3D","tmpQuatA","Quat","tmpQuatB","tmpQuatC","tmpQuatD","GLTFAnimation","data","weight","a","times","totalWeight","isSet","elapsed","node","transform","interpolation","values","val","size","prevIndex","t","nextIndex","alpha","prevVal","prevTan","nextTan","nextVal","t2","t3","s2","s3","s0","s1","i","tempMat4","Mat4","identity","GLTFSkin","Mesh","gl","skeleton","geometry","program","mode","size","Texture","bone","i","camera","_worldMatrix","InstancedMesh","Mesh","args","matrixData","i","j","transform","Transform","lightmapData","Vec4","camera","TYPE_ARRAY","TYPE_SIZE","ATTRIBUTES","TRANSFORMS","GLTFLoader","manager","gl","src","dir","desc","buffers","bufferViews","images","textures","materials","skins","meshes","nodes","cameras","animations","scenes","scene","lights","i","res","data","textDecoder","glb","header","jsonChunkHeader","jsonByteOffset","jsonByteLength","jsonText","json","binaryChunkHeader","binaryByteOffset","binaryByteLength","binary","uri","buffer","primitives","attributes","indices","extensions","attr","accessor","bufferViewIndex","componentType","mimeType","bufferIndex","byteOffset","byteLength","byteStride","target","name","extras","isAttribute","isDraco","image","blob","textureInfo","samplerIndex","sourceIndex","options","sampler","prop","texture","Texture","pbrMetallicRoughness","normalTexture","occlusionTexture","emissiveTexture","emissiveFactor","alphaMode","alphaCutoff","doubleSided","baseColorFactor","baseColorTexture","metallicFactor","roughnessFactor","metallicRoughnessTexture","inverseBindMatrices","skeleton","joints","weights","meshIndex","numInstances","skinIndices","isLightmap","mesh","skin","skinIndex","geometry","program","mode","GLTFSkin","meshConstructor","InstancedMesh","Mesh","materialIndex","targets","NormalProgram","Geometry","gltfAttributeMap","attributeMap","attributeTypeMap","attributeTypeNameMap","attributeNormalizedMap","attributeName","geometryData","result","size","type","normalized","index","count","min","max","sparse","bufferByteOffset","TypeArray","elementBytes","componentStride","isInterleaved","filteredData","typedData","start","end","camera","children","matrix","rotation","scale","translation","isCamera","node","Camera","Transform","cameraOpts","fov","near","far","xmag","ymag","isInstanced","isFirstInstance","isInstancedMatrix","childIndex","primitive","joint","Mat4","channels","samplers","animationIndex","inputIndex","interpolation","outputIndex","nodeIndex","path","transform","times","values","GLTFAnimation","nodesIndices","map","lightsDescArray","lightIndex","lightDesc","light","Vec3","id","DracoManager","workerSrc","data","error","geometry","geometryResolve","buffer","config","promise","res","supportedFormat","id","BasisManager","workerSrc","gl","data","error","image","textureResolve","buffer","promise","res","WireMesh","Mesh","gl","geometry","wireColor","Color","meshProps","wireProgram","Program","vertex","fragment","positionArray","indices","hashSet","addUniqueIndices","idx","i","isUniqueEdgePosition","idata","numVertices","indicesTyped","wireGeometry","Geometry","start","end","pos","hash1","hash2","oldSize","AxesHelper","Mesh","gl","size","symmetric","xColor","Vec3","yColor","zColor","meshProps","a","b","vertices","colors","geometry","Geometry","program","Program","vertex","fragment","GridHelper","Mesh","gl","size","divisions","color","Vec3","meshProps","numVertices","vertices","hs","i","o","geometry","Geometry","program","Program","vertex","fragment","VertexNormalsHelper","Mesh","object","size","color","Vec3","meshProps","gl","nNormals","positionsArray","normalsArray","sizeArray","normalData","positionData","sizeData","i","i6","i3","pSub","nSub","geometry","Geometry","program","Program","vertex","fragment","Mat3","arg","vA","Vec3","vB","vC","vCenter","vNormal","FaceNormalsHelper","Mesh","object","size","color","meshProps","gl","positionData","sizeData","indexAttr","getIndex","i","numVertices","nNormals","positionsArray","normalsArray","sizeArray","i2","geometry","Geometry","program","Program","vertex","fragment","Mat3","arg","Texture3D","Texture","gl","args","image","canvas","ctx","imageData","elementCount","dataCount","data","dataIterator","z","y","x","zOffsetX","zOffsetY","index","r","g","b","a","texel","i"],"sources":["../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/Vec3Func.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Vec3.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Geometry.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Program.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Renderer.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/Vec4Func.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/QuatFunc.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Quat.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/Mat4Func.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Mat4.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/EulerFunc.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Euler.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Transform.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Camera.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/Mat3Func.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Mat3.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Mesh.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/Texture.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/core/RenderTarget.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/ColorFunc.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Color.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/functions/Vec2Func.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Vec2.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/math/Vec4.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Plane.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Box.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Sphere.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Cylinder.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Triangle.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Torus.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Orbit.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Raycast.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Curve.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/BaseSegment.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/utils.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/CubicBezierSegment.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/QuadraticBezierSegment.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/LineSegment.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/path/Path.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Tube.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Post.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Animation.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Skin.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Text.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/NormalProgram.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Flowmap.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/GPGPU.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Polyline.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Shadow.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/KTXTexture.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/TextureLoader.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/GLTFAnimation.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/GLTFSkin.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/InstancedMesh.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/GLTFLoader.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/DracoManager.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/BasisManager.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/WireMesh.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/helpers/AxesHelper.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/helpers/GridHelper.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/helpers/VertexNormalsHelper.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/helpers/FaceNormalsHelper.js","../esm/npm/ogl@1.0.11/node_modules/ogl/src/extras/Texture3D.js"],"sourcesContent":["const EPSILON = 0.000001;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n    let x = a[0];\n    let y = a[1];\n    let z = a[2];\n    return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n    let x = b[0] - a[0];\n    let y = b[1] - a[1];\n    let z = b[2] - a[2];\n    return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n    let x = b[0] - a[0];\n    let y = b[1] - a[1];\n    let z = b[2] - a[2];\n    return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n    let x = a[0];\n    let y = a[1];\n    let z = a[2];\n    return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    out[2] = 1.0 / a[2];\n    return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n    let x = a[0];\n    let y = a[1];\n    let z = a[2];\n    let len = x * x + y * y + z * z;\n    if (len \u003e 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n    }\n    out[0] = a[0] * len;\n    out[1] = a[1] * len;\n    out[2] = a[2] * len;\n    return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n    let ax = a[0],\n        ay = a[1],\n        az = a[2];\n    let bx = b[0],\n        by = b[1],\n        bz = b[2];\n\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n    let ax = a[0];\n    let ay = a[1];\n    let az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n}\n\n/**\n * Performs a frame rate independant, linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} decay decay constant for interpolation. useful range between 1 and 25, from slow to fast.\n * @param {Number} dt delta time\n * @returns {vec3} out\n */\nexport function smoothLerp(out, a, b, decay, dt) {\n    const exp = Math.exp(-decay * dt);\n    let ax = a[0];\n    let ay = a[1];\n    let az = a[2];\n\n    out[0] = b[0] + (ax - b[0]) * exp;\n    out[1] = b[1] + (ay - b[1]) * exp;\n    out[2] = b[2] + (az - b[2]) * exp;\n    return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n}\n\n/**\n * Same as above but doesn't apply translation.\n * Useful for rays.\n */\nexport function scaleRotateMat4(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n    return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n    // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let qx = q[0],\n        qy = q[1],\n        qz = q[2],\n        qw = q[3];\n\n    let uvx = qy * z - qz * y;\n    let uvy = qz * x - qx * z;\n    let uvz = qx * y - qy * x;\n\n    let uuvx = qy * uvz - qz * uvy;\n    let uuvy = qz * uvx - qx * uvz;\n    let uuvz = qx * uvy - qy * uvx;\n\n    let w2 = qw * 2;\n    uvx *= w2;\n    uvy *= w2;\n    uvz *= w2;\n\n    uuvx *= 2;\n    uuvy *= 2;\n    uuvz *= 2;\n\n    out[0] = x + uvx + uuvx;\n    out[1] = y + uvy + uuvy;\n    out[2] = z + uvz + uuvz;\n    return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport const angle = (function () {\n    const tempA = [0, 0, 0];\n    const tempB = [0, 0, 0];\n\n    return function (a, b) {\n        copy(tempA, a);\n        copy(tempB, b);\n\n        normalize(tempA, tempA);\n        normalize(tempB, tempB);\n\n        let cosine = dot(tempA, tempB);\n\n        if (cosine \u003e 1.0) {\n            return 0;\n        } else if (cosine \u003c -1.0) {\n            return Math.PI;\n        } else {\n            return Math.acos(cosine);\n        }\n    };\n})();\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n    return a[0] === b[0] \u0026\u0026 a[1] === b[1] \u0026\u0026 a[2] === b[2];\n}\n","import * as Vec3Func from './functions/Vec3Func.js';\n\nexport class Vec3 extends Array {\n    constructor(x = 0, y = x, z = x) {\n        super(x, y, z);\n        return this;\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    set x(v) {\n        this[0] = v;\n    }\n\n    set y(v) {\n        this[1] = v;\n    }\n\n    set z(v) {\n        this[2] = v;\n    }\n\n    set(x, y = x, z = x) {\n        if (x.length) return this.copy(x);\n        Vec3Func.set(this, x, y, z);\n        return this;\n    }\n\n    copy(v) {\n        Vec3Func.copy(this, v);\n        return this;\n    }\n\n    add(va, vb) {\n        if (vb) Vec3Func.add(this, va, vb);\n        else Vec3Func.add(this, this, va);\n        return this;\n    }\n\n    sub(va, vb) {\n        if (vb) Vec3Func.subtract(this, va, vb);\n        else Vec3Func.subtract(this, this, va);\n        return this;\n    }\n\n    multiply(v) {\n        if (v.length) Vec3Func.multiply(this, this, v);\n        else Vec3Func.scale(this, this, v);\n        return this;\n    }\n\n    divide(v) {\n        if (v.length) Vec3Func.divide(this, this, v);\n        else Vec3Func.scale(this, this, 1 / v);\n        return this;\n    }\n\n    inverse(v = this) {\n        Vec3Func.inverse(this, v);\n        return this;\n    }\n\n    // Can't use 'length' as Array.prototype uses it\n    len() {\n        return Vec3Func.length(this);\n    }\n\n    distance(v) {\n        if (v) return Vec3Func.distance(this, v);\n        else return Vec3Func.length(this);\n    }\n\n    squaredLen() {\n        return Vec3Func.squaredLength(this);\n    }\n\n    squaredDistance(v) {\n        if (v) return Vec3Func.squaredDistance(this, v);\n        else return Vec3Func.squaredLength(this);\n    }\n\n    negate(v = this) {\n        Vec3Func.negate(this, v);\n        return this;\n    }\n\n    cross(va, vb) {\n        if (vb) Vec3Func.cross(this, va, vb);\n        else Vec3Func.cross(this, this, va);\n        return this;\n    }\n\n    scale(v) {\n        Vec3Func.scale(this, this, v);\n        return this;\n    }\n\n    normalize() {\n        Vec3Func.normalize(this, this);\n        return this;\n    }\n\n    dot(v) {\n        return Vec3Func.dot(this, v);\n    }\n\n    equals(v) {\n        return Vec3Func.exactEquals(this, v);\n    }\n\n    applyMatrix3(mat3) {\n        Vec3Func.transformMat3(this, this, mat3);\n        return this;\n    }\n\n    applyMatrix4(mat4) {\n        Vec3Func.transformMat4(this, this, mat4);\n        return this;\n    }\n\n    scaleRotateMatrix4(mat4) {\n        Vec3Func.scaleRotateMat4(this, this, mat4);\n        return this;\n    }\n\n    applyQuaternion(q) {\n        Vec3Func.transformQuat(this, this, q);\n        return this;\n    }\n\n    angle(v) {\n        return Vec3Func.angle(this, v);\n    }\n\n    lerp(v, t) {\n        Vec3Func.lerp(this, this, v, t);\n        return this;\n    }\n\n    smoothLerp(v, decay, dt) {\n        Vec3Func.smoothLerp(this, this, v, decay, dt);\n        return this;\n    }\n\n    clone() {\n        return new Vec3(this[0], this[1], this[2]);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        this[2] = a[o + 2];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        return a;\n    }\n\n    transformDirection(mat4) {\n        const x = this[0];\n        const y = this[1];\n        const z = this[2];\n\n        this[0] = mat4[0] * x + mat4[4] * y + mat4[8] * z;\n        this[1] = mat4[1] * x + mat4[5] * y + mat4[9] * z;\n        this[2] = mat4[2] * x + mat4[6] * y + mat4[10] * z;\n\n        return this.normalize();\n    }\n}\n","// attribute params\n// {\n//     data - typed array eg UInt16Array for indices, Float32Array\n//     size - int default 1\n//     instanced - default null. Pass divisor amount\n//     type - gl enum default gl.UNSIGNED_SHORT for 'index', gl.FLOAT for others\n//     normalized - boolean default false\n\n//     buffer - gl buffer, if buffer exists, don't need to provide data - although needs position data for bounds calculation\n//     stride - default 0 - for when passing in buffer\n//     offset - default 0 - for when passing in buffer\n//     count - default null - for when passing in buffer\n//     min - array - for when passing in buffer\n//     max - array - for when passing in buffer\n// }\n\n// TODO: fit in transform feedback\n\nimport { Vec3 } from '../math/Vec3.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\n\nlet ID = 1;\nlet ATTR_ID = 1;\n\n// To stop inifinite warnings\nlet isBoundsWarned = false;\n\nexport class Geometry {\n    constructor(gl, attributes = {}) {\n        if (!gl.canvas) console.error('gl not passed as first argument to Geometry');\n        this.gl = gl;\n        this.attributes = attributes;\n        this.id = ID++;\n\n        // Store one VAO per program attribute locations order\n        this.VAOs = {};\n\n        this.drawRange = { start: 0, count: 0 };\n        this.instancedCount = 0;\n\n        // Unbind current VAO so that new buffers don't get added to active mesh\n        this.gl.renderer.bindVertexArray(null);\n        this.gl.renderer.currentGeometry = null;\n\n        // Alias for state store to avoid redundant calls for global state\n        this.glState = this.gl.renderer.state;\n\n        // create the buffers\n        for (let key in attributes) {\n            this.addAttribute(key, attributes[key]);\n        }\n    }\n\n    addAttribute(key, attr) {\n        this.attributes[key] = attr;\n\n        // Set options\n        attr.id = ATTR_ID++; // TODO: currently unused, remove?\n        attr.size = attr.size || 1;\n        attr.type =\n            attr.type ||\n            (attr.data.constructor === Float32Array\n                ? this.gl.FLOAT\n                : attr.data.constructor === Uint16Array\n                ? this.gl.UNSIGNED_SHORT\n                : this.gl.UNSIGNED_INT); // Uint32Array\n        attr.target = key === 'index' ? this.gl.ELEMENT_ARRAY_BUFFER : this.gl.ARRAY_BUFFER;\n        attr.normalized = attr.normalized || false;\n        attr.stride = attr.stride || 0;\n        attr.offset = attr.offset || 0;\n        attr.count = attr.count || (attr.stride ? attr.data.byteLength / attr.stride : attr.data.length / attr.size);\n        attr.divisor = attr.instanced || 0;\n        attr.needsUpdate = false;\n        attr.usage = attr.usage || this.gl.STATIC_DRAW;\n\n        if (!attr.buffer) {\n            // Push data to buffer\n            this.updateAttribute(attr);\n        }\n\n        // Update geometry counts. If indexed, ignore regular attributes\n        if (attr.divisor) {\n            this.isInstanced = true;\n            if (this.instancedCount \u0026\u0026 this.instancedCount !== attr.count * attr.divisor) {\n                console.warn('geometry has multiple instanced buffers of different length');\n                return (this.instancedCount = Math.min(this.instancedCount, attr.count * attr.divisor));\n            }\n            this.instancedCount = attr.count * attr.divisor;\n        } else if (key === 'index') {\n            this.drawRange.count = attr.count;\n        } else if (!this.attributes.index) {\n            this.drawRange.count = Math.max(this.drawRange.count, attr.count);\n        }\n    }\n\n    updateAttribute(attr) {\n        const isNewBuffer = !attr.buffer;\n        if (isNewBuffer) attr.buffer = this.gl.createBuffer();\n        if (this.glState.boundBuffer !== attr.buffer) {\n            this.gl.bindBuffer(attr.target, attr.buffer);\n            this.glState.boundBuffer = attr.buffer;\n        }\n        if (isNewBuffer) {\n            this.gl.bufferData(attr.target, attr.data, attr.usage);\n        } else {\n            this.gl.bufferSubData(attr.target, 0, attr.data);\n        }\n        attr.needsUpdate = false;\n    }\n\n    setIndex(value) {\n        this.addAttribute('index', value);\n    }\n\n    setDrawRange(start, count) {\n        this.drawRange.start = start;\n        this.drawRange.count = count;\n    }\n\n    setInstancedCount(value) {\n        this.instancedCount = value;\n    }\n\n    createVAO(program) {\n        this.VAOs[program.attributeOrder] = this.gl.renderer.createVertexArray();\n        this.gl.renderer.bindVertexArray(this.VAOs[program.attributeOrder]);\n        this.bindAttributes(program);\n    }\n\n    bindAttributes(program) {\n        // Link all attributes to program using gl.vertexAttribPointer\n        program.attributeLocations.forEach((location, { name, type }) =\u003e {\n            // If geometry missing a required shader attribute\n            if (!this.attributes[name]) {\n                console.warn(`active attribute ${name} not being supplied`);\n                return;\n            }\n\n            const attr = this.attributes[name];\n\n            this.gl.bindBuffer(attr.target, attr.buffer);\n            this.glState.boundBuffer = attr.buffer;\n\n            // For matrix attributes, buffer needs to be defined per column\n            let numLoc = 1;\n            if (type === 35674) numLoc = 2; // mat2\n            if (type === 35675) numLoc = 3; // mat3\n            if (type === 35676) numLoc = 4; // mat4\n\n            const size = attr.size / numLoc;\n            const stride = numLoc === 1 ? 0 : numLoc * numLoc * 4;\n            const offset = numLoc === 1 ? 0 : numLoc * 4;\n\n            for (let i = 0; i \u003c numLoc; i++) {\n                this.gl.vertexAttribPointer(location + i, size, attr.type, attr.normalized, attr.stride + stride, attr.offset + i * offset);\n                this.gl.enableVertexAttribArray(location + i);\n\n                // For instanced attributes, divisor needs to be set.\n                // For firefox, need to set back to 0 if non-instanced drawn after instanced. Else won't render\n                this.gl.renderer.vertexAttribDivisor(location + i, attr.divisor);\n            }\n        });\n\n        // Bind indices if geometry indexed\n        if (this.attributes.index) this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.attributes.index.buffer);\n    }\n\n    draw({ program, mode = this.gl.TRIANGLES }) {\n        if (this.gl.renderer.currentGeometry !== `${this.id}_${program.attributeOrder}`) {\n            if (!this.VAOs[program.attributeOrder]) this.createVAO(program);\n            this.gl.renderer.bindVertexArray(this.VAOs[program.attributeOrder]);\n            this.gl.renderer.currentGeometry = `${this.id}_${program.attributeOrder}`;\n        }\n\n        // Check if any attributes need updating\n        program.attributeLocations.forEach((location, { name }) =\u003e {\n            const attr = this.attributes[name];\n            if (attr.needsUpdate) this.updateAttribute(attr);\n        });\n\n        // For drawElements, offset needs to be multiple of type size\n        let indexBytesPerElement = 2;\n        if (this.attributes.index?.type === this.gl.UNSIGNED_INT) indexBytesPerElement = 4;\n\n        if (this.isInstanced) {\n            if (this.attributes.index) {\n                this.gl.renderer.drawElementsInstanced(\n                    mode,\n                    this.drawRange.count,\n                    this.attributes.index.type,\n                    this.attributes.index.offset + this.drawRange.start * indexBytesPerElement,\n                    this.instancedCount\n                );\n            } else {\n                this.gl.renderer.drawArraysInstanced(mode, this.drawRange.start, this.drawRange.count, this.instancedCount);\n            }\n        } else {\n            if (this.attributes.index) {\n                this.gl.drawElements(\n                    mode,\n                    this.drawRange.count,\n                    this.attributes.index.type,\n                    this.attributes.index.offset + this.drawRange.start * indexBytesPerElement\n                );\n            } else {\n                this.gl.drawArrays(mode, this.drawRange.start, this.drawRange.count);\n            }\n        }\n    }\n\n    getPosition() {\n        // Use position buffer, or min/max if available\n        const attr = this.attributes.position;\n        // if (attr.min) return [...attr.min, ...attr.max];\n        if (attr.data) return attr;\n        if (isBoundsWarned) return;\n        console.warn('No position buffer data found to compute bounds');\n        return (isBoundsWarned = true);\n    }\n\n    computeBoundingBox(attr) {\n        if (!attr) attr = this.getPosition();\n        const array = attr.data;\n        // Data loaded shouldn't haave stride, only buffers\n        // const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : attr.size;\n        const stride = attr.size;\n\n        if (!this.bounds) {\n            this.bounds = {\n                min: new Vec3(),\n                max: new Vec3(),\n                center: new Vec3(),\n                scale: new Vec3(),\n                radius: Infinity,\n            };\n        }\n\n        const min = this.bounds.min;\n        const max = this.bounds.max;\n        const center = this.bounds.center;\n        const scale = this.bounds.scale;\n\n        min.set(+Infinity);\n        max.set(-Infinity);\n\n        // TODO: check size of position (eg triangle with Vec2)\n        for (let i = 0, l = array.length; i \u003c l; i += stride) {\n            const x = array[i];\n            const y = array[i + 1];\n            const z = array[i + 2];\n\n            min.x = Math.min(x, min.x);\n            min.y = Math.min(y, min.y);\n            min.z = Math.min(z, min.z);\n\n            max.x = Math.max(x, max.x);\n            max.y = Math.max(y, max.y);\n            max.z = Math.max(z, max.z);\n        }\n\n        scale.sub(max, min);\n        center.add(min, max).divide(2);\n    }\n\n    computeBoundingSphere(attr) {\n        if (!attr) attr = this.getPosition();\n        const array = attr.data;\n        // Data loaded shouldn't haave stride, only buffers\n        // const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : attr.size;\n        const stride = attr.size;\n\n        if (!this.bounds) this.computeBoundingBox(attr);\n\n        let maxRadiusSq = 0;\n        for (let i = 0, l = array.length; i \u003c l; i += stride) {\n            tempVec3.fromArray(array, i);\n            maxRadiusSq = Math.max(maxRadiusSq, this.bounds.center.squaredDistance(tempVec3));\n        }\n\n        this.bounds.radius = Math.sqrt(maxRadiusSq);\n    }\n\n    remove() {\n        for (let key in this.VAOs) {\n            this.gl.renderer.deleteVertexArray(this.VAOs[key]);\n            delete this.VAOs[key];\n        }\n        for (let key in this.attributes) {\n            this.gl.deleteBuffer(this.attributes[key].buffer);\n            delete this.attributes[key];\n        }\n    }\n}\n","// TODO: upload empty texture if null ? maybe not\n// TODO: upload identity matrix if null ?\n// TODO: sampler Cube\n\nlet ID = 1;\n\n// cache of typed arrays used to flatten uniform arrays\nconst arrayCacheF32 = {};\n\nexport class Program {\n    constructor(\n        gl,\n        {\n            vertex,\n            fragment,\n            uniforms = {},\n\n            transparent = false,\n            cullFace = gl.BACK,\n            frontFace = gl.CCW,\n            depthTest = true,\n            depthWrite = true,\n            depthFunc = gl.LEQUAL,\n        } = {}\n    ) {\n        if (!gl.canvas) console.error('gl not passed as first argument to Program');\n        this.gl = gl;\n        this.uniforms = uniforms;\n        this.id = ID++;\n\n        if (!vertex) console.warn('vertex shader not supplied');\n        if (!fragment) console.warn('fragment shader not supplied');\n\n        // Store program state\n        this.transparent = transparent;\n        this.cullFace = cullFace;\n        this.frontFace = frontFace;\n        this.depthTest = depthTest;\n        this.depthWrite = depthWrite;\n        this.depthFunc = depthFunc;\n        this.blendFunc = {};\n        this.blendEquation = {};\n        this.stencilFunc = {};\n        this.stencilOp = {}\n\n        // set default blendFunc if transparent flagged\n        if (this.transparent \u0026\u0026 !this.blendFunc.src) {\n            if (this.gl.renderer.premultipliedAlpha) this.setBlendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);\n            else this.setBlendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        }\n\n        // Create empty shaders and attach to program\n        this.vertexShader = gl.createShader(gl.VERTEX_SHADER);\n        this.fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n        this.program = gl.createProgram();\n        gl.attachShader(this.program, this.vertexShader);\n        gl.attachShader(this.program, this.fragmentShader);\n\n        // Compile shaders with source\n        this.setShaders({ vertex, fragment });\n    }\n\n    setShaders({ vertex, fragment }) {\n        if (vertex) {\n            // compile vertex shader and log errors\n            this.gl.shaderSource(this.vertexShader, vertex);\n            this.gl.compileShader(this.vertexShader);\n            if (this.gl.getShaderInfoLog(this.vertexShader) !== '') {\n                console.warn(`${this.gl.getShaderInfoLog(this.vertexShader)}\\nVertex Shader\\n${addLineNumbers(vertex)}`);\n            }\n        }\n\n        if (fragment) {\n            // compile fragment shader and log errors\n            this.gl.shaderSource(this.fragmentShader, fragment);\n            this.gl.compileShader(this.fragmentShader);\n            if (this.gl.getShaderInfoLog(this.fragmentShader) !== '') {\n                console.warn(`${this.gl.getShaderInfoLog(this.fragmentShader)}\\nFragment Shader\\n${addLineNumbers(fragment)}`);\n            }\n        }\n\n        // compile program and log errors\n        this.gl.linkProgram(this.program);\n        if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) {\n            return console.warn(this.gl.getProgramInfoLog(this.program));\n        }\n\n        // Get active uniform locations\n        this.uniformLocations = new Map();\n        let numUniforms = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_UNIFORMS);\n        for (let uIndex = 0; uIndex \u003c numUniforms; uIndex++) {\n            let uniform = this.gl.getActiveUniform(this.program, uIndex);\n            this.uniformLocations.set(uniform, this.gl.getUniformLocation(this.program, uniform.name));\n\n            // split uniforms' names to separate array and struct declarations\n            const split = uniform.name.match(/(\\w+)/g);\n\n            uniform.uniformName = split[0];\n            uniform.nameComponents = split.slice(1);\n        }\n\n        // Get active attribute locations\n        this.attributeLocations = new Map();\n        const locations = [];\n        const numAttribs = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);\n        for (let aIndex = 0; aIndex \u003c numAttribs; aIndex++) {\n            const attribute = this.gl.getActiveAttrib(this.program, aIndex);\n            const location = this.gl.getAttribLocation(this.program, attribute.name);\n            // Ignore special built-in inputs. eg gl_VertexID, gl_InstanceID\n            if (location === -1) continue;\n            locations[location] = attribute.name;\n            this.attributeLocations.set(attribute, location);\n        }\n        this.attributeOrder = locations.join('');\n    }\n\n    setBlendFunc(src, dst, srcAlpha, dstAlpha) {\n        this.blendFunc.src = src;\n        this.blendFunc.dst = dst;\n        this.blendFunc.srcAlpha = srcAlpha;\n        this.blendFunc.dstAlpha = dstAlpha;\n        if (src) this.transparent = true;\n    }\n\n    setBlendEquation(modeRGB, modeAlpha) {\n        this.blendEquation.modeRGB = modeRGB;\n        this.blendEquation.modeAlpha = modeAlpha;\n    }\n\n    setStencilFunc(func, ref, mask) {\n        this.stencilRef = ref;\n        this.stencilFunc.func = func;\n        this.stencilFunc.ref = ref;\n        this.stencilFunc.mask = mask;\n    }\n\n    setStencilOp(stencilFail, depthFail, depthPass) {\n        this.stencilOp.stencilFail = stencilFail;\n        this.stencilOp.depthFail = depthFail;\n        this.stencilOp.depthPass = depthPass;\n    }\n\n    applyState() {\n        if (this.depthTest) this.gl.renderer.enable(this.gl.DEPTH_TEST);\n        else this.gl.renderer.disable(this.gl.DEPTH_TEST);\n\n        if (this.cullFace) this.gl.renderer.enable(this.gl.CULL_FACE);\n        else this.gl.renderer.disable(this.gl.CULL_FACE);\n\n        if (this.blendFunc.src) this.gl.renderer.enable(this.gl.BLEND);\n        else this.gl.renderer.disable(this.gl.BLEND);\n\n        if (this.cullFace) this.gl.renderer.setCullFace(this.cullFace);\n        this.gl.renderer.setFrontFace(this.frontFace);\n        this.gl.renderer.setDepthMask(this.depthWrite);\n        this.gl.renderer.setDepthFunc(this.depthFunc);\n        if (this.blendFunc.src) this.gl.renderer.setBlendFunc(this.blendFunc.src, this.blendFunc.dst, this.blendFunc.srcAlpha, this.blendFunc.dstAlpha);\n        this.gl.renderer.setBlendEquation(this.blendEquation.modeRGB, this.blendEquation.modeAlpha);\n\n        if(this.stencilFunc.func || this.stencilOp.stencilFail) this.gl.renderer.enable(this.gl.STENCIL_TEST)\n            else this.gl.renderer.disable(this.gl.STENCIL_TEST)\n\n        this.gl.renderer.setStencilFunc(this.stencilFunc.func, this.stencilFunc.ref, this.stencilFunc.mask)\n        this.gl.renderer.setStencilOp(this.stencilOp.stencilFail, this.stencilOp.depthFail, this.stencilOp.depthPass)\n\n    }\n\n    use({ flipFaces = false } = {}) {\n        let textureUnit = -1;\n        const programActive = this.gl.renderer.state.currentProgram === this.id;\n\n        // Avoid gl call if program already in use\n        if (!programActive) {\n            this.gl.useProgram(this.program);\n            this.gl.renderer.state.currentProgram = this.id;\n        }\n\n        // Set only the active uniforms found in the shader\n        this.uniformLocations.forEach((location, activeUniform) =\u003e {\n            let uniform = this.uniforms[activeUniform.uniformName];\n\n            for (const component of activeUniform.nameComponents) {\n                if (!uniform) break;\n\n                if (component in uniform) {\n                    uniform = uniform[component];\n                } else if (Array.isArray(uniform.value)) {\n                    break;\n                } else {\n                    uniform = undefined;\n                    break;\n                }\n            }\n\n            if (!uniform) {\n                return warn(`Active uniform ${activeUniform.name} has not been supplied`);\n            }\n\n            if (uniform \u0026\u0026 uniform.value === undefined) {\n                return warn(`${activeUniform.name} uniform is missing a value parameter`);\n            }\n\n            if (uniform.value.texture) {\n                textureUnit = textureUnit + 1;\n\n                // Check if texture needs to be updated\n                uniform.value.update(textureUnit);\n                return setUniform(this.gl, activeUniform.type, location, textureUnit);\n            }\n\n            // For texture arrays, set uniform as an array of texture units instead of just one\n            if (uniform.value.length \u0026\u0026 uniform.value[0].texture) {\n                const textureUnits = [];\n                uniform.value.forEach((value) =\u003e {\n                    textureUnit = textureUnit + 1;\n                    value.update(textureUnit);\n                    textureUnits.push(textureUnit);\n                });\n\n                return setUniform(this.gl, activeUniform.type, location, textureUnits);\n            }\n\n            setUniform(this.gl, activeUniform.type, location, uniform.value);\n        });\n\n        this.applyState();\n        if (flipFaces) this.gl.renderer.setFrontFace(this.frontFace === this.gl.CCW ? this.gl.CW : this.gl.CCW);\n    }\n\n    remove() {\n        this.gl.deleteProgram(this.program);\n    }\n}\n\nfunction setUniform(gl, type, location, value) {\n    value = value.length ? flatten(value) : value;\n    const setValue = gl.renderer.state.uniformLocations.get(location);\n\n    // Avoid redundant uniform commands\n    if (value.length) {\n        if (setValue === undefined || setValue.length !== value.length) {\n            // clone array to store as cache\n            gl.renderer.state.uniformLocations.set(location, value.slice(0));\n        } else {\n            if (arraysEqual(setValue, value)) return;\n\n            // Update cached array values\n            setValue.set ? setValue.set(value) : setArray(setValue, value);\n            gl.renderer.state.uniformLocations.set(location, setValue);\n        }\n    } else {\n        if (setValue === value) return;\n        gl.renderer.state.uniformLocations.set(location, value);\n    }\n\n    switch (type) {\n        case 5126:\n            return value.length ? gl.uniform1fv(location, value) : gl.uniform1f(location, value); // FLOAT\n        case 35664:\n            return gl.uniform2fv(location, value); // FLOAT_VEC2\n        case 35665:\n            return gl.uniform3fv(location, value); // FLOAT_VEC3\n        case 35666:\n            return gl.uniform4fv(location, value); // FLOAT_VEC4\n        case 35670: // BOOL\n        case 5124: // INT\n        case 35678: // SAMPLER_2D\n        case 36306: // U_SAMPLER_2D\n        case 35680: // SAMPLER_CUBE\n        case 36289: // SAMPLER_2D_ARRAY\n            return value.length ? gl.uniform1iv(location, value) : gl.uniform1i(location, value); // SAMPLER_CUBE\n        case 35671: // BOOL_VEC2\n        case 35667:\n            return gl.uniform2iv(location, value); // INT_VEC2\n        case 35672: // BOOL_VEC3\n        case 35668:\n            return gl.uniform3iv(location, value); // INT_VEC3\n        case 35673: // BOOL_VEC4\n        case 35669:\n            return gl.uniform4iv(location, value); // INT_VEC4\n        case 35674:\n            return gl.uniformMatrix2fv(location, false, value); // FLOAT_MAT2\n        case 35675:\n            return gl.uniformMatrix3fv(location, false, value); // FLOAT_MAT3\n        case 35676:\n            return gl.uniformMatrix4fv(location, false, value); // FLOAT_MAT4\n    }\n}\n\nfunction addLineNumbers(string) {\n    let lines = string.split('\\n');\n    for (let i = 0; i \u003c lines.length; i++) {\n        lines[i] = i + 1 + ': ' + lines[i];\n    }\n    return lines.join('\\n');\n}\n\nfunction flatten(a) {\n    const arrayLen = a.length;\n    const valueLen = a[0].length;\n    if (valueLen === undefined) return a;\n    const length = arrayLen * valueLen;\n    let value = arrayCacheF32[length];\n    if (!value) arrayCacheF32[length] = value = new Float32Array(length);\n    for (let i = 0; i \u003c arrayLen; i++) value.set(a[i], i * valueLen);\n    return value;\n}\n\nfunction arraysEqual(a, b) {\n    if (a.length !== b.length) return false;\n    for (let i = 0, l = a.length; i \u003c l; i++) {\n        if (a[i] !== b[i]) return false;\n    }\n    return true;\n}\n\nfunction setArray(a, b) {\n    for (let i = 0, l = a.length; i \u003c l; i++) {\n        a[i] = b[i];\n    }\n}\n\nlet warnCount = 0;\nfunction warn(message) {\n    if (warnCount \u003e 100) return;\n    console.warn(message);\n    warnCount++;\n    if (warnCount \u003e 100) console.warn('More than 100 program warnings - stopping logs.');\n}\n","import { Vec3 } from '../math/Vec3.js';\n\n// TODO: Handle context loss https://www.khronos.org/webgl/wiki/HandlingContextLost\n\n// Not automatic - devs to use these methods manually\n// gl.colorMask( colorMask, colorMask, colorMask, colorMask );\n// gl.clearColor( r, g, b, a );\n// gl.stencilMask( stencilMask );\n// gl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n// gl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n// gl.clearStencil( stencil );\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\nlet ID = 1;\n\nexport class Renderer {\n    constructor({\n        canvas = document.createElement('canvas'),\n        width = 300,\n        height = 150,\n        dpr = 1,\n        alpha = false,\n        depth = true,\n        stencil = false,\n        antialias = false,\n        premultipliedAlpha = false,\n        preserveDrawingBuffer = false,\n        powerPreference = 'default',\n        autoClear = true,\n        webgl = 2,\n    } = {}) {\n        const attributes = { alpha, depth, stencil, antialias, premultipliedAlpha, preserveDrawingBuffer, powerPreference };\n        this.dpr = dpr;\n        this.alpha = alpha;\n        this.color = true;\n        this.depth = depth;\n        this.stencil = stencil;\n        this.premultipliedAlpha = premultipliedAlpha;\n        this.autoClear = autoClear;\n        this.id = ID++;\n\n        // Attempt WebGL2 unless forced to 1, if not supported fallback to WebGL1\n        if (webgl === 2) this.gl = canvas.getContext('webgl2', attributes);\n        this.isWebgl2 = !!this.gl;\n        if (!this.gl) this.gl = canvas.getContext('webgl', attributes);\n        if (!this.gl) console.error('unable to create webgl context');\n\n        // Attach renderer to gl so that all classes have access to internal state functions\n        this.gl.renderer = this;\n\n        // initialise size values\n        this.setSize(width, height);\n\n        // gl state stores to avoid redundant calls on methods used internally\n        this.state = {};\n        this.state.blendFunc = { src: this.gl.ONE, dst: this.gl.ZERO };\n        this.state.blendEquation = { modeRGB: this.gl.FUNC_ADD };\n        this.state.cullFace = false;\n        this.state.frontFace = this.gl.CCW;\n        this.state.depthMask = true;\n        this.state.depthFunc = this.gl.LEQUAL;\n        this.state.premultiplyAlpha = false;\n        this.state.flipY = false;\n        this.state.unpackAlignment = 4;\n        this.state.framebuffer = null;\n        this.state.viewport = { x: 0, y: 0, width: null, height: null };\n        this.state.textureUnits = [];\n        this.state.activeTextureUnit = 0;\n        this.state.boundBuffer = null;\n        this.state.uniformLocations = new Map();\n        this.state.currentProgram = null;\n\n        // store requested extensions\n        this.extensions = {};\n\n        // Initialise extra format types\n        if (this.isWebgl2) {\n            this.getExtension('EXT_color_buffer_float');\n            this.getExtension('OES_texture_float_linear');\n        } else {\n            this.getExtension('OES_texture_float');\n            this.getExtension('OES_texture_float_linear');\n            this.getExtension('OES_texture_half_float');\n            this.getExtension('OES_texture_half_float_linear');\n            this.getExtension('OES_element_index_uint');\n            this.getExtension('OES_standard_derivatives');\n            this.getExtension('EXT_sRGB');\n            this.getExtension('WEBGL_depth_texture');\n            this.getExtension('WEBGL_draw_buffers');\n        }\n        this.getExtension('WEBGL_compressed_texture_astc');\n        this.getExtension('EXT_texture_compression_bptc');\n        this.getExtension('WEBGL_compressed_texture_s3tc');\n        this.getExtension('WEBGL_compressed_texture_etc1');\n        this.getExtension('WEBGL_compressed_texture_pvrtc');\n        this.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n        // Create method aliases using extension (WebGL1) or native if available (WebGL2)\n        this.vertexAttribDivisor = this.getExtension('ANGLE_instanced_arrays', 'vertexAttribDivisor', 'vertexAttribDivisorANGLE');\n        this.drawArraysInstanced = this.getExtension('ANGLE_instanced_arrays', 'drawArraysInstanced', 'drawArraysInstancedANGLE');\n        this.drawElementsInstanced = this.getExtension('ANGLE_instanced_arrays', 'drawElementsInstanced', 'drawElementsInstancedANGLE');\n        this.createVertexArray = this.getExtension('OES_vertex_array_object', 'createVertexArray', 'createVertexArrayOES');\n        this.bindVertexArray = this.getExtension('OES_vertex_array_object', 'bindVertexArray', 'bindVertexArrayOES');\n        this.deleteVertexArray = this.getExtension('OES_vertex_array_object', 'deleteVertexArray', 'deleteVertexArrayOES');\n        this.drawBuffers = this.getExtension('WEBGL_draw_buffers', 'drawBuffers', 'drawBuffersWEBGL');\n\n        // Store device parameters\n        this.parameters = {};\n        this.parameters.maxTextureUnits = this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n        this.parameters.maxAnisotropy = this.getExtension('EXT_texture_filter_anisotropic')\n            ? this.gl.getParameter(this.getExtension('EXT_texture_filter_anisotropic').MAX_TEXTURE_MAX_ANISOTROPY_EXT)\n            : 0;\n    }\n\n    setSize(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.gl.canvas.width = width * this.dpr;\n        this.gl.canvas.height = height * this.dpr;\n\n        if (!this.gl.canvas.style) return;\n        Object.assign(this.gl.canvas.style, {\n            width: width + 'px',\n            height: height + 'px',\n        });\n    }\n\n    setViewport(width, height, x = 0, y = 0) {\n        if (this.state.viewport.width === width \u0026\u0026 this.state.viewport.height === height) return;\n        this.state.viewport.width = width;\n        this.state.viewport.height = height;\n        this.state.viewport.x = x;\n        this.state.viewport.y = y;\n        this.gl.viewport(x, y, width, height);\n    }\n\n    setScissor(width, height, x = 0, y = 0) {\n        this.gl.scissor(x, y, width, height);\n    }\n\n    enable(id) {\n        if (this.state[id] === true) return;\n        this.gl.enable(id);\n        this.state[id] = true;\n    }\n\n    disable(id) {\n        if (this.state[id] === false) return;\n        this.gl.disable(id);\n        this.state[id] = false;\n    }\n\n    setBlendFunc(src, dst, srcAlpha, dstAlpha) {\n        if (\n            this.state.blendFunc.src === src \u0026\u0026\n            this.state.blendFunc.dst === dst \u0026\u0026\n            this.state.blendFunc.srcAlpha === srcAlpha \u0026\u0026\n            this.state.blendFunc.dstAlpha === dstAlpha\n        )\n            return;\n        this.state.blendFunc.src = src;\n        this.state.blendFunc.dst = dst;\n        this.state.blendFunc.srcAlpha = srcAlpha;\n        this.state.blendFunc.dstAlpha = dstAlpha;\n        if (srcAlpha !== undefined) this.gl.blendFuncSeparate(src, dst, srcAlpha, dstAlpha);\n        else this.gl.blendFunc(src, dst);\n    }\n\n    setBlendEquation(modeRGB, modeAlpha) {\n        modeRGB = modeRGB || this.gl.FUNC_ADD;\n        if (this.state.blendEquation.modeRGB === modeRGB \u0026\u0026 this.state.blendEquation.modeAlpha === modeAlpha) return;\n        this.state.blendEquation.modeRGB = modeRGB;\n        this.state.blendEquation.modeAlpha = modeAlpha;\n        if (modeAlpha !== undefined) this.gl.blendEquationSeparate(modeRGB, modeAlpha);\n        else this.gl.blendEquation(modeRGB);\n    }\n\n    setCullFace(value) {\n        if (this.state.cullFace === value) return;\n        this.state.cullFace = value;\n        this.gl.cullFace(value);\n    }\n\n    setFrontFace(value) {\n        if (this.state.frontFace === value) return;\n        this.state.frontFace = value;\n        this.gl.frontFace(value);\n    }\n\n    setDepthMask(value) {\n        if (this.state.depthMask === value) return;\n        this.state.depthMask = value;\n        this.gl.depthMask(value);\n    }\n\n    setDepthFunc(value) {\n        if (this.state.depthFunc === value) return;\n        this.state.depthFunc = value;\n        this.gl.depthFunc(value);\n    }\n\n    setStencilMask(value) {\n        if(this.state.stencilMask === value) return;\n        this.state.stencilMask = value;\n        this.gl.stencilMask(value)\n    }\n\n    setStencilFunc(func, ref, mask) {\n\n        if((this.state.stencilFunc === func) \u0026\u0026\n            (this.state.stencilRef === ref) \u0026\u0026\n            (this.state.stencilFuncMask === mask)\n        ) return;\n\n        this.state.stencilFunc = func || this.gl.ALWAYS;\n        this.state.stencilRef = ref || 0;\n        this.state.stencilFuncMask = mask || 0;\n\n        this.gl.stencilFunc(func || this.gl.ALWAYS, ref || 0, mask || 0);\n    }\n\n    setStencilOp(stencilFail, depthFail, depthPass) {\n\n        if(this.state.stencilFail === stencilFail \u0026\u0026\n            this.state.stencilDepthFail === depthFail \u0026\u0026\n            this.state.stencilDepthPass === depthPass\n        ) return;\n\n        this.state.stencilFail = stencilFail;\n        this.state.stencilDepthFail = depthFail;\n        this.state.stencilDepthPass = depthPass;\n        \n        this.gl.stencilOp(stencilFail, depthFail, depthPass);\n        \n    }\n\n    activeTexture(value) {\n        if (this.state.activeTextureUnit === value) return;\n        this.state.activeTextureUnit = value;\n        this.gl.activeTexture(this.gl.TEXTURE0 + value);\n    }\n\n    bindFramebuffer({ target = this.gl.FRAMEBUFFER, buffer = null } = {}) {\n        if (this.state.framebuffer === buffer) return;\n        this.state.framebuffer = buffer;\n        this.gl.bindFramebuffer(target, buffer);\n    }\n\n    getExtension(extension, webgl2Func, extFunc) {\n        // if webgl2 function supported, return func bound to gl context\n        if (webgl2Func \u0026\u0026 this.gl[webgl2Func]) return this.gl[webgl2Func].bind(this.gl);\n\n        // fetch extension once only\n        if (!this.extensions[extension]) {\n            this.extensions[extension] = this.gl.getExtension(extension);\n        }\n\n        // return extension if no function requested\n        if (!webgl2Func) return this.extensions[extension];\n\n        // Return null if extension not supported\n        if (!this.extensions[extension]) return null;\n\n        // return extension function, bound to extension\n        return this.extensions[extension][extFunc].bind(this.extensions[extension]);\n    }\n\n    sortOpaque(a, b) {\n        if (a.renderOrder !== b.renderOrder) {\n            return a.renderOrder - b.renderOrder;\n        } else if (a.program.id !== b.program.id) {\n            return a.program.id - b.program.id;\n        } else if (a.zDepth !== b.zDepth) {\n            return a.zDepth - b.zDepth;\n        } else {\n            return b.id - a.id;\n        }\n    }\n\n    sortTransparent(a, b) {\n        if (a.renderOrder !== b.renderOrder) {\n            return a.renderOrder - b.renderOrder;\n        }\n        if (a.zDepth !== b.zDepth) {\n            return b.zDepth - a.zDepth;\n        } else {\n            return b.id - a.id;\n        }\n    }\n\n    sortUI(a, b) {\n        if (a.renderOrder !== b.renderOrder) {\n            return a.renderOrder - b.renderOrder;\n        } else if (a.program.id !== b.program.id) {\n            return a.program.id - b.program.id;\n        } else {\n            return b.id - a.id;\n        }\n    }\n\n    getRenderList({ scene, camera, frustumCull, sort }) {\n        let renderList = [];\n\n        if (camera \u0026\u0026 frustumCull) camera.updateFrustum();\n\n        // Get visible\n        scene.traverse((node) =\u003e {\n            if (!node.visible) return true;\n            if (!node.draw) return;\n\n            if (frustumCull \u0026\u0026 node.frustumCulled \u0026\u0026 camera) {\n                if (!camera.frustumIntersectsMesh(node)) return;\n            }\n\n            renderList.push(node);\n        });\n\n        if (sort) {\n            const opaque = [];\n            const transparent = []; // depthTest true\n            const ui = []; // depthTest false\n\n            renderList.forEach((node) =\u003e {\n                // Split into the 3 render groups\n                if (!node.program.transparent) {\n                    opaque.push(node);\n                } else if (node.program.depthTest) {\n                    transparent.push(node);\n                } else {\n                    ui.push(node);\n                }\n\n                node.zDepth = 0;\n\n                // Only calculate z-depth if renderOrder unset and depthTest is true\n                if (node.renderOrder !== 0 || !node.program.depthTest || !camera) return;\n\n                // update z-depth\n                node.worldMatrix.getTranslation(tempVec3);\n                tempVec3.applyMatrix4(camera.projectionViewMatrix);\n                node.zDepth = tempVec3.z;\n            });\n\n            opaque.sort(this.sortOpaque);\n            transparent.sort(this.sortTransparent);\n            ui.sort(this.sortUI);\n\n            renderList = opaque.concat(transparent, ui);\n        }\n\n        return renderList;\n    }\n\n    render({ scene, camera, target = null, update = true, sort = true, frustumCull = true, clear }) {\n        if (target === null) {\n            // make sure no render target bound so draws to canvas\n            this.bindFramebuffer();\n            this.setViewport(this.width * this.dpr, this.height * this.dpr);\n        } else {\n            // bind supplied render target and update viewport\n            this.bindFramebuffer(target);\n            this.setViewport(target.width, target.height);\n        }\n\n        if (clear || (this.autoClear \u0026\u0026 clear !== false)) {\n            // Ensure depth buffer writing is enabled so it can be cleared\n            if (this.depth \u0026\u0026 (!target || target.depth)) {\n                this.enable(this.gl.DEPTH_TEST);\n                this.setDepthMask(true);\n            }\n\n            // Same for stencil\n            if(this.stencil || (!target || target.stencil)) {\n                this.enable(this.gl.STENCIL_TEST);\n                this.setStencilMask(0xff)\n            }\n\n            this.gl.clear(\n                (this.color ? this.gl.COLOR_BUFFER_BIT : 0) |\n                    (this.depth ? this.gl.DEPTH_BUFFER_BIT : 0) |\n                    (this.stencil ? this.gl.STENCIL_BUFFER_BIT : 0)\n            );\n        }\n\n        // updates all scene graph matrices\n        if (update) scene.updateMatrixWorld();\n\n        // Update camera separately, in case not in scene graph\n        if (camera) camera.updateMatrixWorld();\n\n        // Get render list - entails culling and sorting\n        const renderList = this.getRenderList({ scene, camera, frustumCull, sort });\n\n        renderList.forEach((node) =\u003e {\n            node.draw({ camera });\n        });\n    }\n}\n","const EPSILON = 0.000001;\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n}\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nexport function set(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n}\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n}\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nexport function scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n}\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n    let x = a[0];\n    let y = a[1];\n    let z = a[2];\n    let w = a[3];\n    return Math.sqrt(x * x + y * y + z * z + w * w);\n}\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nexport function normalize(out, a) {\n    let x = a[0];\n    let y = a[1];\n    let z = a[2];\n    let w = a[3];\n    let len = x * x + y * y + z * z + w * w;\n    if (len \u003e 0) {\n        len = 1 / Math.sqrt(len);\n    }\n    out[0] = x * len;\n    out[1] = y * len;\n    out[2] = z * len;\n    out[3] = w * len;\n    return out;\n}\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n}\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nexport function lerp(out, a, b, t) {\n    let ax = a[0];\n    let ay = a[1];\n    let az = a[2];\n    let aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n}\n","import * as vec4 from './Vec4Func.js';\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nexport function identity(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n}\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nexport function setAxisAngle(out, axis, rad) {\n    rad = rad * 0.5;\n    let s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n}\n\n/**\n * Multiplies two quats\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nexport function multiply(out, a, b) {\n    let ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    let bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateX(out, a, rad) {\n    rad *= 0.5;\n\n    let ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    let bx = Math.sin(rad),\n        bw = Math.cos(rad);\n\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateY(out, a, rad) {\n    rad *= 0.5;\n\n    let ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    let by = Math.sin(rad),\n        bw = Math.cos(rad);\n\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n}\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nexport function rotateZ(out, a, rad) {\n    rad *= 0.5;\n\n    let ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    let bz = Math.sin(rad),\n        bw = Math.cos(rad);\n\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nexport function slerp(out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n    let ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    let bx = b[0],\n        by = b[1],\n        bz = b[2],\n        bw = b[3];\n\n    let omega, cosom, sinom, scale0, scale1;\n\n    // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    // adjust signs (if necessary)\n    if (cosom \u003c 0.0) {\n        cosom = -cosom;\n        bx = -bx;\n        by = -by;\n        bz = -bz;\n        bw = -bw;\n    }\n    // calculate coefficients\n    if (1.0 - cosom \u003e 0.000001) {\n        // standard case (slerp)\n        omega = Math.acos(cosom);\n        sinom = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {\n        // \"from\" and \"to\" quaternions are very close\n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n\n    return out;\n}\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nexport function invert(out, a) {\n    let a0 = a[0],\n        a1 = a[1],\n        a2 = a[2],\n        a3 = a[3];\n    let dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n    let invDot = dot ? 1.0 / dot : 0;\n\n    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n    out[0] = -a0 * invDot;\n    out[1] = -a1 * invDot;\n    out[2] = -a2 * invDot;\n    out[3] = a3 * invDot;\n    return out;\n}\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nexport function conjugate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n}\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nexport function fromMat3(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    let fTrace = m[0] + m[4] + m[8];\n    let fRoot;\n\n    if (fTrace \u003e 0.0) {\n        // |w| \u003e 1/2, may as well choose w \u003e 1/2\n        fRoot = Math.sqrt(fTrace + 1.0); // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot; // 1/(4w)\n        out[0] = (m[5] - m[7]) * fRoot;\n        out[1] = (m[6] - m[2]) * fRoot;\n        out[2] = (m[1] - m[3]) * fRoot;\n    } else {\n        // |w| \u003c= 1/2\n        let i = 0;\n        if (m[4] \u003e m[0]) i = 1;\n        if (m[8] \u003e m[i * 3 + i]) i = 2;\n        let j = (i + 1) % 3;\n        let k = (i + 2) % 3;\n\n        fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j * 3 + k] - m[k * 3 + j]) * fRoot;\n        out[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;\n        out[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;\n    }\n\n    return out;\n}\n\n/**\n * Creates a quaternion from the given euler angle x, y, z.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} euler Angles to rotate around each axis in degrees.\n * @param {String} order detailing order of operations. Default 'XYZ'.\n * @returns {quat} out\n * @function\n */\nexport function fromEuler(out, euler, order = 'YXZ') {\n    let sx = Math.sin(euler[0] * 0.5);\n    let cx = Math.cos(euler[0] * 0.5);\n    let sy = Math.sin(euler[1] * 0.5);\n    let cy = Math.cos(euler[1] * 0.5);\n    let sz = Math.sin(euler[2] * 0.5);\n    let cz = Math.cos(euler[2] * 0.5);\n\n    if (order === 'XYZ') {\n        out[0] = sx * cy * cz + cx * sy * sz;\n        out[1] = cx * sy * cz - sx * cy * sz;\n        out[2] = cx * cy * sz + sx * sy * cz;\n        out[3] = cx * cy * cz - sx * sy * sz;\n    } else if (order === 'YXZ') {\n        out[0] = sx * cy * cz + cx * sy * sz;\n        out[1] = cx * sy * cz - sx * cy * sz;\n        out[2] = cx * cy * sz - sx * sy * cz;\n        out[3] = cx * cy * cz + sx * sy * sz;\n    } else if (order === 'ZXY') {\n        out[0] = sx * cy * cz - cx * sy * sz;\n        out[1] = cx * sy * cz + sx * cy * sz;\n        out[2] = cx * cy * sz + sx * sy * cz;\n        out[3] = cx * cy * cz - sx * sy * sz;\n    } else if (order === 'ZYX') {\n        out[0] = sx * cy * cz - cx * sy * sz;\n        out[1] = cx * sy * cz + sx * cy * sz;\n        out[2] = cx * cy * sz - sx * sy * cz;\n        out[3] = cx * cy * cz + sx * sy * sz;\n    } else if (order === 'YZX') {\n        out[0] = sx * cy * cz + cx * sy * sz;\n        out[1] = cx * sy * cz + sx * cy * sz;\n        out[2] = cx * cy * sz - sx * sy * cz;\n        out[3] = cx * cy * cz - sx * sy * sz;\n    } else if (order === 'XZY') {\n        out[0] = sx * cy * cz - cx * sy * sz;\n        out[1] = cx * sy * cz - sx * cy * sz;\n        out[2] = cx * cy * sz + sx * sy * cz;\n        out[3] = cx * cy * cz + sx * sy * sz;\n    }\n\n    return out;\n}\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nexport const copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nexport const set = vec4.set;\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nexport const add = vec4.add;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nexport const scale = vec4.scale;\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nexport const dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nexport const lerp = vec4.lerp;\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport const length = vec4.length;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nexport const normalize = vec4.normalize;\n","import * as QuatFunc from './functions/QuatFunc.js';\n\nexport class Quat extends Array {\n    constructor(x = 0, y = 0, z = 0, w = 1) {\n        super(x, y, z, w);\n        this.onChange = () =\u003e {};\n\n        // Keep reference to proxy target to avoid triggering onChange internally\n        this._target = this;\n\n        // Return a proxy to trigger onChange when array elements are edited directly\n        const triggerProps = ['0', '1', '2', '3'];\n        return new Proxy(this, {\n            set(target, property) {\n                const success = Reflect.set(...arguments);\n                if (success \u0026\u0026 triggerProps.includes(property)) target.onChange();\n                return success;\n            },\n        });\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    get w() {\n        return this[3];\n    }\n\n    set x(v) {\n        this._target[0] = v;\n        this.onChange();\n    }\n\n    set y(v) {\n        this._target[1] = v;\n        this.onChange();\n    }\n\n    set z(v) {\n        this._target[2] = v;\n        this.onChange();\n    }\n\n    set w(v) {\n        this._target[3] = v;\n        this.onChange();\n    }\n\n    identity() {\n        QuatFunc.identity(this._target);\n        this.onChange();\n        return this;\n    }\n\n    set(x, y, z, w) {\n        if (x.length) return this.copy(x);\n        QuatFunc.set(this._target, x, y, z, w);\n        this.onChange();\n        return this;\n    }\n\n    rotateX(a) {\n        QuatFunc.rotateX(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    rotateY(a) {\n        QuatFunc.rotateY(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    rotateZ(a) {\n        QuatFunc.rotateZ(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    inverse(q = this._target) {\n        QuatFunc.invert(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    conjugate(q = this._target) {\n        QuatFunc.conjugate(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    copy(q) {\n        QuatFunc.copy(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    normalize(q = this._target) {\n        QuatFunc.normalize(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    multiply(qA, qB) {\n        if (qB) {\n            QuatFunc.multiply(this._target, qA, qB);\n        } else {\n            QuatFunc.multiply(this._target, this._target, qA);\n        }\n        this.onChange();\n        return this;\n    }\n\n    dot(v) {\n        return QuatFunc.dot(this._target, v);\n    }\n\n    fromMatrix3(matrix3) {\n        QuatFunc.fromMat3(this._target, matrix3);\n        this.onChange();\n        return this;\n    }\n\n    fromEuler(euler, isInternal) {\n        QuatFunc.fromEuler(this._target, euler, euler.order);\n        // Avoid infinite recursion\n        if (!isInternal) this.onChange();\n        return this;\n    }\n\n    fromAxisAngle(axis, a) {\n        QuatFunc.setAxisAngle(this._target, axis, a);\n        this.onChange();\n        return this;\n    }\n\n    slerp(q, t) {\n        QuatFunc.slerp(this._target, this._target, q, t);\n        this.onChange();\n        return this;\n    }\n\n    fromArray(a, o = 0) {\n        this._target[0] = a[o];\n        this._target[1] = a[o + 1];\n        this._target[2] = a[o + 2];\n        this._target[3] = a[o + 3];\n        this.onChange();\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        a[o + 3] = this[3];\n        return a;\n    }\n}\n","import * as vec3 from './Vec3Func.js';\n\nconst EPSILON = 0.000001;\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        let a01 = a[1],\n            a02 = a[2],\n            a03 = a[3];\n        let a12 = a[6],\n            a13 = a[7];\n        let a23 = a[11];\n\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n\n    return out;\n}\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function invert(out, a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    let b00 = a00 * a11 - a01 * a10;\n    let b01 = a00 * a12 - a02 * a10;\n    let b02 = a00 * a13 - a03 * a10;\n    let b03 = a01 * a12 - a02 * a11;\n    let b04 = a01 * a13 - a03 * a11;\n    let b05 = a02 * a13 - a03 * a12;\n    let b06 = a20 * a31 - a21 * a30;\n    let b07 = a20 * a32 - a22 * a30;\n    let b08 = a20 * a33 - a23 * a30;\n    let b09 = a21 * a32 - a22 * a31;\n    let b10 = a21 * a33 - a23 * a31;\n    let b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n}\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    let b00 = a00 * a11 - a01 * a10;\n    let b01 = a00 * a12 - a02 * a10;\n    let b02 = a00 * a13 - a03 * a10;\n    let b03 = a01 * a12 - a02 * a11;\n    let b04 = a01 * a13 - a03 * a11;\n    let b05 = a02 * a13 - a03 * a12;\n    let b06 = a20 * a31 - a21 * a30;\n    let b07 = a20 * a32 - a22 * a30;\n    let b08 = a20 * a33 - a23 * a30;\n    let b09 = a21 * a32 - a22 * a31;\n    let b10 = a21 * a33 - a23 * a31;\n    let b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function multiply(out, a, b) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    // Cache only the current line of the second matrix\n    let b0 = b[0],\n        b1 = b[1],\n        b2 = b[2],\n        b3 = b[3];\n    out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[4];\n    b1 = b[5];\n    b2 = b[6];\n    b3 = b[7];\n    out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[8];\n    b1 = b[9];\n    b2 = b[10];\n    b3 = b[11];\n    out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[12];\n    b1 = b[13];\n    b2 = b[14];\n    b3 = b[15];\n    out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    return out;\n}\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nexport function translate(out, a, v) {\n    let x = v[0],\n        y = v[1],\n        z = v[2];\n    let a00, a01, a02, a03;\n    let a10, a11, a12, a13;\n    let a20, a21, a22, a23;\n\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n}\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nexport function scale(out, a, v) {\n    let x = v[0],\n        y = v[1],\n        z = v[2];\n\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function rotate(out, a, rad, axis) {\n    let x = axis[0],\n        y = axis[1],\n        z = axis[2];\n    let len = Math.hypot(x, y, z);\n    let s, c, t;\n    let a00, a01, a02, a03;\n    let a10, a11, a12, a13;\n    let a20, a21, a22, a23;\n    let b00, b01, b02;\n    let b10, b11, b12;\n    let b20, b21, b22;\n\n    if (Math.abs(len) \u003c EPSILON) {\n        return null;\n    }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c;\n    b01 = y * x * t + z * s;\n    b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s;\n    b11 = y * y * t + c;\n    b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s;\n    b21 = y * z * t - x * s;\n    b22 = z * z * t + c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n}\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getTranslation(out, mat) {\n    out[0] = mat[12];\n    out[1] = mat[13];\n    out[2] = mat[14];\n\n    return out;\n}\n\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getScaling(out, mat) {\n    let m11 = mat[0];\n    let m12 = mat[1];\n    let m13 = mat[2];\n    let m21 = mat[4];\n    let m22 = mat[5];\n    let m23 = mat[6];\n    let m31 = mat[8];\n    let m32 = mat[9];\n    let m33 = mat[10];\n\n    out[0] = Math.hypot(m11, m12, m13);\n    out[1] = Math.hypot(m21, m22, m23);\n    out[2] = Math.hypot(m31, m32, m33);\n\n    return out;\n}\n\nexport function getMaxScaleOnAxis(mat) {\n    let m11 = mat[0];\n    let m12 = mat[1];\n    let m13 = mat[2];\n    let m21 = mat[4];\n    let m22 = mat[5];\n    let m23 = mat[6];\n    let m31 = mat[8];\n    let m32 = mat[9];\n    let m33 = mat[10];\n\n    const x = m11 * m11 + m12 * m12 + m13 * m13;\n    const y = m21 * m21 + m22 * m22 + m23 * m23;\n    const z = m31 * m31 + m32 * m32 + m33 * m33;\n\n    return Math.sqrt(Math.max(x, y, z));\n}\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nexport const getRotation = (function () {\n    const temp = [1, 1, 1];\n\n    return function (out, mat) {\n        let scaling = temp;\n        getScaling(scaling, mat);\n\n        let is1 = 1 / scaling[0];\n        let is2 = 1 / scaling[1];\n        let is3 = 1 / scaling[2];\n\n        let sm11 = mat[0] * is1;\n        let sm12 = mat[1] * is2;\n        let sm13 = mat[2] * is3;\n        let sm21 = mat[4] * is1;\n        let sm22 = mat[5] * is2;\n        let sm23 = mat[6] * is3;\n        let sm31 = mat[8] * is1;\n        let sm32 = mat[9] * is2;\n        let sm33 = mat[10] * is3;\n\n        let trace = sm11 + sm22 + sm33;\n        let S = 0;\n\n        if (trace \u003e 0) {\n            S = Math.sqrt(trace + 1.0) * 2;\n            out[3] = 0.25 * S;\n            out[0] = (sm23 - sm32) / S;\n            out[1] = (sm31 - sm13) / S;\n            out[2] = (sm12 - sm21) / S;\n        } else if (sm11 \u003e sm22 \u0026\u0026 sm11 \u003e sm33) {\n            S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n            out[3] = (sm23 - sm32) / S;\n            out[0] = 0.25 * S;\n            out[1] = (sm12 + sm21) / S;\n            out[2] = (sm31 + sm13) / S;\n        } else if (sm22 \u003e sm33) {\n            S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n            out[3] = (sm31 - sm13) / S;\n            out[0] = (sm12 + sm21) / S;\n            out[1] = 0.25 * S;\n            out[2] = (sm23 + sm32) / S;\n        } else {\n            S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n            out[3] = (sm12 - sm21) / S;\n            out[0] = (sm31 + sm13) / S;\n            out[1] = (sm23 + sm32) / S;\n            out[2] = 0.25 * S;\n        }\n\n        return out;\n    };\n})();\n\n/**\n * From glTF-Transform\n * https://github.com/donmccurdy/glTF-Transform/blob/main/packages/core/src/utils/math-utils.ts\n *\n * Decompose a mat4 to TRS properties.\n *\n * Equivalent to the Matrix4 decompose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param {mat4} srcMat Matrix element, to be decomposed to TRS properties.\n * @param {quat4} dstRotation Rotation element, to be overwritten.\n * @param {vec3} dstTranslation Translation element, to be overwritten.\n * @param {vec3} dstScale Scale element, to be overwritten\n */\nexport function decompose(srcMat, dstRotation, dstTranslation, dstScale) {\n    let sx = vec3.length([srcMat[0], srcMat[1], srcMat[2]]);\n    const sy = vec3.length([srcMat[4], srcMat[5], srcMat[6]]);\n    const sz = vec3.length([srcMat[8], srcMat[9], srcMat[10]]);\n\n    // if determine is negative, we need to invert one scale\n    const det = determinant(srcMat);\n    if (det \u003c 0) sx = -sx;\n\n    dstTranslation[0] = srcMat[12];\n    dstTranslation[1] = srcMat[13];\n    dstTranslation[2] = srcMat[14];\n\n    // scale the rotation part\n    const _m1 = srcMat.slice();\n\n    const invSX = 1 / sx;\n    const invSY = 1 / sy;\n    const invSZ = 1 / sz;\n\n    _m1[0] *= invSX;\n    _m1[1] *= invSX;\n    _m1[2] *= invSX;\n\n    _m1[4] *= invSY;\n    _m1[5] *= invSY;\n    _m1[6] *= invSY;\n\n    _m1[8] *= invSZ;\n    _m1[9] *= invSZ;\n    _m1[10] *= invSZ;\n\n    getRotation(dstRotation, _m1);\n\n    dstScale[0] = sx;\n    dstScale[1] = sy;\n    dstScale[2] = sz;\n}\n\n/**\n * From glTF-Transform\n * https://github.com/donmccurdy/glTF-Transform/blob/main/packages/core/src/utils/math-utils.ts\n *\n * Compose TRS properties to a mat4.\n *\n * Equivalent to the Matrix4 compose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param {mat4} dstMat Matrix element, to be modified and returned.\n * @param {quat4} srcRotation Rotation element of matrix.\n * @param {vec3} srcTranslation Translation element of matrix.\n * @param {vec3} srcScale Scale element of matrix.\n * @returns {mat4} dstMat, overwritten to mat4 equivalent of given TRS properties.\n */\nexport function compose(dstMat, srcRotation, srcTranslation, srcScale) {\n    const te = dstMat;\n\n    const x = srcRotation[0],\n        y = srcRotation[1],\n        z = srcRotation[2],\n        w = srcRotation[3];\n    const x2 = x + x,\n        y2 = y + y,\n        z2 = z + z;\n    const xx = x * x2,\n        xy = x * y2,\n        xz = x * z2;\n    const yy = y * y2,\n        yz = y * z2,\n        zz = z * z2;\n    const wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    const sx = srcScale[0],\n        sy = srcScale[1],\n        sz = srcScale[2];\n\n    te[0] = (1 - (yy + zz)) * sx;\n    te[1] = (xy + wz) * sx;\n    te[2] = (xz - wy) * sx;\n    te[3] = 0;\n\n    te[4] = (xy - wz) * sy;\n    te[5] = (1 - (xx + zz)) * sy;\n    te[6] = (yz + wx) * sy;\n    te[7] = 0;\n\n    te[8] = (xz + wy) * sz;\n    te[9] = (yz - wx) * sz;\n    te[10] = (1 - (xx + yy)) * sz;\n    te[11] = 0;\n\n    te[12] = srcTranslation[0];\n    te[13] = srcTranslation[1];\n    te[14] = srcTranslation[2];\n    te[15] = 1;\n\n    return te;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScale(out, q, v, s) {\n    // Quaternion math\n    let x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n    let x2 = x + x;\n    let y2 = y + y;\n    let z2 = z + z;\n\n    let xx = x * x2;\n    let xy = x * y2;\n    let xz = x * z2;\n    let yy = y * y2;\n    let yz = y * z2;\n    let zz = z * z2;\n    let wx = w * x2;\n    let wy = w * y2;\n    let wz = w * z2;\n    let sx = s[0];\n    let sy = s[1];\n    let sz = s[2];\n\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n}\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nexport function fromQuat(out, q) {\n    let x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n    let x2 = x + x;\n    let y2 = y + y;\n    let z2 = z + z;\n\n    let xx = x * x2;\n    let yx = y * x2;\n    let yy = y * y2;\n    let zx = z * x2;\n    let zy = z * y2;\n    let zz = z * z2;\n    let wx = w * x2;\n    let wy = w * y2;\n    let wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n\n    return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function perspective(out, fovy, aspect, near, far) {\n    let f = 1.0 / Math.tan(fovy / 2);\n    let nf = 1 / (near - far);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 2 * far * near * nf;\n    out[15] = 0;\n    return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function ortho(out, left, right, bottom, top, near, far) {\n    let lr = 1 / (left - right);\n    let bt = 1 / (bottom - top);\n    let nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} target Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function targetTo(out, eye, target, up) {\n    let eyex = eye[0],\n        eyey = eye[1],\n        eyez = eye[2],\n        upx = up[0],\n        upy = up[1],\n        upz = up[2];\n\n    let z0 = eyex - target[0],\n        z1 = eyey - target[1],\n        z2 = eyez - target[2];\n\n    let len = z0 * z0 + z1 * z1 + z2 * z2;\n    if (len === 0) {\n        // eye and target are in the same position\n        z2 = 1;\n    } else {\n        len = 1 / Math.sqrt(len);\n        z0 *= len;\n        z1 *= len;\n        z2 *= len;\n    }\n\n    let x0 = upy * z2 - upz * z1,\n        x1 = upz * z0 - upx * z2,\n        x2 = upx * z1 - upy * z0;\n\n    len = x0 * x0 + x1 * x1 + x2 * x2;\n    if (len === 0) {\n        // up and z are parallel\n        if (upz) {\n            upx += 1e-6;\n        } else if (upy) {\n            upz += 1e-6;\n        } else {\n            upy += 1e-6;\n        }\n        (x0 = upy * z2 - upz * z1), (x1 = upz * z0 - upx * z2), (x2 = upx * z1 - upy * z0);\n\n        len = x0 * x0 + x1 * x1 + x2 * x2;\n    }\n\n    len = 1 / Math.sqrt(len);\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n\n    out[0] = x0;\n    out[1] = x1;\n    out[2] = x2;\n    out[3] = 0;\n    out[4] = z1 * x2 - z2 * x1;\n    out[5] = z2 * x0 - z0 * x2;\n    out[6] = z0 * x1 - z1 * x0;\n    out[7] = 0;\n    out[8] = z0;\n    out[9] = z1;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = eyex;\n    out[13] = eyey;\n    out[14] = eyez;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nexport function multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n}\n","import * as Mat4Func from './functions/Mat4Func.js';\n\nexport class Mat4 extends Array {\n    constructor(\n        m00 = 1,\n        m01 = 0,\n        m02 = 0,\n        m03 = 0,\n        m10 = 0,\n        m11 = 1,\n        m12 = 0,\n        m13 = 0,\n        m20 = 0,\n        m21 = 0,\n        m22 = 1,\n        m23 = 0,\n        m30 = 0,\n        m31 = 0,\n        m32 = 0,\n        m33 = 1\n    ) {\n        super(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33);\n        return this;\n    }\n\n    get x() {\n        return this[12];\n    }\n\n    get y() {\n        return this[13];\n    }\n\n    get z() {\n        return this[14];\n    }\n\n    get w() {\n        return this[15];\n    }\n\n    set x(v) {\n        this[12] = v;\n    }\n\n    set y(v) {\n        this[13] = v;\n    }\n\n    set z(v) {\n        this[14] = v;\n    }\n\n    set w(v) {\n        this[15] = v;\n    }\n\n    set(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n        if (m00.length) return this.copy(m00);\n        Mat4Func.set(this, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33);\n        return this;\n    }\n\n    translate(v, m = this) {\n        Mat4Func.translate(this, m, v);\n        return this;\n    }\n\n    rotate(v, axis, m = this) {\n        Mat4Func.rotate(this, m, v, axis);\n        return this;\n    }\n\n    scale(v, m = this) {\n        Mat4Func.scale(this, m, typeof v === 'number' ? [v, v, v] : v);\n        return this;\n    }\n\n    add(ma, mb) {\n        if (mb) Mat4Func.add(this, ma, mb);\n        else Mat4Func.add(this, this, ma);\n        return this;\n    }\n\n    sub(ma, mb) {\n        if (mb) Mat4Func.subtract(this, ma, mb);\n        else Mat4Func.subtract(this, this, ma);\n        return this;\n    }\n\n    multiply(ma, mb) {\n        if (!ma.length) {\n            Mat4Func.multiplyScalar(this, this, ma);\n        } else if (mb) {\n            Mat4Func.multiply(this, ma, mb);\n        } else {\n            Mat4Func.multiply(this, this, ma);\n        }\n        return this;\n    }\n\n    identity() {\n        Mat4Func.identity(this);\n        return this;\n    }\n\n    copy(m) {\n        Mat4Func.copy(this, m);\n        return this;\n    }\n\n    fromPerspective({ fov, aspect, near, far } = {}) {\n        Mat4Func.perspective(this, fov, aspect, near, far);\n        return this;\n    }\n\n    fromOrthogonal({ left, right, bottom, top, near, far }) {\n        Mat4Func.ortho(this, left, right, bottom, top, near, far);\n        return this;\n    }\n\n    fromQuaternion(q) {\n        Mat4Func.fromQuat(this, q);\n        return this;\n    }\n\n    setPosition(v) {\n        this.x = v[0];\n        this.y = v[1];\n        this.z = v[2];\n        return this;\n    }\n\n    inverse(m = this) {\n        Mat4Func.invert(this, m);\n        return this;\n    }\n\n    compose(q, pos, scale) {\n        Mat4Func.compose(this, q, pos, scale);\n        return this;\n    }\n\n    decompose(q, pos, scale) {\n        Mat4Func.decompose(this, q, pos, scale);\n        return this;\n    }\n\n    getRotation(q) {\n        Mat4Func.getRotation(q, this);\n        return this;\n    }\n\n    getTranslation(pos) {\n        Mat4Func.getTranslation(pos, this);\n        return this;\n    }\n\n    getScaling(scale) {\n        Mat4Func.getScaling(scale, this);\n        return this;\n    }\n\n    getMaxScaleOnAxis() {\n        return Mat4Func.getMaxScaleOnAxis(this);\n    }\n\n    lookAt(eye, target, up) {\n        Mat4Func.targetTo(this, eye, target, up);\n        return this;\n    }\n\n    determinant() {\n        return Mat4Func.determinant(this);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        this[2] = a[o + 2];\n        this[3] = a[o + 3];\n        this[4] = a[o + 4];\n        this[5] = a[o + 5];\n        this[6] = a[o + 6];\n        this[7] = a[o + 7];\n        this[8] = a[o + 8];\n        this[9] = a[o + 9];\n        this[10] = a[o + 10];\n        this[11] = a[o + 11];\n        this[12] = a[o + 12];\n        this[13] = a[o + 13];\n        this[14] = a[o + 14];\n        this[15] = a[o + 15];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        a[o + 3] = this[3];\n        a[o + 4] = this[4];\n        a[o + 5] = this[5];\n        a[o + 6] = this[6];\n        a[o + 7] = this[7];\n        a[o + 8] = this[8];\n        a[o + 9] = this[9];\n        a[o + 10] = this[10];\n        a[o + 11] = this[11];\n        a[o + 12] = this[12];\n        a[o + 13] = this[13];\n        a[o + 14] = this[14];\n        a[o + 15] = this[15];\n        return a;\n    }\n}\n","// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\nexport function fromRotationMatrix(out, m, order = 'YXZ') {\n    if (order === 'XYZ') {\n        out[1] = Math.asin(Math.min(Math.max(m[8], -1), 1));\n        if (Math.abs(m[8]) \u003c 0.99999) {\n            out[0] = Math.atan2(-m[9], m[10]);\n            out[2] = Math.atan2(-m[4], m[0]);\n        } else {\n            out[0] = Math.atan2(m[6], m[5]);\n            out[2] = 0;\n        }\n    } else if (order === 'YXZ') {\n        out[0] = Math.asin(-Math.min(Math.max(m[9], -1), 1));\n        if (Math.abs(m[9]) \u003c 0.99999) {\n            out[1] = Math.atan2(m[8], m[10]);\n            out[2] = Math.atan2(m[1], m[5]);\n        } else {\n            out[1] = Math.atan2(-m[2], m[0]);\n            out[2] = 0;\n        }\n    } else if (order === 'ZXY') {\n        out[0] = Math.asin(Math.min(Math.max(m[6], -1), 1));\n        if (Math.abs(m[6]) \u003c 0.99999) {\n            out[1] = Math.atan2(-m[2], m[10]);\n            out[2] = Math.atan2(-m[4], m[5]);\n        } else {\n            out[1] = 0;\n            out[2] = Math.atan2(m[1], m[0]);\n        }\n    } else if (order === 'ZYX') {\n        out[1] = Math.asin(-Math.min(Math.max(m[2], -1), 1));\n        if (Math.abs(m[2]) \u003c 0.99999) {\n            out[0] = Math.atan2(m[6], m[10]);\n            out[2] = Math.atan2(m[1], m[0]);\n        } else {\n            out[0] = 0;\n            out[2] = Math.atan2(-m[4], m[5]);\n        }\n    } else if (order === 'YZX') {\n        out[2] = Math.asin(Math.min(Math.max(m[1], -1), 1));\n        if (Math.abs(m[1]) \u003c 0.99999) {\n            out[0] = Math.atan2(-m[9], m[5]);\n            out[1] = Math.atan2(-m[2], m[0]);\n        } else {\n            out[0] = 0;\n            out[1] = Math.atan2(m[8], m[10]);\n        }\n    } else if (order === 'XZY') {\n        out[2] = Math.asin(-Math.min(Math.max(m[4], -1), 1));\n        if (Math.abs(m[4]) \u003c 0.99999) {\n            out[0] = Math.atan2(m[6], m[5]);\n            out[1] = Math.atan2(m[8], m[0]);\n        } else {\n            out[0] = Math.atan2(-m[9], m[10]);\n            out[1] = 0;\n        }\n    }\n\n    return out;\n}\n","import * as EulerFunc from './functions/EulerFunc.js';\nimport { Mat4 } from './Mat4.js';\n\nconst tmpMat4 = /* @__PURE__ */ new Mat4();\n\nexport class Euler extends Array {\n    constructor(x = 0, y = x, z = x, order = 'YXZ') {\n        super(x, y, z);\n        this.order = order;\n        this.onChange = () =\u003e {};\n\n        // Keep reference to proxy target to avoid triggering onChange internally\n        this._target = this;\n\n        // Return a proxy to trigger onChange when array elements are edited directly\n        const triggerProps = ['0', '1', '2'];\n        return new Proxy(this, {\n            set(target, property) {\n                const success = Reflect.set(...arguments);\n                if (success \u0026\u0026 triggerProps.includes(property)) target.onChange();\n                return success;\n            },\n        });\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    set x(v) {\n        this._target[0] = v;\n        this.onChange();\n    }\n\n    set y(v) {\n        this._target[1] = v;\n        this.onChange();\n    }\n\n    set z(v) {\n        this._target[2] = v;\n        this.onChange();\n    }\n\n    set(x, y = x, z = x) {\n        if (x.length) return this.copy(x);\n        this._target[0] = x;\n        this._target[1] = y;\n        this._target[2] = z;\n        this.onChange();\n        return this;\n    }\n\n    copy(v) {\n        this._target[0] = v[0];\n        this._target[1] = v[1];\n        this._target[2] = v[2];\n        this.onChange();\n        return this;\n    }\n\n    reorder(order) {\n        this._target.order = order;\n        this.onChange();\n        return this;\n    }\n\n    fromRotationMatrix(m, order = this.order) {\n        EulerFunc.fromRotationMatrix(this._target, m, order);\n        this.onChange();\n        return this;\n    }\n\n    fromQuaternion(q, order = this.order, isInternal) {\n        tmpMat4.fromQuaternion(q);\n        this._target.fromRotationMatrix(tmpMat4, order);\n        // Avoid infinite recursion\n        if (!isInternal) this.onChange();\n        return this;\n    }\n\n    fromArray(a, o = 0) {\n        this._target[0] = a[o];\n        this._target[1] = a[o + 1];\n        this._target[2] = a[o + 2];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        return a;\n    }\n}\n","import { Vec3 } from '../math/Vec3.js';\nimport { Quat } from '../math/Quat.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Euler } from '../math/Euler.js';\n\nexport class Transform {\n    constructor() {\n        this.parent = null;\n        this.children = [];\n        this.visible = true;\n\n        this.matrix = new Mat4();\n        this.worldMatrix = new Mat4();\n        this.matrixAutoUpdate = true;\n        this.worldMatrixNeedsUpdate = false;\n\n        this.position = new Vec3();\n        this.quaternion = new Quat();\n        this.scale = new Vec3(1);\n        this.rotation = new Euler();\n        this.up = new Vec3(0, 1, 0);\n\n        this.rotation._target.onChange = () =\u003e this.quaternion.fromEuler(this.rotation, true);\n        this.quaternion._target.onChange = () =\u003e this.rotation.fromQuaternion(this.quaternion, undefined, true);\n    }\n\n    setParent(parent, notifyParent = true) {\n        if (this.parent \u0026\u0026 parent !== this.parent) this.parent.removeChild(this, false);\n        this.parent = parent;\n        if (notifyParent \u0026\u0026 parent) parent.addChild(this, false);\n    }\n\n    addChild(child, notifyChild = true) {\n        if (!~this.children.indexOf(child)) this.children.push(child);\n        if (notifyChild) child.setParent(this, false);\n    }\n\n    removeChild(child, notifyChild = true) {\n        if (!!~this.children.indexOf(child)) this.children.splice(this.children.indexOf(child), 1);\n        if (notifyChild) child.setParent(null, false);\n    }\n\n    updateMatrixWorld(force) {\n        if (this.matrixAutoUpdate) this.updateMatrix();\n        if (this.worldMatrixNeedsUpdate || force) {\n            if (this.parent === null) this.worldMatrix.copy(this.matrix);\n            else this.worldMatrix.multiply(this.parent.worldMatrix, this.matrix);\n            this.worldMatrixNeedsUpdate = false;\n            force = true;\n        }\n\n        for (let i = 0, l = this.children.length; i \u003c l; i++) {\n            this.children[i].updateMatrixWorld(force);\n        }\n    }\n\n    updateMatrix() {\n        this.matrix.compose(this.quaternion, this.position, this.scale);\n        this.worldMatrixNeedsUpdate = true;\n    }\n\n    traverse(callback) {\n        // Return true in callback to stop traversing children\n        if (callback(this)) return;\n        for (let i = 0, l = this.children.length; i \u003c l; i++) {\n            this.children[i].traverse(callback);\n        }\n    }\n\n    decompose() {\n        this.matrix.decompose(this.quaternion._target, this.position, this.scale);\n        this.rotation.fromQuaternion(this.quaternion);\n    }\n\n    lookAt(target, invert = false) {\n        if (invert) this.matrix.lookAt(this.position, target, this.up);\n        else this.matrix.lookAt(target, this.position, this.up);\n        this.matrix.getRotation(this.quaternion._target);\n        this.rotation.fromQuaternion(this.quaternion);\n    }\n}\n","import { Transform } from './Transform.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Vec3 } from '../math/Vec3.js';\n\nconst tempMat4 = /* @__PURE__ */ new Mat4();\nconst tempVec3a = /* @__PURE__ */ new Vec3();\nconst tempVec3b = /* @__PURE__ */ new Vec3();\n\nexport class Camera extends Transform {\n    constructor(gl, { near = 0.1, far = 100, fov = 45, aspect = 1, left, right, bottom, top, zoom = 1 } = {}) {\n        super();\n\n        Object.assign(this, { near, far, fov, aspect, left, right, bottom, top, zoom });\n\n        this.projectionMatrix = new Mat4();\n        this.viewMatrix = new Mat4();\n        this.projectionViewMatrix = new Mat4();\n        this.worldPosition = new Vec3();\n\n        // Use orthographic if left/right set, else default to perspective camera\n        this.type = left || right ? 'orthographic' : 'perspective';\n\n        if (this.type === 'orthographic') this.orthographic();\n        else this.perspective();\n    }\n\n    perspective({ near = this.near, far = this.far, fov = this.fov, aspect = this.aspect } = {}) {\n        Object.assign(this, { near, far, fov, aspect });\n        this.projectionMatrix.fromPerspective({ fov: fov * (Math.PI / 180), aspect, near, far });\n        this.type = 'perspective';\n        return this;\n    }\n\n    orthographic({\n        near = this.near,\n        far = this.far,\n        left = this.left || -1,\n        right = this.right || 1,\n        bottom = this.bottom || -1,\n        top = this.top || 1,\n        zoom = this.zoom,\n    } = {}) {\n        Object.assign(this, { near, far, left, right, bottom, top, zoom });\n        left /= zoom;\n        right /= zoom;\n        bottom /= zoom;\n        top /= zoom;\n        this.projectionMatrix.fromOrthogonal({ left, right, bottom, top, near, far });\n        this.type = 'orthographic';\n        return this;\n    }\n\n    updateMatrixWorld() {\n        super.updateMatrixWorld();\n        this.viewMatrix.inverse(this.worldMatrix);\n        this.worldMatrix.getTranslation(this.worldPosition);\n\n        // used for sorting\n        this.projectionViewMatrix.multiply(this.projectionMatrix, this.viewMatrix);\n        return this;\n    }\n\n    updateProjectionMatrix() {\n        if (this.type === 'perspective') {\n            return this.perspective();\n        } else {\n            return this.orthographic();\n        }\n    }\n\n    lookAt(target) {\n        super.lookAt(target, true);\n        return this;\n    }\n\n    // Project 3D coordinate to 2D point\n    project(v) {\n        v.applyMatrix4(this.viewMatrix);\n        v.applyMatrix4(this.projectionMatrix);\n        return this;\n    }\n\n    // Unproject 2D point to 3D coordinate\n    unproject(v) {\n        v.applyMatrix4(tempMat4.inverse(this.projectionMatrix));\n        v.applyMatrix4(this.worldMatrix);\n        return this;\n    }\n\n    updateFrustum() {\n        if (!this.frustum) {\n            this.frustum = [new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3()];\n        }\n\n        const m = this.projectionViewMatrix;\n        this.frustum[0].set(m[3] - m[0], m[7] - m[4], m[11] - m[8]).constant = m[15] - m[12]; // -x\n        this.frustum[1].set(m[3] + m[0], m[7] + m[4], m[11] + m[8]).constant = m[15] + m[12]; // +x\n        this.frustum[2].set(m[3] + m[1], m[7] + m[5], m[11] + m[9]).constant = m[15] + m[13]; // +y\n        this.frustum[3].set(m[3] - m[1], m[7] - m[5], m[11] - m[9]).constant = m[15] - m[13]; // -y\n        this.frustum[4].set(m[3] - m[2], m[7] - m[6], m[11] - m[10]).constant = m[15] - m[14]; // +z (far)\n        this.frustum[5].set(m[3] + m[2], m[7] + m[6], m[11] + m[10]).constant = m[15] + m[14]; // -z (near)\n\n        for (let i = 0; i \u003c 6; i++) {\n            const invLen = 1.0 / this.frustum[i].distance();\n            this.frustum[i].multiply(invLen);\n            this.frustum[i].constant *= invLen;\n        }\n    }\n\n    frustumIntersectsMesh(node, worldMatrix = node.worldMatrix) {\n        // If no position attribute, treat as frustumCulled false\n        if (!node.geometry.attributes.position) return true;\n\n        if (!node.geometry.bounds || node.geometry.bounds.radius === Infinity) node.geometry.computeBoundingSphere();\n\n        if (!node.geometry.bounds) return true;\n\n        const center = tempVec3a;\n        center.copy(node.geometry.bounds.center);\n        center.applyMatrix4(worldMatrix);\n\n        const radius = node.geometry.bounds.radius * worldMatrix.getMaxScaleOnAxis();\n\n        return this.frustumIntersectsSphere(center, radius);\n    }\n\n    frustumIntersectsSphere(center, radius) {\n        const normal = tempVec3b;\n\n        for (let i = 0; i \u003c 6; i++) {\n            const plane = this.frustum[i];\n            const distance = normal.copy(plane).dot(center) + plane.constant;\n            if (distance \u003c -radius) return false;\n        }\n        return true;\n    }\n}\n","const EPSILON = 0.000001;\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\nexport function fromMat4(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n}\n\n/**\n * Calculates a 3x3 matrix from the given quaternion\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat3} out\n */\nexport function fromQuat(out, q) {\n    let x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n    let x2 = x + x;\n    let y2 = y + y;\n    let z2 = z + z;\n\n    let xx = x * x2;\n    let yx = y * x2;\n    let yy = y * y2;\n    let zx = z * x2;\n    let zy = z * y2;\n    let zz = z * z2;\n    let wx = w * x2;\n    let wy = w * y2;\n    let wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n\n    return out;\n}\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nexport function set(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n}\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nexport function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nexport function transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        let a01 = a[1],\n            a02 = a[2],\n            a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n\n    return out;\n}\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nexport function invert(out, a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2];\n    let a10 = a[3],\n        a11 = a[4],\n        a12 = a[5];\n    let a20 = a[6],\n        a21 = a[7],\n        a22 = a[8];\n\n    let b01 = a22 * a11 - a12 * a21;\n    let b11 = -a22 * a10 + a12 * a20;\n    let b21 = a21 * a10 - a11 * a20;\n\n    // Calculate the determinant\n    let det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n}\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2];\n    let a10 = a[3],\n        a11 = a[4],\n        a12 = a[5];\n    let a20 = a[6],\n        a21 = a[7],\n        a22 = a[8];\n\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n}\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nexport function multiply(out, a, b) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2];\n    let a10 = a[3],\n        a11 = a[4],\n        a12 = a[5];\n    let a20 = a[6],\n        a21 = a[7],\n        a22 = a[8];\n\n    let b00 = b[0],\n        b01 = b[1],\n        b02 = b[2];\n    let b10 = b[3],\n        b11 = b[4],\n        b12 = b[5];\n    let b20 = b[6],\n        b21 = b[7],\n        b22 = b[8];\n\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n}\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nexport function translate(out, a, v) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a10 = a[3],\n        a11 = a[4],\n        a12 = a[5],\n        a20 = a[6],\n        a21 = a[7],\n        a22 = a[8],\n        x = v[0],\n        y = v[1];\n\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n}\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nexport function rotate(out, a, rad) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a10 = a[3],\n        a11 = a[4],\n        a12 = a[5],\n        a20 = a[6],\n        a21 = a[7],\n        a22 = a[8],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n}\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nexport function scale(out, a, v) {\n    let x = v[0],\n        y = v[1];\n\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n}\n\n/**\n * Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {mat4} a Mat4 to derive the normal matrix from\n *\n * @returns {mat3} out\n */\nexport function normalFromMat4(out, a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    let b00 = a00 * a11 - a01 * a10;\n    let b01 = a00 * a12 - a02 * a10;\n    let b02 = a00 * a13 - a03 * a10;\n    let b03 = a01 * a12 - a02 * a11;\n    let b04 = a01 * a13 - a03 * a11;\n    let b05 = a02 * a13 - a03 * a12;\n    let b06 = a20 * a31 - a21 * a30;\n    let b07 = a20 * a32 - a22 * a30;\n    let b08 = a20 * a33 - a23 * a30;\n    let b09 = a21 * a32 - a22 * a31;\n    let b10 = a21 * a33 - a23 * a31;\n    let b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n    return out;\n}\n\n/**\n * Generates a 2D projection matrix with the given bounds\n *\n * @param {mat3} out mat3 frustum matrix will be written into\n * @param {number} width Width of your gl context\n * @param {number} height Height of gl context\n * @returns {mat3} out\n */\nexport function projection(out, width, height) {\n    out[0] = 2 / width;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = -2 / height;\n    out[5] = 0;\n    out[6] = -1;\n    out[7] = 1;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nexport function subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nexport function multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n}\n","import * as Mat3Func from './functions/Mat3Func.js';\n\nexport class Mat3 extends Array {\n    constructor(m00 = 1, m01 = 0, m02 = 0, m10 = 0, m11 = 1, m12 = 0, m20 = 0, m21 = 0, m22 = 1) {\n        super(m00, m01, m02, m10, m11, m12, m20, m21, m22);\n        return this;\n    }\n\n    set(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n        if (m00.length) return this.copy(m00);\n        Mat3Func.set(this, m00, m01, m02, m10, m11, m12, m20, m21, m22);\n        return this;\n    }\n\n    translate(v, m = this) {\n        Mat3Func.translate(this, m, v);\n        return this;\n    }\n\n    rotate(v, m = this) {\n        Mat3Func.rotate(this, m, v);\n        return this;\n    }\n\n    scale(v, m = this) {\n        Mat3Func.scale(this, m, v);\n        return this;\n    }\n\n    multiply(ma, mb) {\n        if (mb) {\n            Mat3Func.multiply(this, ma, mb);\n        } else {\n            Mat3Func.multiply(this, this, ma);\n        }\n        return this;\n    }\n\n    identity() {\n        Mat3Func.identity(this);\n        return this;\n    }\n\n    copy(m) {\n        Mat3Func.copy(this, m);\n        return this;\n    }\n\n    fromMatrix4(m) {\n        Mat3Func.fromMat4(this, m);\n        return this;\n    }\n\n    fromQuaternion(q) {\n        Mat3Func.fromQuat(this, q);\n        return this;\n    }\n\n    fromBasis(vec3a, vec3b, vec3c) {\n        this.set(vec3a[0], vec3a[1], vec3a[2], vec3b[0], vec3b[1], vec3b[2], vec3c[0], vec3c[1], vec3c[2]);\n        return this;\n    }\n\n    inverse(m = this) {\n        Mat3Func.invert(this, m);\n        return this;\n    }\n\n    getNormalMatrix(m) {\n        Mat3Func.normalFromMat4(this, m);\n        return this;\n    }\n}\n","import { Transform } from './Transform.js';\nimport { Mat3 } from '../math/Mat3.js';\nimport { Mat4 } from '../math/Mat4.js';\n\nlet ID = 0;\n\nexport class Mesh extends Transform {\n    constructor(gl, { geometry, program, mode = gl.TRIANGLES, frustumCulled = true, renderOrder = 0 } = {}) {\n        super();\n        if (!gl.canvas) console.error('gl not passed as first argument to Mesh');\n        this.gl = gl;\n        this.id = ID++;\n        this.geometry = geometry;\n        this.program = program;\n        this.mode = mode;\n\n        // Used to skip frustum culling\n        this.frustumCulled = frustumCulled;\n\n        // Override sorting to force an order\n        this.renderOrder = renderOrder;\n        this.modelViewMatrix = new Mat4();\n        this.normalMatrix = new Mat3();\n        this.beforeRenderCallbacks = [];\n        this.afterRenderCallbacks = [];\n    }\n\n    onBeforeRender(f) {\n        this.beforeRenderCallbacks.push(f);\n        return this;\n    }\n\n    onAfterRender(f) {\n        this.afterRenderCallbacks.push(f);\n        return this;\n    }\n\n    draw({ camera } = {}) {\n        if (camera) {\n            // Add empty matrix uniforms to program if unset\n            if (!this.program.uniforms.modelMatrix) {\n                Object.assign(this.program.uniforms, {\n                    modelMatrix: { value: null },\n                    viewMatrix: { value: null },\n                    modelViewMatrix: { value: null },\n                    normalMatrix: { value: null },\n                    projectionMatrix: { value: null },\n                    cameraPosition: { value: null },\n                });\n            }\n\n            // Set the matrix uniforms\n            this.program.uniforms.projectionMatrix.value = camera.projectionMatrix;\n            this.program.uniforms.cameraPosition.value = camera.worldPosition;\n            this.program.uniforms.viewMatrix.value = camera.viewMatrix;\n            this.modelViewMatrix.multiply(camera.viewMatrix, this.worldMatrix);\n            this.normalMatrix.getNormalMatrix(this.modelViewMatrix);\n            this.program.uniforms.modelMatrix.value = this.worldMatrix;\n            this.program.uniforms.modelViewMatrix.value = this.modelViewMatrix;\n            this.program.uniforms.normalMatrix.value = this.normalMatrix;\n        }\n        this.beforeRenderCallbacks.forEach((f) =\u003e f \u0026\u0026 f({ mesh: this, camera }));\n\n        // determine if faces need to be flipped - when mesh scaled negatively\n        let flipFaces = this.program.cullFace \u0026\u0026 this.worldMatrix.determinant() \u003c 0;\n        this.program.use({ flipFaces });\n        this.geometry.draw({ mode: this.mode, program: this.program });\n        this.afterRenderCallbacks.forEach((f) =\u003e f \u0026\u0026 f({ mesh: this, camera }));\n    }\n}\n","// TODO: delete texture\n// TODO: use texSubImage2D for updates (video or when loaded)\n// TODO: need? encoding = linearEncoding\n// TODO: support non-compressed mipmaps uploads\n\nconst emptyPixel = new Uint8Array(4);\n\nfunction isPowerOf2(value) {\n    return (value \u0026 (value - 1)) === 0;\n}\n\nlet ID = 1;\n\nexport class Texture {\n    constructor(\n        gl,\n        {\n            image,\n            target = gl.TEXTURE_2D,\n            type = gl.UNSIGNED_BYTE,\n            format = gl.RGBA,\n            internalFormat = format,\n            wrapS = gl.CLAMP_TO_EDGE,\n            wrapT = gl.CLAMP_TO_EDGE,\n            wrapR = gl.CLAMP_TO_EDGE,\n            generateMipmaps = target === (gl.TEXTURE_2D || gl.TEXTURE_CUBE_MAP),\n            minFilter = generateMipmaps ? gl.NEAREST_MIPMAP_LINEAR : gl.LINEAR,\n            magFilter = gl.LINEAR,\n            premultiplyAlpha = false,\n            unpackAlignment = 4,\n            flipY = target == (gl.TEXTURE_2D || gl.TEXTURE_3D) ? true : false,\n            anisotropy = 0,\n            level = 0,\n            width, // used for RenderTargets or Data Textures\n            height = width,\n            length = 1,\n        } = {}\n    ) {\n        this.gl = gl;\n        this.id = ID++;\n\n        this.image = image;\n        this.target = target;\n        this.type = type;\n        this.format = format;\n        this.internalFormat = internalFormat;\n        this.minFilter = minFilter;\n        this.magFilter = magFilter;\n        this.wrapS = wrapS;\n        this.wrapT = wrapT;\n        this.wrapR = wrapR;\n        this.generateMipmaps = generateMipmaps;\n        this.premultiplyAlpha = premultiplyAlpha;\n        this.unpackAlignment = unpackAlignment;\n        this.flipY = flipY;\n        this.anisotropy = Math.min(anisotropy, this.gl.renderer.parameters.maxAnisotropy);\n        this.level = level;\n        this.width = width;\n        this.height = height;\n        this.length = length;\n        this.texture = this.gl.createTexture();\n\n        this.store = {\n            image: null,\n        };\n\n        // Alias for state store to avoid redundant calls for global state\n        this.glState = this.gl.renderer.state;\n\n        // State store to avoid redundant calls for per-texture state\n        this.state = {};\n        this.state.minFilter = this.gl.NEAREST_MIPMAP_LINEAR;\n        this.state.magFilter = this.gl.LINEAR;\n        this.state.wrapS = this.gl.REPEAT;\n        this.state.wrapT = this.gl.REPEAT;\n        this.state.anisotropy = 0;\n    }\n\n    bind() {\n        // Already bound to active texture unit\n        if (this.glState.textureUnits[this.glState.activeTextureUnit] === this.id) return;\n        this.gl.bindTexture(this.target, this.texture);\n        this.glState.textureUnits[this.glState.activeTextureUnit] = this.id;\n    }\n\n    update(textureUnit = 0) {\n        const needsUpdate = !(this.image === this.store.image \u0026\u0026 !this.needsUpdate);\n\n        // Make sure that texture is bound to its texture unit\n        if (needsUpdate || this.glState.textureUnits[textureUnit] !== this.id) {\n            // set active texture unit to perform texture functions\n            this.gl.renderer.activeTexture(textureUnit);\n            this.bind();\n        }\n\n        if (!needsUpdate) return;\n        this.needsUpdate = false;\n\n        if (this.flipY !== this.glState.flipY) {\n            this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, this.flipY);\n            this.glState.flipY = this.flipY;\n        }\n\n        if (this.premultiplyAlpha !== this.glState.premultiplyAlpha) {\n            this.gl.pixelStorei(this.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.premultiplyAlpha);\n            this.glState.premultiplyAlpha = this.premultiplyAlpha;\n        }\n\n        if (this.unpackAlignment !== this.glState.unpackAlignment) {\n            this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, this.unpackAlignment);\n            this.glState.unpackAlignment = this.unpackAlignment;\n        }\n\n        if (this.minFilter !== this.state.minFilter) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.minFilter);\n            this.state.minFilter = this.minFilter;\n        }\n\n        if (this.magFilter !== this.state.magFilter) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.magFilter);\n            this.state.magFilter = this.magFilter;\n        }\n\n        if (this.wrapS !== this.state.wrapS) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.wrapS);\n            this.state.wrapS = this.wrapS;\n        }\n\n        if (this.wrapT !== this.state.wrapT) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.wrapT);\n            this.state.wrapT = this.wrapT;\n        }\n\n        if (this.wrapR !== this.state.wrapR) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_R, this.wrapR);\n            this.state.wrapR = this.wrapR;\n        }\n\n        if (this.anisotropy \u0026\u0026 this.anisotropy !== this.state.anisotropy) {\n            this.gl.texParameterf(this.target, this.gl.renderer.getExtension('EXT_texture_filter_anisotropic').TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropy);\n            this.state.anisotropy = this.anisotropy;\n        }\n\n        if (this.image) {\n            if (this.image.width) {\n                this.width = this.image.width;\n                this.height = this.image.height;\n            }\n\n            if (this.target === this.gl.TEXTURE_CUBE_MAP) {\n                // For cube maps\n                for (let i = 0; i \u003c 6; i++) {\n                    this.gl.texImage2D(this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, this.level, this.internalFormat, this.format, this.type, this.image[i]);\n                }\n            } else if (ArrayBuffer.isView(this.image)) {\n                // Data texture\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.width, this.height, 0, this.format, this.type, this.image);\n                } else if (this.target === this.gl.TEXTURE_2D_ARRAY || this.target === this.gl.TEXTURE_3D) {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, this.image);\n                }\n            } else if (this.image.isCompressedTexture) {\n                // Compressed texture\n                for (let level = 0; level \u003c this.image.length; level++) {\n                    this.gl.compressedTexImage2D(this.target, level, this.internalFormat, this.image[level].width, this.image[level].height, 0, this.image[level].data);\n                }\n            } else {\n                // Regular texture\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.format, this.type, this.image);\n                } else {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, this.image);\n                }\n            }\n\n            if (this.generateMipmaps) {\n                // For WebGL1, if not a power of 2, turn off mips, set wrapping to clamp to edge and minFilter to linear\n                if (!this.gl.renderer.isWebgl2 \u0026\u0026 (!isPowerOf2(this.image.width) || !isPowerOf2(this.image.height))) {\n                    this.generateMipmaps = false;\n                    this.wrapS = this.wrapT = this.gl.CLAMP_TO_EDGE;\n                    this.minFilter = this.gl.LINEAR;\n                } else {\n                    this.gl.generateMipmap(this.target);\n                }\n            }\n\n            // Callback for when data is pushed to GPU\n            this.onUpdate \u0026\u0026 this.onUpdate();\n        } else {\n            if (this.target === this.gl.TEXTURE_CUBE_MAP) {\n                // Upload empty pixel for each side while no image to avoid errors while image or video loading\n                for (let i = 0; i \u003c 6; i++) {\n                    this.gl.texImage2D(this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, this.gl.RGBA, 1, 1, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, emptyPixel);\n                }\n            } else if (this.width) {\n                // image intentionally left null for RenderTarget\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.width, this.height, 0, this.format, this.type, null);\n                } else {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, null);\n                }\n            } else {\n                // Upload empty pixel if no image to avoid errors while image or video loading\n                this.gl.texImage2D(this.target, 0, this.gl.RGBA, 1, 1, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, emptyPixel);\n            }\n        }\n        this.store.image = this.image;\n    }\n}\n","import { Texture } from './Texture.js'\n\nexport class RenderTarget {\n    constructor(\n        gl,\n        {\n            width = gl.canvas.width,\n            height = gl.canvas.height,\n            target = gl.FRAMEBUFFER,\n            color = 1, // number of color attachments\n            depth = true,\n            stencil = false,\n            depthTexture = false,\n            wrapS = gl.CLAMP_TO_EDGE,\n            wrapT = gl.CLAMP_TO_EDGE,\n            wrapR = gl.CLAMP_TO_EDGE,\n            minFilter = gl.LINEAR,\n            magFilter = minFilter,\n            type = gl.UNSIGNED_BYTE,\n            format = gl.RGBA,\n            internalFormat = format,\n            unpackAlignment,\n            premultiplyAlpha,\n        } = {}\n    ) {\n        this.gl = gl;\n        this.width = width;\n        this.height = height;\n        this.depth = depth;\n        this.stencil = stencil;\n        this.buffer = this.gl.createFramebuffer();\n        this.target = target;\n        this.gl.renderer.bindFramebuffer(this);\n\n        this.textures = [];\n        const drawBuffers = [];\n\n        // create and attach required num of color textures\n        for (let i = 0; i \u003c color; i++) {\n            this.textures.push(\n                new Texture(gl, {\n                    width,\n                    height,\n                    wrapS,\n                    wrapT,\n                    wrapR,\n                    minFilter,\n                    magFilter,\n                    type,\n                    format,\n                    internalFormat,\n                    unpackAlignment,\n                    premultiplyAlpha,\n                    flipY: false,\n                    generateMipmaps: false,\n                })\n            );\n            this.textures[i].update();\n            this.gl.framebufferTexture2D(this.target, this.gl.COLOR_ATTACHMENT0 + i, this.gl.TEXTURE_2D, this.textures[i].texture, 0 /* level */);\n            drawBuffers.push(this.gl.COLOR_ATTACHMENT0 + i);\n        }\n\n        // For multi-render targets shader access\n        if (drawBuffers.length \u003e 1) this.gl.renderer.drawBuffers(drawBuffers);\n\n        // alias for majority of use cases\n        this.texture = this.textures[0];\n\n        // note depth textures break stencil - so can't use together\n        if (depthTexture \u0026\u0026 (this.gl.renderer.isWebgl2 || this.gl.renderer.getExtension('WEBGL_depth_texture'))) {\n            this.depthTexture = new Texture(gl, {\n                width,\n                height,\n                minFilter: this.gl.NEAREST,\n                magFilter: this.gl.NEAREST,\n                format: this.stencil ? this.gl.DEPTH_STENCIL : this.gl.DEPTH_COMPONENT,\n                internalFormat: gl.renderer.isWebgl2 ? (this.stencil ? this.gl.DEPTH24_STENCIL8 : this.gl.DEPTH_COMPONENT16) : this.gl.DEPTH_COMPONENT,\n                type: this.stencil ? this.gl.UNSIGNED_INT_24_8 : this.gl.UNSIGNED_INT,\n            });\n            this.depthTexture.update();\n            this.gl.framebufferTexture2D(this.target, this.stencil ? this.gl.DEPTH_STENCIL_ATTACHMENT : this.gl.DEPTH_ATTACHMENT, this.gl.TEXTURE_2D, this.depthTexture.texture, 0 /* level */);\n        } else {\n            // Render buffers\n            if (depth \u0026\u0026 !stencil) {\n                this.depthBuffer = this.gl.createRenderbuffer();\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.depthBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.DEPTH_COMPONENT16, width, height);\n                this.gl.framebufferRenderbuffer(this.target, this.gl.DEPTH_ATTACHMENT, this.gl.RENDERBUFFER, this.depthBuffer);\n            }\n\n            if (stencil \u0026\u0026 !depth) {\n                this.stencilBuffer = this.gl.createRenderbuffer();\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.stencilBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.STENCIL_INDEX8, width, height);\n                this.gl.framebufferRenderbuffer(this.target, this.gl.STENCIL_ATTACHMENT, this.gl.RENDERBUFFER, this.stencilBuffer);\n            }\n\n            if (depth \u0026\u0026 stencil) {\n                this.depthStencilBuffer = this.gl.createRenderbuffer();\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.depthStencilBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.DEPTH_STENCIL, width, height);\n                this.gl.framebufferRenderbuffer(this.target, this.gl.DEPTH_STENCIL_ATTACHMENT, this.gl.RENDERBUFFER, this.depthStencilBuffer);\n            }\n        }\n\n        this.gl.renderer.bindFramebuffer({ target: this.target });\n    }\n\n    setSize(width, height) {\n        if (this.width === width \u0026\u0026 this.height === height) return;\n\n        this.width = width;\n        this.height = height;\n        this.gl.renderer.bindFramebuffer(this);\n\n        for (let i = 0; i \u003c this.textures.length; i++) {\n            this.textures[i].width = width;\n            this.textures[i].height = height;\n            this.textures[i].needsUpdate = true;\n            this.textures[i].update();\n            this.gl.framebufferTexture2D(this.target, this.gl.COLOR_ATTACHMENT0 + i, this.gl.TEXTURE_2D, this.textures[i].texture, 0 /* level */);\n        }\n\n        if (this.depthTexture) {\n            this.depthTexture.width = width;\n            this.depthTexture.height = height;\n            this.depthTexture.needsUpdate = true;\n            this.depthTexture.update();\n            this.gl.framebufferTexture2D(this.target, this.gl.DEPTH_ATTACHMENT, this.gl.TEXTURE_2D, this.depthTexture.texture, 0 /* level */);\n        } else {\n            if (this.depthBuffer) {\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.depthBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.DEPTH_COMPONENT16, width, height);\n            }\n\n            if (this.stencilBuffer) {\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.stencilBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.STENCIL_INDEX8, width, height);\n            }\n\n            if (this.depthStencilBuffer) {\n                this.gl.bindRenderbuffer(this.gl.RENDERBUFFER, this.depthStencilBuffer);\n                this.gl.renderbufferStorage(this.gl.RENDERBUFFER, this.gl.DEPTH_STENCIL, width, height);\n            }\n        }\n\n        this.gl.renderer.bindFramebuffer({ target: this.target });\n    }\n}\n","const NAMES = {\n    black: '#000000',\n    white: '#ffffff',\n    red: '#ff0000',\n    green: '#00ff00',\n    blue: '#0000ff',\n    fuchsia: '#ff00ff',\n    cyan: '#00ffff',\n    yellow: '#ffff00',\n    orange: '#ff8000',\n};\n\nexport function hexToRGB(hex) {\n    if (hex.length === 4) hex = hex[0] + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];\n    const rgb = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n    if (!rgb) console.warn(`Unable to convert hex string ${hex} to rgb values`);\n    return [parseInt(rgb[1], 16) / 255, parseInt(rgb[2], 16) / 255, parseInt(rgb[3], 16) / 255];\n}\n\nexport function numberToRGB(num) {\n    num = parseInt(num);\n    return [((num \u003e\u003e 16) \u0026 255) / 255, ((num \u003e\u003e 8) \u0026 255) / 255, (num \u0026 255) / 255];\n}\n\nexport function parseColor(color) {\n    // Empty\n    if (color === undefined) return [0, 0, 0];\n\n    // Decimal\n    if (arguments.length === 3) return arguments;\n\n    // Number\n    if (!isNaN(color)) return numberToRGB(color);\n\n    // Hex\n    if (color[0] === '#') return hexToRGB(color);\n\n    // Names\n    if (NAMES[color.toLowerCase()]) return hexToRGB(NAMES[color.toLowerCase()]);\n\n    console.warn('Color format not recognised');\n    return [0, 0, 0];\n}\n","import * as ColorFunc from './functions/ColorFunc.js';\n\n// Color stored as an array of RGB decimal values (between 0 \u003e 1)\n// Constructor and set method accept following formats:\n// new Color() - Empty (defaults to black)\n// new Color([0.2, 0.4, 1.0]) - Decimal Array (or another Color instance)\n// new Color(0.7, 0.0, 0.1) - Decimal RGB values\n// new Color('#ff0000') - Hex string\n// new Color('#ccc') - Short-hand Hex string\n// new Color(0x4f27e8) - Number\n// new Color('red') - Color name string (short list in ColorFunc.js)\n\nexport class Color extends Array {\n    constructor(color) {\n        if (Array.isArray(color)) return super(...color);\n        return super(...ColorFunc.parseColor(...arguments));\n    }\n\n    get r() {\n        return this[0];\n    }\n\n    get g() {\n        return this[1];\n    }\n\n    get b() {\n        return this[2];\n    }\n\n    set r(v) {\n        this[0] = v;\n    }\n\n    set g(v) {\n        this[1] = v;\n    }\n\n    set b(v) {\n        this[2] = v;\n    }\n\n    set(color) {\n        if (Array.isArray(color)) return this.copy(color);\n        return this.copy(ColorFunc.parseColor(...arguments));\n    }\n\n    copy(v) {\n        this[0] = v[0];\n        this[1] = v[1];\n        this[2] = v[2];\n        return this;\n    }\n}\n","const EPSILON = 0.000001;\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n}\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nexport function set(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n}\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nexport function subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n}\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nexport function multiply(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n}\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nexport function divide(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n}\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nexport function scale(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return Math.sqrt(x * x + y * y);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return x * x + y * y;\n}\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n    var x = a[0],\n        y = a[1];\n    return Math.sqrt(x * x + y * y);\n}\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n    var x = a[0],\n        y = a[1];\n    return x * x + y * y;\n}\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nexport function negate(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n}\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nexport function inverse(out, a) {\n    out[0] = 1.0 / a[0];\n    out[1] = 1.0 / a[1];\n    return out;\n}\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nexport function normalize(out, a) {\n    var x = a[0],\n        y = a[1];\n    var len = x * x + y * y;\n    if (len \u003e 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n    }\n    out[0] = a[0] * len;\n    out[1] = a[1] * len;\n    return out;\n}\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n}\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product returns a scalar\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} cross product of a and b\n */\nexport function cross(a, b) {\n    return a[0] * b[1] - a[1] * b[0];\n}\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nexport function lerp(out, a, b, t) {\n    var ax = a[0],\n        ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n}\n\n/**\n * Performs a frame rate independant, linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} decay decay constant for interpolation. useful range between 1 and 25, from slow to fast.\n * @param {Number} dt delta time\n * @returns {vec2} out\n */\nexport function smoothLerp(out, a, b, decay, dt) {\n    const exp = Math.exp(-decay * dt);\n    let ax = a[0];\n    let ay = a[1];\n\n    out[0] = b[0] + (ax - b[0]) * exp;\n    out[1] = b[1] + (ay - b[1]) * exp;\n    return out;\n}\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nexport function transformMat2(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n}\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nexport function transformMat2d(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n}\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nexport function transformMat3(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n}\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nexport function transformMat4(out, a, m) {\n    let x = a[0];\n    let y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n}\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n    return a[0] === b[0] \u0026\u0026 a[1] === b[1];\n}\n","import * as Vec2Func from './functions/Vec2Func.js';\n\nexport class Vec2 extends Array {\n    constructor(x = 0, y = x) {\n        super(x, y);\n        return this;\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    set x(v) {\n        this[0] = v;\n    }\n\n    set y(v) {\n        this[1] = v;\n    }\n\n    set(x, y = x) {\n        if (x.length) return this.copy(x);\n        Vec2Func.set(this, x, y);\n        return this;\n    }\n\n    copy(v) {\n        Vec2Func.copy(this, v);\n        return this;\n    }\n\n    add(va, vb) {\n        if (vb) Vec2Func.add(this, va, vb);\n        else Vec2Func.add(this, this, va);\n        return this;\n    }\n\n    sub(va, vb) {\n        if (vb) Vec2Func.subtract(this, va, vb);\n        else Vec2Func.subtract(this, this, va);\n        return this;\n    }\n\n    multiply(v) {\n        if (v.length) Vec2Func.multiply(this, this, v);\n        else Vec2Func.scale(this, this, v);\n        return this;\n    }\n\n    divide(v) {\n        if (v.length) Vec2Func.divide(this, this, v);\n        else Vec2Func.scale(this, this, 1 / v);\n        return this;\n    }\n\n    inverse(v = this) {\n        Vec2Func.inverse(this, v);\n        return this;\n    }\n\n    // Can't use 'length' as Array.prototype uses it\n    len() {\n        return Vec2Func.length(this);\n    }\n\n    distance(v) {\n        if (v) return Vec2Func.distance(this, v);\n        else return Vec2Func.length(this);\n    }\n\n    squaredLen() {\n        return this.squaredDistance();\n    }\n\n    squaredDistance(v) {\n        if (v) return Vec2Func.squaredDistance(this, v);\n        else return Vec2Func.squaredLength(this);\n    }\n\n    negate(v = this) {\n        Vec2Func.negate(this, v);\n        return this;\n    }\n\n    cross(va, vb) {\n        if (vb) return Vec2Func.cross(va, vb);\n        return Vec2Func.cross(this, va);\n    }\n\n    scale(v) {\n        Vec2Func.scale(this, this, v);\n        return this;\n    }\n\n    normalize() {\n        Vec2Func.normalize(this, this);\n        return this;\n    }\n\n    dot(v) {\n        return Vec2Func.dot(this, v);\n    }\n\n    equals(v) {\n        return Vec2Func.exactEquals(this, v);\n    }\n\n    applyMatrix3(mat3) {\n        Vec2Func.transformMat3(this, this, mat3);\n        return this;\n    }\n\n    applyMatrix4(mat4) {\n        Vec2Func.transformMat4(this, this, mat4);\n        return this;\n    }\n\n    lerp(v, a) {\n        Vec2Func.lerp(this, this, v, a);\n        return this;\n    }\n\n    smoothLerp(v, decay, dt) {\n        Vec2Func.smoothLerp(this, this, v, decay, dt);\n        return this;\n    }\n\n    clone() {\n        return new Vec2(this[0], this[1]);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        return a;\n    }\n}\n","import * as Vec4Func from './functions/Vec4Func.js';\n\nexport class Vec4 extends Array {\n    constructor(x = 0, y = x, z = x, w = x) {\n        super(x, y, z, w);\n        return this;\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    get w() {\n        return this[3];\n    }\n\n    set x(v) {\n        this[0] = v;\n    }\n\n    set y(v) {\n        this[1] = v;\n    }\n\n    set z(v) {\n        this[2] = v;\n    }\n\n    set w(v) {\n        this[3] = v;\n    }\n\n    set(x, y = x, z = x, w = x) {\n        if (x.length) return this.copy(x);\n        Vec4Func.set(this, x, y, z, w);\n        return this;\n    }\n\n    copy(v) {\n        Vec4Func.copy(this, v);\n        return this;\n    }\n\n    normalize() {\n        Vec4Func.normalize(this, this);\n        return this;\n    }\n\n    multiply(v) {\n        Vec4Func.scale(this, this, v);\n        return this;\n    }\n\n    dot(v) {\n        return Vec4Func.dot(this, v);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        this[2] = a[o + 2];\n        this[3] = a[o + 3];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        a[o + 3] = this[3];\n        return a;\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\n\nexport class Plane extends Geometry {\n    constructor(gl, { width = 1, height = 1, widthSegments = 1, heightSegments = 1, attributes = {} } = {}) {\n        const wSegs = widthSegments;\n        const hSegs = heightSegments;\n\n        // Determine length of arrays\n        const num = (wSegs + 1) * (hSegs + 1);\n        const numIndices = wSegs * hSegs * 6;\n\n        // Generate empty arrays once\n        const position = new Float32Array(num * 3);\n        const normal = new Float32Array(num * 3);\n        const uv = new Float32Array(num * 2);\n        const index = numIndices \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        Plane.buildPlane(position, normal, uv, index, width, height, 0, wSegs, hSegs);\n\n        Object.assign(attributes, {\n            position: { size: 3, data: position },\n            normal: { size: 3, data: normal },\n            uv: { size: 2, data: uv },\n            index: { data: index },\n        });\n\n        super(gl, attributes);\n    }\n\n    static buildPlane(position, normal, uv, index, width, height, depth, wSegs, hSegs, u = 0, v = 1, w = 2, uDir = 1, vDir = -1, i = 0, ii = 0) {\n        const io = i;\n        const segW = width / wSegs;\n        const segH = height / hSegs;\n\n        for (let iy = 0; iy \u003c= hSegs; iy++) {\n            let y = iy * segH - height / 2;\n            for (let ix = 0; ix \u003c= wSegs; ix++, i++) {\n                let x = ix * segW - width / 2;\n\n                position[i * 3 + u] = x * uDir;\n                position[i * 3 + v] = y * vDir;\n                position[i * 3 + w] = depth / 2;\n\n                normal[i * 3 + u] = 0;\n                normal[i * 3 + v] = 0;\n                normal[i * 3 + w] = depth \u003e= 0 ? 1 : -1;\n\n                uv[i * 2] = ix / wSegs;\n                uv[i * 2 + 1] = 1 - iy / hSegs;\n\n                if (iy === hSegs || ix === wSegs) continue;\n                let a = io + ix + iy * (wSegs + 1);\n                let b = io + ix + (iy + 1) * (wSegs + 1);\n                let c = io + ix + (iy + 1) * (wSegs + 1) + 1;\n                let d = io + ix + iy * (wSegs + 1) + 1;\n\n                index[ii * 6] = a;\n                index[ii * 6 + 1] = b;\n                index[ii * 6 + 2] = d;\n                index[ii * 6 + 3] = b;\n                index[ii * 6 + 4] = c;\n                index[ii * 6 + 5] = d;\n                ii++;\n            }\n        }\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\nimport { Plane } from './Plane.js';\n\nexport class Box extends Geometry {\n    constructor(gl, { width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1, attributes = {} } = {}) {\n        const wSegs = widthSegments;\n        const hSegs = heightSegments;\n        const dSegs = depthSegments;\n\n        const num = (wSegs + 1) * (hSegs + 1) * 2 + (wSegs + 1) * (dSegs + 1) * 2 + (hSegs + 1) * (dSegs + 1) * 2;\n        const numIndices = (wSegs * hSegs * 2 + wSegs * dSegs * 2 + hSegs * dSegs * 2) * 6;\n\n        const position = new Float32Array(num * 3);\n        const normal = new Float32Array(num * 3);\n        const uv = new Float32Array(num * 2);\n        const index = num \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        let i = 0;\n        let ii = 0;\n\n        // left, right\n        Plane.buildPlane(position, normal, uv, index, depth, height, width, dSegs, hSegs, 2, 1, 0, -1, -1, i, ii);\n        i += (dSegs + 1) * (hSegs + 1);\n        ii += dSegs * hSegs;\n\n        Plane.buildPlane(position, normal, uv, index, depth, height, -width, dSegs, hSegs, 2, 1, 0, 1, -1, i, ii);\n        i += (dSegs + 1) * (hSegs + 1);\n        ii += dSegs * hSegs;\n\n        // top, bottom\n        Plane.buildPlane(position, normal, uv, index, width, depth, height, dSegs, wSegs, 0, 2, 1, 1, 1, i, ii);\n        i += (wSegs + 1) * (dSegs + 1);\n        ii += wSegs * dSegs;\n\n        Plane.buildPlane(position, normal, uv, index, width, depth, -height, dSegs, wSegs, 0, 2, 1, 1, -1, i, ii);\n        i += (wSegs + 1) * (dSegs + 1);\n        ii += wSegs * dSegs;\n\n        // front, back\n        Plane.buildPlane(position, normal, uv, index, width, height, -depth, wSegs, hSegs, 0, 1, 2, -1, -1, i, ii);\n        i += (wSegs + 1) * (hSegs + 1);\n        ii += wSegs * hSegs;\n\n        Plane.buildPlane(position, normal, uv, index, width, height, depth, wSegs, hSegs, 0, 1, 2, 1, -1, i, ii);\n\n        Object.assign(attributes, {\n            position: { size: 3, data: position },\n            normal: { size: 3, data: normal },\n            uv: { size: 2, data: uv },\n            index: { data: index },\n        });\n\n        super(gl, attributes);\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\nimport { Vec3 } from '../math/Vec3.js';\n\nexport class Sphere extends Geometry {\n    constructor(\n        gl,\n        {\n            radius = 0.5,\n            widthSegments = 16,\n            heightSegments = Math.ceil(widthSegments * 0.5),\n            phiStart = 0,\n            phiLength = Math.PI * 2,\n            thetaStart = 0,\n            thetaLength = Math.PI,\n            attributes = {},\n        } = {}\n    ) {\n        const wSegs = widthSegments;\n        const hSegs = heightSegments;\n        const pStart = phiStart;\n        const pLength = phiLength;\n        const tStart = thetaStart;\n        const tLength = thetaLength;\n\n        const num = (wSegs + 1) * (hSegs + 1);\n        const numIndices = wSegs * hSegs * 6;\n\n        const position = new Float32Array(num * 3);\n        const normal = new Float32Array(num * 3);\n        const uv = new Float32Array(num * 2);\n        const index = num \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        let i = 0;\n        let iv = 0;\n        let ii = 0;\n        let te = tStart + tLength;\n        const grid = [];\n\n        let n = new Vec3();\n\n        for (let iy = 0; iy \u003c= hSegs; iy++) {\n            let vRow = [];\n            let v = iy / hSegs;\n            for (let ix = 0; ix \u003c= wSegs; ix++, i++) {\n                let u = ix / wSegs;\n                let x = -radius * Math.cos(pStart + u * pLength) * Math.sin(tStart + v * tLength);\n                let y = radius * Math.cos(tStart + v * tLength);\n                let z = radius * Math.sin(pStart + u * pLength) * Math.sin(tStart + v * tLength);\n\n                position[i * 3] = x;\n                position[i * 3 + 1] = y;\n                position[i * 3 + 2] = z;\n\n                n.set(x, y, z).normalize();\n                normal[i * 3] = n.x;\n                normal[i * 3 + 1] = n.y;\n                normal[i * 3 + 2] = n.z;\n\n                uv[i * 2] = u;\n                uv[i * 2 + 1] = 1 - v;\n\n                vRow.push(iv++);\n            }\n\n            grid.push(vRow);\n        }\n\n        for (let iy = 0; iy \u003c hSegs; iy++) {\n            for (let ix = 0; ix \u003c wSegs; ix++) {\n                let a = grid[iy][ix + 1];\n                let b = grid[iy][ix];\n                let c = grid[iy + 1][ix];\n                let d = grid[iy + 1][ix + 1];\n\n                if (iy !== 0 || tStart \u003e 0) {\n                    index[ii * 3] = a;\n                    index[ii * 3 + 1] = b;\n                    index[ii * 3 + 2] = d;\n                    ii++;\n                }\n                if (iy !== hSegs - 1 || te \u003c Math.PI) {\n                    index[ii * 3] = b;\n                    index[ii * 3 + 1] = c;\n                    index[ii * 3 + 2] = d;\n                    ii++;\n                }\n            }\n        }\n\n        Object.assign(attributes, {\n            position: { size: 3, data: position },\n            normal: { size: 3, data: normal },\n            uv: { size: 2, data: uv },\n            index: { data: index },\n        });\n\n        super(gl, attributes);\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\nimport { Vec3 } from '../math/Vec3.js';\n\nexport class Cylinder extends Geometry {\n    constructor(\n        gl,\n        {\n            radiusTop = 0.5,\n            radiusBottom = 0.5,\n            height = 1,\n            radialSegments = 8,\n            heightSegments = 1,\n            openEnded = false,\n            thetaStart = 0,\n            thetaLength = Math.PI * 2,\n            attributes = {},\n        } = {}\n    ) {\n        const rSegs = radialSegments;\n        const hSegs = heightSegments;\n        const tStart = thetaStart;\n        const tLength = thetaLength;\n\n        const numCaps = openEnded ? 0 : radiusBottom \u0026\u0026 radiusTop ? 2 : 1;\n        const num = (rSegs + 1) * (hSegs + 1 + numCaps) + numCaps;\n        const numIndices = rSegs * hSegs * 6 + numCaps * rSegs * 3;\n\n        const position = new Float32Array(num * 3);\n        const normal = new Float32Array(num * 3);\n        const uv = new Float32Array(num * 2);\n        const index = num \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        let i = 0;\n        let ii = 0;\n        const indexArray = [];\n\n        addHeight();\n        if (!openEnded) {\n            if (radiusTop) addCap(true);\n            if (radiusBottom) addCap(false);\n        }\n\n        function addHeight() {\n            let x, y;\n            const n = new Vec3();\n            const slope = (radiusBottom - radiusTop) / height;\n\n            for (y = 0; y \u003c= hSegs; y++) {\n                const indexRow = [];\n                const v = y / hSegs;\n\n                const r = v * (radiusBottom - radiusTop) + radiusTop;\n                for (x = 0; x \u003c= rSegs; x++) {\n                    const u = x / rSegs;\n                    const theta = u * tLength + tStart;\n                    const sinTheta = Math.sin(theta);\n                    const cosTheta = Math.cos(theta);\n\n                    position.set([r * sinTheta, (0.5 - v) * height, r * cosTheta], i * 3);\n                    n.set(sinTheta, slope, cosTheta).normalize();\n                    normal.set([n.x, n.y, n.z], i * 3);\n                    uv.set([u, 1 - v], i * 2);\n                    indexRow.push(i++);\n                }\n                indexArray.push(indexRow);\n            }\n\n            for (x = 0; x \u003c rSegs; x++) {\n                for (y = 0; y \u003c hSegs; y++) {\n                    const a = indexArray[y][x];\n                    const b = indexArray[y + 1][x];\n                    const c = indexArray[y + 1][x + 1];\n                    const d = indexArray[y][x + 1];\n\n                    index.set([a, b, d, b, c, d], ii * 3);\n                    ii += 2;\n                }\n            }\n        }\n\n        function addCap(isTop) {\n            let x;\n            const r = isTop === true ? radiusTop : radiusBottom;\n            const sign = isTop === true ? 1 : -1;\n\n            const centerIndex = i;\n            position.set([0, 0.5 * height * sign, 0], i * 3);\n            normal.set([0, sign, 0], i * 3);\n            uv.set([0.5, 0.5], i * 2);\n            i++;\n\n            for (x = 0; x \u003c= rSegs; x++) {\n                const u = x / rSegs;\n                const theta = u * tLength + tStart;\n                const cosTheta = Math.cos(theta);\n                const sinTheta = Math.sin(theta);\n\n                position.set([r * sinTheta, 0.5 * height * sign, r * cosTheta], i * 3);\n                normal.set([0, sign, 0], i * 3);\n                uv.set([cosTheta * 0.5 + 0.5, sinTheta * 0.5 * sign + 0.5], i * 2);\n                i++;\n            }\n\n            for (x = 0; x \u003c rSegs; x++) {\n                const j = centerIndex + x + 1;\n                if (isTop) {\n                    index.set([j, j + 1, centerIndex], ii * 3);\n                } else {\n                    index.set([j + 1, j, centerIndex], ii * 3);\n                }\n                ii++;\n            }\n        }\n\n        Object.assign(attributes, {\n            position: { size: 3, data: position },\n            normal: { size: 3, data: normal },\n            uv: { size: 2, data: uv },\n            index: { data: index },\n        });\n\n        super(gl, attributes);\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\n\nexport class Triangle extends Geometry {\n    constructor(gl, { attributes = {} } = {}) {\n        Object.assign(attributes, {\n            position: { size: 2, data: new Float32Array([-1, -1, 3, -1, -1, 3]) },\n            uv: { size: 2, data: new Float32Array([0, 0, 2, 0, 0, 2]) },\n        });\n\n        super(gl, attributes);\n    }\n}\n","// https://github.com/mrdoob/three.js/blob/master/src/geometries/TorusGeometry.js\n\nimport { Geometry } from '../core/Geometry.js';\nimport { Vec3 } from '../math/Vec3.js';\n\nexport class Torus extends Geometry {\n    constructor(gl, { radius = 0.5, tube = 0.2, radialSegments = 8, tubularSegments = 6, arc = Math.PI * 2, attributes = {} } = {}) {\n        const num = (radialSegments + 1) * (tubularSegments + 1);\n        const numIndices = radialSegments * tubularSegments * 6;\n\n        const vertices = new Float32Array(num * 3);\n        const normals = new Float32Array(num * 3);\n        const uvs = new Float32Array(num * 2);\n        const indices = num \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        const center = new Vec3();\n        const vertex = new Vec3();\n        const normal = new Vec3();\n\n        // generate vertices, normals and uvs\n        let idx = 0;\n        for (let j = 0; j \u003c= radialSegments; j++) {\n            for (let i = 0; i \u003c= tubularSegments; i++, idx++) {\n                const u = (i / tubularSegments) * arc;\n                const v = (j / radialSegments) * Math.PI * 2;\n\n                // vertex\n                vertex.x = (radius + tube * Math.cos(v)) * Math.cos(u);\n                vertex.y = (radius + tube * Math.cos(v)) * Math.sin(u);\n                vertex.z = tube * Math.sin(v);\n\n                vertices.set([vertex.x, vertex.y, vertex.z], idx * 3);\n\n                // normal\n                center.x = radius * Math.cos(u);\n                center.y = radius * Math.sin(u);\n                normal.sub(vertex, center).normalize();\n\n                normals.set([normal.x, normal.y, normal.z], idx * 3);\n\n                // uv\n                uvs.set([i / tubularSegments, j / radialSegments], idx * 2);\n            }\n        }\n\n        // generate indices\n        idx = 0;\n        for (let j = 1; j \u003c= radialSegments; j++) {\n            for (let i = 1; i \u003c= tubularSegments; i++, idx++) {\n                // indices\n                const a = (tubularSegments + 1) * j + i - 1;\n                const b = (tubularSegments + 1) * (j - 1) + i - 1;\n                const c = (tubularSegments + 1) * (j - 1) + i;\n                const d = (tubularSegments + 1) * j + i;\n\n                // faces\n                indices.set([a, b, d, b, c, d], idx * 6);\n            }\n        }\n\n        Object.assign(attributes, {\n            position: { size: 3, data: vertices },\n            normal: { size: 3, data: normals },\n            uv: { size: 2, data: uvs },\n            index: { data: indices },\n        });\n\n        super(gl, attributes);\n    }\n}\n","// Based from ThreeJS' OrbitControls class, rewritten using es6 with some additions and subtractions.\n// TODO: abstract event handlers so can be fed from other sources\n// TODO: make scroll zoom more accurate than just \u003e/\u003c zero\n// TODO: be able to pass in new camera position\n\nimport { Vec3 } from '../math/Vec3.js';\nimport { Vec2 } from '../math/Vec2.js';\n\nconst STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, DOLLY_PAN: 3 };\nconst tempVec3 = /* @__PURE__ */ new Vec3();\nconst tempVec2a = /* @__PURE__ */ new Vec2();\nconst tempVec2b = /* @__PURE__ */ new Vec2();\n\nexport function Orbit(\n    object,\n    {\n        element = document,\n        enabled = true,\n        target = new Vec3(),\n        ease = 0.25,\n        inertia = 0.85,\n        enableRotate = true,\n        rotateSpeed = 0.1,\n        autoRotate = false,\n        autoRotateSpeed = 1.0,\n        enableZoom = true,\n        zoomSpeed = 1,\n        zoomStyle = 'dolly',\n        enablePan = true,\n        panSpeed = 0.1,\n        minPolarAngle = 0,\n        maxPolarAngle = Math.PI,\n        minAzimuthAngle = -Infinity,\n        maxAzimuthAngle = Infinity,\n        minDistance = 0,\n        maxDistance = Infinity,\n    } = {}\n) {\n    this.enabled = enabled;\n    this.target = target;\n    this.zoomStyle = zoomStyle;\n\n    // Catch attempts to disable - set to 1 so has no effect\n    ease = ease || 1;\n    inertia = inertia || 0;\n\n    this.minDistance = minDistance;\n    this.maxDistance = maxDistance;\n\n    // current position in sphericalTarget coordinates\n    const sphericalDelta = { radius: 1, phi: 0, theta: 0 };\n    const sphericalTarget = { radius: 1, phi: 0, theta: 0 };\n    const spherical = { radius: 1, phi: 0, theta: 0 };\n    const panDelta = new Vec3();\n\n    // Grab initial position values\n    const offset = new Vec3();\n    offset.copy(object.position).sub(this.target);\n    spherical.radius = sphericalTarget.radius = offset.distance();\n    spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z);\n    spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1));\n\n    this.offset = offset;\n\n    this.update = () =\u003e {\n        if (autoRotate) {\n            handleAutoRotate();\n        }\n\n        // apply delta\n        sphericalTarget.radius *= sphericalDelta.radius;\n        sphericalTarget.theta += sphericalDelta.theta;\n        sphericalTarget.phi += sphericalDelta.phi;\n\n        // apply boundaries\n        sphericalTarget.theta = Math.max(minAzimuthAngle, Math.min(maxAzimuthAngle, sphericalTarget.theta));\n        sphericalTarget.phi = Math.max(minPolarAngle, Math.min(maxPolarAngle, sphericalTarget.phi));\n        sphericalTarget.radius = Math.max(this.minDistance, Math.min(this.maxDistance, sphericalTarget.radius));\n\n        // ease values\n        spherical.phi += (sphericalTarget.phi - spherical.phi) * ease;\n        spherical.theta += (sphericalTarget.theta - spherical.theta) * ease;\n        spherical.radius += (sphericalTarget.radius - spherical.radius) * ease;\n\n        // apply pan to target. As offset is relative to target, it also shifts\n        this.target.add(panDelta);\n\n        // apply rotation to offset\n        let sinPhiRadius = spherical.radius * Math.sin(Math.max(0.000001, spherical.phi));\n        offset.x = sinPhiRadius * Math.sin(spherical.theta);\n        offset.y = spherical.radius * Math.cos(spherical.phi);\n        offset.z = sinPhiRadius * Math.cos(spherical.theta);\n\n        // Apply updated values to object\n        object.position.copy(this.target).add(offset);\n        object.lookAt(this.target);\n\n        // Apply inertia to values\n        sphericalDelta.theta *= inertia;\n        sphericalDelta.phi *= inertia;\n        panDelta.multiply(inertia);\n\n        // Reset scale every frame to avoid applying scale multiple times\n        sphericalDelta.radius = 1;\n    };\n\n    // Updates internals with new position\n    this.forcePosition = () =\u003e {\n        offset.copy(object.position).sub(this.target);\n        spherical.radius = sphericalTarget.radius = offset.distance();\n        spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z);\n        spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1));\n        object.lookAt(this.target);\n    };\n\n    // Everything below here just updates panDelta and sphericalDelta\n    // Using those two objects' values, the orbit is calculated\n\n    const rotateStart = new Vec2();\n    const panStart = new Vec2();\n    const dollyStart = new Vec2();\n\n    let state = STATE.NONE;\n    this.mouseButtons = { ORBIT: 0, ZOOM: 1, PAN: 2 };\n\n    function getZoomScale() {\n        return Math.pow(0.95, zoomSpeed);\n    }\n\n    function panLeft(distance, m) {\n        tempVec3.set(m[0], m[1], m[2]);\n        tempVec3.multiply(-distance);\n        panDelta.add(tempVec3);\n    }\n\n    function panUp(distance, m) {\n        tempVec3.set(m[4], m[5], m[6]);\n        tempVec3.multiply(distance);\n        panDelta.add(tempVec3);\n    }\n\n    const pan = (deltaX, deltaY) =\u003e {\n        let el = element === document ? document.body : element;\n        tempVec3.copy(object.position).sub(this.target);\n        let targetDistance = tempVec3.distance();\n        targetDistance *= Math.tan((((object.fov || 45) / 2) * Math.PI) / 180.0);\n        panLeft((2 * deltaX * targetDistance) / el.clientHeight, object.matrix);\n        panUp((2 * deltaY * targetDistance) / el.clientHeight, object.matrix);\n    };\n\n    const dolly = (dollyScale) =\u003e {\n        if (this.zoomStyle === 'dolly') sphericalDelta.radius /= dollyScale;\n        else {\n            object.fov /= dollyScale;\n            if (object.type === 'orthographic') object.orthographic();\n            else object.perspective();\n        }\n    };\n\n    function handleAutoRotate() {\n        const angle = ((2 * Math.PI) / 60 / 60) * autoRotateSpeed;\n        sphericalDelta.theta -= angle;\n    }\n\n    function handleMoveRotate(x, y) {\n        tempVec2a.set(x, y);\n        tempVec2b.sub(tempVec2a, rotateStart).multiply(rotateSpeed);\n        let el = element === document ? document.body : element;\n        sphericalDelta.theta -= (2 * Math.PI * tempVec2b.x) / el.clientHeight;\n        sphericalDelta.phi -= (2 * Math.PI * tempVec2b.y) / el.clientHeight;\n        rotateStart.copy(tempVec2a);\n    }\n\n    function handleMouseMoveDolly(e) {\n        tempVec2a.set(e.clientX, e.clientY);\n        tempVec2b.sub(tempVec2a, dollyStart);\n        if (tempVec2b.y \u003e 0) {\n            dolly(getZoomScale());\n        } else if (tempVec2b.y \u003c 0) {\n            dolly(1 / getZoomScale());\n        }\n        dollyStart.copy(tempVec2a);\n    }\n\n    function handleMovePan(x, y) {\n        tempVec2a.set(x, y);\n        tempVec2b.sub(tempVec2a, panStart).multiply(panSpeed);\n        pan(tempVec2b.x, tempVec2b.y);\n        panStart.copy(tempVec2a);\n    }\n\n    function handleTouchStartDollyPan(e) {\n        if (enableZoom) {\n            let dx = e.touches[0].pageX - e.touches[1].pageX;\n            let dy = e.touches[0].pageY - e.touches[1].pageY;\n            let distance = Math.sqrt(dx * dx + dy * dy);\n            dollyStart.set(0, distance);\n        }\n\n        if (enablePan) {\n            let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX);\n            let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY);\n            panStart.set(x, y);\n        }\n    }\n\n    function handleTouchMoveDollyPan(e) {\n        if (enableZoom) {\n            let dx = e.touches[0].pageX - e.touches[1].pageX;\n            let dy = e.touches[0].pageY - e.touches[1].pageY;\n            let distance = Math.sqrt(dx * dx + dy * dy);\n            tempVec2a.set(0, distance);\n            tempVec2b.set(0, Math.pow(tempVec2a.y / dollyStart.y, zoomSpeed));\n            dolly(tempVec2b.y);\n            dollyStart.copy(tempVec2a);\n        }\n\n        if (enablePan) {\n            let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX);\n            let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY);\n            handleMovePan(x, y);\n        }\n    }\n\n    const onMouseDown = (e) =\u003e {\n        if (!this.enabled) return;\n\n        switch (e.button) {\n            case this.mouseButtons.ORBIT:\n                if (enableRotate === false) return;\n                rotateStart.set(e.clientX, e.clientY);\n                state = STATE.ROTATE;\n                break;\n            case this.mouseButtons.ZOOM:\n                if (enableZoom === false) return;\n                dollyStart.set(e.clientX, e.clientY);\n                state = STATE.DOLLY;\n                break;\n            case this.mouseButtons.PAN:\n                if (enablePan === false) return;\n                panStart.set(e.clientX, e.clientY);\n                state = STATE.PAN;\n                break;\n        }\n\n        if (state !== STATE.NONE) {\n            window.addEventListener('mousemove', onMouseMove, false);\n            window.addEventListener('mouseup', onMouseUp, false);\n        }\n    };\n\n    const onMouseMove = (e) =\u003e {\n        if (!this.enabled) return;\n\n        switch (state) {\n            case STATE.ROTATE:\n                if (enableRotate === false) return;\n                handleMoveRotate(e.clientX, e.clientY);\n                break;\n            case STATE.DOLLY:\n                if (enableZoom === false) return;\n                handleMouseMoveDolly(e);\n                break;\n            case STATE.PAN:\n                if (enablePan === false) return;\n                handleMovePan(e.clientX, e.clientY);\n                break;\n        }\n    };\n\n    const onMouseUp = () =\u003e {\n        window.removeEventListener('mousemove', onMouseMove, false);\n        window.removeEventListener('mouseup', onMouseUp, false);\n        state = STATE.NONE;\n    };\n\n    const onMouseWheel = (e) =\u003e {\n        if (!this.enabled || !enableZoom || (state !== STATE.NONE \u0026\u0026 state !== STATE.ROTATE)) return;\n        e.stopPropagation();\n        e.preventDefault();\n\n        if (e.deltaY \u003c 0) {\n            dolly(1 / getZoomScale());\n        } else if (e.deltaY \u003e 0) {\n            dolly(getZoomScale());\n        }\n    };\n\n    const onTouchStart = (e) =\u003e {\n        if (!this.enabled) return;\n        e.preventDefault();\n\n        switch (e.touches.length) {\n            case 1:\n                if (enableRotate === false) return;\n                rotateStart.set(e.touches[0].pageX, e.touches[0].pageY);\n                state = STATE.ROTATE;\n                break;\n            case 2:\n                if (enableZoom === false \u0026\u0026 enablePan === false) return;\n                handleTouchStartDollyPan(e);\n                state = STATE.DOLLY_PAN;\n                break;\n            default:\n                state = STATE.NONE;\n        }\n    };\n\n    const onTouchMove = (e) =\u003e {\n        if (!this.enabled) return;\n        e.preventDefault();\n        e.stopPropagation();\n\n        switch (e.touches.length) {\n            case 1:\n                if (enableRotate === false) return;\n                handleMoveRotate(e.touches[0].pageX, e.touches[0].pageY);\n                break;\n            case 2:\n                if (enableZoom === false \u0026\u0026 enablePan === false) return;\n                handleTouchMoveDollyPan(e);\n                break;\n            default:\n                state = STATE.NONE;\n        }\n    };\n\n    const onTouchEnd = () =\u003e {\n        if (!this.enabled) return;\n        state = STATE.NONE;\n    };\n\n    const onContextMenu = (e) =\u003e {\n        if (!this.enabled) return;\n        e.preventDefault();\n    };\n\n    function addHandlers() {\n        element.addEventListener('contextmenu', onContextMenu, false);\n        element.addEventListener('mousedown', onMouseDown, false);\n        element.addEventListener('wheel', onMouseWheel, { passive: false });\n        element.addEventListener('touchstart', onTouchStart, { passive: false });\n        element.addEventListener('touchend', onTouchEnd, false);\n        element.addEventListener('touchmove', onTouchMove, { passive: false });\n    }\n\n    this.remove = function () {\n        element.removeEventListener('contextmenu', onContextMenu);\n        element.removeEventListener('mousedown', onMouseDown);\n        element.removeEventListener('wheel', onMouseWheel);\n        element.removeEventListener('touchstart', onTouchStart);\n        element.removeEventListener('touchend', onTouchEnd);\n        element.removeEventListener('touchmove', onTouchMove);\n        window.removeEventListener('mousemove', onMouseMove);\n        window.removeEventListener('mouseup', onMouseUp);\n    };\n\n    addHandlers();\n}\n","// TODO: barycentric code shouldn't be here, but where?\n// TODO: SphereCast?\n\nimport { Vec2 } from '../math/Vec2.js';\nimport { Vec3 } from '../math/Vec3.js';\nimport { Mat4 } from '../math/Mat4.js';\n\nconst tempVec2a = /* @__PURE__ */ new Vec2();\nconst tempVec2b = /* @__PURE__ */ new Vec2();\nconst tempVec2c = /* @__PURE__ */ new Vec2();\n\nconst tempVec3a = /* @__PURE__ */ new Vec3();\nconst tempVec3b = /* @__PURE__ */ new Vec3();\nconst tempVec3c = /* @__PURE__ */ new Vec3();\nconst tempVec3d = /* @__PURE__ */ new Vec3();\nconst tempVec3e = /* @__PURE__ */ new Vec3();\nconst tempVec3f = /* @__PURE__ */ new Vec3();\nconst tempVec3g = /* @__PURE__ */ new Vec3();\nconst tempVec3h = /* @__PURE__ */ new Vec3();\nconst tempVec3i = /* @__PURE__ */ new Vec3();\nconst tempVec3j = /* @__PURE__ */ new Vec3();\nconst tempVec3k = /* @__PURE__ */ new Vec3();\n\nconst tempMat4 = /* @__PURE__ */ new Mat4();\n\nexport class Raycast {\n    constructor() {\n        this.origin = new Vec3();\n        this.direction = new Vec3();\n    }\n\n    // Set ray from mouse unprojection\n    castMouse(camera, mouse = [0, 0]) {\n        if (camera.type === 'orthographic') {\n            // Set origin\n            // Since camera is orthographic, origin is not the camera position\n            const { left, right, bottom, top, zoom } = camera;\n            const x = left / zoom + ((right - left) / zoom) * (mouse[0] * 0.5 + 0.5);\n            const y = bottom / zoom + ((top - bottom) / zoom) * (mouse[1] * 0.5 + 0.5);\n            this.origin.set(x, y, 0);\n            this.origin.applyMatrix4(camera.worldMatrix);\n\n            // Set direction\n            // https://community.khronos.org/t/get-direction-from-transformation-matrix-or-quat/65502/2\n            this.direction.x = -camera.worldMatrix[8];\n            this.direction.y = -camera.worldMatrix[9];\n            this.direction.z = -camera.worldMatrix[10];\n        } else {\n            // Set origin\n            camera.worldMatrix.getTranslation(this.origin);\n\n            // Set direction\n            this.direction.set(mouse[0], mouse[1], 0.5);\n            camera.unproject(this.direction);\n            this.direction.sub(this.origin).normalize();\n        }\n    }\n\n    intersectBounds(meshes, { maxDistance, output = [] } = {}) {\n        if (!Array.isArray(meshes)) meshes = [meshes];\n\n        const invWorldMat4 = tempMat4;\n        const origin = tempVec3a;\n        const direction = tempVec3b;\n\n        const hits = output;\n        hits.length = 0;\n\n        meshes.forEach((mesh) =\u003e {\n            // Create bounds\n            if (!mesh.geometry.bounds || mesh.geometry.bounds.radius === Infinity) mesh.geometry.computeBoundingSphere();\n            const bounds = mesh.geometry.bounds;\n            invWorldMat4.inverse(mesh.worldMatrix);\n\n            // Get max distance locally\n            let localMaxDistance;\n            if (maxDistance) {\n                direction.copy(this.direction).scaleRotateMatrix4(invWorldMat4);\n                localMaxDistance = maxDistance * direction.len();\n            }\n\n            // Take world space ray and make it object space to align with bounding box\n            origin.copy(this.origin).applyMatrix4(invWorldMat4);\n            direction.copy(this.direction).transformDirection(invWorldMat4);\n\n            // Break out early if bounds too far away from origin\n            if (maxDistance) {\n                if (origin.distance(bounds.center) - bounds.radius \u003e localMaxDistance) return;\n            }\n\n            let localDistance = 0;\n\n            // Check origin isn't inside bounds before testing intersection\n            if (mesh.geometry.raycast === 'sphere') {\n                if (origin.distance(bounds.center) \u003e bounds.radius) {\n                    localDistance = this.intersectSphere(bounds, origin, direction);\n                    if (!localDistance) return;\n                }\n            } else {\n                if (\n                    origin.x \u003c bounds.min.x ||\n                    origin.x \u003e bounds.max.x ||\n                    origin.y \u003c bounds.min.y ||\n                    origin.y \u003e bounds.max.y ||\n                    origin.z \u003c bounds.min.z ||\n                    origin.z \u003e bounds.max.z\n                ) {\n                    localDistance = this.intersectBox(bounds, origin, direction);\n                    if (!localDistance) return;\n                }\n            }\n\n            if (maxDistance \u0026\u0026 localDistance \u003e localMaxDistance) return;\n\n            // Create object on mesh to avoid generating lots of objects\n            if (!mesh.hit) mesh.hit = { localPoint: new Vec3(), point: new Vec3() };\n\n            mesh.hit.localPoint.copy(direction).multiply(localDistance).add(origin);\n            mesh.hit.point.copy(mesh.hit.localPoint).applyMatrix4(mesh.worldMatrix);\n            mesh.hit.distance = mesh.hit.point.distance(this.origin);\n\n            hits.push(mesh);\n        });\n\n        hits.sort((a, b) =\u003e a.hit.distance - b.hit.distance);\n        return hits;\n    }\n\n    intersectMeshes(meshes, { cullFace = true, maxDistance, includeUV = true, includeNormal = true, output = [] } = {}) {\n        // Test bounds first before testing geometry\n        const hits = this.intersectBounds(meshes, { maxDistance, output });\n        if (!hits.length) return hits;\n\n        const invWorldMat4 = tempMat4;\n        const origin = tempVec3a;\n        const direction = tempVec3b;\n        const a = tempVec3c;\n        const b = tempVec3d;\n        const c = tempVec3e;\n        const closestFaceNormal = tempVec3f;\n        const faceNormal = tempVec3g;\n        const barycoord = tempVec3h;\n        const uvA = tempVec2a;\n        const uvB = tempVec2b;\n        const uvC = tempVec2c;\n\n        for (let i = hits.length - 1; i \u003e= 0; i--) {\n            const mesh = hits[i];\n            invWorldMat4.inverse(mesh.worldMatrix);\n\n            // Get max distance locally\n            let localMaxDistance;\n            if (maxDistance) {\n                direction.copy(this.direction).scaleRotateMatrix4(invWorldMat4);\n                localMaxDistance = maxDistance * direction.len();\n            }\n\n            // Take world space ray and make it object space to align with bounding box\n            origin.copy(this.origin).applyMatrix4(invWorldMat4);\n            direction.copy(this.direction).transformDirection(invWorldMat4);\n\n            let localDistance = 0;\n            let closestA, closestB, closestC;\n\n            const geometry = mesh.geometry;\n            const attributes = geometry.attributes;\n            const index = attributes.index;\n            const position = attributes.position;\n\n            const start = Math.max(0, geometry.drawRange.start);\n            const end = Math.min(index ? index.count : position.count, geometry.drawRange.start + geometry.drawRange.count);\n            // Data loaded shouldn't haave stride, only buffers\n            // const stride = position.stride ? position.stride / position.data.BYTES_PER_ELEMENT : position.size;\n            const stride = position.size;\n\n            for (let j = start; j \u003c end; j += 3) {\n                // Position attribute indices for each triangle\n                const ai = index ? index.data[j] : j;\n                const bi = index ? index.data[j + 1] : j + 1;\n                const ci = index ? index.data[j + 2] : j + 2;\n\n                a.fromArray(position.data, ai * stride);\n                b.fromArray(position.data, bi * stride);\n                c.fromArray(position.data, ci * stride);\n\n                const distance = this.intersectTriangle(a, b, c, cullFace, origin, direction, faceNormal);\n                if (!distance) continue;\n\n                // Too far away\n                if (maxDistance \u0026\u0026 distance \u003e localMaxDistance) continue;\n\n                if (!localDistance || distance \u003c localDistance) {\n                    localDistance = distance;\n                    closestA = ai;\n                    closestB = bi;\n                    closestC = ci;\n                    closestFaceNormal.copy(faceNormal);\n                }\n            }\n\n            if (!localDistance) hits.splice(i, 1);\n\n            // Update hit values from bounds-test\n            mesh.hit.localPoint.copy(direction).multiply(localDistance).add(origin);\n            mesh.hit.point.copy(mesh.hit.localPoint).applyMatrix4(mesh.worldMatrix);\n            mesh.hit.distance = mesh.hit.point.distance(this.origin);\n\n            // Add unique hit objects on mesh to avoid generating lots of objects\n            if (!mesh.hit.faceNormal) {\n                mesh.hit.localFaceNormal = new Vec3();\n                mesh.hit.faceNormal = new Vec3();\n                mesh.hit.uv = new Vec2();\n                mesh.hit.localNormal = new Vec3();\n                mesh.hit.normal = new Vec3();\n            }\n\n            // Add face normal data which is already computed\n            mesh.hit.localFaceNormal.copy(closestFaceNormal);\n            mesh.hit.faceNormal.copy(mesh.hit.localFaceNormal).transformDirection(mesh.worldMatrix);\n\n            // Optional data, opt out to optimise a bit if necessary\n            if (includeUV || includeNormal) {\n                // Calculate barycoords to find uv values at hit point\n                a.fromArray(position.data, closestA * 3);\n                b.fromArray(position.data, closestB * 3);\n                c.fromArray(position.data, closestC * 3);\n                this.getBarycoord(mesh.hit.localPoint, a, b, c, barycoord);\n            }\n\n            if (includeUV \u0026\u0026 attributes.uv) {\n                uvA.fromArray(attributes.uv.data, closestA * 2);\n                uvB.fromArray(attributes.uv.data, closestB * 2);\n                uvC.fromArray(attributes.uv.data, closestC * 2);\n                mesh.hit.uv.set(\n                    uvA.x * barycoord.x + uvB.x * barycoord.y + uvC.x * barycoord.z,\n                    uvA.y * barycoord.x + uvB.y * barycoord.y + uvC.y * barycoord.z\n                );\n            }\n\n            if (includeNormal \u0026\u0026 attributes.normal) {\n                a.fromArray(attributes.normal.data, closestA * 3);\n                b.fromArray(attributes.normal.data, closestB * 3);\n                c.fromArray(attributes.normal.data, closestC * 3);\n                mesh.hit.localNormal.set(\n                    a.x * barycoord.x + b.x * barycoord.y + c.x * barycoord.z,\n                    a.y * barycoord.x + b.y * barycoord.y + c.y * barycoord.z,\n                    a.z * barycoord.x + b.z * barycoord.y + c.z * barycoord.z\n                );\n\n                mesh.hit.normal.copy(mesh.hit.localNormal).transformDirection(mesh.worldMatrix);\n            }\n        }\n\n        hits.sort((a, b) =\u003e a.hit.distance - b.hit.distance);\n        return hits;\n    }\n\n    intersectPlane(plane, origin = this.origin, direction = this.direction) {\n        const xminp = tempVec3a;\n        xminp.sub(plane.origin, origin);\n\n        const a = xminp.dot(plane.normal);\n        const b = direction.dot(plane.normal);\n        // Assuming we don't want to count a ray parallel to the plane as intersecting\n        if (b == 0) return 0;\n        const delta = a / b;\n        if (delta \u003c= 0) return 0;\n        return origin.add(direction.scale(delta));\n    }\n\n    intersectSphere(sphere, origin = this.origin, direction = this.direction) {\n        const ray = tempVec3c;\n        ray.sub(sphere.center, origin);\n        const tca = ray.dot(direction);\n        const d2 = ray.dot(ray) - tca * tca;\n        const radius2 = sphere.radius * sphere.radius;\n        if (d2 \u003e radius2) return 0;\n        const thc = Math.sqrt(radius2 - d2);\n        const t0 = tca - thc;\n        const t1 = tca + thc;\n        if (t0 \u003c 0 \u0026\u0026 t1 \u003c 0) return 0;\n        if (t0 \u003c 0) return t1;\n        return t0;\n    }\n\n    // Ray AABB - Ray Axis aligned bounding box testing\n    intersectBox(box, origin = this.origin, direction = this.direction) {\n        let tmin, tmax, tYmin, tYmax, tZmin, tZmax;\n        const invdirx = 1 / direction.x;\n        const invdiry = 1 / direction.y;\n        const invdirz = 1 / direction.z;\n        const min = box.min;\n        const max = box.max;\n        tmin = ((invdirx \u003e= 0 ? min.x : max.x) - origin.x) * invdirx;\n        tmax = ((invdirx \u003e= 0 ? max.x : min.x) - origin.x) * invdirx;\n        tYmin = ((invdiry \u003e= 0 ? min.y : max.y) - origin.y) * invdiry;\n        tYmax = ((invdiry \u003e= 0 ? max.y : min.y) - origin.y) * invdiry;\n        if (tmin \u003e tYmax || tYmin \u003e tmax) return 0;\n        if (tYmin \u003e tmin) tmin = tYmin;\n        if (tYmax \u003c tmax) tmax = tYmax;\n        tZmin = ((invdirz \u003e= 0 ? min.z : max.z) - origin.z) * invdirz;\n        tZmax = ((invdirz \u003e= 0 ? max.z : min.z) - origin.z) * invdirz;\n        if (tmin \u003e tZmax || tZmin \u003e tmax) return 0;\n        if (tZmin \u003e tmin) tmin = tZmin;\n        if (tZmax \u003c tmax) tmax = tZmax;\n        if (tmax \u003c 0) return 0;\n        return tmin \u003e= 0 ? tmin : tmax;\n    }\n\n    intersectTriangle(a, b, c, backfaceCulling = true, origin = this.origin, direction = this.direction, normal = tempVec3g) {\n        // from https://github.com/mrdoob/three.js/blob/master/src/math/Ray.js\n        // which is from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n        const edge1 = tempVec3h;\n        const edge2 = tempVec3i;\n        const diff = tempVec3j;\n        edge1.sub(b, a);\n        edge2.sub(c, a);\n        normal.cross(edge1, edge2);\n        let DdN = direction.dot(normal);\n        if (!DdN) return 0;\n        let sign;\n        if (DdN \u003e 0) {\n            if (backfaceCulling) return 0;\n            sign = 1;\n        } else {\n            sign = -1;\n            DdN = -DdN;\n        }\n        diff.sub(origin, a);\n        let DdQxE2 = sign * direction.dot(edge2.cross(diff, edge2));\n        if (DdQxE2 \u003c 0) return 0;\n        let DdE1xQ = sign * direction.dot(edge1.cross(diff));\n        if (DdE1xQ \u003c 0) return 0;\n        if (DdQxE2 + DdE1xQ \u003e DdN) return 0;\n        let QdN = -sign * diff.dot(normal);\n        if (QdN \u003c 0) return 0;\n        return QdN / DdN;\n    }\n\n    getBarycoord(point, a, b, c, target = tempVec3h) {\n        // From https://github.com/mrdoob/three.js/blob/master/src/math/Triangle.js\n        // static/instance method to calculate barycentric coordinates\n        // based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n        const v0 = tempVec3i;\n        const v1 = tempVec3j;\n        const v2 = tempVec3k;\n        v0.sub(c, a);\n        v1.sub(b, a);\n        v2.sub(point, a);\n        const dot00 = v0.dot(v0);\n        const dot01 = v0.dot(v1);\n        const dot02 = v0.dot(v2);\n        const dot11 = v1.dot(v1);\n        const dot12 = v1.dot(v2);\n        const denom = dot00 * dot11 - dot01 * dot01;\n        if (denom === 0) return target.set(-2, -1, -1);\n        const invDenom = 1 / denom;\n        const u = (dot11 * dot02 - dot01 * dot12) * invDenom;\n        const v = (dot00 * dot12 - dot01 * dot02) * invDenom;\n        return target.set(1 - u - v, v, u);\n    }\n}\n","import { Vec3 } from '../math/Vec3.js';\n\nconst CATMULLROM = 'catmullrom';\nconst CUBICBEZIER = 'cubicbezier';\nconst QUADRATICBEZIER = 'quadraticbezier';\n\n// temp\nconst _a0 = /* @__PURE__ */ new Vec3(),\n    _a1 = /* @__PURE__ */ new Vec3(),\n    _a2 = /* @__PURE__ */ new Vec3(),\n    _a3 = /* @__PURE__ */ new Vec3();\n\n/**\n * Get the control points of cubic bezier curve.\n * @param {*} i\n * @param {*} a\n * @param {*} b\n */\nfunction getCtrlPoint(points, i, a = 0.168, b = 0.168) {\n    if (i \u003c 1) {\n        _a0.sub(points[1], points[0]).scale(a).add(points[0]);\n    } else {\n        _a0.sub(points[i + 1], points[i - 1])\n            .scale(a)\n            .add(points[i]);\n    }\n    if (i \u003e points.length - 3) {\n        const last = points.length - 1;\n        _a1.sub(points[last - 1], points[last])\n            .scale(b)\n            .add(points[last]);\n    } else {\n        _a1.sub(points[i], points[i + 2])\n            .scale(b)\n            .add(points[i + 1]);\n    }\n    return [_a0.clone(), _a1.clone()];\n}\n\nfunction getQuadraticBezierPoint(t, p0, c0, p1) {\n    const k = 1 - t;\n    _a0.copy(p0).scale(k ** 2);\n    _a1.copy(c0).scale(2 * k * t);\n    _a2.copy(p1).scale(t ** 2);\n    const ret = new Vec3();\n    ret.add(_a0, _a1).add(_a2);\n    return ret;\n}\n\nfunction getCubicBezierPoint(t, p0, c0, c1, p1) {\n    const k = 1 - t;\n    _a0.copy(p0).scale(k ** 3);\n    _a1.copy(c0).scale(3 * k ** 2 * t);\n    _a2.copy(c1).scale(3 * k * t ** 2);\n    _a3.copy(p1).scale(t ** 3);\n    const ret = new Vec3();\n    ret.add(_a0, _a1).add(_a2).add(_a3);\n    return ret;\n}\n\nexport class Curve {\n    constructor({ points = [new Vec3(0, 0, 0), new Vec3(0, 1, 0), new Vec3(1, 1, 0), new Vec3(1, 0, 0)], divisions = 12, type = CATMULLROM } = {}) {\n        this.points = points;\n        this.divisions = divisions;\n        this.type = type;\n    }\n\n    _getQuadraticBezierPoints(divisions = this.divisions) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count \u003c 3) {\n            console.warn('Not enough points provided.');\n            return [];\n        }\n\n        const p0 = this.points[0];\n        let c0 = this.points[1],\n            p1 = this.points[2];\n\n        for (let i = 0; i \u003c= divisions; i++) {\n            const p = getQuadraticBezierPoint(i / divisions, p0, c0, p1);\n            points.push(p);\n        }\n\n        let offset = 3;\n        while (count - offset \u003e 0) {\n            p0.copy(p1);\n            c0 = p1.scale(2).sub(c0);\n            p1 = this.points[offset];\n            for (let i = 1; i \u003c= divisions; i++) {\n                const p = getQuadraticBezierPoint(i / divisions, p0, c0, p1);\n                points.push(p);\n            }\n            offset++;\n        }\n\n        return points;\n    }\n\n    _getCubicBezierPoints(divisions = this.divisions) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count \u003c 4) {\n            console.warn('Not enough points provided.');\n            return [];\n        }\n\n        let p0 = this.points[0],\n            c0 = this.points[1],\n            c1 = this.points[2],\n            p1 = this.points[3];\n\n        for (let i = 0; i \u003c= divisions; i++) {\n            const p = getCubicBezierPoint(i / divisions, p0, c0, c1, p1);\n            points.push(p);\n        }\n\n        let offset = 4;\n        while (count - offset \u003e 1) {\n            p0.copy(p1);\n            c0 = p1.scale(2).sub(c1);\n            c1 = this.points[offset];\n            p1 = this.points[offset + 1];\n            for (let i = 1; i \u003c= divisions; i++) {\n                const p = getCubicBezierPoint(i / divisions, p0, c0, c1, p1);\n                points.push(p);\n            }\n            offset += 2;\n        }\n\n        return points;\n    }\n\n    _getCatmullRomPoints(divisions = this.divisions, a = 0.168, b = 0.168) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count \u003c= 2) {\n            return this.points;\n        }\n\n        let p0;\n        this.points.forEach((p, i) =\u003e {\n            if (i === 0) {\n                p0 = p;\n            } else {\n                const [c0, c1] = getCtrlPoint(this.points, i - 1, a, b);\n                const c = new Curve({\n                    points: [p0, c0, c1, p],\n                    type: CUBICBEZIER,\n                });\n                points.pop();\n                points.push(...c.getPoints(divisions));\n                p0 = p;\n            }\n        });\n\n        return points;\n    }\n\n    getPoints(divisions = this.divisions, a = 0.168, b = 0.168) {\n        const type = this.type;\n\n        if (type === QUADRATICBEZIER) {\n            return this._getQuadraticBezierPoints(divisions);\n        }\n\n        if (type === CUBICBEZIER) {\n            return this._getCubicBezierPoints(divisions);\n        }\n\n        if (type === CATMULLROM) {\n            return this._getCatmullRomPoints(divisions, a, b);\n        }\n\n        return this.points;\n    }\n}\n\nCurve.CATMULLROM = CATMULLROM;\nCurve.CUBICBEZIER = CUBICBEZIER;\nCurve.QUADRATICBEZIER = QUADRATICBEZIER;\n","/**\n * Abstract base class for path segments.\n * This class contains common methods for all segments types.\n */\nexport default class BaseSegment {\n    constructor() {\n        this._len = -1;\n        this.tiltStart = 0;\n        this.tiltEnd = 0;\n    }\n\n    /**\n     * Get segment length.\n     * @returns {number} segment length\n     */\n    getLength() {\n        if (this._len \u003c 0) {\n            this.updateLength();\n        }\n\n        return this._len;\n    }\n\n    /**\n     * Get tilt angle at t\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @returns {number} Tilt angle at t\n     */\n    getTiltAt(t) {\n        return this.tiltStart * (1 - t) * this.tiltEnd * t;\n    }\n\n    /**\n     * Creates a clone of this instance\n     * @returns {BaseSegment} cloned instance\n     */\n    clone() {\n        return new this.constructor().copy(this);\n    }\n\n    /**\n     * Copies another segment object to this instance.\n     * @param {BaseSegment} source reference object\n     * @returns {BaseSegment} copy of source object\n     */\n    copy(source) {\n        this._len = source._len;\n        this.tiltStart = source.tiltStart;\n        this.tiltEnd = source.tiltEnd;\n        return this;\n    }\n}\n","// from https://github.com/Pomax/bezierjs/blob/d19695f3cc3ce383cf38ce4643f467deca7edb92/src/utils.js#L26\n// Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))\nexport const T_VALUES = [\n    -0.0640568928626056260850430826247450385909, 0.0640568928626056260850430826247450385909, -0.1911188674736163091586398207570696318404,\n    0.1911188674736163091586398207570696318404, -0.3150426796961633743867932913198102407864, 0.3150426796961633743867932913198102407864,\n    -0.4337935076260451384870842319133497124524, 0.4337935076260451384870842319133497124524, -0.5454214713888395356583756172183723700107,\n    0.5454214713888395356583756172183723700107, -0.6480936519369755692524957869107476266696, 0.6480936519369755692524957869107476266696,\n    -0.7401241915785543642438281030999784255232, 0.7401241915785543642438281030999784255232, -0.8200019859739029219539498726697452080761,\n    0.8200019859739029219539498726697452080761, -0.8864155270044010342131543419821967550873, 0.8864155270044010342131543419821967550873,\n    -0.9382745520027327585236490017087214496548, 0.9382745520027327585236490017087214496548, -0.9747285559713094981983919930081690617411,\n    0.9747285559713094981983919930081690617411, -0.9951872199970213601799974097007368118745, 0.9951872199970213601799974097007368118745,\n];\n\n// Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)\nexport const C_VALUES = [\n    0.1279381953467521569740561652246953718517, 0.1279381953467521569740561652246953718517, 0.1258374563468282961213753825111836887264,\n    0.1258374563468282961213753825111836887264, 0.121670472927803391204463153476262425607, 0.121670472927803391204463153476262425607,\n    0.1155056680537256013533444839067835598622, 0.1155056680537256013533444839067835598622, 0.1074442701159656347825773424466062227946,\n    0.1074442701159656347825773424466062227946, 0.0976186521041138882698806644642471544279, 0.0976186521041138882698806644642471544279,\n    0.086190161531953275917185202983742667185, 0.086190161531953275917185202983742667185, 0.0733464814110803057340336152531165181193,\n    0.0733464814110803057340336152531165181193, 0.0592985849154367807463677585001085845412, 0.0592985849154367807463677585001085845412,\n    0.0442774388174198061686027482113382288593, 0.0442774388174198061686027482113382288593, 0.0285313886289336631813078159518782864491,\n    0.0285313886289336631813078159518782864491, 0.0123412297999871995468056670700372915759, 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * Convert Degree To Radian\n * @param {number} a Angle in Degrees\n * @returns {number} a Angle in Radians\n */\nexport const toRadian = (a) =\u003e (a * Math.PI) / 180;\n\n/**\n * Convert Radian To Degree\n * @param {number} a Angle in Radians\n * @returns {number} a Angle in Radian\n */\nexport const toDegrees = (a) =\u003e (180 * a) / Math.PI;\n\nexport const clamp = (val, min, max) =\u003e Math.max(min, Math.min(val, max));\nexport const lerp = (t, v0, v1) =\u003e v0 * (t - 1) + v1 * t;\n\n/**\n * Fills a rotation matrix with the given sine and cosine of the angle around the given axis\n * This function helps to avoid inverse trigonometry\n * @param {Mat4} out mat4 receiving operation result\n * @param {Vec3} axis the axis to rotate around. Should be normalized\n * @param {number} sin sine of rotation angle\n * @param {number} cos cosine of rotation angle\n * @returns {Mat4} out\n */\nexport function mat4fromRotationSinCos(out, axis, sin, cos) {\n    const x = axis[0];\n    const y = axis[1];\n    const z = axis[2];\n    const t = 1 - cos;\n\n    out[0] = x * x * t + cos;\n    out[1] = y * x * t + z * sin;\n    out[2] = z * x * t - y * sin;\n    out[3] = 0;\n    out[4] = x * y * t - z * sin;\n    out[5] = y * y * t + cos;\n    out[6] = z * y * t + x * sin;\n    out[7] = 0;\n    out[8] = x * z * t + y * sin;\n    out[9] = y * z * t - x * sin;\n    out[10] = z * z * t + cos;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Rotates the normal and binormal around its tangent by the given angle.\n *\n * see: https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula\n * @param {number} angle rotation angle\n * @param {Vec3} norm unit normal vector\n * @param {Vec3} binorm unit binormal vector\n * @param {Vec3} outNorm optional normal output vector. If not present then normal vector changes in place\n * @param {Vec3} outBinorm optional binormal output vector. If not present then binormal vector changes in place\n */\nexport function rotateNormalBinormal(angle, norm, binorm, outNorm = norm, outBinorm = binorm) {\n    const s = Math.sin(angle);\n    const c = Math.cos(angle);\n\n    const nx = c * norm.x + s * binorm.x;\n    const ny = c * norm.y + s * binorm.y;\n    const nz = c * norm.z + s * binorm.z;\n\n    const bx = c * binorm.x - s * norm.x;\n    const by = c * binorm.y - s * norm.y;\n    const bz = c * binorm.z - s * norm.z;\n\n    outNorm.set(nx, ny, nz);\n    outBinorm.set(bx, by, bz);\n}\n","import BaseSegment from './BaseSegment.js';\nimport { Vec3 } from '../../math/Vec3.js';\nimport { T_VALUES, C_VALUES } from './utils.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\n\nfunction cubicBezier(t, p0, p1, p2, p3) {\n    const k = 1 - t;\n    // prettier-ignore\n    return (\n        (k * k * k * p0) +\n        (3 * k * k * t * p1) +\n        (3 * k * t * t * p2) +\n        (t * t * t * p3)\n    );\n}\n\nfunction cubicBezierDeriv(t, p0, p1, p2, p3) {\n    const k = 1 - t;\n    // prettier-ignore\n    return (\n        (3 * k * k * (p1 - p0)) +\n        (6 * k * t * (p2 - p1)) +\n        (3 * t * t * (p3 - p2))\n    );\n}\n\nexport default class CubicBezierSegment extends BaseSegment {\n    constructor(p0, p1, p2, p3, tiltStart = 0, tiltEnd = 0) {\n        super();\n        this.p0 = p0;\n        this.p1 = p1;\n        this.p2 = p2;\n        this.p3 = p3;\n\n        this.tiltStart = tiltStart;\n        this.tiltEnd = tiltEnd;\n\n        this._len = -1;\n    }\n\n    /**\n     * Updates the segment length. You must call this method every time you change the curve's control points.\n     */\n    updateLength() {\n        // from https://github.com/Pomax/bezierjs/blob/d19695f3cc3ce383cf38ce4643f467deca7edb92/src/utils.js#L265\n        const z = 0.5;\n        const len = T_VALUES.length;\n\n        let sum = 0;\n        for (let i = 0, t; i \u003c len; i++) {\n            t = z * T_VALUES[i] + z;\n            sum += C_VALUES[i] * this.getDerivativeAt(t, tempVec3).len();\n        }\n\n        this._len = z * sum;\n    }\n\n    /**\n     * Get point at relative position in curve according to segment length.\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} Point at relative position\n     */\n    getPointAt(t, out = new Vec3()) {\n        out.x = cubicBezier(t, this.p0.x, this.p1.x, this.p2.x, this.p3.x);\n        out.y = cubicBezier(t, this.p0.y, this.p1.y, this.p2.y, this.p3.y);\n        out.z = cubicBezier(t, this.p0.z, this.p1.z, this.p2.z, this.p3.z);\n        return out;\n    }\n\n    getDerivativeAt(t, out = new Vec3()) {\n        out.x = cubicBezierDeriv(t, this.p0.x, this.p1.x, this.p2.x, this.p3.x);\n        out.y = cubicBezierDeriv(t, this.p0.y, this.p1.y, this.p2.y, this.p3.y);\n        out.z = cubicBezierDeriv(t, this.p0.z, this.p1.z, this.p2.z, this.p3.z);\n        return out;\n    }\n\n    /**\n     * Returns a unit vector tangent at t\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} A unit vector\n     */\n    getTangentAt(t, out = new Vec3()) {\n        return this.getDerivativeAt(t, out).normalize();\n    }\n\n    lastPoint() {\n        return this.p3;\n    }\n}\n","import BaseSegment from './BaseSegment.js';\nimport { Vec3 } from '../../math/Vec3.js';\nimport { T_VALUES, C_VALUES } from './utils.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\n\nfunction quadraticBezier(t, p0, p1, p2) {\n    const k = 1 - t;\n    return k * k * p0 + 2 * k * t * p1 + t * t * p2;\n}\n\nfunction quadraticBezierDeriv(t, p0, p1, p2) {\n    const k = 1 - t;\n    return 2 * k * (p1 - p0) + 2 * t * (p2 - p1);\n}\n\nexport default class QuadraticBezierSegment extends BaseSegment {\n    constructor(p0, p1, p2, tiltStart = 0, tiltEnd = 0) {\n        super();\n        this.p0 = p0;\n        this.p1 = p1;\n        this.p2 = p2;\n\n        this.tiltStart = tiltStart;\n        this.tiltEnd = tiltEnd;\n\n        this._len = -1;\n    }\n\n    /**\n     * Updates the segment length. You must call this method every time you change the curve's control points.\n     */\n    updateLength() {\n        // from https://github.com/Pomax/bezierjs/blob/d19695f3cc3ce383cf38ce4643f467deca7edb92/src/utils.js#L265\n        const z = 0.5;\n        const len = T_VALUES.length;\n\n        let sum = 0;\n        for (let i = 0, t; i \u003c len; i++) {\n            t = z * T_VALUES[i] + z;\n            sum += C_VALUES[i] * this.getDerivativeAt(t, tempVec3).len();\n        }\n\n        this._len = z * sum;\n    }\n\n    /**\n     * Get point at relative position in curve according to segment length.\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} Point at relative position\n     */\n    getPointAt(t, out = new Vec3()) {\n        out.x = quadraticBezier(t, this.p0.x, this.p1.x, this.p2.x);\n        out.y = quadraticBezier(t, this.p0.y, this.p1.y, this.p2.y);\n        out.z = quadraticBezier(t, this.p0.z, this.p1.z, this.p2.z);\n        return out;\n    }\n\n    getDerivativeAt(t, out = new Vec3()) {\n        out.x = quadraticBezierDeriv(t, this.p0.x, this.p1.x, this.p2.x);\n        out.y = quadraticBezierDeriv(t, this.p0.y, this.p1.y, this.p2.y);\n        out.z = quadraticBezierDeriv(t, this.p0.z, this.p1.z, this.p2.z);\n        return out;\n    }\n\n    /**\n     * Returns a unit vector tangent at t\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} A unit vector\n     */\n    getTangentAt(t, out = new Vec3()) {\n        return this.getDerivativeAt(t, out).normalize();\n    }\n\n    lastPoint() {\n        return this.p2;\n    }\n}\n","import BaseSegment from './BaseSegment.js';\nimport { Vec3 } from '../../math/Vec3.js';\nimport { lerp as lerp3 } from '../../math/functions/Vec3Func.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\n\nexport default class LineSegment extends BaseSegment {\n    constructor(p0, p1, tiltStart = 0, tiltEnd = 0) {\n        super();\n        this.p0 = p0;\n        this.p1 = p1;\n\n        this.tiltStart = tiltStart;\n        this.tiltEnd = tiltEnd;\n\n        this._len = -1;\n    }\n\n    /**\n     * Updates the segment length. You must call this method every time you change the curve's control points.\n     */\n    updateLength() {\n        this._len = tempVec3.sub(this.p1, this.p0).len();\n    }\n\n    /**\n     * Get point at relative position in curve according to segment length.\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} Point at relative position\n     */\n    getPointAt(t, out = new Vec3()) {\n        lerp3(out, this.p0, this.p1, t);\n        return out;\n    }\n\n    /**\n     * Returns a unit vector tangent at t\n     * @param {number} t Distance at time t in range [0 .. 1]\n     * @param {Vec3} out Optional Vec3 to output\n     * @returns {Vec3} A unit vector\n     */\n    getTangentAt(t, out = new Vec3()) {\n        return out.sub(this.p1, this.p0).normalize();\n    }\n\n    lastPoint() {\n        return this.p1;\n    }\n}\n","import { Vec3 } from '../../math/Vec3.js';\nimport { Mat4 } from '../../math/Mat4.js';\nimport CubicBezierSegment from './CubicBezierSegment.js';\nimport QuadraticBezierSegment from './QuadraticBezierSegment.js';\nimport LineSegment from './LineSegment.js';\nimport { clamp, toDegrees, toRadian, mat4fromRotationSinCos, rotateNormalBinormal } from './utils.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\nconst tempMat4 = /* @__PURE__ */ new Mat4();\n\nfunction throwIfNullProperty(property, message) {\n    if (this[property] == null) throw new Error(message);\n}\n\nexport class Path {\n    constructor() {\n        this._segments = [];\n        this._lengthOffsets = null;\n        this._totalLength = -1;\n        this._lastPoint = null;\n        this._lastTilt = 0;\n\n        this._assertLastPoint = throwIfNullProperty.bind(this, '_lastPoint', 'Can`t get previous point of curve. Did you forget moveTo command?');\n\n        this.tiltFunction = null;\n    }\n\n    moveTo(p, tilt = 0) {\n        this._totalLength = -1;\n        this._lastPoint = p;\n        this._lastTilt = tilt;\n    }\n\n    bezierCurveTo(cp1, cp2, p, tilt = 0) {\n        this._assertLastPoint();\n        const seg = new CubicBezierSegment(this._lastPoint, cp1, cp2, p, this._lastTilt, tilt);\n        this.addSegment(seg);\n        return this;\n    }\n\n    quadraticCurveTo(cp, p, tilt = 0) {\n        this._assertLastPoint();\n        const seg = new QuadraticBezierSegment(this._lastPoint, cp, p, this._lastTilt, tilt);\n        this.addSegment(seg);\n        return this;\n    }\n\n    lineTo(p, tilt = 0) {\n        this._assertLastPoint();\n        const seg = new LineSegment(this._lastPoint, p, this._lastTilt, tilt);\n        this.addSegment(seg);\n        return this;\n    }\n\n    addSegment(segment) {\n        this._totalLength = -1;\n        this._lastPoint = segment.lastPoint();\n        this._lastTilt = segment.tiltEnd;\n        this._segments.push(segment);\n        return this;\n    }\n\n    getSegments() {\n        return this._segments;\n    }\n\n    updateLength() {\n        const n = this._segments.length;\n        this._lengthOffsets = new Array(n);\n\n        let offset = 0;\n        for (let i = 0; i \u003c n; i++) {\n            this._lengthOffsets[i] = offset;\n            offset += this._segments[i].getLength();\n        }\n\n        this._totalLength = offset;\n    }\n\n    getLength() {\n        if (this._totalLength \u003c 0) {\n            this.updateLength();\n        }\n\n        return this._totalLength;\n    }\n\n    /**\n     * Finding a path segment at a given absolute length distance\n     * @param {number} len absolute length distance\n     * @returns {[number, number]} [_segment index_, _relative segment distance_]\n     */\n    findSegmentIndexAtLength(len) {\n        const totalLength = this.getLength();\n\n        if (len \u003c= 0) {\n            return [0, 0];\n        }\n\n        if (len \u003e= totalLength) {\n            return [this._segments.length - 1, 1];\n        }\n\n        let start = 0;\n        let end = this._lengthOffsets.length - 1;\n        let index = -1;\n        let mid;\n\n        while (start \u003c= end) {\n            mid = Math.ceil((start + end) / 2);\n\n            if (mid === 0 || mid === this._lengthOffsets.length - 1 || (len \u003e= this._lengthOffsets[mid] \u0026\u0026 len \u003c this._lengthOffsets[mid + 1])) {\n                index = mid;\n                break;\n            } else if (len \u003c this._lengthOffsets[mid]) {\n                end = mid - 1;\n            } else {\n                start = mid + 1;\n            }\n        }\n\n        const seg = this._segments[index];\n        const segLen = seg.getLength();\n        const t = (len - this._lengthOffsets[index]) / segLen;\n\n        return [index, t];\n    }\n\n    getPointAtLength(len, out = new Vec3()) {\n        const [i, t] = this.findSegmentIndexAtLength(len);\n        return this._segments[i].getPointAt(t, out);\n    }\n\n    getPointAt(t, out = new Vec3()) {\n        const totalLength = this.getLength();\n        return this.getPointAtLength(t * totalLength, out);\n    }\n\n    getTangentAtLength(len, out = new Vec3()) {\n        const [i, t] = this.findSegmentIndexAtLength(len);\n        return this._segments[i].getTangentAt(t, out);\n    }\n\n    getTangentAt(t, out = new Vec3()) {\n        const totalLength = this.getLength();\n        return this.getTangentAtLength(t * totalLength, out);\n    }\n\n    getTiltAtLength(len) {\n        const [i, t] = this.findSegmentIndexAtLength(len);\n        return this._segments[i].getTiltAt(t);\n    }\n\n    getTiltAt(t) {\n        const totalLength = this.getLength();\n        return this.getTiltAtLength(t * totalLength);\n    }\n\n    /**\n     * Get sequence of points using `getPointAt(t)`\n     * @param {number} divisions number of subdivisions\n     * @returns {Vec3[]} array of points\n     */\n    getPoints(divisions = 64) {\n        const points = new Array(divisions + 1);\n        for (let i = 0; i \u003c= divisions; i++) {\n            points[i] = this.getPointAt(i / divisions);\n        }\n        return points;\n    }\n\n    /**\n     * Generates the Frenet Frames.\n     * See http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n     * @param {number} divisions number of subdivisions\n     * @returns {{tangents: Vec3[], normals: Vec3[], binormals: Vec3[]}} Object with tangents, normals and binormals arrays\n     */\n    computeFrenetFrames(divisions = 64, closed = false) {\n        const tangents = new Array(divisions + 1);\n        const tilts = new Array(divisions + 1);\n\n        const tiltFunction = this.tiltFunction ?? ((a) =\u003e a);\n\n        // compute the tangent vectors and tilt for each segment on the curve\n        const totalLength = this.getLength();\n        for (let i = 0; i \u003c= divisions; i++) {\n            const [si, st] = this.findSegmentIndexAtLength((totalLength * i) / divisions);\n            const segment = this._segments[si];\n            tangents[i] = segment.getTangentAt(st);\n            tilts[i] = tiltFunction(segment.getTiltAt(st), i / divisions, this);\n        }\n\n        const tx = Math.abs(tangents[0].x);\n        const ty = Math.abs(tangents[0].y);\n        const tz = Math.abs(tangents[0].z);\n\n        const normal = new Vec3();\n        if (tx \u003c ty \u0026\u0026 tx \u003c tz) {\n            normal.set(1, 0, 0);\n        } else if (ty \u003c tx \u0026\u0026 ty \u003c tz) {\n            normal.set(0, 1, 0);\n        } else {\n            normal.set(0, 0, 1);\n        }\n\n        // select an initial normal vector perpendicular to the first tangent vector,\n        // and in the direction of the minimum tangent xyz component\n        const normals = new Array(divisions + 1);\n        const binormals = new Array(divisions + 1);\n        normals[0] = new Vec3();\n        binormals[0] = new Vec3();\n\n        tempVec3.cross(tangents[0], normal).normalize();\n        normals[0].cross(tangents[0], tempVec3);\n        binormals[0].cross(tangents[0], normals[0]);\n\n        // compute the slowly-varying normal vector for each segment on the curve\n        for (let i = 1; i \u003c tangents.length; i++) {\n            normals[i] = normals[i - 1].clone();\n            binormals[i] = new Vec3();\n\n            tempVec3.cross(tangents[i - 1], tangents[i]);\n            const crossLen = tempVec3.len();\n\n            if (crossLen \u003e Number.EPSILON) {\n                tempVec3.scale(1 / crossLen); // nomalize\n                const cosTheta = clamp(tangents[i - 1].dot(tangents[i]), -1, 1); // clamp for floating pt errors\n                const sinTheta = clamp(crossLen, -1, 1);\n\n                mat4fromRotationSinCos(tempMat4, tempVec3, sinTheta, cosTheta);\n                normals[i].applyMatrix4(tempMat4);\n            }\n\n            binormals[i].cross(tangents[i], normals[i]);\n        }\n\n        // add tilt twisting\n        for (let i = 0; i \u003c tilts.length; i++) {\n            rotateNormalBinormal(toRadian(tilts[i]), normals[i], binormals[i]);\n        }\n\n        // if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n        if (closed === true) {\n            const normalLast = normals[normals.length - 1];\n            let step = Math.acos(clamp(normals[0].dot(normalLast), -1, 1)) / (normals.length - 1);\n\n            if (tangents[0].dot(tempVec3.cross(normals[0], normalLast)) \u003e 0) {\n                step = -step;\n            }\n\n            for (let i = 1; i \u003c normals.length - 1; i++) {\n                const angle = step * i;\n                rotateNormalBinormal(angle, normals[i], binormals[i]);\n                tilts[i] += toDegrees(angle);\n            }\n\n            normals[normals.length - 1] = normals[0].clone();\n            binormals[binormals.length - 1] = binormals[0].clone();\n        }\n\n        return { tangents, normals, binormals, tilts };\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\nimport { Vec3 } from '../math/Vec3.js';\nimport { Vec2 } from '../math/Vec2.js';\n\n// helper variables\nconst vertex = /* @__PURE__ */ new Vec3();\nconst normal = /* @__PURE__ */ new Vec3();\nconst uv = /* @__PURE__ */ new Vec2();\nconst point = /* @__PURE__ */ new Vec3();\n\nexport class Tube extends Geometry {\n    constructor(gl, { path, radius = 1, tubularSegments = 64, radialSegments = 8, closed = false, attributes = {} } = {}) {\n        super(gl, attributes);\n\n        this.path = path;\n        this.radius = radius;\n        this.tubularSegments = tubularSegments;\n        this.radialSegments = radialSegments;\n        this.closed = closed;\n\n        this.frenetFrames = path.computeFrenetFrames(tubularSegments, closed);\n\n        const numVertices = (tubularSegments + 1) * (radialSegments + 1);\n        const numIndices = tubularSegments * radialSegments * 6;\n        this.positions = new Float32Array(numVertices * 3);\n        this.normals = new Float32Array(numVertices * 3);\n        this.uvs = new Float32Array(numVertices * 2);\n        this.indices = numVertices \u003e 65536 ? new Uint32Array(numIndices) : new Uint16Array(numIndices);\n\n        // create buffer data\n        this._generateAttributes();\n        this._generateIndices();\n\n        this.addAttribute('position', { size: 3, data: this.positions });\n        this.addAttribute('normal', { size: 3, data: this.normals });\n        this.addAttribute('uv', { size: 2, data: this.uvs });\n        this.setIndex({ data: this.indices });\n    }\n\n    _generateAttributes() {\n        for (let i = 0; i \u003c= this.tubularSegments; i++) {\n            let ci = i;\n            if (i === this.tubularSegments) {\n                // if the geometry is not closed, generate the last row of vertices and normals\n                // at the regular position on the given path\n                // if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n                ci = this.closed ? 0 : this.tubularSegments;\n            }\n\n            this.path.getPointAt(ci / this.tubularSegments, point);\n            // retrieve corresponding normal and binormal\n            const N = this.frenetFrames.normals[ci];\n            const B = this.frenetFrames.binormals[ci];\n\n            // generate normals and vertices for the current segment\n            for (let j = 0; j \u003c= this.radialSegments; j++) {\n                const v = (j / this.radialSegments) * Math.PI * 2;\n                const sin = Math.sin(v);\n                const cos = -Math.cos(v);\n\n                const idx = i * (this.radialSegments + 1) + j;\n\n                // normal\n                normal.x = cos * N.x + sin * B.x;\n                normal.y = cos * N.y + sin * B.y;\n                normal.z = cos * N.z + sin * B.z;\n                // normal.normalize(); // ???\n                this.normals.set(normal, idx * 3);\n\n                // vertex\n                vertex.x = point.x + this.radius * normal.x;\n                vertex.y = point.y + this.radius * normal.y;\n                vertex.z = point.z + this.radius * normal.z;\n                this.positions.set(vertex, idx * 3);\n\n                // uv\n                uv.x = i / this.tubularSegments;\n                uv.y = j / this.radialSegments;\n                this.uvs.set(uv, idx * 2);\n            }\n        }\n    }\n\n    _generateIndices() {\n        for (let j = 1; j \u003c= this.tubularSegments; j++) {\n            for (let i = 1; i \u003c= this.radialSegments; i++) {\n                const a = (this.radialSegments + 1) * (j - 1) + (i - 1);\n                const b = (this.radialSegments + 1) * j + (i - 1);\n                const c = (this.radialSegments + 1) * j + i;\n                const d = (this.radialSegments + 1) * (j - 1) + i;\n\n                const idx = (j - 1) * this.radialSegments + (i - 1);\n                this.indices.set([a, b, d, b, c, d], idx * 6);\n            }\n        }\n    }\n}\n","import { Program } from '../core/Program.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { RenderTarget } from '../core/RenderTarget.js';\nimport { Triangle } from './Triangle.js';\n\nexport class Post {\n    constructor(\n        gl,\n        {\n            width,\n            height,\n            dpr,\n            wrapS = gl.CLAMP_TO_EDGE,\n            wrapT = gl.CLAMP_TO_EDGE,\n            minFilter = gl.LINEAR,\n            magFilter = gl.LINEAR,\n            geometry = new Triangle(gl),\n            targetOnly = null,\n            depth = true,\n        } = {}\n    ) {\n        this.gl = gl;\n\n        this.passes = [];\n\n        this.geometry = geometry;\n\n        this.uniform = { value: null };\n        this.targetOnly = targetOnly;\n\n        if (dpr) this.dpr = dpr;\n        if (width) this.width = width;\n        if (height) this.height = height;\n\n        dpr = this.dpr || this.gl.renderer.dpr;\n        this.resolutionWidth = Math.floor(this.width || this.gl.renderer.width * dpr);\n        this.resolutionHeight = Math.floor(this.height || this.gl.renderer.height * dpr);\n\n        let options = {\n            dpr: this.dpr,\n            width: this.resolutionWidth,\n            height: this.resolutionHeight,\n            wrapS,\n            wrapT,\n            minFilter,\n            magFilter,\n            depth,\n        };\n\n        const fbo = (this.fbo = {\n            read: new RenderTarget(this.gl, options),\n            write: new RenderTarget(this.gl, options),\n            swap: () =\u003e {\n                let temp = fbo.read;\n                fbo.read = fbo.write;\n                fbo.write = temp;\n            },\n        });\n    }\n\n    addPass({ vertex = defaultVertex, fragment = defaultFragment, uniforms = {}, textureUniform = 'tMap', enabled = true } = {}) {\n        uniforms[textureUniform] = { value: this.fbo.read.texture };\n\n        const program = new Program(this.gl, { vertex, fragment, uniforms });\n        const mesh = new Mesh(this.gl, { geometry: this.geometry, program });\n\n        const pass = {\n            mesh,\n            program,\n            uniforms,\n            enabled,\n            textureUniform,\n        };\n\n        this.passes.push(pass);\n        return pass;\n    }\n\n    resize({ width, height, dpr } = {}) {\n        if (dpr) this.dpr = dpr;\n        if (width) this.width = width;\n        if (height) this.height = height;\n\n        dpr = this.dpr || this.gl.renderer.dpr;\n        this.resolutionWidth = Math.floor(this.width || this.gl.renderer.width * dpr);\n        this.resolutionHeight = Math.floor(this.height || this.gl.renderer.height * dpr);\n\n        this.fbo.read.setSize(this.resolutionWidth, this.resolutionHeight);\n        this.fbo.write.setSize(this.resolutionWidth, this.resolutionHeight);\n    }\n\n    // Uses same arguments as renderer.render, with addition of optional texture passed in to avoid scene render\n    render({ scene, camera, texture, target = null, update = true, sort = true, frustumCull = true, beforePostCallbacks }) {\n        const enabledPasses = this.passes.filter((pass) =\u003e pass.enabled);\n\n        if (!texture) {\n            this.gl.renderer.render({\n                scene,\n                camera,\n                target: enabledPasses.length || (!target \u0026\u0026 this.targetOnly) ? this.fbo.write : target,\n                update,\n                sort,\n                frustumCull,\n            });\n            this.fbo.swap();\n\n            // Callback after rendering scene, but before post effects\n            if (beforePostCallbacks) beforePostCallbacks.forEach((f) =\u003e f \u0026\u0026 f());\n        }\n\n        enabledPasses.forEach((pass, i) =\u003e {\n            pass.mesh.program.uniforms[pass.textureUniform].value = !i \u0026\u0026 texture ? texture : this.fbo.read.texture;\n            this.gl.renderer.render({\n                scene: pass.mesh,\n                target: i === enabledPasses.length - 1 \u0026\u0026 (target || !this.targetOnly) ? target : this.fbo.write,\n                clear: true,\n            });\n            this.fbo.swap();\n        });\n\n        this.uniform.value = this.fbo.read.texture;\n    }\n}\n\nconst defaultVertex = /* glsl */ `\n    attribute vec2 uv;\n    attribute vec2 position;\n\n    varying vec2 vUv;\n\n    void main() {\n        vUv = uv;\n        gl_Position = vec4(position, 0, 1);\n    }\n`;\n\nconst defaultFragment = /* glsl */ `\n    precision highp float;\n\n    uniform sampler2D tMap;\n    varying vec2 vUv;\n\n    void main() {\n        gl_FragColor = texture2D(tMap, vUv);\n    }\n`;\n","import { Vec3 } from '../math/Vec3.js';\nimport { Quat } from '../math/Quat.js';\n\nconst prevPos = /* @__PURE__ */ new Vec3();\nconst prevRot = /* @__PURE__ */ new Quat();\nconst prevScl = /* @__PURE__ */ new Vec3();\n\nconst nextPos = /* @__PURE__ */ new Vec3();\nconst nextRot = /* @__PURE__ */ new Quat();\nconst nextScl = /* @__PURE__ */ new Vec3();\n\nexport class Animation {\n    constructor({ objects, data }) {\n        this.objects = objects;\n        this.data = data;\n        this.elapsed = 0;\n        this.weight = 1;\n        this.duration = data.frames.length - 1;\n    }\n\n    update(totalWeight = 1, isSet) {\n        const weight = isSet ? 1 : this.weight / totalWeight;\n        const elapsed = this.elapsed % this.duration;\n\n        const floorFrame = Math.floor(elapsed);\n        const blend = elapsed - floorFrame;\n        const prevKey = this.data.frames[floorFrame];\n        const nextKey = this.data.frames[(floorFrame + 1) % this.duration];\n\n        this.objects.forEach((object, i) =\u003e {\n            prevPos.fromArray(prevKey.position, i * 3);\n            prevRot.fromArray(prevKey.quaternion, i * 4);\n            prevScl.fromArray(prevKey.scale, i * 3);\n\n            nextPos.fromArray(nextKey.position, i * 3);\n            nextRot.fromArray(nextKey.quaternion, i * 4);\n            nextScl.fromArray(nextKey.scale, i * 3);\n\n            prevPos.lerp(nextPos, blend);\n            prevRot.slerp(nextRot, blend);\n            prevScl.lerp(nextScl, blend);\n\n            object.position.lerp(prevPos, weight);\n            object.quaternion.slerp(prevRot, weight);\n            object.scale.lerp(prevScl, weight);\n        });\n    }\n}\n","import { Mesh } from '../core/Mesh.js';\nimport { Transform } from '../core/Transform.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Texture } from '../core/Texture.js';\nimport { Animation } from './Animation.js';\n\nconst tempMat4 = /* @__PURE__ */ new Mat4();\n\nexport class Skin extends Mesh {\n    constructor(gl, { rig, geometry, program, mode = gl.TRIANGLES } = {}) {\n        super(gl, { geometry, program, mode });\n\n        this.createBones(rig);\n        this.createBoneTexture();\n        this.animations = [];\n\n        Object.assign(this.program.uniforms, {\n            boneTexture: { value: this.boneTexture },\n            boneTextureSize: { value: this.boneTextureSize },\n        });\n    }\n\n    createBones(rig) {\n        // Create root so that can simply update world matrix of whole skeleton\n        this.root = new Transform();\n\n        // Create bones\n        this.bones = [];\n        if (!rig.bones || !rig.bones.length) return;\n        for (let i = 0; i \u003c rig.bones.length; i++) {\n            const bone = new Transform();\n\n            // Set initial values (bind pose)\n            bone.position.fromArray(rig.bindPose.position, i * 3);\n            bone.quaternion.fromArray(rig.bindPose.quaternion, i * 4);\n            bone.scale.fromArray(rig.bindPose.scale, i * 3);\n\n            this.bones.push(bone);\n        }\n\n        // Once created, set the hierarchy\n        rig.bones.forEach((data, i) =\u003e {\n            this.bones[i].name = data.name;\n            if (data.parent === -1) return this.bones[i].setParent(this.root);\n            this.bones[i].setParent(this.bones[data.parent]);\n        });\n\n        // Then update to calculate world matrices\n        this.root.updateMatrixWorld(true);\n\n        // Store inverse of bind pose to calculate differences\n        this.bones.forEach((bone) =\u003e {\n            bone.bindInverse = new Mat4(...bone.worldMatrix).inverse();\n        });\n    }\n\n    createBoneTexture() {\n        if (!this.bones.length) return;\n        const size = Math.max(4, Math.pow(2, Math.ceil(Math.log(Math.sqrt(this.bones.length * 4)) / Math.LN2)));\n        this.boneMatrices = new Float32Array(size * size * 4);\n        this.boneTextureSize = size;\n        this.boneTexture = new Texture(this.gl, {\n            image: this.boneMatrices,\n            generateMipmaps: false,\n            type: this.gl.FLOAT,\n            internalFormat: this.gl.renderer.isWebgl2 ? this.gl.RGBA32F : this.gl.RGBA,\n            minFilter: this.gl.NEAREST,\n            magFilter: this.gl.NEAREST,\n            flipY: false,\n            width: size,\n        });\n    }\n\n    addAnimation(data) {\n        const animation = new Animation({ objects: this.bones, data });\n        this.animations.push(animation);\n        return animation;\n    }\n\n    update() {\n        // Calculate combined animation weight\n        let total = 0;\n        this.animations.forEach((animation) =\u003e (total += animation.weight));\n\n        this.animations.forEach((animation, i) =\u003e {\n            // force first animation to set in order to reset frame\n            animation.update(total, i === 0);\n        });\n    }\n\n    draw({ camera } = {}) {\n        // Update world matrices manually, as not part of scene graph\n        this.root.updateMatrixWorld(true);\n\n        // Update bone texture\n        this.bones.forEach((bone, i) =\u003e {\n            // Find difference between current and bind pose\n            tempMat4.multiply(bone.worldMatrix, bone.bindInverse);\n            this.boneMatrices.set(tempMat4, i * 16);\n        });\n        if (this.boneTexture) this.boneTexture.needsUpdate = true;\n\n        super.draw({ camera });\n    }\n}\n","export function Text({\n    font,\n    text,\n    width = Infinity,\n    align = 'left',\n    size = 1,\n    letterSpacing = 0,\n    lineHeight = 1.4,\n    wordSpacing = 0,\n    wordBreak = false,\n}) {\n    const _this = this;\n    let glyphs, buffers;\n    let fontHeight, baseline, scale;\n\n    const newline = /\\n/;\n    const whitespace = /\\s/;\n\n    {\n        parseFont();\n        createGeometry();\n    }\n\n    function parseFont() {\n        glyphs = {};\n        font.chars.forEach((d) =\u003e (glyphs[d.char] = d));\n    }\n\n    function createGeometry() {\n        fontHeight = font.common.lineHeight;\n        baseline = font.common.base;\n\n        // Use baseline so that actual text height is as close to 'size' value as possible\n        scale = size / baseline;\n\n        // Strip spaces and newlines to get actual character length for buffers\n        let chars = text.replace(/[ \\n]/g, '');\n        let numChars = chars.length;\n\n        // Create output buffers\n        buffers = {\n            position: new Float32Array(numChars * 4 * 3),\n            uv: new Float32Array(numChars * 4 * 2),\n            id: new Float32Array(numChars * 4),\n            index: new Uint16Array(numChars * 6),\n        };\n\n        // Set values for buffers that don't require calculation\n        for (let i = 0; i \u003c numChars; i++) {\n            buffers.id.set([i, i, i, i], i * 4);\n            buffers.index.set([i * 4, i * 4 + 2, i * 4 + 1, i * 4 + 1, i * 4 + 2, i * 4 + 3], i * 6);\n        }\n\n        layout();\n    }\n\n    function layout() {\n        const lines = [];\n\n        let cursor = 0;\n\n        let wordCursor = 0;\n        let wordWidth = 0;\n        let line = newLine();\n\n        function newLine() {\n            const line = {\n                width: 0,\n                glyphs: [],\n            };\n            lines.push(line);\n            wordCursor = cursor;\n            wordWidth = 0;\n            return line;\n        }\n\n        let maxTimes = 100;\n        let count = 0;\n        while (cursor \u003c text.length \u0026\u0026 count \u003c maxTimes) {\n            count++;\n\n            const char = text[cursor];\n\n            // Skip whitespace at start of line\n            if (!line.width \u0026\u0026 whitespace.test(char)) {\n                cursor++;\n                wordCursor = cursor;\n                wordWidth = 0;\n                continue;\n            }\n\n            // If newline char, skip to next line\n            if (newline.test(char)) {\n                cursor++;\n                line = newLine();\n                continue;\n            }\n\n            const glyph = glyphs[char] || glyphs[' '];\n\n            // Find any applicable kern pairs\n            if (line.glyphs.length) {\n                const prevGlyph = line.glyphs[line.glyphs.length - 1][0];\n                let kern = getKernPairOffset(glyph.id, prevGlyph.id) * scale;\n                line.width += kern;\n                wordWidth += kern;\n            }\n\n            // add char to line\n            line.glyphs.push([glyph, line.width]);\n\n            // calculate advance for next glyph\n            let advance = 0;\n\n            // If whitespace, update location of current word for line breaks\n            if (whitespace.test(char)) {\n                wordCursor = cursor;\n                wordWidth = 0;\n\n                // Add wordspacing\n                advance += wordSpacing * size;\n            } else {\n                // Add letterspacing\n                advance += letterSpacing * size;\n            }\n\n            advance += glyph.xadvance * scale;\n\n            line.width += advance;\n            wordWidth += advance;\n\n            // If width defined\n            if (line.width \u003e width) {\n                // If can break words, undo latest glyph if line not empty and create new line\n                if (wordBreak \u0026\u0026 line.glyphs.length \u003e 1) {\n                    line.width -= advance;\n                    line.glyphs.pop();\n                    line = newLine();\n                    continue;\n\n                    // If not first word, undo current word and cursor and create new line\n                } else if (!wordBreak \u0026\u0026 wordWidth !== line.width) {\n                    let numGlyphs = cursor - wordCursor + 1;\n                    line.glyphs.splice(-numGlyphs, numGlyphs);\n                    cursor = wordCursor;\n                    line.width -= wordWidth;\n                    line = newLine();\n                    continue;\n                }\n            }\n\n            cursor++;\n            // Reset infinite loop catch\n            count = 0;\n        }\n\n        // Remove last line if empty\n        if (!line.width) lines.pop();\n\n        populateBuffers(lines);\n    }\n\n    function populateBuffers(lines) {\n        const texW = font.common.scaleW;\n        const texH = font.common.scaleH;\n\n        // For all fonts tested, a little offset was needed to be right on the baseline, hence 0.07.\n        let y = 0.07 * size;\n        let j = 0;\n\n        for (let lineIndex = 0; lineIndex \u003c lines.length; lineIndex++) {\n            let line = lines[lineIndex];\n\n            for (let i = 0; i \u003c line.glyphs.length; i++) {\n                const glyph = line.glyphs[i][0];\n                let x = line.glyphs[i][1];\n\n                if (align === 'center') {\n                    x -= line.width * 0.5;\n                } else if (align === 'right') {\n                    x -= line.width;\n                }\n\n                // If space, don't add to geometry\n                if (whitespace.test(glyph.char)) continue;\n\n                // Apply char sprite offsets\n                x += glyph.xoffset * scale;\n                y -= glyph.yoffset * scale;\n\n                // each letter is a quad. axis bottom left\n                let w = glyph.width * scale;\n                let h = glyph.height * scale;\n                buffers.position.set([x, y - h, 0, x, y, 0, x + w, y - h, 0, x + w, y, 0], j * 4 * 3);\n\n                let u = glyph.x / texW;\n                let uw = glyph.width / texW;\n                let v = 1.0 - glyph.y / texH;\n                let vh = glyph.height / texH;\n                buffers.uv.set([u, v - vh, u, v, u + uw, v - vh, u + uw, v], j * 4 * 2);\n\n                // Reset cursor to baseline\n                y += glyph.yoffset * scale;\n\n                j++;\n            }\n\n            y -= size * lineHeight;\n        }\n\n        _this.buffers = buffers;\n        _this.numLines = lines.length;\n        _this.height = _this.numLines * size * lineHeight;\n        _this.width = Math.max(...lines.map((line) =\u003e line.width));\n    }\n\n    function getKernPairOffset(id1, id2) {\n        for (let i = 0; i \u003c font.kernings.length; i++) {\n            let k = font.kernings[i];\n            if (k.first \u003c id1) continue;\n            if (k.second \u003c id2) continue;\n            if (k.first \u003e id1) return 0;\n            if (k.first === id1 \u0026\u0026 k.second \u003e id2) return 0;\n            return k.amount;\n        }\n        return 0;\n    }\n\n    // Update buffers to layout with new layout\n    this.resize = function (options) {\n        ({ width } = options);\n        layout();\n    };\n\n    // Completely change text (like creating new Text)\n    this.update = function (options) {\n        ({ text } = options);\n        createGeometry();\n    };\n}\n","import { Program } from '../core/Program.js';\n\nconst vertex = /* glsl */ `\n    precision highp float;\n    precision highp int;\n\n    attribute vec3 position;\n    attribute vec3 normal;\n\n    uniform mat3 normalMatrix;\n    uniform mat4 modelViewMatrix;\n    uniform mat4 projectionMatrix;\n\n    varying vec3 vNormal;\n\n    void main() {\n        vNormal = normalize(normalMatrix * normal);\n        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n    }\n`;\n\nconst fragment = /* glsl */ `\n    precision highp float;\n    precision highp int;\n\n    varying vec3 vNormal;\n\n    void main() {\n        gl_FragColor.rgb = normalize(vNormal);\n        gl_FragColor.a = 1.0;\n    }\n`;\n\nexport function NormalProgram(gl) {\n    return new Program(gl, {\n        vertex: vertex,\n        fragment: fragment,\n        cullFace: false,\n    });\n}\n","import { RenderTarget } from '../core/RenderTarget.js';\nimport { Program } from '../core/Program.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { Vec2 } from '../math/Vec2.js';\nimport { Triangle } from './Triangle.js';\n\nexport class Flowmap {\n    constructor(\n        gl,\n        {\n            size = 128, // default size of the render targets\n            falloff = 0.3, // size of the stamp, percentage of the size\n            alpha = 1, // opacity of the stamp\n            dissipation = 0.98, // affects the speed that the stamp fades. Closer to 1 is slower\n            type, // Pass in gl.FLOAT to force it, defaults to gl.HALF_FLOAT\n        } = {}\n    ) {\n        const _this = this;\n        this.gl = gl;\n\n        // output uniform containing render target textures\n        this.uniform = { value: null };\n\n        this.mask = {\n            read: null,\n            write: null,\n\n            // Helper function to ping pong the render targets and update the uniform\n            swap: () =\u003e {\n                let temp = _this.mask.read;\n                _this.mask.read = _this.mask.write;\n                _this.mask.write = temp;\n                _this.uniform.value = _this.mask.read.texture;\n            },\n        };\n\n        {\n            createFBOs();\n\n            this.aspect = 1;\n            this.mouse = new Vec2();\n            this.velocity = new Vec2();\n\n            this.mesh = initProgram();\n        }\n\n        function createFBOs() {\n            // Requested type not supported, fall back to half float\n            if (!type) type = gl.HALF_FLOAT || gl.renderer.extensions['OES_texture_half_float'].HALF_FLOAT_OES;\n\n            let minFilter = (() =\u003e {\n                if (gl.renderer.isWebgl2) return gl.LINEAR;\n                if (gl.renderer.extensions[`OES_texture_${type === gl.FLOAT ? '' : 'half_'}float_linear`]) return gl.LINEAR;\n                return gl.NEAREST;\n            })();\n\n            const options = {\n                width: size,\n                height: size,\n                type,\n                format: gl.RGBA,\n                internalFormat: gl.renderer.isWebgl2 ? (type === gl.FLOAT ? gl.RGBA32F : gl.RGBA16F) : gl.RGBA,\n                minFilter,\n                depth: false,\n            };\n\n            _this.mask.read = new RenderTarget(gl, options);\n            _this.mask.write = new RenderTarget(gl, options);\n            _this.mask.swap();\n        }\n\n        function initProgram() {\n            return new Mesh(gl, {\n                // Triangle that includes -1 to 1 range for 'position', and 0 to 1 range for 'uv'.\n                geometry: new Triangle(gl),\n\n                program: new Program(gl, {\n                    vertex,\n                    fragment,\n                    uniforms: {\n                        tMap: _this.uniform,\n\n                        uFalloff: { value: falloff * 0.5 },\n                        uAlpha: { value: alpha },\n                        uDissipation: { value: dissipation },\n\n                        // User needs to update these\n                        uAspect: { value: 1 },\n                        uMouse: { value: _this.mouse },\n                        uVelocity: { value: _this.velocity },\n                    },\n                    depthTest: false,\n                }),\n            });\n        }\n    }\n\n    update() {\n        this.mesh.program.uniforms.uAspect.value = this.aspect;\n\n        this.gl.renderer.render({\n            scene: this.mesh,\n            target: this.mask.write,\n            clear: false,\n        });\n        this.mask.swap();\n    }\n}\n\nconst vertex = /* glsl */ `\n    attribute vec2 uv;\n    attribute vec2 position;\n\n    varying vec2 vUv;\n\n    void main() {\n        vUv = uv;\n        gl_Position = vec4(position, 0, 1);\n    }\n`;\n\nconst fragment = /* glsl */ `\n    precision highp float;\n\n    uniform sampler2D tMap;\n\n    uniform float uFalloff;\n    uniform float uAlpha;\n    uniform float uDissipation;\n    \n    uniform float uAspect;\n    uniform vec2 uMouse;\n    uniform vec2 uVelocity;\n\n    varying vec2 vUv;\n\n    void main() {\n        vec4 color = texture2D(tMap, vUv) * uDissipation;\n\n        vec2 cursor = vUv - uMouse;\n        cursor.x *= uAspect;\n\n        vec3 stamp = vec3(uVelocity * vec2(1, -1), 1.0 - pow(1.0 - min(1.0, length(uVelocity)), 3.0));\n        float falloff = smoothstep(uFalloff, 0.0, length(cursor)) * uAlpha;\n\n        color.rgb = mix(color.rgb, stamp, vec3(falloff));\n\n        gl_FragColor = color;\n    }\n`;\n","import { Program } from '../core/Program.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { Texture } from '../core/Texture.js';\nimport { RenderTarget } from '../core/RenderTarget.js';\nimport { Triangle } from './Triangle.js';\n\nexport class GPGPU {\n    constructor(\n        gl,\n        {\n            // Always pass in array of vec4s (RGBA values within texture)\n            data = new Float32Array(16),\n            geometry = new Triangle(gl),\n            type, // Pass in gl.FLOAT to force it, defaults to gl.HALF_FLOAT\n        }\n    ) {\n        this.gl = gl;\n        const initialData = data;\n        this.passes = [];\n        this.geometry = geometry;\n        this.dataLength = initialData.length / 4;\n\n        // Windows and iOS only like power of 2 textures\n        // Find smallest PO2 that fits data\n        this.size = Math.pow(2, Math.ceil(Math.log(Math.ceil(Math.sqrt(this.dataLength))) / Math.LN2));\n\n        // Create coords for output texture\n        this.coords = new Float32Array(this.dataLength * 2);\n        for (let i = 0; i \u003c this.dataLength; i++) {\n            const x = (i % this.size) / this.size; // to add 0.5 to be center pixel ?\n            const y = Math.floor(i / this.size) / this.size;\n            this.coords.set([x, y], i * 2);\n        }\n\n        // Use original data if already correct length of PO2 texture, else copy to new array of correct length\n        const floatArray = (() =\u003e {\n            if (initialData.length === this.size * this.size * 4) {\n                return initialData;\n            } else {\n                const a = new Float32Array(this.size * this.size * 4);\n                a.set(initialData);\n                return a;\n            }\n        })();\n\n        // Create output texture uniform using input float texture with initial data\n        this.uniform = {\n            value: new Texture(gl, {\n                image: floatArray,\n                target: gl.TEXTURE_2D,\n                type: gl.FLOAT,\n                format: gl.RGBA,\n                internalFormat: gl.renderer.isWebgl2 ? gl.RGBA32F : gl.RGBA,\n                wrapS: gl.CLAMP_TO_EDGE,\n                wrapT: gl.CLAMP_TO_EDGE,\n                generateMipmaps: false,\n                minFilter: gl.NEAREST,\n                magFilter: gl.NEAREST,\n                width: this.size,\n                flipY: false,\n            }),\n        };\n\n        // Create FBOs\n        const options = {\n            width: this.size,\n            height: this.size,\n            type: type || gl.HALF_FLOAT || gl.renderer.extensions['OES_texture_half_float'].HALF_FLOAT_OES,\n            format: gl.RGBA,\n            internalFormat: gl.renderer.isWebgl2 ? (type === gl.FLOAT ? gl.RGBA32F : gl.RGBA16F) : gl.RGBA,\n            minFilter: gl.NEAREST,\n            depth: false,\n            unpackAlignment: 1,\n        };\n\n        this.fbo = {\n            read: new RenderTarget(gl, options),\n            write: new RenderTarget(gl, options),\n            swap: () =\u003e {\n                let temp = this.fbo.read;\n                this.fbo.read = this.fbo.write;\n                this.fbo.write = temp;\n                this.uniform.value = this.fbo.read.texture;\n            },\n        };\n    }\n\n    addPass({ vertex = defaultVertex, fragment = defaultFragment, uniforms = {}, textureUniform = 'tMap', enabled = true } = {}) {\n        uniforms[textureUniform] = this.uniform;\n        const program = new Program(this.gl, { vertex, fragment, uniforms });\n        const mesh = new Mesh(this.gl, { geometry: this.geometry, program });\n\n        const pass = {\n            mesh,\n            program,\n            uniforms,\n            enabled,\n            textureUniform,\n        };\n\n        this.passes.push(pass);\n        return pass;\n    }\n\n    render() {\n        const enabledPasses = this.passes.filter((pass) =\u003e pass.enabled);\n\n        enabledPasses.forEach((pass, i) =\u003e {\n            this.gl.renderer.render({\n                scene: pass.mesh,\n                target: this.fbo.write,\n                clear: false,\n            });\n            this.fbo.swap();\n        });\n    }\n}\n\nconst defaultVertex = /* glsl */ `\n    attribute vec2 uv;\n    attribute vec2 position;\n\n    varying vec2 vUv;\n\n    void main() {\n        vUv = uv;\n        gl_Position = vec4(position, 0, 1);\n    }\n`;\n\nconst defaultFragment = /* glsl */ `\n    precision highp float;\n\n    uniform sampler2D tMap;\n    varying vec2 vUv;\n\n    void main() {\n        gl_FragColor = texture2D(tMap, vUv);\n    }\n`;\n","import { Geometry } from '../core/Geometry.js';\nimport { Program } from '../core/Program.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { Vec2 } from '../math/Vec2.js';\nimport { Vec3 } from '../math/Vec3.js';\nimport { Color } from '../math/Color.js';\n\nconst tmp = /* @__PURE__ */ new Vec3();\n\nexport class Polyline {\n    constructor(\n        gl,\n        {\n            points, // Array of Vec3s\n            vertex = defaultVertex,\n            fragment = defaultFragment,\n            uniforms = {},\n            attributes = {}, // For passing in custom attribs\n        }\n    ) {\n        this.gl = gl;\n        this.points = points;\n        this.count = points.length;\n\n        // Create buffers\n        this.position = new Float32Array(this.count * 3 * 2);\n        this.prev = new Float32Array(this.count * 3 * 2);\n        this.next = new Float32Array(this.count * 3 * 2);\n        const side = new Float32Array(this.count * 1 * 2);\n        const uv = new Float32Array(this.count * 2 * 2);\n        const index = new Uint16Array((this.count - 1) * 3 * 2);\n\n        // Set static buffers\n        for (let i = 0; i \u003c this.count; i++) {\n            side.set([-1, 1], i * 2);\n            const v = i / (this.count - 1);\n            uv.set([0, v, 1, v], i * 4);\n\n            if (i === this.count - 1) continue;\n            const ind = i * 2;\n            index.set([ind + 0, ind + 1, ind + 2], (ind + 0) * 3);\n            index.set([ind + 2, ind + 1, ind + 3], (ind + 1) * 3);\n        }\n\n        const geometry = (this.geometry = new Geometry(\n            gl,\n            Object.assign(attributes, {\n                position: { size: 3, data: this.position },\n                prev: { size: 3, data: this.prev },\n                next: { size: 3, data: this.next },\n                side: { size: 1, data: side },\n                uv: { size: 2, data: uv },\n                index: { size: 1, data: index },\n            })\n        ));\n\n        // Populate dynamic buffers\n        this.updateGeometry();\n\n        if (!uniforms.uResolution) this.resolution = uniforms.uResolution = { value: new Vec2() };\n        if (!uniforms.uDPR) this.dpr = uniforms.uDPR = { value: 1 };\n        if (!uniforms.uThickness) this.thickness = uniforms.uThickness = { value: 1 };\n        if (!uniforms.uColor) this.color = uniforms.uColor = { value: new Color('#000') };\n        if (!uniforms.uMiter) this.miter = uniforms.uMiter = { value: 1 };\n\n        // Set size uniforms' values\n        this.resize();\n\n        const program = (this.program = new Program(gl, {\n            vertex,\n            fragment,\n            uniforms,\n        }));\n\n        this.mesh = new Mesh(gl, { geometry, program });\n    }\n\n    updateGeometry() {\n        this.points.forEach((p, i) =\u003e {\n            p.toArray(this.position, i * 3 * 2);\n            p.toArray(this.position, i * 3 * 2 + 3);\n\n            if (!i) {\n                // If first point, calculate prev using the distance to 2nd point\n                tmp.copy(p)\n                    .sub(this.points[i + 1])\n                    .add(p);\n                tmp.toArray(this.prev, i * 3 * 2);\n                tmp.toArray(this.prev, i * 3 * 2 + 3);\n            } else {\n                p.toArray(this.next, (i - 1) * 3 * 2);\n                p.toArray(this.next, (i - 1) * 3 * 2 + 3);\n            }\n\n            if (i === this.points.length - 1) {\n                // If last point, calculate next using distance to 2nd last point\n                tmp.copy(p)\n                    .sub(this.points[i - 1])\n                    .add(p);\n                tmp.toArray(this.next, i * 3 * 2);\n                tmp.toArray(this.next, i * 3 * 2 + 3);\n            } else {\n                p.toArray(this.prev, (i + 1) * 3 * 2);\n                p.toArray(this.prev, (i + 1) * 3 * 2 + 3);\n            }\n        });\n\n        this.geometry.attributes.position.needsUpdate = true;\n        this.geometry.attributes.prev.needsUpdate = true;\n        this.geometry.attributes.next.needsUpdate = true;\n    }\n\n    // Only need to call if not handling resolution uniforms manually\n    resize() {\n        // Update automatic uniforms if not overridden\n        if (this.resolution) this.resolution.value.set(this.gl.canvas.width, this.gl.canvas.height);\n        if (this.dpr) this.dpr.value = this.gl.renderer.dpr;\n    }\n}\n\nconst defaultVertex = /* glsl */ `\n    precision highp float;\n\n    attribute vec3 position;\n    attribute vec3 next;\n    attribute vec3 prev;\n    attribute vec2 uv;\n    attribute float side;\n\n    uniform mat4 modelViewMatrix;\n    uniform mat4 projectionMatrix;\n    uniform vec2 uResolution;\n    uniform float uDPR;\n    uniform float uThickness;\n    uniform float uMiter;\n\n    varying vec2 vUv;\n\n    vec4 getPosition() {\n        mat4 mvp = projectionMatrix * modelViewMatrix;\n        vec4 current = mvp * vec4(position, 1);\n        vec4 nextPos = mvp * vec4(next, 1);\n        vec4 prevPos = mvp * vec4(prev, 1);\n\n        vec2 aspect = vec2(uResolution.x / uResolution.y, 1);    \n        vec2 currentScreen = current.xy / current.w * aspect;\n        vec2 nextScreen = nextPos.xy / nextPos.w * aspect;\n        vec2 prevScreen = prevPos.xy / prevPos.w * aspect;\n    \n        vec2 dir1 = normalize(currentScreen - prevScreen);\n        vec2 dir2 = normalize(nextScreen - currentScreen);\n        vec2 dir = normalize(dir1 + dir2);\n    \n        vec2 normal = vec2(-dir.y, dir.x);\n        normal /= mix(1.0, max(0.3, dot(normal, vec2(-dir1.y, dir1.x))), uMiter);\n        normal /= aspect;\n\n        float pixelWidthRatio = 1.0 / (uResolution.y / uDPR);\n        float pixelWidth = current.w * pixelWidthRatio;\n        normal *= pixelWidth * uThickness;\n        current.xy -= normal * side;\n    \n        return current;\n    }\n\n    void main() {\n        vUv = uv;\n        gl_Position = getPosition();\n    }\n`;\n\nconst defaultFragment = /* glsl */ `\n    precision highp float;\n\n    uniform vec3 uColor;\n    \n    varying vec2 vUv;\n\n    void main() {\n        gl_FragColor.rgb = uColor;\n        gl_FragColor.a = 1.0;\n    }\n`;\n","import { Camera } from '../core/Camera.js';\nimport { Program } from '../core/Program.js';\nimport { RenderTarget } from '../core/RenderTarget.js';\n\nexport class Shadow {\n    constructor(gl, { light = new Camera(gl), width = 1024, height = width }) {\n        this.gl = gl;\n\n        this.light = light;\n\n        this.target = new RenderTarget(gl, { width, height });\n        this.targetUniform = { value: this.target.texture };\n\n        this.depthProgram = new Program(gl, {\n            vertex: defaultVertex,\n            fragment: defaultFragment,\n            cullFace: false,\n        });\n\n        this.castMeshes = [];\n    }\n\n    add({\n        mesh,\n        receive = true,\n        cast = true,\n        vertex = defaultVertex,\n        fragment = defaultFragment,\n        uniformProjection = 'shadowProjectionMatrix',\n        uniformView = 'shadowViewMatrix',\n        uniformTexture = 'tShadow',\n    }) {\n        // Add uniforms to existing program\n        if (receive \u0026\u0026 !mesh.program.uniforms[uniformProjection]) {\n            mesh.program.uniforms[uniformProjection] = { value: this.light.projectionMatrix };\n            mesh.program.uniforms[uniformView] = { value: this.light.viewMatrix };\n            mesh.program.uniforms[uniformTexture] = this.targetUniform;\n        }\n\n        if (!cast) return;\n        this.castMeshes.push(mesh);\n\n        // Store program for when switching between depth override\n        mesh.colorProgram = mesh.program;\n\n        // Check if depth program already attached\n        if (mesh.depthProgram) return;\n\n        // Use global depth override if nothing custom passed in\n        if (vertex === defaultVertex \u0026\u0026 fragment === defaultFragment) {\n            mesh.depthProgram = this.depthProgram;\n            return;\n        }\n\n        // Create custom override program\n        mesh.depthProgram = new Program(this.gl, {\n            vertex,\n            fragment,\n            cullFace: false,\n        });\n    }\n\n    setSize({ width = 1024, height = width }) {\n        this.target = new RenderTarget(this.gl, { width, height });\n        this.targetUniform.value = this.target.texture;\n    }\n\n    render({ scene }) {\n        // For depth render, replace program with depth override.\n        // Hide meshes not casting shadows.\n        scene.traverse((node) =\u003e {\n            if (!node.draw) return;\n            if (!!~this.castMeshes.indexOf(node)) {\n                node.program = node.depthProgram;\n            } else {\n                node.isForceVisibility = node.visible;\n                node.visible = false;\n            }\n        });\n\n        // Render the depth shadow map using the light as the camera\n        this.gl.renderer.render({\n            scene,\n            camera: this.light,\n            target: this.target,\n        });\n\n        // Then switch the program back to the normal one\n        scene.traverse((node) =\u003e {\n            if (!node.draw) return;\n            if (!!~this.castMeshes.indexOf(node)) {\n                node.program = node.colorProgram;\n            } else {\n                node.visible = node.isForceVisibility;\n            }\n        });\n    }\n}\n\nconst defaultVertex = /* glsl */ `\n    attribute vec3 position;\n    attribute vec2 uv;\n\n    uniform mat4 modelViewMatrix;\n    uniform mat4 projectionMatrix;\n\n    void main() {\n        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n    }\n`;\n\nconst defaultFragment = /* glsl */ `\n    precision highp float;\n\n    vec4 packRGBA (float v) {\n        vec4 pack = fract(vec4(1.0, 255.0, 65025.0, 16581375.0) * v);\n        pack -= pack.yzww * vec2(1.0 / 255.0, 0.0).xxxy;\n        return pack;\n    }\n\n    void main() {\n        gl_FragColor = packRGBA(gl_FragCoord.z);\n    }\n`;\n","import { Texture } from '../core/Texture.js';\n\n// TODO: Support cubemaps\n// Generate textures using https://github.com/TimvanScherpenzeel/texture-compressor\n\nexport class KTXTexture extends Texture {\n    constructor(gl, { buffer, wrapS = gl.CLAMP_TO_EDGE, wrapT = gl.CLAMP_TO_EDGE, anisotropy = 0, minFilter, magFilter } = {}) {\n        super(gl, {\n            generateMipmaps: false,\n            wrapS,\n            wrapT,\n            anisotropy,\n            minFilter,\n            magFilter,\n        });\n\n        if (buffer) return this.parseBuffer(buffer);\n    }\n\n    parseBuffer(buffer) {\n        const ktx = new KhronosTextureContainer(buffer);\n        ktx.mipmaps.isCompressedTexture = true;\n\n        // Update texture\n        this.image = ktx.mipmaps;\n        this.internalFormat = ktx.glInternalFormat;\n        if (ktx.numberOfMipmapLevels \u003e 1) {\n            if (this.minFilter === this.gl.LINEAR) this.minFilter = this.gl.NEAREST_MIPMAP_LINEAR;\n        } else {\n            if (this.minFilter === this.gl.NEAREST_MIPMAP_LINEAR) this.minFilter = this.gl.LINEAR;\n        }\n\n        // TODO: support cube maps\n        // ktx.numberOfFaces\n    }\n}\n\nfunction KhronosTextureContainer(buffer) {\n    const idCheck = [0xab, 0x4b, 0x54, 0x58, 0x20, 0x31, 0x31, 0xbb, 0x0d, 0x0a, 0x1a, 0x0a];\n    const id = new Uint8Array(buffer, 0, 12);\n    for (let i = 0; i \u003c id.length; i++) if (id[i] !== idCheck[i]) return console.error('File missing KTX identifier');\n\n    // TODO: Is this always 4? Tested: [android, macos]\n    const size = Uint32Array.BYTES_PER_ELEMENT;\n    const head = new DataView(buffer, 12, 13 * size);\n    const littleEndian = head.getUint32(0, true) === 0x04030201;\n    const glType = head.getUint32(1 * size, littleEndian);\n    if (glType !== 0) return console.warn('only compressed formats currently supported');\n    this.glInternalFormat = head.getUint32(4 * size, littleEndian);\n    let width = head.getUint32(6 * size, littleEndian);\n    let height = head.getUint32(7 * size, littleEndian);\n    this.numberOfFaces = head.getUint32(10 * size, littleEndian);\n    this.numberOfMipmapLevels = Math.max(1, head.getUint32(11 * size, littleEndian));\n    const bytesOfKeyValueData = head.getUint32(12 * size, littleEndian);\n\n    this.mipmaps = [];\n    let offset = 12 + 13 * 4 + bytesOfKeyValueData;\n    for (let level = 0; level \u003c this.numberOfMipmapLevels; level++) {\n        const levelSize = new Int32Array(buffer, offset, 1)[0]; // size per face, since not supporting array cubemaps\n        offset += 4; // levelSize field\n        for (let face = 0; face \u003c this.numberOfFaces; face++) {\n            const data = new Uint8Array(buffer, offset, levelSize);\n            this.mipmaps.push({ data, width, height });\n            offset += levelSize;\n            offset += 3 - ((levelSize + 3) % 4); // add padding for odd sized image\n        }\n        width = width \u003e\u003e 1;\n        height = height \u003e\u003e 1;\n    }\n}\n","import { Texture } from '../core/Texture.js';\nimport { KTXTexture } from './KTXTexture.js';\n\n// For compressed textures, generate using https://github.com/TimvanScherpenzeel/texture-compressor\n\nlet cache = {};\nconst supportedExtensions = [];\n\nexport class TextureLoader {\n    static load(\n        gl,\n        {\n            src, // string or object of extension:src key-values\n            // {\n            //     pvrtc: '...ktx',\n            //     s3tc: '...ktx',\n            //     etc: '...ktx',\n            //     etc1: '...ktx',\n            //     astc: '...ktx',\n            //     webp: '...webp',\n            //     jpg: '...jpg',\n            //     png: '...png',\n            // }\n\n            // Only props relevant to KTXTexture\n            wrapS = gl.CLAMP_TO_EDGE,\n            wrapT = gl.CLAMP_TO_EDGE,\n            anisotropy = 0,\n\n            // For regular images\n            format = gl.RGBA,\n            internalFormat = format,\n            generateMipmaps = true,\n            minFilter = generateMipmaps ? gl.NEAREST_MIPMAP_LINEAR : gl.LINEAR,\n            magFilter = gl.LINEAR,\n            premultiplyAlpha = false,\n            unpackAlignment = 4,\n            flipY = true,\n        } = {}\n    ) {\n        const support = this.getSupportedExtensions(gl);\n        let ext = 'none';\n\n        // If src is string, determine which format from the extension\n        if (typeof src === 'string') {\n            ext = src.split('.').pop().split('?')[0].toLowerCase();\n        }\n\n        // If src is object, use supported extensions and provided list to choose best option\n        // Get first supported match, so put in order of preference\n        if (typeof src === 'object') {\n            for (const prop in src) {\n                if (support.includes(prop.toLowerCase())) {\n                    ext = prop.toLowerCase();\n                    src = src[prop];\n                    break;\n                }\n            }\n        }\n\n        // Stringify props\n        const cacheID = src + wrapS + wrapT + anisotropy + format + internalFormat + generateMipmaps + minFilter + magFilter + premultiplyAlpha + unpackAlignment + flipY + gl.renderer.id;\n\n        // Check cache for existing texture\n        if (cache[cacheID]) return cache[cacheID];\n\n        let texture;\n        switch (ext) {\n            case 'ktx':\n            case 'pvrtc':\n            case 's3tc':\n            case 'etc':\n            case 'etc1':\n            case 'astc':\n                // Load compressed texture using KTX format\n                texture = new KTXTexture(gl, {\n                    src,\n                    wrapS,\n                    wrapT,\n                    anisotropy,\n                    minFilter,\n                    magFilter,\n                });\n                texture.loaded = this.loadKTX(src, texture);\n                break;\n            case 'webp':\n            case 'jpg':\n            case 'jpeg':\n            case 'png':\n                texture = new Texture(gl, {\n                    wrapS,\n                    wrapT,\n                    anisotropy,\n                    format,\n                    internalFormat,\n                    generateMipmaps,\n                    minFilter,\n                    magFilter,\n                    premultiplyAlpha,\n                    unpackAlignment,\n                    flipY,\n                });\n                texture.loaded = this.loadImage(gl, src, texture, flipY);\n                break;\n            default:\n                console.warn('No supported format supplied');\n                texture = new Texture(gl);\n        }\n\n        texture.ext = ext;\n        cache[cacheID] = texture;\n        return texture;\n    }\n\n    static getSupportedExtensions(gl) {\n        if (supportedExtensions.length) return supportedExtensions;\n\n        const extensions = {\n            pvrtc: gl.renderer.getExtension('WEBGL_compressed_texture_pvrtc') || gl.renderer.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\n            s3tc: gl.renderer.getExtension('WEBGL_compressed_texture_s3tc'),\n            // etc: gl.renderer.getExtension('WEBGL_compressed_texture_etc'),\n            etc1: gl.renderer.getExtension('WEBGL_compressed_texture_etc1'),\n            astc: gl.renderer.getExtension('WEBGL_compressed_texture_astc'),\n            bc7: gl.renderer.getExtension('EXT_texture_compression_bptc'),\n        };\n\n        for (const ext in extensions) if (extensions[ext]) supportedExtensions.push(ext);\n\n        // Formats supported by all\n        supportedExtensions.push('png', 'jpg', 'webp');\n\n        return supportedExtensions;\n    }\n\n    static loadKTX(src, texture) {\n        return fetch(src)\n            .then((res) =\u003e res.arrayBuffer())\n            .then((buffer) =\u003e texture.parseBuffer(buffer));\n    }\n\n    static loadImage(gl, src, texture, flipY) {\n        return decodeImage(src, flipY).then((imgBmp) =\u003e {\n            // Catch non POT textures for WebGL1 and update params to avoid errors\n            if (!gl.renderer.isWebgl2 \u0026\u0026 (!powerOfTwo(imgBmp.width) || !powerOfTwo(imgBmp.height))) {\n                if (texture.generateMipmaps) texture.generateMipmaps = false;\n                if (texture.minFilter === gl.NEAREST_MIPMAP_LINEAR) texture.minFilter = gl.LINEAR;\n                if (texture.wrapS === gl.REPEAT) texture.wrapS = texture.wrapT = gl.CLAMP_TO_EDGE;\n            }\n\n            texture.image = imgBmp;\n\n            // For createImageBitmap, close once uploaded\n            texture.onUpdate = () =\u003e {\n                if (imgBmp.close) imgBmp.close();\n                texture.onUpdate = null;\n            };\n\n            return imgBmp;\n        });\n    }\n\n    static clearCache() {\n        cache = {};\n    }\n}\n\nfunction powerOfTwo(value) {\n    // (width \u0026 (width - 1)) !== 0\n    return Math.log2(value) % 1 === 0;\n}\n\nfunction decodeImage(src, flipY) {\n    return new Promise((resolve, reject) =\u003e {\n        if (isCreateImageBitmap()) {\n            fetch(src, { mode: 'cors' })\n                .then((r) =\u003e r.blob())\n                .then((b) =\u003e createImageBitmap(b, { imageOrientation: flipY ? 'flipY' : 'none', premultiplyAlpha: 'none' }))\n                .then(resolve)\n                .catch((err) =\u003e reject(err));\n        } else {\n            const img = new Image();\n\n            img.crossOrigin = '';\n            img.src = src;\n            img.onerror = ({ type }) =\u003e reject(`${type}: Loading image`);\n            img.onload = () =\u003e resolve(img);\n        }\n    });\n}\n\nfunction isCreateImageBitmap() {\n    const isChrome = navigator.userAgent.toLowerCase().includes('chrome');\n    if (!isChrome) return false;\n    try {\n        createImageBitmap;\n    } catch (e) {\n        return false;\n    }\n    return true;\n}\n","import { Vec3 } from '../math/Vec3.js';\nimport { Quat } from '../math/Quat.js';\n\nconst tmpVec3A = /* @__PURE__ */ new Vec3();\nconst tmpVec3B = /* @__PURE__ */ new Vec3();\nconst tmpVec3C = /* @__PURE__ */ new Vec3();\nconst tmpVec3D = /* @__PURE__ */ new Vec3();\n\nconst tmpQuatA = /* @__PURE__ */ new Quat();\nconst tmpQuatB = /* @__PURE__ */ new Quat();\nconst tmpQuatC = /* @__PURE__ */ new Quat();\nconst tmpQuatD = /* @__PURE__ */ new Quat();\n\nexport class GLTFAnimation {\n    constructor(data, weight = 1) {\n        this.data = data;\n        this.elapsed = 0;\n        this.weight = weight;\n\n        // Set to false to not apply modulo to elapsed against duration\n        this.loop = true;\n\n        // Find starting time as exports from blender (perhaps others too) don't always start from 0\n        this.startTime = data.reduce((a, { times }) =\u003e Math.min(a, times[0]), Infinity);\n        // Get largest final time in all channels to calculate duration\n        this.endTime = data.reduce((a, { times }) =\u003e Math.max(a, times[times.length - 1]), 0);\n        this.duration = this.endTime - this.startTime;\n    }\n\n    update(totalWeight = 1, isSet) {\n        const weight = isSet ? 1 : this.weight / totalWeight;\n        const elapsed = !this.duration\n            ? 0\n            : (this.loop ? this.elapsed % this.duration : Math.min(this.elapsed, this.duration - 0.001)) + this.startTime;\n\n        this.data.forEach(({ node, transform, interpolation, times, values }) =\u003e {\n            if (!this.duration) {\n                let val = tmpVec3A;\n                let size = 3;\n                if (transform === 'quaternion') {\n                    val = tmpQuatA;\n                    size = 4;\n                }\n                val.fromArray(values, 0);\n                if (size === 4) node[transform].slerp(val, weight);\n                else node[transform].lerp(val, weight);\n                return;\n            }\n\n            // Get index of two time values elapsed is between\n            const prevIndex =\n                Math.max(\n                    1,\n                    times.findIndex((t) =\u003e t \u003e elapsed)\n                ) - 1;\n            const nextIndex = prevIndex + 1;\n\n            // Get linear blend/alpha between the two\n            let alpha = (elapsed - times[prevIndex]) / (times[nextIndex] - times[prevIndex]);\n            if (interpolation === 'STEP') alpha = 0;\n\n            let prevVal = tmpVec3A;\n            let prevTan = tmpVec3B;\n            let nextTan = tmpVec3C;\n            let nextVal = tmpVec3D;\n            let size = 3;\n\n            if (transform === 'quaternion') {\n                prevVal = tmpQuatA;\n                prevTan = tmpQuatB;\n                nextTan = tmpQuatC;\n                nextVal = tmpQuatD;\n                size = 4;\n            }\n\n            if (interpolation === 'CUBICSPLINE') {\n                // Get the prev and next values from the indices\n                prevVal.fromArray(values, prevIndex * size * 3 + size * 1);\n                prevTan.fromArray(values, prevIndex * size * 3 + size * 2);\n                nextTan.fromArray(values, nextIndex * size * 3 + size * 0);\n                nextVal.fromArray(values, nextIndex * size * 3 + size * 1);\n\n                // interpolate for final value\n                prevVal = this.cubicSplineInterpolate(alpha, prevVal, prevTan, nextTan, nextVal);\n                if (size === 4) prevVal.normalize();\n            } else {\n                // Get the prev and next values from the indices\n                prevVal.fromArray(values, prevIndex * size);\n                nextVal.fromArray(values, nextIndex * size);\n\n                // interpolate for final value\n                if (size === 4) prevVal.slerp(nextVal, alpha);\n                else prevVal.lerp(nextVal, alpha);\n            }\n\n            // interpolate between multiple possible animations\n            if (size === 4) node[transform].slerp(prevVal, weight);\n            else node[transform].lerp(prevVal, weight);\n        });\n    }\n\n    cubicSplineInterpolate(t, prevVal, prevTan, nextTan, nextVal) {\n        const t2 = t * t;\n        const t3 = t2 * t;\n\n        const s2 = 3 * t2 - 2 * t3;\n        const s3 = t3 - t2;\n        const s0 = 1 - s2;\n        const s1 = s3 - t2 + t;\n\n        for (let i = 0; i \u003c prevVal.length; i++) {\n            prevVal[i] = s0 * prevVal[i] + s1 * (1 - t) * prevTan[i] + s2 * nextVal[i] + s3 * t * nextTan[i];\n        }\n\n        return prevVal;\n    }\n}\n","import { Mesh } from '../core/Mesh.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Texture } from '../core/Texture.js';\n\nconst tempMat4 = /* @__PURE__ */ new Mat4();\nconst identity = /* @__PURE__ */ new Mat4();\n\nexport class GLTFSkin extends Mesh {\n    constructor(gl, { skeleton, geometry, program, mode = gl.TRIANGLES } = {}) {\n        super(gl, { geometry, program, mode });\n        this.skeleton = skeleton;\n        this.program = program;\n        this.createBoneTexture();\n    }\n\n    createBoneTexture() {\n        if (!this.skeleton.joints.length) return;\n        const size = Math.max(4, Math.pow(2, Math.ceil(Math.log(Math.sqrt(this.skeleton.joints.length * 4)) / Math.LN2)));\n        this.boneMatrices = new Float32Array(size * size * 4);\n        this.boneTextureSize = size;\n        this.boneTexture = new Texture(this.gl, {\n            image: this.boneMatrices,\n            generateMipmaps: false,\n            type: this.gl.FLOAT,\n            internalFormat: this.gl.renderer.isWebgl2 ? this.gl.RGBA32F : this.gl.RGBA,\n            minFilter: this.gl.NEAREST,\n            magFilter: this.gl.NEAREST,\n            flipY: false,\n            width: size,\n        });\n    }\n\n    updateUniforms() {\n        // Update bone texture\n        this.skeleton.joints.forEach((bone, i) =\u003e {\n            // Find difference between current and bind pose\n            tempMat4.multiply(bone.worldMatrix, bone.bindInverse);\n            this.boneMatrices.set(tempMat4, i * 16);\n        });\n        this.boneTexture.needsUpdate = true;\n        // Reset for programs shared between multiple skins\n        this.program.uniforms.boneTexture.value = this.boneTexture;\n        this.program.uniforms.boneTextureSize.value = this.boneTextureSize;\n    }\n\n    draw({ camera } = {}) {\n        if (!this.program.uniforms.boneTexture) {\n            Object.assign(this.program.uniforms, {\n                boneTexture: { value: this.boneTexture },\n                boneTextureSize: { value: this.boneTextureSize },\n            });\n        }\n\n        this.updateUniforms();\n\n        // Switch the world matrix with identity to ignore any transforms\n        // on the mesh itself - only use skeleton's transforms\n        const _worldMatrix = this.worldMatrix;\n        this.worldMatrix = identity;\n\n        super.draw({ camera });\n\n        // Switch back to leave identity untouched\n        this.worldMatrix = _worldMatrix;\n    }\n}\n","import { Transform } from '../core/Transform.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { Vec4 } from '../math/Vec4.js';\n\nexport class InstancedMesh extends Mesh {\n    constructor(...args) {\n        super(...args);\n\n        // Skip renderer frustum culling\n        this.frustumCulled = false;\n        this.isInstancedMesh = true;\n    }\n\n    addFrustumCull() {\n        this.instanceTransforms = null;\n        this.instanceLightmapScaleOffset = null;\n        this.totalInstanceCount = 0;\n        this.frustumCullFunction = null;\n        this.instanceRenderList = null;\n\n        // Get instanced mesh\n        if (!this.geometry.attributes.instanceMatrix)\n            console.error(`mesh ${this.name ? `\"${this.name}\" ` : ``}missing instanceMatrix attribute; unable to frustum cull`);\n\n        // Make list of transforms from instanceMatrix\n        const matrixData = this.geometry.attributes.instanceMatrix.data;\n        this.instanceTransforms = [];\n        for (let i = 0, j = 0; i \u003c matrixData.length; i += 16, j++) {\n            const transform = new Transform();\n            transform.index = j;\n            transform.matrix.fromArray(matrixData, i);\n            transform.decompose();\n            this.instanceTransforms.push(transform);\n            // Add transforms to parent to update world matrices\n            transform.setParent(this.parent);\n        }\n        this.totalInstanceCount = this.instanceTransforms.length;\n\n        // Check for lightmap attributes - attach to transform\n        if (!!this.geometry.attributes.lightmapScaleOffset) {\n            const lightmapData = this.geometry.attributes.lightmapScaleOffset.data;\n            for (let i = 0, j = 0; i \u003c lightmapData.length; i += 4, j++) {\n                this.instanceTransforms[j].lightmapData = new Vec4().fromArray(lightmapData, i);\n            }\n        }\n\n        this.frustumCullFunction = ({ camera }) =\u003e {\n            // frustum cull transforms each frame - pass world matrix\n            this.instanceRenderList = [];\n            this.instanceTransforms.forEach((transform) =\u003e {\n                if (!camera.frustumIntersectsMesh(this, transform.worldMatrix)) return;\n                this.instanceRenderList.push(transform);\n            });\n\n            // update instanceMatrix and instancedCount with visible\n            this.instanceRenderList.forEach((transform, i) =\u003e {\n                transform.matrix.toArray(this.geometry.attributes.instanceMatrix.data, i * 16);\n\n                // Update lightmap attr\n                if (transform.lightmapData) {\n                    transform.lightmapData.toArray(this.geometry.attributes.lightmapScaleOffset.data, i * 4);\n                    this.geometry.attributes.lightmapScaleOffset.needsUpdate = true;\n                }\n            });\n            this.geometry.instancedCount = this.instanceRenderList.length;\n            this.geometry.attributes.instanceMatrix.needsUpdate = true;\n        };\n\n        this.onBeforeRender(this.frustumCullFunction);\n    }\n\n    removeFrustumCull() {\n        this.offBeforeRender(this.frustumCullFunction);\n        this.geometry.instancedCount = this.totalInstanceCount;\n        this.instanceTransforms.forEach((transform, i) =\u003e {\n            transform.matrix.toArray(this.geometry.attributes.instanceMatrix.data, i * 16);\n\n            // Update lightmap attr\n            if (transform.lightmapData) {\n                transform.lightmapData.toArray(this.geometry.attributes.lightmapScaleOffset.data, i * 4);\n                this.geometry.attributes.lightmapScaleOffset.needsUpdate = true;\n            }\n        });\n        this.geometry.attributes.instanceMatrix.needsUpdate = true;\n    }\n}\n","import { Geometry } from '../core/Geometry.js';\nimport { Transform } from '../core/Transform.js';\nimport { Texture } from '../core/Texture.js';\nimport { Mesh } from '../core/Mesh.js';\nimport { Camera } from '../core/Camera.js';\nimport { GLTFAnimation } from './GLTFAnimation.js';\nimport { GLTFSkin } from './GLTFSkin.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Vec3 } from '../math/Vec3.js';\nimport { NormalProgram } from './NormalProgram.js';\nimport { InstancedMesh } from './InstancedMesh.js';\n\n// TODO\n// [ ] Morph targets\n// [ ] Materials\n// [ ] Sparse accessor packing? For morph targets basically\n// [ ] Option to turn off GPU instancing?\n// [ ] Spot lights\n\nconst TYPE_ARRAY = {\n    5120: Int8Array,\n    5121: Uint8Array,\n    5122: Int16Array,\n    5123: Uint16Array,\n    5125: Uint32Array,\n    5126: Float32Array,\n    'image/jpeg': Uint8Array,\n    'image/png': Uint8Array,\n    'image/webp': Uint8Array,\n};\n\nconst TYPE_SIZE = {\n    SCALAR: 1,\n    VEC2: 2,\n    VEC3: 3,\n    VEC4: 4,\n    MAT2: 4,\n    MAT3: 9,\n    MAT4: 16,\n};\n\nconst ATTRIBUTES = {\n    POSITION: 'position',\n    NORMAL: 'normal',\n    TANGENT: 'tangent',\n    TEXCOORD_0: 'uv',\n    TEXCOORD_1: 'uv2',\n    COLOR_0: 'color',\n    WEIGHTS_0: 'skinWeight',\n    JOINTS_0: 'skinIndex',\n};\n\nconst TRANSFORMS = {\n    translation: 'position',\n    rotation: 'quaternion',\n    scale: 'scale',\n};\n\nexport class GLTFLoader {\n    static setDracoManager(manager) {\n        this.dracoManager = manager;\n    }\n\n    static setBasisManager(manager) {\n        this.basisManager = manager;\n    }\n\n    static async load(gl, src) {\n        const dir = src.split('/').slice(0, -1).join('/') + '/';\n\n        // Load main description json\n        const desc = await this.parseDesc(src);\n\n        return this.parse(gl, desc, dir);\n    }\n\n    static async parse(gl, desc, dir) {\n        if (desc.asset === undefined || desc.asset.version[0] \u003c 2)\n            console.warn('Only GLTF \u003e=2.0 supported. Attempting to parse.');\n\n        if (desc.extensionsRequired?.includes('KHR_draco_mesh_compression') \u0026\u0026 !this.dracoManager)\n            console.warn('KHR_draco_mesh_compression extension required but no manager supplied. Use .setDracoManager()');\n\n        if (desc.extensionsRequired?.includes('KHR_texture_basisu') \u0026\u0026 !this.basisManager)\n            console.warn('KHR_texture_basisu extension required but no manager supplied. Use .setBasisManager()');\n\n        // Load buffers async\n        const buffers = await this.loadBuffers(desc, dir);\n\n        // Unbind current VAO so that new buffers don't get added to active mesh\n        gl.renderer.bindVertexArray(null);\n\n        // Create gl buffers from bufferViews\n        const bufferViews = this.parseBufferViews(gl, desc, buffers);\n\n        // Create images from either bufferViews or separate image files\n        const images = await this.parseImages(gl, desc, dir, bufferViews);\n\n        const textures = this.parseTextures(gl, desc, images);\n\n        // Just pass through material data for now\n        const materials = this.parseMaterials(gl, desc, textures);\n\n        // Fetch the inverse bind matrices for skeleton joints\n        const skins = this.parseSkins(gl, desc, bufferViews);\n\n        // Create geometries for each mesh primitive\n        const meshes = await this.parseMeshes(gl, desc, bufferViews, materials, skins);\n\n        // Create transforms, meshes and hierarchy\n        const [nodes, cameras] = this.parseNodes(gl, desc, meshes, skins, images);\n\n        // Place nodes in skeletons\n        this.populateSkins(skins, nodes);\n\n        // Create animation handlers\n        const animations = this.parseAnimations(gl, desc, nodes, bufferViews);\n\n        // Get top level nodes for each scene\n        const scenes = this.parseScenes(desc, nodes);\n        const scene = scenes[desc.scene];\n\n        // Create uniforms for scene lights (TODO: light linking?)\n        const lights = this.parseLights(gl, desc, nodes, scenes);\n\n        // Remove null nodes (instanced transforms)\n        for (let i = nodes.length; i \u003e= 0; i--) if (!nodes[i]) nodes.splice(i, 1);\n\n        return {\n            json: desc,\n            buffers,\n            bufferViews,\n            cameras,\n            images,\n            textures,\n            materials,\n            meshes,\n            nodes,\n            lights,\n            animations,\n            scenes,\n            scene,\n        };\n    }\n\n    static parseDesc(src) {\n        return fetch(src, { mode: 'cors' })\n            .then((res) =\u003e res.arrayBuffer())\n            .then((data) =\u003e {\n                const textDecoder = new TextDecoder();\n                if (textDecoder.decode(new Uint8Array(data, 0, 4)) === 'glTF') {\n                    return this.unpackGLB(data);\n                } else {\n                    return JSON.parse(textDecoder.decode(data));\n                }\n            });\n    }\n\n    // From https://github.com/donmccurdy/glTF-Transform/blob/e4108cc/packages/core/src/io/io.ts#L32\n    static unpackGLB(glb) {\n        // Decode and verify GLB header\n        const header = new Uint32Array(glb, 0, 3);\n        if (header[0] !== 0x46546c67) {\n            throw new Error('Invalid glTF asset.');\n        } else if (header[1] !== 2) {\n            throw new Error(`Unsupported glTF binary version, \"${header[1]}\".`);\n        }\n        // Decode and verify chunk headers\n        const jsonChunkHeader = new Uint32Array(glb, 12, 2);\n        const jsonByteOffset = 20;\n        const jsonByteLength = jsonChunkHeader[0];\n        if (jsonChunkHeader[1] !== 0x4e4f534a) {\n            throw new Error('Unexpected GLB layout.');\n        }\n\n        // Decode JSON\n        const jsonText = new TextDecoder().decode(glb.slice(jsonByteOffset, jsonByteOffset + jsonByteLength));\n        const json = JSON.parse(jsonText);\n        // JSON only\n        if (jsonByteOffset + jsonByteLength === glb.byteLength) return json;\n\n        const binaryChunkHeader = new Uint32Array(glb, jsonByteOffset + jsonByteLength, 2);\n        if (binaryChunkHeader[1] !== 0x004e4942) {\n            throw new Error('Unexpected GLB layout.');\n        }\n        // Decode content\n        const binaryByteOffset = jsonByteOffset + jsonByteLength + 8;\n        const binaryByteLength = binaryChunkHeader[0];\n        const binary = glb.slice(binaryByteOffset, binaryByteOffset + binaryByteLength);\n        // Attach binary to buffer\n        json.buffers[0].binary = binary;\n        return json;\n    }\n\n    // ThreeJS GLTF Loader https://github.com/mrdoob/three.js/blob/master/examples/js/loaders/GLTFLoader.js#L1085\n    static resolveURI(uri, dir) {\n        // Invalid URI\n        if (typeof uri !== 'string' || uri === '') return '';\n\n        // Host Relative URI\n        if (/^https?:\\/\\//i.test(dir) \u0026\u0026 /^\\//.test(uri)) {\n            dir = dir.replace(/(^https?:\\/\\/[^\\/]+).*/i, '$1');\n        }\n\n        // Absolute URI http://, https://, //\n        if (/^(https?:)?\\/\\//i.test(uri)) return uri;\n\n        // Data URI\n        if (/^data:.*,.*$/i.test(uri)) return uri;\n\n        // Blob URI\n        if (/^blob:.*$/i.test(uri)) return uri;\n\n        // Relative URI\n        return dir + uri;\n    }\n\n    static loadBuffers(desc, dir) {\n        if (!desc.buffers) return null;\n        return Promise.all(\n            desc.buffers.map((buffer) =\u003e {\n                // For GLB, binary buffer ready to go\n                if (buffer.binary) return buffer.binary;\n                const uri = this.resolveURI(buffer.uri, dir);\n                return fetch(uri, { mode: 'cors' }).then((res) =\u003e res.arrayBuffer());\n            })\n        );\n    }\n\n    static parseBufferViews(gl, desc, buffers) {\n        if (!desc.bufferViews) return null;\n        const bufferViews = desc.bufferViews;\n\n        desc.meshes \u0026\u0026\n            desc.meshes.forEach(({ primitives }) =\u003e {\n                primitives.forEach(({ attributes, indices, extensions }) =\u003e {\n                    // Flag bufferView as an attribute, so it knows to create a gl buffer\n                    for (const attr in attributes) {\n                        const accessor = desc.accessors[attributes[attr]];\n                        if (accessor.bufferView === undefined \u0026\u0026 !!extensions) {\n                            // Draco extension buffer view\n                            if (extensions.KHR_draco_mesh_compression) {\n                                accessor.bufferView = extensions.KHR_draco_mesh_compression.bufferView;\n                                bufferViews[accessor.bufferView].isDraco = true;\n                            }\n                        }\n                        bufferViews[accessor.bufferView].isAttribute = true;\n                    }\n\n                    if (indices !== undefined) {\n                        const accessor = desc.accessors[indices];\n                        if (accessor.bufferView === undefined \u0026\u0026 !!extensions) {\n                            // Draco extension buffer view\n                            if (extensions.KHR_draco_mesh_compression) {\n                                accessor.bufferView = extensions.KHR_draco_mesh_compression.bufferView;\n                                bufferViews[accessor.bufferView].isDraco = true;\n                            }\n                        }\n                        bufferViews[accessor.bufferView].isAttribute = true;\n\n                        // Make sure indices bufferView have a target property for gl buffer binding\n                        bufferViews[accessor.bufferView].target = gl.ELEMENT_ARRAY_BUFFER;\n                    }\n                });\n            });\n\n        // Get componentType of each bufferView from the accessors\n        desc.accessors.forEach(({ bufferView: bufferViewIndex, componentType }) =\u003e {\n            if (bufferViewIndex === undefined) return;\n            bufferViews[bufferViewIndex].componentType = componentType;\n        });\n\n        // Get mimetype of bufferView from images\n        desc.images \u0026\u0026\n            desc.images.forEach(({ uri, bufferView: bufferViewIndex, mimeType }) =\u003e {\n                if (bufferViewIndex === undefined) return;\n                bufferViews[bufferViewIndex].mimeType = mimeType;\n            });\n\n        // Push each bufferView to the GPU as a separate buffer\n        bufferViews.forEach(\n            (\n                {\n                    buffer: bufferIndex, // required\n                    byteOffset = 0, // optional\n                    byteLength, // required\n                    byteStride, // optional\n                    target = gl.ARRAY_BUFFER, // optional, added above for elements\n                    name, // optional\n                    extensions, // optional\n                    extras, // optional\n\n                    componentType, // optional, added from accessor above\n                    mimeType, // optional, added from images above\n                    isAttribute,\n                    isDraco,\n                },\n                i\n            ) =\u003e {\n                bufferViews[i].data = buffers[bufferIndex].slice(byteOffset, byteOffset + byteLength);\n\n                if (!isAttribute || isDraco) return;\n                // Create gl buffers for the bufferView, pushing it to the GPU\n                const buffer = gl.createBuffer();\n                gl.bindBuffer(target, buffer);\n                gl.renderer.state.boundBuffer = buffer;\n                gl.bufferData(target, bufferViews[i].data, gl.STATIC_DRAW);\n                bufferViews[i].buffer = buffer;\n            }\n        );\n\n        return bufferViews;\n    }\n\n    static parseImages(gl, desc, dir, bufferViews) {\n        if (!desc.images) return null;\n        return Promise.all(\n            desc.images.map(async ({ uri, bufferView: bufferViewIndex, mimeType, name }) =\u003e {\n                if (mimeType === 'image/ktx2') {\n                    const { data } = bufferViews[bufferViewIndex];\n                    const image = await this.basisManager.parseTexture(data);\n                    return image;\n                }\n\n                // jpg / png / webp\n                const image = new Image();\n                image.name = name;\n                if (uri) {\n                    image.src = this.resolveURI(uri, dir);\n                } else if (bufferViewIndex !== undefined) {\n                    const { data } = bufferViews[bufferViewIndex];\n                    const blob = new Blob([data], { type: mimeType });\n                    image.src = URL.createObjectURL(blob);\n                }\n                image.ready = new Promise((res) =\u003e {\n                    image.onload = () =\u003e res();\n                });\n                return image;\n            })\n        );\n    }\n\n    static parseTextures(gl, desc, images) {\n        if (!desc.textures) return null;\n        return desc.textures.map((textureInfo) =\u003e this.createTexture(gl, desc, images, textureInfo));\n    }\n\n    static createTexture(gl, desc, images, { sampler: samplerIndex, source: sourceIndex, name, extensions, extras }) {\n        if (sourceIndex === undefined \u0026\u0026 !!extensions) {\n            // WebP extension source index\n            if (extensions.EXT_texture_webp) sourceIndex = extensions.EXT_texture_webp.source;\n\n            // Basis extension source index\n            if (extensions.KHR_texture_basisu) sourceIndex = extensions.KHR_texture_basisu.source;\n        }\n\n        const image = images[sourceIndex];\n        if (image.texture) return image.texture;\n\n        const options = {\n            flipY: false,\n            wrapS: gl.REPEAT, // Repeat by default, opposed to OGL's clamp by default\n            wrapT: gl.REPEAT,\n        };\n        const sampler = samplerIndex !== undefined ? desc.samplers[samplerIndex] : null;\n        if (sampler) {\n            ['magFilter', 'minFilter', 'wrapS', 'wrapT'].forEach((prop) =\u003e {\n                if (sampler[prop]) options[prop] = sampler[prop];\n            });\n        }\n\n        // For compressed textures\n        if (image.isBasis) {\n            options.image = image;\n            options.internalFormat = image.internalFormat;\n            if (image.isCompressedTexture) {\n                options.generateMipmaps = false;\n                if (image.length \u003e 1) this.minFilter = gl.NEAREST_MIPMAP_LINEAR;\n            }\n            const texture = new Texture(gl, options);\n            texture.name = name;\n            image.texture = texture;\n            return texture;\n        }\n\n        const texture = new Texture(gl, options);\n        texture.name = name;\n        image.texture = texture;\n        image.ready.then(() =\u003e {\n            texture.image = image;\n        });\n\n        return texture;\n    }\n\n    static parseMaterials(gl, desc, textures) {\n        if (!desc.materials) return null;\n        return desc.materials.map(\n            ({\n                name,\n                extensions,\n                extras,\n                pbrMetallicRoughness = {},\n                normalTexture,\n                occlusionTexture,\n                emissiveTexture,\n                emissiveFactor = [0, 0, 0],\n                alphaMode = 'OPAQUE',\n                alphaCutoff = 0.5,\n                doubleSided = false,\n            }) =\u003e {\n                const {\n                    baseColorFactor = [1, 1, 1, 1],\n                    baseColorTexture,\n                    metallicFactor = 1,\n                    roughnessFactor = 1,\n                    metallicRoughnessTexture,\n                    //   extensions,\n                    //   extras,\n                } = pbrMetallicRoughness;\n\n                if (baseColorTexture) {\n                    baseColorTexture.texture = textures[baseColorTexture.index];\n                    // texCoord\n                }\n                if (normalTexture) {\n                    normalTexture.texture = textures[normalTexture.index];\n                    // scale: 1\n                    // texCoord\n                }\n                if (metallicRoughnessTexture) {\n                    metallicRoughnessTexture.texture = textures[metallicRoughnessTexture.index];\n                    // texCoord\n                }\n                if (occlusionTexture) {\n                    occlusionTexture.texture = textures[occlusionTexture.index];\n                    // strength 1\n                    // texCoord\n                }\n                if (emissiveTexture) {\n                    emissiveTexture.texture = textures[emissiveTexture.index];\n                    // texCoord\n                }\n\n                return {\n                    name,\n                    extensions,\n                    extras,\n                    baseColorFactor,\n                    baseColorTexture,\n                    metallicFactor,\n                    roughnessFactor,\n                    metallicRoughnessTexture,\n                    normalTexture,\n                    occlusionTexture,\n                    emissiveTexture,\n                    emissiveFactor,\n                    alphaMode,\n                    alphaCutoff,\n                    doubleSided,\n                };\n            }\n        );\n    }\n\n    static parseSkins(gl, desc, bufferViews) {\n        if (!desc.skins) return null;\n        return desc.skins.map(\n            ({\n                inverseBindMatrices, // optional\n                skeleton, // optional\n                joints, // required\n                // name,\n                // extensions,\n                // extras,\n            }) =\u003e {\n                return {\n                    inverseBindMatrices: this.parseAccessor(inverseBindMatrices, desc, bufferViews),\n                    skeleton,\n                    joints,\n                };\n            }\n        );\n    }\n\n    static parseMeshes(gl, desc, bufferViews, materials, skins) {\n        if (!desc.meshes) return null;\n        return Promise.all(\n            desc.meshes.map(\n                async (\n                    {\n                        primitives, // required\n                        weights, // optional\n                        name, // optional\n                        extensions, // optional\n                        extras = {}, // optional - will get merged with node extras\n                    },\n                    meshIndex\n                ) =\u003e {\n                    // TODO: weights stuff?\n                    // Parse through nodes to see how many instances there are and if there is a skin attached\n                    // If multiple instances of a skin, need to create each\n                    let numInstances = 0;\n                    let skinIndices = [];\n                    let isLightmap = false;\n                    desc.nodes \u0026\u0026\n                        desc.nodes.forEach(({ mesh, skin, extras }) =\u003e {\n                            if (mesh === meshIndex) {\n                                numInstances++;\n                                if (skin !== undefined) skinIndices.push(skin);\n                                if (extras \u0026\u0026 extras.lightmap_scale_offset) isLightmap = true;\n                            }\n                        });\n                    let isSkin = !!skinIndices.length;\n\n                    // For skins, return array of skin meshes to account for multiple instances\n                    if (isSkin) {\n                        primitives = await Promise.all(\n                            skinIndices.map(async (skinIndex) =\u003e {\n                                return (await this.parsePrimitives(gl, primitives, desc, bufferViews, materials, 1, isLightmap)).map(({ geometry, program, mode }) =\u003e {\n                                    const mesh = new GLTFSkin(gl, { skeleton: skins[skinIndex], geometry, program, mode });\n                                    mesh.name = name;\n                                    mesh.extras = extras;\n                                    if (extensions) mesh.extensions = extensions;\n                                    // TODO: support skin frustum culling\n                                    mesh.frustumCulled = false;\n                                    return mesh;\n                                });\n                            })\n                        );\n                        // For retrieval to add to node\n                        primitives.instanceCount = 0;\n                        primitives.numInstances = numInstances;\n                    } else {\n                        primitives = (await this.parsePrimitives(gl, primitives, desc, bufferViews, materials, numInstances, isLightmap)).map(({ geometry, program, mode }) =\u003e {\n                            // InstancedMesh class has custom frustum culling for instances\n                            const meshConstructor = geometry.attributes.instanceMatrix ? InstancedMesh : Mesh;\n                            const mesh = new meshConstructor(gl, { geometry, program, mode });\n                            mesh.name = name;\n                            mesh.extras = extras;\n                            if (extensions) mesh.extensions = extensions;\n                            // Tag mesh so that nodes can add their transforms to the instance attribute\n                            mesh.numInstances = numInstances;\n                            return mesh;\n                        });\n                    }\n\n                    return {\n                        primitives,\n                        weights,\n                        name,\n                    };\n                }\n            )\n        );\n    }\n\n    static parsePrimitives(gl, primitives, desc, bufferViews, materials, numInstances, isLightmap) {\n        return Promise.all(\n            primitives.map(\n                async ({\n                    attributes, // required\n                    indices, // optional\n                    material: materialIndex, // optional\n                    mode = 4, // optional\n                    targets, // optional\n                    extensions, // optional\n                    extras, // optional\n                }) =\u003e {\n                    // TODO: materials\n                    const program = new NormalProgram(gl);\n                    if (materialIndex !== undefined) {\n                        program.gltfMaterial = materials[materialIndex];\n                    }\n\n                    const geometry = new Geometry(gl);\n                    if (extras) geometry.extras = extras;\n                    if (extensions) geometry.extensions = extensions;\n\n                    // For compressed geometry data\n                    if (extensions \u0026\u0026 extensions.KHR_draco_mesh_compression) {\n                        const bufferViewIndex = extensions.KHR_draco_mesh_compression.bufferView;\n                        const gltfAttributeMap = extensions.KHR_draco_mesh_compression.attributes;\n                        const attributeMap = {};\n                        const attributeTypeMap = {};\n                        const attributeTypeNameMap = {};\n                        const attributeNormalizedMap = {};\n\n                        for (const attr in attributes) {\n                            const accessor = desc.accessors[attributes[attr]];\n                            const attributeName = ATTRIBUTES[attr];\n                            attributeMap[attributeName] = gltfAttributeMap[attr];\n                            attributeTypeMap[attributeName] = accessor.componentType;\n                            attributeTypeNameMap[attributeName] = TYPE_ARRAY[accessor.componentType].name;\n                            attributeNormalizedMap[attributeName] = accessor.normalized === true;\n                        }\n\n                        const { data } = bufferViews[bufferViewIndex];\n                        const geometryData = await this.dracoManager.decodeGeometry(data, {\n                            attributeIds: attributeMap,\n                            attributeTypes: attributeTypeNameMap,\n                        });\n\n                        // Add each attribute result\n                        for (let i = 0; i \u003c geometryData.attributes.length; i++) {\n                            const result = geometryData.attributes[i];\n                            const name = result.name;\n                            const data = result.array;\n                            const size = result.itemSize;\n                            const type = attributeTypeMap[name];\n                            const normalized = attributeNormalizedMap[name];\n\n                            // Create gl buffers for the attribute data, pushing it to the GPU\n                            const buffer = gl.createBuffer();\n                            gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n                            gl.renderer.state.boundBuffer = buffer;\n                            gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\n                            geometry.addAttribute(name, {\n                                data,\n                                size,\n                                type,\n                                normalized,\n                                buffer,\n                            });\n                        }\n\n                        // Add index attribute if found\n                        if (geometryData.index) {\n                            const data = geometryData.index.array;\n                            const size = geometryData.index.itemSize;\n\n                            // Create gl buffers for the index attribute data, pushing it to the GPU\n                            const buffer = gl.createBuffer();\n                            gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer);\n                            gl.renderer.state.boundBuffer = buffer;\n                            gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW);\n\n                            geometry.addAttribute('index', {\n                                data,\n                                size,\n                                type: 5125, // Uint32Array\n                                normalized: false,\n                                buffer,\n                            });\n                        }\n                    } else {\n                        // Add each attribute found in primitive\n                        for (const attr in attributes) {\n                            geometry.addAttribute(ATTRIBUTES[attr], this.parseAccessor(attributes[attr], desc, bufferViews));\n                        }\n\n                        // Add index attribute if found\n                        if (indices !== undefined) {\n                            geometry.addAttribute('index', this.parseAccessor(indices, desc, bufferViews));\n                        }\n                    }\n\n                    // Add instanced transform attribute if multiple instances\n                    // Ignore if skin as we don't support instanced skins out of the box\n                    if (numInstances \u003e 1) {\n                        geometry.addAttribute('instanceMatrix', {\n                            instanced: 1,\n                            size: 16,\n                            data: new Float32Array(numInstances * 16),\n                        });\n                    }\n\n                    // Always supply lightmapScaleOffset as an instanced attribute\n                    // Instanced skin lightmaps not supported\n                    if (isLightmap) {\n                        geometry.addAttribute('lightmapScaleOffset', {\n                            instanced: 1,\n                            size: 4,\n                            data: new Float32Array(numInstances * 4),\n                        });\n                    }\n\n                    return {\n                        geometry,\n                        program,\n                        mode,\n                    };\n                }\n            )\n        );\n    }\n\n    static parseAccessor(index, desc, bufferViews) {\n        // TODO: init missing bufferView with 0s\n        // TODO: support sparse\n\n        const {\n            bufferView: bufferViewIndex, // optional\n            byteOffset = 0, // optional\n            componentType, // required\n            normalized = false, // optional\n            count, // required\n            type, // required\n            min, // optional\n            max, // optional\n            sparse, // optional\n            // name, // optional\n            // extensions, // optional\n            // extras, // optional\n        } = desc.accessors[index];\n\n        const {\n            data, // attached in parseBufferViews\n            buffer, // replaced to be the actual GL buffer\n            byteOffset: bufferByteOffset = 0,\n            // byteLength, // applied in parseBufferViews\n            byteStride = 0,\n            target,\n            // name,\n            // extensions,\n            // extras,\n        } = bufferViews[bufferViewIndex];\n\n        const size = TYPE_SIZE[type];\n\n        // Parse data from joined buffers\n        const TypeArray = TYPE_ARRAY[componentType];\n        const elementBytes = TypeArray.BYTES_PER_ELEMENT;\n        const componentStride = byteStride / elementBytes;\n        const isInterleaved = !!byteStride \u0026\u0026 componentStride !== size;\n\n        let filteredData;\n\n        // Convert data to typed array for various uses (bounding boxes, raycasting, animation, merging etc)\n        if (isInterleaved) {\n            // First convert entire buffer to type\n            const typedData = new TypeArray(data, byteOffset);\n            // TODO: add length to not copy entire buffer if can help it\n            // const typedData = new TypeArray(data, byteOffset, (count - 1) * componentStride)\n\n            // Create output with length\n            filteredData = new TypeArray(count * size);\n\n            // Add element by element\n            for (let i = 0; i \u003c count; i++) {\n                const start = componentStride * i;\n                const end = start + size;\n                filteredData.set(typedData.slice(start, end), i * size);\n            }\n        } else {\n            // Simply a slice\n            filteredData = new TypeArray(data, byteOffset, count * size);\n        }\n\n        // Return attribute data\n        return {\n            data: filteredData,\n            size,\n            type: componentType,\n            normalized,\n            buffer,\n            stride: byteStride,\n            offset: byteOffset,\n            count,\n            min,\n            max,\n        };\n    }\n\n    static parseNodes(gl, desc, meshes, skins, images) {\n        if (!desc.nodes) return null;\n        const cameras = [];\n        const nodes = desc.nodes.map(\n            ({\n                camera, // optional\n                children, // optional\n                skin: skinIndex, // optional\n                matrix, // optional\n                mesh: meshIndex, // optional\n                rotation, // optional\n                scale, // optional\n                translation, // optional\n                weights, // optional\n                name, // optional\n                extensions, // optional\n                extras, // optional\n            }) =\u003e {\n                const isCamera = camera !== undefined;\n\n                const node = isCamera ? new Camera(gl) : new Transform();\n\n                if (isCamera) {\n                    // NOTE: chose to use node's name and extras/extensions over camera\n                    const cameraOpts = desc.cameras[camera];\n                    if (cameraOpts.type === 'perspective') {\n                        const { yfov: fov, znear: near, zfar: far } = cameraOpts.perspective;\n                        node.perspective({ fov: fov * (180 / Math.PI), near, far });\n                    } else {\n                        const { xmag, ymag, znear: near, zfar: far } = cameraOpts.orthographic;\n                        node.orthographic({ near, far, left: -xmag, right: xmag, top: -ymag, bottom: ymag });\n                    }\n                    cameras.push(node);\n                }\n\n                if (name) node.name = name;\n                if (extras) node.extras = extras;\n                if (extensions) node.extensions = extensions;\n\n                // Need to attach to node as may have same material but different lightmap\n                if (extras \u0026\u0026 extras.lightmapTexture !== undefined) {\n                    extras.lightmapTexture.texture = this.createTexture(gl, desc, images, { source: extras.lightmapTexture.index });\n                }\n\n                // Apply transformations\n                if (matrix) {\n                    node.matrix.copy(matrix);\n                    node.decompose();\n                } else {\n                    if (rotation) node.quaternion.copy(rotation);\n                    if (scale) node.scale.copy(scale);\n                    if (translation) node.position.copy(translation);\n                    node.updateMatrix();\n                }\n\n                // Flags for avoiding duplicate transforms and removing unused instance nodes\n                let isInstanced = false;\n                let isFirstInstance = true;\n                let isInstancedMatrix = false;\n                let isSkin = skinIndex !== undefined;\n\n                // Add mesh if included\n                if (meshIndex !== undefined) {\n                    if (isSkin) {\n                        meshes[meshIndex].primitives[meshes[meshIndex].primitives.instanceCount].forEach((mesh) =\u003e {\n                            if (extras) Object.assign(mesh.extras, extras);\n                            mesh.setParent(node);\n                        });\n                        meshes[meshIndex].primitives.instanceCount++;\n                        // Remove properties once all instances added\n                        if (meshes[meshIndex].primitives.instanceCount === meshes[meshIndex].primitives.numInstances) {\n                            delete meshes[meshIndex].primitives.numInstances;\n                            delete meshes[meshIndex].primitives.instanceCount;\n                        }\n                    } else {\n                        meshes[meshIndex].primitives.forEach((mesh) =\u003e {\n                            if (extras) Object.assign(mesh.extras, extras);\n\n                            // Instanced mesh might only have 1\n                            if (mesh.geometry.isInstanced) {\n                                isInstanced = true;\n                                if (!mesh.instanceCount) {\n                                    mesh.instanceCount = 0;\n                                } else {\n                                    isFirstInstance = false;\n                                }\n                                if (mesh.geometry.attributes.instanceMatrix) {\n                                    isInstancedMatrix = true;\n                                    node.matrix.toArray(mesh.geometry.attributes.instanceMatrix.data, mesh.instanceCount * 16);\n                                }\n\n                                if (mesh.geometry.attributes.lightmapScaleOffset) {\n                                    mesh.geometry.attributes.lightmapScaleOffset.data.set(extras.lightmap_scale_offset, mesh.instanceCount * 4);\n                                }\n\n                                mesh.instanceCount++;\n\n                                if (mesh.instanceCount === mesh.numInstances) {\n                                    // Remove properties once all instances added\n                                    delete mesh.numInstances;\n                                    delete mesh.instanceCount;\n                                    // Flag attribute as dirty\n                                    if (mesh.geometry.attributes.instanceMatrix) {\n                                        mesh.geometry.attributes.instanceMatrix.needsUpdate = true;\n                                    }\n                                    if (mesh.geometry.attributes.lightmapScaleOffset) {\n                                        mesh.geometry.attributes.lightmapScaleOffset.needsUpdate = true;\n                                    }\n                                }\n                            }\n\n                            // For instances, only the first node will actually have the mesh\n                            if (isInstanced) {\n                                if (isFirstInstance) mesh.setParent(node);\n                            } else {\n                                mesh.setParent(node);\n                            }\n                        });\n                    }\n                }\n\n                // Reset node if instanced to not duplicate transforms\n                if (isInstancedMatrix) {\n                    // Remove unused nodes just providing an instance transform\n                    if (!isFirstInstance) return null;\n                    // Avoid duplicate transform for node containing the instanced mesh\n                    node.matrix.identity();\n                    node.decompose();\n                }\n\n                return node;\n            }\n        );\n\n        desc.nodes.forEach(({ children = [] }, i) =\u003e {\n            // Set hierarchy now all nodes created\n            children.forEach((childIndex) =\u003e {\n                if (!nodes[childIndex]) return;\n                nodes[childIndex].setParent(nodes[i]);\n            });\n        });\n\n        // Add frustum culling for instances now that instanceMatrix attribute is populated\n        meshes.forEach(({ primitives }, i) =\u003e {\n            primitives.forEach((primitive, i) =\u003e {\n                if (primitive.isInstancedMesh) primitive.addFrustumCull();\n            });\n        });\n\n        return [nodes, cameras];\n    }\n\n    static populateSkins(skins, nodes) {\n        if (!skins) return;\n        skins.forEach((skin) =\u003e {\n            skin.joints = skin.joints.map((i, index) =\u003e {\n                const joint = nodes[i];\n                joint.skin = skin;\n                joint.bindInverse = new Mat4(...skin.inverseBindMatrices.data.slice(index * 16, (index + 1) * 16));\n                return joint;\n            });\n            if (skin.skeleton) skin.skeleton = nodes[skin.skeleton];\n        });\n    }\n\n    static parseAnimations(gl, desc, nodes, bufferViews) {\n        if (!desc.animations) return null;\n        return desc.animations.map(\n            (\n                {\n                    channels, // required\n                    samplers, // required\n                    name, // optional\n                    // extensions, // optional\n                    // extras,  // optional\n                },\n                animationIndex\n            ) =\u003e {\n                const data = channels.map(\n                    ({\n                        sampler: samplerIndex, // required\n                        target, // required\n                        // extensions, // optional\n                        // extras, // optional\n                    }) =\u003e {\n                        const {\n                            input: inputIndex, // required\n                            interpolation = 'LINEAR',\n                            output: outputIndex, // required\n                            // extensions, // optional\n                            // extras, // optional\n                        } = samplers[samplerIndex];\n\n                        const {\n                            node: nodeIndex, // optional - TODO: when is it not included?\n                            path, // required\n                            // extensions, // optional\n                            // extras, // optional\n                        } = target;\n\n                        const node = nodes[nodeIndex];\n                        const transform = TRANSFORMS[path];\n                        const times = this.parseAccessor(inputIndex, desc, bufferViews).data;\n                        const values = this.parseAccessor(outputIndex, desc, bufferViews).data;\n\n                        // Store reference on node for cyclical retrieval\n                        if (!node.animations) node.animations = [];\n                        if (!node.animations.includes(animationIndex)) node.animations.push(animationIndex);\n\n                        return {\n                            node,\n                            transform,\n                            interpolation,\n                            times,\n                            values,\n                        };\n                    }\n                );\n\n                return {\n                    name,\n                    animation: new GLTFAnimation(data),\n                };\n            }\n        );\n    }\n\n    static parseScenes(desc, nodes) {\n        if (!desc.scenes) return null;\n        return desc.scenes.map(\n            ({\n                nodes: nodesIndices = [],\n                name, // optional\n                extensions,\n                extras,\n            }) =\u003e {\n                const scene = nodesIndices.reduce((map, i) =\u003e {\n                    // Don't add null nodes (instanced transforms)\n                    if (nodes[i]) map.push(nodes[i]);\n                    return map;\n                }, []);\n                scene.extras = extras;\n                return scene;\n            }\n        );\n    }\n\n    static parseLights(gl, desc, nodes, scenes) {\n        const lights = {\n            directional: [],\n            point: [],\n            spot: [],\n        };\n\n        // Update matrices on root nodes\n        scenes.forEach((scene) =\u003e scene.forEach((node) =\u003e node.updateMatrixWorld()));\n\n        // Uses KHR_lights_punctual extension\n        const lightsDescArray = desc.extensions?.KHR_lights_punctual?.lights || [];\n\n        // Need nodes for transforms\n        nodes.forEach((node) =\u003e {\n            if (!node?.extensions?.KHR_lights_punctual) return;\n            const lightIndex = node.extensions.KHR_lights_punctual.light;\n            const lightDesc = lightsDescArray[lightIndex];\n            const light = {\n                name: lightDesc.name || '',\n                color: { value: new Vec3().set(lightDesc.color || 1) },\n            };\n            // Apply intensity directly to color\n            if (lightDesc.intensity !== undefined) light.color.value.multiply(lightDesc.intensity);\n\n            switch (lightDesc.type) {\n                case 'directional':\n                    light.direction = { value: new Vec3(0, 0, 1).transformDirection(node.worldMatrix) };\n                    break;\n                case 'point':\n                    light.position = { value: new Vec3().applyMatrix4(node.worldMatrix) };\n                    light.distance = { value: lightDesc.range };\n                    light.decay = { value: 2 };\n                    break;\n                case 'spot':\n                    // TODO: support spot uniforms\n                    Object.assign(light, lightDesc);\n                    break;\n            }\n\n            lights[lightDesc.type].push(light);\n        });\n\n        return lights;\n    }\n}\n","let id = 0;\n\nexport class DracoManager {\n    constructor(workerSrc) {\n        this.onMessage = this.onMessage.bind(this);\n        this.queue = new Map();\n        this.initWorker(workerSrc);\n    }\n\n    initWorker(workerSrc) {\n        this.worker = new Worker(workerSrc);\n        this.worker.onmessage = this.onMessage;\n    }\n\n    onMessage({ data }) {\n        const { id, error, geometry } = data;\n        if (error) {\n            console.log(error, id);\n            return;\n        }\n        const geometryResolve = this.queue.get(id);\n        this.queue.delete(id);\n        geometryResolve(geometry);\n    }\n\n    decodeGeometry(buffer, config) {\n        id++;\n        this.worker.postMessage({\n            id,\n            buffer,\n            config,\n        });\n        let geometryResolve;\n        const promise = new Promise((res) =\u003e (geometryResolve = res));\n        this.queue.set(id, geometryResolve);\n        return promise;\n    }\n}\n","let supportedFormat;\nlet id = 0;\n\nexport class BasisManager {\n    constructor(workerSrc, gl) {\n        if (!supportedFormat) supportedFormat = this.getSupportedFormat(gl);\n        this.onMessage = this.onMessage.bind(this);\n        this.queue = new Map();\n        this.initWorker(workerSrc);\n    }\n\n    getSupportedFormat(gl = document.createElement('canvas').getContext('webgl')) {\n        /* if (!!gl.getExtension('WEBGL_compressed_texture_etc')) {\n            return 'etc2';\n        } else  */\n        if (!!gl.getExtension('WEBGL_compressed_texture_astc')) {\n            return 'astc';\n        } else if (!!gl.getExtension('EXT_texture_compression_bptc')) {\n            return 'bptc';\n        } else if (!!gl.getExtension('WEBGL_compressed_texture_s3tc')) {\n            return 's3tc';\n        } else if (!!gl.getExtension('WEBGL_compressed_texture_etc1')) {\n            return 'etc1';\n        } else if (!!gl.getExtension('WEBGL_compressed_texture_pvrtc') || !!gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc')) {\n            return 'pvrtc';\n            // } else if (!!gl.getExtension('WEBGL_compressed_texture_atc')) {\n            //     return 'atc';\n        }\n        return 'none';\n    }\n\n    initWorker(workerSrc) {\n        this.worker = new Worker(workerSrc);\n        this.worker.onmessage = this.onMessage;\n    }\n\n    onMessage({ data }) {\n        const { id, error, image } = data;\n        if (error) {\n            console.log(error, id);\n            return;\n        }\n        const textureResolve = this.queue.get(id);\n        this.queue.delete(id);\n        image.isBasis = true;\n        textureResolve(image);\n    }\n\n    parseTexture(buffer) {\n        id++;\n        this.worker.postMessage({\n            id,\n            buffer,\n            supportedFormat,\n        });\n        let textureResolve;\n        const promise = new Promise((res) =\u003e (textureResolve = res));\n        this.queue.set(id, textureResolve);\n        return promise;\n    }\n}\n","import { Mesh } from '../core/Mesh.js';\nimport { Program } from '../core/Program.js';\nimport { Geometry } from '../core/Geometry.js';\nimport { Color } from '../math/Color.js';\n\nexport class WireMesh extends Mesh {\n    constructor(gl, { geometry, wireColor = new Color(0, 0.75, 0.5), ...meshProps } = {}) {\n        const wireProgram = new Program(gl, {\n            vertex,\n            fragment,\n            uniforms: { wireColor: { value: wireColor } },\n        });\n\n        const positionArray = geometry.attributes.position.data;\n        const indices = [];\n        const hashSet = new Set();\n\n        function addUniqueIndices(idx) {\n            for (let i = 0; i \u003c idx.length; i += 2) {\n                if (isUniqueEdgePosition(idx[i] * 3, idx[i + 1] * 3, positionArray, hashSet)) {\n                    indices.push(idx[i], idx[i + 1]);\n                }\n            }\n        }\n\n        if (geometry.attributes.index) {\n            const idata = geometry.attributes.index.data;\n\n            for (let i = 0; i \u003c idata.length; i += 3) {\n                // For every triangle, make three line pairs (start, end)\n                // prettier-ignore\n                addUniqueIndices([\n                    idata[i], idata[i + 1],\n                    idata[i + 1], idata[i + 2],\n                    idata[i + 2], idata[i]\n                ]);\n            }\n        } else {\n            const numVertices = Math.floor(positionArray.length / 3);\n\n            for (let i = 0; i \u003c numVertices; i += 3) {\n                addUniqueIndices([i, i + 1, i + 1, i + 2, i + 2, i]);\n            }\n        }\n\n        const indicesTyped = indices.length \u003e 65536 ? new Uint32Array(indices) : new Uint16Array(indices);\n        const wireGeometry = new Geometry(gl, {\n            position: { ...geometry.attributes.position },\n            index: { data: indicesTyped },\n        });\n\n        super(gl, { ...meshProps, mode: gl.LINES, geometry: wireGeometry, program: wireProgram });\n    }\n}\n\n// from https://github.com/mrdoob/three.js/blob/0c26bb4bb8220126447c8373154ac045588441de/src/geometries/WireframeGeometry.js#L116\nfunction isUniqueEdgePosition(start, end, pos, hashSet) {\n    // prettier-ignore\n    const hash1 = [\n        pos[start], pos[start + 1], pos[start + 2],\n        pos[end], pos[end + 1], pos[end + 2]\n    ].join('#');\n\n    // coincident edge\n    // prettier-ignore\n    const hash2 = [\n        pos[end], pos[end + 1], pos[end + 2],\n        pos[start], pos[start + 1], pos[start + 2]\n    ].join('#');\n\n    const oldSize = hashSet.size;\n    hashSet.add(hash1);\n    hashSet.add(hash2);\n    return hashSet.size - oldSize === 2;\n}\n\nconst vertex = /* glsl */ `\nattribute vec3 position;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvoid main() {    \n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst fragment = /* glsl */ `\nprecision highp float;\nuniform vec3 wireColor;\n\nvoid main() {    \n    gl_FragColor = vec4(wireColor, 1.0);\n}\n`;\n","import { Mesh } from '../../core/Mesh.js';\nimport { Program } from '../../core/Program.js';\nimport { Geometry } from '../../core/Geometry.js';\nimport { Vec3 } from '../../math/Vec3.js';\n\nexport class AxesHelper extends Mesh {\n    constructor(\n        gl,\n        {\n            size = 1,\n            symmetric = false,\n            xColor = new Vec3(0.96, 0.21, 0.32),\n            yColor = new Vec3(0.44, 0.64, 0.11),\n            zColor = new Vec3(0.18, 0.52, 0.89),\n            ...meshProps\n        } = {}\n    ) {\n        const a = symmetric ? -size : 0;\n        const b = size;\n\n        // prettier-ignore\n        const vertices = new Float32Array([\n\t\t\ta, 0, 0,  b, 0, 0,\n\t\t\t0, a, 0,  0, b, 0,\n\t\t\t0, 0, a,  0, 0, b\n\t\t]);\n\n        // prettier-ignore\n        const colors = new Float32Array([\n\t\t\t...xColor,  ...xColor,\n\t\t\t...yColor,  ...yColor,\n\t\t\t...zColor,  ...zColor\n\t\t]);\n\n        const geometry = new Geometry(gl, {\n            position: { size: 3, data: vertices },\n            color: { size: 3, data: colors },\n        });\n\n        const program = new Program(gl, { vertex, fragment });\n\n        super(gl, { ...meshProps, mode: gl.LINES, geometry, program });\n    }\n}\n\nconst vertex = /* glsl */ `\nattribute vec3 position;\nattribute vec3 color;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvarying vec3 vColor;\n\nvoid main() {    \n    vColor = color;\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst fragment = /* glsl */ `\nprecision highp float;\nvarying vec3 vColor;\n\nvoid main() {    \n    gl_FragColor = vec4(vColor, 1.0);\n}\n`;\n","import { Mesh } from '../../core/Mesh.js';\nimport { Program } from '../../core/Program.js';\nimport { Geometry } from '../../core/Geometry.js';\nimport { Vec3 } from '../../math/Vec3.js';\n\nexport class GridHelper extends Mesh {\n    constructor(gl, { size = 10, divisions = 10, color = new Vec3(0.75, 0.75, 0.75), ...meshProps } = {}) {\n        const numVertices = (size + 1) * 2 * 2;\n        const vertices = new Float32Array(numVertices * 3);\n\n        const hs = size / 2;\n        for (let i = 0; i \u003c= divisions; i++) {\n            const t = i / divisions;\n            const o = t * size - hs;\n\n            vertices.set([o, 0, -hs, o, 0, hs], i * 12);\n            vertices.set([-hs, 0, o, hs, 0, o], i * 12 + 6);\n        }\n\n        const geometry = new Geometry(gl, {\n            position: { size: 3, data: vertices },\n        });\n\n        const program = new Program(gl, {\n            vertex,\n            fragment,\n            uniforms: {\n                color: { value: color },\n            },\n        });\n        super(gl, { ...meshProps, mode: gl.LINES, geometry, program });\n    }\n}\n\nconst vertex = /* glsl */ `\nattribute vec3 position;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\n\nvoid main() {    \n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst fragment = /* glsl */ `\nprecision highp float;\nuniform vec3 color;\n\nvoid main() {    \n    gl_FragColor = vec4(color, 1.0);\n}\n`;\n","import { Mesh } from '../../core/Mesh.js';\nimport { Program } from '../../core/Program.js';\nimport { Geometry } from '../../core/Geometry.js';\nimport { Vec3 } from '../../math/Vec3.js';\nimport { Mat3 } from '../../math/Mat3.js';\n\nexport class VertexNormalsHelper extends Mesh {\n    constructor(object, { size = 0.1, color = new Vec3(0.86, 0.16, 0.86), ...meshProps } = {}) {\n        const gl = object.gl;\n        const nNormals = object.geometry.attributes.normal.count;\n        const positionsArray = new Float32Array(nNormals * 2 * 3);\n        const normalsArray = new Float32Array(nNormals * 2 * 3);\n        const sizeArray = new Float32Array(nNormals * 2);\n\n        const normalData = object.geometry.attributes.normal.data;\n        const positionData = object.geometry.attributes.position.data;\n        const sizeData = new Float32Array([0, size]);\n\n        for (let i = 0; i \u003c nNormals; i++) {\n            const i6 = i * 6;\n            const i3 = i * 3;\n\n            // duplicate position and normal for line start and end point\n            const pSub = positionData.subarray(i3, i3 + 3);\n            positionsArray.set(pSub, i6);\n            positionsArray.set(pSub, i6 + 3);\n\n            const nSub = normalData.subarray(i3, i3 + 3);\n            normalsArray.set(nSub, i6);\n            normalsArray.set(nSub, i6 + 3);\n\n            sizeArray.set(sizeData, i * 2);\n        }\n\n        const geometry = new Geometry(gl, {\n            position: { size: 3, data: positionsArray },\n            normal: { size: 3, data: normalsArray },\n            size: { size: 1, data: sizeArray },\n        });\n\n        const program = new Program(gl, {\n            vertex,\n            fragment,\n            uniforms: {\n                color: { value: color },\n                worldNormalMatrix: { value: new Mat3() },\n                objectWorldMatrix: { value: object.worldMatrix },\n            },\n        });\n\n        super(gl, { ...meshProps, mode: gl.LINES, geometry, program });\n\n        this.object = object;\n    }\n\n    draw(arg) {\n        this.program.uniforms.worldNormalMatrix.value.getNormalMatrix(this.object.worldMatrix);\n        super.draw(arg);\n    }\n}\n\nconst vertex = /* glsl */ `\nattribute vec3 position;\nattribute vec3 normal;\nattribute float size;\n\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 objectWorldMatrix;\nuniform mat3 worldNormalMatrix;\n\nvoid main() {\n    vec3 n = normalize(worldNormalMatrix * normal) * size;\n    vec3 p = (objectWorldMatrix * vec4(position, 1.0)).xyz;\n    gl_Position = projectionMatrix * viewMatrix * vec4(p + n, 1.0);\n}\n`;\n\nconst fragment = /* glsl */ `\nprecision highp float;\nuniform vec3 color;\n\nvoid main() {    \n    gl_FragColor = vec4(color, 1.0);\n}\n`;\n","import { Mesh } from '../../core/Mesh.js';\nimport { Program } from '../../core/Program.js';\nimport { Geometry } from '../../core/Geometry.js';\nimport { Vec3 } from '../../math/Vec3.js';\nimport { Mat3 } from '../../math/Mat3.js';\n\nconst vA = /* @__PURE__ */ new Vec3();\nconst vB = /* @__PURE__ */ new Vec3();\nconst vC = /* @__PURE__ */ new Vec3();\nconst vCenter = /* @__PURE__ */ new Vec3();\nconst vNormal = /* @__PURE__ */ new Vec3();\n\nexport class FaceNormalsHelper extends Mesh {\n    constructor(object, { size = 0.1, color = new Vec3(0.15, 0.86, 0.86), ...meshProps } = {}) {\n        const gl = object.gl;\n\n        const positionData = object.geometry.attributes.position.data;\n        const sizeData = new Float32Array([0, size]);\n\n        const indexAttr = object.geometry.attributes.index;\n        const getIndex = indexAttr ? (i) =\u003e indexAttr.data[i] : (i) =\u003e i;\n        const numVertices = indexAttr ? indexAttr.data.length : Math.floor(positionData.length / 3);\n\n        const nNormals = Math.floor(numVertices / 3);\n        const positionsArray = new Float32Array(nNormals * 2 * 3);\n        const normalsArray = new Float32Array(nNormals * 2 * 3);\n        const sizeArray = new Float32Array(nNormals * 2);\n\n        for (let i = 0; i \u003c numVertices; i += 3) {\n            vA.fromArray(positionData, getIndex(i + 0) * 3);\n            vB.fromArray(positionData, getIndex(i + 1) * 3);\n            vC.fromArray(positionData, getIndex(i + 2) * 3);\n\n            vCenter\n                .add(vA, vB)\n                .add(vC)\n                .multiply(1 / 3);\n\n            vA.sub(vA, vB);\n            vC.sub(vC, vB);\n            vNormal.cross(vC, vA).normalize();\n\n            // duplicate position and normal for line start and end point\n            const i2 = i * 2;\n            positionsArray.set(vCenter, i2);\n            positionsArray.set(vCenter, i2 + 3);\n\n            normalsArray.set(vNormal, i2);\n            normalsArray.set(vNormal, i2 + 3);\n            sizeArray.set(sizeData, (i / 3) * 2);\n        }\n\n        const geometry = new Geometry(gl, {\n            position: { size: 3, data: positionsArray },\n            normal: { size: 3, data: normalsArray },\n            size: { size: 1, data: sizeArray },\n        });\n\n        const program = new Program(gl, {\n            vertex,\n            fragment,\n            uniforms: {\n                color: { value: color },\n                worldNormalMatrix: { value: new Mat3() },\n                objectWorldMatrix: { value: object.worldMatrix },\n            },\n        });\n\n        super(gl, { ...meshProps, mode: gl.LINES, geometry, program });\n\n        this.object = object;\n    }\n\n    draw(arg) {\n        this.program.uniforms.worldNormalMatrix.value.getNormalMatrix(this.object.worldMatrix);\n        super.draw(arg);\n    }\n}\n\nconst vertex = /* glsl */ `\nattribute vec3 position;\nattribute vec3 normal;\nattribute float size;\n\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 objectWorldMatrix;\nuniform mat3 worldNormalMatrix;\n\nvoid main() {\n    vec3 n = normalize(worldNormalMatrix * normal) * size;\n    vec3 p = (objectWorldMatrix * vec4(position, 1.0)).xyz;\n    gl_Position = projectionMatrix * viewMatrix * vec4(p + n, 1.0);\n}\n`;\n\nconst fragment = /* glsl */ `\nprecision highp float;\nuniform vec3 color;\n\nvoid main() {    \n    gl_FragColor = vec4(color, 1.0);\n}\n`;\n","import { Texture } from '../core/Texture.js';\n\nexport class Texture3D extends Texture {\n    constructor(gl, args) {\n        super(gl, {\n            ...args,\n            target: gl.TEXTURE_3D,\n            width: args.width ? args.width : 2,\n            height: args.height ? args.height : 2,\n        });\n\n        const image = new Image();\n        image.crossOrigin = '*';\n        image.src = args.src;\n\n        image.onload = () =\u003e {\n            let canvas = document.createElement('canvas');\n            canvas.width = image.width;\n            canvas.height = image.height;\n\n            let ctx = canvas.getContext('2d');\n            ctx.scale(1, -1);\n            ctx.translate(0, -image.height);\n            ctx.drawImage(image, 0, 0);\n            const imageData = ctx.getImageData(0, 0, image.width, image.height).data;\n\n            canvas = null;\n            ctx = null;\n            let elementCount;\n\n            switch (this.format) {\n                case gl.RED:\n                    elementCount = 1;\n                    break;\n                case gl.RG:\n                    elementCount = 2;\n                    break;\n                case gl.RGB:\n                    elementCount = 3;\n                    break;\n                default:\n                    elementCount = 4;\n                    break;\n            }\n\n            const dataCount = this.width * this.height * this.length * elementCount;\n            const data = this.type === gl.UNSIGNED_BYTE ? new Uint8Array(dataCount) : new Float32Array(dataCount);\n\n            let dataIterator = 0;\n\n            for (let z = 0; z \u003c this.length; z++) {\n                for (let y = 0; y \u003c this.height; y++) {\n                    for (let x = 0; x \u003c this.width; x++) {\n                        let zOffsetX = (z % args.tileCountX) * this.width;\n                        let zOffsetY = Math.floor(z / args.tileCountX) * (this.width * this.height * args.tileCountX);\n                        let index = x + zOffsetX + (y * image.width + zOffsetY);\n\n                        const r = imageData[index * 4];\n                        const g = imageData[index * 4 + 1];\n                        const b = imageData[index * 4 + 2];\n                        const a = imageData[index * 4 + 3];\n\n                        let texel = [r, g, b, a];\n\n                        for (let i = 0; i \u003c elementCount; i++) {\n                            if (this.type === this.gl.UNSIGNED_BYTE) {\n                                data[dataIterator++] = texel[i];\n                            } else {\n                                data[dataIterator++] = texel[i] / 255;\n                            }\n                        }\n                    }\n                }\n            }\n\n            this.image = data;\n            this.needsUpdate = true;\n        };\n    }\n}\n"],"version":3}
