{"version":3,"file":"swiper-gl.min.js","names":["length","a","x","y","z","Math","sqrt","copy","out","add","b","subtract","scale","squaredLength","normalize","len","dot","cross","ax","ay","az","bx","by","bz","angle","tempA","tempB","cosine","PI","acos","Vec3","Array","constructor","super","this","v","set","Vec3Func.set","Vec3Func.copy","va","vb","Vec3Func.add","sub","Vec3Func.subtract","multiply","Vec3Func.scale","divide","inverse","Vec3Func.length","distance","Vec3Func.distance","squaredLen","Vec3Func.squaredLength","squaredDistance","Vec3Func.squaredDistance","negate","Vec3Func.cross","Vec3Func.normalize","Vec3Func.dot","equals","applyMatrix3","mat3","m","Vec3Func.transformMat3","applyMatrix4","mat4","w","Vec3Func.transformMat4","scaleRotateMatrix4","Vec3Func.scaleRotateMat4","applyQuaternion","q","qx","qy","qz","uvx","uvy","uvz","uuvx","uuvy","uuvz","w2","Vec3Func.transformQuat","Vec3Func.angle","lerp","t","Vec3Func.lerp","clone","fromArray","o","toArray","transformDirection","tempVec3","ID","ATTR_ID","isBoundsWarned","Geometry","gl","attributes","canvas","console","error","id","VAOs","drawRange","start","count","instancedCount","renderer","bindVertexArray","currentGeometry","glState","state","key","addAttribute","attr","size","type","data","Float32Array","FLOAT","Uint16Array","UNSIGNED_SHORT","UNSIGNED_INT","target","ELEMENT_ARRAY_BUFFER","ARRAY_BUFFER","normalized","stride","offset","byteLength","divisor","instanced","needsUpdate","usage","STATIC_DRAW","buffer","updateAttribute","isInstanced","warn","min","index","max","isNewBuffer","createBuffer","boundBuffer","bindBuffer","bufferData","bufferSubData","setIndex","value","setDrawRange","setInstancedCount","createVAO","program","attributeOrder","createVertexArray","bindAttributes","attributeLocations","forEach","location","name","numLoc","i","vertexAttribPointer","enableVertexAttribArray","vertexAttribDivisor","draw","mode","TRIANGLES","drawElementsInstanced","drawArraysInstanced","drawElements","drawArrays","getPosition","position","computeBoundingBox","array","BYTES_PER_ELEMENT","bounds","center","radius","Infinity","l","computeBoundingSphere","maxRadiusSq","remove","deleteVertexArray","deleteBuffer","arrayCacheF32","Program","vertex","fragment","uniforms","transparent","cullFace","BACK","frontFace","CCW","depthTest","depthWrite","depthFunc","LESS","blendFunc","blendEquation","src","premultipliedAlpha","setBlendFunc","ONE","ONE_MINUS_SRC_ALPHA","SRC_ALPHA","vertexShader","createShader","VERTEX_SHADER","shaderSource","compileShader","getShaderInfoLog","addLineNumbers","fragmentShader","FRAGMENT_SHADER","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","deleteShader","uniformLocations","Map","numUniforms","ACTIVE_UNIFORMS","uIndex","uniform","getActiveUniform","getUniformLocation","split","match","uniformName","isStructArray","structIndex","Number","structProperty","isNaN","isStruct","locations","numAttribs","ACTIVE_ATTRIBUTES","aIndex","attribute","getActiveAttrib","getAttribLocation","join","dst","srcAlpha","dstAlpha","setBlendEquation","modeRGB","modeAlpha","applyState","enable","DEPTH_TEST","disable","CULL_FACE","BLEND","setCullFace","setFrontFace","setDepthMask","setDepthFunc","use","flipFaces","textureUnit","currentProgram","useProgram","activeUniform","undefined","texture","update","setUniform","textureUnits","push","CW","deleteProgram","arrayLen","valueLen","flatten","setValue","get","slice","arraysEqual","setArray","uniform1fv","uniform1f","uniform2fv","uniform3fv","uniform4fv","uniform1iv","uniform1i","uniform2iv","uniform3iv","uniform4iv","uniformMatrix2fv","uniformMatrix3fv","uniformMatrix4fv","string","lines","warnCount","message","Renderer","document","createElement","width","height","dpr","alpha","depth","stencil","antialias","preserveDrawingBuffer","powerPreference","autoClear","webgl","color","getContext","isWebgl2","setSize","ZERO","FUNC_ADD","depthMask","premultiplyAlpha","flipY","unpackAlignment","framebuffer","viewport","activeTextureUnit","extensions","getExtension","drawBuffers","parameters","maxTextureUnits","getParameter","MAX_COMBINED_TEXTURE_IMAGE_UNITS","maxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","Object","assign","style","setViewport","setScissor","scissor","blendFuncSeparate","blendEquationSeparate","activeTexture","TEXTURE0","bindFramebuffer","FRAMEBUFFER","extension","webgl2Func","extFunc","bind","sortOpaque","renderOrder","zDepth","sortTransparent","sortUI","getRenderList","scene","camera","frustumCull","sort","renderList","updateFrustum","traverse","node","visible","frustumCulled","frustumIntersectsMesh","opaque","ui","worldMatrix","getTranslation","projectionViewMatrix","concat","render","clear","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","STENCIL_BUFFER_BIT","updateMatrixWorld","aw","bw","vec4.copy","vec4.set","vec4.dot","vec4.normalize","Quat","onChange","identity","QuatFunc.set","rotateX","rad","sin","cos","QuatFunc.rotateX","rotateY","QuatFunc.rotateY","rotateZ","QuatFunc.rotateZ","a0","a1","a2","a3","invDot","QuatFunc.invert","conjugate","QuatFunc.copy","QuatFunc.normalize","qA","qB","QuatFunc.multiply","QuatFunc.dot","fromMatrix3","matrix3","fRoot","fTrace","j","k","QuatFunc.fromMat3","fromEuler","euler","order","sx","cx","sy","cy","sz","cz","QuatFunc.fromEuler","fromAxisAngle","axis","s","QuatFunc.setAxisAngle","slerp","omega","cosom","sinom","scale0","scale1","QuatFunc.slerp","a00","a01","a02","a03","a10","a11","a12","a13","a20","a21","a22","a23","a30","a31","a32","a33","b0","b1","b2","b3","getScaling","mat","m11","m12","m13","m21","m22","m23","m31","m32","m33","hypot","getRotation","temp","scaling","is1","is2","is3","sm11","sm12","sm13","sm21","sm22","sm23","sm31","sm32","sm33","trace","S","Mat4","m00","m01","m02","m03","m10","m20","m30","Mat4Func.set","translate","Mat4Func.translate","rotate","c","b00","b01","b02","b10","b11","b12","b20","b21","b22","abs","Mat4Func.rotate","Mat4Func.scale","ma","mb","Mat4Func.multiply","fromPerspective","fov","aspect","near","far","fovy","f","tan","nf","Mat4Func.perspective","fromOrthogonal","left","right","bottom","top","lr","bt","Mat4Func.ortho","fromQuaternion","x2","y2","z2","xx","yx","yy","zx","zy","zz","wx","wy","wz","Mat4Func.fromQuat","setPosition","b03","b04","b05","b06","b07","b08","b09","det","Mat4Func.invert","compose","pos","xy","xz","yz","Mat4Func.fromRotationTranslationScale","Mat4Func.getRotation","Mat4Func.getScaling","getMaxScaleOnAxis","Mat4Func.getMaxScaleOnAxis","lookAt","eye","up","eyex","eyey","eyez","upx","upy","upz","z0","z1","x0","x1","Mat4Func.targetTo","determinant","Mat4Func.determinant","tmpMat4","Euler","reorder","fromRotationMatrix","asin","atan2","EulerFunc.fromRotationMatrix","Transform","parent","children","matrix","matrixAutoUpdate","quaternion","rotation","setParent","notifyParent","removeChild","addChild","child","notifyChild","indexOf","splice","force","updateMatrix","worldMatrixNeedsUpdate","callback","decompose","invert","tempMat4","tempVec3a","tempVec3b","Camera","zoom","projectionMatrix","viewMatrix","worldPosition","orthographic","perspective","project","unproject","frustum","constant","invLen","geometry","frustumIntersectsSphere","normal","plane","Mat3","Mat3Func.set","Mat3Func.translate","Mat3Func.rotate","Mat3Func.scale","Mat3Func.multiply","fromMatrix4","Mat3Func.fromQuat","fromBasis","vec3a","vec3b","vec3c","Mat3Func.invert","getNormalMatrix","Mat3Func.normalFromMat4","Mesh","modelViewMatrix","normalMatrix","beforeRenderCallbacks","afterRenderCallbacks","onBeforeRender","onAfterRender","mesh","modelMatrix","cameraPosition","emptyPixel","Uint8Array","isPowerOf2","Texture","image","TEXTURE_2D","UNSIGNED_BYTE","format","RGBA","internalFormat","wrapS","CLAMP_TO_EDGE","wrapT","generateMipmaps","minFilter","NEAREST_MIPMAP_LINEAR","LINEAR","magFilter","anisotropy","level","createTexture","store","REPEAT","bindTexture","pixelStorei","UNPACK_FLIP_Y_WEBGL","UNPACK_PREMULTIPLY_ALPHA_WEBGL","UNPACK_ALIGNMENT","texParameteri","TEXTURE_MIN_FILTER","TEXTURE_MAG_FILTER","TEXTURE_WRAP_S","TEXTURE_WRAP_T","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","TEXTURE_CUBE_MAP","texImage2D","TEXTURE_CUBE_MAP_POSITIVE_X","ArrayBuffer","isView","isCompressedTexture","compressedTexImage2D","generateMipmap","onUpdate","Vec4","Vec4Func.set","Vec4Func.copy","Vec4Func.normalize","Vec4Func.dot","Plane","widthSegments","heightSegments","wSegs","hSegs","num","numIndices","uv","Uint32Array","buildPlane","static","u","uDir","vDir","ii","io","segW","segH","iy","ix","d","displacement","F2","G2","fastFloor","floor","grad2","Float64Array","randFloatSpread","range","random","randFloat","low","high","noise2D","perm","tableSize","p","r","aux","buildPermutationTable","permGrad2x","map","permGrad2y","n0","n1","n2","y0","i1","j1","y1","jj","t0","gi0","t1","gi1","t2","gi2","createNoise2D","clamp","fragmentCommon","vertexCommon","vertexRotate","shaders","dots","flyeye","intensity","detail","offsetTop","pixelize","ripple","shutters","slices","squares","stretch","wind","defaultVertex","getRandomShader","arr","opts","shaderPerSlide","swiper","params","loop","realIndex","activeIndex","allShaders","isArray","keys","includes","keyIndex","GL","shader","displacementMap","window","innerWidth","innerHeight","clearColor","container","el","displacementTexture","isElement","setAttribute","prepend","time","current","init","addObjects","resize","animateUniform","targetValue","cb","startPosition","startTime","cancelAnimationFrame","animateUniformFrame","dir","isOutOfBound","animate","destroyed","Date","getTime","progress","speed","easeProgress","currentPosition","requestAnimationFrame","loadTextures","promises","that","images","textures","querySelectorAll","img","url","promise","Promise","resolve","Image","crossOrigin","onload","all","then","initialized","onInit","dist","atan","imageAspect","material","resolution","vertexMaterial","nextMesh","currentMesh","createMaterial","derivatives","texture1","texture2","number","gran","granH","rows","offsets","positions","centroids","control0","control1","randoms","uvs","currentShift","bary","currentHeight","sign","simp","ctrl0","ctrl1","o1","c1","getGeometry","replaceShader","newShaderName","fromTexture","newTexture","replaceRandomShader","setProgress","fromIndex","toIndex","needsTransitionDuration","needShaderReplace","glDestroyed","slides","parseInt","getAttribute","preventShaderReplace","item","destroy","SwiperElementRegisterParams","on","extendParams","noWebGLSupport","glInit","previousProgress","effect","WebGLRenderingContext","e","supportsWebGL","classNames","containerModifierClass","overwriteParams","watchSlidesProgress","originalParams","from","to","transitionProgress","targetIndex","slideEl","slideIndex","cssMode","round","newFrom","newTo","_s","duration"],"sources":["../node_modules/ogl/src/math/functions/Vec3Func.js","../node_modules/ogl/src/math/Vec3.js","../node_modules/ogl/src/core/Geometry.js","../node_modules/ogl/src/core/Program.js","../node_modules/ogl/src/core/Renderer.js","../node_modules/ogl/src/math/functions/Vec4Func.js","../node_modules/ogl/src/math/functions/QuatFunc.js","../node_modules/ogl/src/math/Quat.js","../node_modules/ogl/src/math/functions/Mat4Func.js","../node_modules/ogl/src/math/Mat4.js","../node_modules/ogl/src/math/Euler.js","../node_modules/ogl/src/math/functions/EulerFunc.js","../node_modules/ogl/src/core/Transform.js","../node_modules/ogl/src/core/Camera.js","../node_modules/ogl/src/math/functions/Mat3Func.js","../node_modules/ogl/src/math/Mat3.js","../node_modules/ogl/src/core/Mesh.js","../node_modules/ogl/src/core/Texture.js","../node_modules/ogl/src/math/Vec4.js","../node_modules/ogl/src/extras/Plane.js","../demo-vite/gl/displacement.js","../node_modules/simplex-noise/dist/esm/simplex-noise.js","../demo-vite/gl/getGeometry.js","../demo-vite/gl/shaders/shadersCommon.js","../demo-vite/gl/shaders.js","../demo-vite/gl/shaders/dots.js","../demo-vite/gl/shaders/flyeye.js","../demo-vite/gl/shaders/morph-x.js","../demo-vite/gl/shaders/morph-y.js","../demo-vite/gl/shaders/page-curl.js","../demo-vite/gl/shaders/peel-x.js","../demo-vite/gl/shaders/peel-y.js","../demo-vite/gl/shaders/polygons-fall.js","../demo-vite/gl/shaders/polygons-morph.js","../demo-vite/gl/shaders/polygons-wind.js","../demo-vite/gl/shaders/pixelize.js","../demo-vite/gl/shaders/ripple.js","../demo-vite/gl/shaders/shutters.js","../demo-vite/gl/shaders/slices.js","../demo-vite/gl/shaders/squares.js","../demo-vite/gl/shaders/stretch.js","../demo-vite/gl/shaders/wave-x.js","../demo-vite/gl/shaders/wind.js","../demo-vite/gl/gl.js","../demo-vite/swiper-gl.esm.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 > 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 * 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 > 1.0) {\n return 0;\n } else if (cosine < -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] && a[1] === b[1] && 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 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 = 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 && 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 }) => {\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 * numLoc;\n const offset = numLoc === 1 ? 0 : numLoc * numLoc;\n\n for (let i = 0; i < 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 }) => {\n const attr = this.attributes[name];\n if (attr.needsUpdate) this.updateAttribute(attr);\n });\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 * 2,\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(mode, this.drawRange.count, this.attributes.index.type, this.attributes.index.offset + this.drawRange.start * 2);\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 const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : 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 < 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 const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : attr.size;\n\n if (!this.bounds) this.computeBoundingBox(attr);\n\n let maxRadiusSq = 0;\n for (let i = 0, l = array.length; i < 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.LESS,\n } = {}\n ) {\n if (!gl.canvas) console.error('gl not passed as fist 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\n // set default blendFunc if transparent flagged\n if (this.transparent && !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 // compile vertex shader and log errors\n const vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertex);\n gl.compileShader(vertexShader);\n if (gl.getShaderInfoLog(vertexShader) !== '') {\n console.warn(`${gl.getShaderInfoLog(vertexShader)}\\nVertex Shader\\n${addLineNumbers(vertex)}`);\n }\n\n // compile fragment shader and log errors\n const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragment);\n gl.compileShader(fragmentShader);\n if (gl.getShaderInfoLog(fragmentShader) !== '') {\n console.warn(`${gl.getShaderInfoLog(fragmentShader)}\\nFragment Shader\\n${addLineNumbers(fragment)}`);\n }\n\n // compile program and log errors\n this.program = gl.createProgram();\n gl.attachShader(this.program, vertexShader);\n gl.attachShader(this.program, fragmentShader);\n gl.linkProgram(this.program);\n if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {\n return console.warn(gl.getProgramInfoLog(this.program));\n }\n\n // Remove shader once linked\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n\n // Get active uniform locations\n this.uniformLocations = new Map();\n let numUniforms = gl.getProgramParameter(this.program, gl.ACTIVE_UNIFORMS);\n for (let uIndex = 0; uIndex < numUniforms; uIndex++) {\n let uniform = gl.getActiveUniform(this.program, uIndex);\n this.uniformLocations.set(uniform, 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\n if (split.length === 3) {\n uniform.isStructArray = true;\n uniform.structIndex = Number(split[1]);\n uniform.structProperty = split[2];\n } else if (split.length === 2 && isNaN(Number(split[1]))) {\n uniform.isStruct = true;\n uniform.structProperty = split[1];\n }\n }\n\n // Get active attribute locations\n this.attributeLocations = new Map();\n const locations = [];\n const numAttribs = gl.getProgramParameter(this.program, gl.ACTIVE_ATTRIBUTES);\n for (let aIndex = 0; aIndex < numAttribs; aIndex++) {\n const attribute = gl.getActiveAttrib(this.program, aIndex);\n const location = 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 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)\n 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\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) => {\n let name = activeUniform.uniformName;\n\n // get supplied uniform\n let uniform = this.uniforms[name];\n\n // For structs, get the specific property instead of the entire object\n if (activeUniform.isStruct) {\n uniform = uniform[activeUniform.structProperty];\n name += `.${activeUniform.structProperty}`;\n }\n if (activeUniform.isStructArray) {\n uniform = uniform[activeUniform.structIndex][activeUniform.structProperty];\n name += `[${activeUniform.structIndex}].${activeUniform.structProperty}`;\n }\n\n if (!uniform) {\n return warn(`Active uniform ${name} has not been supplied`);\n }\n\n if (uniform && uniform.value === undefined) {\n return warn(`${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 && uniform.value[0].texture) {\n const textureUnits = [];\n uniform.value.forEach((value) => {\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 35680:\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 < 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 < 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 < 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 < l; i++) {\n a[i] = b[i];\n }\n}\n\nlet warnCount = 0;\nfunction warn(message) {\n if (warnCount > 100) return;\n console.warn(message);\n warnCount++;\n if (warnCount > 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 = 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 = null;\n this.state.frontFace = this.gl.CCW;\n this.state.depthMask = true;\n this.state.depthFunc = this.gl.LESS;\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 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 && 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 &&\n this.state.blendFunc.dst === dst &&\n this.state.blendFunc.srcAlpha === srcAlpha &&\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 && 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 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 && 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 && frustumCull) camera.updateFrustum();\n\n // Get visible\n scene.traverse((node) => {\n if (!node.visible) return true;\n if (!node.draw) return;\n\n if (frustumCull && node.frustumCulled && 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) => {\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 && clear !== false)) {\n // Ensure depth buffer writing is enabled so it can be cleared\n if (this.depth && (!target || target.depth)) {\n this.enable(this.gl.DEPTH_TEST);\n this.setDepthMask(true);\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) => {\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 > 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 < 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 > 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 > 0.0) {\n // |w| > 1/2, may as well choose w > 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| <= 1/2\n let i = 0;\n if (m[4] > m[0]) i = 1;\n if (m[8] > 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 = () => {};\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 this.onChange();\n }\n\n set y(v) {\n this[1] = v;\n this.onChange();\n }\n\n set z(v) {\n this[2] = v;\n this.onChange();\n }\n\n set w(v) {\n this[3] = v;\n this.onChange();\n }\n\n identity() {\n QuatFunc.identity(this);\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, x, y, z, w);\n this.onChange();\n return this;\n }\n\n rotateX(a) {\n QuatFunc.rotateX(this, this, a);\n this.onChange();\n return this;\n }\n\n rotateY(a) {\n QuatFunc.rotateY(this, this, a);\n this.onChange();\n return this;\n }\n\n rotateZ(a) {\n QuatFunc.rotateZ(this, this, a);\n this.onChange();\n return this;\n }\n\n inverse(q = this) {\n QuatFunc.invert(this, q);\n this.onChange();\n return this;\n }\n\n conjugate(q = this) {\n QuatFunc.conjugate(this, q);\n this.onChange();\n return this;\n }\n\n copy(q) {\n QuatFunc.copy(this, q);\n this.onChange();\n return this;\n }\n\n normalize(q = this) {\n QuatFunc.normalize(this, q);\n this.onChange();\n return this;\n }\n\n multiply(qA, qB) {\n if (qB) {\n QuatFunc.multiply(this, qA, qB);\n } else {\n QuatFunc.multiply(this, this, qA);\n }\n this.onChange();\n return this;\n }\n\n dot(v) {\n return QuatFunc.dot(this, v);\n }\n\n fromMatrix3(matrix3) {\n QuatFunc.fromMat3(this, matrix3);\n this.onChange();\n return this;\n }\n\n fromEuler(euler) {\n QuatFunc.fromEuler(this, euler, euler.order);\n return this;\n }\n\n fromAxisAngle(axis, a) {\n QuatFunc.setAxisAngle(this, axis, a);\n return this;\n }\n\n slerp(q, t) {\n QuatFunc.slerp(this, this, q, t);\n return 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 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","const 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) < 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 = [0, 0, 0];\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 > 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 > sm22 && sm11 > 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 > 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 * 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 multiply(ma, mb) {\n 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.fromRotationTranslationScale(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","import * as EulerFunc from './functions/EulerFunc.js';\nimport { Mat4 } from './Mat4.js';\n\nconst tmpMat4 = 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 = () => {};\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 this.onChange();\n }\n\n set y(v) {\n this[1] = v;\n this.onChange();\n }\n\n set z(v) {\n this[2] = v;\n this.onChange();\n }\n\n set(x, y = x, z = x) {\n if (x.length) return this.copy(x);\n this[0] = x;\n this[1] = y;\n this[2] = z;\n this.onChange();\n return this;\n }\n\n copy(v) {\n this[0] = v[0];\n this[1] = v[1];\n this[2] = v[2];\n this.onChange();\n return this;\n }\n\n reorder(order) {\n this.order = order;\n this.onChange();\n return this;\n }\n\n fromRotationMatrix(m, order = this.order) {\n EulerFunc.fromRotationMatrix(this, m, order);\n return this;\n }\n\n fromQuaternion(q, order = this.order) {\n tmpMat4.fromQuaternion(q);\n return this.fromRotationMatrix(tmpMat4, order);\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","// 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]) < 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]) < 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]) < 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]) < 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]) < 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]) < 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 { 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\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.onChange = () => this.quaternion.fromEuler(this.rotation);\n this.quaternion.onChange = () => this.rotation.fromQuaternion(this.quaternion);\n }\n\n setParent(parent, notifyParent = true) {\n if (this.parent && parent !== this.parent) this.parent.removeChild(this, false);\n this.parent = parent;\n if (notifyParent && 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 < 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 < l; i++) {\n this.children[i].traverse(callback);\n }\n }\n\n decompose() {\n this.matrix.getTranslation(this.position);\n this.matrix.getRotation(this.quaternion);\n this.matrix.getScaling(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);\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 = new Mat4();\nconst tempVec3a = new Vec3();\nconst tempVec3b = 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,\n right = this.right,\n bottom = this.bottom,\n top = this.top,\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 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 < 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) {\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(node.worldMatrix);\n\n const radius = node.geometry.bounds.radius * node.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 < 6; i++) {\n const plane = this.frustum[i];\n const distance = normal.copy(plane).dot(center) + plane.constant;\n if (distance < -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 this.beforeRenderCallbacks.forEach((f) => f && f({ mesh: this, 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\n // determine if faces need to be flipped - when mesh scaled negatively\n let flipFaces = this.program.cullFace && this.worldMatrix.determinant() < 0;\n this.program.use({ flipFaces });\n this.geometry.draw({ mode: this.mode, program: this.program });\n this.afterRenderCallbacks.forEach((f) => f && 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 & (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 generateMipmaps = true,\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 ? true : false,\n anisotropy = 0,\n level = 0,\n width, // used for RenderTargets or Data Textures\n height = width,\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.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.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 && !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.anisotropy && this.anisotropy !== this.state.anisotropy) {\n this.gl.texParameterf(\n this.target,\n this.gl.renderer.getExtension('EXT_texture_filter_anisotropic').TEXTURE_MAX_ANISOTROPY_EXT,\n this.anisotropy\n );\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 < 6; i++) {\n this.gl.texImage2D(\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i,\n this.level,\n this.internalFormat,\n this.format,\n this.type,\n this.image[i]\n );\n }\n } else if (ArrayBuffer.isView(this.image)) {\n // Data texture\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.image.isCompressedTexture) {\n // Compressed texture\n for (let level = 0; level < this.image.length; level++) {\n this.gl.compressedTexImage2D(\n this.target,\n level,\n this.internalFormat,\n this.image[level].width,\n this.image[level].height,\n 0,\n this.image[level].data\n );\n }\n } else {\n // Regular texture\n this.gl.texImage2D(this.target, this.level, this.internalFormat, this.format, this.type, this.image);\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 && (!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 && 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 < 6; i++) {\n this.gl.texImage2D(\n this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i,\n 0,\n this.gl.RGBA,\n 1,\n 1,\n 0,\n this.gl.RGBA,\n this.gl.UNSIGNED_BYTE,\n emptyPixel\n );\n }\n } else if (this.width) {\n // image intentionally left null for RenderTarget\n this.gl.texImage2D(this.target, this.level, this.internalFormat, this.width, this.height, 0, this.format, this.type, null);\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 * 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, z, w) {\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 > 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 <= hSegs; iy++) {\n let y = iy * segH - height / 2;\n for (let ix = 0; ix <= 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 >= 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","// eslint-disable-next-line\nexport const displacement = `data:image/jpeg;base64,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`;\n","/*\n * A fast javascript implementation of simplex noise by Jonas Wagner\n\nBased on a speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.\nWhich is based on example code by Stefan Gustavson (stegu@itn.liu.se).\nWith Optimisations by Peter Eastman (peastman@drizzle.stanford.edu).\nBetter rank ordering method by Stefan Gustavson in 2012.\n\n Copyright (c) 2022 Jonas Wagner\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n// these #__PURE__ comments help uglifyjs with dead code removal\n// \nconst F2 = /*#__PURE__*/ 0.5 * (Math.sqrt(3.0) - 1.0);\nconst G2 = /*#__PURE__*/ (3.0 - Math.sqrt(3.0)) / 6.0;\nconst F3 = 1.0 / 3.0;\nconst G3 = 1.0 / 6.0;\nconst F4 = /*#__PURE__*/ (Math.sqrt(5.0) - 1.0) / 4.0;\nconst G4 = /*#__PURE__*/ (5.0 - Math.sqrt(5.0)) / 20.0;\n// I'm really not sure why this | 0 (basically a coercion to int)\n// is making this faster but I get ~5 million ops/sec more on the\n// benchmarks across the board or a ~10% speedup.\nconst fastFloor = (x) => Math.floor(x) | 0;\nconst grad2 = /*#__PURE__*/ new Float64Array([1, 1,\n -1, 1,\n 1, -1,\n -1, -1,\n 1, 0,\n -1, 0,\n 1, 0,\n -1, 0,\n 0, 1,\n 0, -1,\n 0, 1,\n 0, -1]);\n// double seems to be faster than single or int's\n// probably because most operations are in double precision\nconst grad3 = /*#__PURE__*/ new Float64Array([1, 1, 0,\n -1, 1, 0,\n 1, -1, 0,\n -1, -1, 0,\n 1, 0, 1,\n -1, 0, 1,\n 1, 0, -1,\n -1, 0, -1,\n 0, 1, 1,\n 0, -1, 1,\n 0, 1, -1,\n 0, -1, -1]);\n// double is a bit quicker here as well\nconst grad4 = /*#__PURE__*/ new Float64Array([0, 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1,\n 0, -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1,\n 1, 0, 1, 1, 1, 0, 1, -1, 1, 0, -1, 1, 1, 0, -1, -1,\n -1, 0, 1, 1, -1, 0, 1, -1, -1, 0, -1, 1, -1, 0, -1, -1,\n 1, 1, 0, 1, 1, 1, 0, -1, 1, -1, 0, 1, 1, -1, 0, -1,\n -1, 1, 0, 1, -1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, -1,\n 1, 1, 1, 0, 1, 1, -1, 0, 1, -1, 1, 0, 1, -1, -1, 0,\n -1, 1, 1, 0, -1, 1, -1, 0, -1, -1, 1, 0, -1, -1, -1, 0]);\n/**\n * Creates a 2D noise function\n * @param random the random function that will be used to build the permutation table\n * @returns {NoiseFunction2D}\n */\nexport function createNoise2D(random = Math.random) {\n const perm = buildPermutationTable(random);\n // precalculating this yields a little ~3% performance improvement.\n const permGrad2x = new Float64Array(perm).map(v => grad2[(v % 12) * 2]);\n const permGrad2y = new Float64Array(perm).map(v => grad2[(v % 12) * 2 + 1]);\n return function noise2D(x, y) {\n // if(!isFinite(x) || !isFinite(y)) return 0;\n let n0 = 0; // Noise contributions from the three corners\n let n1 = 0;\n let n2 = 0;\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y) * F2; // Hairy factor for 2D\n const i = fastFloor(x + s);\n const j = fastFloor(y + s);\n const t = (i + j) * G2;\n const X0 = i - t; // Unskew the cell origin back to (x,y) space\n const Y0 = j - t;\n const x0 = x - X0; // The x,y distances from the cell origin\n const y0 = y - Y0;\n // For the 2D case, the simplex shape is an equilateral triangle.\n // Determine which simplex we are in.\n let i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords\n if (x0 > y0) {\n i1 = 1;\n j1 = 0;\n } // lower triangle, XY order: (0,0)->(1,0)->(1,1)\n else {\n i1 = 0;\n j1 = 1;\n } // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n // c = (3-sqrt(3))/6\n const x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n const y1 = y0 - j1 + G2;\n const x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n const y2 = y0 - 1.0 + 2.0 * G2;\n // Work out the hashed gradient indices of the three simplex corners\n const ii = i & 255;\n const jj = j & 255;\n // Calculate the contribution from the three corners\n let t0 = 0.5 - x0 * x0 - y0 * y0;\n if (t0 >= 0) {\n const gi0 = ii + perm[jj];\n const g0x = permGrad2x[gi0];\n const g0y = permGrad2y[gi0];\n t0 *= t0;\n // n0 = t0 * t0 * (grad2[gi0] * x0 + grad2[gi0 + 1] * y0); // (x,y) of grad3 used for 2D gradient\n n0 = t0 * t0 * (g0x * x0 + g0y * y0);\n }\n let t1 = 0.5 - x1 * x1 - y1 * y1;\n if (t1 >= 0) {\n const gi1 = ii + i1 + perm[jj + j1];\n const g1x = permGrad2x[gi1];\n const g1y = permGrad2y[gi1];\n t1 *= t1;\n // n1 = t1 * t1 * (grad2[gi1] * x1 + grad2[gi1 + 1] * y1);\n n1 = t1 * t1 * (g1x * x1 + g1y * y1);\n }\n let t2 = 0.5 - x2 * x2 - y2 * y2;\n if (t2 >= 0) {\n const gi2 = ii + 1 + perm[jj + 1];\n const g2x = permGrad2x[gi2];\n const g2y = permGrad2y[gi2];\n t2 *= t2;\n // n2 = t2 * t2 * (grad2[gi2] * x2 + grad2[gi2 + 1] * y2);\n n2 = t2 * t2 * (g2x * x2 + g2y * y2);\n }\n // Add contributions from each corner to get the final noise value.\n // The result is scaled to return values in the interval [-1,1].\n return 70.0 * (n0 + n1 + n2);\n };\n}\n/**\n * Creates a 3D noise function\n * @param random the random function that will be used to build the permutation table\n * @returns {NoiseFunction3D}\n */\nexport function createNoise3D(random = Math.random) {\n const perm = buildPermutationTable(random);\n // precalculating these seems to yield a speedup of over 15%\n const permGrad3x = new Float64Array(perm).map(v => grad3[(v % 12) * 3]);\n const permGrad3y = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 1]);\n const permGrad3z = new Float64Array(perm).map(v => grad3[(v % 12) * 3 + 2]);\n return function noise3D(x, y, z) {\n let n0, n1, n2, n3; // Noise contributions from the four corners\n // Skew the input space to determine which simplex cell we're in\n const s = (x + y + z) * F3; // Very nice and simple skew factor for 3D\n const i = fastFloor(x + s);\n const j = fastFloor(y + s);\n const k = fastFloor(z + s);\n const t = (i + j + k) * G3;\n const X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n const Y0 = j - t;\n const Z0 = k - t;\n const x0 = x - X0; // The x,y,z distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n // For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n // Determine which simplex we are in.\n let i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords\n let i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords\n if (x0 >= y0) {\n if (y0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 1;\n k2 = 0;\n } // X Y Z order\n else if (x0 >= z0) {\n i1 = 1;\n j1 = 0;\n k1 = 0;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // X Z Y order\n else {\n i1 = 0;\n j1 = 0;\n k1 = 1;\n i2 = 1;\n j2 = 0;\n k2 = 1;\n } // Z X Y order\n }\n else { // x0 grad4[(v % 32) * 4]);\n const permGrad4y = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 1]);\n const permGrad4z = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 2]);\n const permGrad4w = new Float64Array(perm).map(v => grad4[(v % 32) * 4 + 3]);\n return function noise4D(x, y, z, w) {\n let n0, n1, n2, n3, n4; // Noise contributions from the five corners\n // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n const s = (x + y + z + w) * F4; // Factor for 4D skewing\n const i = fastFloor(x + s);\n const j = fastFloor(y + s);\n const k = fastFloor(z + s);\n const l = fastFloor(w + s);\n const t = (i + j + k + l) * G4; // Factor for 4D unskewing\n const X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n const Y0 = j - t;\n const Z0 = k - t;\n const W0 = l - t;\n const x0 = x - X0; // The x,y,z,w distances from the cell origin\n const y0 = y - Y0;\n const z0 = z - Z0;\n const w0 = w - W0;\n // For the 4D case, the simplex is a 4D shape I won't even try to describe.\n // To find out which of the 24 possible simplices we're in, we need to\n // determine the magnitude ordering of x0, y0, z0 and w0.\n // Six pair-wise comparisons are performed between each possible pair\n // of the four coordinates, and the results are used to rank the numbers.\n let rankx = 0;\n let ranky = 0;\n let rankz = 0;\n let rankw = 0;\n if (x0 > y0)\n rankx++;\n else\n ranky++;\n if (x0 > z0)\n rankx++;\n else\n rankz++;\n if (x0 > w0)\n rankx++;\n else\n rankw++;\n if (y0 > z0)\n ranky++;\n else\n rankz++;\n if (y0 > w0)\n ranky++;\n else\n rankw++;\n if (z0 > w0)\n rankz++;\n else\n rankw++;\n // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n // Many values of c will never occur, since e.g. x>y>z>w makes x= 3 ? 1 : 0;\n const j1 = ranky >= 3 ? 1 : 0;\n const k1 = rankz >= 3 ? 1 : 0;\n const l1 = rankw >= 3 ? 1 : 0;\n // The integer offsets for the third simplex corner\n const i2 = rankx >= 2 ? 1 : 0;\n const j2 = ranky >= 2 ? 1 : 0;\n const k2 = rankz >= 2 ? 1 : 0;\n const l2 = rankw >= 2 ? 1 : 0;\n // The integer offsets for the fourth simplex corner\n const i3 = rankx >= 1 ? 1 : 0;\n const j3 = ranky >= 1 ? 1 : 0;\n const k3 = rankz >= 1 ? 1 : 0;\n const l3 = rankw >= 1 ? 1 : 0;\n // The fifth corner has all coordinate offsets = 1, so no need to compute that.\n const x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n const y1 = y0 - j1 + G4;\n const z1 = z0 - k1 + G4;\n const w1 = w0 - l1 + G4;\n const x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n const y2 = y0 - j2 + 2.0 * G4;\n const z2 = z0 - k2 + 2.0 * G4;\n const w2 = w0 - l2 + 2.0 * G4;\n const x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n const y3 = y0 - j3 + 3.0 * G4;\n const z3 = z0 - k3 + 3.0 * G4;\n const w3 = w0 - l3 + 3.0 * G4;\n const x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n const y4 = y0 - 1.0 + 4.0 * G4;\n const z4 = z0 - 1.0 + 4.0 * G4;\n const w4 = w0 - 1.0 + 4.0 * G4;\n // Work out the hashed gradient indices of the five simplex corners\n const ii = i & 255;\n const jj = j & 255;\n const kk = k & 255;\n const ll = l & 255;\n // Calculate the contribution from the five corners\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n if (t0 < 0)\n n0 = 0.0;\n else {\n const gi0 = ii + perm[jj + perm[kk + perm[ll]]];\n t0 *= t0;\n n0 = t0 * t0 * (permGrad4x[gi0] * x0 + permGrad4y[gi0] * y0 + permGrad4z[gi0] * z0 + permGrad4w[gi0] * w0);\n }\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n if (t1 < 0)\n n1 = 0.0;\n else {\n const gi1 = ii + i1 + perm[jj + j1 + perm[kk + k1 + perm[ll + l1]]];\n t1 *= t1;\n n1 = t1 * t1 * (permGrad4x[gi1] * x1 + permGrad4y[gi1] * y1 + permGrad4z[gi1] * z1 + permGrad4w[gi1] * w1);\n }\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n if (t2 < 0)\n n2 = 0.0;\n else {\n const gi2 = ii + i2 + perm[jj + j2 + perm[kk + k2 + perm[ll + l2]]];\n t2 *= t2;\n n2 = t2 * t2 * (permGrad4x[gi2] * x2 + permGrad4y[gi2] * y2 + permGrad4z[gi2] * z2 + permGrad4w[gi2] * w2);\n }\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n if (t3 < 0)\n n3 = 0.0;\n else {\n const gi3 = ii + i3 + perm[jj + j3 + perm[kk + k3 + perm[ll + l3]]];\n t3 *= t3;\n n3 = t3 * t3 * (permGrad4x[gi3] * x3 + permGrad4y[gi3] * y3 + permGrad4z[gi3] * z3 + permGrad4w[gi3] * w3);\n }\n let t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n if (t4 < 0)\n n4 = 0.0;\n else {\n const gi4 = ii + 1 + perm[jj + 1 + perm[kk + 1 + perm[ll + 1]]];\n t4 *= t4;\n n4 = t4 * t4 * (permGrad4x[gi4] * x4 + permGrad4y[gi4] * y4 + permGrad4z[gi4] * z4 + permGrad4w[gi4] * w4);\n }\n // Sum up and scale the result to cover the range [-1,1]\n return 27.0 * (n0 + n1 + n2 + n3 + n4);\n };\n}\n/**\n * Builds a random permutation table.\n * This is exported only for (internal) testing purposes.\n * Do not rely on this export.\n * @private\n */\nexport function buildPermutationTable(random) {\n const tableSize = 512;\n const p = new Uint8Array(tableSize);\n for (let i = 0; i < tableSize / 2; i++) {\n p[i] = i;\n }\n for (let i = 0; i < tableSize / 2 - 1; i++) {\n const r = i + ~~(random() * (256 - i));\n const aux = p[i];\n p[i] = p[r];\n p[r] = aux;\n }\n for (let i = 256; i < tableSize; i++) {\n p[i] = p[i - 256];\n }\n return p;\n}\n//# sourceMappingURL=simplex-noise.js.map","import { createNoise2D } from 'simplex-noise';\nimport { Geometry } from 'ogl'; // eslint-disable-line\n\nfunction randFloatSpread(range) {\n return range * (0.5 - Math.random());\n}\n\nfunction randFloat(low, high) {\n return low + Math.random() * (high - low);\n}\n\nconst noise2D = createNoise2D(Math.random);\n\nfunction clamp(a) {\n return Math.max(0, Math.min(1, a));\n}\n\n// eslint-disable-next-line\nexport function getGeometry(gl, detail, offsetTop) {\n offsetTop = offsetTop || 0;\n const number = detail;\n const width = 2;\n const height = 2;\n\n const gran = width / number;\n const granH = (gran * Math.sqrt(3)) / 2;\n const rows = height / granH;\n\n const offsets = [];\n const positions = [];\n const centroids = [];\n const control0 = [];\n const control1 = [];\n const randoms = [];\n const uvs = [];\n let currentShift = 0;\n const bary = [];\n let currentHeight = 0;\n const scale = 2;\n\n for (let j = 0; j < rows; j += 1) {\n currentHeight = j * granH;\n if (j % 2 === 1) {\n currentShift = -gran / 2;\n } else {\n currentShift = 0;\n }\n for (let i = 0; i <= number; i += 1) {\n const sign = Math.sign(i * gran + currentShift - width / 2);\n // sign =1\n // first triangle\n positions.push(\n i * gran + currentShift - width / 2,\n currentHeight - height / 2,\n 0,\n );\n uvs.push((i * gran + currentShift) / width, currentHeight / height);\n positions.push(\n i * gran + gran / 2 + currentShift - width / 2,\n granH + currentHeight - height / 2,\n 0,\n );\n uvs.push(\n (i * gran + gran / 2 + currentShift) / width,\n (granH + currentHeight) / height,\n );\n positions.push(\n i * gran - gran / 2 + currentShift - width / 2,\n granH + currentHeight - height / 2,\n 0,\n );\n uvs.push(\n (i * gran - gran / 2 + currentShift) / width,\n (granH + currentHeight) / height,\n );\n\n let simp = noise2D(i / rows, j / rows) + Math.random();\n const o = clamp(currentHeight / height + (2 * simp) / detail);\n let r = Math.random();\n offsets.push(o, clamp(o + 0.1 * offsetTop), clamp(o + 0.1 * offsetTop));\n randoms.push(r, r, r);\n const c = [\n i * gran + currentShift - width / 2,\n currentHeight - height / 2,\n 0,\n ];\n centroids.push(...c, ...c, ...c);\n\n const ctrl0 = [\n scale * sign * randFloat(-0.3, 0.3),\n -scale * randFloat(-0.3, 0.3) * 1.5,\n -randFloatSpread(0.5),\n ];\n const ctrl1 = [\n scale * sign * randFloat(0.3, 0.6),\n -scale * randFloat(0.3, 0.6) * 1.5,\n -randFloatSpread(0.5),\n ];\n control0.push(...ctrl0, ...ctrl0, ...ctrl0);\n control1.push(...ctrl1, ...ctrl1, ...ctrl1);\n\n bary.push(0, 0, 1, 0, 1, 0, 1, 0, 0);\n // second triangle\n positions.push(\n i * gran + currentShift - width / 2,\n currentHeight - height / 2,\n 0,\n );\n uvs.push((i * gran + currentShift) / width, currentHeight / height);\n positions.push(\n i * gran + gran + currentShift - width / 2,\n currentHeight - height / 2,\n 0,\n );\n uvs.push(\n (i * gran + gran + currentShift) / width,\n currentHeight / height,\n );\n positions.push(\n i * gran + gran / 2 + currentShift - width / 2,\n granH + currentHeight - height / 2,\n 0,\n );\n uvs.push(\n (i * gran + gran / 2 + currentShift) / width,\n (granH + currentHeight) / height,\n );\n\n simp = noise2D((i + 1) / rows, j / rows) + Math.random();\n const o1 = clamp(currentHeight / height + (2 * simp) / detail);\n r = Math.random();\n offsets.push(o1, o1, clamp(o1 + 0.1 * offsetTop));\n randoms.push(r, r, r);\n const c1 = [\n i * gran + currentShift - width / 2,\n currentHeight - height / 2,\n 0,\n ];\n\n control0.push(...ctrl0, ...ctrl0, ...ctrl0);\n control1.push(...ctrl1, ...ctrl1, ...ctrl1);\n\n centroids.push(...c1, ...c1, ...c1);\n bary.push(0, 0, 1, 0, 1, 0, 1, 0, 0);\n }\n }\n const geometry = new Geometry(gl);\n\n geometry.addAttribute('position', {\n size: 3,\n data: new Float32Array(positions),\n });\n geometry.addAttribute('bary', {\n size: 3,\n data: new Float32Array(bary),\n });\n geometry.addAttribute('uv', {\n size: 2,\n data: new Float32Array(uvs),\n });\n geometry.addAttribute('offset', {\n size: 1,\n data: new Float32Array(offsets),\n });\n geometry.addAttribute('centroid1', {\n size: 3,\n data: new Float32Array(centroids),\n });\n geometry.addAttribute('control0', {\n size: 3,\n data: new Float32Array(control0),\n });\n geometry.addAttribute('control1', {\n size: 3,\n data: new Float32Array(control1),\n });\n geometry.addAttribute('random', {\n size: 1,\n data: new Float32Array(randoms),\n });\n return geometry;\n}\n","export const PI = `float PI = 3.141592653589793238;`;\nexport const fragmentCommon = /* glsl */ `\nprecision highp float;\n\nuniform float time;\nuniform float progress;\nuniform sampler2D texture1;\nuniform sampler2D texture2;\nuniform vec4 resolution;\nvarying vec2 vUv;\n`;\nexport const vertexCommon = /* glsl */ `\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\nattribute float offset;\nattribute vec3 bary;\n\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float progress;\nuniform vec4 resolution;\n\nvarying vec2 vUv;\nvarying float vProgress;\nvarying float vProgress1;\nvarying vec3 vBary;\n`;\nexport const vertexRotate = /* glsl */ `\nmat4 rotationMatrix(vec3 axis, float angle) {\n axis = normalize(axis);\n float s = sin(angle);\n float c = cos(angle);\n float oc = 1.0 - c;\n\n return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0,\n oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0,\n oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0,\n 0.0, 0.0, 0.0, 1.0);\n}\nvec3 rotate(vec3 v, vec3 axis, float angle) {\n mat4 m = rotationMatrix(axis, angle);\n return (m * vec4(v, 1.0)).xyz;\n}\n`;\n","import { morphX } from './shaders/morph-x';\nimport { morphY } from './shaders/morph-y';\nimport { pageCurl } from './shaders/page-curl';\nimport { peelX } from './shaders/peel-x';\nimport { peelY } from './shaders/peel-y';\nimport { pixelize } from './shaders/pixelize';\nimport { polygonsFall } from './shaders/polygons-fall';\nimport { polygonsMorph } from './shaders/polygons-morph';\nimport { polygonsWind } from './shaders/polygons-wind';\nimport { ripple } from './shaders/ripple';\nimport { shutters } from './shaders/shutters';\nimport { slices } from './shaders/slices';\nimport { squares } from './shaders/squares';\nimport { stretch } from './shaders/stretch';\nimport { waveX } from './shaders/wave-x';\nimport { wind } from './shaders/wind';\nimport { dots } from './shaders/dots';\nimport { flyeye } from './shaders/flyeye';\n\n// prettier-ignore\nexport const shaders = {\n 'dots': dots,\n 'flyeye': flyeye,\n 'morph-x': morphX,\n 'morph-y': morphY,\n 'page-curl': pageCurl,\n 'peel-x': peelX,\n 'peel-y': peelY,\n 'polygons-fall': polygonsFall,\n 'polygons-morph': polygonsMorph,\n 'polygons-wind': polygonsWind,\n 'pixelize': pixelize,\n 'ripple': ripple,\n 'shutters': shutters,\n 'slices': slices,\n 'squares': squares,\n 'stretch': stretch,\n 'wave-x': waveX,\n 'wind': wind,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const dots = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n const float SQRT_2 = 1.414213562373;\n const vec2 center = vec2(0, 0);// = vec2(0, 0);\n const float dots = 20.0;// = 20.0;\n\n vec4 getFromColor(vec2 p) {\n return texture2D(texture1, p);\n }\n\n vec4 getToColor(vec2 p) {\n return texture2D(texture2, p);\n }\n\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n bool nextImage = distance(fract(newUV * dots), vec2(0.5, 0.5)) < ( progress / distance(newUV, center));\n gl_FragColor = nextImage ? getToColor(newUV) : getFromColor(newUV);\n }\n\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const flyeye = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n const float size = 0.04; // = 0.04\n const float zoom = 100.0; // = 50.0\n const float colorSeparation = 0.3; // = 0.3\n\n vec4 getFromColor(vec2 p) {\n return texture2D(texture1, p);\n }\n\n vec4 getToColor(vec2 p) {\n return texture2D(texture2, p);\n }\n\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n float inv = 1. - progress;\n vec2 disp = size*vec2(cos(zoom*newUV.x), sin(zoom*newUV.y));\n vec4 texTo = getToColor(newUV + inv*disp);\n vec4 texFrom = vec4(\n getFromColor(newUV + progress*disp*(1.0 - colorSeparation)).r,\n getFromColor(newUV + progress*disp).g,\n getFromColor(newUV + progress*disp*(1.0 + colorSeparation)).b,\n 1.0);\n gl_FragColor = texTo*progress + texFrom*inv;\n }\n\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const morphX = {\n uniforms: {\n intensity: { value: 1, type: 'f', min: 0, max: 3 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float intensity;\n uniform sampler2D displacement;\n mat2 getRotM(float angle) {\n float s = sin(angle);\n float c = cos(angle);\n return mat2(c, -s, s, c);\n }\n const float PI = 3.1415;\n const float angle1 = PI *0.25;\n const float angle2 = -PI *0.75;\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec4 disp = texture2D(displacement, newUV);\n vec2 dispVec = vec2(disp.r, disp.g);\n vec2 distortedPosition1 = newUV + getRotM(angle1) * dispVec * intensity * progress;\n vec4 t1 = texture2D(texture1, distortedPosition1);\n vec2 distortedPosition2 = newUV + getRotM(angle2) * dispVec * intensity * (1.0 - progress);\n vec4 t2 = texture2D(texture2, distortedPosition2);\n gl_FragColor = mix(t1, t2, progress);\n }\n`,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const morphY = {\n uniforms: {\n intensity: { value: 0.3, type: 'f', min: 0, max: 2 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float intensity;\n uniform sampler2D displacement;\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec4 d1 = texture2D(texture1, newUV);\n vec4 d2 = texture2D(texture2, newUV);\n float displace1 = (d1.r + d1.g + d1.b)*0.33;\n float displace2 = (d2.r + d2.g + d2.b)*0.33;\n\n vec4 t1 = texture2D(texture1, vec2(newUV.x, newUV.y + progress * (displace2 * intensity)));\n vec4 t2 = texture2D(texture2, vec2(newUV.x, newUV.y + (1.0 - progress) * (displace1 * intensity)));\n gl_FragColor = mix(t1, t2, progress);\n }\n`,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const pageCurl = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n const float MIN_AMOUNT = -0.16;\n const float MAX_AMOUNT = 1.5;\n\n const float PI = 3.141592653589793;\n\n const float scale = 512.0;\n const float sharpness = 3.0;\n\n const float cylinderRadius = 1.0 / PI / 2.0;\n\n vec4 getFromColor(vec2 p) {\n return texture2D(texture1, p);\n }\n\n vec4 getToColor(vec2 p) {\n return texture2D(texture2, p);\n }\n\n vec3 hitPoint(float hitAngle, float yc, vec3 point, mat3 rrotation) {\n float hitPoint = hitAngle / (2.0 * PI);\n point.y = hitPoint;\n return rrotation * point;\n }\n\n vec4 antiAlias(vec4 color1, vec4 color2, float distanc) {\n distanc *= scale;\n if(distanc < 0.0)\n return color2;\n if(distanc > 2.0)\n return color1;\n float dd = pow(1.0 - distanc / 2.0, sharpness);\n return ((color2 - color1) * dd) + color1;\n }\n\n float distanceToEdge(vec3 point) {\n float dx = abs(point.x > 0.5 ? 1.0 - point.x : point.x);\n float dy = abs(point.y > 0.5 ? 1.0 - point.y : point.y);\n if(point.x < 0.0)\n dx = -point.x;\n if(point.x > 1.0)\n dx = point.x - 1.0;\n if(point.y < 0.0)\n dy = -point.y;\n if(point.y > 1.0)\n dy = point.y - 1.0;\n if((point.x < 0.0 || point.x > 1.0) && (point.y < 0.0 || point.y > 1.0))\n return sqrt(dx * dx + dy * dy);\n return min(dx, dy);\n }\n\n vec4 seeThrough(float yc, vec2 p, mat3 rotation, mat3 rrotation, float cylinderAngle) {\n float hitAngle = PI - (acos(yc / cylinderRadius) - cylinderAngle);\n vec3 point = hitPoint(hitAngle, yc, rotation * vec3(p, 1.0), rrotation);\n if(yc <= 0.0 && (point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0)) {\n return getToColor(p);\n }\n\n if(yc > 0.0)\n return getFromColor(p);\n\n vec4 color = getFromColor(point.xy);\n vec4 tcolor = vec4(0.0);\n\n return antiAlias(color, tcolor, distanceToEdge(point));\n }\n\n vec4 seeThroughWithShadow(float yc, vec2 p, vec3 point, mat3 rotation, mat3 rrotation, float cylinderAngle, float amount) {\n float shadow = distanceToEdge(point) * 30.0;\n shadow = (1.0 - shadow) / 3.0;\n\n if(shadow < 0.0)\n shadow = 0.0;\n else\n shadow *= amount;\n\n vec4 shadowColor = seeThrough(yc, p, rotation, rrotation, cylinderAngle);\n shadowColor.r -= shadow;\n shadowColor.g -= shadow;\n shadowColor.b -= shadow;\n\n return shadowColor;\n }\n\n vec4 backside(float yc, vec3 point) {\n vec4 color = getFromColor(point.xy);\n float gray = (color.r + color.b + color.g) / 15.0;\n gray += (8.0 / 10.0) * (pow(1.0 - abs(yc / cylinderRadius), 2.0 / 10.0) / 2.0 + (5.0 / 10.0));\n color.rgb = vec3(gray);\n return color;\n }\n\n vec4 behindSurface(vec2 p, float yc, vec3 point, mat3 rrotation, float cylinderAngle, float amount) {\n float shado = (1.0 - ((-cylinderRadius - yc) / amount * 7.0)) / 6.0;\n shado *= 1.0 - abs(point.x - 0.5);\n\n yc = (-cylinderRadius - cylinderRadius - yc);\n\n float hitAngle = (acos(yc / cylinderRadius) + cylinderAngle) - PI;\n point = hitPoint(hitAngle, yc, point, rrotation);\n\n if(yc < 0.0 && point.x >= 0.0 && point.y >= 0.0 && point.x <= 1.0 && point.y <= 1.0 && (hitAngle < PI || amount > 0.5)) {\n shado = 1.0 - (sqrt(pow(point.x - 0.5, 2.0) + pow(point.y - 0.5, 2.0)) / (71.0 / 100.0));\n shado *= pow(-yc / cylinderRadius, 3.0);\n shado *= 0.5;\n } else {\n shado = 0.0;\n }\n return vec4(getToColor(p).rgb - shado, 1.0);\n }\n\n void main() {\n vec2 newUV = (vUv - vec2(0.5)) * resolution.zw + vec2(0.5);\n\n float amount = progress * (MAX_AMOUNT - MIN_AMOUNT) + MIN_AMOUNT;\n float cylinderCenter = amount;\n // 360 degrees * amount\n float cylinderAngle = 2.0 * PI * amount;\n\n const float angle = 100.0 * PI / 180.0;\n float c = cos(-angle);\n float s = sin(-angle);\n\n mat3 rotation = mat3(c, s, 0, -s, c, 0, -0.801, 0.8900, 1);\n c = cos(angle);\n s = sin(angle);\n\n mat3 rrotation = mat3(c, s, 0, -s, c, 0, 0.98500, 0.985, 1);\n\n vec3 point = rotation * vec3(newUV, 1.0);\n\n float yc = point.y - cylinderCenter;\n\n if(yc < -cylinderRadius) {\n // Behind surface\n gl_FragColor = behindSurface(newUV, yc, point, rrotation, cylinderAngle, amount);\n return;\n }\n\n if(yc > cylinderRadius) {\n // Flat surface\n gl_FragColor = getFromColor(newUV);\n return;\n }\n\n float hitAngle = (acos(yc / cylinderRadius) + cylinderAngle) - PI;\n\n float hitAngleMod = mod(hitAngle, 2.0 * PI);\n if((hitAngleMod > PI && amount < 0.5) || (hitAngleMod > PI / 2.0 && amount < 0.0)) {\n gl_FragColor = seeThrough(yc, newUV, rotation, rrotation, cylinderAngle);\n return;\n }\n\n point = hitPoint(hitAngle, yc, point, rrotation);\n\n if(point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0) {\n gl_FragColor = seeThroughWithShadow(yc, newUV, point, rotation, rrotation, cylinderAngle, amount);\n return;\n }\n\n vec4 color = backside(yc, point);\n\n vec4 otherColor;\n if(yc < 0.0) {\n float shado = 1.0 - (sqrt(pow(point.x - 0.5, 2.0) + pow(point.y - 0.5, 2.0)) / 0.71);\n shado *= pow(-yc / cylinderRadius, 3.0);\n shado *= 0.5;\n otherColor = vec4(0.0, 0.0, 0.0, shado);\n } else {\n otherColor = getFromColor(newUV);\n }\n\n color = antiAlias(color, otherColor, cylinderRadius - abs(yc));\n\n vec4 cl = seeThroughWithShadow(yc, newUV, point, rotation, rrotation, cylinderAngle, amount);\n float dist = distanceToEdge(point);\n\n gl_FragColor = antiAlias(color, cl, dist);\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const peelX = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec2 p = newUV;\n float x = progress;\n x = smoothstep(.0,1.0,(x*2.0+p.x-1.0));\n vec4 f = mix(\n texture2D(texture1, (p-.5)*(1.-x)+.5),\n texture2D(texture2, (p-.5)*x+.5),\n x);\n gl_FragColor = f;\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const peelY = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec2 p = newUV;\n float x = progress;\n x = smoothstep(.0,1.0,(x*2.0+p.y-1.0));\n vec4 f = mix(\n texture2D(texture1, (p-.5)*(1.-x)+.5),\n texture2D(texture2, (p-.5)*x+.5),\n x);\n gl_FragColor = f;\n }\n `,\n};\n","import {\n vertexCommon,\n vertexRotate,\n PI,\n fragmentCommon,\n} from './shadersCommon';\n\nexport const polygonsFall = {\n uniforms: {},\n detail: 12,\n offsetTop: 0,\n vertex: /* glsl */ `\n ${vertexCommon}\n attribute vec3 centroid1;\n\n ${vertexRotate}\n\n void main() {\n ${PI}\n vUv = uv;\n vBary = bary;\n\n vec3 newpos = position;\n\n float o = 1. - offset;\n float pr = (progress - 0.5) * (0. + resolution.y / resolution.x) + 0.5;\n pr = progress;\n float prog = clamp((pr - o * 0.9) / 0.1, 0., 1.);\n vProgress = prog;\n vProgress1 = clamp((pr - clamp(o - 0.1, 0., 1.) * 0.9) / 0.1, 0., 1.);\n newpos = rotate((newpos - centroid1), vec3(1., 0., 0.), -prog * PI) + centroid1 + vec3(0., -1., 0.) * prog * 0.;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newpos, 1.0);\n }\n `,\n fragment: /* glsl */ `\n ${fragmentCommon}\n varying float vProgress;\n varying float vProgress1;\n ${PI}\n varying vec3 vBary;\n\n void main()\t{\n float width = 2.5 * vProgress1;\n vec3 d;\n #ifdef GL_OES_standard_derivatives\n d = fwidth(vBary);\n #endif\n vec3 s = smoothstep(d * (width + 0.5), d * (width - 0.5), vBary);\n float alpha = max(max(s.x, s.y), s.z);\n vec3 color = vec3(alpha);\n vec2 newUV = (vUv - vec2(0.5)) * resolution.zw + vec2(0.5);\n vec4 t = texture2D(texture1, newUV);\n float opa = smoothstep(1., 0.5, vProgress);\n opa = 1. - vProgress;\n gl_FragColor = vec4(vUv, 0.0, opa);\n gl_FragColor = vec4(t.rgb + .5 * color * vProgress1, opa);\n }\n `,\n};\n","import {\n vertexCommon,\n vertexRotate,\n PI,\n fragmentCommon,\n} from './shadersCommon';\n\nexport const polygonsMorph = {\n uniforms: {},\n detail: 20,\n offsetTop: 0.4,\n vertex: /* glsl */ `\n ${vertexCommon}\n ${vertexRotate}\n\n void main() {\n ${PI}\n vUv = uv;\n vBary = bary;\n\n vec3 newpos = position;\n\n float o = 1. - offset;\n float prog = clamp((progress - o * 0.6) / 0.4, 0., 1.);\n vProgress = prog;\n vProgress1 = clamp((progress - clamp(o - 0.1, -0., 1.) * 0.9) / 0.1, 0., 1.);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newpos, 1.0);\n }\n `,\n fragment: /* glsl */ `\n ${fragmentCommon}\n varying float vProgress;\n varying float vProgress1;\n ${PI}\n varying vec3 vBary;\n void main()\t{\n float width = 2.5 * vProgress1;\n vec3 d;\n #ifdef GL_OES_standard_derivatives\n d = fwidth(vBary);\n #endif\n vec3 s = smoothstep(d * (width + 0.5), d * (width - 0.5), vBary);\n float alpha = max(max(s.x, s.y), s.z);\n vec3 color = vec3(alpha);\n\n vec2 newUV = (vUv - vec2(0.5)) * resolution.zw + vec2(0.5);\n vec4 t = texture2D(texture1, newUV);\n float opa = smoothstep(1., 0.5, vProgress);\n opa = 1. - vProgress;\n gl_FragColor = vec4(t.rgb + 1. * color * vProgress1, opa);\n }\n `,\n};\n","import {\n vertexCommon,\n vertexRotate,\n PI,\n fragmentCommon,\n} from './shadersCommon';\n\nexport const polygonsWind = {\n uniforms: {},\n detail: 40,\n offsetTop: 1,\n vertex: /* glsl */ `\n ${vertexCommon}\n attribute vec3 control0;\n attribute vec3 control1;\n\n ${vertexRotate}\n\n float easeOut(float t){\n return t * t * t;\n }\n\n vec3 bezier4(vec3 a, vec3 b, vec3 c, vec3 d, float t) {\n return mix(mix(mix(a, b, t), mix(b, c, t), t), mix(mix(b, c, t), mix(c, d, t), t), t);\n }\n\n void main() {\n ${PI}\n vUv = uv;\n vBary = bary;\n\n vec3 newpos = position;\n\n float o = 1. - offset;\n float prog = clamp((progress - o * 0.6) / 0.4, 0., 1.);\n vProgress = prog;\n vProgress1 = clamp((progress - clamp(o - 0.2, -0., 1.) * 0.6) / 0.4, 0., 1.);\n newpos = bezier4(newpos, control0, control1, newpos, easeOut(prog));\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newpos, 1.0);\n }\n `,\n fragment: /* glsl */ `\n ${fragmentCommon}\n varying float vProgress;\n varying float vProgress1;\n ${PI}\n varying vec3 vBary;\n void main()\t{\n float width = 2.5 * vProgress1;\n vec3 d;\n #ifdef GL_OES_standard_derivatives\n d = fwidth(vBary);\n #endif\n vec3 s = smoothstep(d * (width + 0.5), d * (width - 0.5), vBary);\n float alpha = max(max(s.x, s.y), s.z);\n vec3 color = vec3(alpha);\n\n vec2 newUV = (vUv - vec2(0.5)) * resolution.zw + vec2(0.5);\n vec4 t = texture2D(texture1, newUV);\n float opa = smoothstep(1., 0.5, vProgress);\n opa = 1. - vProgress;\n gl_FragColor = vec4(vUv, 0.0, opa);\n opa = smoothstep(0.5, 1., opa);\n gl_FragColor = vec4(t.rgb + 1. * color * vProgress1, opa);\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const pixelize = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n ivec2 squaresMin = ivec2(50);\n int steps = 20;\n\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n float d = min(progress, 1.0 - progress);\n float dist = steps>0 ? ceil(d * float(steps)) / float(steps) : d;\n vec2 squareSize = 2.0 * dist / vec2(squaresMin);\n\n vec2 p = dist>0.0 ? (floor(newUV / squareSize) + 0.5) * squareSize : newUV;\n\n vec2 uv1 = newUV;\n vec2 uv2 = newUV;\n\n vec4 t1 = texture2D(texture1,p);\n vec4 t2 = texture2D(texture2,p);\n\n gl_FragColor = mix(t1, t2, progress);\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const ripple = {\n uniforms: {\n radius: { value: 0.9, type: 'f', min: 0.1, max: 2 },\n width: { value: 0.35, type: 'f', min: 0, max: 1 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float width;\n uniform float radius;\n uniform sampler2D displacement;\n float parabola( float x, float k ) {\n return pow( 4. * x * ( 1. - x ), k );\n }\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec2 p = newUV;\n vec2 start = vec2(0.5,0.5);\n vec2 aspect = resolution.wz;\n vec2 uv = newUV;\n float dt = parabola(progress, 1.);\n vec4 noise = texture2D(displacement, fract(vUv+time*0.04));\n float prog = progress*0.66 + noise.g * 0.04;\n float circ = 1. - smoothstep(-width, 0.0, radius * distance(start*aspect, uv*aspect) - prog*(1.+width));\n float intpl = pow(abs(circ), 1.);\n vec4 t1 = texture2D( texture1, (uv - 0.5) * (1.0 - intpl) + 0.5 ) ;\n vec4 t2 = texture2D( texture2, (uv - 0.5) * intpl + 0.5 );\n gl_FragColor = mix( t1, t2, intpl );\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const shutters = {\n uniforms: {\n intensity: { value: 50, type: 'f', min: 1, max: 100 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float intensity;\n mat2 rotate(float a) {\n float s = sin(a);\n float c = cos(a);\n return mat2(c, -s, s, c);\n }\n const float PI = 3.1415;\n const float angle1 = PI *0.25;\n const float angle2 = PI *0.25;\n\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n vec2 uvDivided = fract(newUV*vec2(intensity,1.));\n\n vec2 uvDisplaced1 = newUV + rotate(angle1)*uvDivided*progress*0.1;\n vec2 uvDisplaced2 = newUV + rotate(angle2)*uvDivided*(1. - progress)*0.1;\n\n vec4 t1 = texture2D(texture1,uvDisplaced1);\n vec4 t2 = texture2D(texture2,uvDisplaced2);\n\n gl_FragColor = mix(t1, t2, progress);\n }\n\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const slices = {\n uniforms: {\n size: { value: 0.25, type: 'f', min: 0.1, max: 1 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float size; // = 0.2\n float count = 20.; // = 10.0\n float smoothness = .5; // = 0.5\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n float pr = smoothstep(-smoothness, 0.0, newUV.x - progress * (1.0 + smoothness));\n float s = step(pr, fract(count * newUV.x));\n\n vec2 uv1 = newUV;\n vec2 uv2 = newUV;\n\n vec4 t1 = texture2D(texture1,uv1);\n vec4 t2 = texture2D(texture2,uv2);\n gl_FragColor = mix(t1, t2, s);\n\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const squares = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n ivec2 squares = ivec2(10,10);\n vec2 direction = vec2(1.0, -0.5);\n float smoothness = 1.6;\n\n const vec2 center = vec2(0.5, 0.5);\n void main() {\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n vec2 v = normalize(direction);\n v /= abs(v.x)+abs(v.y);\n float d = v.x * center.x + v.y * center.y;\n float offset = smoothness;\n float pr = smoothstep(-offset, 0.0, v.x * newUV.x + v.y * newUV.y - (d-0.5+progress*(1.+offset)));\n vec2 squarep = fract(newUV*vec2(squares));\n vec2 squaremin = vec2(pr/2.0);\n vec2 squaremax = vec2(1.0 - pr/2.0);\n float a = (1.0 - step(progress, 0.0)) * step(squaremin.x, squarep.x) * step(squaremin.y, squarep.y) * step(squarep.x, squaremax.x) * step(squarep.y, squaremax.y);\n\n vec2 uv1 = newUV;\n vec2 uv2 = newUV;\n\n vec4 t1 = texture2D(texture1,newUV);\n vec4 t2 = texture2D(texture2,newUV);\n\n gl_FragColor = mix(t1, t2, a);\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const stretch = {\n uniforms: {\n intensity: { value: 50, type: 'f', min: 1, max: 100 },\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform float intensity;\n mat2 rotate(float a) {\n float s = sin(a);\n float c = cos(a);\n return mat2(c, -s, s, c);\n }\n const float PI = 3.1415;\n const float angle1 = PI *0.25;\n const float angle2 = -PI *0.75;\n const float noiseSeed = 2.;\n float random() {\n return fract(sin(noiseSeed + dot(gl_FragCoord.xy / resolution.xy / 10.0, vec2(12.9898, 4.1414))) * 43758.5453);\n }\n float hash(float n) { return fract(sin(n) * 1e4); }\n float hash(vec2 p) { return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); }\n float hnoise(vec2 x) {\n vec2 i = floor(x);\n vec2 f = fract(x);\n float a = hash(i);\n float b = hash(i + vec2(1.0, 0.0));\n float c = hash(i + vec2(0.0, 1.0));\n float d = hash(i + vec2(1.0, 1.0));\n vec2 u = f * f * (3.0 - 2.0 * f);\n return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;\n }\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n float hn = hnoise(newUV.xy * resolution.xy / 100.0);\n vec2 d = vec2(0.,normalize(vec2(0.5,0.5) - newUV.xy).y);\n vec2 uv1 = newUV + d * progress / 5.0 * (1.0 + hn / 2.0);\n vec2 uv2 = newUV - d * (1.0 - progress) / 5.0 * (1.0 + hn / 2.0);\n vec4 t1 = texture2D(texture1,uv1);\n vec4 t2 = texture2D(texture2,uv2);\n gl_FragColor = mix(t1, t2, progress);\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const waveX = {\n uniforms: {\n // width: {value: 0.35, type:'f', min:0., max:1},\n },\n fragment: /* glsl */ `\n ${fragmentCommon}\n uniform sampler2D displacement;\n vec2 mirrored(vec2 v) {\n vec2 m = mod(v,2.);\n return mix(m,2.0 - m, step(1.0 ,m));\n }\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n vec4 noise = texture2D(displacement, mirrored(newUV+time*0.04));\n float prog = (1.0 - progress)*0.8 -0.05 + noise.g * 0.06;\n float intpl = pow(abs(smoothstep(0., 1., (prog*2. - vUv.x + 0.5))), 10.);\n\n vec4 t1 = texture2D( texture2, (newUV - 0.5) * (1.0 - intpl) + 0.5 ) ;\n vec4 t2 = texture2D( texture1, (newUV - 0.5) * intpl + 0.5 );\n gl_FragColor = mix( t1, t2, intpl );\n }\n `,\n};\n","import { fragmentCommon } from './shadersCommon';\n\nexport const wind = {\n uniforms: {},\n fragment: /* glsl */ `\n ${fragmentCommon}\n float size = 0.2;\n\n float rand (vec2 co) {\n return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n }\n\n void main()\t{\n vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);\n\n float r = rand(vec2(0, newUV.y));\n float m = smoothstep(0.0, -size, newUV.x*(1.0-size) + size*r - ((progress) * (1.0 + size)));\n\n vec2 uv1 = newUV;\n vec2 uv2 = newUV;\n\n vec4 t1 = texture2D(texture1,uv1);\n vec4 t2 = texture2D(texture2,uv2);\n gl_FragColor = mix(t1, t2, m);\n\n }\n `,\n};\n","import {\n Vec4,\n Renderer,\n Program,\n Mesh,\n Camera,\n Transform,\n Texture,\n Plane,\n} from 'ogl'; // eslint-disable-line\nimport { displacement } from './displacement';\nimport { getGeometry } from './getGeometry';\nimport { shaders } from './shaders';\n\nconst defaultVertex = `\nattribute vec2 uv;\nattribute vec3 position;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nvarying vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nconst getRandomShader = (arr, opts) => {\n const { shaderPerSlide, swiper } = opts;\n const index = swiper.params.loop ? swiper.realIndex : swiper.activeIndex;\n let allShaders = shaders;\n if (Array.isArray(arr) && arr.length) {\n if (shaderPerSlide) {\n if (typeof arr[index] === 'undefined') return shaders[arr[0]];\n return shaders[arr[index]];\n }\n allShaders = {};\n Object.keys(shaders).forEach((key) => {\n if (arr.includes(key)) allShaders[key] = shaders[key];\n });\n }\n const keyIndex = Math.floor(Math.random() * Object.keys(allShaders).length);\n return allShaders[Object.keys(allShaders)[keyIndex]];\n};\n\nclass GL {\n constructor(opts) {\n const shader =\n opts.shader === 'random' || Array.isArray(opts.shader)\n ? getRandomShader(opts.shader, opts)\n : shaders[opts.shader];\n this.shader = shader;\n this.displacement = opts.displacementMap || displacement;\n this.scene = new Transform();\n this.swiper = opts.swiper;\n this.vertex = shader.vertex || defaultVertex;\n this.fragment = shader.fragment;\n this.uniforms = shader.uniforms || {};\n this.renderer = new Renderer({ dpr: 2, webgl: 2, alpha: true });\n this.gl = this.renderer.gl;\n this.width = window.innerWidth;\n this.height = window.innerHeight;\n this.renderer.setSize(this.width, this.height);\n this.gl.clearColor(1, 1, 1, 0);\n this.gl.clear(this.gl.COLOR_BUFFER_BIT);\n this.opts = opts;\n\n this.container = this.swiper.el;\n this.displacementTexture = null;\n\n this.width = this.swiper.width;\n this.height = this.swiper.height;\n if (this.swiper.isElement) {\n this.gl.canvas.setAttribute('slot', 'container-start');\n }\n this.container.prepend(this.gl.canvas);\n\n this.camera = new Camera(this.gl, { fov: 45 });\n this.camera.perspective({\n aspect: this.gl.canvas.width / this.gl.canvas.height,\n });\n\n this.camera.position.set(0, 0, 2);\n this.time = 0;\n this.current = 0;\n\n this.init(() => {\n this.addObjects();\n this.resize();\n this.render();\n });\n }\n\n animateUniform(uniform, targetValue, cb) {\n const startPosition = uniform.value;\n let startTime = null;\n let time;\n\n window.cancelAnimationFrame(this.animateUniformFrame);\n\n const dir = targetValue > uniform.value ? 'next' : 'prev';\n\n const isOutOfBound = (current, target) =>\n (dir === 'next' && current >= target) ||\n (dir === 'prev' && current <= target);\n\n const animate = () => {\n if (this.destroyed) return;\n time = new Date().getTime();\n if (startTime === null) {\n startTime = time;\n }\n\n const progress = Math.max(\n Math.min((time - startTime) / this.swiper.params.speed, 1),\n 0,\n );\n const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n let currentPosition =\n startPosition + easeProgress * (targetValue - startPosition);\n\n if (isOutOfBound(currentPosition, targetValue)) {\n currentPosition = targetValue;\n }\n uniform.value = currentPosition;\n if (isOutOfBound(currentPosition, targetValue)) {\n cancelAnimationFrame(this.animateUniformFrame);\n if (cb) cb();\n return;\n }\n this.animateUniformFrame = requestAnimationFrame(animate);\n };\n animate();\n }\n\n loadTextures() {\n const promises = [];\n const that = this;\n this.images = [];\n this.textures = [];\n\n this.container.querySelectorAll('.swiper-gl-image').forEach((img) => {\n this.images.push(img.src);\n });\n\n this.images.forEach((url, i) => {\n const promise = new Promise((resolve) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n const texture = new Texture(this.gl);\n img.onload = () => {\n texture.image = img;\n that.textures[i] = texture;\n resolve();\n };\n img.src = url;\n });\n promises.push(promise);\n });\n promises.push(\n new Promise((resolve) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n const texture = new Texture(this.gl);\n img.onload = () => {\n texture.image = img;\n that.displacementTexture = texture;\n resolve();\n };\n img.src = displacement;\n }),\n );\n\n return Promise.all(promises);\n }\n\n init(cb) {\n this.loadTextures().then(() => {\n this.initialized = true;\n if (this.onInit) this.onInit();\n cb();\n });\n }\n\n resize() {\n if (!this.initialized || this.destroyed) return;\n const { width, height } = this.swiper;\n this.width = width;\n this.height = height;\n this.renderer.setSize(width, height);\n const dist = this.camera.position.z;\n\n this.camera.perspective({\n aspect: width / height,\n fov: 2 * (180 / Math.PI) * Math.atan(1 / (2 * dist)),\n });\n if (!this.textures[0].image) return;\n const imageAspect =\n this.textures[0].image.height / this.textures[0].image.width;\n let a1;\n let a2;\n if (height / width > imageAspect) {\n a1 = (width / height) * imageAspect;\n a2 = 1;\n } else {\n a1 = 1;\n a2 = height / width / imageAspect;\n }\n\n this.material.uniforms.resolution.value.x = width;\n this.material.uniforms.resolution.value.y = height;\n this.material.uniforms.resolution.value.z = a1;\n this.material.uniforms.resolution.value.w = a2;\n\n if (this.shader.vertex && this.vertexMaterial) {\n this.vertexMaterial.uniforms.resolution.value.x = width;\n this.vertexMaterial.uniforms.resolution.value.y = height;\n this.vertexMaterial.uniforms.resolution.value.z = a1;\n this.vertexMaterial.uniforms.resolution.value.w = a2;\n }\n\n if (this.shader.vertex) {\n this.nextMesh.scale.set(this.camera.aspect / 2, 1 / 2, 1 / 2);\n this.currentMesh.scale.set(this.camera.aspect / 2, 1 / 2, 1 / 2);\n } else {\n this.plane.scale.x = this.camera.aspect;\n this.plane.scale.y = 1;\n }\n }\n\n createMaterial() {\n return new Program(this.gl, {\n extensions: {\n derivatives: '#extension GL_OES_standard_derivatives : enable',\n },\n // side: DoubleSide,\n uniforms: {\n time: { type: 'f', value: 0 },\n progress: { type: 'f', value: 0 },\n intensity: { type: 'f', value: 0 },\n width: { type: 'f', value: 0 },\n radius: { type: 'f', value: 0 },\n size: { type: 'f', value: 0 },\n texture1: { type: 'f', value: this.textures[0] },\n texture2: { type: 'f', value: this.textures[1] },\n\n displacement: {\n type: 'f',\n value: this.displacementTexture,\n },\n resolution: { type: 'v4', value: new Vec4() },\n },\n vertex: this.shader.vertex || defaultVertex,\n fragment: this.shader.fragment,\n ...(this.shader.vertex\n ? {\n transparent: true,\n depthWrite: false,\n }\n : {}),\n });\n }\n\n addObjects() {\n this.scene.children.forEach((child) => {\n this.scene.removeChild(child);\n });\n this.scene.children.forEach((child) => {\n this.scene.removeChild(child);\n });\n this.material = this.createMaterial();\n\n if (this.shader.vertex) {\n const geometry = getGeometry(\n this.gl,\n this.shader.detail,\n this.shader.offsetTop,\n );\n const texture = this.textures[1];\n this.vertexMaterial = this.createMaterial();\n this.vertexMaterial.uniforms.texture1.value = texture;\n this.currentMesh = new Mesh(this.gl, {\n geometry,\n program: this.material,\n });\n this.nextMesh = new Mesh(this.gl, {\n geometry,\n program: this.vertexMaterial,\n });\n this.nextMesh.position.z = -0.0001;\n this.currentMesh.setParent(this.scene);\n this.nextMesh.setParent(this.scene);\n } else {\n const geometry = new Plane(this.gl, {\n width: 1,\n height: 1,\n widthSegments: 2,\n heightSegments: 2,\n });\n this.plane = new Mesh(this.gl, { geometry, program: this.material });\n this.plane.setParent(this.scene);\n }\n }\n\n replaceShader(newShaderName) {\n let fromTexture;\n let newTexture;\n if (this.shader.vertex) {\n fromTexture = this.material.uniforms.texture1.value;\n newTexture = this.vertexMaterial.uniforms.texture1.value;\n } else {\n fromTexture = this.material.uniforms.texture1.value;\n newTexture = this.material.uniforms.texture2.value;\n }\n const shader =\n newShaderName === 'random' || Array.isArray(newShaderName)\n ? getRandomShader(newShaderName, this.opts)\n : shaders[newShaderName];\n const { fragment, uniforms, vertex } = shader;\n this.shader = shader;\n this.vertex = vertex || defaultVertex;\n this.fragment = fragment || ``;\n this.uniforms = uniforms || {};\n this.addObjects();\n if (this.shader.vertex) {\n this.material.uniforms.texture1.value = newTexture;\n this.vertexMaterial.uniforms.texture1.value = newTexture;\n } else {\n this.material.uniforms.texture1.value = fromTexture;\n this.material.uniforms.texture2.value = newTexture;\n this.material.uniforms.progress.value = 1;\n }\n\n this.resize();\n this.swiper.params.gl.shader = newShaderName;\n }\n\n replaceRandomShader() {\n const shader = getRandomShader(this.opts.shader, this.opts);\n const { fragment, uniforms, vertex } = shader;\n this.shader = shader;\n this.fragment = fragment || ``;\n this.uniforms = uniforms || {};\n this.vertex = vertex || defaultVertex;\n this.addObjects();\n this.resize();\n }\n\n setProgress(\n fromIndex,\n toIndex,\n progress,\n needsTransitionDuration,\n needShaderReplace,\n ) {\n if (this.destroyed || this.swiper.glDestroyed) return;\n if (!this.initialized) {\n this.onInit = () => {\n requestAnimationFrame(() => {\n this.setProgress(\n fromIndex,\n toIndex,\n progress,\n needsTransitionDuration,\n );\n });\n };\n return;\n }\n if (\n this.swiper.params.loop &&\n this.swiper.slides[fromIndex] &&\n this.swiper.slides[toIndex]\n ) {\n fromIndex = parseInt(\n this.swiper.slides[fromIndex].getAttribute('data-swiper-slide-index'),\n 10,\n );\n toIndex = parseInt(\n this.swiper.slides[toIndex].getAttribute('data-swiper-slide-index'),\n 10,\n );\n }\n const newTexture = this.textures[toIndex];\n const fromTexture = this.textures[fromIndex];\n\n this.material.uniforms.texture1.value = fromTexture;\n if (!this.shader.vertex) {\n this.material.uniforms.texture2.value = newTexture;\n } else {\n this.vertexMaterial.uniforms.texture1.value = newTexture;\n }\n if (needShaderReplace) {\n if (this.preventShaderReplace) {\n this.material.uniforms.progress.value = Math.abs(progress);\n return;\n }\n this.preventShaderReplace = true;\n requestAnimationFrame(() => {\n this.preventShaderReplace = false;\n });\n\n if (\n this.swiper.params.gl.shader === 'random' ||\n Array.isArray(this.swiper.params.gl.shader)\n ) {\n this.replaceRandomShader();\n this.material.uniforms.texture1.value = fromTexture;\n this.material.uniforms.texture2.value = newTexture;\n this.material.uniforms.progress.value = Math.abs(progress);\n } else {\n this.material.uniforms.progress.value = Math.abs(progress);\n }\n } else if (needsTransitionDuration) {\n if (progress === 0 && this.material.uniforms.progress.value === 0) {\n this.material.uniforms.progress.value = 1;\n }\n if (progress === 1 && this.material.uniforms.progress.value === 1) {\n this.material.uniforms.progress.value = 0;\n }\n this.animateUniform(this.material.uniforms.progress, progress, () => {\n if (\n this.swiper.params.gl.shader === 'random' ||\n Array.isArray(this.swiper.params.gl.shader)\n ) {\n this.replaceRandomShader();\n this.material.uniforms.texture1.value = fromTexture;\n this.material.uniforms.texture2.value = newTexture;\n this.material.uniforms.progress.value = progress;\n }\n if (progress === 1) {\n this.material.uniforms.texture1.value = newTexture;\n }\n this.material.uniforms.progress.value = 0;\n });\n } else {\n this.material.uniforms.progress.value = Math.abs(progress);\n }\n }\n\n render() {\n if (this.swiper.destroyed || this.destroyed) return;\n this.time += 0.05;\n this.material.uniforms.time.value = this.time;\n\n Object.keys(this.uniforms).forEach((item) => {\n this.material.uniforms[item].value = this.uniforms[item].value;\n });\n\n requestAnimationFrame(this.render.bind(this));\n this.renderer.render({ scene: this.scene, camera: this.camera });\n }\n\n destroy() {\n this.initialized = false;\n this.destroyed = true;\n if (this.gl && this.gl.canvas) this.container.removeChild(this.gl.canvas);\n }\n}\nexport default GL;\n","import GL from './gl/gl';\n\nif (typeof window !== 'undefined' && window.SwiperElementRegisterParams) {\n window.SwiperElementRegisterParams(['gl']);\n}\n\nexport default function SwiperGL({ swiper, on, extendParams }) {\n swiper.gl = null;\n let noWebGLSupport = false;\n\n function supportsWebGL() {\n try {\n const canvas = document.createElement('canvas');\n return (\n !!window.WebGLRenderingContext &&\n (canvas.getContext('webgl') || canvas.getContext('experimental-webgl'))\n );\n } catch (e) {\n return false;\n }\n }\n\n extendParams({\n gl: {\n shader: 'random',\n shaderPerSlide: false,\n displacementMap: undefined,\n },\n });\n\n const glInit = () => {\n swiper.gl = new GL({\n swiper,\n shader: swiper.params.gl.shader,\n shaderPerSlide: swiper.params.gl.shaderPerSlide,\n });\n };\n\n let needsTransitionDuration;\n let previousProgress;\n\n on('beforeInit', () => {\n if (swiper.params.effect !== 'gl') return;\n if (!supportsWebGL()) {\n noWebGLSupport = true;\n return;\n }\n\n swiper.classNames.push(`${swiper.params.containerModifierClass}gl`);\n const overwriteParams = {\n watchSlidesProgress: true,\n };\n Object.assign(swiper.params, overwriteParams);\n Object.assign(swiper.originalParams, overwriteParams);\n });\n on('init', () => {\n if (swiper.params.effect !== 'gl' || noWebGLSupport || swiper.glDestroyed)\n return;\n if (!swiper.gl) {\n glInit();\n }\n });\n on('resize', () => {\n if (swiper.params.effect !== 'gl' || noWebGLSupport || swiper.glDestroyed)\n return;\n swiper.gl.resize();\n });\n\n on('setTranslate', () => {\n if (swiper.params.effect !== 'gl' || noWebGLSupport || swiper.glDestroyed)\n return;\n if (!swiper.gl) {\n glInit();\n }\n let from;\n let to;\n let transitionProgress;\n let needShaderReplace = false;\n let targetIndex;\n swiper.slides.forEach((slideEl, slideIndex) => {\n // eslint-disable-next-line\n const progress = slideEl.progress;\n if (swiper.params.cssMode && Math.round(progress * 100) === 0) {\n needShaderReplace = true;\n }\n if (\n (progress > 0 && progress < 1) ||\n (progress === 0 && swiper.progress < previousProgress)\n ) {\n from = slideIndex;\n to = slideIndex + 1;\n transitionProgress = progress;\n targetIndex = from;\n }\n if (\n (progress < 0 && progress > -1) ||\n (progress === 0 && swiper.progress > previousProgress)\n ) {\n from = slideIndex - 1;\n to = slideIndex;\n transitionProgress = 1 + progress;\n targetIndex = to;\n }\n });\n\n previousProgress = swiper.progress || 0;\n if (typeof from === 'undefined' && typeof to === 'undefined') {\n return;\n }\n needShaderReplace =\n needShaderReplace &&\n Math.round(transitionProgress) === transitionProgress;\n const newFrom = Math.min(targetIndex, swiper.activeIndex);\n const newTo = Math.max(targetIndex, swiper.activeIndex);\n if (!swiper.params.loop && newTo !== newFrom) {\n from = newFrom;\n to = newTo;\n }\n\n swiper.gl.setProgress(\n from,\n to,\n transitionProgress,\n needsTransitionDuration,\n needShaderReplace,\n );\n });\n on('setTransition', (_s, duration) => {\n if (swiper.params.effect !== 'gl' || noWebGLSupport || swiper.glDestroyed)\n return;\n needsTransitionDuration = duration > 0 && !swiper.params.cssMode;\n });\n on('slidesGridLengthChange', () => {\n if (\n swiper.params.effect !== 'gl' ||\n noWebGLSupport ||\n !swiper.initialized ||\n swiper.glDestroyed\n )\n return;\n if (swiper.gl && swiper.gl.loadTextures) {\n swiper.gl.loadTextures();\n }\n });\n on('beforeDestroy', () => {\n if (swiper.params.effect !== 'gl' || noWebGLSupport) return;\n if (swiper.gl) {\n swiper.glDestroyed = true;\n swiper.gl.destroy();\n swiper.gl = null;\n }\n });\n}\n"],"mappings":"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"}