UNPKG

@react-three/drei

Version:

useful add-ons for react-three-fiber

1 lines 372 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("react-dom/client"),n=require("three"),a=require("@react-three/fiber"),o=require("zustand"),i=require("@use-gesture/react"),s=require("maath"),l=require("zustand/middleware"),c=require("three-stdlib"),u=require("zustand/shallow"),m=require("troika-three-text"),d=require("suspend-react"),f=require("meshline"),p=require("camera-controls"),h=require("hls.js"),x=require("stats.js"),y=require("stats-gl"),v=require("detect-gpu"),g=require("three-mesh-bvh"),w=require("@monogrid/gainmap-js"),z=require("tunnel-rat");function b(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function E(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var M=b(e),S=E(t),T=E(r),C=E(n),P=b(p),R=b(x),D=b(y),F=b(z);const k=new n.Vector3,_=new n.Vector3,A=new n.Vector3,L=new n.Vector2;function I(e,t,r){const n=k.setFromMatrixPosition(e.matrixWorld);n.project(t);const a=r.width/2,o=r.height/2;return[n.x*a+a,-n.y*o+o]}const B=e=>Math.abs(e)<1e-10?0:e;function V(e,t,r=""){let n="matrix3d(";for(let r=0;16!==r;r++)n+=B(t[r]*e.elements[r])+(15!==r?",":")");return r+n}const U=(O=[1,-1,1,1,1,-1,1,1,1,-1,1,1,1,-1,1,1],e=>V(e,O));var O;const N=(e,t)=>{return V(e,[1/(r=t),1/r,1/r,1,-1/r,-1/r,-1/r,-1,1/r,1/r,1/r,1,1,1,1,1],"translate(-50%,-50%)");var r};const j=S.forwardRef((({children:e,eps:t=.001,style:r,className:o,prepend:i,center:s,fullscreen:l,portal:c,distanceFactor:u,sprite:m=!1,transform:d=!1,occlude:f,onOcclude:p,castShadow:h,receiveShadow:x,material:y,geometry:v,zIndexRange:g=[16777271,0],calculatePosition:w=I,as:z="div",wrapperClass:b,pointerEvents:E="auto",...C},P)=>{const{gl:R,camera:D,scene:F,size:V,raycaster:O,events:j,viewport:W}=a.useThree(),[G]=S.useState((()=>document.createElement(z))),H=S.useRef(null),$=S.useRef(null),q=S.useRef(0),X=S.useRef([0,0]),Z=S.useRef(null),Y=S.useRef(null),Q=(null==c?void 0:c.current)||j.connected||R.domElement.parentNode,K=S.useRef(null),J=S.useRef(!1),ee=S.useMemo((()=>f&&"blending"!==f||Array.isArray(f)&&f.length&&function(e){return e&&"object"==typeof e&&"current"in e}(f[0])),[f]);S.useLayoutEffect((()=>{const e=R.domElement;f&&"blending"===f?(e.style.zIndex=`${Math.floor(g[0]/2)}`,e.style.position="absolute",e.style.pointerEvents="none"):(e.style.zIndex=null,e.style.position=null,e.style.pointerEvents=null)}),[f]),S.useLayoutEffect((()=>{if($.current){const e=H.current=T.createRoot(G);if(F.updateMatrixWorld(),d)G.style.cssText="position:absolute;top:0;left:0;pointer-events:none;overflow:hidden;";else{const e=w($.current,D,V);G.style.cssText=`position:absolute;top:0;left:0;transform:translate3d(${e[0]}px,${e[1]}px,0);transform-origin:0 0;`}return Q&&(i?Q.prepend(G):Q.appendChild(G)),()=>{Q&&Q.removeChild(G),e.unmount()}}}),[Q,d]),S.useLayoutEffect((()=>{b&&(G.className=b)}),[b]);const te=S.useMemo((()=>d?{position:"absolute",top:0,left:0,width:V.width,height:V.height,transformStyle:"preserve-3d",pointerEvents:"none"}:{position:"absolute",transform:s?"translate3d(-50%,-50%,0)":"none",...l&&{top:-V.height/2,left:-V.width/2,width:V.width,height:V.height},...r}),[r,s,l,V,d]),re=S.useMemo((()=>({position:"absolute",pointerEvents:E})),[E]);S.useLayoutEffect((()=>{var t,n;(J.current=!1,d)?null==(t=H.current)||t.render(S.createElement("div",{ref:Z,style:te},S.createElement("div",{ref:Y,style:re},S.createElement("div",{ref:P,className:o,style:r,children:e})))):null==(n=H.current)||n.render(S.createElement("div",{ref:P,style:te,className:o,children:e}))}));const ne=S.useRef(!0);a.useFrame((e=>{if($.current){D.updateMatrixWorld(),$.current.updateWorldMatrix(!0,!1);const e=d?X.current:w($.current,D,V);if(d||Math.abs(q.current-D.zoom)>t||Math.abs(X.current[0]-e[0])>t||Math.abs(X.current[1]-e[1])>t){const t=function(e,t){const r=k.setFromMatrixPosition(e.matrixWorld),n=_.setFromMatrixPosition(t.matrixWorld),a=r.sub(n),o=t.getWorldDirection(A);return a.angleTo(o)>Math.PI/2}($.current,D);let r=!1;ee&&(Array.isArray(f)?r=f.map((e=>e.current)):"blending"!==f&&(r=[F]));const a=ne.current;if(r){const e=function(e,t,r,n){const a=k.setFromMatrixPosition(e.matrixWorld),o=a.clone();o.project(t),L.set(o.x,o.y),r.setFromCamera(L,t);const i=r.intersectObjects(n,!0);if(i.length){const e=i[0].distance;return a.distanceTo(r.ray.origin)<e}return!0}($.current,D,O,r);ne.current=e&&!t}else ne.current=!t;a!==ne.current&&(p?p(!ne.current):G.style.display=ne.current?"block":"none");const o=Math.floor(g[0]/2),i=f?ee?[g[0],o]:[o-1,0]:g;if(G.style.zIndex=`${function(e,t,r){if(t instanceof n.PerspectiveCamera||t instanceof n.OrthographicCamera){const n=k.setFromMatrixPosition(e.matrixWorld),a=_.setFromMatrixPosition(t.matrixWorld),o=n.distanceTo(a),i=(r[1]-r[0])/(t.far-t.near),s=r[1]-i*t.far;return Math.round(i*o+s)}}($.current,D,i)}`,d){const[e,t]=[V.width/2,V.height/2],r=D.projectionMatrix.elements[5]*t,{isOrthographicCamera:n,top:a,left:o,bottom:i,right:s}=D,l=U(D.matrixWorldInverse),c=n?`scale(${r})translate(${B(-(s+o)/2)}px,${B((a+i)/2)}px)`:`translateZ(${r}px)`;let d=$.current.matrixWorld;m&&(d=D.matrixWorldInverse.clone().transpose().copyPosition(d).scale($.current.scale),d.elements[3]=d.elements[7]=d.elements[11]=0,d.elements[15]=1),G.style.width=V.width+"px",G.style.height=V.height+"px",G.style.perspective=n?"":`${r}px`,Z.current&&Y.current&&(Z.current.style.transform=`${c}${l}translate(${e}px,${t}px)`,Y.current.style.transform=N(d,1/((u||10)/400)))}else{const t=void 0===u?1:function(e,t){if(t instanceof n.OrthographicCamera)return t.zoom;if(t instanceof n.PerspectiveCamera){const r=k.setFromMatrixPosition(e.matrixWorld),n=_.setFromMatrixPosition(t.matrixWorld),a=t.fov*Math.PI/180,o=r.distanceTo(n);return 1/(2*Math.tan(a/2)*o)}return 1}($.current,D)*u;G.style.transform=`translate3d(${e[0]}px,${e[1]}px,0) scale(${t})`}X.current=e,q.current=D.zoom}}if(!ee&&K.current&&!J.current)if(d){if(Z.current){const e=Z.current.children[0];if(null!=e&&e.clientWidth&&null!=e&&e.clientHeight){const{isOrthographicCamera:t}=D;if(t||v)C.scale&&(Array.isArray(C.scale)?C.scale instanceof n.Vector3?K.current.scale.copy(C.scale.clone().divideScalar(1)):K.current.scale.set(1/C.scale[0],1/C.scale[1],1/C.scale[2]):K.current.scale.setScalar(1/C.scale));else{const t=(u||10)/400,r=e.clientWidth*t,n=e.clientHeight*t;K.current.scale.set(r,n,1)}J.current=!0}}}else{const t=G.children[0];if(null!=t&&t.clientWidth&&null!=t&&t.clientHeight){const e=1/W.factor,r=t.clientWidth*e,n=t.clientHeight*e;K.current.scale.set(r,n,1),J.current=!0}K.current.lookAt(e.camera.position)}}));const ae=S.useMemo((()=>({vertexShader:d?void 0:'\n /*\n This shader is from the THREE\'s SpriteMaterial.\n We need to turn the backing plane into a Sprite\n (make it always face the camera) if "transfrom"\n is false.\n */\n #include <common>\n\n void main() {\n vec2 center = vec2(0., 1.);\n float rotation = 0.0;\n\n // This is somewhat arbitrary, but it seems to work well\n // Need to figure out how to derive this dynamically if it even matters\n float size = 0.03;\n\n vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n vec2 scale;\n scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\n bool isPerspective = isPerspectiveMatrix( projectionMatrix );\n if ( isPerspective ) scale *= - mvPosition.z;\n\n vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale * size;\n vec2 rotatedPosition;\n rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n mvPosition.xy += rotatedPosition;\n\n gl_Position = projectionMatrix * mvPosition;\n }\n ',fragmentShader:"\n void main() {\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n "})),[d]);return S.createElement("group",M.default({},C,{ref:$}),f&&!ee&&S.createElement("mesh",{castShadow:h,receiveShadow:x,ref:K},v||S.createElement("planeGeometry",null),y||S.createElement("shaderMaterial",{side:n.DoubleSide,vertexShader:ae.vertexShader,fragmentShader:ae.fragmentShader})))}));let W=0;const G=o.create((e=>(n.DefaultLoadingManager.onStart=(t,r,n)=>{e({active:!0,item:t,loaded:r,total:n,progress:(r-W)/(n-W)*100})},n.DefaultLoadingManager.onLoad=()=>{e({active:!1})},n.DefaultLoadingManager.onError=t=>e((e=>({errors:[...e.errors,t]}))),n.DefaultLoadingManager.onProgress=(t,r,n)=>{r===n&&(W=n),e({active:!0,item:t,loaded:r,total:n,progress:(r-W)/(n-W)*100||100})},{errors:[],active:!1,progress:0,item:"",loaded:0,total:0})));const H=e=>`Loading ${e.toFixed(2)}%`;const $={container:{position:"absolute",top:0,left:0,width:"100%",height:"100%",background:"#171717",display:"flex",alignItems:"center",justifyContent:"center",transition:"opacity 300ms ease",zIndex:1e3},inner:{width:100,height:3,background:"#272727",textAlign:"center"},bar:{height:3,width:"100%",background:"white",transition:"transform 200ms",transformOrigin:"left center"},data:{display:"inline-block",position:"relative",fontVariantNumeric:"tabular-nums",marginTop:"0.8em",color:"#f0f0f0",fontSize:"0.6em",fontFamily:'-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", "Helvetica Neue", Helvetica, Arial, Roboto, Ubuntu, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',whiteSpace:"nowrap"}},q=S.createContext(null);function X(){return S.useContext(q)}const Z=S.forwardRef((({children:e},t)=>{const r=S.useRef(null);S.useImperativeHandle(t,(()=>r.current),[]);const n=X(),{width:o,height:i}=a.useThree((e=>e.viewport));return a.useFrame((()=>{r.current.position.x=n.horizontal?-o*(n.pages-1)*n.offset:0,r.current.position.y=n.horizontal?0:i*(n.pages-1)*n.offset})),S.createElement("group",{ref:r},e)})),Y=S.forwardRef((({children:e,style:t,...r},n)=>{const o=X(),i=S.useRef(null);S.useImperativeHandle(n,(()=>i.current),[]);const{width:s,height:l}=a.useThree((e=>e.size)),c=S.useContext(a.context),u=S.useMemo((()=>T.createRoot(o.fixed)),[o.fixed]);return a.useFrame((()=>{o.delta>o.eps&&(i.current.style.transform=`translate3d(${o.horizontal?-s*(o.pages-1)*o.offset:0}px,${o.horizontal?0:l*(o.pages-1)*-o.offset}px,0)`)})),u.render(S.createElement("div",M.default({ref:i,style:{...t,position:"absolute",top:0,left:0,willChange:"transform"}},r),S.createElement(q.Provider,{value:o},S.createElement(a.context.Provider,{value:c},e)))),null})),Q=S.forwardRef((({html:e,...t},r)=>{const n=e?Y:Z;return S.createElement(n,M.default({ref:r},t))}));const K=S.createContext(null);const J=S.createContext([]);const ee=S.forwardRef((function({children:e,follow:t=!0,lockX:r=!1,lockY:o=!1,lockZ:i=!1,...s},l){const c=S.useRef(null),u=S.useRef(null),m=new n.Quaternion;return a.useFrame((({camera:e})=>{if(!t||!u.current)return;const n=c.current.rotation.clone();u.current.updateMatrix(),u.current.updateWorldMatrix(!1,!1),u.current.getWorldQuaternion(m),e.getWorldQuaternion(c.current.quaternion).premultiply(m.invert()),r&&(c.current.rotation.x=n.x),o&&(c.current.rotation.y=n.y),i&&(c.current.rotation.z=n.z)})),S.useImperativeHandle(l,(()=>u.current),[]),S.createElement("group",M.default({ref:u},s),S.createElement("group",{ref:c},e))})),te=S.forwardRef((({children:e,depth:t=-1,...r},n)=>{const o=S.useRef(null);return S.useImperativeHandle(n,(()=>o.current),[]),a.useFrame((({camera:e})=>{o.current.quaternion.copy(e.quaternion),o.current.position.copy(e.position)})),S.createElement("group",M.default({ref:o},r),S.createElement("group",{"position-z":-t},e))})),re=new C.Vector3,ne=new C.Vector3,ae=new C.Vector3,oe=(e,t,r,n=1)=>{const a=re.set(e.x/r.width*2-1,-e.y/r.height*2+1,n);return a.unproject(t),a},ie=(e,t,r,n)=>{const a=((e,t,r)=>{const n=r.width/2,a=r.height/2;t.updateMatrixWorld(!1);const o=e.project(t);return o.x=o.x*n+n,o.y=-o.y*a+a,o})(ae.copy(e),r,n);let o=0;for(let i=0;i<2;++i){const s=ne.copy(a).setComponent(i,a.getComponent(i)+t),l=oe(s,r,n,s.z);o=Math.max(o,e.distanceTo(l))}return o},se=new n.Vector3,le=t.forwardRef((({scale:e=1,...r},n)=>{const o=t.useRef(null);return S.useImperativeHandle(n,(()=>o.current),[]),a.useFrame((t=>{const r=o.current;if(!r)return;const n=ie(r.getWorldPosition(se),e,t.camera,t.size);r.scale.setScalar(n*e)})),S.createElement("object3D",M.default({ref:o},r))})),ce=S.forwardRef((function({points:e,color:t=16777215,vertexColors:r,linewidth:o,lineWidth:i,segments:s,dashed:l,...u},m){var d,f;const p=a.useThree((e=>e.size)),h=S.useMemo((()=>s?new c.LineSegments2:new c.Line2),[s]),[x]=S.useState((()=>new c.LineMaterial)),y=4===(null==r||null==(d=r[0])?void 0:d.length)?4:3,v=S.useMemo((()=>{const a=s?new c.LineSegmentsGeometry:new c.LineGeometry,o=e.map((e=>{const t=Array.isArray(e);return e instanceof n.Vector3||e instanceof n.Vector4?[e.x,e.y,e.z]:e instanceof n.Vector2?[e.x,e.y,0]:t&&3===e.length?[e[0],e[1],e[2]]:t&&2===e.length?[e[0],e[1],0]:e}));if(a.setPositions(o.flat()),r){t=16777215;const e=r.map((e=>e instanceof n.Color?e.toArray():e));a.setColors(e.flat(),y)}return a}),[e,s,r,y]);return S.useLayoutEffect((()=>{h.computeLineDistances()}),[e,h]),S.useLayoutEffect((()=>{l?x.defines.USE_DASH="":delete x.defines.USE_DASH,x.needsUpdate=!0}),[l,x]),S.useEffect((()=>()=>{v.dispose(),x.dispose()}),[v]),S.createElement("primitive",M.default({object:h,ref:m},u),S.createElement("primitive",{object:v,attach:"geometry"}),S.createElement("primitive",M.default({object:x,attach:"material",color:t,vertexColors:Boolean(r),resolution:[p.width,p.height],linewidth:null!==(f=null!=o?o:i)&&void 0!==f?f:1,dashed:l,transparent:4===y},u)))})),ue=new n.Vector3,me=S.forwardRef((function({start:e=[0,0,0],end:t=[0,0,0],mid:r,segments:a=20,...o},i){const s=S.useRef(null);S.useImperativeHandle(i,(()=>s.current));const[l]=S.useState((()=>new n.QuadraticBezierCurve3(void 0,void 0,void 0))),c=S.useCallback(((e,t,r,a=20)=>(e instanceof n.Vector3?l.v0.copy(e):l.v0.set(...e),t instanceof n.Vector3?l.v2.copy(t):l.v2.set(...t),r instanceof n.Vector3?l.v1.copy(r):Array.isArray(r)?l.v1.set(...r):l.v1.copy(l.v0.clone().add(l.v2.clone().sub(l.v0)).add(ue.set(0,l.v0.y-l.v2.y,0))),l.getPoints(a))),[]);S.useLayoutEffect((()=>{s.current.setPoints=(e,t,r)=>{const n=c(e,t,r);s.current.geometry&&s.current.geometry.setPositions(n.map((e=>e.toArray())).flat())}}),[]);const u=S.useMemo((()=>c(e,t,r,a)),[e,t,r,a]);return S.createElement(ce,M.default({ref:s,points:u},o))})),de=S.forwardRef((function({start:e,end:t,midA:r,midB:a,segments:o=20,...i},s){const l=S.useMemo((()=>{const i=e instanceof n.Vector3?e:new n.Vector3(...e),s=t instanceof n.Vector3?t:new n.Vector3(...t),l=r instanceof n.Vector3?r:new n.Vector3(...r),c=a instanceof n.Vector3?a:new n.Vector3(...a);return new n.CubicBezierCurve3(i,l,c,s).getPoints(o)}),[e,t,r,a,o]);return S.createElement(ce,M.default({ref:s,points:l},i))})),fe=S.forwardRef((function({points:e,closed:t=!1,curveType:r="centripetal",tension:a=.5,segments:o=20,vertexColors:i,...s},l){const c=S.useMemo((()=>{const o=e.map((e=>e instanceof n.Vector3?e:new n.Vector3(...e)));return new n.CatmullRomCurve3(o,t,r,a)}),[e,t,r,a]),u=S.useMemo((()=>c.getPoints(o)),[c,o]),m=S.useMemo((()=>{if(!i||i.length<2)return;if(i.length===o+1)return i;const e=i.map((e=>e instanceof n.Color?e:new n.Color(...e)));t&&e.push(e[0].clone());const r=[e[0]],a=o/(e.length-1);for(let t=1;t<o;t++){const n=t%a/a,o=Math.floor(t/a);r.push(e[o].clone().lerp(e[o+1],n))}return r.push(e[e.length-1]),r}),[i,o]);return S.createElement(ce,M.default({ref:l,points:u,vertexColors:m},s))})),pe=S.forwardRef((({url:e,distance:t=1,loop:r=!0,autoplay:o,...i},s)=>{const l=S.useRef(null);S.useImperativeHandle(s,(()=>l.current),[]);const c=a.useThree((({camera:e})=>e)),[u]=S.useState((()=>new n.AudioListener)),m=a.useLoader(n.AudioLoader,e);return S.useEffect((()=>{const e=l.current;e&&(e.setBuffer(m),e.setRefDistance(t),e.setLoop(r),o&&!e.isPlaying&&e.play())}),[m,c,t,r]),S.useEffect((()=>{const e=l.current;return c.add(u),()=>{c.remove(u),e&&(e.isPlaying&&e.stop(),e.source&&e.source._connected&&e.disconnect())}}),[]),S.createElement("positionalAudio",M.default({ref:l,args:[u]},i))})),he=S.forwardRef((({sdfGlyphSize:e=64,anchorX:t="center",anchorY:r="middle",font:n,fontSize:o=1,children:i,characters:s,onSync:l,...c},u)=>{const f=a.useThree((({invalidate:e})=>e)),[p]=S.useState((()=>new m.Text)),[h,x]=S.useMemo((()=>{const e=[];let t="";return S.Children.forEach(i,(r=>{"string"==typeof r||"number"==typeof r?t+=r:e.push(r)})),[e,t]}),[i]);return d.suspend((()=>new Promise((e=>m.preloadFont({font:n,characters:s},e)))),["troika-text",n,s]),S.useLayoutEffect((()=>{p.sync((()=>{f(),l&&l(p)}))})),S.useEffect((()=>()=>p.dispose()),[p]),S.createElement("primitive",M.default({object:p,ref:u,font:n,text:x,anchorX:t,anchorY:r,fontSize:o,sdfGlyphSize:e},c),h)}));let xe=null;async function ye(e){const t=await async function(e){return"string"==typeof e?await(await fetch(e)).json():e}(e);return r=t,xe||(xe=new c.FontLoader),xe.parse(r);var r}function ve(e){return d.suspend(ye,[e])}ve.preload=e=>d.preload(ye,[e]),ve.clear=e=>d.clear([e]);const ge=["string","number"],we=S.forwardRef((({font:e,letterSpacing:r=0,lineHeight:n=1,size:o=1,height:i=.2,bevelThickness:s=.1,bevelSize:l=.01,bevelEnabled:u=!1,bevelOffset:m=0,bevelSegments:d=4,curveSegments:f=8,smooth:p,children:h,...x},y)=>{S.useMemo((()=>a.extend({RenamedTextGeometry:c.TextGeometry})),[]);const v=S.useRef(null),g=ve(e),w=t.useMemo((()=>({font:g,size:o,height:i,bevelThickness:s,bevelSize:l,bevelEnabled:u,bevelSegments:d,bevelOffset:m,curveSegments:f,letterSpacing:r,lineHeight:n})),[g,o,i,s,l,u,d,m,f,r,n]),[z,...b]=t.useMemo((()=>(e=>{let t="";const r=[];return S.Children.forEach(e,(e=>{ge.includes(typeof e)?t+=e+"":r.push(e)})),[t,...r]})(h)),[h]),E=S.useMemo((()=>[z,w]),[z,w]);return S.useLayoutEffect((()=>{p&&(v.current.geometry=c.mergeVertices(v.current.geometry,p),v.current.geometry.computeVertexNormals())}),[E,p]),S.useImperativeHandle(y,(()=>v.current),[]),S.createElement("mesh",M.default({},x,{ref:v}),S.createElement("renamedTextGeometry",{args:E}),b)})),ze=S.forwardRef((({children:e,multisamping:t=8,renderIndex:r=1,disableRender:o,disableGamma:i,disableRenderPass:s,depthBuffer:l=!0,stencilBuffer:u=!1,anisotropy:m=1,colorSpace:d,type:f,...p},h)=>{S.useMemo((()=>a.extend({EffectComposer:c.EffectComposer,RenderPass:c.RenderPass,ShaderPass:c.ShaderPass})),[]);const x=S.useRef(null);S.useImperativeHandle(h,(()=>x.current),[]);const{scene:y,camera:v,gl:g,size:w,viewport:z}=a.useThree(),[b]=S.useState((()=>{const e=new n.WebGLRenderTarget(w.width,w.height,{type:f||n.HalfFloatType,format:n.RGBAFormat,depthBuffer:l,stencilBuffer:u,anisotropy:m});return f===n.UnsignedByteType&&null!=d&&(e.texture.colorSpace=d),e.samples=t,e}));S.useEffect((()=>{var e,t;null==(e=x.current)||e.setSize(w.width,w.height),null==(t=x.current)||t.setPixelRatio(z.dpr)}),[g,w,z.dpr]),a.useFrame((()=>{var e;o||null==(e=x.current)||e.render()}),r);const E=[];return s||E.push(S.createElement("renderPass",{key:"renderpass",attach:`passes-${E.length}`,args:[y,v]})),i||E.push(S.createElement("shaderPass",{attach:`passes-${E.length}`,key:"gammapass",args:[c.GammaCorrectionShader]})),S.Children.forEach(e,(e=>{e&&E.push(S.cloneElement(e,{key:E.length,attach:`passes-${E.length}`}))})),S.createElement("effectComposer",M.default({ref:x,args:[g,b]},p),E)}));let be=function(e){return e.Linear="linear",e.Radial="radial",e}({});function Ee(e,t,r,n){var a;return(a=class extends C.ShaderMaterial{constructor(a){super({vertexShader:t,fragmentShader:r,...a});for(const t in e)this.uniforms[t]=new C.Uniform(e[t]),Object.defineProperty(this,t,{get(){return this.uniforms[t].value},set(e){this.uniforms[t].value=e}});this.uniforms=C.UniformsUtils.clone(this.uniforms),null==n||n(this)}}).key=C.MathUtils.generateUUID(),a}const Me=e=>e===Object(e)&&!Array.isArray(e)&&"function"!=typeof e;function Se(e,r){const o=a.useThree((e=>e.gl)),i=a.useLoader(n.TextureLoader,Me(e)?Object.values(e):e);t.useLayoutEffect((()=>{null==r||r(i)}),[r]),t.useEffect((()=>{if("initTexture"in o){let e=[];Array.isArray(i)?e=i:i instanceof n.Texture?e=[i]:Me(i)&&(e=Object.values(i)),e.forEach((e=>{e instanceof n.Texture&&o.initTexture(e)}))}}),[o,i]);const s=t.useMemo((()=>{if(Me(e)){const t={};let r=0;for(const n in e)t[n]=i[r++];return t}return i}),[e,i]);return s}Se.preload=e=>a.useLoader.preload(n.TextureLoader,e),Se.clear=e=>a.useLoader.clear(n.TextureLoader,e);const Te=(()=>parseInt(n.REVISION.replace(/\D+/g,"")))(),Ce=Ee({color:new C.Color("white"),scale:new C.Vector2(1,1),imageBounds:new C.Vector2(1,1),resolution:1024,map:null,zoom:1,radius:0,grayscale:0,opacity:1},"\n varying vec2 vUv;\n varying vec2 vPos;\n void main() {\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.);\n vUv = uv;\n vPos = position.xy;\n }\n",`\n // mostly from https://gist.github.com/statico/df64c5d167362ecf7b34fca0b1459a44\n varying vec2 vUv;\n varying vec2 vPos;\n uniform vec2 scale;\n uniform vec2 imageBounds;\n uniform float resolution;\n uniform vec3 color;\n uniform sampler2D map;\n uniform float radius;\n uniform float zoom;\n uniform float grayscale;\n uniform float opacity;\n const vec3 luma = vec3(.299, 0.587, 0.114);\n vec4 toGrayscale(vec4 color, float intensity) {\n return vec4(mix(color.rgb, vec3(dot(color.rgb, luma)), intensity), color.a);\n }\n vec2 aspect(vec2 size) {\n return size / min(size.x, size.y);\n }\n \n const float PI = 3.14159265;\n \n // from https://iquilezles.org/articles/distfunctions\n float udRoundBox( vec2 p, vec2 b, float r ) {\n return length(max(abs(p)-b+r,0.0))-r;\n }\n\n void main() {\n vec2 s = aspect(scale);\n vec2 i = aspect(imageBounds);\n float rs = s.x / s.y;\n float ri = i.x / i.y;\n vec2 new = rs < ri ? vec2(i.x * s.y / i.y, s.y) : vec2(s.x, i.y * s.x / i.x);\n vec2 offset = (rs < ri ? vec2((new.x - s.x) / 2.0, 0.0) : vec2(0.0, (new.y - s.y) / 2.0)) / new;\n vec2 uv = vUv * s / new + offset;\n vec2 zUv = (uv - vec2(0.5, 0.5)) / zoom + vec2(0.5, 0.5);\n\n vec2 res = vec2(scale * resolution);\n vec2 halfRes = 0.5 * res;\n float b = udRoundBox(vUv.xy * res - halfRes, halfRes, resolution * radius); \n\t vec3 a = mix(vec3(1.0,0.0,0.0), vec3(0.0,0.0,0.0), smoothstep(0.0, 1.0, b));\n gl_FragColor = toGrayscale(texture2D(map, zUv) * vec4(color, opacity * a), grayscale);\n \n #include <tonemapping_fragment>\n #include <${Te>=154?"colorspace_fragment":"encodings_fragment"}>\n }\n`),Pe=S.forwardRef((({children:e,color:t,segments:r=1,scale:n=1,zoom:o=1,grayscale:i=0,opacity:s=1,radius:l=0,texture:c,toneMapped:u,transparent:m,side:d,...f},p)=>{a.extend({ImageMaterial:Ce});const h=S.useRef(null),x=a.useThree((e=>e.size)),y=Array.isArray(n)?[n[0],n[1]]:[n,n],v=[c.image.width,c.image.height],g=Math.max(x.width,x.height);return S.useImperativeHandle(p,(()=>h.current),[]),S.useLayoutEffect((()=>{h.current.geometry.parameters&&h.current.material.scale.set(y[0]*h.current.geometry.parameters.width,y[1]*h.current.geometry.parameters.height)}),[y[0],y[1]]),S.createElement("mesh",M.default({ref:h,scale:Array.isArray(n)?[...n,1]:n},f),S.createElement("planeGeometry",{args:[1,1,r,r]}),S.createElement("imageMaterial",{color:t,map:c,zoom:o,grayscale:i,opacity:s,scale:y,imageBounds:v,resolution:g,radius:l,toneMapped:u,transparent:m,side:d,key:Ce.key}),e)})),Re=S.forwardRef((({url:e,...t},r)=>{const n=Se(e);return S.createElement(Pe,M.default({},t,{texture:n,ref:r}))})),De=S.forwardRef((({url:e,...t},r)=>S.createElement(Pe,M.default({},t,{ref:r})))),Fe=S.forwardRef(((e,t)=>{if(e.url)return S.createElement(Re,M.default({},e,{ref:t}));if(e.texture)return S.createElement(De,M.default({},e,{ref:t}));throw new Error("<Image /> requires a url or texture")})),ke=S.forwardRef((({threshold:e=15,geometry:t,...r},n)=>{const a=S.useRef(null);S.useImperativeHandle(n,(()=>a.current),[]);const o=S.useMemo((()=>[0,0,0,1,0,0]),[]),i=S.useRef(null),s=S.useRef(null);return S.useLayoutEffect((()=>{const r=a.current.parent,n=null!=t?t:null==r?void 0:r.geometry;if(!n)return;if(i.current===n&&s.current===e)return;i.current=n,s.current=e;const o=new C.EdgesGeometry(n,e).attributes.position.array;a.current.geometry.setPositions(o),a.current.geometry.attributes.instanceStart.needsUpdate=!0,a.current.geometry.attributes.instanceEnd.needsUpdate=!0,a.current.computeLineDistances()})),S.createElement(ce,M.default({segments:!0,points:o,ref:a,raycast:()=>null},r))})),_e=Ee({screenspace:!1,color:new C.Color("black"),opacity:1,thickness:.05,size:new C.Vector2},"#include <common>\n #include <morphtarget_pars_vertex>\n #include <skinning_pars_vertex>\n #include <clipping_planes_pars_vertex>\n uniform float thickness;\n uniform bool screenspace;\n uniform vec2 size;\n void main() {\n #if defined (USE_SKINNING)\n\t #include <beginnormal_vertex>\n #include <morphnormal_vertex>\n #include <skinbase_vertex>\n #include <skinnormal_vertex>\n #include <defaultnormal_vertex>\n #endif\n #include <begin_vertex>\n\t #include <morphtarget_vertex>\n\t #include <skinning_vertex>\n #include <project_vertex>\n #include <clipping_planes_vertex>\n vec4 tNormal = vec4(normal, 0.0);\n vec4 tPosition = vec4(transformed, 1.0);\n #ifdef USE_INSTANCING\n tNormal = instanceMatrix * tNormal;\n tPosition = instanceMatrix * tPosition;\n #endif\n if (screenspace) {\n vec3 newPosition = tPosition.xyz + tNormal.xyz * thickness;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0); \n } else {\n vec4 clipPosition = projectionMatrix * modelViewMatrix * tPosition;\n vec4 clipNormal = projectionMatrix * modelViewMatrix * tNormal;\n vec2 offset = normalize(clipNormal.xy) * thickness / size * clipPosition.w * 2.0;\n clipPosition.xy += offset;\n gl_Position = clipPosition;\n }\n }",`uniform vec3 color;\n uniform float opacity;\n #include <clipping_planes_pars_fragment>\n void main(){\n #include <clipping_planes_fragment>\n gl_FragColor = vec4(color, opacity);\n #include <tonemapping_fragment>\n #include <${Te>=154?"colorspace_fragment":"encodings_fragment"}>\n }`);const Ae={width:.2,length:1,decay:1,local:!1,stride:0,interval:1},Le=(e,t=1)=>(e.set(e.subarray(t)),e.fill(-1/0,-t),e);function Ie(e,t){const{length:r,local:o,decay:i,interval:s,stride:l}={...Ae,...t},c=S.useRef(null),[u]=S.useState((()=>new n.Vector3));S.useLayoutEffect((()=>{e&&(c.current=Float32Array.from({length:10*r*3},((t,r)=>e.position.getComponent(r%3))))}),[r,e]);const m=S.useRef(new n.Vector3),d=S.useRef(0);return a.useFrame((()=>{if(e&&c.current){if(0===d.current){let t;o?t=e.position:(e.getWorldPosition(u),t=u);const r=1*i;for(let e=0;e<r;e++)t.distanceTo(m.current)<l||(Le(c.current,3),c.current.set(t.toArray(),c.current.length-3));m.current.copy(t)}d.current++,d.current=d.current%s}})),c}const Be=S.forwardRef(((e,t)=>{const{children:r}=e,{width:o,length:i,decay:s,local:l,stride:c,interval:u}={...Ae,...e},{color:m="hotpink",attenuation:d,target:p}=e,h=a.useThree((e=>e.size)),x=a.useThree((e=>e.scene)),y=S.useRef(null),[v,g]=S.useState(null),w=Ie(v,{length:i,decay:s,local:l,stride:c,interval:u});S.useEffect((()=>{const e=(null==p?void 0:p.current)||y.current.children.find((e=>e instanceof n.Object3D));e&&g(e)}),[w,p]);const z=S.useMemo((()=>new f.MeshLineGeometry),[]),b=S.useMemo((()=>{var e,t;const a=new f.MeshLineMaterial({lineWidth:.1*o,color:m,sizeAttenuation:1,resolution:new n.Vector2(h.width,h.height)});let i;if(r)if(Array.isArray(r))i=r.find((e=>{const t=e;return"string"==typeof t.type&&"meshLineMaterial"===t.type}));else{const e=r;"string"==typeof e.type&&"meshLineMaterial"===e.type&&(i=e)}return"object"==typeof(null==(e=i)?void 0:e.props)&&null!==(null==(t=i)?void 0:t.props)&&a.setValues(i.props),a}),[o,m,h,r]);return S.useEffect((()=>{b.uniforms.resolution.value.set(h.width,h.height)}),[h]),a.useFrame((()=>{w.current&&z.setPoints(w.current,d)})),S.createElement("group",null,a.createPortal(S.createElement("mesh",{ref:t,geometry:z,material:b}),x),S.createElement("group",{ref:y},r))}));function Ve(e,t=16,r,a,o){const[i,s]=S.useState((()=>{const e=Array.from({length:t},(()=>[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])).flat();return new n.InstancedBufferAttribute(Float32Array.from(e),16)}));return S.useLayoutEffect((()=>{if(void 0===e.current)return;const l=new c.MeshSurfaceSampler(e.current);a&&l.setWeightAttribute(a),l.build();const u=new n.Vector3,m=new n.Vector3,d=new n.Color,f=new n.Object3D;e.current.updateMatrixWorld(!0);for(let n=0;n<t;n++)l.sample(u,m,d),"function"==typeof r?r({dummy:f,sampledMesh:e.current,position:u,normal:m,color:d},n):f.position.copy(u),f.updateMatrix(),null!=o&&o.current&&o.current.setMatrixAt(n,f.matrix),f.matrix.toArray(i.array,16*n);null!=o&&o.current&&(o.current.instanceMatrix.needsUpdate=!0),i.needsUpdate=!0,s(new n.InstancedBufferAttribute(i.array,i.itemSize).copy(i))}),[e,o,a,t,r]),i}const Ue=S.forwardRef((({isChild:e=!1,object:t,children:r,deep:n,castShadow:a,receiveShadow:o,inject:i,keys:s,...l},u)=>{const m={keys:s,deep:n,inject:i,castShadow:a,receiveShadow:o};if(t=S.useMemo((()=>{if(!1===e&&!Array.isArray(t)){let e=!1;if(t.traverse((t=>{t.isSkinnedMesh&&(e=!0)})),e)return c.SkeletonUtils.clone(t)}return t}),[t,e]),Array.isArray(t))return S.createElement("group",M.default({},l,{ref:u}),t.map((e=>S.createElement(Ue,M.default({key:e.uuid,object:e},m)))),r);const{children:d,...f}=function(e,{keys:t=["near","far","color","distance","decay","penumbra","angle","intensity","skeleton","visible","castShadow","receiveShadow","morphTargetDictionary","morphTargetInfluences","name","geometry","material","position","rotation","scale","up","userData","bindMode","bindMatrix","bindMatrixInverse","skeleton"],deep:r,inject:n,castShadow:a,receiveShadow:o}){let i={};for(const r of t)i[r]=e[r];return r&&(i.geometry&&"materialsOnly"!==r&&(i.geometry=i.geometry.clone()),i.material&&"geometriesOnly"!==r&&(i.material=i.material.clone())),n&&(i="function"==typeof n?{...i,children:n(e)}:S.isValidElement(n)?{...i,children:n}:{...i,...n}),e instanceof C.Mesh&&(a&&(i.castShadow=!0),o&&(i.receiveShadow=!0)),i}(t,m),p=t.type[0].toLowerCase()+t.type.slice(1);return S.createElement(p,M.default({},f,l,{ref:u}),t.children.map((e=>"Bone"===e.type?S.createElement("primitive",M.default({key:e.uuid,object:e},m)):S.createElement(Ue,M.default({key:e.uuid,object:e},m,{isChild:!0})))),r,d)})),Oe=S.createContext(null),Ne=S.forwardRef((({resolution:e=28,maxPolyCount:t=1e4,enableUvs:r=!1,enableColors:n=!1,children:o,...i},s)=>{const l=S.useRef(null);S.useImperativeHandle(s,(()=>l.current),[]);const u=S.useMemo((()=>new c.MarchingCubes(e,null,r,n,t)),[e,t,r,n]),m=S.useMemo((()=>({getParent:()=>l})),[]);return a.useFrame((()=>{u.update(),u.reset()}),-1),S.createElement(S.Fragment,null,S.createElement("primitive",M.default({object:u,ref:l},i),S.createElement(Oe.Provider,{value:m},o)))})),je=S.forwardRef((({strength:e=.5,subtract:t=12,color:r,...n},o)=>{const{getParent:i}=S.useContext(Oe),s=S.useMemo((()=>i()),[i]),l=S.useRef(null);S.useImperativeHandle(o,(()=>l.current),[]);const c=new C.Vector3;return a.useFrame((n=>{s.current&&l.current&&(l.current.getWorldPosition(c),s.current.addBall(.5+.5*c.x,.5+.5*c.y,.5+.5*c.z,e,t,r))})),S.createElement("group",M.default({ref:l},n))})),We=S.forwardRef((({planeType:e="x",strength:t=.5,subtract:r=12,...n},o)=>{const{getParent:i}=S.useContext(Oe),s=S.useMemo((()=>i()),[i]),l=S.useRef(null);S.useImperativeHandle(o,(()=>l.current),[]);const c=S.useMemo((()=>"x"===e?"addPlaneX":"y"===e?"addPlaneY":"addPlaneZ"),[e]);return a.useFrame((()=>{s.current&&l.current&&s.current[c](t,r)})),S.createElement("group",M.default({ref:l},n))}));function Ge(e=[0,0,0]){return function(e){return Array.isArray(e)}(e)?e:e instanceof C.Vector3||e instanceof C.Euler?[e.x,e.y,e.z]:[e,e,e]}const He=S.forwardRef((function({debug:e,depthTest:t=!1,polygonOffsetFactor:r=-10,map:n,mesh:o,children:i,position:s,rotation:l,scale:u,...m},d){const f=S.useRef(null);S.useImperativeHandle(d,(()=>f.current));const p=S.useRef(null),h=S.useRef({position:new C.Vector3,rotation:new C.Euler,scale:new C.Vector3(1,1,1)});return S.useLayoutEffect((()=>{const e=(null==o?void 0:o.current)||f.current.parent,t=f.current;if(!(e instanceof C.Mesh))throw new Error('Decal must have a Mesh as parent or specify its "mesh" prop');if(e){a.applyProps(h.current,{position:s,scale:u});const r=e.matrixWorld.clone();if(e.matrixWorld.identity(),l&&"number"!=typeof l)a.applyProps(h.current,{rotation:l});else{const t=new C.Object3D;t.position.copy(h.current.position);const r=e.geometry.attributes.position.array;void 0===e.geometry.attributes.normal&&e.geometry.computeVertexNormals();const n=e.geometry.attributes.normal.array;let o=1/0;new C.Vector3;let i=new C.Vector3;const s=t.position.x,c=t.position.y,u=t.position.z,m=r.length;let d=-1;for(let e=0;e<m;e+=3){const t=r[e]-s,n=r[e+1]-c,a=r[e+2]-u,i=t*t+n*n+a*a;i<o&&(o=i,d=e)}i.fromArray(n,d),t.lookAt(t.position.clone().add(i)),t.rotateZ(Math.PI),t.rotateY(Math.PI),"number"==typeof l&&t.rotateZ(l),a.applyProps(h.current,{rotation:t.rotation})}return t.geometry=new c.DecalGeometry(e,h.current.position,h.current.rotation,h.current.scale),e.matrixWorld=r,()=>{t.geometry.dispose()}}}),[o,...Ge(s),...Ge(u),...Ge(l)]),S.useLayoutEffect((()=>{p.current&&(a.applyProps(p.current,h.current),p.current.traverse((e=>e.raycast=()=>null)))}),[e]),S.createElement("mesh",M.default({ref:f,"material-transparent":!0,"material-polygonOffset":!0,"material-polygonOffsetFactor":r,"material-depthTest":t,"material-map":n},m),i,e&&S.createElement("mesh",{ref:p},S.createElement("boxGeometry",null),S.createElement("meshNormalMaterial",{wireframe:!0}),S.createElement("axesHelper",null)))})),$e=t.forwardRef((function({src:e,skipFill:r,skipStrokes:o,fillMaterial:i,strokeMaterial:s,fillMeshProps:l,strokeMeshProps:u,...m},d){const f=a.useLoader(c.SVGLoader,e.startsWith("<svg")?`data:image/svg+xml;utf8,${e}`:e),p=t.useMemo((()=>o?[]:f.paths.map((e=>{var t;return void 0===(null==(t=e.userData)?void 0:t.style.stroke)||"none"===e.userData.style.stroke?null:e.subPaths.map((t=>c.SVGLoader.pointsToStroke(t.getPoints(),e.userData.style)))}))),[f,o]);t.useEffect((()=>()=>p.forEach((e=>e&&e.map((e=>e.dispose()))))),[p]);let h=0;return S.createElement("object3D",M.default({ref:d},m),S.createElement("object3D",{scale:[1,-1,1]},f.paths.map(((e,a)=>{var m,d;return S.createElement(t.Fragment,{key:a},!r&&void 0!==(null==(m=e.userData)?void 0:m.style.fill)&&"none"!==e.userData.style.fill&&c.SVGLoader.createShapes(e).map(((t,r)=>S.createElement("mesh",M.default({key:r},l,{renderOrder:h++}),S.createElement("shapeGeometry",{args:[t]}),S.createElement("meshBasicMaterial",M.default({color:e.userData.style.fill,opacity:e.userData.style.fillOpacity,transparent:!0,side:n.DoubleSide,depthWrite:!1},i))))),!o&&void 0!==(null==(d=e.userData)?void 0:d.style.stroke)&&"none"!==e.userData.style.stroke&&e.subPaths.map(((t,r)=>S.createElement("mesh",M.default({key:r,geometry:p[a][r]},u,{renderOrder:h++}),S.createElement("meshBasicMaterial",M.default({color:e.userData.style.stroke,opacity:e.userData.style.strokeOpacity,transparent:!0,side:n.DoubleSide,depthWrite:!1},s))))))}))))}));let qe=null,Xe="https://www.gstatic.com/draco/versioned/decoders/1.5.5/";function Ze(e=!0,t=!0,r){return n=>{r&&r(n),e&&(qe||(qe=new c.DRACOLoader),qe.setDecoderPath("string"==typeof e?e:Xe),n.setDRACOLoader(qe)),t&&n.setMeshoptDecoder("function"==typeof c.MeshoptDecoder?c.MeshoptDecoder():c.MeshoptDecoder)}}const Ye=(e,t,r,n)=>a.useLoader(c.GLTFLoader,e,Ze(t,r,n));Ye.preload=(e,t,r,n)=>a.useLoader.preload(c.GLTFLoader,e,Ze(t,r,n)),Ye.clear=e=>a.useLoader.clear(c.GLTFLoader,e),Ye.setDecoderPath=e=>{Xe=e};const Qe=S.forwardRef((({src:e,useDraco:t,useMeshOpt:r,extendLoader:n,...a},o)=>{const{scene:i}=Ye(e,t,r,n);return S.createElement(Ue,M.default({ref:o},a,{object:i}))}));const Ke=Ee({alphaTest:0,viewport:new C.Vector2(1980,1080),focal:1e3,centerAndScaleTexture:null,covAndColorTexture:null},"\n precision highp sampler2D;\n precision highp usampler2D;\n out vec4 vColor;\n out vec3 vPosition;\n uniform vec2 resolution;\n uniform vec2 viewport;\n uniform float focal;\n attribute uint splatIndex;\n uniform sampler2D centerAndScaleTexture;\n uniform usampler2D covAndColorTexture; \n\n vec2 unpackInt16(in uint value) {\n int v = int(value);\n int v0 = v >> 16;\n int v1 = (v & 0xFFFF);\n if((v & 0x8000) != 0)\n v1 |= 0xFFFF0000;\n return vec2(float(v1), float(v0));\n }\n\n void main () {\n ivec2 texSize = textureSize(centerAndScaleTexture, 0);\n ivec2 texPos = ivec2(splatIndex%uint(texSize.x), splatIndex/uint(texSize.x));\n vec4 centerAndScaleData = texelFetch(centerAndScaleTexture, texPos, 0);\n vec4 center = vec4(centerAndScaleData.xyz, 1);\n vec4 camspace = modelViewMatrix * center;\n vec4 pos2d = projectionMatrix * camspace;\n\n float bounds = 1.2 * pos2d.w;\n if (pos2d.z < -pos2d.w || pos2d.x < -bounds || pos2d.x > bounds\n || pos2d.y < -bounds || pos2d.y > bounds) {\n gl_Position = vec4(0.0, 0.0, 2.0, 1.0);\n return;\n }\n\n uvec4 covAndColorData = texelFetch(covAndColorTexture, texPos, 0);\n vec2 cov3D_M11_M12 = unpackInt16(covAndColorData.x) * centerAndScaleData.w;\n vec2 cov3D_M13_M22 = unpackInt16(covAndColorData.y) * centerAndScaleData.w;\n vec2 cov3D_M23_M33 = unpackInt16(covAndColorData.z) * centerAndScaleData.w;\n mat3 Vrk = mat3(\n cov3D_M11_M12.x, cov3D_M11_M12.y, cov3D_M13_M22.x,\n cov3D_M11_M12.y, cov3D_M13_M22.y, cov3D_M23_M33.x,\n cov3D_M13_M22.x, cov3D_M23_M33.x, cov3D_M23_M33.y\n );\n\n mat3 J = mat3(\n focal / camspace.z, 0., -(focal * camspace.x) / (camspace.z * camspace.z),\n 0., focal / camspace.z, -(focal * camspace.y) / (camspace.z * camspace.z),\n 0., 0., 0.\n );\n\n mat3 W = transpose(mat3(modelViewMatrix));\n mat3 T = W * J;\n mat3 cov = transpose(T) * Vrk * T;\n vec2 vCenter = vec2(pos2d) / pos2d.w;\n float diagonal1 = cov[0][0] + 0.3;\n float offDiagonal = cov[0][1];\n float diagonal2 = cov[1][1] + 0.3;\n float mid = 0.5 * (diagonal1 + diagonal2);\n float radius = length(vec2((diagonal1 - diagonal2) / 2.0, offDiagonal));\n float lambda1 = mid + radius;\n float lambda2 = max(mid - radius, 0.1);\n vec2 diagonalVector = normalize(vec2(offDiagonal, lambda1 - diagonal1));\n vec2 v1 = min(sqrt(2.0 * lambda1), 1024.0) * diagonalVector;\n vec2 v2 = min(sqrt(2.0 * lambda2), 1024.0) * vec2(diagonalVector.y, -diagonalVector.x);\n uint colorUint = covAndColorData.w;\n vColor = vec4(\n float(colorUint & uint(0xFF)) / 255.0,\n float((colorUint >> uint(8)) & uint(0xFF)) / 255.0,\n float((colorUint >> uint(16)) & uint(0xFF)) / 255.0,\n float(colorUint >> uint(24)) / 255.0\n );\n vPosition = position;\n\n gl_Position = vec4(\n vCenter \n + position.x * v2 / viewport * 2.0 \n + position.y * v1 / viewport * 2.0, pos2d.z / pos2d.w, 1.0);\n }\n ",`\n #include <alphatest_pars_fragment>\n #include <alphahash_pars_fragment>\n in vec4 vColor;\n in vec3 vPosition;\n void main () {\n float A = -dot(vPosition.xy, vPosition.xy);\n if (A < -4.0) discard;\n float B = exp(A) * vColor.a;\n vec4 diffuseColor = vec4(vColor.rgb, B);\n #include <alphatest_fragment>\n #include <alphahash_fragment>\n gl_FragColor = diffuseColor;\n #include <tonemapping_fragment>\n #include <${Te>=154?"colorspace_fragment":"encodings_fragment"}>\n }\n `);function Je(e){let t=null,r=0;e.onmessage=n=>{if("push"==n.data.method){0===r&&(t=new Float32Array(n.data.length));const e=new Float32Array(n.data.matrices);t.set(e,r),r+=e.length}else if("sort"==n.data.method&&null!==t){const r=function(e,r=!1){const n=t.length/16;let a=-1/0,o=1/0;const i=new Float32Array(n),s=new Int32Array(i.buffer),l=new Int32Array(n);let c=0;for(let s=0;s<n;s++){const n=e[0]*t[16*s+12]+e[1]*t[16*s+13]+e[2]*t[16*s+14]+e[3];(r||n<0&&t[16*s+15]>-1e-4*n)&&(i[c]=n,l[c]=s,c++,n>a&&(a=n),n<o&&(o=n))}const u=65535/(a-o),m=new Uint32Array(65536);for(let e=0;e<c;e++)s[e]=(i[e]-o)*u|0,m[s[e]]++;const d=new Uint32Array(65536);for(let e=1;e<65536;e++)d[e]=d[e-1]+m[e-1];const f=new Uint32Array(c);for(let e=0;e<c;e++)f[d[s[e]]++]=l[e];return f}(new Float32Array(n.data.view),n.data.hashed);e.postMessage({indices:r,key:n.data.key},[r.buffer])}}}class et extends C.Loader{constructor(...e){super(...e),this.gl=null,this.chunkSize=25e3}load(e,t,r,n){const a={gl:this.gl,url:this.manager.resolveURL(e),worker:new Worker(URL.createObjectURL(new Blob(["(",Je.toString(),")(self)"],{type:"application/javascript"}))),manager:this.manager,update:(e,t,r)=>function(e,t,r,n){if(e.updateMatrixWorld(),t.gl.getCurrentViewport(r.viewport),r.material.viewport.x=r.viewport.z,r.material.viewport.y=r.viewport.w,r.material.focal=r.viewport.w/2*Math.abs(e.projectionMatrix.elements[5]),r.ready){if(n&&r.sorted)return;r.ready=!1;const e=new Float32Array([r.modelViewMatrix.elements[2],-r.modelViewMatrix.elements[6],r.modelViewMatrix.elements[10],r.modelViewMatrix.elements[14]]);t.worker.postMessage({method:"sort",src:t.url,key:r.uuid,view:e.buffer,hashed:n},[e.buffer]),n&&t.loaded&&(r.sorted=!0)}}(t,a,e,r),connect:e=>function(e,t){e.loading||async function(e){e.loading=!0;let t=0,r=0;const n=[];let a=0;const o=0!==e.totalDownloadBytes;for(;;)try{const{value:i,done:s}=await e.stream.read();if(s)break;if(t+=i.length,null!=e.totalDownloadBytes){const r=t/e.totalDownloadBytes*100;if(e.onProgress&&r-a>1){const n=new ProgressEvent("progress",{lengthComputable:o,loaded:t,total:e.totalDownloadBytes});e.onProgress(n),a=r}}n.push(i);const l=t-r;if(null!=e.totalDownloadBytes&&l>e.rowLength*e.chunkSize){let t=Math.floor(l/e.rowLength);const a=new Uint8Array(l);let i=0;for(const e of n)a.set(e,i),i+=e.length;if(n.length=0,l>t*e.rowLength){const r=new Uint8Array(l-t*e.rowLength);r.set(a.subarray(l-r.length,l),0),n.push(r)}const s=new Uint8Array(t*e.rowLength);s.set(a.subarray(0,s.byteLength),0);const c=tt(e,s.buffer,t);if(e.worker.postMessage({method:"push",src:e.url,length:16*e.numVertices,matrices:c.buffer},[c.buffer]),r+=t*e.rowLength,e.onProgress){const t=new ProgressEvent("progress",{lengthComputable:o,loaded:e.totalDownloadBytes,total:e.totalDownloadBytes});e.onProgress(t)}}}catch(e){console.error(e);break}if(t-r>0){let t=new Uint8Array(n.reduce(((e,t)=>e+t.length),0)),r=0;for(const e of n)t.set(e,r),r+=e.length;let a=Math.floor(t.byteLength/e.rowLength);const o=tt(e,t.buffer,a);e.worker.postMessage({method:"push",src:e.url,length:16*a,matrices:o.buffer},[o.buffer])}e.loaded=!0,e.manager.itemEnd(e.url)}(e);t.ready=!1,t.pm=new C.Matrix4,t.vm1=new C.Matrix4,t.vm2=new C.Matrix4,t.viewport=new C.Vector4;let r=new Uint32Array(e.bufferTextureWidth*e.bufferTextureHeight);const n=new C.InstancedBufferAttribute(r,1,!1);n.setUsage(C.DynamicDrawUsage);const a=t.geometry=new C.InstancedBufferGeometry,o=new Float32Array(18),i=new C.BufferAttribute(o,3);function s(e){if(t&&e.data.key===t.uuid){let r=new Uint32Array(e.data.indices);a.attributes.splatIndex.set(r),a.attributes.splatIndex.needsUpdate=!0,a.instanceCount=r.length,t.ready=!0}}async function l(){for(;;){const t=e.gl.properties.get(e.centerAndScaleTexture),r=e.gl.properties.get(e.covAndColorTexture);if(null!=t&&t.__webglTexture&&null!=r&&r.__webglTexture&&e.loadedVertexCount>0)break;await new Promise((e=>setTimeout(e,10)))}t.ready=!0}return a.setAttribute("position",i),i.setXYZ(2,-2,2,0),i.setXYZ(1,2,2,0),i.setXYZ(0,-2,-2,0),i.setXYZ(5,-2,-2,0),i.setXYZ(4,2,2,0),i.setXYZ(3,2,-2,0),i.needsUpdate=!0,a.setAttribute("splatIndex",n),a.instanceCount=1,e.worker.addEventListener("message",s),l(),()=>e.worker.removeEventListener("message",s)}(a,e),loading:!1,loaded:!1,loadedVertexCount:0,chunkSize:this.chunkSize,totalDownloadBytes:0,numVertices:0,rowLength:32,maxVertexes:0,bufferTextureWidth:0,bufferTextureHeight:0,stream:null,centerAndScaleData:null,covAndColorData:null,covAndColorTexture:null,centerAndScaleTexture:null,onProgress:r};(async function(e){e.manager.itemStart(e.url);const t=await fetch(e.url);if(null===t.body)throw"Failed to fetch file";let r=t.headers.get("Content-Length");const n=r?parseInt(r):void 0;if(null==n)throw"Failed to get content length";e.stream=t.body.getReader(),e.totalDownloadBytes=n,e.numVertices=Math.floor(e.totalDownloadBytes/e.rowLength);const a=e.gl.getContext();let o=a.getParameter(a.MAX_TEXTURE_SIZE);e.maxVertexes=o*o,e.numVertices>e.maxVertexes&&(e.numVertices=e.maxVertexes);return e.bufferTextureWidth=o,e.bufferTextureHeight=Math.floor((e.numVertices-1)/o)+1,e.centerAndScaleData=new Float32Array(e.bufferTextureWidth*e.bufferTextureHeight*4),e.covAndColorData=new Uint32Array(e.bufferTextureWidth*e.bufferTextureHeight*4),e.centerAndScaleTexture=new C.DataTexture(e.centerAndScaleData,e.bufferTextureWidth,e.bufferTextureHeight,C.RGBAFormat,C.FloatType),e.centerAndScaleTexture.needsUpdate=!0,e.covAndColorTexture=new C.DataTexture(e.covAndColorData,e.bufferTextureWidth,e.bufferTextureHeight,C.RGBAIntegerFormat,C.UnsignedIntType),e.covAndColorTexture.internalFormat="RGBA32UI",e.covAndColorTexture.needsUpdate=!0,e})(a).then(t).catch((e=>{null==n||n(e),a.manager.itemError(a.url)}))}}function tt(e,t,r){const n=e.gl.getContext();if(e.loadedVertexCount+r>e.maxVertexes&&(r=e.maxVertexes-e.loadedVertexCount),r<=0)throw"Failed to parse file";const a=new Uint8Array(t),o=new Float32Array(t),i=new Float32Array(16*r),s=new Uint8Array(e.covAndColorData.buffer),l=new Int16Array(e.covAndColorData.buffer);for(let t=0;t<r;t++){const r=new C.Quaternion(-(a[32*t+28+1]-128)/128,(a[32*t+28+2]-128)/128,(a[32*t+28+3]-128)/128,-(a[32*t+28+0]-128)/128);r.invert();const n=new C.Vector3(o[8*t+0],o[8*t+1],-o[8*t+2]),c=new C.Vector3(o[8*t+3+0],o[8*t+3+1],o[8*t+3+2]),u=new C.Matrix4;u.makeRotationFromQuaternion(r),u.transpose(),u.scale(c);const m=u.clone();u.transpose(),u.premultiply(m),u.setPosition(n);const d=[0,1,2,5,6,10];let f=0;for(let e=0;e<d.length;e++)Math.abs(u.elements[d[e]])>f&&(f=Math.abs(u.elements[d[e]]));let p=4*e.loadedVertexCount+4*t;e.centerAndScaleData[p+0]=n.x,e.centerAndScaleData[p+1]=-n.y,e.centerAndScaleData[p+2]=n.z,e.centerAndScaleData[p+3]=f/32767,p=8*e.loadedVertexCount+4*t*2;for(let e=0;e<d.length;e++)l[p+e]=32767*u.elements[d[e]]/f;p=16*e.loadedVertexCount+4*(4*t+3);const h=new C.Color(a[32*t+24+0]/255,a[32*t+24+1]/255,a[32*t+24+2]/255);h.convertSRGBToLinear(),s[p+0]=255*h.r,s[p+1]=255*h.g,s[p+2]=255*h.b,s[p+3]=a[32*t+24+3],u.elements[15]=Math.max(c.x,c.y,c.z)*a[32*t+24+3]/255;for(let e=0;e<16;e++)i[16*t+e]=u.elements[e]}for(;r>0;){let t=0,a=0;const o=e.loadedVertexCount%e.bufferTextureWidth,i=Math.floor(e.loadedVertexCount/e.bufferTextureWidth);e.loadedVertexCount%e.bufferTextureWidth!=0?(t=Math.min(e.bufferTextureWidth,o+r)-o,a=1):Math.floor(r/e.bufferTextureWidth)>0?(t=e.bufferTextureWidth,a=Math.floor(r/e.bufferTextureWidth)):(t=r%e.bufferTextureWidth,a=1);const s=e.gl.properties.get(e.centerAndScaleTexture);n.bindTexture(n.TEXTURE_2D,s.__webglTexture),n.texSubImage2D(n.TEXTURE_2D,0,o,i,t,a,n.RGBA,n.FLOAT,e.centerAndScaleData,4*e.loadedVertexCount);const l=e.gl.properties.get(e.covAndColorTexture);n.bindTexture(n.TEXTURE_2D,l.__webglTexture),n.texSubImage2D(n.TEXTURE_2D,0,o,i,t,a,n.RGBA_INTEGER,n.UNSIGNED_INT,e.covAndColorData,4*e.loadedVertexCount),e.gl.resetState(),e.loadedVertexCount+=t*a,r-=t*a}return i}function rt(e,t,r){const n=a.useThree((e=>e.size)),o=a.useThree((e=>e.viewport)),i="number"==typeof e?e:n.width*o.dpr,s="number"==typeof t?t:n.height*o.dpr,l=("number"==typeof e?r:e)||{},{samples:c=0,depth:u,...m}=l,d=S.useMemo((()=>{const e=new C.WebGLRenderTarget(i,s,{minFilter:C.LinearFilter,magFilter:C.LinearFilter,type:C.HalfFloatType,...m});return u&&(e.depthTexture=new C.DepthTexture(i,s,C.FloatType)),e.samples=c,e}),[]);return S.useLayoutEffect((()=>{d.setSize(i,s),c&&(d.samples=c)}),[c,d,i,s]),S.useEffect((()=>()=>d.dispose()),[]),d}const nt=S.forwardRef((({envMap:e,resolution:t=256,frames:r=1/0,children:n,makeDefault:o,...i},s)=>{const l=a.useThree((({set:e})=>e)),c=a.useThree((({camera:e})=>e)),u=a.useThree((({size:e})=>e)),m=S.useRef(null);S.useImperativeHandle(s,(()=>m.current),[]);const d=S.useRef(null),f=rt(t);S.useLayoutEffect((()=>{i.manual||m.current.updateProjectionMatrix()}),[u,i]),S.useLayoutEffect((()=>{m.current.updateProjectionMatrix()})),S.useLayoutEffect((()=>{if(o){const e=c;return l((()=>({camera:m.current}))),()=>l((()=>({camera:e})))}}),[m,o,l]);let p=0,h=null;const x="function"==typeof n;return a.useFrame((t=>{x&&(r===1/0||p<r)&&(d.current.visible=!1,t.gl.setRenderTarget(f),h=t.scene.background,e&&(t.scene.background=e),t.gl.render(t.scene,m.current),t.scene.background=h,t.gl.setRenderTarget(null),d.current.visible=!0,p++)})),S.createElement(S.Fragment,null,S.createElement("orthographicCamera",M.default({left:u.width/-2,right:u.width/2,top:u.height/2,bottom:u.height/-2,ref:m},i),!x&&n),S.createElement("group",{ref:d},x&&n(f.te