{"version":3,"file":"Unfocused.DxO2srkV.mjs","names":["useState","useMemo","useState","useRef","useRef","useState","useState","useRef","useCallback","copy","set","add","subtract","multiply","scale","normalize","dot","Vec3Func.length","Vec3Func.distance","Vec3Func.squaredLength","Vec3Func.squaredDistance","Vec3Func.dot","Vec3Func.exactEquals","Vec3Func.angle","tempVec3","ID","ID","ID","copy","set","normalize","dot","identity","multiply","invert","copy","vec4.copy","set","vec4.set","vec4.dot","vec4.normalize","QuatFunc.dot","copy","set","identity","invert","multiply","translate","scale","rotate","vec3.length","fromQuat","Mat4Func.getMaxScaleOnAxis","Mat4Func.determinant","ID","useRef","useState","useCallback","useRef","useMemo"],"sources":["https:/framerusercontent.com/modules/yiDyco0u2VIMCjawUp4K/SbAiryFn9g8ffjbuHQHj/GLUtils.js","https:/framer.com/m/GLUtils-cYf4.js","https:/framerusercontent.com/modules/MpdGPgep8CrmVuG8IclI/3flka5fkGcFUNVW00KRS/OGLUtils.js","https:/framer.com/m/OGLUtils-LEvG.js","https:/framerusercontent.com/modules/iz4j9aR1Hz2B8RkMogH4/AGDgcLdj5rKsWYMCweUZ/UseVariantValue.js","https:/framer.com/m/UseVariantValue-mxjI.js","https:/framerusercontent.com/modules/3Dc1qksRQy0igUBXLpC8/O0d7Tn7RulZ8jPX1N6S2/UseAnimatedValue.js","https:/framer.com/m/UseAnimatedValue-6Bkx.js","https:/framerusercontent.com/modules/DGJpj5NFNaYVLbwIQLV3/ITjnQ5HfCGlk0h6nR2c1/UseMedia.js","https:/framer.com/m/UseMedia-AW14.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/Vec3Func.js","https:/unpkg.com/ogl@1.0.11/src/math/Vec3.js","https:/unpkg.com/ogl@1.0.11/src/core/Geometry.js","https:/unpkg.com/ogl@1.0.11/src/core/Program.js","https:/unpkg.com/ogl@1.0.11/src/core/Renderer.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/Vec4Func.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/QuatFunc.js","https:/unpkg.com/ogl@1.0.11/src/math/Quat.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/Mat4Func.js","https:/unpkg.com/ogl@1.0.11/src/math/Mat4.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/EulerFunc.js","https:/unpkg.com/ogl@1.0.11/src/math/Euler.js","https:/unpkg.com/ogl@1.0.11/src/core/Transform.js","https:/unpkg.com/ogl@1.0.11/src/core/Camera.js","https:/unpkg.com/ogl@1.0.11/src/math/functions/Mat3Func.js","https:/unpkg.com/ogl@1.0.11/src/math/Mat3.js","https:/unpkg.com/ogl@1.0.11/src/core/Mesh.js","https:/unpkg.com/ogl@1.0.11/src/core/Texture.js","https:/unpkg.com/ogl@1.0.11/src/extras/Plane.js","https:/unpkg.com/ogl@1.0.11/src/extras/Orbit.js","https:/unpkg.com/ogl@1.0.11/src/extras/Curve.js","https:/unpkg.com/ogl@1.0.11/src/extras/TextureLoader.js","https:/unpkg.com/ogl","https:/framerusercontent.com/modules/Qdd3eGacdk0a7XalD9lO/LmjERPAe2BydyHLwJYQM/UseOGLScene.js","https:/framer.com/m/UseOGLScene-gg2G.js","https:/framerusercontent.com/modules/mSJ52dBkVivlfYMsRpwj/z319KePspYG0E1KkmAJd/UseSetup.js","https:/framerusercontent.com/modules/jypow408LDgPDnL677k2/Dg0auyGnIrsdg2LBcXmt/Shaders.js","https:/framerusercontent.com/modules/7zxjrN9X6oe3IFas7UpS/imR8plZxz6TwO8xlwuod/OGL.js","https:/framerusercontent.com/modules/oaA9N1sWyc1tB57T7xaj/YxlTLBSLBUyLyALkWkvh/Unfocused.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{ControlType,useIsStaticRenderer}from\"framer\";import{useEffect,useMemo,useState}from\"react\";export default function GLUtils(props){return /*#__PURE__*/_jsx(\"div\",{});}export const DEFAULT_IMAGE=\"https://framerusercontent.com/images/6MTlf3HAzQ2kjMqPur2sdbkznQ.png?scale-down-to=2048\";export const DEFAULT_IMAGE_FLOWER=\"https://framerusercontent.com/images/cz3ePY6OFcSC4EItQFuQxLrQbBA.jpg\";export const DEFAULT_IMAGE_FLOWER_DARK=\"https://framerusercontent.com/images/l4gFK0Yuorz9j7RwU2EbwWxpw.jpg\";export const DEFAULT_ALT=\"Default image\";export const DEFAULT_ALT_FLOWER=\"A wilted tulip with red and yellow petals.\";export const DEFAULT_ALT_FLOWER_DARK=\"A bright yellow sunflower against a dark background.\";export function degToRad(degrees){return degrees*(Math.PI/180);}export function colorToVec4(color){let actualColor=color;if(color.startsWith(\"var(\")){const varMatch=color.match(/var\\([^,]+,\\s*(.+)\\)$/);if(varMatch){actualColor=varMatch[1].trim();}else{console.warn(\"无法解析 CSS 变量:\",color);return[0,0,0,1];}}actualColor=actualColor.replace(/\\s/g,\"\");let r,g,b,a=1;// 处理 rgb() 和 rgba() 格式\nconst rgbaMatch=actualColor.match(/rgba?\\((\\d+),(\\d+),(\\d+)(?:,([0-9]*\\.?[0-9]+))?\\)/);if(rgbaMatch){r=parseInt(rgbaMatch[1]);g=parseInt(rgbaMatch[2]);b=parseInt(rgbaMatch[3]);if(rgbaMatch[4]!==undefined){a=parseFloat(rgbaMatch[4]);}return[r/255,g/255,b/255,a];}// 处理十六进制格式 (#RGB 或 #RRGGBB)\nconst hexMatch=actualColor.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);if(hexMatch){const hex=hexMatch[1];if(hex.length===3){// 处理 #RGB 格式，扩展为 #RRGGBB\nr=parseInt(hex[0]+hex[0],16);g=parseInt(hex[1]+hex[1],16);b=parseInt(hex[2]+hex[2],16);}else{// 处理 #RRGGBB 格式\nr=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);}return[r/255,g/255,b/255,a];}console.warn(\"无法解析颜色格式:\",color);return[0,0,0,1];}export function colorToVec3(color){let actualColor=color;if(color.startsWith(\"var(\")){const varMatch=color.match(/var\\([^,]+,\\s*(.+)\\)$/);if(varMatch){actualColor=varMatch[1].trim();}else{console.warn(\"无法解析 CSS 变量:\",color);return[0,0,0];}}actualColor=actualColor.replace(/\\s/g,\"\");let r,g,b;// 处理 rgb() 和 rgba() 格式\nconst rgbaMatch=actualColor.match(/rgba?\\((\\d+),(\\d+),(\\d+)(?:,([0-9]*\\.?[0-9]+))?\\)/);if(rgbaMatch){r=parseInt(rgbaMatch[1]);g=parseInt(rgbaMatch[2]);b=parseInt(rgbaMatch[3]);return[r/255,g/255,b/255];}// 处理十六进制格式 (#RGB 或 #RRGGBB)\nconst hexMatch=actualColor.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);if(hexMatch){const hex=hexMatch[1];if(hex.length===3){// 处理 #RGB 格式，扩展为 #RRGGBB\nr=parseInt(hex[0]+hex[0],16);g=parseInt(hex[1]+hex[1],16);b=parseInt(hex[2]+hex[2],16);}else{// 处理 #RRGGBB 格式\nr=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);}return[r/255,g/255,b/255];}console.warn(\"无法解析颜色格式:\",color);return[0,0,0];}export const useDarkMode=()=>{const[isDarkMode,setIsDarkMode]=useState(false);useEffect(()=>{const mediaQuery=window.matchMedia(\"(prefers-color-scheme: dark)\");setIsDarkMode(mediaQuery.matches);const handler=e=>setIsDarkMode(e.matches);mediaQuery.addListener(handler);return()=>mediaQuery.removeListener(handler);},[]);return isDarkMode;};export const CompatibleMedia=({mediaType,mediaSrc,imageAlt,fit,loop,style={},...props})=>{const isStaticRenderer=useIsStaticRenderer();const defaultStyle={width:\"100%\",height:\"100%\",objectFit:fit};if(mediaType===\"image\"){return /*#__PURE__*/_jsx(\"img\",{src:mediaSrc,alt:imageAlt,style:{...defaultStyle,...style},crossOrigin:\"anonymous\"});}else{return /*#__PURE__*/_jsx(\"video\",{src:mediaSrc,autoPlay:!isStaticRenderer,muted:true,playsInline:true,loop:loop,style:{...defaultStyle,...style},crossOrigin:\"anonymous\"});}};export const useMediaSource=(media,file,urlVideo,upVideo,defaultImage,darkImage,dark,placeholder=\"flower_dark\")=>{const isDarkMode=useDarkMode();const getPlaceholderValues=useMemo(()=>{const placeholderMap={reveals:{image:\"https://framerusercontent.com/images/6MTlf3HAzQ2kjMqPur2sdbkznQ.png?scale-down-to=2048\",alt:\"reveals original image.\"},flower_light:{image:\"https://framerusercontent.com/images/cz3ePY6OFcSC4EItQFuQxLrQbBA.jpg\",alt:\"A wilted tulip with red and yellow petals.\"},flower_dark:{image:\"https://framerusercontent.com/images/l4gFK0Yuorz9j7RwU2EbwWxpw.jpg\",alt:\"A bright yellow sunflower against a dark background.\"},arch_dark:{image:\"https://framerusercontent.com/images/kW9tNTLiYRYp7LGxfxbuywTR4I.jpg\",alt:\"A white sphere suspended among curved black metallic ribbons.\"},dice_dark:{image:\"https://framerusercontent.com/images/bXMH0vhJVBjFjMhCnvcVuK0KA0.jpg\",alt:\"A cluster of smooth, reflective metallic shapes on a dark background.\"},astronaut:{image:\"https://framerusercontent.com/images/K54OdkNAJ7dNPCQlcqviSKRrXAY.jpg?width=1920&height=1282\",alt:\"Close-up of an astronaut’s face inside a reflective helmet.\"},silhouetted:{image:\"https://framerusercontent.com/images/CeZXMYBfdBEchX3ub79dGEHlyCQ.jpg?width=1920&height=1280\",alt:\"Silhouetted figure walking behind frosted glass panels.\"},structure:{image:\"https://framerusercontent.com/images/Ud6oqYomUb6OGy9FMr1VmAPXIU.jpg?width=1920&height=1280\",alt:\"Abstract red metal structure against a clear sky.\"},dizzy:{image:\"https://framerusercontent.com/images/JJmc0OZsfY0HhNmbr8W4De17Pw.jpg?width=1920&height=1343\",alt:\"Blurred portrait of a person in motion with hands near the head.\"},hand:{image:\"https://framerusercontent.com/images/qAQg0suczEYw3OPZEmj7XxyW0.jpg?width=1920&height=1440\",alt:\"A hand reaching toward a glowing blue light.\"},porsche:{image:\"https://framerusercontent.com/images/9bPvA91sUvfr4lgE2gQ1MbfUMDs.jpg?width=1920&height=1280\",alt:\"A silver sports car in the rain, seen from the rear side.\"},wheat:{image:\"https://framerusercontent.com/images/jhGTXFJ0WKeCaZXfyfE5pSL1Pbc.jpg?width=1920&height=1280\",alt:\"Golden grass glistening in sunlight.\"}};return placeholderMap[placeholder]||placeholderMap.flower_dark;},[placeholder]);const imageSrc=useMemo(()=>{if(dark&&isDarkMode&&darkImage?.src){return darkImage.src;}return defaultImage?.src||getPlaceholderValues.image;},[isDarkMode,defaultImage,darkImage,dark,getPlaceholderValues.image]);const imageAlt=useMemo(()=>{if(media===\"image\"){if(dark&&isDarkMode&&darkImage?.alt){return darkImage.alt;}return defaultImage?.alt||getPlaceholderValues.alt;}else if(media===\"cms\"){if(dark&&isDarkMode&&darkImage?.alt){return darkImage.alt;}return defaultImage?.alt||getPlaceholderValues.alt;}},[isDarkMode,defaultImage,darkImage,dark,getPlaceholderValues.alt]);const mediaSrc=useMemo(()=>{if(media===\"image\"){return imageSrc;}return file===\"url\"?urlVideo:upVideo;},[media,file,imageSrc,urlVideo,upVideo,defaultImage,darkImage,dark]);const mediaType=useMemo(()=>{const mediaTypeMap={image:\"image\",cms:\"image\",video:\"video\"};return mediaTypeMap[media]||\"video\";},[media]);return{imageSrc,imageAlt,mediaSrc,mediaType};};export const propertyControls={media:{type:{type:ControlType.Enum,title:\"Media\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],displaySegmentedControl:true,defaultValue:\"image\"},file:{type:ControlType.Enum,title:\"File\",options:[\"url\",\"upload\"],optionTitles:[\"URL\",\"Upload\"],displaySegmentedControl:true,defaultValue:\"url\",hidden(props){return props.type!==\"video\";}},defaultImage:{type:ControlType.ResponsiveImage,title:\"Image\",hidden(props){return props.type!==\"image\";}},// dark: {\n//     type: ControlType.Boolean,\n//     title: \"Dark Mode\",\n//     defaultValue: false,\n//     hidden(props) {\n//         return props.type !== \"image\"\n//     },\n// },\n// darkImage: {\n//     type: ControlType.ResponsiveImage,\n//     title: \"Dark Image\",\n//     hidden(props) {\n//         return props.dark\n//             ? props.type === \"image\"\n//                 ? false\n//                 : true\n//             : true\n//     },\n// },\nurlVideo:{type:ControlType.String,title:\"URL\",defaultValue:\"https://framerusercontent.com/assets/Jhocnrz23GM4PK1CT7mBiwAu5U.mp4\",// description: \"Use video will affect performance more.\",\nhidden(props){return props.file===\"url\"?props.type===\"video\"?false:true:true;}},upVideo:{type:ControlType.File,title:\"Upload\",allowedFileTypes:[\"mp4\",\"webm\"],description:\"Use video will affect performance more.\",hidden(props){return props.file===\"upload\"?props.type===\"video\"?false:true:true;}},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:true,hidden(props){return props.type!==\"video\";}}},size:{fit:{type:ControlType.Enum,title:\"Fit\",options:[\"cover\",\"contain\"],optionTitles:[\"Cover\",\"Contain\"],defaultValue:\"cover\"}},animateControls:{type:{type:ControlType.Enum,title:\"Type\",options:[\"disable\",\"appear\",\"enter\",\"transform\",\"variant\"],optionTitles:[\"Disable\",\"Appear\",\"Enter\",\"Transform\",\"Variant\"],defaultValue:\"appear\"},replay:{type:ControlType.Boolean,title:\"Replay\",defaultValue:true,hidden(props){return props.type!==\"enter\";}},trigger:{type:ControlType.Enum,title:\"Trigger\",options:[\"layer\",\"section\"],optionTitles:[\"Layer in View\",\"Section in View\"],defaultValue:\"layer\",hidden(props){return props.type==\"appear\"||props.type==\"disable\"||props.type==\"variant\";}},section:{// @ts-ignore\ntype:ControlType.ScrollSectionRef,title:\"Section\",hidden(props){if((props.type===\"transform\"||props.type===\"enter\")&&props.trigger===\"section\"){return false;}return true;}},amount:{type:ControlType.Enum,title:\"Amount\",options:[1,.5,0],optionTitles:[\"Top\",\"Center\",\"Bottom\"],displaySegmentedControl:true,defaultValue:0,description:\"Play animation when how much of the media comes into view.\",hidden(props){return props.type!==\"enter\";}},viewport:{type:ControlType.Enum,title:\"Viewport\",options:[\"top\",\"center\",\"bottom\"],optionTitles:[\"Top\",\"Center\",\"Bottom\"],displaySegmentedControl:true,defaultValue:\"center\",description:\"Start transforming when how much of the media comes into view.\",hidden(props){return props.type!==\"transform\";}}},accessibility:{accessibility:{type:ControlType.Object,title:\"Accessibility\",buttonTitle:\"Aria Label\",icon:\"boolean\",// description: \"Learn more on [Reveals](https://reveals.cool).\",\ncontrols:{enableAria:{type:ControlType.Boolean,title:\"Aria Label\",defaultValue:false},compatibility:{type:ControlType.Boolean,title:\"Compatibility\",defaultValue:false,description:\"Disable effects and use regular *image/video* elements. e.g. use on Phone layout for better performance.\"},reduce:{type:ControlType.Enum,title:\"Reduce Motion\",displaySegmentedControl:true,segmentedControlDirection:\"horizontal\",options:[true,false],optionTitles:[\"Allow\",\"Block\"],defaultValue:false,description:\"Whether to allow Reduce Motion to control animation.\"},renderer:{type:ControlType.Enum,title:\"Renderer\",displaySegmentedControl:true,segmentedControlDirection:\"horizontal\",options:[\"auto\",\"always\"],optionTitles:[\"Auto\",\"Always\"],defaultValue:\"auto\",description:\"Control when the renderer will render.\"}}},ariaLabel:{type:ControlType.String,title:\"Aria Label\",defaultValue:\"\",hidden(props){return!props.accessibility.enableAria;}}},eventHandler:{onLoad:{type:ControlType.EventHandler,title:\"Load\"},onError:{type:ControlType.EventHandler,title:\"Error\"},onVideoEnd:{type:ControlType.EventHandler,title:\"Video End\"},onAnimationComplete:{type:ControlType.EventHandler,title:\"Animation Complete\"}}};\nexport const __FramerMetadata__ = {\"exports\":{\"DEFAULT_ALT_FLOWER_DARK\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CompatibleMedia\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDarkMode\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_ALT_FLOWER\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_IMAGE_FLOWER\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"colorToVec3\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_IMAGE_FLOWER_DARK\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"propertyControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"GLUtils\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"colorToVec4\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMediaSource\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_IMAGE\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"DEFAULT_ALT\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"degToRad\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GLUtils.map","/*\n * GLUtils\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/yiDyco0u2VIMCjawUp4K/SbAiryFn9g8ffjbuHQHj/GLUtils.js\"\nexport { default } from \"https://framerusercontent.com/modules/yiDyco0u2VIMCjawUp4K/SbAiryFn9g8ffjbuHQHj/GLUtils.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";export default function OGLUtils(props){return /*#__PURE__*/_jsx(\"div\",{});}export const calculatePlaneSize=(mediaWidth,mediaHeight,containerWidth,containerHeight,fitMode)=>{const mediaAspect=mediaWidth/mediaHeight;const containerAspect=containerWidth/containerHeight;let planeWidth,planeHeight;if(fitMode===\"cover\"){if(mediaAspect>containerAspect){planeHeight=containerHeight;planeWidth=containerHeight*mediaAspect;}else{planeWidth=containerWidth;planeHeight=containerWidth/mediaAspect;}}else if(fitMode===\"contain\"){if(mediaAspect>containerAspect){planeWidth=containerWidth;planeHeight=containerWidth/mediaAspect;}else{planeHeight=containerHeight;planeWidth=containerHeight*mediaAspect;}}return{width:planeWidth,height:planeHeight};};export const defaultPostProcessVertexShader=`\n    attribute vec2 uv;\n    attribute vec3 position;\n\n    varying vec2 vUv;\n\n    void main() {\n        vUv = uv;\n        gl_Position = vec4(position, 1.0);\n    }\n`;export const defaultPostProcessFragmentShader=`\n    precision highp float;\n\n    uniform sampler2D uTexture;\n    uniform float uTime;\n    uniform vec2 uResolution;\n\n    varying vec2 vUv;\n\n    void main() {\n        vec4 color = texture2D(uTexture, vUv);\n        gl_FragColor = color;\n    }\n`;export const defaultVertexShader=`\n        attribute vec3 position;\n        attribute vec2 uv;\n        uniform mat4 modelViewMatrix;\n        uniform mat4 projectionMatrix;\n        varying vec2 vUv;\n        \n        void main() {\n            vUv = uv;\n            gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n        }\n    `;export const defaultFragmentShader=`\n        precision mediump float;\n        \n        uniform sampler2D uTexture;\n        varying vec2 vUv;\n        \n        void main() {\n            vec4 textureColor = texture2D(uTexture, vUv);\n            gl_FragColor = textureColor;\n        }\n    `;\nexport const __FramerMetadata__ = {\"exports\":{\"defaultVertexShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"OGLUtils\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultPostProcessVertexShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultFragmentShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultPostProcessFragmentShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"calculatePlaneSize\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./OGLUtils.map","/*\n * OGLUtils\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/MpdGPgep8CrmVuG8IclI/3flka5fkGcFUNVW00KRS/OGLUtils.js\"\nexport { default } from \"https://framerusercontent.com/modules/MpdGPgep8CrmVuG8IclI/3flka5fkGcFUNVW00KRS/OGLUtils.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";import{animate,MotionValue}from\"framer-motion\";export default function VariantValue(props){return /*#__PURE__*/_jsx(\"div\",{});}export const useVariantValues=(values,transition,enabled=true)=>{const[isAnimating,setIsAnimating]=useState(false);const motionValuesRef=useRef({});// 确保 motionValuesRef.current 拥有所有当前值的 MotionValue 实例\nfor(const key in values){if(!motionValuesRef.current[key]){motionValuesRef.current[key]=new MotionValue(values[key]);}}// Effect 用于处理值的更新（带或不带动画）\nuseEffect(()=>{// 如果禁用了动画，立即设置值并确保动画状态为 false\nif(!enabled){for(const key in values){const mv=motionValuesRef.current[key];const targetValue=values[key];if(mv&&mv.get()!==targetValue){// 直接设置值，不进行动画\nmv.set(targetValue);}}// 确保动画状态为 false\nif(isAnimating){setIsAnimating(false);}return;// 提前退出 effect\n}// --- 如果启用了动画，执行以下逻辑 ---\nconst allAnimations=[];let hasStartedAnimation=false;for(const key in values){const mv=motionValuesRef.current[key];const targetValue=values[key];if(mv&&mv.get()!==targetValue){hasStartedAnimation=true;const animationPromise=animate(mv,targetValue,transition);allAnimations.push(animationPromise);}}if(hasStartedAnimation){setIsAnimating(true);}// 等待所有动画完成\nPromise.all(allAnimations).then(()=>{if(hasStartedAnimation){setIsAnimating(false);}});// 清理函数\nreturn()=>{allAnimations.forEach(animationControl=>{animationControl.stop();});};// 将 enabled 添加到依赖数组\n},[JSON.stringify(values),transition,enabled]);return{variantValue:motionValuesRef.current,isVariantUpdating:isAnimating};};\nexport const __FramerMetadata__ = {\"exports\":{\"useVariantValues\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"VariantValue\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./UseVariantValue.map","/*\n * UseVariantValue\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/iz4j9aR1Hz2B8RkMogH4/AGDgcLdj5rKsWYMCweUZ/UseVariantValue.js\"\nexport { default } from \"https://framerusercontent.com/modules/iz4j9aR1Hz2B8RkMogH4/AGDgcLdj5rKsWYMCweUZ/UseVariantValue.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";export default function AnimatedValue(props){return /*#__PURE__*/_jsx(\"div\",{});}import{useRef,useEffect,useState}from\"react\";import{useInView,useScroll}from\"framer-motion\";import{animate}from\"framer-motion\";export function useAnimatedValues(config,animateProp,transition,mountRef,enable=true){const values=useRef(Object.fromEntries(Object.entries(config).map(([key,{from}])=>[key,from])));const[isUpdating,setIsUpdating]=useState(false);const animationControlsRef=useRef(null);const targetRef=enable?animateProp.trigger===\"section\"&&animateProp.section?animateProp.section:mountRef:mountRef;const isInView=useInView(targetRef,{once:!animateProp.replay,amount:animateProp.amount});const{scrollYProgress}=useScroll({target:targetRef,layoutEffect:false,offset:animateProp.viewport===\"top\"?[\"start start\",\"end start\"]:animateProp.viewport===\"bottom\"?[\"start end\",\"start start\"]:[\"start center\",\"end center\"]});const[scrollProgress,setScrollProgress]=useState(0);// 只有在启用时才监听滚动进度变化\nuseEffect(()=>{if(enable&&animateProp.type===\"transform\"){const unsubscribe=scrollYProgress.onChange(latest=>{setScrollProgress(1-latest);});return unsubscribe;}},[scrollYProgress,animateProp.type,enable]);useEffect(()=>{// 清理之前的动画\nif(animationControlsRef.current){animationControlsRef.current.stop();animationControlsRef.current=null;}// 如果禁用，重置到初始值\nif(!enable){Object.entries(config).forEach(([key,{from}])=>{values.current[key]=from;});// 不需要手动设置 isUpdating，因为没有动画在运行\nreturn;}const targets={};const animatableTargets={};let shouldAnimate=false;let hasAnimatableValues=false;Object.entries(config).forEach(([key,{from,to}])=>{let targetValue;switch(animateProp.type){case\"appear\":targetValue=to;shouldAnimate=true;break;case\"enter\":targetValue=isInView?to:from;shouldAnimate=true;break;case\"transform\":targetValue=from+(to-from)*scrollProgress;shouldAnimate=true;break;default:values.current[key]=from;return;}targets[key]=targetValue;// 只有当值确实需要改变时才加入动画目标\nif(Math.abs(values.current[key]-targetValue)>.001){animatableTargets[key]=targetValue;hasAnimatableValues=true;}else{// 直接设置不需要动画的值\nvalues.current[key]=targetValue;}});// 如果不需要动画或没有可动画的值，直接返回\nif(!shouldAnimate||!hasAnimatableValues){return;}const controls=animate(values.current,animatableTargets,{...transition,restDelta:.001,restSpeed:.001,onComplete:()=>{setIsUpdating(false);animationControlsRef.current=null;},onUpdate:latest=>{if(!isUpdating){setIsUpdating(true);}}});animationControlsRef.current=controls;return()=>{if(controls){controls.stop();// setIsUpdating(false)\nanimationControlsRef.current=null;}};},[isInView,scrollProgress,animateProp.type,enable]);return{values:values.current,isUpdating};}export function useAnimatedProgress(animateProp,transition,mountRef,enable=true){const progressRef=useRef(1);const[progress,setProgress]=useState(1);const[isUpdatingProgress,setIsUpdatingProgress]=useState(false);const[scrollProgress,setScrollProgress]=useState(1);// 滚动动画 - 根据 enable 状态决定监听目标\nconst isInView=useInView(enable&&animateProp.trigger===\"section\"&&animateProp.section?animateProp.section:mountRef,{once:enable?!animateProp.replay:true,amount:enable?animateProp.amount:0});// 滚动进度 - 根据 enable 状态决定监听目标\nconst{scrollYProgress}=useScroll({target:enable&&animateProp.trigger===\"section\"&&animateProp.section?animateProp.section:mountRef,layoutEffect:false,offset:enable&&animateProp.viewport===\"top\"?[\"start start\",\"end start\"]:enable&&animateProp.viewport===\"bottom\"?[\"start end\",\"start start\"]:[\"start center\",\"end center\"]});// 监听滚动进度变化\nuseEffect(()=>{if(enable&&animateProp.type===\"transform\"){const unsubscribe=scrollYProgress.onChange(latest=>{setScrollProgress(1-latest);});return unsubscribe;}},[scrollYProgress,animateProp.type,enable]);// 动画控制逻辑\nuseEffect(()=>{// 如果禁用了 Hook，重置为默认状态\nif(!enable){progressRef.current=1;setProgress(1);setIsUpdatingProgress(false);return;}let targetValue=1;let shouldAnimate=false;switch(animateProp.type){case\"appear\":// 直接动画\ntargetValue=0;shouldAnimate=true;break;case\"enter\":// 滚动动画\ntargetValue=isInView?0:1;shouldAnimate=true;break;case\"transform\":// 滚动进度\ntargetValue=scrollProgress;shouldAnimate=true;break;default:progressRef.current=1;setProgress(1);setIsUpdatingProgress(false);return;}if(!shouldAnimate)return;setIsUpdatingProgress(true);const controls=animate(progressRef.current,targetValue,{...transition,restDelta:.001,restSpeed:.001,onUpdate:latest=>{progressRef.current=latest;setProgress(latest);},onComplete:()=>{setIsUpdatingProgress(false);}});return()=>{controls.stop();};},[enable,isInView,scrollProgress,animateProp.type,transition]);return{progress,isUpdatingProgress};}\nexport const __FramerMetadata__ = {\"exports\":{\"useAnimatedProgress\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"AnimatedValue\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAnimatedValues\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./UseAnimatedValue.map","/*\n * UseAnimatedValue\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/3Dc1qksRQy0igUBXLpC8/O0d7Tn7RulZ8jPX1N6S2/UseAnimatedValue.js\"\nexport { default } from \"https://framerusercontent.com/modules/3Dc1qksRQy0igUBXLpC8/O0d7Tn7RulZ8jPX1N6S2/UseAnimatedValue.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{useRef,useEffect,useState,useCallback}from\"react\";export default function Media(props){return /*#__PURE__*/_jsx(\"div\",{});}const initialState={media:null,dimensions:{width:0,height:0},isLoaded:false,isError:false,isVideoPlaying:false,playVideo:null,pauseVideo:null};export function useMedia(src,mediaType=\"image\",loop=true,autoplay=true){const[mediaState,setMediaState]=useState(initialState);const currentMediaRef=useRef(null);const loadIdRef=useRef(0);const cleanupCurrentMedia=useCallback(()=>{const current=currentMediaRef.current;if(!current)return;if(current instanceof HTMLVideoElement){try{current.pause();}catch{}try{current.removeAttribute(\"src\");current.load();}catch{}}currentMediaRef.current=null;},[]);const loadMedia=useCallback((mediaSrc,type)=>{if(!mediaSrc){cleanupCurrentMedia();setMediaState(initialState);return()=>{};}const loadId=++loadIdRef.current;let disposed=false;const isCurrent=()=>!disposed&&loadIdRef.current===loadId&&currentMediaRef.current!==null;cleanupCurrentMedia();setMediaState(initialState);if(type===\"image\"){const img=new Image;img.crossOrigin=\"anonymous\";currentMediaRef.current=img;const handleLoad=()=>{if(!isCurrent()||currentMediaRef.current!==img)return;setMediaState({media:img,dimensions:{width:img.naturalWidth||img.width,height:img.naturalHeight||img.height},isLoaded:true,isError:false,isVideoPlaying:false,playVideo:null,pauseVideo:null});};const handleError=()=>{if(!isCurrent()||currentMediaRef.current!==img)return;setMediaState({media:null,dimensions:{width:0,height:0},isLoaded:false,isError:true,isVideoPlaying:false,playVideo:null,pauseVideo:null});};img.addEventListener(\"load\",handleLoad);img.addEventListener(\"error\",handleError);img.src=mediaSrc;return()=>{disposed=true;img.removeEventListener(\"load\",handleLoad);img.removeEventListener(\"error\",handleError);if(currentMediaRef.current===img){currentMediaRef.current=null;}};}const video=document.createElement(\"video\");currentMediaRef.current=video;video.crossOrigin=\"anonymous\";video.muted=true;video.loop=loop;video.autoplay=autoplay;video.playsInline=true;video.preload=\"auto\";// Safari / iPhone 更稳妥\nvideo.setAttribute(\"playsinline\",\"\");video.setAttribute(\"webkit-playsinline\",\"\");video.setAttribute(\"muted\",\"\");let firstFrameReady=false;const updateBaseVideoState=()=>{if(!isCurrent()||currentMediaRef.current!==video)return;setMediaState(prev=>({...prev,media:video,dimensions:{width:video.videoWidth||0,height:video.videoHeight||0},isError:false,playVideo:async()=>{try{await video.play();}catch(error){console.error(\"video.play() failed:\",error);throw error;}},pauseVideo:()=>{video.pause();}}));};const markFirstFrameReady=()=>{if(firstFrameReady||!isCurrent()||currentMediaRef.current!==video){return;}if(video.readyState<2)return;firstFrameReady=true;setMediaState(prev=>({...prev,media:video,dimensions:{width:video.videoWidth||0,height:video.videoHeight||0},isLoaded:true,isError:false,isVideoPlaying:!video.paused&&!video.ended,playVideo:async()=>{try{await video.play();}catch(error){console.error(\"video.play() failed:\",error);throw error;}},pauseVideo:()=>{video.pause();}}));};const handleLoadedMetadata=()=>{updateBaseVideoState();};const handleLoadedData=async()=>{markFirstFrameReady();if(!autoplay){try{if(video.currentTime!==0){video.currentTime=0;}}catch(error){console.warn(\"setting currentTime failed:\",error);}return;}try{await video.play();}catch(error){console.error(\"video autoplay failed:\",error);}};const handleCanPlay=()=>{markFirstFrameReady();};const handlePlaying=()=>{if(!isCurrent()||currentMediaRef.current!==video)return;setMediaState(prev=>({...prev,isVideoPlaying:true,isLoaded:prev.isLoaded||video.readyState>=2}));};const handlePause=()=>{if(!isCurrent()||currentMediaRef.current!==video)return;setMediaState(prev=>({...prev,isVideoPlaying:false}));};const handleEnded=()=>{if(!isCurrent()||currentMediaRef.current!==video)return;setMediaState(prev=>({...prev,isVideoPlaying:false}));};const handleError=()=>{if(!isCurrent()||currentMediaRef.current!==video)return;setMediaState({media:null,dimensions:{width:0,height:0},isLoaded:false,isError:true,isVideoPlaying:false,playVideo:null,pauseVideo:null});};video.addEventListener(\"loadedmetadata\",handleLoadedMetadata);video.addEventListener(\"loadeddata\",handleLoadedData);video.addEventListener(\"canplay\",handleCanPlay);video.addEventListener(\"playing\",handlePlaying);video.addEventListener(\"pause\",handlePause);video.addEventListener(\"ended\",handleEnded);video.addEventListener(\"error\",handleError);video.src=mediaSrc;video.load();return()=>{disposed=true;video.removeEventListener(\"loadedmetadata\",handleLoadedMetadata);video.removeEventListener(\"loadeddata\",handleLoadedData);video.removeEventListener(\"canplay\",handleCanPlay);video.removeEventListener(\"playing\",handlePlaying);video.removeEventListener(\"pause\",handlePause);video.removeEventListener(\"ended\",handleEnded);video.removeEventListener(\"error\",handleError);try{video.pause();}catch{}try{video.removeAttribute(\"src\");video.load();}catch{}if(currentMediaRef.current===video){currentMediaRef.current=null;}};},[autoplay,loop,cleanupCurrentMedia]);useEffect(()=>{if(!src){cleanupCurrentMedia();setMediaState(initialState);return;}const cleanup=loadMedia(src,mediaType);return()=>{if(cleanup)cleanup();};},[src,mediaType,loadMedia,cleanupCurrentMedia]);return mediaState;}\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Media\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMedia\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./UseMedia.map","/*\n * UseMedia\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/DGJpj5NFNaYVLbwIQLV3/ITjnQ5HfCGlk0h6nR2c1/UseMedia.js\"\nexport { default } from \"https://framerusercontent.com/modules/DGJpj5NFNaYVLbwIQLV3/ITjnQ5HfCGlk0h6nR2c1/UseMedia.js\"\n","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 * Performs a frame rate independant, linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} decay decay constant for interpolation. useful range between 1 and 25, from slow to fast.\n * @param {Number} dt delta time\n * @returns {vec3} out\n */\nexport function smoothLerp(out, a, b, decay, dt) {\n    const exp = Math.exp(-decay * dt);\n    let ax = a[0];\n    let ay = a[1];\n    let az = a[2];\n\n    out[0] = b[0] + (ax - b[0]) * exp;\n    out[1] = b[1] + (ay - b[1]) * exp;\n    out[2] = b[2] + (az - b[2]) * exp;\n    return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n}\n\n/**\n * Same as above but doesn't apply translation.\n * Useful for rays.\n */\nexport function scaleRotateMat4(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z) / w;\n    return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n    // benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed\n\n    let x = a[0],\n        y = a[1],\n        z = a[2];\n    let qx = q[0],\n        qy = q[1],\n        qz = q[2],\n        qw = q[3];\n\n    let uvx = qy * z - qz * y;\n    let uvy = qz * x - qx * z;\n    let uvz = qx * y - qy * x;\n\n    let uuvx = qy * uvz - qz * uvy;\n    let uuvy = qz * uvx - qx * uvz;\n    let uuvz = qx * uvy - qy * uvx;\n\n    let w2 = qw * 2;\n    uvx *= w2;\n    uvy *= w2;\n    uvz *= w2;\n\n    uuvx *= 2;\n    uuvy *= 2;\n    uuvz *= 2;\n\n    out[0] = x + uvx + uuvx;\n    out[1] = y + uvy + uuvy;\n    out[2] = z + uvz + uuvz;\n    return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport const angle = (function () {\n    const tempA = [0, 0, 0];\n    const tempB = [0, 0, 0];\n\n    return function (a, b) {\n        copy(tempA, a);\n        copy(tempB, b);\n\n        normalize(tempA, tempA);\n        normalize(tempB, tempB);\n\n        let cosine = dot(tempA, tempB);\n\n        if (cosine > 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    smoothLerp(v, decay, dt) {\n        Vec3Func.smoothLerp(this, this, v, decay, dt);\n        return this;\n    }\n\n    clone() {\n        return new Vec3(this[0], this[1], this[2]);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        this[2] = a[o + 2];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        return a;\n    }\n\n    transformDirection(mat4) {\n        const x = this[0];\n        const y = this[1];\n        const z = this[2];\n\n        this[0] = mat4[0] * x + mat4[4] * y + mat4[8] * z;\n        this[1] = mat4[1] * x + mat4[5] * y + mat4[9] * z;\n        this[2] = mat4[2] * x + mat4[6] * y + mat4[10] * z;\n\n        return this.normalize();\n    }\n}\n","// attribute params\n// {\n//     data - typed array eg UInt16Array for indices, Float32Array\n//     size - int default 1\n//     instanced - default null. Pass divisor amount\n//     type - gl enum default gl.UNSIGNED_SHORT for 'index', gl.FLOAT for others\n//     normalized - boolean default false\n\n//     buffer - gl buffer, if buffer exists, don't need to provide data - although needs position data for bounds calculation\n//     stride - default 0 - for when passing in buffer\n//     offset - default 0 - for when passing in buffer\n//     count - default null - for when passing in buffer\n//     min - array - for when passing in buffer\n//     max - array - for when passing in buffer\n// }\n\n// TODO: fit in transform feedback\n\nimport { Vec3 } from '../math/Vec3.js';\n\nconst tempVec3 = /* @__PURE__ */ new Vec3();\n\nlet ID = 1;\nlet ATTR_ID = 1;\n\n// To stop inifinite warnings\nlet isBoundsWarned = false;\n\nexport class Geometry {\n    constructor(gl, attributes = {}) {\n        if (!gl.canvas) console.error('gl not passed as first argument to Geometry');\n        this.gl = gl;\n        this.attributes = attributes;\n        this.id = ID++;\n\n        // Store one VAO per program attribute locations order\n        this.VAOs = {};\n\n        this.drawRange = { start: 0, count: 0 };\n        this.instancedCount = 0;\n\n        // Unbind current VAO so that new buffers don't get added to active mesh\n        this.gl.renderer.bindVertexArray(null);\n        this.gl.renderer.currentGeometry = null;\n\n        // Alias for state store to avoid redundant calls for global state\n        this.glState = this.gl.renderer.state;\n\n        // create the buffers\n        for (let key in attributes) {\n            this.addAttribute(key, attributes[key]);\n        }\n    }\n\n    addAttribute(key, attr) {\n        this.attributes[key] = attr;\n\n        // Set options\n        attr.id = ATTR_ID++; // TODO: currently unused, remove?\n        attr.size = attr.size || 1;\n        attr.type =\n            attr.type ||\n            (attr.data.constructor === Float32Array\n                ? this.gl.FLOAT\n                : attr.data.constructor === Uint16Array\n                ? this.gl.UNSIGNED_SHORT\n                : this.gl.UNSIGNED_INT); // Uint32Array\n        attr.target = key === 'index' ? this.gl.ELEMENT_ARRAY_BUFFER : this.gl.ARRAY_BUFFER;\n        attr.normalized = attr.normalized || false;\n        attr.stride = attr.stride || 0;\n        attr.offset = attr.offset || 0;\n        attr.count = attr.count || (attr.stride ? attr.data.byteLength / attr.stride : attr.data.length / attr.size);\n        attr.divisor = attr.instanced || 0;\n        attr.needsUpdate = false;\n        attr.usage = attr.usage || this.gl.STATIC_DRAW;\n\n        if (!attr.buffer) {\n            // Push data to buffer\n            this.updateAttribute(attr);\n        }\n\n        // Update geometry counts. If indexed, ignore regular attributes\n        if (attr.divisor) {\n            this.isInstanced = true;\n            if (this.instancedCount && 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 * 4;\n            const offset = numLoc === 1 ? 0 : numLoc * 4;\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        // For drawElements, offset needs to be multiple of type size\n        let indexBytesPerElement = 2;\n        if (this.attributes.index?.type === this.gl.UNSIGNED_INT) indexBytesPerElement = 4;\n\n        if (this.isInstanced) {\n            if (this.attributes.index) {\n                this.gl.renderer.drawElementsInstanced(\n                    mode,\n                    this.drawRange.count,\n                    this.attributes.index.type,\n                    this.attributes.index.offset + this.drawRange.start * indexBytesPerElement,\n                    this.instancedCount\n                );\n            } else {\n                this.gl.renderer.drawArraysInstanced(mode, this.drawRange.start, this.drawRange.count, this.instancedCount);\n            }\n        } else {\n            if (this.attributes.index) {\n                this.gl.drawElements(\n                    mode,\n                    this.drawRange.count,\n                    this.attributes.index.type,\n                    this.attributes.index.offset + this.drawRange.start * indexBytesPerElement\n                );\n            } else {\n                this.gl.drawArrays(mode, this.drawRange.start, this.drawRange.count);\n            }\n        }\n    }\n\n    getPosition() {\n        // Use position buffer, or min/max if available\n        const attr = this.attributes.position;\n        // if (attr.min) return [...attr.min, ...attr.max];\n        if (attr.data) return attr;\n        if (isBoundsWarned) return;\n        console.warn('No position buffer data found to compute bounds');\n        return (isBoundsWarned = true);\n    }\n\n    computeBoundingBox(attr) {\n        if (!attr) attr = this.getPosition();\n        const array = attr.data;\n        // Data loaded shouldn't haave stride, only buffers\n        // const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : attr.size;\n        const stride = attr.size;\n\n        if (!this.bounds) {\n            this.bounds = {\n                min: new Vec3(),\n                max: new Vec3(),\n                center: new Vec3(),\n                scale: new Vec3(),\n                radius: Infinity,\n            };\n        }\n\n        const min = this.bounds.min;\n        const max = this.bounds.max;\n        const center = this.bounds.center;\n        const scale = this.bounds.scale;\n\n        min.set(+Infinity);\n        max.set(-Infinity);\n\n        // TODO: check size of position (eg triangle with Vec2)\n        for (let i = 0, l = array.length; i < l; i += stride) {\n            const x = array[i];\n            const y = array[i + 1];\n            const z = array[i + 2];\n\n            min.x = Math.min(x, min.x);\n            min.y = Math.min(y, min.y);\n            min.z = Math.min(z, min.z);\n\n            max.x = Math.max(x, max.x);\n            max.y = Math.max(y, max.y);\n            max.z = Math.max(z, max.z);\n        }\n\n        scale.sub(max, min);\n        center.add(min, max).divide(2);\n    }\n\n    computeBoundingSphere(attr) {\n        if (!attr) attr = this.getPosition();\n        const array = attr.data;\n        // Data loaded shouldn't haave stride, only buffers\n        // const stride = attr.stride ? attr.stride / array.BYTES_PER_ELEMENT : attr.size;\n        const stride = attr.size;\n\n        if (!this.bounds) this.computeBoundingBox(attr);\n\n        let maxRadiusSq = 0;\n        for (let i = 0, l = array.length; i < l; i += stride) {\n            tempVec3.fromArray(array, i);\n            maxRadiusSq = Math.max(maxRadiusSq, this.bounds.center.squaredDistance(tempVec3));\n        }\n\n        this.bounds.radius = Math.sqrt(maxRadiusSq);\n    }\n\n    remove() {\n        for (let key in this.VAOs) {\n            this.gl.renderer.deleteVertexArray(this.VAOs[key]);\n            delete this.VAOs[key];\n        }\n        for (let key in this.attributes) {\n            this.gl.deleteBuffer(this.attributes[key].buffer);\n            delete this.attributes[key];\n        }\n    }\n}\n","// TODO: upload empty texture if null ? maybe not\n// TODO: upload identity matrix if null ?\n// TODO: sampler Cube\n\nlet ID = 1;\n\n// cache of typed arrays used to flatten uniform arrays\nconst arrayCacheF32 = {};\n\nexport class Program {\n    constructor(\n        gl,\n        {\n            vertex,\n            fragment,\n            uniforms = {},\n\n            transparent = false,\n            cullFace = gl.BACK,\n            frontFace = gl.CCW,\n            depthTest = true,\n            depthWrite = true,\n            depthFunc = gl.LEQUAL,\n        } = {}\n    ) {\n        if (!gl.canvas) console.error('gl not passed as first argument to Program');\n        this.gl = gl;\n        this.uniforms = uniforms;\n        this.id = ID++;\n\n        if (!vertex) console.warn('vertex shader not supplied');\n        if (!fragment) console.warn('fragment shader not supplied');\n\n        // Store program state\n        this.transparent = transparent;\n        this.cullFace = cullFace;\n        this.frontFace = frontFace;\n        this.depthTest = depthTest;\n        this.depthWrite = depthWrite;\n        this.depthFunc = depthFunc;\n        this.blendFunc = {};\n        this.blendEquation = {};\n        this.stencilFunc = {};\n        this.stencilOp = {}\n\n        // set default blendFunc if transparent flagged\n        if (this.transparent && !this.blendFunc.src) {\n            if (this.gl.renderer.premultipliedAlpha) this.setBlendFunc(this.gl.ONE, this.gl.ONE_MINUS_SRC_ALPHA);\n            else this.setBlendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n        }\n\n        // Create empty shaders and attach to program\n        this.vertexShader = gl.createShader(gl.VERTEX_SHADER);\n        this.fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n        this.program = gl.createProgram();\n        gl.attachShader(this.program, this.vertexShader);\n        gl.attachShader(this.program, this.fragmentShader);\n\n        // Compile shaders with source\n        this.setShaders({ vertex, fragment });\n    }\n\n    setShaders({ vertex, fragment }) {\n        if (vertex) {\n            // compile vertex shader and log errors\n            this.gl.shaderSource(this.vertexShader, vertex);\n            this.gl.compileShader(this.vertexShader);\n            if (this.gl.getShaderInfoLog(this.vertexShader) !== '') {\n                console.warn(`${this.gl.getShaderInfoLog(this.vertexShader)}\\nVertex Shader\\n${addLineNumbers(vertex)}`);\n            }\n        }\n\n        if (fragment) {\n            // compile fragment shader and log errors\n            this.gl.shaderSource(this.fragmentShader, fragment);\n            this.gl.compileShader(this.fragmentShader);\n            if (this.gl.getShaderInfoLog(this.fragmentShader) !== '') {\n                console.warn(`${this.gl.getShaderInfoLog(this.fragmentShader)}\\nFragment Shader\\n${addLineNumbers(fragment)}`);\n            }\n        }\n\n        // compile program and log errors\n        this.gl.linkProgram(this.program);\n        if (!this.gl.getProgramParameter(this.program, this.gl.LINK_STATUS)) {\n            return console.warn(this.gl.getProgramInfoLog(this.program));\n        }\n\n        // Get active uniform locations\n        this.uniformLocations = new Map();\n        let numUniforms = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_UNIFORMS);\n        for (let uIndex = 0; uIndex < numUniforms; uIndex++) {\n            let uniform = this.gl.getActiveUniform(this.program, uIndex);\n            this.uniformLocations.set(uniform, this.gl.getUniformLocation(this.program, uniform.name));\n\n            // split uniforms' names to separate array and struct declarations\n            const split = uniform.name.match(/(\\w+)/g);\n\n            uniform.uniformName = split[0];\n            uniform.nameComponents = split.slice(1);\n        }\n\n        // Get active attribute locations\n        this.attributeLocations = new Map();\n        const locations = [];\n        const numAttribs = this.gl.getProgramParameter(this.program, this.gl.ACTIVE_ATTRIBUTES);\n        for (let aIndex = 0; aIndex < numAttribs; aIndex++) {\n            const attribute = this.gl.getActiveAttrib(this.program, aIndex);\n            const location = this.gl.getAttribLocation(this.program, attribute.name);\n            // Ignore special built-in inputs. eg gl_VertexID, gl_InstanceID\n            if (location === -1) continue;\n            locations[location] = attribute.name;\n            this.attributeLocations.set(attribute, location);\n        }\n        this.attributeOrder = locations.join('');\n    }\n\n    setBlendFunc(src, dst, srcAlpha, dstAlpha) {\n        this.blendFunc.src = src;\n        this.blendFunc.dst = dst;\n        this.blendFunc.srcAlpha = srcAlpha;\n        this.blendFunc.dstAlpha = dstAlpha;\n        if (src) this.transparent = true;\n    }\n\n    setBlendEquation(modeRGB, modeAlpha) {\n        this.blendEquation.modeRGB = modeRGB;\n        this.blendEquation.modeAlpha = modeAlpha;\n    }\n\n    setStencilFunc(func, ref, mask) {\n        this.stencilRef = ref;\n        this.stencilFunc.func = func;\n        this.stencilFunc.ref = ref;\n        this.stencilFunc.mask = mask;\n    }\n\n    setStencilOp(stencilFail, depthFail, depthPass) {\n        this.stencilOp.stencilFail = stencilFail;\n        this.stencilOp.depthFail = depthFail;\n        this.stencilOp.depthPass = depthPass;\n    }\n\n    applyState() {\n        if (this.depthTest) this.gl.renderer.enable(this.gl.DEPTH_TEST);\n        else this.gl.renderer.disable(this.gl.DEPTH_TEST);\n\n        if (this.cullFace) this.gl.renderer.enable(this.gl.CULL_FACE);\n        else this.gl.renderer.disable(this.gl.CULL_FACE);\n\n        if (this.blendFunc.src) this.gl.renderer.enable(this.gl.BLEND);\n        else this.gl.renderer.disable(this.gl.BLEND);\n\n        if (this.cullFace) this.gl.renderer.setCullFace(this.cullFace);\n        this.gl.renderer.setFrontFace(this.frontFace);\n        this.gl.renderer.setDepthMask(this.depthWrite);\n        this.gl.renderer.setDepthFunc(this.depthFunc);\n        if (this.blendFunc.src) this.gl.renderer.setBlendFunc(this.blendFunc.src, this.blendFunc.dst, this.blendFunc.srcAlpha, this.blendFunc.dstAlpha);\n        this.gl.renderer.setBlendEquation(this.blendEquation.modeRGB, this.blendEquation.modeAlpha);\n\n        if(this.stencilFunc.func || this.stencilOp.stencilFail) this.gl.renderer.enable(this.gl.STENCIL_TEST)\n            else this.gl.renderer.disable(this.gl.STENCIL_TEST)\n\n        this.gl.renderer.setStencilFunc(this.stencilFunc.func, this.stencilFunc.ref, this.stencilFunc.mask)\n        this.gl.renderer.setStencilOp(this.stencilOp.stencilFail, this.stencilOp.depthFail, this.stencilOp.depthPass)\n\n    }\n\n    use({ flipFaces = false } = {}) {\n        let textureUnit = -1;\n        const programActive = this.gl.renderer.state.currentProgram === this.id;\n\n        // Avoid gl call if program already in use\n        if (!programActive) {\n            this.gl.useProgram(this.program);\n            this.gl.renderer.state.currentProgram = this.id;\n        }\n\n        // Set only the active uniforms found in the shader\n        this.uniformLocations.forEach((location, activeUniform) => {\n            let uniform = this.uniforms[activeUniform.uniformName];\n\n            for (const component of activeUniform.nameComponents) {\n                if (!uniform) break;\n\n                if (component in uniform) {\n                    uniform = uniform[component];\n                } else if (Array.isArray(uniform.value)) {\n                    break;\n                } else {\n                    uniform = undefined;\n                    break;\n                }\n            }\n\n            if (!uniform) {\n                return warn(`Active uniform ${activeUniform.name} has not been supplied`);\n            }\n\n            if (uniform && uniform.value === undefined) {\n                return warn(`${activeUniform.name} uniform is missing a value parameter`);\n            }\n\n            if (uniform.value.texture) {\n                textureUnit = textureUnit + 1;\n\n                // Check if texture needs to be updated\n                uniform.value.update(textureUnit);\n                return setUniform(this.gl, activeUniform.type, location, textureUnit);\n            }\n\n            // For texture arrays, set uniform as an array of texture units instead of just one\n            if (uniform.value.length && 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 36306: // U_SAMPLER_2D\n        case 35680: // SAMPLER_CUBE\n        case 36289: // SAMPLER_2D_ARRAY\n            return value.length ? gl.uniform1iv(location, value) : gl.uniform1i(location, value); // SAMPLER_CUBE\n        case 35671: // BOOL_VEC2\n        case 35667:\n            return gl.uniform2iv(location, value); // INT_VEC2\n        case 35672: // BOOL_VEC3\n        case 35668:\n            return gl.uniform3iv(location, value); // INT_VEC3\n        case 35673: // BOOL_VEC4\n        case 35669:\n            return gl.uniform4iv(location, value); // INT_VEC4\n        case 35674:\n            return gl.uniformMatrix2fv(location, false, value); // FLOAT_MAT2\n        case 35675:\n            return gl.uniformMatrix3fv(location, false, value); // FLOAT_MAT3\n        case 35676:\n            return gl.uniformMatrix4fv(location, false, value); // FLOAT_MAT4\n    }\n}\n\nfunction addLineNumbers(string) {\n    let lines = string.split('\\n');\n    for (let i = 0; i < 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 = /* @__PURE__ */ new Vec3();\nlet ID = 1;\n\nexport class Renderer {\n    constructor({\n        canvas = document.createElement('canvas'),\n        width = 300,\n        height = 150,\n        dpr = 1,\n        alpha = false,\n        depth = true,\n        stencil = false,\n        antialias = false,\n        premultipliedAlpha = false,\n        preserveDrawingBuffer = false,\n        powerPreference = 'default',\n        autoClear = true,\n        webgl = 2,\n    } = {}) {\n        const attributes = { alpha, depth, stencil, antialias, premultipliedAlpha, preserveDrawingBuffer, powerPreference };\n        this.dpr = dpr;\n        this.alpha = alpha;\n        this.color = true;\n        this.depth = depth;\n        this.stencil = stencil;\n        this.premultipliedAlpha = premultipliedAlpha;\n        this.autoClear = autoClear;\n        this.id = ID++;\n\n        // Attempt WebGL2 unless forced to 1, if not supported fallback to WebGL1\n        if (webgl === 2) this.gl = canvas.getContext('webgl2', attributes);\n        this.isWebgl2 = !!this.gl;\n        if (!this.gl) this.gl = canvas.getContext('webgl', attributes);\n        if (!this.gl) console.error('unable to create webgl context');\n\n        // Attach renderer to gl so that all classes have access to internal state functions\n        this.gl.renderer = this;\n\n        // initialise size values\n        this.setSize(width, height);\n\n        // gl state stores to avoid redundant calls on methods used internally\n        this.state = {};\n        this.state.blendFunc = { src: this.gl.ONE, dst: this.gl.ZERO };\n        this.state.blendEquation = { modeRGB: this.gl.FUNC_ADD };\n        this.state.cullFace = false;\n        this.state.frontFace = this.gl.CCW;\n        this.state.depthMask = true;\n        this.state.depthFunc = this.gl.LEQUAL;\n        this.state.premultiplyAlpha = false;\n        this.state.flipY = false;\n        this.state.unpackAlignment = 4;\n        this.state.framebuffer = null;\n        this.state.viewport = { x: 0, y: 0, width: null, height: null };\n        this.state.textureUnits = [];\n        this.state.activeTextureUnit = 0;\n        this.state.boundBuffer = null;\n        this.state.uniformLocations = new Map();\n        this.state.currentProgram = null;\n\n        // store requested extensions\n        this.extensions = {};\n\n        // Initialise extra format types\n        if (this.isWebgl2) {\n            this.getExtension('EXT_color_buffer_float');\n            this.getExtension('OES_texture_float_linear');\n        } else {\n            this.getExtension('OES_texture_float');\n            this.getExtension('OES_texture_float_linear');\n            this.getExtension('OES_texture_half_float');\n            this.getExtension('OES_texture_half_float_linear');\n            this.getExtension('OES_element_index_uint');\n            this.getExtension('OES_standard_derivatives');\n            this.getExtension('EXT_sRGB');\n            this.getExtension('WEBGL_depth_texture');\n            this.getExtension('WEBGL_draw_buffers');\n        }\n        this.getExtension('WEBGL_compressed_texture_astc');\n        this.getExtension('EXT_texture_compression_bptc');\n        this.getExtension('WEBGL_compressed_texture_s3tc');\n        this.getExtension('WEBGL_compressed_texture_etc1');\n        this.getExtension('WEBGL_compressed_texture_pvrtc');\n        this.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');\n\n        // Create method aliases using extension (WebGL1) or native if available (WebGL2)\n        this.vertexAttribDivisor = this.getExtension('ANGLE_instanced_arrays', 'vertexAttribDivisor', 'vertexAttribDivisorANGLE');\n        this.drawArraysInstanced = this.getExtension('ANGLE_instanced_arrays', 'drawArraysInstanced', 'drawArraysInstancedANGLE');\n        this.drawElementsInstanced = this.getExtension('ANGLE_instanced_arrays', 'drawElementsInstanced', 'drawElementsInstancedANGLE');\n        this.createVertexArray = this.getExtension('OES_vertex_array_object', 'createVertexArray', 'createVertexArrayOES');\n        this.bindVertexArray = this.getExtension('OES_vertex_array_object', 'bindVertexArray', 'bindVertexArrayOES');\n        this.deleteVertexArray = this.getExtension('OES_vertex_array_object', 'deleteVertexArray', 'deleteVertexArrayOES');\n        this.drawBuffers = this.getExtension('WEBGL_draw_buffers', 'drawBuffers', 'drawBuffersWEBGL');\n\n        // Store device parameters\n        this.parameters = {};\n        this.parameters.maxTextureUnits = this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);\n        this.parameters.maxAnisotropy = this.getExtension('EXT_texture_filter_anisotropic')\n            ? this.gl.getParameter(this.getExtension('EXT_texture_filter_anisotropic').MAX_TEXTURE_MAX_ANISOTROPY_EXT)\n            : 0;\n    }\n\n    setSize(width, height) {\n        this.width = width;\n        this.height = height;\n\n        this.gl.canvas.width = width * this.dpr;\n        this.gl.canvas.height = height * this.dpr;\n\n        if (!this.gl.canvas.style) return;\n        Object.assign(this.gl.canvas.style, {\n            width: width + 'px',\n            height: height + 'px',\n        });\n    }\n\n    setViewport(width, height, x = 0, y = 0) {\n        if (this.state.viewport.width === width && 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    setStencilMask(value) {\n        if(this.state.stencilMask === value) return;\n        this.state.stencilMask = value;\n        this.gl.stencilMask(value)\n    }\n\n    setStencilFunc(func, ref, mask) {\n\n        if((this.state.stencilFunc === func) &&\n            (this.state.stencilRef === ref) &&\n            (this.state.stencilFuncMask === mask)\n        ) return;\n\n        this.state.stencilFunc = func || this.gl.ALWAYS;\n        this.state.stencilRef = ref || 0;\n        this.state.stencilFuncMask = mask || 0;\n\n        this.gl.stencilFunc(func || this.gl.ALWAYS, ref || 0, mask || 0);\n    }\n\n    setStencilOp(stencilFail, depthFail, depthPass) {\n\n        if(this.state.stencilFail === stencilFail &&\n            this.state.stencilDepthFail === depthFail &&\n            this.state.stencilDepthPass === depthPass\n        ) return;\n\n        this.state.stencilFail = stencilFail;\n        this.state.stencilDepthFail = depthFail;\n        this.state.stencilDepthPass = depthPass;\n        \n        this.gl.stencilOp(stencilFail, depthFail, depthPass);\n        \n    }\n\n    activeTexture(value) {\n        if (this.state.activeTextureUnit === value) return;\n        this.state.activeTextureUnit = value;\n        this.gl.activeTexture(this.gl.TEXTURE0 + value);\n    }\n\n    bindFramebuffer({ target = this.gl.FRAMEBUFFER, buffer = null } = {}) {\n        if (this.state.framebuffer === buffer) return;\n        this.state.framebuffer = buffer;\n        this.gl.bindFramebuffer(target, buffer);\n    }\n\n    getExtension(extension, webgl2Func, extFunc) {\n        // if webgl2 function supported, return func bound to gl context\n        if (webgl2Func && 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\n            // Same for stencil\n            if(this.stencil || (!target || target.stencil)) {\n                this.enable(this.gl.STENCIL_TEST);\n                this.setStencilMask(0xff)\n            }\n\n            this.gl.clear(\n                (this.color ? this.gl.COLOR_BUFFER_BIT : 0) |\n                    (this.depth ? this.gl.DEPTH_BUFFER_BIT : 0) |\n                    (this.stencil ? this.gl.STENCIL_BUFFER_BIT : 0)\n            );\n        }\n\n        // updates all scene graph matrices\n        if (update) scene.updateMatrixWorld();\n\n        // Update camera separately, in case not in scene graph\n        if (camera) camera.updateMatrixWorld();\n\n        // Get render list - entails culling and sorting\n        const renderList = this.getRenderList({ scene, camera, frustumCull, sort });\n\n        renderList.forEach((node) => {\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\n        // Keep reference to proxy target to avoid triggering onChange internally\n        this._target = this;\n\n        // Return a proxy to trigger onChange when array elements are edited directly\n        const triggerProps = ['0', '1', '2', '3'];\n        return new Proxy(this, {\n            set(target, property) {\n                const success = Reflect.set(...arguments);\n                if (success && triggerProps.includes(property)) target.onChange();\n                return success;\n            },\n        });\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    get w() {\n        return this[3];\n    }\n\n    set x(v) {\n        this._target[0] = v;\n        this.onChange();\n    }\n\n    set y(v) {\n        this._target[1] = v;\n        this.onChange();\n    }\n\n    set z(v) {\n        this._target[2] = v;\n        this.onChange();\n    }\n\n    set w(v) {\n        this._target[3] = v;\n        this.onChange();\n    }\n\n    identity() {\n        QuatFunc.identity(this._target);\n        this.onChange();\n        return this;\n    }\n\n    set(x, y, z, w) {\n        if (x.length) return this.copy(x);\n        QuatFunc.set(this._target, x, y, z, w);\n        this.onChange();\n        return this;\n    }\n\n    rotateX(a) {\n        QuatFunc.rotateX(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    rotateY(a) {\n        QuatFunc.rotateY(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    rotateZ(a) {\n        QuatFunc.rotateZ(this._target, this._target, a);\n        this.onChange();\n        return this;\n    }\n\n    inverse(q = this._target) {\n        QuatFunc.invert(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    conjugate(q = this._target) {\n        QuatFunc.conjugate(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    copy(q) {\n        QuatFunc.copy(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    normalize(q = this._target) {\n        QuatFunc.normalize(this._target, q);\n        this.onChange();\n        return this;\n    }\n\n    multiply(qA, qB) {\n        if (qB) {\n            QuatFunc.multiply(this._target, qA, qB);\n        } else {\n            QuatFunc.multiply(this._target, this._target, qA);\n        }\n        this.onChange();\n        return this;\n    }\n\n    dot(v) {\n        return QuatFunc.dot(this._target, v);\n    }\n\n    fromMatrix3(matrix3) {\n        QuatFunc.fromMat3(this._target, matrix3);\n        this.onChange();\n        return this;\n    }\n\n    fromEuler(euler, isInternal) {\n        QuatFunc.fromEuler(this._target, euler, euler.order);\n        // Avoid infinite recursion\n        if (!isInternal) this.onChange();\n        return this;\n    }\n\n    fromAxisAngle(axis, a) {\n        QuatFunc.setAxisAngle(this._target, axis, a);\n        this.onChange();\n        return this;\n    }\n\n    slerp(q, t) {\n        QuatFunc.slerp(this._target, this._target, q, t);\n        this.onChange();\n        return this;\n    }\n\n    fromArray(a, o = 0) {\n        this._target[0] = a[o];\n        this._target[1] = a[o + 1];\n        this._target[2] = a[o + 2];\n        this._target[3] = a[o + 3];\n        this.onChange();\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        a[o + 3] = this[3];\n        return a;\n    }\n}\n","import * as vec3 from './Vec3Func.js';\n\nconst EPSILON = 0.000001;\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function copy(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n}\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function identity(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function transpose(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        let a01 = a[1],\n            a02 = a[2],\n            a03 = a[3];\n        let a12 = a[6],\n            a13 = a[7];\n        let a23 = a[11];\n\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n\n    return out;\n}\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nexport function invert(out, a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    let b00 = a00 * a11 - a01 * a10;\n    let b01 = a00 * a12 - a02 * a10;\n    let b02 = a00 * a13 - a03 * a10;\n    let b03 = a01 * a12 - a02 * a11;\n    let b04 = a01 * a13 - a03 * a11;\n    let b05 = a02 * a13 - a03 * a12;\n    let b06 = a20 * a31 - a21 * a30;\n    let b07 = a20 * a32 - a22 * a30;\n    let b08 = a20 * a33 - a23 * a30;\n    let b09 = a21 * a32 - a22 * a31;\n    let b10 = a21 * a33 - a23 * a31;\n    let b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n}\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    let b00 = a00 * a11 - a01 * a10;\n    let b01 = a00 * a12 - a02 * a10;\n    let b02 = a00 * a13 - a03 * a10;\n    let b03 = a01 * a12 - a02 * a11;\n    let b04 = a01 * a13 - a03 * a11;\n    let b05 = a02 * a13 - a03 * a12;\n    let b06 = a20 * a31 - a21 * a30;\n    let b07 = a20 * a32 - a22 * a30;\n    let b08 = a20 * a33 - a23 * a30;\n    let b09 = a21 * a32 - a22 * a31;\n    let b10 = a21 * a33 - a23 * a31;\n    let b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n}\n\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function multiply(out, a, b) {\n    let a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3];\n    let a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n    let a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n    let a30 = a[12],\n        a31 = a[13],\n        a32 = a[14],\n        a33 = a[15];\n\n    // Cache only the current line of the second matrix\n    let b0 = b[0],\n        b1 = b[1],\n        b2 = b[2],\n        b3 = b[3];\n    out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[4];\n    b1 = b[5];\n    b2 = b[6];\n    b3 = b[7];\n    out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[8];\n    b1 = b[9];\n    b2 = b[10];\n    b3 = b[11];\n    out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n\n    b0 = b[12];\n    b1 = b[13];\n    b2 = b[14];\n    b3 = b[15];\n    out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n    out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n    out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n    out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n    return out;\n}\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nexport function translate(out, a, v) {\n    let x = v[0],\n        y = v[1],\n        z = v[2];\n    let a00, a01, a02, a03;\n    let a10, a11, a12, a13;\n    let a20, a21, a22, a23;\n\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0];\n        a01 = a[1];\n        a02 = a[2];\n        a03 = a[3];\n        a10 = a[4];\n        a11 = a[5];\n        a12 = a[6];\n        a13 = a[7];\n        a20 = a[8];\n        a21 = a[9];\n        a22 = a[10];\n        a23 = a[11];\n\n        out[0] = a00;\n        out[1] = a01;\n        out[2] = a02;\n        out[3] = a03;\n        out[4] = a10;\n        out[5] = a11;\n        out[6] = a12;\n        out[7] = a13;\n        out[8] = a20;\n        out[9] = a21;\n        out[10] = a22;\n        out[11] = a23;\n\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n}\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nexport function scale(out, a, v) {\n    let x = v[0],\n        y = v[1],\n        z = v[2];\n\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n}\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function rotate(out, a, rad, axis) {\n    let x = axis[0],\n        y = axis[1],\n        z = axis[2];\n    let len = Math.hypot(x, y, z);\n    let s, c, t;\n    let a00, a01, a02, a03;\n    let a10, a11, a12, a13;\n    let a20, a21, a22, a23;\n    let b00, b01, b02;\n    let b10, b11, b12;\n    let b20, b21, b22;\n\n    if (Math.abs(len) < EPSILON) {\n        return null;\n    }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    a00 = a[0];\n    a01 = a[1];\n    a02 = a[2];\n    a03 = a[3];\n    a10 = a[4];\n    a11 = a[5];\n    a12 = a[6];\n    a13 = a[7];\n    a20 = a[8];\n    a21 = a[9];\n    a22 = a[10];\n    a23 = a[11];\n\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c;\n    b01 = y * x * t + z * s;\n    b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s;\n    b11 = y * y * t + c;\n    b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s;\n    b21 = y * z * t - x * s;\n    b22 = z * z * t + c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n    if (a !== out) {\n        // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n}\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getTranslation(out, mat) {\n    out[0] = mat[12];\n    out[1] = mat[13];\n    out[2] = mat[14];\n\n    return out;\n}\n\n/**\n * Returns the scaling factor component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslationScale\n *  with a normalized Quaternion paramter, the returned vector will be\n *  the same as the scaling vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive scaling factor component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getScaling(out, mat) {\n    let m11 = mat[0];\n    let m12 = mat[1];\n    let m13 = mat[2];\n    let m21 = mat[4];\n    let m22 = mat[5];\n    let m23 = mat[6];\n    let m31 = mat[8];\n    let m32 = mat[9];\n    let m33 = mat[10];\n\n    out[0] = Math.hypot(m11, m12, m13);\n    out[1] = Math.hypot(m21, m22, m23);\n    out[2] = Math.hypot(m31, m32, m33);\n\n    return out;\n}\n\nexport function getMaxScaleOnAxis(mat) {\n    let m11 = mat[0];\n    let m12 = mat[1];\n    let m13 = mat[2];\n    let m21 = mat[4];\n    let m22 = mat[5];\n    let m23 = mat[6];\n    let m31 = mat[8];\n    let m32 = mat[9];\n    let m33 = mat[10];\n\n    const x = m11 * m11 + m12 * m12 + m13 * m13;\n    const y = m21 * m21 + m22 * m22 + m23 * m23;\n    const z = m31 * m31 + m32 * m32 + m33 * m33;\n\n    return Math.sqrt(Math.max(x, y, z));\n}\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nexport const getRotation = (function () {\n    const temp = [1, 1, 1];\n\n    return function (out, mat) {\n        let scaling = temp;\n        getScaling(scaling, mat);\n\n        let is1 = 1 / scaling[0];\n        let is2 = 1 / scaling[1];\n        let is3 = 1 / scaling[2];\n\n        let sm11 = mat[0] * is1;\n        let sm12 = mat[1] * is2;\n        let sm13 = mat[2] * is3;\n        let sm21 = mat[4] * is1;\n        let sm22 = mat[5] * is2;\n        let sm23 = mat[6] * is3;\n        let sm31 = mat[8] * is1;\n        let sm32 = mat[9] * is2;\n        let sm33 = mat[10] * is3;\n\n        let trace = sm11 + sm22 + sm33;\n        let S = 0;\n\n        if (trace > 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 * From glTF-Transform\n * https://github.com/donmccurdy/glTF-Transform/blob/main/packages/core/src/utils/math-utils.ts\n *\n * Decompose a mat4 to TRS properties.\n *\n * Equivalent to the Matrix4 decompose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param {mat4} srcMat Matrix element, to be decomposed to TRS properties.\n * @param {quat4} dstRotation Rotation element, to be overwritten.\n * @param {vec3} dstTranslation Translation element, to be overwritten.\n * @param {vec3} dstScale Scale element, to be overwritten\n */\nexport function decompose(srcMat, dstRotation, dstTranslation, dstScale) {\n    let sx = vec3.length([srcMat[0], srcMat[1], srcMat[2]]);\n    const sy = vec3.length([srcMat[4], srcMat[5], srcMat[6]]);\n    const sz = vec3.length([srcMat[8], srcMat[9], srcMat[10]]);\n\n    // if determine is negative, we need to invert one scale\n    const det = determinant(srcMat);\n    if (det < 0) sx = -sx;\n\n    dstTranslation[0] = srcMat[12];\n    dstTranslation[1] = srcMat[13];\n    dstTranslation[2] = srcMat[14];\n\n    // scale the rotation part\n    const _m1 = srcMat.slice();\n\n    const invSX = 1 / sx;\n    const invSY = 1 / sy;\n    const invSZ = 1 / sz;\n\n    _m1[0] *= invSX;\n    _m1[1] *= invSX;\n    _m1[2] *= invSX;\n\n    _m1[4] *= invSY;\n    _m1[5] *= invSY;\n    _m1[6] *= invSY;\n\n    _m1[8] *= invSZ;\n    _m1[9] *= invSZ;\n    _m1[10] *= invSZ;\n\n    getRotation(dstRotation, _m1);\n\n    dstScale[0] = sx;\n    dstScale[1] = sy;\n    dstScale[2] = sz;\n}\n\n/**\n * From glTF-Transform\n * https://github.com/donmccurdy/glTF-Transform/blob/main/packages/core/src/utils/math-utils.ts\n *\n * Compose TRS properties to a mat4.\n *\n * Equivalent to the Matrix4 compose() method in three.js, and intentionally not using the\n * gl-matrix version. See: https://github.com/toji/gl-matrix/issues/408\n *\n * @param {mat4} dstMat Matrix element, to be modified and returned.\n * @param {quat4} srcRotation Rotation element of matrix.\n * @param {vec3} srcTranslation Translation element of matrix.\n * @param {vec3} srcScale Scale element of matrix.\n * @returns {mat4} dstMat, overwritten to mat4 equivalent of given TRS properties.\n */\nexport function compose(dstMat, srcRotation, srcTranslation, srcScale) {\n    const te = dstMat;\n\n    const x = srcRotation[0],\n        y = srcRotation[1],\n        z = srcRotation[2],\n        w = srcRotation[3];\n    const x2 = x + x,\n        y2 = y + y,\n        z2 = z + z;\n    const xx = x * x2,\n        xy = x * y2,\n        xz = x * z2;\n    const yy = y * y2,\n        yz = y * z2,\n        zz = z * z2;\n    const wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    const sx = srcScale[0],\n        sy = srcScale[1],\n        sz = srcScale[2];\n\n    te[0] = (1 - (yy + zz)) * sx;\n    te[1] = (xy + wz) * sx;\n    te[2] = (xz - wy) * sx;\n    te[3] = 0;\n\n    te[4] = (xy - wz) * sy;\n    te[5] = (1 - (xx + zz)) * sy;\n    te[6] = (yz + wx) * sy;\n    te[7] = 0;\n\n    te[8] = (xz + wy) * sz;\n    te[9] = (yz - wx) * sz;\n    te[10] = (1 - (xx + yy)) * sz;\n    te[11] = 0;\n\n    te[12] = srcTranslation[0];\n    te[13] = srcTranslation[1];\n    te[14] = srcTranslation[2];\n    te[15] = 1;\n\n    return te;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     let quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScale(out, q, v, s) {\n    // Quaternion math\n    let x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n    let x2 = x + x;\n    let y2 = y + y;\n    let z2 = z + z;\n\n    let xx = x * x2;\n    let xy = x * y2;\n    let xz = x * z2;\n    let yy = y * y2;\n    let yz = y * z2;\n    let zz = z * z2;\n    let wx = w * x2;\n    let wy = w * y2;\n    let wz = w * z2;\n    let sx = s[0];\n    let sy = s[1];\n    let sz = s[2];\n\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n}\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nexport function fromQuat(out, q) {\n    let x = q[0],\n        y = q[1],\n        z = q[2],\n        w = q[3];\n    let x2 = x + x;\n    let y2 = y + y;\n    let z2 = z + z;\n\n    let xx = x * x2;\n    let yx = y * x2;\n    let yy = y * y2;\n    let zx = z * x2;\n    let zy = z * y2;\n    let zz = z * z2;\n    let wx = w * x2;\n    let wy = w * y2;\n    let wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n\n    return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function perspective(out, fovy, aspect, near, far) {\n    let f = 1.0 / Math.tan(fovy / 2);\n    let nf = 1 / (near - far);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 2 * far * near * nf;\n    out[15] = 0;\n    return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function ortho(out, left, right, bottom, top, near, far) {\n    let lr = 1 / (left - right);\n    let bt = 1 / (bottom - top);\n    let nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} target Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function targetTo(out, eye, target, up) {\n    let eyex = eye[0],\n        eyey = eye[1],\n        eyez = eye[2],\n        upx = up[0],\n        upy = up[1],\n        upz = up[2];\n\n    let z0 = eyex - target[0],\n        z1 = eyey - target[1],\n        z2 = eyez - target[2];\n\n    let len = z0 * z0 + z1 * z1 + z2 * z2;\n    if (len === 0) {\n        // eye and target are in the same position\n        z2 = 1;\n    } else {\n        len = 1 / Math.sqrt(len);\n        z0 *= len;\n        z1 *= len;\n        z2 *= len;\n    }\n\n    let x0 = upy * z2 - upz * z1,\n        x1 = upz * z0 - upx * z2,\n        x2 = upx * z1 - upy * z0;\n\n    len = x0 * x0 + x1 * x1 + x2 * x2;\n    if (len === 0) {\n        // up and z are parallel\n        if (upz) {\n            upx += 1e-6;\n        } else if (upy) {\n            upz += 1e-6;\n        } else {\n            upy += 1e-6;\n        }\n        (x0 = upy * z2 - upz * z1), (x1 = upz * z0 - upx * z2), (x2 = upx * z1 - upy * z0);\n\n        len = x0 * x0 + x1 * x1 + x2 * x2;\n    }\n\n    len = 1 / Math.sqrt(len);\n    x0 *= len;\n    x1 *= len;\n    x2 *= len;\n\n    out[0] = x0;\n    out[1] = x1;\n    out[2] = x2;\n    out[3] = 0;\n    out[4] = z1 * x2 - z2 * x1;\n    out[5] = z2 * x0 - z0 * x2;\n    out[6] = z0 * x1 - z1 * x0;\n    out[7] = 0;\n    out[8] = z0;\n    out[9] = z1;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = eyex;\n    out[13] = eyey;\n    out[14] = eyez;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function add(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nexport function subtract(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nexport function multiplyScalar(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n}\n","import * as Mat4Func from './functions/Mat4Func.js';\n\nexport class Mat4 extends Array {\n    constructor(\n        m00 = 1,\n        m01 = 0,\n        m02 = 0,\n        m03 = 0,\n        m10 = 0,\n        m11 = 1,\n        m12 = 0,\n        m13 = 0,\n        m20 = 0,\n        m21 = 0,\n        m22 = 1,\n        m23 = 0,\n        m30 = 0,\n        m31 = 0,\n        m32 = 0,\n        m33 = 1\n    ) {\n        super(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33);\n        return this;\n    }\n\n    get x() {\n        return this[12];\n    }\n\n    get y() {\n        return this[13];\n    }\n\n    get z() {\n        return this[14];\n    }\n\n    get w() {\n        return this[15];\n    }\n\n    set x(v) {\n        this[12] = v;\n    }\n\n    set y(v) {\n        this[13] = v;\n    }\n\n    set z(v) {\n        this[14] = v;\n    }\n\n    set w(v) {\n        this[15] = v;\n    }\n\n    set(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n        if (m00.length) return this.copy(m00);\n        Mat4Func.set(this, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33);\n        return this;\n    }\n\n    translate(v, m = this) {\n        Mat4Func.translate(this, m, v);\n        return this;\n    }\n\n    rotate(v, axis, m = this) {\n        Mat4Func.rotate(this, m, v, axis);\n        return this;\n    }\n\n    scale(v, m = this) {\n        Mat4Func.scale(this, m, typeof v === 'number' ? [v, v, v] : v);\n        return this;\n    }\n\n    add(ma, mb) {\n        if (mb) Mat4Func.add(this, ma, mb);\n        else Mat4Func.add(this, this, ma);\n        return this;\n    }\n\n    sub(ma, mb) {\n        if (mb) Mat4Func.subtract(this, ma, mb);\n        else Mat4Func.subtract(this, this, ma);\n        return this;\n    }\n\n    multiply(ma, mb) {\n        if (!ma.length) {\n            Mat4Func.multiplyScalar(this, this, ma);\n        } else if (mb) {\n            Mat4Func.multiply(this, ma, mb);\n        } else {\n            Mat4Func.multiply(this, this, ma);\n        }\n        return this;\n    }\n\n    identity() {\n        Mat4Func.identity(this);\n        return this;\n    }\n\n    copy(m) {\n        Mat4Func.copy(this, m);\n        return this;\n    }\n\n    fromPerspective({ fov, aspect, near, far } = {}) {\n        Mat4Func.perspective(this, fov, aspect, near, far);\n        return this;\n    }\n\n    fromOrthogonal({ left, right, bottom, top, near, far }) {\n        Mat4Func.ortho(this, left, right, bottom, top, near, far);\n        return this;\n    }\n\n    fromQuaternion(q) {\n        Mat4Func.fromQuat(this, q);\n        return this;\n    }\n\n    setPosition(v) {\n        this.x = v[0];\n        this.y = v[1];\n        this.z = v[2];\n        return this;\n    }\n\n    inverse(m = this) {\n        Mat4Func.invert(this, m);\n        return this;\n    }\n\n    compose(q, pos, scale) {\n        Mat4Func.compose(this, q, pos, scale);\n        return this;\n    }\n\n    decompose(q, pos, scale) {\n        Mat4Func.decompose(this, q, pos, scale);\n        return this;\n    }\n\n    getRotation(q) {\n        Mat4Func.getRotation(q, this);\n        return this;\n    }\n\n    getTranslation(pos) {\n        Mat4Func.getTranslation(pos, this);\n        return this;\n    }\n\n    getScaling(scale) {\n        Mat4Func.getScaling(scale, this);\n        return this;\n    }\n\n    getMaxScaleOnAxis() {\n        return Mat4Func.getMaxScaleOnAxis(this);\n    }\n\n    lookAt(eye, target, up) {\n        Mat4Func.targetTo(this, eye, target, up);\n        return this;\n    }\n\n    determinant() {\n        return Mat4Func.determinant(this);\n    }\n\n    fromArray(a, o = 0) {\n        this[0] = a[o];\n        this[1] = a[o + 1];\n        this[2] = a[o + 2];\n        this[3] = a[o + 3];\n        this[4] = a[o + 4];\n        this[5] = a[o + 5];\n        this[6] = a[o + 6];\n        this[7] = a[o + 7];\n        this[8] = a[o + 8];\n        this[9] = a[o + 9];\n        this[10] = a[o + 10];\n        this[11] = a[o + 11];\n        this[12] = a[o + 12];\n        this[13] = a[o + 13];\n        this[14] = a[o + 14];\n        this[15] = a[o + 15];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        a[o + 3] = this[3];\n        a[o + 4] = this[4];\n        a[o + 5] = this[5];\n        a[o + 6] = this[6];\n        a[o + 7] = this[7];\n        a[o + 8] = this[8];\n        a[o + 9] = this[9];\n        a[o + 10] = this[10];\n        a[o + 11] = this[11];\n        a[o + 12] = this[12];\n        a[o + 13] = this[13];\n        a[o + 14] = this[14];\n        a[o + 15] = this[15];\n        return a;\n    }\n}\n","// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\nexport function fromRotationMatrix(out, m, order = 'YXZ') {\n    if (order === 'XYZ') {\n        out[1] = Math.asin(Math.min(Math.max(m[8], -1), 1));\n        if (Math.abs(m[8]) < 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 * as EulerFunc from './functions/EulerFunc.js';\nimport { Mat4 } from './Mat4.js';\n\nconst tmpMat4 = /* @__PURE__ */ new Mat4();\n\nexport class Euler extends Array {\n    constructor(x = 0, y = x, z = x, order = 'YXZ') {\n        super(x, y, z);\n        this.order = order;\n        this.onChange = () => {};\n\n        // Keep reference to proxy target to avoid triggering onChange internally\n        this._target = this;\n\n        // Return a proxy to trigger onChange when array elements are edited directly\n        const triggerProps = ['0', '1', '2'];\n        return new Proxy(this, {\n            set(target, property) {\n                const success = Reflect.set(...arguments);\n                if (success && triggerProps.includes(property)) target.onChange();\n                return success;\n            },\n        });\n    }\n\n    get x() {\n        return this[0];\n    }\n\n    get y() {\n        return this[1];\n    }\n\n    get z() {\n        return this[2];\n    }\n\n    set x(v) {\n        this._target[0] = v;\n        this.onChange();\n    }\n\n    set y(v) {\n        this._target[1] = v;\n        this.onChange();\n    }\n\n    set z(v) {\n        this._target[2] = v;\n        this.onChange();\n    }\n\n    set(x, y = x, z = x) {\n        if (x.length) return this.copy(x);\n        this._target[0] = x;\n        this._target[1] = y;\n        this._target[2] = z;\n        this.onChange();\n        return this;\n    }\n\n    copy(v) {\n        this._target[0] = v[0];\n        this._target[1] = v[1];\n        this._target[2] = v[2];\n        this.onChange();\n        return this;\n    }\n\n    reorder(order) {\n        this._target.order = order;\n        this.onChange();\n        return this;\n    }\n\n    fromRotationMatrix(m, order = this.order) {\n        EulerFunc.fromRotationMatrix(this._target, m, order);\n        this.onChange();\n        return this;\n    }\n\n    fromQuaternion(q, order = this.order, isInternal) {\n        tmpMat4.fromQuaternion(q);\n        this._target.fromRotationMatrix(tmpMat4, order);\n        // Avoid infinite recursion\n        if (!isInternal) this.onChange();\n        return this;\n    }\n\n    fromArray(a, o = 0) {\n        this._target[0] = a[o];\n        this._target[1] = a[o + 1];\n        this._target[2] = a[o + 2];\n        return this;\n    }\n\n    toArray(a = [], o = 0) {\n        a[o] = this[0];\n        a[o + 1] = this[1];\n        a[o + 2] = this[2];\n        return a;\n    }\n}\n","import { Vec3 } from '../math/Vec3.js';\nimport { Quat } from '../math/Quat.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Euler } from '../math/Euler.js';\n\nexport class Transform {\n    constructor() {\n        this.parent = null;\n        this.children = [];\n        this.visible = true;\n\n        this.matrix = new Mat4();\n        this.worldMatrix = new Mat4();\n        this.matrixAutoUpdate = true;\n        this.worldMatrixNeedsUpdate = false;\n\n        this.position = new Vec3();\n        this.quaternion = new Quat();\n        this.scale = new Vec3(1);\n        this.rotation = new Euler();\n        this.up = new Vec3(0, 1, 0);\n\n        this.rotation._target.onChange = () => this.quaternion.fromEuler(this.rotation, true);\n        this.quaternion._target.onChange = () => this.rotation.fromQuaternion(this.quaternion, undefined, true);\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.decompose(this.quaternion._target, this.position, this.scale);\n        this.rotation.fromQuaternion(this.quaternion);\n    }\n\n    lookAt(target, invert = false) {\n        if (invert) this.matrix.lookAt(this.position, target, this.up);\n        else this.matrix.lookAt(target, this.position, this.up);\n        this.matrix.getRotation(this.quaternion._target);\n        this.rotation.fromQuaternion(this.quaternion);\n    }\n}\n","import { Transform } from './Transform.js';\nimport { Mat4 } from '../math/Mat4.js';\nimport { Vec3 } from '../math/Vec3.js';\n\nconst tempMat4 = /* @__PURE__ */ new Mat4();\nconst tempVec3a = /* @__PURE__ */ new Vec3();\nconst tempVec3b = /* @__PURE__ */ new Vec3();\n\nexport class Camera extends Transform {\n    constructor(gl, { near = 0.1, far = 100, fov = 45, aspect = 1, left, right, bottom, top, zoom = 1 } = {}) {\n        super();\n\n        Object.assign(this, { near, far, fov, aspect, left, right, bottom, top, zoom });\n\n        this.projectionMatrix = new Mat4();\n        this.viewMatrix = new Mat4();\n        this.projectionViewMatrix = new Mat4();\n        this.worldPosition = new Vec3();\n\n        // Use orthographic if left/right set, else default to perspective camera\n        this.type = left || right ? 'orthographic' : 'perspective';\n\n        if (this.type === 'orthographic') this.orthographic();\n        else this.perspective();\n    }\n\n    perspective({ near = this.near, far = this.far, fov = this.fov, aspect = this.aspect } = {}) {\n        Object.assign(this, { near, far, fov, aspect });\n        this.projectionMatrix.fromPerspective({ fov: fov * (Math.PI / 180), aspect, near, far });\n        this.type = 'perspective';\n        return this;\n    }\n\n    orthographic({\n        near = this.near,\n        far = this.far,\n        left = this.left || -1,\n        right = this.right || 1,\n        bottom = this.bottom || -1,\n        top = this.top || 1,\n        zoom = this.zoom,\n    } = {}) {\n        Object.assign(this, { near, far, left, right, bottom, top, zoom });\n        left /= zoom;\n        right /= zoom;\n        bottom /= zoom;\n        top /= zoom;\n        this.projectionMatrix.fromOrthogonal({ left, right, bottom, top, near, far });\n        this.type = 'orthographic';\n        return this;\n    }\n\n    updateMatrixWorld() {\n        super.updateMatrixWorld();\n        this.viewMatrix.inverse(this.worldMatrix);\n        this.worldMatrix.getTranslation(this.worldPosition);\n\n        // used for sorting\n        this.projectionViewMatrix.multiply(this.projectionMatrix, this.viewMatrix);\n        return this;\n    }\n\n    updateProjectionMatrix() {\n        if (this.type === 'perspective') {\n            return this.perspective();\n        } else {\n            return this.orthographic();\n        }\n    }\n\n    lookAt(target) {\n        super.lookAt(target, true);\n        return this;\n    }\n\n    // Project 3D coordinate to 2D point\n    project(v) {\n        v.applyMatrix4(this.viewMatrix);\n        v.applyMatrix4(this.projectionMatrix);\n        return this;\n    }\n\n    // Unproject 2D point to 3D coordinate\n    unproject(v) {\n        v.applyMatrix4(tempMat4.inverse(this.projectionMatrix));\n        v.applyMatrix4(this.worldMatrix);\n        return this;\n    }\n\n    updateFrustum() {\n        if (!this.frustum) {\n            this.frustum = [new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3(), new Vec3()];\n        }\n\n        const m = this.projectionViewMatrix;\n        this.frustum[0].set(m[3] - m[0], m[7] - m[4], m[11] - m[8]).constant = m[15] - m[12]; // -x\n        this.frustum[1].set(m[3] + m[0], m[7] + m[4], m[11] + m[8]).constant = m[15] + m[12]; // +x\n        this.frustum[2].set(m[3] + m[1], m[7] + m[5], m[11] + m[9]).constant = m[15] + m[13]; // +y\n        this.frustum[3].set(m[3] - m[1], m[7] - m[5], m[11] - m[9]).constant = m[15] - m[13]; // -y\n        this.frustum[4].set(m[3] - m[2], m[7] - m[6], m[11] - m[10]).constant = m[15] - m[14]; // +z (far)\n        this.frustum[5].set(m[3] + m[2], m[7] + m[6], m[11] + m[10]).constant = m[15] + m[14]; // -z (near)\n\n        for (let i = 0; i < 6; i++) {\n            const invLen = 1.0 / this.frustum[i].distance();\n            this.frustum[i].multiply(invLen);\n            this.frustum[i].constant *= invLen;\n        }\n    }\n\n    frustumIntersectsMesh(node, worldMatrix = node.worldMatrix) {\n        // If no position attribute, treat as frustumCulled false\n        if (!node.geometry.attributes.position) return true;\n\n        if (!node.geometry.bounds || node.geometry.bounds.radius === Infinity) node.geometry.computeBoundingSphere();\n\n        if (!node.geometry.bounds) return true;\n\n        const center = tempVec3a;\n        center.copy(node.geometry.bounds.center);\n        center.applyMatrix4(worldMatrix);\n\n        const radius = node.geometry.bounds.radius * worldMatrix.getMaxScaleOnAxis();\n\n        return this.frustumIntersectsSphere(center, radius);\n    }\n\n    frustumIntersectsSphere(center, radius) {\n        const normal = tempVec3b;\n\n        for (let i = 0; i < 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        if (camera) {\n            // Add empty matrix uniforms to program if unset\n            if (!this.program.uniforms.modelMatrix) {\n                Object.assign(this.program.uniforms, {\n                    modelMatrix: { value: null },\n                    viewMatrix: { value: null },\n                    modelViewMatrix: { value: null },\n                    normalMatrix: { value: null },\n                    projectionMatrix: { value: null },\n                    cameraPosition: { value: null },\n                });\n            }\n\n            // Set the matrix uniforms\n            this.program.uniforms.projectionMatrix.value = camera.projectionMatrix;\n            this.program.uniforms.cameraPosition.value = camera.worldPosition;\n            this.program.uniforms.viewMatrix.value = camera.viewMatrix;\n            this.modelViewMatrix.multiply(camera.viewMatrix, this.worldMatrix);\n            this.normalMatrix.getNormalMatrix(this.modelViewMatrix);\n            this.program.uniforms.modelMatrix.value = this.worldMatrix;\n            this.program.uniforms.modelViewMatrix.value = this.modelViewMatrix;\n            this.program.uniforms.normalMatrix.value = this.normalMatrix;\n        }\n        this.beforeRenderCallbacks.forEach((f) => f && f({ mesh: this, camera }));\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            wrapR = gl.CLAMP_TO_EDGE,\n            generateMipmaps = target === (gl.TEXTURE_2D || gl.TEXTURE_CUBE_MAP),\n            minFilter = generateMipmaps ? gl.NEAREST_MIPMAP_LINEAR : gl.LINEAR,\n            magFilter = gl.LINEAR,\n            premultiplyAlpha = false,\n            unpackAlignment = 4,\n            flipY = target == (gl.TEXTURE_2D || gl.TEXTURE_3D) ? true : false,\n            anisotropy = 0,\n            level = 0,\n            width, // used for RenderTargets or Data Textures\n            height = width,\n            length = 1,\n        } = {}\n    ) {\n        this.gl = gl;\n        this.id = ID++;\n\n        this.image = image;\n        this.target = target;\n        this.type = type;\n        this.format = format;\n        this.internalFormat = internalFormat;\n        this.minFilter = minFilter;\n        this.magFilter = magFilter;\n        this.wrapS = wrapS;\n        this.wrapT = wrapT;\n        this.wrapR = wrapR;\n        this.generateMipmaps = generateMipmaps;\n        this.premultiplyAlpha = premultiplyAlpha;\n        this.unpackAlignment = unpackAlignment;\n        this.flipY = flipY;\n        this.anisotropy = Math.min(anisotropy, this.gl.renderer.parameters.maxAnisotropy);\n        this.level = level;\n        this.width = width;\n        this.height = height;\n        this.length = length;\n        this.texture = this.gl.createTexture();\n\n        this.store = {\n            image: null,\n        };\n\n        // Alias for state store to avoid redundant calls for global state\n        this.glState = this.gl.renderer.state;\n\n        // State store to avoid redundant calls for per-texture state\n        this.state = {};\n        this.state.minFilter = this.gl.NEAREST_MIPMAP_LINEAR;\n        this.state.magFilter = this.gl.LINEAR;\n        this.state.wrapS = this.gl.REPEAT;\n        this.state.wrapT = this.gl.REPEAT;\n        this.state.anisotropy = 0;\n    }\n\n    bind() {\n        // Already bound to active texture unit\n        if (this.glState.textureUnits[this.glState.activeTextureUnit] === this.id) return;\n        this.gl.bindTexture(this.target, this.texture);\n        this.glState.textureUnits[this.glState.activeTextureUnit] = this.id;\n    }\n\n    update(textureUnit = 0) {\n        const needsUpdate = !(this.image === this.store.image && !this.needsUpdate);\n\n        // Make sure that texture is bound to its texture unit\n        if (needsUpdate || this.glState.textureUnits[textureUnit] !== this.id) {\n            // set active texture unit to perform texture functions\n            this.gl.renderer.activeTexture(textureUnit);\n            this.bind();\n        }\n\n        if (!needsUpdate) return;\n        this.needsUpdate = false;\n\n        if (this.flipY !== this.glState.flipY) {\n            this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, this.flipY);\n            this.glState.flipY = this.flipY;\n        }\n\n        if (this.premultiplyAlpha !== this.glState.premultiplyAlpha) {\n            this.gl.pixelStorei(this.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.premultiplyAlpha);\n            this.glState.premultiplyAlpha = this.premultiplyAlpha;\n        }\n\n        if (this.unpackAlignment !== this.glState.unpackAlignment) {\n            this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT, this.unpackAlignment);\n            this.glState.unpackAlignment = this.unpackAlignment;\n        }\n\n        if (this.minFilter !== this.state.minFilter) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_MIN_FILTER, this.minFilter);\n            this.state.minFilter = this.minFilter;\n        }\n\n        if (this.magFilter !== this.state.magFilter) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_MAG_FILTER, this.magFilter);\n            this.state.magFilter = this.magFilter;\n        }\n\n        if (this.wrapS !== this.state.wrapS) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_S, this.wrapS);\n            this.state.wrapS = this.wrapS;\n        }\n\n        if (this.wrapT !== this.state.wrapT) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_T, this.wrapT);\n            this.state.wrapT = this.wrapT;\n        }\n\n        if (this.wrapR !== this.state.wrapR) {\n            this.gl.texParameteri(this.target, this.gl.TEXTURE_WRAP_R, this.wrapR);\n            this.state.wrapR = this.wrapR;\n        }\n\n        if (this.anisotropy && this.anisotropy !== this.state.anisotropy) {\n            this.gl.texParameterf(this.target, this.gl.renderer.getExtension('EXT_texture_filter_anisotropic').TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropy);\n            this.state.anisotropy = this.anisotropy;\n        }\n\n        if (this.image) {\n            if (this.image.width) {\n                this.width = this.image.width;\n                this.height = this.image.height;\n            }\n\n            if (this.target === this.gl.TEXTURE_CUBE_MAP) {\n                // For cube maps\n                for (let i = 0; i < 6; i++) {\n                    this.gl.texImage2D(this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, this.level, this.internalFormat, this.format, this.type, this.image[i]);\n                }\n            } else if (ArrayBuffer.isView(this.image)) {\n                // Data texture\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.width, this.height, 0, this.format, this.type, this.image);\n                } else if (this.target === this.gl.TEXTURE_2D_ARRAY || this.target === this.gl.TEXTURE_3D) {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, this.image);\n                }\n            } else if (this.image.isCompressedTexture) {\n                // Compressed texture\n                for (let level = 0; level < this.image.length; level++) {\n                    this.gl.compressedTexImage2D(this.target, level, this.internalFormat, this.image[level].width, this.image[level].height, 0, this.image[level].data);\n                }\n            } else {\n                // Regular texture\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.format, this.type, this.image);\n                } else {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, this.image);\n                }\n            }\n\n            if (this.generateMipmaps) {\n                // For WebGL1, if not a power of 2, turn off mips, set wrapping to clamp to edge and minFilter to linear\n                if (!this.gl.renderer.isWebgl2 && (!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(this.gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, this.gl.RGBA, 1, 1, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, emptyPixel);\n                }\n            } else if (this.width) {\n                // image intentionally left null for RenderTarget\n                if (this.target === this.gl.TEXTURE_2D) {\n                    this.gl.texImage2D(this.target, this.level, this.internalFormat, this.width, this.height, 0, this.format, this.type, null);\n                } else {\n                    this.gl.texImage3D(this.target, this.level, this.internalFormat, this.width, this.height, this.length, 0, this.format, this.type, null);\n                }\n            } else {\n                // Upload empty pixel if no image to avoid errors while image or video loading\n                this.gl.texImage2D(this.target, 0, this.gl.RGBA, 1, 1, 0, this.gl.RGBA, this.gl.UNSIGNED_BYTE, emptyPixel);\n            }\n        }\n        this.store.image = this.image;\n    }\n}\n","import { 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","// Based from ThreeJS' OrbitControls class, rewritten using es6 with some additions and subtractions.\n// TODO: abstract event handlers so can be fed from other sources\n// TODO: make scroll zoom more accurate than just >/< zero\n// TODO: be able to pass in new camera position\n\nimport { Vec3 } from '../math/Vec3.js';\nimport { Vec2 } from '../math/Vec2.js';\n\nconst STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, DOLLY_PAN: 3 };\nconst tempVec3 = /* @__PURE__ */ new Vec3();\nconst tempVec2a = /* @__PURE__ */ new Vec2();\nconst tempVec2b = /* @__PURE__ */ new Vec2();\n\nexport function Orbit(\n    object,\n    {\n        element = document,\n        enabled = true,\n        target = new Vec3(),\n        ease = 0.25,\n        inertia = 0.85,\n        enableRotate = true,\n        rotateSpeed = 0.1,\n        autoRotate = false,\n        autoRotateSpeed = 1.0,\n        enableZoom = true,\n        zoomSpeed = 1,\n        zoomStyle = 'dolly',\n        enablePan = true,\n        panSpeed = 0.1,\n        minPolarAngle = 0,\n        maxPolarAngle = Math.PI,\n        minAzimuthAngle = -Infinity,\n        maxAzimuthAngle = Infinity,\n        minDistance = 0,\n        maxDistance = Infinity,\n    } = {}\n) {\n    this.enabled = enabled;\n    this.target = target;\n    this.zoomStyle = zoomStyle;\n\n    // Catch attempts to disable - set to 1 so has no effect\n    ease = ease || 1;\n    inertia = inertia || 0;\n\n    this.minDistance = minDistance;\n    this.maxDistance = maxDistance;\n\n    // current position in sphericalTarget coordinates\n    const sphericalDelta = { radius: 1, phi: 0, theta: 0 };\n    const sphericalTarget = { radius: 1, phi: 0, theta: 0 };\n    const spherical = { radius: 1, phi: 0, theta: 0 };\n    const panDelta = new Vec3();\n\n    // Grab initial position values\n    const offset = new Vec3();\n    offset.copy(object.position).sub(this.target);\n    spherical.radius = sphericalTarget.radius = offset.distance();\n    spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z);\n    spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1));\n\n    this.offset = offset;\n\n    this.update = () => {\n        if (autoRotate) {\n            handleAutoRotate();\n        }\n\n        // apply delta\n        sphericalTarget.radius *= sphericalDelta.radius;\n        sphericalTarget.theta += sphericalDelta.theta;\n        sphericalTarget.phi += sphericalDelta.phi;\n\n        // apply boundaries\n        sphericalTarget.theta = Math.max(minAzimuthAngle, Math.min(maxAzimuthAngle, sphericalTarget.theta));\n        sphericalTarget.phi = Math.max(minPolarAngle, Math.min(maxPolarAngle, sphericalTarget.phi));\n        sphericalTarget.radius = Math.max(this.minDistance, Math.min(this.maxDistance, sphericalTarget.radius));\n\n        // ease values\n        spherical.phi += (sphericalTarget.phi - spherical.phi) * ease;\n        spherical.theta += (sphericalTarget.theta - spherical.theta) * ease;\n        spherical.radius += (sphericalTarget.radius - spherical.radius) * ease;\n\n        // apply pan to target. As offset is relative to target, it also shifts\n        this.target.add(panDelta);\n\n        // apply rotation to offset\n        let sinPhiRadius = spherical.radius * Math.sin(Math.max(0.000001, spherical.phi));\n        offset.x = sinPhiRadius * Math.sin(spherical.theta);\n        offset.y = spherical.radius * Math.cos(spherical.phi);\n        offset.z = sinPhiRadius * Math.cos(spherical.theta);\n\n        // Apply updated values to object\n        object.position.copy(this.target).add(offset);\n        object.lookAt(this.target);\n\n        // Apply inertia to values\n        sphericalDelta.theta *= inertia;\n        sphericalDelta.phi *= inertia;\n        panDelta.multiply(inertia);\n\n        // Reset scale every frame to avoid applying scale multiple times\n        sphericalDelta.radius = 1;\n    };\n\n    // Updates internals with new position\n    this.forcePosition = () => {\n        offset.copy(object.position).sub(this.target);\n        spherical.radius = sphericalTarget.radius = offset.distance();\n        spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z);\n        spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1));\n        object.lookAt(this.target);\n    };\n\n    // Everything below here just updates panDelta and sphericalDelta\n    // Using those two objects' values, the orbit is calculated\n\n    const rotateStart = new Vec2();\n    const panStart = new Vec2();\n    const dollyStart = new Vec2();\n\n    let state = STATE.NONE;\n    this.mouseButtons = { ORBIT: 0, ZOOM: 1, PAN: 2 };\n\n    function getZoomScale() {\n        return Math.pow(0.95, zoomSpeed);\n    }\n\n    function panLeft(distance, m) {\n        tempVec3.set(m[0], m[1], m[2]);\n        tempVec3.multiply(-distance);\n        panDelta.add(tempVec3);\n    }\n\n    function panUp(distance, m) {\n        tempVec3.set(m[4], m[5], m[6]);\n        tempVec3.multiply(distance);\n        panDelta.add(tempVec3);\n    }\n\n    const pan = (deltaX, deltaY) => {\n        let el = element === document ? document.body : element;\n        tempVec3.copy(object.position).sub(this.target);\n        let targetDistance = tempVec3.distance();\n        targetDistance *= Math.tan((((object.fov || 45) / 2) * Math.PI) / 180.0);\n        panLeft((2 * deltaX * targetDistance) / el.clientHeight, object.matrix);\n        panUp((2 * deltaY * targetDistance) / el.clientHeight, object.matrix);\n    };\n\n    const dolly = (dollyScale) => {\n        if (this.zoomStyle === 'dolly') sphericalDelta.radius /= dollyScale;\n        else {\n            object.fov /= dollyScale;\n            if (object.type === 'orthographic') object.orthographic();\n            else object.perspective();\n        }\n    };\n\n    function handleAutoRotate() {\n        const angle = ((2 * Math.PI) / 60 / 60) * autoRotateSpeed;\n        sphericalDelta.theta -= angle;\n    }\n\n    function handleMoveRotate(x, y) {\n        tempVec2a.set(x, y);\n        tempVec2b.sub(tempVec2a, rotateStart).multiply(rotateSpeed);\n        let el = element === document ? document.body : element;\n        sphericalDelta.theta -= (2 * Math.PI * tempVec2b.x) / el.clientHeight;\n        sphericalDelta.phi -= (2 * Math.PI * tempVec2b.y) / el.clientHeight;\n        rotateStart.copy(tempVec2a);\n    }\n\n    function handleMouseMoveDolly(e) {\n        tempVec2a.set(e.clientX, e.clientY);\n        tempVec2b.sub(tempVec2a, dollyStart);\n        if (tempVec2b.y > 0) {\n            dolly(getZoomScale());\n        } else if (tempVec2b.y < 0) {\n            dolly(1 / getZoomScale());\n        }\n        dollyStart.copy(tempVec2a);\n    }\n\n    function handleMovePan(x, y) {\n        tempVec2a.set(x, y);\n        tempVec2b.sub(tempVec2a, panStart).multiply(panSpeed);\n        pan(tempVec2b.x, tempVec2b.y);\n        panStart.copy(tempVec2a);\n    }\n\n    function handleTouchStartDollyPan(e) {\n        if (enableZoom) {\n            let dx = e.touches[0].pageX - e.touches[1].pageX;\n            let dy = e.touches[0].pageY - e.touches[1].pageY;\n            let distance = Math.sqrt(dx * dx + dy * dy);\n            dollyStart.set(0, distance);\n        }\n\n        if (enablePan) {\n            let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX);\n            let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY);\n            panStart.set(x, y);\n        }\n    }\n\n    function handleTouchMoveDollyPan(e) {\n        if (enableZoom) {\n            let dx = e.touches[0].pageX - e.touches[1].pageX;\n            let dy = e.touches[0].pageY - e.touches[1].pageY;\n            let distance = Math.sqrt(dx * dx + dy * dy);\n            tempVec2a.set(0, distance);\n            tempVec2b.set(0, Math.pow(tempVec2a.y / dollyStart.y, zoomSpeed));\n            dolly(tempVec2b.y);\n            dollyStart.copy(tempVec2a);\n        }\n\n        if (enablePan) {\n            let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX);\n            let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY);\n            handleMovePan(x, y);\n        }\n    }\n\n    const onMouseDown = (e) => {\n        if (!this.enabled) return;\n\n        switch (e.button) {\n            case this.mouseButtons.ORBIT:\n                if (enableRotate === false) return;\n                rotateStart.set(e.clientX, e.clientY);\n                state = STATE.ROTATE;\n                break;\n            case this.mouseButtons.ZOOM:\n                if (enableZoom === false) return;\n                dollyStart.set(e.clientX, e.clientY);\n                state = STATE.DOLLY;\n                break;\n            case this.mouseButtons.PAN:\n                if (enablePan === false) return;\n                panStart.set(e.clientX, e.clientY);\n                state = STATE.PAN;\n                break;\n        }\n\n        if (state !== STATE.NONE) {\n            window.addEventListener('mousemove', onMouseMove, false);\n            window.addEventListener('mouseup', onMouseUp, false);\n        }\n    };\n\n    const onMouseMove = (e) => {\n        if (!this.enabled) return;\n\n        switch (state) {\n            case STATE.ROTATE:\n                if (enableRotate === false) return;\n                handleMoveRotate(e.clientX, e.clientY);\n                break;\n            case STATE.DOLLY:\n                if (enableZoom === false) return;\n                handleMouseMoveDolly(e);\n                break;\n            case STATE.PAN:\n                if (enablePan === false) return;\n                handleMovePan(e.clientX, e.clientY);\n                break;\n        }\n    };\n\n    const onMouseUp = () => {\n        window.removeEventListener('mousemove', onMouseMove, false);\n        window.removeEventListener('mouseup', onMouseUp, false);\n        state = STATE.NONE;\n    };\n\n    const onMouseWheel = (e) => {\n        if (!this.enabled || !enableZoom || (state !== STATE.NONE && state !== STATE.ROTATE)) return;\n        e.stopPropagation();\n        e.preventDefault();\n\n        if (e.deltaY < 0) {\n            dolly(1 / getZoomScale());\n        } else if (e.deltaY > 0) {\n            dolly(getZoomScale());\n        }\n    };\n\n    const onTouchStart = (e) => {\n        if (!this.enabled) return;\n        e.preventDefault();\n\n        switch (e.touches.length) {\n            case 1:\n                if (enableRotate === false) return;\n                rotateStart.set(e.touches[0].pageX, e.touches[0].pageY);\n                state = STATE.ROTATE;\n                break;\n            case 2:\n                if (enableZoom === false && enablePan === false) return;\n                handleTouchStartDollyPan(e);\n                state = STATE.DOLLY_PAN;\n                break;\n            default:\n                state = STATE.NONE;\n        }\n    };\n\n    const onTouchMove = (e) => {\n        if (!this.enabled) return;\n        e.preventDefault();\n        e.stopPropagation();\n\n        switch (e.touches.length) {\n            case 1:\n                if (enableRotate === false) return;\n                handleMoveRotate(e.touches[0].pageX, e.touches[0].pageY);\n                break;\n            case 2:\n                if (enableZoom === false && enablePan === false) return;\n                handleTouchMoveDollyPan(e);\n                break;\n            default:\n                state = STATE.NONE;\n        }\n    };\n\n    const onTouchEnd = () => {\n        if (!this.enabled) return;\n        state = STATE.NONE;\n    };\n\n    const onContextMenu = (e) => {\n        if (!this.enabled) return;\n        e.preventDefault();\n    };\n\n    function addHandlers() {\n        element.addEventListener('contextmenu', onContextMenu, false);\n        element.addEventListener('mousedown', onMouseDown, false);\n        element.addEventListener('wheel', onMouseWheel, { passive: false });\n        element.addEventListener('touchstart', onTouchStart, { passive: false });\n        element.addEventListener('touchend', onTouchEnd, false);\n        element.addEventListener('touchmove', onTouchMove, { passive: false });\n    }\n\n    this.remove = function () {\n        element.removeEventListener('contextmenu', onContextMenu);\n        element.removeEventListener('mousedown', onMouseDown);\n        element.removeEventListener('wheel', onMouseWheel);\n        element.removeEventListener('touchstart', onTouchStart);\n        element.removeEventListener('touchend', onTouchEnd);\n        element.removeEventListener('touchmove', onTouchMove);\n        window.removeEventListener('mousemove', onMouseMove);\n        window.removeEventListener('mouseup', onMouseUp);\n    };\n\n    addHandlers();\n}\n","import { Vec3 } from '../math/Vec3.js';\n\nconst CATMULLROM = 'catmullrom';\nconst CUBICBEZIER = 'cubicbezier';\nconst QUADRATICBEZIER = 'quadraticbezier';\n\n// temp\nconst _a0 = /* @__PURE__ */ new Vec3(),\n    _a1 = /* @__PURE__ */ new Vec3(),\n    _a2 = /* @__PURE__ */ new Vec3(),\n    _a3 = /* @__PURE__ */ new Vec3();\n\n/**\n * Get the control points of cubic bezier curve.\n * @param {*} i\n * @param {*} a\n * @param {*} b\n */\nfunction getCtrlPoint(points, i, a = 0.168, b = 0.168) {\n    if (i < 1) {\n        _a0.sub(points[1], points[0]).scale(a).add(points[0]);\n    } else {\n        _a0.sub(points[i + 1], points[i - 1])\n            .scale(a)\n            .add(points[i]);\n    }\n    if (i > points.length - 3) {\n        const last = points.length - 1;\n        _a1.sub(points[last - 1], points[last])\n            .scale(b)\n            .add(points[last]);\n    } else {\n        _a1.sub(points[i], points[i + 2])\n            .scale(b)\n            .add(points[i + 1]);\n    }\n    return [_a0.clone(), _a1.clone()];\n}\n\nfunction getQuadraticBezierPoint(t, p0, c0, p1) {\n    const k = 1 - t;\n    _a0.copy(p0).scale(k ** 2);\n    _a1.copy(c0).scale(2 * k * t);\n    _a2.copy(p1).scale(t ** 2);\n    const ret = new Vec3();\n    ret.add(_a0, _a1).add(_a2);\n    return ret;\n}\n\nfunction getCubicBezierPoint(t, p0, c0, c1, p1) {\n    const k = 1 - t;\n    _a0.copy(p0).scale(k ** 3);\n    _a1.copy(c0).scale(3 * k ** 2 * t);\n    _a2.copy(c1).scale(3 * k * t ** 2);\n    _a3.copy(p1).scale(t ** 3);\n    const ret = new Vec3();\n    ret.add(_a0, _a1).add(_a2).add(_a3);\n    return ret;\n}\n\nexport class Curve {\n    constructor({ points = [new Vec3(0, 0, 0), new Vec3(0, 1, 0), new Vec3(1, 1, 0), new Vec3(1, 0, 0)], divisions = 12, type = CATMULLROM } = {}) {\n        this.points = points;\n        this.divisions = divisions;\n        this.type = type;\n    }\n\n    _getQuadraticBezierPoints(divisions = this.divisions) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count < 3) {\n            console.warn('Not enough points provided.');\n            return [];\n        }\n\n        const p0 = this.points[0];\n        let c0 = this.points[1],\n            p1 = this.points[2];\n\n        for (let i = 0; i <= divisions; i++) {\n            const p = getQuadraticBezierPoint(i / divisions, p0, c0, p1);\n            points.push(p);\n        }\n\n        let offset = 3;\n        while (count - offset > 0) {\n            p0.copy(p1);\n            c0 = p1.scale(2).sub(c0);\n            p1 = this.points[offset];\n            for (let i = 1; i <= divisions; i++) {\n                const p = getQuadraticBezierPoint(i / divisions, p0, c0, p1);\n                points.push(p);\n            }\n            offset++;\n        }\n\n        return points;\n    }\n\n    _getCubicBezierPoints(divisions = this.divisions) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count < 4) {\n            console.warn('Not enough points provided.');\n            return [];\n        }\n\n        let p0 = this.points[0],\n            c0 = this.points[1],\n            c1 = this.points[2],\n            p1 = this.points[3];\n\n        for (let i = 0; i <= divisions; i++) {\n            const p = getCubicBezierPoint(i / divisions, p0, c0, c1, p1);\n            points.push(p);\n        }\n\n        let offset = 4;\n        while (count - offset > 1) {\n            p0.copy(p1);\n            c0 = p1.scale(2).sub(c1);\n            c1 = this.points[offset];\n            p1 = this.points[offset + 1];\n            for (let i = 1; i <= divisions; i++) {\n                const p = getCubicBezierPoint(i / divisions, p0, c0, c1, p1);\n                points.push(p);\n            }\n            offset += 2;\n        }\n\n        return points;\n    }\n\n    _getCatmullRomPoints(divisions = this.divisions, a = 0.168, b = 0.168) {\n        const points = [];\n        const count = this.points.length;\n\n        if (count <= 2) {\n            return this.points;\n        }\n\n        let p0;\n        this.points.forEach((p, i) => {\n            if (i === 0) {\n                p0 = p;\n            } else {\n                const [c0, c1] = getCtrlPoint(this.points, i - 1, a, b);\n                const c = new Curve({\n                    points: [p0, c0, c1, p],\n                    type: CUBICBEZIER,\n                });\n                points.pop();\n                points.push(...c.getPoints(divisions));\n                p0 = p;\n            }\n        });\n\n        return points;\n    }\n\n    getPoints(divisions = this.divisions, a = 0.168, b = 0.168) {\n        const type = this.type;\n\n        if (type === QUADRATICBEZIER) {\n            return this._getQuadraticBezierPoints(divisions);\n        }\n\n        if (type === CUBICBEZIER) {\n            return this._getCubicBezierPoints(divisions);\n        }\n\n        if (type === CATMULLROM) {\n            return this._getCatmullRomPoints(divisions, a, b);\n        }\n\n        return this.points;\n    }\n}\n\nCurve.CATMULLROM = CATMULLROM;\nCurve.CUBICBEZIER = CUBICBEZIER;\nCurve.QUADRATICBEZIER = QUADRATICBEZIER;\n","import { Texture } from '../core/Texture.js';\nimport { KTXTexture } from './KTXTexture.js';\n\n// For compressed textures, generate using https://github.com/TimvanScherpenzeel/texture-compressor\n\nlet cache = {};\nconst supportedExtensions = [];\n\nexport class TextureLoader {\n    static load(\n        gl,\n        {\n            src, // string or object of extension:src key-values\n            // {\n            //     pvrtc: '...ktx',\n            //     s3tc: '...ktx',\n            //     etc: '...ktx',\n            //     etc1: '...ktx',\n            //     astc: '...ktx',\n            //     webp: '...webp',\n            //     jpg: '...jpg',\n            //     png: '...png',\n            // }\n\n            // Only props relevant to KTXTexture\n            wrapS = gl.CLAMP_TO_EDGE,\n            wrapT = gl.CLAMP_TO_EDGE,\n            anisotropy = 0,\n\n            // For regular images\n            format = gl.RGBA,\n            internalFormat = format,\n            generateMipmaps = true,\n            minFilter = generateMipmaps ? gl.NEAREST_MIPMAP_LINEAR : gl.LINEAR,\n            magFilter = gl.LINEAR,\n            premultiplyAlpha = false,\n            unpackAlignment = 4,\n            flipY = true,\n        } = {}\n    ) {\n        const support = this.getSupportedExtensions(gl);\n        let ext = 'none';\n\n        // If src is string, determine which format from the extension\n        if (typeof src === 'string') {\n            ext = src.split('.').pop().split('?')[0].toLowerCase();\n        }\n\n        // If src is object, use supported extensions and provided list to choose best option\n        // Get first supported match, so put in order of preference\n        if (typeof src === 'object') {\n            for (const prop in src) {\n                if (support.includes(prop.toLowerCase())) {\n                    ext = prop.toLowerCase();\n                    src = src[prop];\n                    break;\n                }\n            }\n        }\n\n        // Stringify props\n        const cacheID = src + wrapS + wrapT + anisotropy + format + internalFormat + generateMipmaps + minFilter + magFilter + premultiplyAlpha + unpackAlignment + flipY + gl.renderer.id;\n\n        // Check cache for existing texture\n        if (cache[cacheID]) return cache[cacheID];\n\n        let texture;\n        switch (ext) {\n            case 'ktx':\n            case 'pvrtc':\n            case 's3tc':\n            case 'etc':\n            case 'etc1':\n            case 'astc':\n                // Load compressed texture using KTX format\n                texture = new KTXTexture(gl, {\n                    src,\n                    wrapS,\n                    wrapT,\n                    anisotropy,\n                    minFilter,\n                    magFilter,\n                });\n                texture.loaded = this.loadKTX(src, texture);\n                break;\n            case 'webp':\n            case 'jpg':\n            case 'jpeg':\n            case 'png':\n                texture = new Texture(gl, {\n                    wrapS,\n                    wrapT,\n                    anisotropy,\n                    format,\n                    internalFormat,\n                    generateMipmaps,\n                    minFilter,\n                    magFilter,\n                    premultiplyAlpha,\n                    unpackAlignment,\n                    flipY,\n                });\n                texture.loaded = this.loadImage(gl, src, texture, flipY);\n                break;\n            default:\n                console.warn('No supported format supplied');\n                texture = new Texture(gl);\n        }\n\n        texture.ext = ext;\n        cache[cacheID] = texture;\n        return texture;\n    }\n\n    static getSupportedExtensions(gl) {\n        if (supportedExtensions.length) return supportedExtensions;\n\n        const extensions = {\n            pvrtc: gl.renderer.getExtension('WEBGL_compressed_texture_pvrtc') || gl.renderer.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\n            s3tc: gl.renderer.getExtension('WEBGL_compressed_texture_s3tc'),\n            // etc: gl.renderer.getExtension('WEBGL_compressed_texture_etc'),\n            etc1: gl.renderer.getExtension('WEBGL_compressed_texture_etc1'),\n            astc: gl.renderer.getExtension('WEBGL_compressed_texture_astc'),\n            bc7: gl.renderer.getExtension('EXT_texture_compression_bptc'),\n        };\n\n        for (const ext in extensions) if (extensions[ext]) supportedExtensions.push(ext);\n\n        // Formats supported by all\n        supportedExtensions.push('png', 'jpg', 'webp');\n\n        return supportedExtensions;\n    }\n\n    static loadKTX(src, texture) {\n        return fetch(src)\n            .then((res) => res.arrayBuffer())\n            .then((buffer) => texture.parseBuffer(buffer));\n    }\n\n    static loadImage(gl, src, texture, flipY) {\n        return decodeImage(src, flipY).then((imgBmp) => {\n            // Catch non POT textures for WebGL1 and update params to avoid errors\n            if (!gl.renderer.isWebgl2 && (!powerOfTwo(imgBmp.width) || !powerOfTwo(imgBmp.height))) {\n                if (texture.generateMipmaps) texture.generateMipmaps = false;\n                if (texture.minFilter === gl.NEAREST_MIPMAP_LINEAR) texture.minFilter = gl.LINEAR;\n                if (texture.wrapS === gl.REPEAT) texture.wrapS = texture.wrapT = gl.CLAMP_TO_EDGE;\n            }\n\n            texture.image = imgBmp;\n\n            // For createImageBitmap, close once uploaded\n            texture.onUpdate = () => {\n                if (imgBmp.close) imgBmp.close();\n                texture.onUpdate = null;\n            };\n\n            return imgBmp;\n        });\n    }\n\n    static clearCache() {\n        cache = {};\n    }\n}\n\nfunction powerOfTwo(value) {\n    // (width & (width - 1)) !== 0\n    return Math.log2(value) % 1 === 0;\n}\n\nfunction decodeImage(src, flipY) {\n    return new Promise((resolve, reject) => {\n        if (isCreateImageBitmap()) {\n            fetch(src, { mode: 'cors' })\n                .then((r) => r.blob())\n                .then((b) => createImageBitmap(b, { imageOrientation: flipY ? 'flipY' : 'none', premultiplyAlpha: 'none' }))\n                .then(resolve)\n                .catch((err) => reject(err));\n        } else {\n            const img = new Image();\n\n            img.crossOrigin = '';\n            img.src = src;\n            img.onerror = ({ type }) => reject(`${type}: Loading image`);\n            img.onload = () => resolve(img);\n        }\n    });\n}\n\nfunction isCreateImageBitmap() {\n    const isChrome = navigator.userAgent.toLowerCase().includes('chrome');\n    if (!isChrome) return false;\n    try {\n        createImageBitmap;\n    } catch (e) {\n        return false;\n    }\n    return true;\n}\n","// Core\nexport { Geometry } from './core/Geometry.js';\nexport { Program } from './core/Program.js';\nexport { Renderer } from './core/Renderer.js';\nexport { Camera } from './core/Camera.js';\nexport { Transform } from './core/Transform.js';\nexport { Mesh } from './core/Mesh.js';\nexport { Texture } from './core/Texture.js';\nexport { RenderTarget } from './core/RenderTarget.js';\n\n// Maths\nexport { Color } from './math/Color.js';\nexport { Euler } from './math/Euler.js';\nexport { Mat3 } from './math/Mat3.js';\nexport { Mat4 } from './math/Mat4.js';\nexport { Quat } from './math/Quat.js';\nexport { Vec2 } from './math/Vec2.js';\nexport { Vec3 } from './math/Vec3.js';\nexport { Vec4 } from './math/Vec4.js';\n\n// Extras\nexport { Plane } from './extras/Plane.js';\nexport { Box } from './extras/Box.js';\nexport { Sphere } from './extras/Sphere.js';\nexport { Cylinder } from './extras/Cylinder.js';\nexport { Triangle } from './extras/Triangle.js';\nexport { Torus } from './extras/Torus.js';\nexport { Orbit } from './extras/Orbit.js';\nexport { Raycast } from './extras/Raycast.js';\nexport { Curve } from './extras/Curve.js';\nexport { Path } from './extras/path/Path.js';\nexport { Tube } from './extras/Tube.js';\nexport { Post } from './extras/Post.js';\nexport { Skin } from './extras/Skin.js';\nexport { Animation } from './extras/Animation.js';\nexport { Text } from './extras/Text.js';\nexport { NormalProgram } from './extras/NormalProgram.js';\nexport { Flowmap } from './extras/Flowmap.js';\nexport { GPGPU } from './extras/GPGPU.js';\nexport { Polyline } from './extras/Polyline.js';\nexport { Shadow } from './extras/Shadow.js';\nexport { KTXTexture } from './extras/KTXTexture.js';\nexport { TextureLoader } from './extras/TextureLoader.js';\nexport { GLTFLoader } from './extras/GLTFLoader.js';\nexport { GLTFSkin } from './extras/GLTFSkin.js';\nexport { GLTFAnimation } from './extras/GLTFAnimation.js';\nexport { DracoManager } from './extras/DracoManager.js';\nexport { BasisManager } from './extras/BasisManager.js';\nexport { WireMesh } from './extras/WireMesh.js';\nexport { AxesHelper } from './extras/helpers/AxesHelper.js';\nexport { GridHelper } from './extras/helpers/GridHelper.js';\nexport { VertexNormalsHelper } from './extras/helpers/VertexNormalsHelper.js';\nexport { FaceNormalsHelper } from './extras/helpers/FaceNormalsHelper.js';\nexport { InstancedMesh } from './extras/InstancedMesh.js';\nexport { Texture3D } from './extras/Texture3D.js';\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState,useCallback}from\"react\";import{Renderer,Camera,Transform,Plane,Program,Mesh,Texture}from\"https://unpkg.com/ogl\";import{defaultFragmentShader,defaultVertexShader}from\"https://framerusercontent.com/modules/MpdGPgep8CrmVuG8IclI/3flka5fkGcFUNVW00KRS/OGLUtils.js\";export default function OGLScene(props){return /*#__PURE__*/_jsx(\"div\",{});}export function useOGLScene(mountRef,media,dimensions,mediaType,options={}){const sceneRef=useRef({});const[containerSize,setContainerSize]=useState({width:0,height:0});const[isReady,setIsReady]=useState(false);const isInitializedRef=useRef(false);const initialUniformsRef=useRef(null);const resizeObserverRef=useRef(null);const{vertexShader,fragmentShader,objectFit=\"cover\",uniforms={},accessibilityOptions={}}=options;// 默认的 canvas 配置\nconst defaultAccessibilityOptions={ariaLabel:null,role:null,tabIndex:null,...accessibilityOptions};// 保存初始 uniforms，避免重复创建场景\nif(!initialUniformsRef.current){initialUniformsRef.current=JSON.parse(JSON.stringify(uniforms));}// 应用 canvas 属性的辅助函数\nconst applyCanvasAttributes=useCallback((canvas,options)=>{// 设置 aria 属性\nif(options.ariaLabel){canvas.setAttribute(\"aria-label\",options.ariaLabel);}if(options.role){canvas.setAttribute(\"role\",options.role);}if(options.tabIndex!==null&&options.tabIndex!==undefined){canvas.tabIndex=options.tabIndex;}},[]);// 手动渲染函数 - 提前定义避免循环依赖\nconst renderFrame=useCallback(()=>{const{renderer,camera,scene,texture}=sceneRef.current;texture.needsUpdate=true;renderer.render({scene,camera});},[mediaType]);// 计算平面尺寸\nconst calculatePlaneSize=useCallback((mediaWidth,mediaHeight,containerWidth,containerHeight,fitMode)=>{const mediaAspect=mediaWidth/mediaHeight;const containerAspect=containerWidth/containerHeight;let planeWidth,planeHeight;if(fitMode===\"cover\"){planeHeight=containerHeight;planeWidth=containerWidth;}else if(fitMode===\"contain\"){if(mediaAspect>containerAspect){planeWidth=containerWidth;planeHeight=containerWidth/mediaAspect;}else{planeHeight=containerHeight;planeWidth=containerHeight*mediaAspect;}}return{width:planeWidth,height:planeHeight};},[]);// 更新场景尺寸相关参数（优化：避免不必要的重建）\nconst updateSceneSize=useCallback((width,height,fitMode)=>{const{renderer,camera,mesh,program}=sceneRef.current;if(!renderer||!camera||!mesh||!program)return;// 检查尺寸是否真的发生了变化\nconst currentCanvas=renderer.gl.canvas;if(currentCanvas.width===width*renderer.dpr&&currentCanvas.height===height*renderer.dpr){return;// 尺寸没有变化，跳过更新\n}// 更新渲染器尺寸\nrenderer.setSize(width,height);// 更新相机参数\nconst distance=1e3;const fov=2*Math.atan(height/2/distance)*(180/Math.PI);camera.fov=fov;camera.aspect=width/height;camera.updateProjectionMatrix();// 更新默认 uniforms\nif(program.uniforms){if(program.uniforms.uMediaSize&&dimensions.width&&dimensions.height){program.uniforms.uMediaSize.value=[dimensions.width,dimensions.height];}if(program.uniforms.uPanelSize){program.uniforms.uPanelSize.value=[width,height];}if(program.uniforms.uFitMode){program.uniforms.uFitMode.value=fitMode===\"cover\"?1:0;console.log(program.uniforms.uFitMode.value);}}// 重新计算平面尺寸并更新几何体\nif(dimensions.width&&dimensions.height){const planeSize=calculatePlaneSize(dimensions.width,dimensions.height,width,height,objectFit);// 只有当尺寸真的不同时才更新几何体\nconst gl=renderer.gl;const newGeometry=new Plane(gl,{width:planeSize.width,height:planeSize.height});// 更新mesh的几何体\nconst oldGeometry=mesh.geometry;mesh.geometry=newGeometry;sceneRef.current.geometry=newGeometry;// 清理旧几何体（如果需要）\nif(oldGeometry&&oldGeometry!==newGeometry&&oldGeometry.dispose){oldGeometry.dispose();}}},[dimensions,calculatePlaneSize,objectFit]);// 获取容器尺寸 - 优化以避免不必要的更新\nconst updateContainerSize=useCallback(()=>{if(!mountRef.current)return;const newWidth=mountRef.current.clientWidth;const newHeight=mountRef.current.clientHeight;// 只有当尺寸真的发生变化时才更新状态\nsetContainerSize(prevSize=>{if(prevSize.width!==newWidth||prevSize.height!==newHeight){return{width:newWidth,height:newHeight};}return prevSize;});},[mountRef]);// 监听容器尺寸变化 - 优化ResizeObserver\nuseEffect(()=>{updateContainerSize();// 清理之前的观察器\nif(resizeObserverRef.current){resizeObserverRef.current.disconnect();}if(mountRef.current){resizeObserverRef.current=new ResizeObserver(entries=>{// 使用entries直接获取尺寸，避免重复测量\nfor(const entry of entries){const{width,height}=entry.contentRect;setContainerSize(prevSize=>{if(prevSize.width!==width||prevSize.height!==height){return{width,height};}return prevSize;});}});resizeObserverRef.current.observe(mountRef.current);}return()=>{if(resizeObserverRef.current){resizeObserverRef.current.disconnect();}};},[mountRef]);// 初始化场景（只执行一次）\nuseEffect(()=>{if(!mountRef.current||containerSize.width===0||containerSize.height===0||isInitializedRef.current)return;let renderer,camera,scene,program,mesh,texture,geometry;const init=async()=>{const{width,height}=containerSize;// 创建渲染器\nrenderer=new Renderer({width,height,dpr:Math.min(window.devicePixelRatio,2),alpha:true,premultipliedAlpha:false});const gl=renderer.gl;// 清空容器并添加canvas\nmountRef.current.innerHTML=\"\";mountRef.current.appendChild(gl.canvas);// 设置canvas样式\ngl.canvas.style.width=\"100%\";gl.canvas.style.height=\"100%\";gl.canvas.style.display=\"block\";applyCanvasAttributes(gl.canvas,defaultAccessibilityOptions);gl.clearColor(0,0,0,0);gl.enable(gl.BLEND);gl.blendFunc(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA);// 计算相机参数\nconst distance=1e3;const fov=2*Math.atan(height/2/distance)*(180/Math.PI);// 创建相机\ncamera=new Camera(gl,{fov:fov,aspect:width/height,near:1,far:2e3});camera.position.set(0,0,distance);// 创建场景\nscene=new Transform;// 创建纹理\nconst generateMipmaps=mediaType===\"video\"?false:true;texture=new Texture(gl,{minFilter:generateMipmaps?gl.LINEAR_MIPMAP_LINEAR:gl.LINEAR,magFilter:gl.LINEAR,generateMipmaps:generateMipmaps,premultiplyAlpha:false,unpackAlignment:1,wrapS:gl.CLAMP_TO_EDGE,wrapT:gl.CLAMP_TO_EDGE,format:gl.RGBA,internalFormat:gl.RGBA});// 如果有初始媒体，设置到纹理\nif(media){texture.image=media;}// 计算平面尺寸\nconst planeSize=calculatePlaneSize(dimensions.width||width,dimensions.height||height,width,height,objectFit);// 创建着色器程序\nprogram=new Program(gl,{vertex:vertexShader||defaultVertexShader,fragment:fragmentShader||defaultFragmentShader,uniforms:{uTexture:{value:texture},uMediaSize:{value:[dimensions.width||width,dimensions.height||height]},uPanelSize:{value:[width,height]},uFitMode:{value:objectFit===\"cover\"?1:0},...initialUniformsRef.current},transparent:true,cullFace:null});// 创建几何体\ngeometry=new Plane(gl,{width:planeSize.width,height:planeSize.height});// 创建网格\nmesh=new Mesh(gl,{geometry,program});mesh.setParent(scene);// 存储场景对象\nsceneRef.current={renderer,camera,scene,program,mesh,texture,geometry,gl,updateUniforms:newUniforms=>{Object.keys(newUniforms).forEach(key=>{if(program.uniforms[key]){program.uniforms[key].value=newUniforms[key];}});}};isInitializedRef.current=true;setIsReady(true);};init();// 清理函数\nreturn()=>{// 清理事件监听器\nif(renderer){const gl=renderer.gl;if(gl.canvas&&gl.canvas.parentNode){gl.canvas.parentNode.removeChild(gl.canvas);}const loseContext=gl.getExtension(\"WEBGL_lose_context\");if(loseContext){loseContext.loseContext();}}// 清理引用\nsceneRef.current={};isInitializedRef.current=false;setIsReady(false);};},[media,vertexShader,fragmentShader,objectFit]);// 处理容器尺寸变化\nuseEffect(()=>{if(isInitializedRef.current&&containerSize.width>0&&containerSize.height>0){updateSceneSize(containerSize.width,containerSize.height,objectFit);}},[containerSize,updateSceneSize]);return{sceneRef:sceneRef.current,containerSize,renderFrame,isReady};}\nexport const __FramerMetadata__ = {\"exports\":{\"useOGLScene\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"OGLScene\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","/*\n * UseOGLScene\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/Qdd3eGacdk0a7XalD9lO/LmjERPAe2BydyHLwJYQM/UseOGLScene.js\"\nexport { default } from \"https://framerusercontent.com/modules/Qdd3eGacdk0a7XalD9lO/LmjERPAe2BydyHLwJYQM/UseOGLScene.js\"\n","import{CompatibleMedia,degToRad,propertyControls,useDarkMode,useMediaSource}from\"https://framer.com/m/GLUtils-cYf4.js\";import{calculatePlaneSize,defaultFragmentShader,defaultVertexShader}from\"https://framer.com/m/OGLUtils-LEvG.js\";import{useVariantValues}from\"https://framer.com/m/UseVariantValue-mxjI.js\";import{useAnimatedProgress,useAnimatedValues}from\"https://framer.com/m/UseAnimatedValue-6Bkx.js\";import{useMedia}from\"https://framer.com/m/UseMedia-AW14.js\";import{useOGLScene}from\"https://framer.com/m/UseOGLScene-gg2G.js\";/**\n * GLUtils Tool\n *\n */export{CompatibleMedia,degToRad,propertyControls,useDarkMode,useMediaSource,};/**\n * OGLUtils Tools\n *\n */export{calculatePlaneSize,defaultFragmentShader,defaultVertexShader};/**\n * Variant Value Tools\n *\n */export{useVariantValues};/**\n * Animated Value Tools\n *\n */export{useAnimatedProgress,useAnimatedValues};/**\n * Media Tools\n *\n */export{useMedia};/**\n * Main OGLScene Setup\n *\n */export{useOGLScene};\nexport const __FramerMetadata__ = {\"exports\":{\"propertyControls\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"degToRad\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CompatibleMedia\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAnimatedValues\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMediaSource\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useDarkMode\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useOGLScene\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useMedia\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultFragmentShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"calculatePlaneSize\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useVariantValues\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultVertexShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useAnimatedProgress\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./UseSetup.map","export const vertexShader=`\n    precision mediump float;\n    attribute vec3 position;\n    attribute vec2 uv;\n    uniform mat4 modelViewMatrix;\n    uniform mat4 projectionMatrix;\n    uniform vec2 uMediaSize;\n    uniform vec2 uPanelSize;\n    uniform int uFitMode; // 0: contain, 1: cover\n    varying vec2 vUv;\n    varying vec2 vTextureCoord; \n    \n    void main() {\n        vUv = uv;\n        \n        if (uFitMode == 1) {\n            vec2 ratio = vec2(\n                min((uPanelSize.x / uPanelSize.y) / (uMediaSize.x / uMediaSize.y), 1.0),\n                min((uPanelSize.y / uPanelSize.x) / (uMediaSize.y / uMediaSize.x), 1.0)\n            );\n            vTextureCoord = (uv - 0.5) * ratio + 0.5;\n        } else {\n            vTextureCoord = uv;\n        }\n        \n        gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n    }\n`;export const fragmentShader=`\n    precision mediump float;\n    uniform sampler2D uTexture;\n    uniform vec2 uMediaSize;\n    uniform vec2 uPanelSize;\n    uniform float uTime;\n    \n    uniform float uBlur;           // 模糊强度 (0.0 - 500.0+)\n    uniform float uFalloff;        // 模糊衰减强度 (0.0 - 5.0)\n    uniform float uFalloffType;    // 衰减类型 (0.0:smoothstep, 1.0:二次, 2.0:三次, 3.0:平方根)\n    uniform float uAngle;          // 模糊方向角度 (弧度)\n    uniform vec2 uCenter;          // 参考中心点 (0.0 - 1.0)\n    uniform float uDispersion;     // 色散强度 (0.0 - 5.0)\n    uniform float uNoise;          // 噪点强度 (0.0 - 1.0)\n    uniform float uNoiseBlend;     // 噪点混合模式 (0:无混合, 1:亮色混合, 2:暗色混合, 3:亮暗混合)\n    uniform float uScale;          // 纹理缩放 (0.5 = 凹陷, 1.0 = 无变化, 2.0 = 凸起)\n    uniform vec2 uOrigin;          // falloff起点偏移 (0.0 - 1.0)\n\n    varying vec2 vUv;\n    varying vec2 vTextureCoord;\n    \n    // 常量优化\n    const float PI2 = 6.28318530718;\n    const int SAMPLES = 24; // 从32减少到24，性能提升约25%\n    const float INV_SAMPLES = 1.0 / float(SAMPLES);\n    const vec3 LUMA_WEIGHTS = vec3(0.299, 0.587, 0.114);\n    const float MAX_DIST = 0.70710678118; // sqrt(0.5)\n    \n    // 快速伪随机函数（优化版）\n    float rand(vec2 co) {\n        return fract(sin(dot(co, vec2(12.9898, 78.233))) * 43758.5453);\n    }\n    \n    // 优化的噪点函数\n    float noise(vec2 uv, float time) {\n        return rand(uv + time * 0.1) * 2.0 - 1.0;\n    }\n    \n    // 径向缩放变换（优化版）\n    vec2 applyRadialScale(vec2 uv, float scale) {\n        vec2 fromCenter = uv - 0.5;\n        float distance = length(fromCenter);\n        \n        if (distance < 0.001) return uv;\n        \n        float normalizedDistance = distance * 1.41421356237; // 1/MAX_DIST\n        float transformedDistance = pow(normalizedDistance, scale) * MAX_DIST;\n        \n        return 0.5 + normalize(fromCenter) * transformedDistance;\n    }\n    \n    // 噪点亮度因子计算（优化版）\n    float calculateNoiseLuminanceFactor(float luminance, int blendMode) {\n        if (blendMode == 0) return 1.0;\n        \n        float smoothLum = smoothstep(0.2, 0.8, luminance);\n        \n        if (blendMode == 1) {\n            return 1.0 - smoothLum * smoothLum;\n        } else if (blendMode == 2) {\n            return smoothLum * smoothLum;\n        } else if (blendMode == 3) {\n            float centerBias = 1.0 - abs(luminance - 0.5) * 2.0;\n            return max(pow(centerBias, 1.5), 0.1);\n        }\n        \n        return 1.0;\n    }\n    \n    // 衰减函数（优化版）\n    float applyFalloff(float t, int falloffType) {\n        if (falloffType == 1) return t * t;\n        if (falloffType == 2) return t * t * t;\n        if (falloffType == 3) return sqrt(t);\n        return smoothstep(0.0, 1.0, t);\n    }\n    \n    void main() {\n        // 早期退出检查\n        if (uBlur <= 0.0) {\n            gl_FragColor = texture2D(uTexture, vTextureCoord);\n            return;\n        }\n        \n        // 预计算常量\n        vec2 scaledTextureCoord = applyRadialScale(vTextureCoord, 1.0 + uScale * 0.2);\n        vec2 gradientDirection = vec2(cos(uAngle), sin(uAngle));\n        \n        // 衰减计算（优化版）\n        vec2 fromOrigin = vUv - uOrigin;\n        float projectionOnGradient = dot(fromOrigin, gradientDirection);\n        float falloffDistance = clamp(max(projectionOnGradient, 0.0) / 0.7, 0.0, 1.0);\n        \n        int falloffType = int(uFalloffType + 0.5);\n        float falloffCurve = applyFalloff(falloffDistance, falloffType);\n        float reversedFalloff = 1.0 - falloffCurve;\n        float blurStrength = mix(uBlur, reversedFalloff * uBlur, clamp(uFalloff, 0.0, 1.0));\n        \n        // 预计算采样参数\n        float dispersionFalloffStrength = mix(uDispersion, reversedFalloff * uDispersion, clamp(uFalloff, 0.0, 1.0));\n        float dispersionStrength = dispersionFalloffStrength * blurStrength * 0.5;\n        vec2 texelSize = 1.0 / uMediaSize;\n        vec2 panelTexelRatio = uPanelSize / uMediaSize;\n        float baseRadius = blurStrength * max(texelSize.x, texelSize.y) * max(panelTexelRatio.x, panelTexelRatio.y) * 0.5;\n        vec2 dispersionDirection = vec2(-sin(uAngle), cos(uAngle));\n        \n        // 预计算色散偏移\n        vec2 redOffset = dispersionDirection * dispersionStrength * texelSize * -0.7;\n        vec2 blueOffset = dispersionDirection * dispersionStrength * texelSize * 0.7;\n        \n        // 优化的采样循环\n        vec3 channelColors = vec3(0.0);\n        float totalWeight = 0.0;\n        \n        // 噪点参数预计算\n        bool hasNoise = uNoise > 0.0;\n        float noiseInfluence = uNoise * 0.3;\n        \n        for (int i = 0; i < SAMPLES; i++) {\n            float fi = float(i);\n            float angle = fi * INV_SAMPLES * PI2;\n            vec2 circleDir = vec2(cos(angle), sin(angle));\n            \n            // 随机偏移计算\n            float randomOffset = rand(vec2(fi, vUv.x + vUv.y)) * 0.5 + 0.5;\n            \n            if (hasNoise) {\n                float noiseValue = noise(vUv + vec2(fi * 0.1), uTime);\n                randomOffset += noiseValue * noiseInfluence;\n            }\n            randomOffset = clamp(randomOffset, 0.1, 1.0);\n            \n            vec2 baseSampleOffset = circleDir * baseRadius * randomOffset;\n            \n            // 权重计算\n            float baseWeight = 1.0 - smoothstep(0.0, 1.0, length(baseSampleOffset) / baseRadius);\n            \n            if (hasNoise) {\n                float weightNoise = noise(vUv + vec2(fi * 0.05), uTime * 0.5);\n                baseWeight *= (1.0 + weightNoise * uNoise * 0.2);\n            }\n            baseWeight = max(baseWeight, 0.0);\n            \n            // RGB通道采样（合并到单次计算）\n            vec2 sampleCoord = clamp(scaledTextureCoord + baseSampleOffset, 0.0, 1.0);\n            vec4 centerSample = texture2D(uTexture, sampleCoord);\n            vec4 redSample = texture2D(uTexture, clamp(sampleCoord + redOffset, 0.0, 1.0));\n            vec4 blueSample = texture2D(uTexture, clamp(sampleCoord + blueOffset, 0.0, 1.0));\n            \n            float weight = baseWeight;\n            channelColors.r += redSample.r * redSample.a * weight;\n            channelColors.g += centerSample.g * centerSample.a * weight;\n            channelColors.b += blueSample.b * blueSample.a * weight;\n            totalWeight += weight;\n        }\n        \n        // 归一化\n        vec4 fallbackColor = texture2D(uTexture, scaledTextureCoord);\n        channelColors = (totalWeight > 0.0) ? channelColors / totalWeight : fallbackColor.rgb * fallbackColor.a;\n        \n        // 噪点处理（优化版）\n        if (hasNoise) {\n            float finalNoise = noise(vUv * 10.0, uTime * 2.0);\n            float luminance = dot(channelColors, LUMA_WEIGHTS);\n            \n            float noiseStrength = uNoise;\n            int blendMode = int(uNoiseBlend + 0.5);\n            \n            if (blendMode > 0) {\n                float luminanceFactor = calculateNoiseLuminanceFactor(luminance, blendMode);\n                noiseStrength *= luminanceFactor;\n            }\n            \n            // 特殊处理亮暗混合模式\n            float adjustedNoise = finalNoise;\n            if (blendMode == 3) {\n                if (luminance > 0.8) {\n                    adjustedNoise = abs(finalNoise) * sign(finalNoise) * 0.3;\n                } else if (luminance < 0.2) {\n                    adjustedNoise *= 0.5;\n                }\n            }\n            \n            vec3 noiseContribution = vec3(adjustedNoise * noiseStrength * 0.1);\n            channelColors = clamp(channelColors + noiseContribution, 0.0, 1.0);\n        }\n        \n        float finalAlpha = max(fallbackColor.a, (blurStrength > 0.0) ? min(blurStrength * 0.01, 1.0) : 0.0);\n        gl_FragColor = vec4(channelColors, finalAlpha);\n    }\n`;\nexport const __FramerMetadata__ = {\"exports\":{\"vertexShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fragmentShader\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Shaders.map","import{jsx as _jsx}from\"react/jsx-runtime\";import{useRef,useEffect,useMemo}from\"react\";import{useIsStaticRenderer}from\"framer\";import{useAnimationFrame}from\"framer-motion\";import{vertexShader,fragmentShader}from\"https://framerusercontent.com/modules/jypow408LDgPDnL677k2/Dg0auyGnIrsdg2LBcXmt/Shaders.js\";import{degToRad,useAnimatedProgress,useAnimatedValues,useMedia,useOGLScene,useVariantValues}from\"https://framerusercontent.com/modules/mSJ52dBkVivlfYMsRpwj/z319KePspYG0E1KkmAJd/UseSetup.js\";export const OGLScene=({imageAlt,mediaSrc,mediaType,loop,fit,blur,angle,falloff,advance,animateProp,transitionProp,accessibility,ariaLabel,onLoad,onError,onVideoEnd,onAnimationComplete})=>{const mountRef=useRef(null);const isStaticRenderer=useIsStaticRenderer();const{media,dimensions,isLoaded,isError,isVideoPlaying,playVideo,pauseVideo}=useMedia(mediaSrc,mediaType,loop,!isStaticRenderer);const{sceneRef,renderFrame,containerSize,isReady}=useOGLScene(mountRef,media,dimensions,mediaType,{autoStart:false,vertexShader,fragmentShader,objectFit:fit,uniforms:{uBlur:{value:blur},uAngle:{value:degToRad(angle)},uFalloff:{value:falloff},uFalloffType:{value:advance.falloffType},uScale:{value:advance.scale},uDispersion:{value:advance.dispersion},uNoise:{value:advance.noise},uNoiseBlend:{value:advance.noiseBlend},uOrigin:{value:[advance.originX,advance.originY]}},accessibilityOptions:{ariaLabel:accessibility.enableAria?ariaLabel:mediaType===\"video\"?\"\":imageAlt,role:mediaType===\"video\"?\"video\":\"img\",tabIndex:null}});// 在属性变化时，在 Framer Canvas 上进行一次渲染\nuseEffect(()=>{if(!isStaticRenderer||!isLoaded||!isReady)return;if(sceneRef.renderer){sceneRef.updateUniforms({uBlur:blur,uAngle:degToRad(angle),uFalloff:falloff,uFalloffType:advance.falloffType,uScale:advance.scale,uDispersion:advance.dispersion,uNoise:advance.noise,uNoiseBlend:advance.noiseBlend,uOrigin:[advance.originX,advance.originY]});renderFrame();}},[isLoaded,isReady,sceneRef,fit,blur,angle,falloff,advance,containerSize,isStaticRenderer]);// 在媒体类型和来源变化时，在 Framer Canvas 上进行一次渲染\nuseEffect(()=>{if(!isStaticRenderer||!isLoaded)return;if(sceneRef.renderer){renderFrame();const timeoutId=setTimeout(()=>{renderFrame();},300);return()=>{clearTimeout(timeoutId);};}},[isLoaded,isStaticRenderer]);// 配置自定义动画参数，只有当 animateProp.custom.enable 启用时才生效\nconst animationConfig=useMemo(()=>({blur:{from:blur,to:animateProp.custom.blur},angle:{from:angle,to:animateProp.custom.angle},falloff:{from:falloff,to:animateProp.custom.falloff},scale:{from:advance.scale,to:animateProp.custom.scale},dispersion:{from:advance.dispersion,to:animateProp.custom.dispersion},noise:{from:advance.noise,to:animateProp.custom.noise}}),[blur,angle,falloff,advance,animateProp.custom]);const customEnable=animateProp.custom.enable;const transition=useMemo(()=>({...transitionProp}),[transitionProp]);// 进度动画，适用于 appear\\enter\\transform\nconst{progress,isUpdatingProgress}=useAnimatedProgress(animateProp,transition,mountRef,!customEnable);// 自定义动画，适用于 appear\\enter\\transform\nconst{values,isUpdating}=useAnimatedValues(animationConfig,animateProp,transition,mountRef,customEnable);// 自定义动画，适用于 variant\nconst variantConfig=useMemo(()=>({blur:blur,angle:angle,falloff:falloff,dispersion:advance.dispersion,scale:advance.scale,noise:advance.noise,originX:advance.originX,originY:advance.originY}),[blur,angle,falloff,advance]);const{variantValue,isVariantUpdating}=useVariantValues(variantConfig,transition,animateProp.type===\"variant\");// 为 uniforms 选择更新模式\nconst calculateCustomUniforms=useMemo(()=>{// variant 模式：使用固定的基础值，但仍然是动画值\nif(animateProp.type===\"variant\"){return values=>({uBlur:variantValue.blur.get(),uAngle:degToRad(variantValue.angle.get()),uFalloff:variantValue.falloff.get(),uDispersion:variantValue.dispersion.get(),uScale:variantValue.scale.get(),uNoise:variantValue.noise.get(),uOrigin:[variantValue.originX.get(),variantValue.originY.get()]});}// 非 variant 时，根据 customEnable 决定\nif(customEnable){// custom 模式：使用 values 中的动画值\nreturn values=>({uBlur:values.blur,uAngle:degToRad(values.angle),uNoise:values.noise,uFalloff:values.falloff,uScale:values.scale,uDispersion:values.dispersion,uOrigin:[values.originX,values.originY]});}else{// progress 模式：使用基础值乘以进度\nreturn(_,progress)=>({uBlur:blur*progress,uScale:advance.scale*progress});}},[animateProp.type,customEnable,blur,angle,falloff,advance]);// 在最终页面上尺寸变化时、媒体载入时进行一次渲染\nuseEffect(()=>{if(isStaticRenderer||!isLoaded||!isReady)return;if(sceneRef.renderer){renderFrame();}if(onLoad&&typeof onLoad===\"function\"){onLoad();}},[isLoaded,isReady,sceneRef,containerSize,isStaticRenderer,onLoad]);// 在最终页面上尺寸变化时进行渲染\nuseAnimationFrame(time=>{if(isStaticRenderer||!isLoaded||!isReady)return;if(sceneRef.renderer){const shouldUpdate=advance.render===\"always\"||animateProp.type===\"variant\"||isUpdating||isUpdatingProgress||isVideoPlaying;if(shouldUpdate){sceneRef.updateUniforms(calculateCustomUniforms(values,progress));renderFrame();}}});// 在最终页面上触发事件\nconst prevStateRef=useRef({isError,isVideoPlaying,isUpdating,isUpdatingProgress,isVariantUpdating});useEffect(()=>{if(isStaticRenderer)return;if(isError&&!prevStateRef.current.isError&&onError&&typeof onError===\"function\"){onError();}prevStateRef.current.isError=isError;},[isStaticRenderer,isError,onError]);useEffect(()=>{if(isStaticRenderer)return;if(!isVideoPlaying&&prevStateRef.current.isVideoPlaying&&onVideoEnd&&typeof onVideoEnd===\"function\"){onVideoEnd();}prevStateRef.current.isVideoPlaying=isVideoPlaying;},[isStaticRenderer,isVideoPlaying,onVideoEnd]);useEffect(()=>{if(isStaticRenderer)return;const allCurrentlyFalse=!isUpdating&&!isUpdatingProgress&&!isVariantUpdating;const prevHadTrueValue=prevStateRef.current.isUpdating||prevStateRef.current.isUpdatingProgress||prevStateRef.current.isVariantUpdating;if(allCurrentlyFalse&&prevHadTrueValue&&onAnimationComplete&&typeof onAnimationComplete===\"function\"){onAnimationComplete();}prevStateRef.current.isUpdating=isUpdating;prevStateRef.current.isUpdatingProgress=isUpdatingProgress;prevStateRef.current.isVariantUpdating=isVariantUpdating;},[isStaticRenderer,isUpdating,isUpdatingProgress,isVariantUpdating,onAnimationComplete]);return /*#__PURE__*/_jsx(\"div\",{ref:mountRef,style:{width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\"}});};\nexport const __FramerMetadata__ = {\"exports\":{\"OGLScene\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","/*\n * Unfocused+ was created by Jayzhushi. Visit Reveals.cool to learn more.\n * For assistance, contact x.com/jayzhushi or email jayzhushi@gmail.com.\n * This component is licensed under the BSD License.\n */import{jsx as _jsx}from\"react/jsx-runtime\";import{ControlType,addPropertyControls,useReducedMotion}from\"framer\";import{CompatibleMedia,propertyControls,useMediaSource}from\"https://framerusercontent.com/modules/mSJ52dBkVivlfYMsRpwj/z319KePspYG0E1KkmAJd/UseSetup.js\";import{OGLScene}from\"https://framerusercontent.com/modules/7zxjrN9X6oe3IFas7UpS/imR8plZxz6TwO8xlwuod/OGL.js\";/**\n *\n * @framerIntrinsicWidth 600\n * @framerIntrinsicHeight 800\n *\n * @framerDisableUnlink\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n *\n */function Unfocused({type,file,upImage,urlVideo,upVideo,defaultImage,dark,darkImage,loop,fit,blur,angle,falloff,advance,animateProp,transition,accessibility,ariaLabel,onLoad,onError,onVideoEnd,onAnimationComplete}){const{imageAlt,mediaSrc,mediaType}=useMediaSource(type,file,urlVideo,upVideo,defaultImage,darkImage,dark,\"arch_dark\");const shouldReduceMotion=useReducedMotion();if(accessibility.compatibility||accessibility.reduce&&shouldReduceMotion){return /*#__PURE__*/_jsx(CompatibleMedia,{mediaType:mediaType,mediaSrc:mediaSrc,imageAlt:imageAlt,fit:fit,loop:loop});}return /*#__PURE__*/_jsx(OGLScene,{mediaType:mediaType,mediaSrc:mediaSrc,imageAlt:imageAlt,loop:loop,fit:fit,blur:blur,angle:angle,falloff:falloff,advance:advance,animateProp:animateProp,transitionProp:transition,accessibility:accessibility,ariaLabel:ariaLabel,onLoad:onLoad,onError:onError,onVideoEnd:onVideoEnd,onAnimationComplete:onAnimationComplete});}export default Unfocused;Unfocused.displayName=\"Unfocused+\";addPropertyControls(Unfocused,{...propertyControls.media,...propertyControls.size,blur:{type:ControlType.Number,title:\"Blur\",displayStepper:false,step:1,max:1e3,min:0,defaultValue:200},angle:{type:ControlType.Number,title:\"Angle\",displayStepper:false,step:1,max:360,min:0,unit:\"\\xb0\",defaultValue:45},falloff:{type:ControlType.Number,title:\"Falloff\",displayStepper:false,step:.1,max:1,min:0,defaultValue:1},advance:{type:ControlType.Object,title:\"Advance\",buttonTitle:\"Advance\",icon:\"effect\",controls:{falloffType:{type:ControlType.Enum,title:\"Type\",options:[0,1,2,3],optionTitles:[\"Linear\",\"Quadratic\",\"Cubic\",\"Square\"],defaultValue:0},originX:{type:ControlType.Number,title:\"Origin X\",displayStepper:true,step:.1,max:1,min:0,defaultValue:0},originY:{type:ControlType.Number,title:\"Origin Y\",displayStepper:true,step:.1,max:1,min:0,defaultValue:.5},scale:{type:ControlType.Number,title:\"Distortion\",displayStepper:true,step:.1,max:1,min:-1,defaultValue:0},dispersion:{type:ControlType.Number,title:\"Dispersion\",displayStepper:true,step:.1,max:1,min:0,defaultValue:.2,description:\"Affected by *Blur*.\"},noise:{type:ControlType.Number,title:\"Noise\",displayStepper:true,step:.1,max:1,min:0,defaultValue:1},noiseBlend:{type:ControlType.Enum,title:\"Blend\",options:[0,1,2,3],optionTitles:[\"None\",\"Lighter\",\"Darker\",\"Both\"],defaultValue:0,hidden(props){return props.noise===0;}}}},animateProp:{type:ControlType.Object,title:\"Animation\",buttonTitle:\"Animation\",icon:\"interaction\",controls:{...propertyControls.animateControls,custom:{type:ControlType.Object,title:\"Custom\",buttonTitle:\"Custom\",icon:\"effect\",hidden(props){return props.type===\"disable\"||props.type===\"variant\";},controls:{enable:{type:ControlType.Boolean,title:\"Enable\",defaultValue:false,description:\"Customize the animation target value for each property.\"},blur:{type:ControlType.Number,title:\"Blur\",displayStepper:false,step:1,max:1e3,min:0,defaultValue:40,hidden(props){return!props.enable;}},angle:{type:ControlType.Number,title:\"Angle\",displayStepper:false,step:1,max:360,min:0,unit:\"\\xb0\",defaultValue:0,hidden(props){return!props.enable;}},falloff:{type:ControlType.Number,title:\"Falloff\",displayStepper:false,step:.1,max:1,min:0,defaultValue:1,hidden(props){return!props.enable;}},scale:{type:ControlType.Number,title:\"Distortion\",displayStepper:true,step:.1,max:1,min:-1,defaultValue:0},dispersion:{type:ControlType.Number,title:\"Dispersion\",displayStepper:true,step:.1,max:1,min:0,defaultValue:.2,hidden(props){return!props.enable;}},noise:{type:ControlType.Number,title:\"Noise\",displayStepper:true,step:.1,max:1,min:0,defaultValue:1,hidden(props){return!props.enable;}}}}}},transition:{type:ControlType.Transition,title:\"Transition\",defaultValue:{ease:\"linear\",duration:2}},...propertyControls.accessibility,...propertyControls.eventHandler});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"Unfocused\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"600\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerDisableUnlink\":\"*\",\"framerIntrinsicHeight\":\"800\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Unfocused.map"],"mappings":"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"}