@luma.gl/engine 9.3.0-alpha.8 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/animation-loop/make-animation-loop.d.ts.map +1 -1
  2. package/dist/animation-loop/make-animation-loop.js +1 -0
  3. package/dist/animation-loop/make-animation-loop.js.map +1 -1
  4. package/dist/compute/computation.js +2 -2
  5. package/dist/compute/computation.js.map +1 -1
  6. package/dist/debug/debug-framebuffer.d.ts +9 -4
  7. package/dist/debug/debug-framebuffer.d.ts.map +1 -1
  8. package/dist/debug/debug-framebuffer.js +91 -45
  9. package/dist/debug/debug-framebuffer.js.map +1 -1
  10. package/dist/dist.dev.js +200 -126
  11. package/dist/dist.min.js +33 -33
  12. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -1
  13. package/dist/dynamic-texture/dynamic-texture.js +3 -1
  14. package/dist/dynamic-texture/dynamic-texture.js.map +1 -1
  15. package/dist/dynamic-texture/texture-data.js +2 -2
  16. package/dist/dynamic-texture/texture-data.js.map +1 -1
  17. package/dist/geometries/cube-geometry.js +7 -7
  18. package/dist/geometries/cube-geometry.js.map +1 -1
  19. package/dist/geometries/ico-sphere-geometry.js +3 -1
  20. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  21. package/dist/geometry/gpu-geometry.d.ts.map +1 -1
  22. package/dist/geometry/gpu-geometry.js +3 -0
  23. package/dist/geometry/gpu-geometry.js.map +1 -1
  24. package/dist/index.cjs +176 -108
  25. package/dist/index.cjs.map +3 -3
  26. package/dist/material/material.js +2 -2
  27. package/dist/material/material.js.map +1 -1
  28. package/dist/model/model.d.ts.map +1 -1
  29. package/dist/model/model.js +45 -34
  30. package/dist/model/model.js.map +1 -1
  31. package/dist/models/billboard-texture-model.js +4 -4
  32. package/dist/models/billboard-texture-module.d.ts +1 -1
  33. package/dist/models/billboard-texture-module.js +1 -1
  34. package/dist/models/light-model-utils.js +2 -2
  35. package/dist/modules/picking/color-picking.d.ts +2 -2
  36. package/dist/modules/picking/index-picking.d.ts +2 -2
  37. package/dist/modules/picking/legacy-color-picking.d.ts +4 -4
  38. package/dist/modules/picking/picking-uniforms.d.ts +1 -1
  39. package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
  40. package/dist/modules/picking/picking-uniforms.js +1 -1
  41. package/dist/modules/picking/picking.d.ts +2 -2
  42. package/dist/passes/get-fragment-shader.js +4 -4
  43. package/dist/shader-inputs.d.ts.map +1 -1
  44. package/dist/shader-inputs.js +20 -23
  45. package/dist/shader-inputs.js.map +1 -1
  46. package/package.json +2 -2
  47. package/src/animation-loop/make-animation-loop.ts +1 -0
  48. package/src/compute/computation.ts +2 -2
  49. package/src/debug/debug-framebuffer.ts +139 -61
  50. package/src/dynamic-texture/dynamic-texture.ts +3 -5
  51. package/src/dynamic-texture/texture-data.ts +2 -2
  52. package/src/dynamic-texture/texture-data.ts.disabled +1 -1
  53. package/src/geometries/cube-geometry.ts +7 -7
  54. package/src/geometries/ico-sphere-geometry.ts +3 -1
  55. package/src/geometry/gpu-geometry.ts +3 -0
  56. package/src/material/material.ts +2 -2
  57. package/src/model/model.ts +48 -36
  58. package/src/models/billboard-texture-model.ts +4 -4
  59. package/src/models/billboard-texture-module.ts +1 -1
  60. package/src/models/light-model-utils.ts +2 -2
  61. package/src/modules/picking/picking-uniforms.ts +1 -1
  62. package/src/passes/get-fragment-shader.ts +4 -4
  63. package/src/shader-inputs.ts +32 -41
package/dist/dist.min.js CHANGED
@@ -4,7 +4,7 @@
4
4
  else if (typeof define === 'function' && define.amd) define([], factory);
5
5
  else if (typeof exports === 'object') exports['luma'] = factory();
6
6
  else root['luma'] = factory();})(globalThis, function () {
7
- "use strict";var __exports__=(()=>{var Hn=Object.create;var Ct=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var Yn=Object.getOwnPropertyNames;var Kn=Object.getPrototypeOf,Zn=Object.prototype.hasOwnProperty;var Qn=(i,t,e)=>t in i?Ct(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var pi=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Jn=(i,t)=>{for(var e in t)Ct(i,e,{get:t[e],enumerable:!0})},Yt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Yn(t))!Zn.call(i,r)&&r!==e&&Ct(i,r,{get:()=>t[r],enumerable:!(n=Wn(t,r))||n.enumerable});return i},Kt=(i,t,e)=>(Yt(i,t,"default"),e&&Yt(e,t,"default")),R=(i,t,e)=>(e=i!=null?Hn(Kn(i)):{},Yt(t||!i||!i.__esModule?Ct(e,"default",{value:i,enumerable:!0}):e,i)),tr=i=>Yt(Ct({},"__esModule",{value:!0}),i);var K=(i,t,e)=>(Qn(i,typeof t!="symbol"?t+"":t,e),e);var U=pi((Ks,gi)=>{gi.exports=globalThis.luma});var rt=pi((xo,Mi)=>{Mi.exports=globalThis.luma});var Vt={};Jn(Vt,{AnimationLoop:()=>lt,AnimationLoopTemplate:()=>Jt,AsyncTexture:()=>Ws,BackgroundTextureModel:()=>_t,BufferTransform:()=>zt,ClipSpace:()=>st,Computation:()=>Gt,ConeGeometry:()=>ct,CubeGeometry:()=>be,CylinderGeometry:()=>Me,DirectionalLightModel:()=>xe,DynamicTexture:()=>z,GPUGeometry:()=>pt,Geometry:()=>V,GroupNode:()=>ft,IcoSphereGeometry:()=>_e,KeyFrames:()=>Qt,LegacyPickingManager:()=>Le,Material:()=>Mt,MaterialFactory:()=>bt,Model:()=>W,ModelNode:()=>ye,PickingManager:()=>Ut,PlaneGeometry:()=>Ie,PointLightModel:()=>pe,ScenegraphNode:()=>it,ShaderInputs:()=>$,ShaderPassRenderer:()=>we,SphereGeometry:()=>It,SpotLightModel:()=>ge,Swap:()=>Tt,SwapBuffers:()=>ve,SwapFramebuffers:()=>Pt,TextureTransform:()=>se,Timeline:()=>Zt,TruncatedConeGeometry:()=>at,cancelAnimationFramePolyfill:()=>ee,colorPicking:()=>$t,indexPicking:()=>Se,legacyColorPicking:()=>Un,loadImage:()=>On,loadImageBitmap:()=>En,makeAnimationLoop:()=>bi,makeRandomGenerator:()=>Ln,picking:()=>jn,requestAnimationFramePolyfill:()=>te,resolvePickingBackend:()=>zn,resolvePickingMode:()=>Pe,setPathPrefix:()=>Cn,supportsIndexPicking:()=>fi});Kt(Vt,R(U(),1));var er=1,ir=1,Zt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:n=Number.POSITIVE_INFINITY,rate:r=1,repeat:s=1}=t,o=er++,a={time:0,delay:e,duration:n,rate:r,repeat:s};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,n]of this.animations)n.channel===t&&this.detachAnimation(e)}isFinished(t){let e=this.channels.get(t);return e===void 0?!1:this.time>=e.delay+e.duration*e.repeat}getTime(t){if(t===void 0)return this.time;let e=this.channels.get(t);return e===void 0?-1:e.time}setTime(t){this.time=Math.max(0,t);let e=this.channels.values();for(let r of e)this._setChannelTime(r,this.time);let n=this.animations.values();for(let r of n){let{animation:s,channel:o}=r;s.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let n=ir++;return this.animations.set(n,{animation:t,channel:e}),t.setTime(this.getTime(e)),n}detachAnimation(t){this.animations.delete(t)}update(t){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=t),this.setTime(this.time+(t-this.lastEngineTime)),this.lastEngineTime=t)}_setChannelTime(t,e){let n=e-t.delay,r=t.duration*t.repeat;n>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,n)%t.duration,t.time*=t.rate)}};var Qt=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(t){this.setKeyFrames(t),this.setTime(0)}setKeyFrames(t){let e=t.length;this.times.length=e,this.values.length=e;for(let n=0;n<e;++n)this.times[n]=t[n][0],this.values[n]=t[n][1];this._calculateKeys(this._lastTime)}setTime(t){t=Math.max(0,t),t!==this._lastTime&&(this._calculateKeys(t),this._lastTime=t)}getStartTime(){return this.times[this.startIndex]}getEndTime(){return this.times[this.endIndex]}getStartData(){return this.values[this.startIndex]}getEndData(){return this.values[this.endIndex]}_calculateKeys(t){let e=0,n=this.times.length;for(e=0;e<n-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],s=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(s-r)),1)}};var Jt=class{constructor(t){}async onInitialize(t){return null}};var xi=R(U(),1);function te(i){let t=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return t?t.call(window,i):setTimeout(()=>i(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function ee(i){let t=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(t){t.call(window,i);return}clearTimeout(i)}function Et(){let i;if(typeof window<"u"&&window.performance)i=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();i=t[0]*1e3+t[1]/1e6}else i=Date.now();return i}var ht=class{constructor(t,e){this.sampleSize=1,this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this.name=t,this.type=e,this.reset()}reset(){return this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this}setSampleSize(t){return this.sampleSize=t,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(t){return this._count+=t,this._samples++,this._checkSampling(),this}subtractCount(t){return this._count-=t,this._samples++,this._checkSampling(),this}addTime(t){return this._time+=t,this.lastTiming=t,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Et(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Et()-this._startTime),this._timerPending=!1,this._checkSampling(),this):this}getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0}getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0}getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1e3):0}getAverageCount(){return this.samples>0?this.count/this.samples:0}getAverageTime(){return this.samples>0?this.time/this.samples:0}getHz(){return this.time>0?this.samples/(this.time/1e3):0}_checkSampling(){this._samples===this.sampleSize&&(this.lastSampleTime=this._time,this.lastSampleCount=this._count,this.count+=this._count,this.time+=this._time,this.samples+=this._samples,this._time=0,this._count=0,this._samples=0)}};var mt=class{constructor(t){this.stats={},this.id=t.id,this.stats={},this._initializeStats(t.stats),Object.seal(this)}get(t,e="count"){return this._getOrCreate({name:t,type:e})}get size(){return Object.keys(this.stats).length}reset(){for(let t of Object.values(this.stats))t.reset();return this}forEach(t){for(let e of Object.values(this.stats))t(e)}getTable(){let t={};return this.forEach(e=>{t[e.name]={time:e.time||0,count:e.count||0,average:e.getAverageTime()||0,hz:e.getHz()||0}}),t}_initializeStats(t=[]){t.forEach(e=>this._getOrCreate(e))}_getOrCreate(t){let{name:e,type:n}=t,r=this.stats[e];return r||(t instanceof ht?r=t:r=new ht(e,n),this.stats[e]=r),r}};var nr=0,rr="Animation Loop",Ce=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(t){if(this.props={...Ce.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new mt({id:`animation-loop-${nr++}`}),this.sharedStats=xi.luma.stats.get(rr),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:t.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this._needsRedraw=this._needsRedraw||t,this}needsRedraw(){let t=this._needsRedraw;return this._needsRedraw=!1,t}setProps(t){return"autoResizeViewport"in t&&(this.props.autoResizeViewport=t.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let t;if(!this._initialized){if(this._initialized=!0,await this._initDevice(),this._initialize(),!this._running)return null;await this.props.onInitialize(this._getAnimationProps())}return this._running?(t!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(t){let e=t instanceof Error?t:new Error("Unknown error");throw this.props.onError(e),e}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(t){return this.device?.isLost||this._error?this:(this._beginFrameTimers(t),this._setupFrame(),this._updateAnimationProps(),this._renderFrame(this._getAnimationProps()),this._clearNeedsRedraw(),this._resolveNextFrame&&(this._resolveNextFrame(this),this._nextFramePromise=null,this._resolveNextFrame=null),this._endFrameTimers(),this)}attachTimeline(t){return this.timeline=t,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(t=>{this._resolveNextFrame=t})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=te(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(ee(this._animationFrameId),this._animationFrameId=null)}_animationFrame(t){this._running&&(this.redraw(t),this._requestAnimationFrame())}_renderFrame(t){if(this.display){this.display._renderFrame(t);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let t=this.device?.getDefaultCanvasContext();if(!this.device||!t)throw new Error("loop");let e=t?.canvas,n=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:n,timeline:this.timeline,needsRedraw:!1,width:1,height:1,aspect:1,time:0,startTime:Date.now(),engineTime:0,tick:0,tock:0,_mousePosition:null}}_getAnimationProps(){if(!this.animationProps)throw new Error("animationProps");return this.animationProps}_updateAnimationProps(){if(!this.animationProps)return;let{width:t,height:e,aspect:n}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),n!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=n,this.animationProps.needsRedraw=this._needsRedraw,this.animationProps.engineTime=Date.now()-this.animationProps.startTime,this.timeline&&this.timeline.update(this.animationProps.engineTime),this.animationProps.tick=Math.floor(this.animationProps.time/1e3*60),this.animationProps.tock++,this.animationProps.time=this.timeline?this.timeline.getTime():this.animationProps.engineTime}async _initDevice(){if(this.device=await this.props.device,!this.device)throw new Error("No device provided");this.canvas=this.device.getDefaultCanvasContext().canvas||null}_createInfoDiv(){if(this.canvas&&this.props.onAddHTML){let t=document.createElement("div");document.body.appendChild(t),t.style.position="relative";let e=document.createElement("div");e.style.position="absolute",e.style.left="10px",e.style.bottom="10px",e.style.width="300px",e.style.background="white",this.canvas instanceof HTMLCanvasElement&&t.appendChild(this.canvas),t.appendChild(e);let n=this.props.onAddHTML(e);n&&(e.innerHTML=n)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),n=t>0&&e>0?t/e:1;return{width:t,height:e,aspect:n}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(t){let e=t??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let n=e-this._lastFrameTime;n>0&&this.frameRate.addTime(n)}this._lastFrameTime=e,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let t=this.device.commandEncoder._gpuTimeMs;t!==void 0&&(this.gpuTime.addTime(t),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let t of Object.keys(this.sharedStats.stats))this.stats.stats[t]||delete this.sharedStats.stats[t];this.stats.forEach(t=>{let e=this.sharedStats.get(t.name,t.type);e.sampleSize=t.sampleSize,e.time=t.time,e.count=t.count,e.samples=t.samples,e.lastTiming=t.lastTiming,e.lastSampleTime=t.lastSampleTime,e.lastSampleCount=t.lastSampleCount,e._count=t._count,e._time=t._time,e._samples=t._samples,e._startTime=t._startTime,e._timerPending=t._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(t){t instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[t.offsetX,t.offsetY])}_onMouseleave(t){this._getAnimationProps()._mousePosition=null}},lt=Ce;K(lt,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:void 0,autoResizeViewport:!1});var yi=R(U(),1);function bi(i,t){let e=null,n=t?.device||yi.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new lt({...t,device:n,async onInitialize(s){or(s.animationLoop.device);try{return e=new i(s),await e?.onInitialize(s)}catch(o){return sr(s.animationLoop.device,o),null}},onRender:s=>e?.onRender(s),onFinalize:s=>e?.onFinalize(s)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function sr(i,t){if(!i)return;let e=i.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let n=document.getElementById("animation-loop-error");n?.remove(),n=document.createElement("h1"),n.id="animation-loop-error",n.innerHTML=t.message,n.style.position="absolute",n.style.top="10px",n.style.left="10px",n.style.color="black",n.style.backgroundColor="red",e.parentElement?.appendChild(n)}}function or(i){if(!i)return;let t=document.getElementById("animation-loop-error");t&&t.remove()}var w=R(U(),1),Di=R(rt(),1);var Ot=R(U(),1);var Ee={};function S(i="id"){Ee[i]=Ee[i]||1;let t=Ee[i]++;return`${i}-${t}`}var pt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||S("geometry"),this.topology=t.topology,this.indices=t.indices||null,this.attributes=t.attributes,this.vertexCount=t.vertexCount,this.bufferLayout=t.bufferLayout||[],this.indices&&!(this.indices.usage&Ot.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let t of Object.values(this.attributes))t.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(t){return t.byteLength/12}};function _i(i,t){if(t instanceof pt)return t;let e=ar(i,t),{attributes:n,bufferLayout:r}=cr(i,t);return new pt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:n})}function ar(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Ot.Buffer.INDEX,data:e})}function cr(i,t){let e=[],n={};for(let[s,o]of Object.entries(t.attributes)){let a=s;switch(s){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"COLOR_0":a="colors";break}if(o){n[a]=i.createBuffer({data:o.value,id:`${s}-buffer`});let{value:c,size:h,normalized:l}=o;if(h===void 0)throw new Error(`Attribute ${s} is missing a size`);e.push({name:a,format:Ot.vertexFormatDecoder.getVertexFormatFromAttribute(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:n,bufferLayout:e,vertexCount:r}}function Ii(i,t){let e={},n="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[n]:"N/A"}};for(let r of i.attributes)if(r){let s=`${r.location} ${r.name}: ${r.type}`;e[`in ${s}`]={[n]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let s=`${r.location} ${r.name}`;e[`out ${s}`]={[n]:JSON.stringify(r)}}return e}var F=null,Oe=null;function vi(i,{id:t,minimap:e,opaque:n,top:r="0",left:s="0",rgbaScale:o=1}){F||(F=document.createElement("canvas"),F.id=t,F.title=t,F.style.zIndex="100",F.style.position="absolute",F.style.top=r,F.style.left=s,F.style.border="blue 5px solid",F.style.transform="scaleY(-1)",document.body.appendChild(F),Oe=F.getContext("2d")),(F.width!==i.width||F.height!==i.height)&&(F.width=i.width/2,F.height=i.height/2,F.style.width="400px",F.style.height="400px");let a=i.device.readPixelsToArrayWebGL(i),c=Oe?.createImageData(i.width,i.height);if(c){for(let l=0;l<a.length;l+=4)c.data[0+l+0]=a[l+0]*o,c.data[0+l+1]=a[l+1]*o,c.data[0+l+2]=a[l+2]*o,c.data[0+l+3]=n?255:a[l+3]*o;Oe?.putImageData(c,0,0)}}function ie(i,t,e){if(i===t)return!0;if(!e||!i||!t)return!1;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return!1;for(let n=0;n<i.length;n++)if(!ie(i[n],t[n],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let n=Object.keys(i),r=Object.keys(t);if(n.length!==r.length)return!1;for(let s of n)if(!t.hasOwnProperty(s)||!ie(i[s],t[s],e-1))return!1;return!0}return!1}var wi=R(U(),1),gt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let n=[...t];for(let r of e){let s=n.findIndex(o=>o.name===r.name);s<0?n.push(r):n[s]=r}return n}getBufferIndex(t){let e=this.bufferLayouts.findIndex(n=>n.name===t);return e===-1&&wi.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ai(i,t){let e=1/0;for(let n of i){let r=t[n];r!==void 0&&(e=Math.min(e,r))}return e}function Ti(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),n=t.slice();return n.sort((r,s)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=s.attributes?s.attributes.map(l=>l.attribute):[s.name],c=Ai(o,e),h=Ai(a,e);return c-h}),n}function xt(i,t){if(!i||!t.some(n=>n.bindingLayout?.length))return i;let e={...i,bindings:i.bindings.map(n=>({...n}))};"attributes"in(i||{})&&(e.attributes=i?.attributes||[]);for(let n of t)for(let r of n.bindingLayout||[])for(let s of hr(r.name)){let o=e.bindings.find(a=>a.name===s);o?.group===0&&(o.group=r.group)}return e}function yt(i){return Boolean(i.uniformTypes&&!lr(i.uniformTypes))}function hr(i){let t=new Set([i,`${i}Uniforms`]);return i.endsWith("Uniforms")||t.add(`${i}Sampler`),[...t]}function lr(i){for(let t in i)return!1;return!0}var ne=R(U(),1),Ei=R(rt(),1);function Pi(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Si(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function kt(i){return Pi(i)||Si(i)}function dr(i){return kt(i)||typeof i=="number"||typeof i=="boolean"}function Li(i,t={}){let e={bindings:{},uniforms:{}};return Object.keys(i).forEach(n=>{let r=i[n];Object.prototype.hasOwnProperty.call(t,n)||dr(r)?e.uniforms[n]=r:e.bindings[n]=r}),e}var $=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let n=(0,Ei.getShaderModuleDependencies)(Object.values(t).filter(ur));for(let r of n)t[r.name]=r;ne.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,s]of Object.entries(t))s&&(this._addModule(s),s.name&&r!==s.name&&!this.options.disableWarnings&&ne.log.warn(`Module name: ${r} vs ${s.name}`)())}destroy(){}setProps(t){for(let e of Object.keys(t)){let n=e,r=t[n]||{},s=this.modules[n];if(!s){this.options.disableWarnings||ne.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[n],a=this.moduleBindings[n],c=s.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Li(c,s.uniformTypes);this.moduleUniforms[n]=Ci(o,h,s.uniformTypes),this.moduleBindings[n]={...a,...l}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let t={};for(let e of Object.values(this.moduleBindings))Object.assign(t,e);return t}getDebugTable(){let t={};for(let[e,n]of Object.entries(this.moduleUniforms))for(let[r,s]of Object.entries(n))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(s)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=Ci({},t.defaultUniforms||{},t.uniformTypes),this.moduleBindings[e]={}}};function Ci(i={},t={},e={}){let n={...i};for(let[r,s]of Object.entries(t))s!==void 0&&(n[r]=ke(i[r],s,e[r]));return n}function ke(i,t,e){if(!e||typeof e=="string")return Rt(t);if(Array.isArray(e)){if(Re(t)||!Array.isArray(t))return Rt(t);let o=Array.isArray(i)&&!Re(i)?[...i]:[],a=o.slice();for(let c=0;c<t.length;c++){let h=t[c];h!==void 0&&(a[c]=ke(o[c],h,e[0]))}return a}if(!Ne(t))return Rt(t);let n=e,r=Ne(i)?i:{},s={...r};for(let[o,a]of Object.entries(t))a!==void 0&&(s[o]=ke(r[o],a,n[o]));return s}function Rt(i){return ArrayBuffer.isView(i)?Array.prototype.slice.call(i):Array.isArray(i)?Re(i)?i.slice():i.map(e=>e===void 0?void 0:Rt(e)):Ne(i)?Object.fromEntries(Object.entries(i).map(([t,e])=>[t,e===void 0?void 0:Rt(e)])):i}function Re(i){return ArrayBuffer.isView(i)||Array.isArray(i)&&(i.length===0||typeof i[0]=="number")}function Ne(i){return Boolean(i)&&typeof i=="object"&&!Array.isArray(i)&&!ArrayBuffer.isView(i)}function ur(i){return Boolean(i?.dependencies)}var k=R(U(),1);var Ft=R(U(),1);var De={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Nt(i){return i?Array.isArray(i)?i[0]??null:i:null}function Oi(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let n=Nt(e);if(!n)return null;let{width:r}=Dt(n);return{width:r,height:1}}case"2d":{let n=Nt(e);return n?Dt(n):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let n=Nt(e[0]);return n?Dt(n):null}case"cube":{let n=Object.keys(e)[0]??null;if(!n)return null;let r=e[n],s=Nt(r);return s?Dt(s):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let n=e[0],r=Object.keys(n)[0]??null;if(!r)return null;let s=Nt(n[r]);return s?Dt(s):null}default:return null}}function Dt(i){if((0,Ft.isExternalImage)(i))return(0,Ft.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function fr(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function mr(i){return ArrayBuffer.isView(i)}function Fe(i){let{textureFormat:t,format:e}=i;if(t&&e&&t!==e)throw new Error(`Conflicting texture formats "${t}" and "${e}" provided for the same mip level`);return t??e}function ki(i){let t=De[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function pr(i,t){return 6*i+ki(t)}function Be(i){throw new Error("setTexture1DData not supported in WebGL.")}function gr(i){return Array.isArray(i)?i:[i]}function dt(i,t,e,n){let r=gr(t),s=i,o=[];for(let a=0;a<r.length;a++){let c=r[a];if((0,Ft.isExternalImage)(c))o.push({type:"external-image",image:c,z:s,mipLevel:a});else if(fr(c))o.push({type:"texture-data",data:c,textureFormat:Fe(c),z:s,mipLevel:a});else if(mr(c)&&e)o.push({type:"texture-data",data:{data:c,width:Math.max(1,e.width>>a),height:Math.max(1,e.height>>a),...n?{format:n}:{}},textureFormat:n,z:s,mipLevel:a});else throw new Error("Unsupported 2D mip-level payload")}return o}function ze(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function je(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function Ge(i){let t=[];for(let[e,n]of Object.entries(i)){let r=ki(e);t.push(...dt(r,n))}return t}function Ue(i){let t=[];return i.forEach((e,n)=>{for(let[r,s]of Object.entries(e)){let o=pr(n,r);t.push(...dt(o,s))}}),t}var Ve=class{device;id;props;_texture=null;_sampler=null;_view=null;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get texture(){if(!this._texture)throw new Error("Texture not initialized yet");return this._texture}get sampler(){if(!this._sampler)throw new Error("Sampler not initialized yet");return this._sampler}get view(){if(!this._view)throw new Error("View not initialized yet");return this._view}get[Symbol.toStringTag](){return"DynamicTexture"}toString(){return`DynamicTexture:"${this.id}":${this.texture.width}x${this.texture.height}px:(${this.isReady?"ready":"loading..."})`}constructor(t,e){this.device=t;let n=S("dynamic-texture"),r=e;this.props={...Ve.defaultProps,id:n,...e,data:null},this.id=this.props.id,this.ready=new Promise((s,o)=>{this.resolveReady=s,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let n=e.data?xr({...e,width:t.width,height:t.height,format:t.format}):[],r="format"in t&&t.format!==void 0,s="usage"in t&&t.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let f=Oi(e);return f||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=yr(this.device,n,a,{format:r?t.format:void 0}),h=c.format??this.props.format,l={...this.props,...a,format:h,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(h)&&!s&&(l.usage=k.Texture.SAMPLE|k.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(h);if(this.device.type==="webgpu"&&d){let f=this.props.dimension==="3d"?k.Texture.SAMPLE|k.Texture.STORAGE|k.Texture.COPY_DST|k.Texture.COPY_SRC:k.Texture.SAMPLE|k.Texture.RENDER|k.Texture.COPY_DST|k.Texture.COPY_SRC;l.usage|=f}let u=this.device.getMipLevelCount(l.width,l.height),g=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?u:Math.max(1,Math.min(u,this.props.mipLevels??1)),p={...l,mipLevels:g};this._texture=this.device.createTexture(p),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&k.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),k.log.info(0,`${this} created`)()}catch(e){let n=e instanceof Error?e:new Error(String(e));this.rejectReady(n)}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):k.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof k.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}async readBuffer(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=this.device.createBuffer({byteLength:s.byteLength,usage:k.Buffer.COPY_DST|k.Buffer.MAP_READ});this.texture.readBuffer({...t,width:e,height:n,depthOrArrayLayers:r},o);let a=this.device.createFence();return await a.signaled,a.destroy(),o}async readAsync(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=await this.readBuffer(t),a=await o.readAsync(0,s.byteLength);return o.destroy(),a.buffer}resize(t){if(this._checkReady(),t.width===this.texture.width&&t.height===this.texture.height)return!1;let e=this.texture;return this._texture=e.clone(t),this._sampler=this.texture.sampler,this._view=this.texture.view,e.destroy(),k.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=De[t];if(e===void 0)throw new Error(`Invalid cube face: ${t}`);return e}getCubeArrayFaceIndex(t,e){return 6*t+this.getCubeFaceIndex(e)}setTexture1DData(t){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let e=Be(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let n=dt(e,t);this._setTextureSubresources(n)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=ze(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=je(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=Ge(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=Ue(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:n,mipLevel:r}=e;switch(e.type){case"external-image":let{image:s,flipY:o}=e;this.texture.copyExternalImage({image:s,z:n,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=e;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:n,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await $e(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&k.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||k.log.warn(`${this} Cannot perform this operation before ready`)}},z=Ve;K(z,"defaultProps",{...k.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function xr(i){if(!i.data)return[];let t=i.width&&i.height?{width:i.width,height:i.height}:void 0,e="format"in i?i.format:void 0;switch(i.dimension){case"1d":return Be(i.data);case"2d":return dt(0,i.data,t,e);case"3d":return ze(i.data);case"2d-array":return je(i.data);case"cube":return Ge(i.data);case"cube-array":return Ue(i.data);default:throw new Error(`Unhandled dimension ${i.dimension}`)}}function yr(i,t,e,n){if(t.length===0)return{subresources:t,mipLevels:1,format:n.format,hasExplicitMipChain:!1};let r=new Map;for(let l of t){let d=r.get(l.z)??[];d.push(l),r.set(l.z,d)}let s=t.some(l=>l.mipLevel>0),o=n.format,a=Number.POSITIVE_INFINITY,c=[];for(let[l,d]of r){let u=[...d].sort((I,m)=>I.mipLevel-m.mipLevel),g=u[0];if(!g||g.mipLevel!==0)throw new Error(`DynamicTexture: slice ${l} is missing mip level 0`);let p=Ni(i,g);if(p.width!==e.width||p.height!==e.height)throw new Error(`DynamicTexture: slice ${l} base level dimensions ${p.width}x${p.height} do not match expected ${e.width}x${e.height}`);let f=Ri(g);if(f){if(o&&o!==f)throw new Error(`DynamicTexture: slice ${l} base level format "${f}" does not match texture format "${o}"`);o=f}let y=o&&i.isTextureFormatCompressed(o)?br(i,p.width,p.height,o):i.getMipLevelCount(p.width,p.height),M=0;for(let I=0;I<u.length;I++){let m=u[I];if(!m||m.mipLevel!==I||I>=y)break;let x=Ni(i,m),b=Math.max(1,p.width>>I),_=Math.max(1,p.height>>I);if(x.width!==b||x.height!==_)break;let T=Ri(m);if(T&&(o||(o=T),T!==o))break;M++,c.push(m)}a=Math.min(a,M)}let h=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(l=>l.mipLevel<h),mipLevels:h,format:o,hasExplicitMipChain:s}}function Ri(i){if(i.type==="texture-data")return i.textureFormat??Fe(i.data)}function Ni(i,t){switch(t.type){case"external-image":return i.getExternalImageSize(t.image);case"texture-data":return{width:t.data.width,height:t.data.height};default:throw new Error("Unsupported texture subresource")}}function br(i,t,e,n){let{blockWidth:r=1,blockHeight:s=1}=i.getTextureFormatInfo(n),o=1;for(let a=1;;a++){let c=Math.max(1,t>>a),h=Math.max(1,e>>a);if(c<r||h<s)break;o++}return o}async function $e(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map($e));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t).map($e)),n=Object.keys(t),r={};for(let s=0;s<n.length;s++)r[n[s]]=e[s];return r}return i}var ut=2,Mr=1e4,Xe=class{device;id;source;vs;fs;pipelineFactory;shaderFactory;userData={};parameters;topology;bufferLayout;isInstanced=void 0;instanceCount=0;vertexCount;indexBuffer=null;bufferAttributes={};constantAttributes={};bindings={};vertexArray;transformFeedback=null;pipeline;shaderInputs;material=null;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;_bindingTable=[];get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...Xe.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData),this.material=e.material||null;let n=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new $(n,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let s=_r(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.props.shaderLayout=xt(this.props.shaderLayout,o)||null,this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h,bindingTable:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:s,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this._bindingTable=l;let d=t.getShaderLayout?.(this.source);this.props.shaderLayout=xt(this.props.shaderLayout||d||null,o)||null}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:s,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l,this._bindingTable=[]}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,e.geometry&&this.setGeometry(e.geometry),this.pipelineFactory=e.pipelineFactory||w.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||w.ShaderFactory.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=t.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in e&&(this.isInstanced=e.isInstanced),e.instanceCount&&this.setInstanceCount(e.instanceCount),e.vertexCount&&this.setVertexCount(e.vertexCount),e.indexBuffer&&this.setIndexBuffer(e.indexBuffer),e.attributes&&this.setAttributes(e.attributes),e.constantAttributes&&this.setConstantAttributes(e.constantAttributes),e.bindings&&this.setBindings(e.bindings),e.transformFeedback&&(this.transformFeedback=e.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let t=this._needsRedraw;return this._needsRedraw=!1,t}setNeedsRedraw(t){this._needsRedraw||=t}getBindingDebugTable(){return this._bindingTable}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return w.log.info(ut,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let n;try{t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let r=this._getBindings(),s=this._getBindGroups(),{indexBuffer:o}=this.vertexArray,a=o?o.byteLength/(o.indexType==="uint32"?4:2):void 0;n=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:a,transformFeedback:this.transformFeedback||void 0,bindings:r,bindGroups:s,_bindGroupCacheKeys:this._getBindGroupCacheKeys(),uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),n?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",n}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&_i(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let n=new gt(this.bufferLayout);this.bufferLayout=n.mergeBufferLayouts(e.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(e)}this._gpuGeometry=e}setTopology(t){t!==this.topology&&(this.topology=t,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(t){let e=new gt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){ie(t,this.parameters,2)||(this.parameters=t,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(t){this.instanceCount=t,this.isInstanced===void 0&&t>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(t){this.vertexCount=t,this.setNeedsRedraw("vertexCount")}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new w.UniformStore(this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(yt(n)&&!this.material?.ownsModule(e)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}setMaterial(t){this.material=t,this.setNeedsRedraw("material")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this._getNonMaterialBindings(this.shaderInputs.getBindingValues())),this.setNeedsRedraw("shaderInputs")}setBindings(t){Object.assign(this.bindings,t),this.setNeedsRedraw("bindings")}setTransformFeedback(t){this.transformFeedback=t,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(t){this.vertexArray.setIndexBuffer(t),this.setNeedsRedraw("indexBuffer")}setAttributes(t,e){let n=e?.disableWarnings??this.props.disableWarnings;t.indices&&w.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ti(this.pipeline.shaderLayout,this.bufferLayout);let r=new gt(this.bufferLayout);for(let[s,o]of Object.entries(t)){let a=r.getBufferLayout(s);if(!a){n||w.log.warn(`Model(${this.id}): Missing layout for buffer "${s}".`)();continue}let c=r.getAttributeNamesForBuffer(a),h=!1;for(let l of c){let d=this._attributeInfos[l];if(d){let u=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(u,o),h=!0}}!h&&!n&&w.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${s}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[n,r]of Object.entries(t)){let s=this._attributeInfos[n];s?this.vertexArray.setConstantWebGL(s.location,r):(e?.disableWarnings??this.props.disableWarnings)||w.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${n}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof z&&!t.isReady)return t.id;for(let t of Object.values(this.material?.bindings||{}))if(t instanceof z&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))n instanceof z?n.isReady&&(t[e]=n.texture):t[e]=n;return t}_getBindGroups(){let t=this.pipeline?.shaderLayout||this.props.shaderLayout||{bindings:[]},e=t.bindings.length?(0,w.normalizeBindingsByGroup)(t,this._getBindings()):{0:this._getBindings()};if(!this.material)return e;for(let[n,r]of Object.entries(this.material.getBindingsByGroup())){let s=Number(n);e[s]={...e[s]||{},...r}}return e}_getBindGroupCacheKeys(){let t=this.material?.getBindGroupCacheKey(3);return t?{3:t}:{}}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof w.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof w.Buffer||e instanceof w.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof w.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return Math.max(t,this.material?.getBindingsUpdateTimestamp()||0)}_setGeometryAttributes(t){let e={...t.attributes};for(let[n]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===n)&&n!=="positions"&&delete e[n];this.vertexCount=t.vertexCount,this.setIndexBuffer(t.indices||null),this.setAttributes(t.attributes,{disableWarnings:!0}),this.setAttributes(e,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate||=t,this.setNeedsRedraw(t)}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null,e=null;this.pipeline&&(w.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let n=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=n:this.fs&&(r=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"fragment",source:this.source||this.fs,debugShaders:this.props.debugShaders})),this.pipeline=this.pipelineFactory.createRenderPipeline({...this.props,bindings:void 0,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindGroups:this._getBindGroups(),vs:n,fs:r}),this._attributeInfos=(0,w.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&e!==t&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=w.log.level>3?0:Mr;w.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,w.log.group(ut,`>>> DRAWING MODEL ${this.id}`,{collapsed:w.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Ii(this.pipeline.shaderLayout,this.id);w.log.table(ut,t)();let e=this.shaderInputs.getDebugTable();w.log.table(ut,e)();let n=this._getAttributeDebugTable();w.log.table(ut,this._attributeInfos)(),w.log.table(ut,n)(),w.log.groupEnd(ut)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let n=t.props.framebuffer;n&&vi(n,{id:n.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,n]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[n.location];t[n.location]={name:e,type:n.shaderType,values:r?this._getBufferOrConstantValues(r,n.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,n=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:n.toString()}}return t}_getBufferOrConstantValues(t,e){let n=w.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof w.Buffer?new n(t.debugData):t).toString()}_getNonMaterialBindings(t){if(!this.material)return t;let e={};for(let[n,r]of Object.entries(t))this.material.ownsBinding(n)||(e[n]=r);return e}},W=Xe;K(W,"defaultProps",{...w.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,material:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:Di.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function _r(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var J=R(U(),1);var Bt=3,bt=class{device;modules;_materialBindingNames;_materialModuleNames;constructor(t,e={}){this.device=t,this.modules=e.modules||[];let n=new $(Object.fromEntries(this.modules.map(r=>[r.name,r])));this._materialBindingNames=Ir(n),this._materialModuleNames=vr(n)}createMaterial(t={}){return new Mt(this.device,{...t,factory:this})}getBindingNames(){return Array.from(this._materialBindingNames)}ownsBinding(t){if(this._materialBindingNames.has(t))return!0;let e=qe(t);return e?this._materialModuleNames.has(e):!1}ownsModule(t){return this._materialModuleNames.has(t)}getBindingsByGroup(t){return Object.keys(t).length>0?{[Bt]:t}:{}}};function qe(i){return i.endsWith("Uniforms")?i.slice(0,-8):null}function Ir(i){let t=new Set;for(let e of Object.values(i.modules))for(let n of e.bindingLayout||[])n.group===Bt&&t.add(n.name);return t}function vr(i){let t=new Set;for(let e of Object.values(i.modules))e.name&&e.bindingLayout?.some(n=>n.group===Bt&&n.name===e.name)&&t.add(e.name);return t}var Mt=class{id;device;factory;shaderInputs;bindings={};_uniformStore;_bindGroupCacheToken={};constructor(t,e={}){this.id=e.id||S("material"),this.device=t,this.factory=e.factory||new bt(t,{modules:e.modules||e.shaderInputs?.getModules()||[]});let n=Object.fromEntries((e.shaderInputs?.getModules()||this.factory.modules).map(r=>[r.name,r]));this.shaderInputs=e.shaderInputs||new $(n),this._uniformStore=new J.UniformStore(this.shaderInputs.modules);for(let[r,s]of Object.entries(this.shaderInputs.modules))if(this.ownsModule(r)&&yt(s)){let o=this._uniformStore.getManagedUniformBuffer(this.device,r);this.bindings[`${r}Uniforms`]=o}this.updateShaderInputs(),e.bindings&&this._replaceOwnedBindings(e.bindings)}destroy(){this._uniformStore.destroy()}clone(t={}){let e=this.factory.createMaterial({id:t.id,shaderInputs:t.shaderInputs,bindings:{...this.getResourceBindings(),...t.bindings}});return t.shaderInputs||e.setProps(this.shaderInputs.getUniformValues()),t.moduleProps&&e.setProps(t.moduleProps),e}ownsBinding(t){return this.factory.ownsBinding(t)}ownsModule(t){return this.factory.ownsModule(t)}setProps(t){this.shaderInputs.setProps(t),this.updateShaderInputs()}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this._setOwnedBindings(this.shaderInputs.getBindingValues())&&(this._bindGroupCacheToken={})}getResourceBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))qe(e)||(t[e]=n);return t}getBindings(){let t={},e=t;for(let[n,r]of Object.entries(this.bindings))r instanceof z?r.isReady&&(e[n]=r.texture):e[n]=r;return t}getBindingsByGroup(){return this.factory.getBindingsByGroup(this.getBindings())}getBindGroupCacheKey(t){return t===Bt?this._bindGroupCacheToken:null}getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof J.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof J.Buffer||e instanceof J.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof J.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_replaceOwnedBindings(t){this._setOwnedBindings(t)&&(this._bindGroupCacheToken={})}_setOwnedBindings(t){let e=!1;for(let[n,r]of Object.entries(t))r!==void 0&&this.ownsBinding(n)&&this.bindings[n]!==r&&(this.bindings[n]=r,e=!0);return e}};var Fi=R(U(),1),Bi=R(rt(),1);var re=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=re.defaultProps){if(!re.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new W(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,Bi.getPassthroughFS)(),topology:e.topology||"point-list",varyings:e.outputs||e.varyings,...e}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:e.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(t){t?.inputBuffers&&this.model.setAttributes(t.inputBuffers),t?.outputBuffers&&this.transformFeedback.setBuffers(t.outputBuffers);let e=this.device.beginRenderPass(t);this.model.draw(e),e.end()}getBuffer(t){return this.transformFeedback.getBuffer(t)}readAsync(t){let e=this.getBuffer(t);if(!e)throw new Error("BufferTransform#getBuffer");if(e instanceof Fi.Buffer)return e.readAsync();let{buffer:n,byteOffset:r=0,byteLength:s=n.byteLength}=e;return n.readAsync(r,s)}},zt=re;K(zt,"defaultProps",{...W.defaultProps,outputs:void 0,feedbackBuffers:void 0});var zi=R(rt(),1);var wr="transform_output",se=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(t,e){this.device=t,this.sampler=t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new W(this.device,{id:e.id||S("texture-transform-model"),fs:e.fs||(0,zi.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:wr}),vertexCount:e.vertexCount,...e}),this._initialize(e),Object.seal(this)}destroy(){this.model.destroy();for(let t of this.bindings)t.framebuffer?.destroy()}delete(){this.destroy()}run(t){let{framebuffer:e}=this.bindings[this.currentIndex],n=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(n),n.end(),this.device.submit()}getTargetTexture(){let{targetTexture:t}=this.bindings[this.currentIndex];return t}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(t){this._updateBindings(t)}_updateBindings(t){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],t)}_updateBinding(t,{sourceBuffers:e,sourceTextures:n,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,n),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:s,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:s,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:s,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let n in e)e[n].sampler=this.sampler}};var V=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:n=null,vertexCount:r=null}=t;this.id=t.id||S("geometry"),this.topology=t.topology,n&&(this.indices=ArrayBuffer.isView(n)?{value:n,size:1}:n),this.attributes={};for(let[s,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(s)}: must be typed array or object with value as typed array`);if((s==="POSITION"||s==="positions")&&!a.size&&(a.size=3),s==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[s]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=r||this._calculateVertexCount(this.attributes,this.indices)}getVertexCount(){return this.vertexCount}getAttributes(){return this.indices?{indices:this.indices,...this.attributes}:this.attributes}_print(t){return`Geometry ${this.id} attribute ${t}`}_setAttributes(t,e){return this}_calculateVertexCount(t,e){if(e)return e.value.length;let n=1/0;for(let r of Object.values(t)){let{value:s,size:o,constant:a}=r;!a&&s&&o!==void 0&&o>=1&&(n=Math.min(n,s.length/o))}return n}};var Ar=`struct VertexInputs {
7
+ "use strict";var __exports__=(()=>{var Wn=Object.create;var Et=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var Kn=Object.getOwnPropertyNames;var Zn=Object.getPrototypeOf,Qn=Object.prototype.hasOwnProperty;var Jn=(i,t,e)=>t in i?Et(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var ui=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),tr=(i,t)=>{for(var e in t)Et(i,e,{get:t[e],enumerable:!0})},Wt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Kn(t))!Qn.call(i,r)&&r!==e&&Et(i,r,{get:()=>t[r],enumerable:!(n=Yn(t,r))||n.enumerable});return i},Yt=(i,t,e)=>(Wt(i,t,"default"),e&&Wt(e,t,"default")),k=(i,t,e)=>(e=i!=null?Wn(Zn(i)):{},Wt(t||!i||!i.__esModule?Et(e,"default",{value:i,enumerable:!0}):e,i)),er=i=>Wt(Et({},"__esModule",{value:!0}),i);var Y=(i,t,e)=>(Jn(i,typeof t!="symbol"?t+"":t,e),e);var U=ui((io,mi)=>{mi.exports=globalThis.luma});var nt=ui((vo,bi)=>{bi.exports=globalThis.luma});var $t={};tr($t,{AnimationLoop:()=>lt,AnimationLoopTemplate:()=>Qt,AsyncTexture:()=>to,BackgroundTextureModel:()=>Mt,BufferTransform:()=>Bt,ClipSpace:()=>st,Computation:()=>jt,ConeGeometry:()=>ct,CubeGeometry:()=>be,CylinderGeometry:()=>ye,DirectionalLightModel:()=>ge,DynamicTexture:()=>B,GPUGeometry:()=>mt,Geometry:()=>$,GroupNode:()=>ft,IcoSphereGeometry:()=>Me,KeyFrames:()=>Zt,LegacyPickingManager:()=>Se,Material:()=>yt,MaterialFactory:()=>bt,Model:()=>H,ModelNode:()=>xe,PickingManager:()=>Ut,PlaneGeometry:()=>_e,PointLightModel:()=>me,ScenegraphNode:()=>et,ShaderInputs:()=>G,ShaderPassRenderer:()=>ve,SphereGeometry:()=>_t,SpotLightModel:()=>pe,Swap:()=>At,SwapBuffers:()=>Ie,SwapFramebuffers:()=>Tt,TextureTransform:()=>re,Timeline:()=>Kt,TruncatedConeGeometry:()=>at,cancelAnimationFramePolyfill:()=>te,colorPicking:()=>Gt,indexPicking:()=>Pe,legacyColorPicking:()=>$n,loadImage:()=>Rn,loadImageBitmap:()=>On,makeAnimationLoop:()=>xi,makeRandomGenerator:()=>Ln,picking:()=>Un,requestAnimationFramePolyfill:()=>Jt,resolvePickingBackend:()=>jn,resolvePickingMode:()=>Te,setPathPrefix:()=>Cn,supportsIndexPicking:()=>di});Yt($t,k(U(),1));var ir=1,nr=1,Kt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:n=Number.POSITIVE_INFINITY,rate:r=1,repeat:s=1}=t,o=ir++,a={time:0,delay:e,duration:n,rate:r,repeat:s};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,n]of this.animations)n.channel===t&&this.detachAnimation(e)}isFinished(t){let e=this.channels.get(t);return e===void 0?!1:this.time>=e.delay+e.duration*e.repeat}getTime(t){if(t===void 0)return this.time;let e=this.channels.get(t);return e===void 0?-1:e.time}setTime(t){this.time=Math.max(0,t);let e=this.channels.values();for(let r of e)this._setChannelTime(r,this.time);let n=this.animations.values();for(let r of n){let{animation:s,channel:o}=r;s.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let n=nr++;return this.animations.set(n,{animation:t,channel:e}),t.setTime(this.getTime(e)),n}detachAnimation(t){this.animations.delete(t)}update(t){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=t),this.setTime(this.time+(t-this.lastEngineTime)),this.lastEngineTime=t)}_setChannelTime(t,e){let n=e-t.delay,r=t.duration*t.repeat;n>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,n)%t.duration,t.time*=t.rate)}};var Zt=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(t){this.setKeyFrames(t),this.setTime(0)}setKeyFrames(t){let e=t.length;this.times.length=e,this.values.length=e;for(let n=0;n<e;++n)this.times[n]=t[n][0],this.values[n]=t[n][1];this._calculateKeys(this._lastTime)}setTime(t){t=Math.max(0,t),t!==this._lastTime&&(this._calculateKeys(t),this._lastTime=t)}getStartTime(){return this.times[this.startIndex]}getEndTime(){return this.times[this.endIndex]}getStartData(){return this.values[this.startIndex]}getEndData(){return this.values[this.endIndex]}_calculateKeys(t){let e=0,n=this.times.length;for(e=0;e<n-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],s=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(s-r)),1)}};var Qt=class{constructor(t){}async onInitialize(t){return null}};var pi=k(U(),1);function Jt(i){let t=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return t?t.call(window,i):setTimeout(()=>i(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function te(i){let t=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(t){t.call(window,i);return}clearTimeout(i)}function Lt(){let i;if(typeof window<"u"&&window.performance)i=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();i=t[0]*1e3+t[1]/1e6}else i=Date.now();return i}var ht=class{constructor(t,e){this.sampleSize=1,this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this.name=t,this.type=e,this.reset()}reset(){return this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this}setSampleSize(t){return this.sampleSize=t,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(t){return this._count+=t,this._samples++,this._checkSampling(),this}subtractCount(t){return this._count-=t,this._samples++,this._checkSampling(),this}addTime(t){return this._time+=t,this.lastTiming=t,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Lt(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Lt()-this._startTime),this._timerPending=!1,this._checkSampling(),this):this}getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0}getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0}getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1e3):0}getAverageCount(){return this.samples>0?this.count/this.samples:0}getAverageTime(){return this.samples>0?this.time/this.samples:0}getHz(){return this.time>0?this.samples/(this.time/1e3):0}_checkSampling(){this._samples===this.sampleSize&&(this.lastSampleTime=this._time,this.lastSampleCount=this._count,this.count+=this._count,this.time+=this._time,this.samples+=this._samples,this._time=0,this._count=0,this._samples=0)}};var ut=class{constructor(t){this.stats={},this.id=t.id,this.stats={},this._initializeStats(t.stats),Object.seal(this)}get(t,e="count"){return this._getOrCreate({name:t,type:e})}get size(){return Object.keys(this.stats).length}reset(){for(let t of Object.values(this.stats))t.reset();return this}forEach(t){for(let e of Object.values(this.stats))t(e)}getTable(){let t={};return this.forEach(e=>{t[e.name]={time:e.time||0,count:e.count||0,average:e.getAverageTime()||0,hz:e.getHz()||0}}),t}_initializeStats(t=[]){t.forEach(e=>this._getOrCreate(e))}_getOrCreate(t){let{name:e,type:n}=t,r=this.stats[e];return r||(t instanceof ht?r=t:r=new ht(e,n),this.stats[e]=r),r}};var rr=0,sr="Animation Loop",Ee=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(t){if(this.props={...Ee.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new ut({id:`animation-loop-${rr++}`}),this.sharedStats=pi.luma.stats.get(sr),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:t.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this._needsRedraw=this._needsRedraw||t,this}needsRedraw(){let t=this._needsRedraw;return this._needsRedraw=!1,t}setProps(t){return"autoResizeViewport"in t&&(this.props.autoResizeViewport=t.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let t;if(!this._initialized){if(this._initialized=!0,await this._initDevice(),this._initialize(),!this._running)return null;await this.props.onInitialize(this._getAnimationProps())}return this._running?(t!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(t){let e=t instanceof Error?t:new Error("Unknown error");throw this.props.onError(e),e}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(t){return this.device?.isLost||this._error?this:(this._beginFrameTimers(t),this._setupFrame(),this._updateAnimationProps(),this._renderFrame(this._getAnimationProps()),this._clearNeedsRedraw(),this._resolveNextFrame&&(this._resolveNextFrame(this),this._nextFramePromise=null,this._resolveNextFrame=null),this._endFrameTimers(),this)}attachTimeline(t){return this.timeline=t,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(t=>{this._resolveNextFrame=t})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=Jt(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(te(this._animationFrameId),this._animationFrameId=null)}_animationFrame(t){this._running&&(this.redraw(t),this._requestAnimationFrame())}_renderFrame(t){if(this.display){this.display._renderFrame(t);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let t=this.device?.getDefaultCanvasContext();if(!this.device||!t)throw new Error("loop");let e=t?.canvas,n=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:n,timeline:this.timeline,needsRedraw:!1,width:1,height:1,aspect:1,time:0,startTime:Date.now(),engineTime:0,tick:0,tock:0,_mousePosition:null}}_getAnimationProps(){if(!this.animationProps)throw new Error("animationProps");return this.animationProps}_updateAnimationProps(){if(!this.animationProps)return;let{width:t,height:e,aspect:n}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),n!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=n,this.animationProps.needsRedraw=this._needsRedraw,this.animationProps.engineTime=Date.now()-this.animationProps.startTime,this.timeline&&this.timeline.update(this.animationProps.engineTime),this.animationProps.tick=Math.floor(this.animationProps.time/1e3*60),this.animationProps.tock++,this.animationProps.time=this.timeline?this.timeline.getTime():this.animationProps.engineTime}async _initDevice(){if(this.device=await this.props.device,!this.device)throw new Error("No device provided");this.canvas=this.device.getDefaultCanvasContext().canvas||null}_createInfoDiv(){if(this.canvas&&this.props.onAddHTML){let t=document.createElement("div");document.body.appendChild(t),t.style.position="relative";let e=document.createElement("div");e.style.position="absolute",e.style.left="10px",e.style.bottom="10px",e.style.width="300px",e.style.background="white",this.canvas instanceof HTMLCanvasElement&&t.appendChild(this.canvas),t.appendChild(e);let n=this.props.onAddHTML(e);n&&(e.innerHTML=n)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),n=t>0&&e>0?t/e:1;return{width:t,height:e,aspect:n}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(t){let e=t??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let n=e-this._lastFrameTime;n>0&&this.frameRate.addTime(n)}this._lastFrameTime=e,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let t=this.device.commandEncoder._gpuTimeMs;t!==void 0&&(this.gpuTime.addTime(t),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let t of Object.keys(this.sharedStats.stats))this.stats.stats[t]||delete this.sharedStats.stats[t];this.stats.forEach(t=>{let e=this.sharedStats.get(t.name,t.type);e.sampleSize=t.sampleSize,e.time=t.time,e.count=t.count,e.samples=t.samples,e.lastTiming=t.lastTiming,e.lastSampleTime=t.lastSampleTime,e.lastSampleCount=t.lastSampleCount,e._count=t._count,e._time=t._time,e._samples=t._samples,e._startTime=t._startTime,e._timerPending=t._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(t){t instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[t.offsetX,t.offsetY])}_onMouseleave(t){this._getAnimationProps()._mousePosition=null}},lt=Ee;Y(lt,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:void 0,autoResizeViewport:!1});var gi=k(U(),1);function xi(i,t){let e=null,n=t?.device||gi.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new lt({...t,device:n,async onInitialize(s){ar(s.animationLoop.device);try{return e=new i(s),await e?.onInitialize(s)}catch(o){return console.error(o),or(s.animationLoop.device,o),null}},onRender:s=>e?.onRender(s),onFinalize:s=>e?.onFinalize(s)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function or(i,t){if(!i)return;let e=i.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let n=document.getElementById("animation-loop-error");n?.remove(),n=document.createElement("h1"),n.id="animation-loop-error",n.innerHTML=t.message,n.style.position="absolute",n.style.top="10px",n.style.left="10px",n.style.color="black",n.style.backgroundColor="red",e.parentElement?.appendChild(n)}}function ar(i){if(!i)return;let t=document.getElementById("animation-loop-error");t&&t.remove()}var w=k(U(),1),Fi=k(nt(),1);var Ct=k(U(),1);var Le={};function S(i="id"){Le[i]=Le[i]||1;let t=Le[i]++;return`${i}-${t}`}var mt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||S("geometry"),this.topology=t.topology,this.indices=t.indices||null,this.attributes=t.attributes,this.vertexCount=t.vertexCount,this.bufferLayout=t.bufferLayout||[],this.indices&&!(this.indices.usage&Ct.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let t of Object.values(this.attributes))t.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(t){return t.byteLength/12}};function yi(i,t){if(t instanceof mt)return t;let e=cr(i,t),{attributes:n,bufferLayout:r}=hr(i,t);return new mt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:n})}function cr(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Ct.Buffer.INDEX,data:e})}function hr(i,t){let e=[],n={};for(let[s,o]of Object.entries(t.attributes)){let a=s;switch(s){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"TEXCOORD_1":a="texCoords1";break;case"COLOR_0":a="colors";break}if(o){n[a]=i.createBuffer({data:o.value,id:`${s}-buffer`});let{value:c,size:h,normalized:l}=o;if(h===void 0)throw new Error(`Attribute ${s} is missing a size`);e.push({name:a,format:Ct.vertexFormatDecoder.getVertexFormatFromAttribute(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:n,bufferLayout:e,vertexCount:r}}function Mi(i,t){let e={},n="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[n]:"N/A"}};for(let r of i.attributes)if(r){let s=`${r.location} ${r.name}: ${r.type}`;e[`in ${s}`]={[n]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let s=`${r.location} ${r.name}`;e[`out ${s}`]={[n]:JSON.stringify(r)}}return e}var _i="__debugFramebufferState";function vi(i,t,e){if(i.device.type!=="webgl")return;let n=fr(i.device);if(!n.flushing){if(mr(i)){lr(i,e,n);return}t&&ur(t)&&t.handle!==null&&(n.queuedFramebuffers.includes(t)||n.queuedFramebuffers.push(t))}}function lr(i,t,e){if(e.queuedFramebuffers.length===0)return;let n=i.device,{gl:r}=n,s=r.getParameter(36010),o=r.getParameter(36006),[a,c]=i.device.getDefaultCanvasContext().getDrawingBufferSize(),h=Ii(t.top,8),l=Ii(t.left,8);e.flushing=!0;try{for(let d of e.queuedFramebuffers){let[f,p,g,u,b]=dr({framebuffer:d,targetWidth:a,targetHeight:c,topPx:h,leftPx:l,minimap:t.minimap});r.bindFramebuffer(36008,d.handle),r.bindFramebuffer(36009,null),r.blitFramebuffer(0,0,d.width,d.height,f,p,g,u,16384,9728),h+=b+8}}finally{r.bindFramebuffer(36008,s),r.bindFramebuffer(36009,o),e.flushing=!1}}function dr(i){let{framebuffer:t,targetWidth:e,targetHeight:n,topPx:r,leftPx:s,minimap:o}=i,a=o?Math.max(Math.floor(e/4),1):e,c=o?Math.max(Math.floor(n/4),1):n,h=Math.min(a/t.width,c/t.height),l=Math.max(Math.floor(t.width*h),1),d=Math.max(Math.floor(t.height*h),1),f=s,p=Math.max(n-r-d,0),g=f+l,u=p+d;return[f,p,g,u,d]}function fr(i){return i.userData[_i]||={flushing:!1,queuedFramebuffers:[]},i.userData[_i]}function ur(i){return"colorAttachments"in i}function mr(i){let t=i.props.framebuffer;return!t||t.handle===null}function Ii(i,t){if(!i)return t;let e=Number.parseInt(i,10);return Number.isFinite(e)?e:t}function ee(i,t,e){if(i===t)return!0;if(!e||!i||!t)return!1;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return!1;for(let n=0;n<i.length;n++)if(!ee(i[n],t[n],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let n=Object.keys(i),r=Object.keys(t);if(n.length!==r.length)return!1;for(let s of n)if(!t.hasOwnProperty(s)||!ee(i[s],t[s],e-1))return!1;return!0}return!1}var wi=k(U(),1),pt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let n=[...t];for(let r of e){let s=n.findIndex(o=>o.name===r.name);s<0?n.push(r):n[s]=r}return n}getBufferIndex(t){let e=this.bufferLayouts.findIndex(n=>n.name===t);return e===-1&&wi.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ai(i,t){let e=1/0;for(let n of i){let r=t[n];r!==void 0&&(e=Math.min(e,r))}return e}function Ti(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),n=t.slice();return n.sort((r,s)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=s.attributes?s.attributes.map(l=>l.attribute):[s.name],c=Ai(o,e),h=Ai(a,e);return c-h}),n}function gt(i,t){if(!i||!t.some(n=>n.bindingLayout?.length))return i;let e={...i,bindings:i.bindings.map(n=>({...n}))};"attributes"in(i||{})&&(e.attributes=i?.attributes||[]);for(let n of t)for(let r of n.bindingLayout||[])for(let s of pr(r.name)){let o=e.bindings.find(a=>a.name===s);o?.group===0&&(o.group=r.group)}return e}function xt(i){return Boolean(i.uniformTypes&&!gr(i.uniformTypes))}function pr(i){let t=new Set([i,`${i}Uniforms`]);return i.endsWith("Uniforms")||t.add(`${i}Sampler`),[...t]}function gr(i){for(let t in i)return!1;return!0}var ie=k(U(),1),Ci=k(nt(),1);function Pi(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Si(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function Ot(i){return Pi(i)||Si(i)}function xr(i){return Ot(i)||typeof i=="number"||typeof i=="boolean"}function Ei(i,t={}){let e={bindings:{},uniforms:{}};return Object.keys(i).forEach(n=>{let r=i[n];Object.prototype.hasOwnProperty.call(t,n)||xr(r)?e.uniforms[n]=r:e.bindings[n]=r}),e}var G=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let n=(0,Ci.getShaderModuleDependencies)(Object.values(t).filter(br));for(let r of n)t[r.name]=r;ie.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,s]of Object.entries(t))s&&(this._addModule(s),s.name&&r!==s.name&&!this.options.disableWarnings&&ie.log.warn(`Module name: ${r} vs ${s.name}`)())}destroy(){}setProps(t){for(let e of Object.keys(t)){let n=e,r=t[n]||{},s=this.modules[n];if(!s)this.options.disableWarnings||ie.log.warn(`Module ${e} not found`)();else{let o=this.moduleUniforms[n],a=this.moduleBindings[n],c=s.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Ei(c,s.uniformTypes);this.moduleUniforms[n]=Li(o,h,s.uniformTypes),this.moduleBindings[n]={...a,...l}}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let t={};for(let e of Object.values(this.moduleBindings))Object.assign(t,e);return t}getDebugTable(){let t={};for(let[e,n]of Object.entries(this.moduleUniforms))for(let[r,s]of Object.entries(n))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(s)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=Li({},t.defaultUniforms||{},t.uniformTypes),this.moduleBindings[e]={}}};function Li(i={},t={},e={}){let n={...i};for(let[r,s]of Object.entries(t))s!==void 0&&(n[r]=Ce(i[r],s,e[r]));return n}function Ce(i,t,e){if(!e||typeof e=="string")return Rt(t);if(Array.isArray(e)){if(Oe(t)||!Array.isArray(t))return Rt(t);let o=Array.isArray(i)&&!Oe(i)?[...i]:[],a=o.slice();for(let c=0;c<t.length;c++){let h=t[c];h!==void 0&&(a[c]=Ce(o[c],h,e[0]))}return a}if(!Re(t))return Rt(t);let n=e,r=Re(i)?i:{},s={...r};for(let[o,a]of Object.entries(t))a!==void 0&&(s[o]=Ce(r[o],a,n[o]));return s}function Rt(i){return ArrayBuffer.isView(i)?Array.prototype.slice.call(i):Array.isArray(i)?Oe(i)?i.slice():i.map(e=>e===void 0?void 0:Rt(e)):Re(i)?Object.fromEntries(Object.entries(i).map(([t,e])=>[t,e===void 0?void 0:Rt(e)])):i}function Oe(i){return ArrayBuffer.isView(i)||Array.isArray(i)&&(i.length===0||typeof i[0]=="number")}function Re(i){return Boolean(i)&&typeof i=="object"&&!Array.isArray(i)&&!ArrayBuffer.isView(i)}function br(i){return Boolean(i?.dependencies)}var R=k(U(),1);var Dt=k(U(),1);var ke={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function kt(i){return i?Array.isArray(i)?i[0]??null:i:null}function Oi(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let n=kt(e);if(!n)return null;let{width:r}=Nt(n);return{width:r,height:1}}case"2d":{let n=kt(e);return n?Nt(n):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let n=kt(e[0]);return n?Nt(n):null}case"cube":{let n=Object.keys(e)[0]??null;if(!n)return null;let r=e[n],s=kt(r);return s?Nt(s):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let n=e[0],r=Object.keys(n)[0]??null;if(!r)return null;let s=kt(n[r]);return s?Nt(s):null}default:return null}}function Nt(i){if((0,Dt.isExternalImage)(i))return(0,Dt.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function yr(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function Mr(i){return ArrayBuffer.isView(i)}function Ne(i){let{textureFormat:t,format:e}=i;if(t&&e&&t!==e)throw new Error(`Conflicting texture formats "${t}" and "${e}" provided for the same mip level`);return t??e}function Ri(i){let t=ke[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function _r(i,t){return 6*i+Ri(t)}function De(i){throw new Error("setTexture1DData not supported in WebGL.")}function Ir(i){return Array.isArray(i)?i:[i]}function dt(i,t,e,n){let r=Ir(t),s=i,o=[];for(let a=0;a<r.length;a++){let c=r[a];if((0,Dt.isExternalImage)(c))o.push({type:"external-image",image:c,z:s,mipLevel:a});else if(yr(c))o.push({type:"texture-data",data:c,textureFormat:Ne(c),z:s,mipLevel:a});else if(Mr(c)&&e)o.push({type:"texture-data",data:{data:c,width:Math.max(1,e.width>>a),height:Math.max(1,e.height>>a),...n?{format:n}:{}},textureFormat:n,z:s,mipLevel:a});else throw new Error("Unsupported 2D mip-level payload")}return o}function Fe(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function Be(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function ze(i){let t=[];for(let[e,n]of Object.entries(i)){let r=Ri(e);t.push(...dt(r,n))}return t}function je(i){let t=[];return i.forEach((e,n)=>{for(let[r,s]of Object.entries(e)){let o=_r(n,r);t.push(...dt(o,s))}}),t}var Ge=class{device;id;props;_texture=null;_sampler=null;_view=null;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get texture(){if(!this._texture)throw new Error("Texture not initialized yet");return this._texture}get sampler(){if(!this._sampler)throw new Error("Sampler not initialized yet");return this._sampler}get view(){if(!this._view)throw new Error("View not initialized yet");return this._view}get[Symbol.toStringTag](){return"DynamicTexture"}toString(){let t=this._texture?.width??this.props.width??"?",e=this._texture?.height??this.props.height??"?";return`DynamicTexture:"${this.id}":${t}x${e}px:(${this.isReady?"ready":"loading..."})`}constructor(t,e){this.device=t;let n=S("dynamic-texture"),r=e;this.props={...Ge.defaultProps,id:n,...e,data:null},this.id=this.props.id,this.ready=new Promise((s,o)=>{this.resolveReady=s,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let n=e.data?vr({...e,width:t.width,height:t.height,format:t.format}):[],r="format"in t&&t.format!==void 0,s="usage"in t&&t.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let u=Oi(e);return u||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=wr(this.device,n,a,{format:r?t.format:void 0}),h=c.format??this.props.format,l={...this.props,...a,format:h,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(h)&&!s&&(l.usage=R.Texture.SAMPLE|R.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(h);if(this.device.type==="webgpu"&&d){let u=this.props.dimension==="3d"?R.Texture.SAMPLE|R.Texture.STORAGE|R.Texture.COPY_DST|R.Texture.COPY_SRC:R.Texture.SAMPLE|R.Texture.RENDER|R.Texture.COPY_DST|R.Texture.COPY_SRC;l.usage|=u}let f=this.device.getMipLevelCount(l.width,l.height),p=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?f:Math.max(1,Math.min(f,this.props.mipLevels??1)),g={...l,mipLevels:p};this._texture=this.device.createTexture(g),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&R.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),R.log.info(0,`${this} created`)()}catch(e){let n=e instanceof Error?e:new Error(String(e));this.rejectReady(n)}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):R.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof R.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}async readBuffer(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=this.device.createBuffer({byteLength:s.byteLength,usage:R.Buffer.COPY_DST|R.Buffer.MAP_READ});this.texture.readBuffer({...t,width:e,height:n,depthOrArrayLayers:r},o);let a=this.device.createFence();return await a.signaled,a.destroy(),o}async readAsync(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=await this.readBuffer(t),a=await o.readAsync(0,s.byteLength);return o.destroy(),a.buffer}resize(t){if(this._checkReady(),t.width===this.texture.width&&t.height===this.texture.height)return!1;let e=this.texture;return this._texture=e.clone(t),this._sampler=this.texture.sampler,this._view=this.texture.view,e.destroy(),R.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=ke[t];if(e===void 0)throw new Error(`Invalid cube face: ${t}`);return e}getCubeArrayFaceIndex(t,e){return 6*t+this.getCubeFaceIndex(e)}setTexture1DData(t){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let e=De(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let n=dt(e,t);this._setTextureSubresources(n)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=Fe(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=Be(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=ze(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=je(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:n,mipLevel:r}=e;switch(e.type){case"external-image":let{image:s,flipY:o}=e;this.texture.copyExternalImage({image:s,z:n,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=e;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:n,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await Ue(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&R.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||R.log.warn(`${this} Cannot perform this operation before ready`)}},B=Ge;Y(B,"defaultProps",{...R.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function vr(i){if(!i.data)return[];let t=i.width&&i.height?{width:i.width,height:i.height}:void 0,e="format"in i?i.format:void 0;switch(i.dimension){case"1d":return De(i.data);case"2d":return dt(0,i.data,t,e);case"3d":return Fe(i.data);case"2d-array":return Be(i.data);case"cube":return ze(i.data);case"cube-array":return je(i.data);default:throw new Error(`Unhandled dimension ${i.dimension}`)}}function wr(i,t,e,n){if(t.length===0)return{subresources:t,mipLevels:1,format:n.format,hasExplicitMipChain:!1};let r=new Map;for(let l of t){let d=r.get(l.z)??[];d.push(l),r.set(l.z,d)}let s=t.some(l=>l.mipLevel>0),o=n.format,a=Number.POSITIVE_INFINITY,c=[];for(let[l,d]of r){let f=[...d].sort((I,m)=>I.mipLevel-m.mipLevel),p=f[0];if(!p||p.mipLevel!==0)throw new Error(`DynamicTexture: slice ${l} is missing mip level 0`);let g=Ni(i,p);if(g.width!==e.width||g.height!==e.height)throw new Error(`DynamicTexture: slice ${l} base level dimensions ${g.width}x${g.height} do not match expected ${e.width}x${e.height}`);let u=ki(p);if(u){if(o&&o!==u)throw new Error(`DynamicTexture: slice ${l} base level format "${u}" does not match texture format "${o}"`);o=u}let b=o&&i.isTextureFormatCompressed(o)?Ar(i,g.width,g.height,o):i.getMipLevelCount(g.width,g.height),M=0;for(let I=0;I<f.length;I++){let m=f[I];if(!m||m.mipLevel!==I||I>=b)break;let x=Ni(i,m),y=Math.max(1,g.width>>I),_=Math.max(1,g.height>>I);if(x.width!==y||x.height!==_)break;let T=ki(m);if(T&&(o||(o=T),T!==o))break;M++,c.push(m)}a=Math.min(a,M)}let h=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(l=>l.mipLevel<h),mipLevels:h,format:o,hasExplicitMipChain:s}}function ki(i){if(i.type==="texture-data")return i.textureFormat??Ne(i.data)}function Ni(i,t){switch(t.type){case"external-image":return i.getExternalImageSize(t.image);case"texture-data":return{width:t.data.width,height:t.data.height};default:throw new Error("Unsupported texture subresource")}}function Ar(i,t,e,n){let{blockWidth:r=1,blockHeight:s=1}=i.getTextureFormatInfo(n),o=1;for(let a=1;;a++){let c=Math.max(1,t>>a),h=Math.max(1,e>>a);if(c<r||h<s)break;o++}return o}async function Ue(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map(Ue));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t).map(Ue)),n=Object.keys(t),r={};for(let s=0;s<n.length;s++)r[n[s]]=e[s];return r}return i}var rt=2,Tr=1e4,Di="render pipeline initialization failed",$e=class{device;id;source;vs;fs;pipelineFactory;shaderFactory;userData={};parameters;topology;bufferLayout;isInstanced=void 0;instanceCount=0;vertexCount;indexBuffer=null;bufferAttributes={};constantAttributes={};bindings={};vertexArray;transformFeedback=null;pipeline;shaderInputs;material=null;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;_bindingTable=[];get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...$e.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData),this.material=e.material||null;let n=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new G(n,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let s=Pr(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.props.shaderLayout=gt(this.props.shaderLayout,o)||null,this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h,bindingTable:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:s,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this._bindingTable=l;let d=t.getShaderLayout?.(this.source);this.props.shaderLayout=gt(this.props.shaderLayout||d||null,o)||null}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:s,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l,this._bindingTable=[]}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,e.geometry&&this.setGeometry(e.geometry),this.pipelineFactory=e.pipelineFactory||w.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||w.ShaderFactory.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=t.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in e&&(this.isInstanced=e.isInstanced),e.instanceCount&&this.setInstanceCount(e.instanceCount),e.vertexCount&&this.setVertexCount(e.vertexCount),e.indexBuffer&&this.setIndexBuffer(e.indexBuffer),e.attributes&&this.setAttributes(e.attributes),e.constantAttributes&&this.setConstantAttributes(e.constantAttributes),e.bindings&&this.setBindings(e.bindings),e.transformFeedback&&(this.transformFeedback=e.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let t=this._needsRedraw;return this._needsRedraw=!1,t}setNeedsRedraw(t){this._needsRedraw||=t}getBindingDebugTable(){return this._bindingTable}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return w.log.info(rt,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let n,r=this.pipeline.isErrored;try{if(t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline(),r=this.pipeline.isErrored,r)w.log.info(rt,`>>> DRAWING ABORTED ${this.id}: ${Di}`)(),n=!1;else{let s=this._getBindings(),o=this._getBindGroups(),{indexBuffer:a}=this.vertexArray,c=a?a.byteLength/(a.indexType==="uint32"?4:2):void 0;n=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:c,transformFeedback:this.transformFeedback||void 0,bindings:s,bindGroups:o,_bindGroupCacheKeys:this._getBindGroupCacheKeys(),uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),n?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):r?this._needsRedraw=Di:this._needsRedraw="waiting for resource initialization",n}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&yi(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let n=new pt(this.bufferLayout);this.bufferLayout=n.mergeBufferLayouts(e.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(e)}this._gpuGeometry=e}setTopology(t){t!==this.topology&&(this.topology=t,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(t){let e=new pt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){ee(t,this.parameters,2)||(this.parameters=t,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(t){this.instanceCount=t,this.isInstanced===void 0&&t>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(t){this.vertexCount=t,this.setNeedsRedraw("vertexCount")}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new w.UniformStore(this.device,this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(xt(n)&&!this.material?.ownsModule(e)){let r=this._uniformStore.getManagedUniformBuffer(e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}setMaterial(t){this.material=t,this.setNeedsRedraw("material")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this._getNonMaterialBindings(this.shaderInputs.getBindingValues())),this.setNeedsRedraw("shaderInputs")}setBindings(t){Object.assign(this.bindings,t),this.setNeedsRedraw("bindings")}setTransformFeedback(t){this.transformFeedback=t,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(t){this.vertexArray.setIndexBuffer(t),this.setNeedsRedraw("indexBuffer")}setAttributes(t,e){let n=e?.disableWarnings??this.props.disableWarnings;t.indices&&w.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ti(this.pipeline.shaderLayout,this.bufferLayout);let r=new pt(this.bufferLayout);for(let[s,o]of Object.entries(t)){let a=r.getBufferLayout(s);if(!a){n||w.log.warn(`Model(${this.id}): Missing layout for buffer "${s}".`)();continue}let c=r.getAttributeNamesForBuffer(a),h=!1;for(let l of c){let d=this._attributeInfos[l];if(d){let f=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(f,o),h=!0}}!h&&!n&&w.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${s}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[n,r]of Object.entries(t)){let s=this._attributeInfos[n];s?this.vertexArray.setConstantWebGL(s.location,r):(e?.disableWarnings??this.props.disableWarnings)||w.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${n}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof B&&!t.isReady)return t.id;for(let t of Object.values(this.material?.bindings||{}))if(t instanceof B&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))n instanceof B?n.isReady&&(t[e]=n.texture):t[e]=n;return t}_getBindGroups(){let t=this.pipeline?.shaderLayout||this.props.shaderLayout||{bindings:[]},e=t.bindings.length?(0,w.normalizeBindingsByGroup)(t,this._getBindings()):{0:this._getBindings()};if(!this.material)return e;for(let[n,r]of Object.entries(this.material.getBindingsByGroup())){let s=Number(n);e[s]={...e[s]||{},...r}}return e}_getBindGroupCacheKeys(){let t=this.material?.getBindGroupCacheKey(3);return t?{3:t}:{}}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof w.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof w.Buffer||e instanceof w.Texture?t=Math.max(t,e.updateTimestamp):e instanceof B?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof w.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return Math.max(t,this.material?.getBindingsUpdateTimestamp()||0)}_setGeometryAttributes(t){let e={...t.attributes};for(let[n]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===n)&&n!=="positions"&&delete e[n];this.vertexCount=t.vertexCount,this.setIndexBuffer(t.indices||null),this.setAttributes(t.attributes,{disableWarnings:!0}),this.setAttributes(e,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate||=t,this.setNeedsRedraw(t)}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null,e=null;this.pipeline&&(w.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let n=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=n:this.fs&&(r=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"fragment",source:this.source||this.fs,debugShaders:this.props.debugShaders})),this.pipeline=this.pipelineFactory.createRenderPipeline({...this.props,bindings:void 0,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindGroups:this._getBindGroups(),vs:n,fs:r}),this._attributeInfos=(0,w.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&e!==t&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=w.log.level>3?0:Tr;w.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,w.log.group(rt,`>>> DRAWING MODEL ${this.id}`,{collapsed:w.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Mi(this.pipeline.shaderLayout,this.id);w.log.table(rt,t)();let e=this.shaderInputs.getDebugTable();w.log.table(rt,e)();let n=this._getAttributeDebugTable();w.log.table(rt,this._attributeInfos)(),w.log.table(rt,n)(),w.log.groupEnd(rt)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let n=t.props.framebuffer;vi(t,n,{id:n?.id||`${this.id}-framebuffer`,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,n]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[n.location];t[n.location]={name:e,type:n.shaderType,values:r?this._getBufferOrConstantValues(r,n.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,n=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:n.toString()}}return t}_getBufferOrConstantValues(t,e){let n=w.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof w.Buffer?new n(t.debugData):t).toString()}_getNonMaterialBindings(t){if(!this.material)return t;let e={};for(let[n,r]of Object.entries(t))this.material.ownsBinding(n)||(e[n]=r);return e}},H=$e;Y(H,"defaultProps",{...w.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,material:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:Fi.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function Pr(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Q=k(U(),1);var Ft=3,bt=class{device;modules;_materialBindingNames;_materialModuleNames;constructor(t,e={}){this.device=t,this.modules=e.modules||[];let n=new G(Object.fromEntries(this.modules.map(r=>[r.name,r])));this._materialBindingNames=Sr(n),this._materialModuleNames=Er(n)}createMaterial(t={}){return new yt(this.device,{...t,factory:this})}getBindingNames(){return Array.from(this._materialBindingNames)}ownsBinding(t){if(this._materialBindingNames.has(t))return!0;let e=Ve(t);return e?this._materialModuleNames.has(e):!1}ownsModule(t){return this._materialModuleNames.has(t)}getBindingsByGroup(t){return Object.keys(t).length>0?{[Ft]:t}:{}}};function Ve(i){return i.endsWith("Uniforms")?i.slice(0,-8):null}function Sr(i){let t=new Set;for(let e of Object.values(i.modules))for(let n of e.bindingLayout||[])n.group===Ft&&t.add(n.name);return t}function Er(i){let t=new Set;for(let e of Object.values(i.modules))e.name&&e.bindingLayout?.some(n=>n.group===Ft&&n.name===e.name)&&t.add(e.name);return t}var yt=class{id;device;factory;shaderInputs;bindings={};_uniformStore;_bindGroupCacheToken={};constructor(t,e={}){this.id=e.id||S("material"),this.device=t,this.factory=e.factory||new bt(t,{modules:e.modules||e.shaderInputs?.getModules()||[]});let n=Object.fromEntries((e.shaderInputs?.getModules()||this.factory.modules).map(r=>[r.name,r]));this.shaderInputs=e.shaderInputs||new G(n),this._uniformStore=new Q.UniformStore(this.device,this.shaderInputs.modules);for(let[r,s]of Object.entries(this.shaderInputs.modules))if(this.ownsModule(r)&&xt(s)){let o=this._uniformStore.getManagedUniformBuffer(r);this.bindings[`${r}Uniforms`]=o}this.updateShaderInputs(),e.bindings&&this._replaceOwnedBindings(e.bindings)}destroy(){this._uniformStore.destroy()}clone(t={}){let e=this.factory.createMaterial({id:t.id,shaderInputs:t.shaderInputs,bindings:{...this.getResourceBindings(),...t.bindings}});return t.shaderInputs||e.setProps(this.shaderInputs.getUniformValues()),t.moduleProps&&e.setProps(t.moduleProps),e}ownsBinding(t){return this.factory.ownsBinding(t)}ownsModule(t){return this.factory.ownsModule(t)}setProps(t){this.shaderInputs.setProps(t),this.updateShaderInputs()}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this._setOwnedBindings(this.shaderInputs.getBindingValues())&&(this._bindGroupCacheToken={})}getResourceBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))Ve(e)||(t[e]=n);return t}getBindings(){let t={},e=t;for(let[n,r]of Object.entries(this.bindings))r instanceof B?r.isReady&&(e[n]=r.texture):e[n]=r;return t}getBindingsByGroup(){return this.factory.getBindingsByGroup(this.getBindings())}getBindGroupCacheKey(t){return t===Ft?this._bindGroupCacheToken:null}getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof Q.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof Q.Buffer||e instanceof Q.Texture?t=Math.max(t,e.updateTimestamp):e instanceof B?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof Q.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_replaceOwnedBindings(t){this._setOwnedBindings(t)&&(this._bindGroupCacheToken={})}_setOwnedBindings(t){let e=!1;for(let[n,r]of Object.entries(t))r!==void 0&&this.ownsBinding(n)&&this.bindings[n]!==r&&(this.bindings[n]=r,e=!0);return e}};var Bi=k(U(),1),zi=k(nt(),1);var ne=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=ne.defaultProps){if(!ne.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new H(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,zi.getPassthroughFS)(),topology:e.topology||"point-list",varyings:e.outputs||e.varyings,...e}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:e.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(t){t?.inputBuffers&&this.model.setAttributes(t.inputBuffers),t?.outputBuffers&&this.transformFeedback.setBuffers(t.outputBuffers);let e=this.device.beginRenderPass(t);this.model.draw(e),e.end()}getBuffer(t){return this.transformFeedback.getBuffer(t)}readAsync(t){let e=this.getBuffer(t);if(!e)throw new Error("BufferTransform#getBuffer");if(e instanceof Bi.Buffer)return e.readAsync();let{buffer:n,byteOffset:r=0,byteLength:s=n.byteLength}=e;return n.readAsync(r,s)}},Bt=ne;Y(Bt,"defaultProps",{...H.defaultProps,outputs:void 0,feedbackBuffers:void 0});var ji=k(nt(),1);var Lr="transform_output",re=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(t,e){this.device=t,this.sampler=t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new H(this.device,{id:e.id||S("texture-transform-model"),fs:e.fs||(0,ji.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:Lr}),vertexCount:e.vertexCount,...e}),this._initialize(e),Object.seal(this)}destroy(){this.model.destroy();for(let t of this.bindings)t.framebuffer?.destroy()}delete(){this.destroy()}run(t){let{framebuffer:e}=this.bindings[this.currentIndex],n=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(n),n.end(),this.device.submit()}getTargetTexture(){let{targetTexture:t}=this.bindings[this.currentIndex];return t}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(t){this._updateBindings(t)}_updateBindings(t){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],t)}_updateBinding(t,{sourceBuffers:e,sourceTextures:n,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,n),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:s,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:s,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:s,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let n in e)e[n].sampler=this.sampler}};var $=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:n=null,vertexCount:r=null}=t;this.id=t.id||S("geometry"),this.topology=t.topology,n&&(this.indices=ArrayBuffer.isView(n)?{value:n,size:1}:n),this.attributes={};for(let[s,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(s)}: must be typed array or object with value as typed array`);if((s==="POSITION"||s==="positions")&&!a.size&&(a.size=3),s==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[s]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=r||this._calculateVertexCount(this.attributes,this.indices)}getVertexCount(){return this.vertexCount}getAttributes(){return this.indices?{indices:this.indices,...this.attributes}:this.attributes}_print(t){return`Geometry ${this.id} attribute ${t}`}_setAttributes(t,e){return this}_calculateVertexCount(t,e){if(e)return e.value.length;let n=1/0;for(let r of Object.values(t)){let{value:s,size:o,constant:a}=r;!a&&s&&o!==void 0&&o>=1&&(n=Math.min(n,s.length/o))}return n}};var Cr=`struct VertexInputs {
8
8
  @location(0) clipSpacePositions: vec2<f32>,
9
9
  @location(1) texCoords: vec2<f32>,
10
10
  @location(2) coordinates: vec2<f32>
@@ -26,7 +26,7 @@ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
26
26
  outputs.uv = inputs.texCoords;
27
27
  return outputs;
28
28
  }
29
- `,Tr=`#version 300 es
29
+ `,Or=`#version 300 es
30
30
  in vec2 clipSpacePositions;
31
31
  in vec2 texCoords;
32
32
  in vec2 coordinates;
@@ -41,13 +41,13 @@ void main(void) {
41
41
  coordinate = coordinates;
42
42
  uv = texCoords;
43
43
  }
44
- `,ji=[-1,-1,1,-1,-1,1,1,1],st=class extends W{constructor(t,e){let n=ji.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${Ar}
45
- ${e.source}`}),super(t,{id:e.id||S("clip-space"),...e,vs:Tr,vertexCount:4,geometry:new V({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(ji)},texCoords:{size:2,value:new Float32Array(n)},coordinates:{size:2,value:new Float32Array(n)}}})})}};var Pr={name:"background",uniformTypes:{scale:"vec2<f32>"}},Sr=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
46
- @group(0) @binding(1) var backgroundTextureSampler: sampler;
44
+ `,Ui=[-1,-1,1,-1,-1,1,1,1],st=class extends H{constructor(t,e){let n=Ui.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${Cr}
45
+ ${e.source}`}),super(t,{id:e.id||S("clip-space"),...e,vs:Or,vertexCount:4,geometry:new $({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(Ui)},texCoords:{size:2,value:new Float32Array(n)},coordinates:{size:2,value:new Float32Array(n)}}})})}};var Rr={name:"background",uniformTypes:{scale:"vec2<f32>"}},kr=`@group(0) @binding(auto) var backgroundTexture: texture_2d<f32>;
46
+ @group(0) @binding(auto) var backgroundTextureSampler: sampler;
47
47
  struct backgroundUniforms {
48
48
  scale: vec2<f32>,
49
49
  };
50
- @group(0) @binding(2) var<uniform> background: backgroundUniforms;
50
+ @group(0) @binding(auto) var<uniform> background: backgroundUniforms;
51
51
 
52
52
  fn billboardTexture_getTextureUV(uv: vec2<f32>) -> vec2<f32> {
53
53
  let scale: vec2<f32> = background.scale;
@@ -60,12 +60,12 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
60
60
  let position: vec2<f32> = billboardTexture_getTextureUV(inputs.uv);
61
61
  return textureSample(backgroundTexture, backgroundTextureSampler, position);
62
62
  }
63
- `,Lr=`#version 300 es
63
+ `,Nr=`#version 300 es
64
64
  precision highp float;
65
65
 
66
66
  uniform sampler2D backgroundTexture;
67
67
 
68
- uniform backgroundUniforms {
68
+ layout(std140) uniform backgroundUniforms {
69
69
  vec2 scale;
70
70
  } background;
71
71
 
@@ -81,11 +81,11 @@ void main(void) {
81
81
  vec2 position = billboardTexture_getTextureUV(coordinate);
82
82
  fragColor = texture(backgroundTexture, position);
83
83
  }
84
- `,_t=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{...e,id:e.id||"background-texture-model",source:Sr,fs:Lr,modules:[...e.modules||[],Pr],parameters:{depthWriteEnabled:!1,...e.parameters||{},...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(e)}setProps(t){let{backgroundTexture:e}=t;if(e)if(this.setBindings({backgroundTexture:e}),e.isReady){let n=e instanceof z?e.texture:e;this.backgroundTexture=n,this.updateScale(n)}else e.ready.then(n=>{this.backgroundTexture=n,this.updateScale(n)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,n]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,s=t.height,o=e/n,a=r/s,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var It=class extends V{constructor(t={}){let{id:e=S("sphere-geometry")}=t,{indices:n,attributes:r}=Cr(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cr(i){let{nlat:t=10,nlong:e=10}=i,s=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(M,I,m,x,b)=>i.radius||1,d=new Float32Array(h*3),u=new Float32Array(h*3),g=new Float32Array(h*2),p=h>65535?Uint32Array:Uint16Array,f=new p(t*e*6);for(let M=0;M<=t;M++)for(let I=0;I<=e;I++){let m=I/e,x=M/t,b=I+M*(e+1),_=b*2,T=b*3,E=c*m,L=s*x,O=Math.sin(E),v=Math.cos(E),P=Math.sin(L),C=Math.cos(L),A=v*P,B=C,tt=O*P,Z=l(A,B,tt,m,x);d[T+0]=Z*A,d[T+1]=Z*B,d[T+2]=Z*tt,u[T+0]=A,u[T+1]=B,u[T+2]=tt,g[_+0]=m,g[_+1]=1-x}let y=e+1;for(let M=0;M<e;M++)for(let I=0;I<t;I++){let m=(M*t+I)*6;f[m+0]=I*y+M,f[m+1]=I*y+M+1,f[m+2]=(I+1)*y+M,f[m+3]=(I+1)*y+M,f[m+4]=I*y+M+1,f[m+5]=(I+1)*y+M+1}return{indices:{size:1,value:f},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}}}var wa=1/Math.PI*180,Aa=1/180*Math.PI,Er={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Er}};var j=globalThis.mathgl.config;function Gi(i,{precision:t=j.precision}={}){return i=Or(i),`${parseFloat(i.toPrecision(t))}`}function vt(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function He(i,t,e){let n=j.EPSILON;e&&(j.EPSILON=e);try{if(i===t)return!0;if(vt(i)&&vt(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!He(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=j.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{j.EPSILON=n}}function Or(i){return Math.round(i/j.EPSILON)*j.EPSILON}var wt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let n=0;n<this.ELEMENTS;++n)this[n]=t[n+e];return this.check()}toArray(t=[],e=0){for(let n=0;n<this.ELEMENTS;++n)t[e+n]=this[n];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:vt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(j)}formatString(t){let e="";for(let n=0;n<this.ELEMENTS;++n)e+=(n>0?", ":"")+Gi(this[n],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!He(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,n){if(n===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let s=t[r],o=typeof e=="number"?e:e[r];this[r]=s+n*(o-s)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t[n]),e[n]);return this.check()}add(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]+=e[n];return this.check()}subtract(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]-=e[n];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(j.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t),e);return this.check()}get elements(){return this}};function kr(i,t){if(i.length!==t)return!1;for(let e=0;e<i.length;++e)if(!Number.isFinite(i[e]))return!1;return!0}function X(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function oe(i,t,e=""){if(j.debug&&!kr(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function We(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var ae=class extends wt{get x(){return this[0]}set x(t){this[0]=X(t)}get y(){return this[1]}set y(t){this[1]=X(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let n=0;n<this.ELEMENTS;++n){let r=this[n]-t[n];e+=r*r}return X(e)}dot(t){let e=0;for(let n=0;n<this.ELEMENTS;++n)e+=this[n]*t[n];return X(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]*=e[n];return this.check()}divide(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]/=e[n];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),X(this[t])}setComponent(t,e){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var et=typeof Float32Array<"u"?Float32Array:Array;var Da=Math.PI/180;function Rr(){let i=new et(2);return et!=Float32Array&&(i[0]=0,i[1]=0),i}function Vi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[4]*r+e[12],i[1]=e[1]*n+e[5]*r+e[13],i}var Fa=function(){let i=Rr();return function(t,e,n,r,s,o){let a,c;for(e||(e=2),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],s(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function Xi(i,t,e){let n=t[0],r=t[1],s=e[3]*n+e[7]*r||1;return i[0]=(e[0]*n+e[4]*r)/s,i[1]=(e[1]*n+e[5]*r)/s,i}function ce(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s||1;return i[0]=(e[0]*n+e[4]*r+e[8]*s)/o,i[1]=(e[1]*n+e[5]*r+e[9]*s)/o,i[2]=(e[2]*n+e[6]*r+e[10]*s)/o,i}function qi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[2]*r,i[1]=e[1]*n+e[3]*r,i[2]=t[2],i}function Nr(){let i=new et(3);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Dr(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Hi(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-s*a,i[1]=s*o-n*c,i[2]=n*a-r*o,i}function he(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s+e[15];return o=o||1,i[0]=(e[0]*n+e[4]*r+e[8]*s+e[12])/o,i[1]=(e[1]*n+e[5]*r+e[9]*s+e[13])/o,i[2]=(e[2]*n+e[6]*r+e[10]*s+e[14])/o,i}function Wi(i,t,e){let n=t[0],r=t[1],s=t[2];return i[0]=n*e[0]+r*e[3]+s*e[6],i[1]=n*e[1]+r*e[4]+s*e[7],i[2]=n*e[2]+r*e[5]+s*e[8],i}function Yi(i,t,e){let n=e[0],r=e[1],s=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-s*c,d=s*a-n*h,u=n*c-r*a,g=r*u-s*d,p=s*l-n*u,f=n*d-r*l,y=o*2;return l*=y,d*=y,u*=y,g*=2,p*=2,f*=2,i[0]=a+l+g,i[1]=c+d+p,i[2]=h+u+f,i}function Ki(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0],s[1]=r[1]*Math.cos(n)-r[2]*Math.sin(n),s[2]=r[1]*Math.sin(n)+r[2]*Math.cos(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Zi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[2]*Math.sin(n)+r[0]*Math.cos(n),s[1]=r[1],s[2]=r[2]*Math.cos(n)-r[0]*Math.sin(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Qi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0]*Math.cos(n)-r[1]*Math.sin(n),s[1]=r[0]*Math.sin(n)+r[1]*Math.cos(n),s[2]=r[2],i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Ji(i,t){let e=i[0],n=i[1],r=i[2],s=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+n*n+r*r)*(s*s+o*o+a*a)),h=c&&Dr(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var ja=function(){let i=Nr();return function(t,e,n,r,s,o){let a,c;for(e||(e=3),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var Ke=[0,0,0],le,H=class extends ae{static get ZERO(){return le||(le=new H(0,0,0),Object.freeze(le)),le}constructor(t=0,e=0,n=0){super(-0,-0,-0),arguments.length===1&&vt(t)?this.copy(t):(j.debug&&(X(t),X(e),X(n)),this[0]=t,this[1]=e,this[2]=n)}set(t,e,n){return this[0]=t,this[1]=e,this[2]=n,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return j.debug&&(X(t.x),X(t.y),X(t.z)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this.check()}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t}get ELEMENTS(){return 3}get z(){return this[2]}set z(t){this[2]=X(t)}angle(t){return Ji(this,t)}cross(t){return Hi(this,this,t),this.check()}rotateX({radians:t,origin:e=Ke}){return Ki(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Ke}){return Zi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Ke}){return Qi(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return he(this,this,t),this.check()}transformAsVector(t){return ce(this,this,t),this.check()}transformByMatrix3(t){return Wi(this,this,t),this.check()}transformByMatrix2(t){return qi(this,this,t),this.check()}transformByQuaternion(t){return Yi(this,this,t),this.check()}};var de=class extends wt{toString(){let t="[";if(j.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let n=0;n<this.RANK;++n)t+=` ${this[n*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,n){return this[e*this.RANK+t]=X(n),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[n+r];return e}setColumn(t,e){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)this[n+r]=e[r];return this}};function Fr(i){return i[0]=1,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=1,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function tn(i,t){if(i===t){let e=t[1],n=t[2],r=t[3],s=t[6],o=t[7],a=t[11];i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=e,i[6]=t[9],i[7]=t[13],i[8]=n,i[9]=s,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function en(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],u=t[10],g=t[11],p=t[12],f=t[13],y=t[14],M=t[15],I=e*a-n*o,m=e*c-r*o,x=e*h-s*o,b=n*c-r*a,_=n*h-s*a,T=r*h-s*c,E=l*f-d*p,L=l*y-u*p,O=l*M-g*p,v=d*y-u*f,P=d*M-g*f,C=u*M-g*y,A=I*C-m*P+x*v+b*O-_*L+T*E;return A?(A=1/A,i[0]=(a*C-c*P+h*v)*A,i[1]=(r*P-n*C-s*v)*A,i[2]=(f*T-y*_+M*b)*A,i[3]=(u*_-d*T-g*b)*A,i[4]=(c*O-o*C-h*L)*A,i[5]=(e*C-r*O+s*L)*A,i[6]=(y*x-p*T-M*m)*A,i[7]=(l*T-u*x+g*m)*A,i[8]=(o*P-a*O+h*E)*A,i[9]=(n*O-e*P-s*E)*A,i[10]=(p*_-f*x+M*I)*A,i[11]=(d*x-l*_-g*I)*A,i[12]=(a*L-o*v-c*E)*A,i[13]=(e*v-n*L+r*E)*A,i[14]=(f*m-p*b-y*I)*A,i[15]=(l*b-d*m+u*I)*A,i):null}function nn(i){let t=i[0],e=i[1],n=i[2],r=i[3],s=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],d=i[10],u=i[11],g=i[12],p=i[13],f=i[14],y=i[15],M=t*o-e*s,I=t*a-n*s,m=e*a-n*o,x=h*p-l*g,b=h*f-d*g,_=l*f-d*p,T=t*_-e*b+n*x,E=s*_-o*b+a*x,L=h*m-l*I+d*M,O=g*m-p*I+f*M;return c*T-r*E+y*L-u*O}function Ze(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],u=t[9],g=t[10],p=t[11],f=t[12],y=t[13],M=t[14],I=t[15],m=e[0],x=e[1],b=e[2],_=e[3];return i[0]=m*n+x*a+b*d+_*f,i[1]=m*r+x*c+b*u+_*y,i[2]=m*s+x*h+b*g+_*M,i[3]=m*o+x*l+b*p+_*I,m=e[4],x=e[5],b=e[6],_=e[7],i[4]=m*n+x*a+b*d+_*f,i[5]=m*r+x*c+b*u+_*y,i[6]=m*s+x*h+b*g+_*M,i[7]=m*o+x*l+b*p+_*I,m=e[8],x=e[9],b=e[10],_=e[11],i[8]=m*n+x*a+b*d+_*f,i[9]=m*r+x*c+b*u+_*y,i[10]=m*s+x*h+b*g+_*M,i[11]=m*o+x*l+b*p+_*I,m=e[12],x=e[13],b=e[14],_=e[15],i[12]=m*n+x*a+b*d+_*f,i[13]=m*r+x*c+b*u+_*y,i[14]=m*s+x*h+b*g+_*M,i[15]=m*o+x*l+b*p+_*I,i}function rn(i,t,e){let n=e[0],r=e[1],s=e[2],o,a,c,h,l,d,u,g,p,f,y,M;return t===i?(i[12]=t[0]*n+t[4]*r+t[8]*s+t[12],i[13]=t[1]*n+t[5]*r+t[9]*s+t[13],i[14]=t[2]*n+t[6]*r+t[10]*s+t[14],i[15]=t[3]*n+t[7]*r+t[11]*s+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],u=t[6],g=t[7],p=t[8],f=t[9],y=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=d,i[6]=u,i[7]=g,i[8]=p,i[9]=f,i[10]=y,i[11]=M,i[12]=o*n+l*r+p*s+t[12],i[13]=a*n+d*r+f*s+t[13],i[14]=c*n+u*r+y*s+t[14],i[15]=h*n+g*r+M*s+t[15]),i}function sn(i,t,e){let n=e[0],r=e[1],s=e[2];return i[0]=t[0]*n,i[1]=t[1]*n,i[2]=t[2]*n,i[3]=t[3]*n,i[4]=t[4]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*s,i[9]=t[9]*s,i[10]=t[10]*s,i[11]=t[11]*s,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function on(i,t,e,n){let r=n[0],s=n[1],o=n[2],a=Math.sqrt(r*r+s*s+o*o),c,h,l,d,u,g,p,f,y,M,I,m,x,b,_,T,E,L,O,v,P,C,A,B;return a<1e-6?null:(a=1/a,r*=a,s*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],u=t[1],g=t[2],p=t[3],f=t[4],y=t[5],M=t[6],I=t[7],m=t[8],x=t[9],b=t[10],_=t[11],T=r*r*l+c,E=s*r*l+o*h,L=o*r*l-s*h,O=r*s*l-o*h,v=s*s*l+c,P=o*s*l+r*h,C=r*o*l+s*h,A=s*o*l-r*h,B=o*o*l+c,i[0]=d*T+f*E+m*L,i[1]=u*T+y*E+x*L,i[2]=g*T+M*E+b*L,i[3]=p*T+I*E+_*L,i[4]=d*O+f*v+m*P,i[5]=u*O+y*v+x*P,i[6]=g*O+M*v+b*P,i[7]=p*O+I*v+_*P,i[8]=d*C+f*A+m*B,i[9]=u*C+y*A+x*B,i[10]=g*C+M*A+b*B,i[11]=p*C+I*A+_*B,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function an(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[4]=s*r+h*n,i[5]=o*r+l*n,i[6]=a*r+d*n,i[7]=c*r+u*n,i[8]=h*r-s*n,i[9]=l*r-o*n,i[10]=d*r-a*n,i[11]=u*r-c*n,i}function cn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r-h*n,i[1]=o*r-l*n,i[2]=a*r-d*n,i[3]=c*r-u*n,i[8]=s*n+h*r,i[9]=o*n+l*r,i[10]=a*n+d*r,i[11]=c*n+u*r,i}function hn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[4],l=t[5],d=t[6],u=t[7];return t!==i&&(i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r+h*n,i[1]=o*r+l*n,i[2]=a*r+d*n,i[3]=c*r+u*n,i[4]=h*r-s*n,i[5]=l*r-o*n,i[6]=d*r-a*n,i[7]=u*r-c*n,i}function ln(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=e+e,a=n+n,c=r+r,h=e*o,l=n*o,d=n*a,u=r*o,g=r*a,p=r*c,f=s*o,y=s*a,M=s*c;return i[0]=1-d-p,i[1]=l+M,i[2]=u-y,i[3]=0,i[4]=l-M,i[5]=1-h-p,i[6]=g+f,i[7]=0,i[8]=u+y,i[9]=g-f,i[10]=1-h-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function dn(i,t,e,n,r,s,o){let a=1/(e-t),c=1/(r-n),h=1/(s-o);return i[0]=s*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+n)*c,i[10]=(o+s)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*s*2*h,i[15]=0,i}function Br(i,t,e,n,r){let s=1/Math.tan(t/2);if(i[0]=s/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(n-r);i[10]=(r+n)*o,i[14]=2*r*n*o}else i[10]=-1,i[14]=-2*n;return i}var un=Br;function zr(i,t,e,n,r,s,o){let a=1/(t-e),c=1/(n-r),h=1/(s-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+n)*c,i[14]=(o+s)*h,i[15]=1,i}var fn=zr;function mn(i,t,e,n){let r,s,o,a,c,h,l,d,u,g,p=t[0],f=t[1],y=t[2],M=n[0],I=n[1],m=n[2],x=e[0],b=e[1],_=e[2];return Math.abs(p-x)<1e-6&&Math.abs(f-b)<1e-6&&Math.abs(y-_)<1e-6?Fr(i):(d=p-x,u=f-b,g=y-_,r=1/Math.sqrt(d*d+u*u+g*g),d*=r,u*=r,g*=r,s=I*g-m*u,o=m*d-M*g,a=M*u-I*d,r=Math.sqrt(s*s+o*o+a*a),r?(r=1/r,s*=r,o*=r,a*=r):(s=0,o=0,a=0),c=u*a-g*o,h=g*s-d*a,l=d*o-u*s,r=Math.sqrt(c*c+h*h+l*l),r?(r=1/r,c*=r,h*=r,l*=r):(c=0,h=0,l=0),i[0]=s,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=h,i[6]=u,i[7]=0,i[8]=a,i[9]=l,i[10]=g,i[11]=0,i[12]=-(s*p+o*f+a*y),i[13]=-(c*p+h*f+l*y),i[14]=-(d*p+u*f+g*y),i[15]=1,i)}function jr(){let i=new et(4);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function pn(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3];return i[0]=e[0]*n+e[4]*r+e[8]*s+e[12]*o,i[1]=e[1]*n+e[5]*r+e[9]*s+e[13]*o,i[2]=e[2]*n+e[6]*r+e[10]*s+e[14]*o,i[3]=e[3]*n+e[7]*r+e[11]*s+e[15]*o,i}var Ja=function(){let i=jr();return function(t,e,n,r,s,o){let a,c;for(e||(e=4),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2],t[a+3]=i[3];return t}}();var ti;(function(i){i[i.COL0ROW0=0]="COL0ROW0",i[i.COL0ROW1=1]="COL0ROW1",i[i.COL0ROW2=2]="COL0ROW2",i[i.COL0ROW3=3]="COL0ROW3",i[i.COL1ROW0=4]="COL1ROW0",i[i.COL1ROW1=5]="COL1ROW1",i[i.COL1ROW2=6]="COL1ROW2",i[i.COL1ROW3=7]="COL1ROW3",i[i.COL2ROW0=8]="COL2ROW0",i[i.COL2ROW1=9]="COL2ROW1",i[i.COL2ROW2=10]="COL2ROW2",i[i.COL2ROW3=11]="COL2ROW3",i[i.COL3ROW0=12]="COL3ROW0",i[i.COL3ROW1=13]="COL3ROW1",i[i.COL3ROW2=14]="COL3ROW2",i[i.COL3ROW3=15]="COL3ROW3"})(ti||(ti={}));var Gr=45*Math.PI/180,Ur=1,Qe=.1,Je=500,$r=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),q=class extends de{static get IDENTITY(){return Xr()}static get ZERO(){return Vr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return ti}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=e,this[2]=n,this[3]=r,this[4]=s,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=u,this[12]=g,this[13]=p,this[14]=f,this[15]=y,this.check()}setRowMajor(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=s,this[2]=h,this[3]=g,this[4]=e,this[5]=o,this[6]=l,this[7]=p,this[8]=n,this[9]=a,this[10]=d,this[11]=f,this[12]=r,this[13]=c,this[14]=u,this[15]=y,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy($r)}fromObject(t){return this.check()}fromQuaternion(t){return ln(this,t),this.check()}frustum(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return a===1/0?qr(this,e,n,r,s,o):dn(this,e,n,r,s,o,a),this.check()}lookAt(t){let{eye:e,center:n=[0,0,0],up:r=[0,1,0]}=t;return mn(this,e,n,r),this.check()}ortho(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return fn(this,e,n,r,s,o,a),this.check()}orthographic(t){let{fovy:e=Gr,aspect:n=Ur,focalDistance:r=1,near:s=Qe,far:o=Je}=t;gn(e);let a=e/2,c=r*Math.tan(a),h=c*n;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:s,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:n=1,near:r=.1,far:s=500}=t;return gn(e),un(this,e,n,r,s),this.check()}determinant(){return nn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*s,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*s,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*s,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*s,t[8]=this[10]*o,t}transpose(){return tn(this,this),this.check()}invert(){return en(this,this),this.check()}multiplyLeft(t){return Ze(this,t,this),this.check()}multiplyRight(t){return Ze(this,this,t),this.check()}rotateX(t){return an(this,this,t),this.check()}rotateY(t){return cn(this,this,t),this.check()}rotateZ(t){return hn(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return on(this,this,t,e),this.check()}scale(t){return sn(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return rn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=pn(e||[-0,-0,-0,-0],t,this),oe(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:n}=t,r;switch(n){case 2:r=Vi(e||[-0,-0],t,this);break;case 3:r=he(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(r,t.length),r}transformAsVector(t,e){let n;switch(t.length){case 2:n=Xi(e||[-0,-0],t,this);break;case 3:n=ce(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(n,t.length),n}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,n){return this.identity().translate([t,e,n])}},ue,fe;function Vr(){return ue||(ue=new q([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(ue)),ue}function Xr(){return fe||(fe=new q,Object.freeze(fe)),fe}function gn(i){if(i>Math.PI*2)throw Error("expected radians")}function qr(i,t,e,n,r,s){let o=2*s/(e-t),a=2*s/(r-n),c=(e+t)/(e-t),h=(r+n)/(r-n),l=-1,d=-1,u=-2*s;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=d,i[12]=0,i[13]=0,i[14]=u,i[15]=0,i}var Hr=.02,Wr=.12,Yr=.15,Kr=.2,ni=[0,1,0],Zr=[255,255,255],Qr=1,ei=.35,ii=255,Jr=1,ts=.01,es={depthCompare:"less-equal",depthWriteEnabled:!1,cullMode:"none"},is=[{name:"instancePosition",format:"float32x3",stepMode:"instance"},{name:"instanceDirection",format:"float32x3",stepMode:"instance"},{name:"instanceScale",format:"float32x3",stepMode:"instance"},{name:"instanceColor",format:"float32x4",stepMode:"instance"}],ns={name:"lightMarker",props:{},uniforms:{},uniformTypes:{viewProjectionMatrix:"mat4x4<f32>"}},rs="inputs.positions * inputs.instanceScale",ss="vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)",os="positions * instanceScale",as="vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)",ot=class extends W{lightModelProps;_instanceData;_managedBuffers;buildInstanceData;sizePropNames;constructor(t,e,n){let r=n.buildInstanceData(e),s=xn(t,e.id||n.idPrefix,r),o=new $({lightMarker:ns});o.setProps({lightMarker:{viewProjectionMatrix:bn(e)}});let{source:a,vs:c,fs:h}=us(n.anchorMode),l=e;super(t,{...l,id:e.id||n.idPrefix,source:a,vs:c,fs:h,geometry:n.geometry,shaderInputs:o,bufferLayout:[...is],attributes:s,instanceCount:r.instanceCount,parameters:Mn(e.parameters)}),this.lightModelProps=e,this._instanceData=r,this._managedBuffers=s,this.buildInstanceData=n.buildInstanceData,this.sizePropNames=n.sizePropNames}destroy(){super.destroy(),yn(this._managedBuffers),this._managedBuffers={}}draw(t){return this.instanceCount===0?!0:super.draw(t)}setProps(t){this.lightModelProps={...this.lightModelProps,...t},t.parameters&&this.setParameters(Mn(this.lightModelProps.parameters)),("viewMatrix"in t||"projectionMatrix"in t)&&(this.shaderInputs.setProps({lightMarker:{viewProjectionMatrix:bn(this.lightModelProps)}}),this.setNeedsRedraw("lightMarker camera")),ds(t,this.sizePropNames)&&this.rebuildInstanceData()}rebuildInstanceData(){let t=this.buildInstanceData(this.lightModelProps),e=xn(this.device,this.id,t);this.setAttributes(e),this.setInstanceCount(t.instanceCount),yn(this._managedBuffers),this._managedBuffers=e,this._instanceData=t}};function _n(i){let t=wn(i.lights),e=ri(i),n=i.pointLightRadius??Hr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>({color:si(r),direction:ni,position:r.position,scale:[n,n,n]}),t)}function In(i){let t=An(i.lights),e=ri(i),n=i.spotLightLength??Wr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>{let o=jt(r.outerConeAngle??Math.PI/4,0,Math.PI/2-ts),a=Math.tan(o)*n;return{color:si(r),direction:Tn(r.direction),position:r.position,scale:[a,n,a]}},t)}function vn(i){let t=cs(i.lights),e=ri(i),n=i.directionalLightLength??Yr*e.sceneScale*e.markerScale,r=n*Kr;return oi(t.length,(s,o)=>{let a=Tn(s.direction),c=[e.sceneCenter[0]-a[0]*e.sceneScale*ei,e.sceneCenter[1]-a[1]*e.sceneScale*ei,e.sceneCenter[2]-a[2]*e.sceneScale*ei];return{color:si(s),direction:a,position:c,scale:[r,n,r]}},t)}function wn(i){return i.filter(t=>t.type==="point")}function An(i){return i.filter(t=>t.type==="spot")}function cs(i){return i.filter(t=>t.type==="directional")}function ri(i){let t=hs(i.lights,i.bounds),e=[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2,(t[0][2]+t[1][2])/2],n=Math.max(Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1],t[1][2]-t[0][2]),Jr);return{bounds:t,markerScale:Math.max(i.markerScale??Qr,0),sceneCenter:e,sceneScale:n}}function si(i){let t=i.color||Zr,e=Math.max(i.intensity??1,0),n=jt(.35+.3*Math.log10(e+1),.35,1);return[jt(t[0]/ii,0,1)*n,jt(t[1]/ii,0,1)*n,jt(t[2]/ii,0,1)*n,1]}function Tn(i){let[t,e,n]=i||ni,r=Math.hypot(t,e,n);return r===0?[...ni]:[t/r,e/r,n/r]}function oi(i,t,e=[]){let n=new Float32Array(i*3),r=new Float32Array(i*3),s=new Float32Array(i*3),o=new Float32Array(i*4);for(let[a,c]of e.entries()){let h=t(c,a);n.set(h.position,a*3),r.set(h.direction,a*3),s.set(h.scale,a*3),o.set(h.color,a*4)}return{instanceCount:i,instancePositions:n,instanceDirections:r,instanceScales:s,instanceColors:o}}function hs(i,t){if(t)return ls(t);let e=[...wn(i).map(s=>s.position),...An(i).map(s=>s.position)];if(e.length===0)return[[-.5,-.5,-.5],[.5,.5,.5]];let n=[...e[0]],r=[...e[0]];for(let s of e.slice(1))n[0]=Math.min(n[0],s[0]),n[1]=Math.min(n[1],s[1]),n[2]=Math.min(n[2],s[2]),r[0]=Math.max(r[0],s[0]),r[1]=Math.max(r[1],s[1]),r[2]=Math.max(r[2],s[2]);return[n,r]}function ls(i){return[[...i[0]],[...i[1]]]}function xn(i,t,e){return{instancePosition:i.createBuffer({id:`${t}-instance-position`,data:me(e.instancePositions,3)}),instanceDirection:i.createBuffer({id:`${t}-instance-direction`,data:me(e.instanceDirections,3)}),instanceScale:i.createBuffer({id:`${t}-instance-scale`,data:me(e.instanceScales,3)}),instanceColor:i.createBuffer({id:`${t}-instance-color`,data:me(e.instanceColors,4)})}}function me(i,t){return i.length>0?i:new Float32Array(t)}function yn(i){for(let t of Object.values(i))t?.destroy()}function bn(i){return new q(i.projectionMatrix).multiplyRight(i.viewMatrix)}function ds(i,t){return"lights"in i||"bounds"in i||"markerScale"in i?!0:t.some(e=>e in i)}function Mn(i){return{...es,...i||{}}}function us(i){let t=i==="apex"?ss:rs,e=i==="apex"?as:os;return{source:`struct lightMarkerUniforms {
84
+ `,Mt=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{...e,id:e.id||"background-texture-model",source:kr,fs:Nr,modules:[...e.modules||[],Rr],parameters:{depthWriteEnabled:!1,...e.parameters||{},...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(e)}setProps(t){let{backgroundTexture:e}=t;if(e)if(this.setBindings({backgroundTexture:e}),e.isReady){let n=e instanceof B?e.texture:e;this.backgroundTexture=n,this.updateScale(n)}else e.ready.then(n=>{this.backgroundTexture=n,this.updateScale(n)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,n]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,s=t.height,o=e/n,a=r/s,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var _t=class extends ${constructor(t={}){let{id:e=S("sphere-geometry")}=t,{indices:n,attributes:r}=Dr(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Dr(i){let{nlat:t=10,nlong:e=10}=i,s=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(M,I,m,x,y)=>i.radius||1,d=new Float32Array(h*3),f=new Float32Array(h*3),p=new Float32Array(h*2),g=h>65535?Uint32Array:Uint16Array,u=new g(t*e*6);for(let M=0;M<=t;M++)for(let I=0;I<=e;I++){let m=I/e,x=M/t,y=I+M*(e+1),_=y*2,T=y*3,C=c*m,E=s*x,O=Math.sin(C),v=Math.cos(C),P=Math.sin(E),L=Math.cos(E),A=v*P,F=L,J=O*P,K=l(A,F,J,m,x);d[T+0]=K*A,d[T+1]=K*F,d[T+2]=K*J,f[T+0]=A,f[T+1]=F,f[T+2]=J,p[_+0]=m,p[_+1]=1-x}let b=e+1;for(let M=0;M<e;M++)for(let I=0;I<t;I++){let m=(M*t+I)*6;u[m+0]=I*b+M,u[m+1]=I*b+M+1,u[m+2]=(I+1)*b+M,u[m+3]=(I+1)*b+M,u[m+4]=I*b+M+1,u[m+5]=(I+1)*b+M+1}return{indices:{size:1,value:u},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:p}}}}var La=1/Math.PI*180,Ca=1/180*Math.PI,Fr={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Fr}};var z=globalThis.mathgl.config;function Gi(i,{precision:t=z.precision}={}){return i=Br(i),`${parseFloat(i.toPrecision(t))}`}function It(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Xe(i,t,e){let n=z.EPSILON;e&&(z.EPSILON=e);try{if(i===t)return!0;if(It(i)&&It(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!Xe(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=z.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{z.EPSILON=n}}function Br(i){return Math.round(i/z.EPSILON)*z.EPSILON}var vt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let n=0;n<this.ELEMENTS;++n)this[n]=t[n+e];return this.check()}toArray(t=[],e=0){for(let n=0;n<this.ELEMENTS;++n)t[e+n]=this[n];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:It(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(z)}formatString(t){let e="";for(let n=0;n<this.ELEMENTS;++n)e+=(n>0?", ":"")+Gi(this[n],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!Xe(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,n){if(n===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let s=t[r],o=typeof e=="number"?e:e[r];this[r]=s+n*(o-s)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t[n]),e[n]);return this.check()}add(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]+=e[n];return this.check()}subtract(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]-=e[n];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(z.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t),e);return this.check()}get elements(){return this}};function zr(i,t){if(i.length!==t)return!1;for(let e=0;e<i.length;++e)if(!Number.isFinite(i[e]))return!1;return!0}function V(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function se(i,t,e=""){if(z.debug&&!zr(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function qe(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var oe=class extends vt{get x(){return this[0]}set x(t){this[0]=V(t)}get y(){return this[1]}set y(t){this[1]=V(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let n=0;n<this.ELEMENTS;++n){let r=this[n]-t[n];e+=r*r}return V(e)}dot(t){let e=0;for(let n=0;n<this.ELEMENTS;++n)e+=this[n]*t[n];return V(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]*=e[n];return this.check()}divide(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]/=e[n];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return qe(t>=0&&t<this.ELEMENTS,"index is out of range"),V(this[t])}setComponent(t,e){return qe(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var tt=typeof Float32Array<"u"?Float32Array:Array;var Ga=Math.PI/180;function jr(){let i=new tt(2);return tt!=Float32Array&&(i[0]=0,i[1]=0),i}function Xi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[4]*r+e[12],i[1]=e[1]*n+e[5]*r+e[13],i}var $a=function(){let i=jr();return function(t,e,n,r,s,o){let a,c;for(e||(e=2),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],s(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function qi(i,t,e){let n=t[0],r=t[1],s=e[3]*n+e[7]*r||1;return i[0]=(e[0]*n+e[4]*r)/s,i[1]=(e[1]*n+e[5]*r)/s,i}function ae(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s||1;return i[0]=(e[0]*n+e[4]*r+e[8]*s)/o,i[1]=(e[1]*n+e[5]*r+e[9]*s)/o,i[2]=(e[2]*n+e[6]*r+e[10]*s)/o,i}function Hi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[2]*r,i[1]=e[1]*n+e[3]*r,i[2]=t[2],i}function Ur(){let i=new tt(3);return tt!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Gr(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Wi(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-s*a,i[1]=s*o-n*c,i[2]=n*a-r*o,i}function ce(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s+e[15];return o=o||1,i[0]=(e[0]*n+e[4]*r+e[8]*s+e[12])/o,i[1]=(e[1]*n+e[5]*r+e[9]*s+e[13])/o,i[2]=(e[2]*n+e[6]*r+e[10]*s+e[14])/o,i}function Yi(i,t,e){let n=t[0],r=t[1],s=t[2];return i[0]=n*e[0]+r*e[3]+s*e[6],i[1]=n*e[1]+r*e[4]+s*e[7],i[2]=n*e[2]+r*e[5]+s*e[8],i}function Ki(i,t,e){let n=e[0],r=e[1],s=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-s*c,d=s*a-n*h,f=n*c-r*a,p=r*f-s*d,g=s*l-n*f,u=n*d-r*l,b=o*2;return l*=b,d*=b,f*=b,p*=2,g*=2,u*=2,i[0]=a+l+p,i[1]=c+d+g,i[2]=h+f+u,i}function Zi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0],s[1]=r[1]*Math.cos(n)-r[2]*Math.sin(n),s[2]=r[1]*Math.sin(n)+r[2]*Math.cos(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Qi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[2]*Math.sin(n)+r[0]*Math.cos(n),s[1]=r[1],s[2]=r[2]*Math.cos(n)-r[0]*Math.sin(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Ji(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0]*Math.cos(n)-r[1]*Math.sin(n),s[1]=r[0]*Math.sin(n)+r[1]*Math.cos(n),s[2]=r[2],i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function tn(i,t){let e=i[0],n=i[1],r=i[2],s=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+n*n+r*r)*(s*s+o*o+a*a)),h=c&&Gr(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var qa=function(){let i=Ur();return function(t,e,n,r,s,o){let a,c;for(e||(e=3),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var We=[0,0,0],he,q=class extends oe{static get ZERO(){return he||(he=new q(0,0,0),Object.freeze(he)),he}constructor(t=0,e=0,n=0){super(-0,-0,-0),arguments.length===1&&It(t)?this.copy(t):(z.debug&&(V(t),V(e),V(n)),this[0]=t,this[1]=e,this[2]=n)}set(t,e,n){return this[0]=t,this[1]=e,this[2]=n,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return z.debug&&(V(t.x),V(t.y),V(t.z)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this.check()}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t}get ELEMENTS(){return 3}get z(){return this[2]}set z(t){this[2]=V(t)}angle(t){return tn(this,t)}cross(t){return Wi(this,this,t),this.check()}rotateX({radians:t,origin:e=We}){return Zi(this,this,e,t),this.check()}rotateY({radians:t,origin:e=We}){return Qi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=We}){return Ji(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return ce(this,this,t),this.check()}transformAsVector(t){return ae(this,this,t),this.check()}transformByMatrix3(t){return Yi(this,this,t),this.check()}transformByMatrix2(t){return Hi(this,this,t),this.check()}transformByQuaternion(t){return Ki(this,this,t),this.check()}};var le=class extends vt{toString(){let t="[";if(z.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let n=0;n<this.RANK;++n)t+=` ${this[n*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,n){return this[e*this.RANK+t]=V(n),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[n+r];return e}setColumn(t,e){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)this[n+r]=e[r];return this}};function $r(i){return i[0]=1,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=1,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function en(i,t){if(i===t){let e=t[1],n=t[2],r=t[3],s=t[6],o=t[7],a=t[11];i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=e,i[6]=t[9],i[7]=t[13],i[8]=n,i[9]=s,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function nn(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],f=t[10],p=t[11],g=t[12],u=t[13],b=t[14],M=t[15],I=e*a-n*o,m=e*c-r*o,x=e*h-s*o,y=n*c-r*a,_=n*h-s*a,T=r*h-s*c,C=l*u-d*g,E=l*b-f*g,O=l*M-p*g,v=d*b-f*u,P=d*M-p*u,L=f*M-p*b,A=I*L-m*P+x*v+y*O-_*E+T*C;return A?(A=1/A,i[0]=(a*L-c*P+h*v)*A,i[1]=(r*P-n*L-s*v)*A,i[2]=(u*T-b*_+M*y)*A,i[3]=(f*_-d*T-p*y)*A,i[4]=(c*O-o*L-h*E)*A,i[5]=(e*L-r*O+s*E)*A,i[6]=(b*x-g*T-M*m)*A,i[7]=(l*T-f*x+p*m)*A,i[8]=(o*P-a*O+h*C)*A,i[9]=(n*O-e*P-s*C)*A,i[10]=(g*_-u*x+M*I)*A,i[11]=(d*x-l*_-p*I)*A,i[12]=(a*E-o*v-c*C)*A,i[13]=(e*v-n*E+r*C)*A,i[14]=(u*m-g*y-b*I)*A,i[15]=(l*y-d*m+f*I)*A,i):null}function rn(i){let t=i[0],e=i[1],n=i[2],r=i[3],s=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],d=i[10],f=i[11],p=i[12],g=i[13],u=i[14],b=i[15],M=t*o-e*s,I=t*a-n*s,m=e*a-n*o,x=h*g-l*p,y=h*u-d*p,_=l*u-d*g,T=t*_-e*y+n*x,C=s*_-o*y+a*x,E=h*m-l*I+d*M,O=p*m-g*I+u*M;return c*T-r*C+b*E-f*O}function Ye(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],f=t[9],p=t[10],g=t[11],u=t[12],b=t[13],M=t[14],I=t[15],m=e[0],x=e[1],y=e[2],_=e[3];return i[0]=m*n+x*a+y*d+_*u,i[1]=m*r+x*c+y*f+_*b,i[2]=m*s+x*h+y*p+_*M,i[3]=m*o+x*l+y*g+_*I,m=e[4],x=e[5],y=e[6],_=e[7],i[4]=m*n+x*a+y*d+_*u,i[5]=m*r+x*c+y*f+_*b,i[6]=m*s+x*h+y*p+_*M,i[7]=m*o+x*l+y*g+_*I,m=e[8],x=e[9],y=e[10],_=e[11],i[8]=m*n+x*a+y*d+_*u,i[9]=m*r+x*c+y*f+_*b,i[10]=m*s+x*h+y*p+_*M,i[11]=m*o+x*l+y*g+_*I,m=e[12],x=e[13],y=e[14],_=e[15],i[12]=m*n+x*a+y*d+_*u,i[13]=m*r+x*c+y*f+_*b,i[14]=m*s+x*h+y*p+_*M,i[15]=m*o+x*l+y*g+_*I,i}function sn(i,t,e){let n=e[0],r=e[1],s=e[2],o,a,c,h,l,d,f,p,g,u,b,M;return t===i?(i[12]=t[0]*n+t[4]*r+t[8]*s+t[12],i[13]=t[1]*n+t[5]*r+t[9]*s+t[13],i[14]=t[2]*n+t[6]*r+t[10]*s+t[14],i[15]=t[3]*n+t[7]*r+t[11]*s+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],f=t[6],p=t[7],g=t[8],u=t[9],b=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=d,i[6]=f,i[7]=p,i[8]=g,i[9]=u,i[10]=b,i[11]=M,i[12]=o*n+l*r+g*s+t[12],i[13]=a*n+d*r+u*s+t[13],i[14]=c*n+f*r+b*s+t[14],i[15]=h*n+p*r+M*s+t[15]),i}function on(i,t,e){let n=e[0],r=e[1],s=e[2];return i[0]=t[0]*n,i[1]=t[1]*n,i[2]=t[2]*n,i[3]=t[3]*n,i[4]=t[4]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*s,i[9]=t[9]*s,i[10]=t[10]*s,i[11]=t[11]*s,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function an(i,t,e,n){let r=n[0],s=n[1],o=n[2],a=Math.sqrt(r*r+s*s+o*o),c,h,l,d,f,p,g,u,b,M,I,m,x,y,_,T,C,E,O,v,P,L,A,F;return a<1e-6?null:(a=1/a,r*=a,s*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],f=t[1],p=t[2],g=t[3],u=t[4],b=t[5],M=t[6],I=t[7],m=t[8],x=t[9],y=t[10],_=t[11],T=r*r*l+c,C=s*r*l+o*h,E=o*r*l-s*h,O=r*s*l-o*h,v=s*s*l+c,P=o*s*l+r*h,L=r*o*l+s*h,A=s*o*l-r*h,F=o*o*l+c,i[0]=d*T+u*C+m*E,i[1]=f*T+b*C+x*E,i[2]=p*T+M*C+y*E,i[3]=g*T+I*C+_*E,i[4]=d*O+u*v+m*P,i[5]=f*O+b*v+x*P,i[6]=p*O+M*v+y*P,i[7]=g*O+I*v+_*P,i[8]=d*L+u*A+m*F,i[9]=f*L+b*A+x*F,i[10]=p*L+M*A+y*F,i[11]=g*L+I*A+_*F,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function cn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],d=t[10],f=t[11];return t!==i&&(i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[4]=s*r+h*n,i[5]=o*r+l*n,i[6]=a*r+d*n,i[7]=c*r+f*n,i[8]=h*r-s*n,i[9]=l*r-o*n,i[10]=d*r-a*n,i[11]=f*r-c*n,i}function hn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[8],l=t[9],d=t[10],f=t[11];return t!==i&&(i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r-h*n,i[1]=o*r-l*n,i[2]=a*r-d*n,i[3]=c*r-f*n,i[8]=s*n+h*r,i[9]=o*n+l*r,i[10]=a*n+d*r,i[11]=c*n+f*r,i}function ln(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[4],l=t[5],d=t[6],f=t[7];return t!==i&&(i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r+h*n,i[1]=o*r+l*n,i[2]=a*r+d*n,i[3]=c*r+f*n,i[4]=h*r-s*n,i[5]=l*r-o*n,i[6]=d*r-a*n,i[7]=f*r-c*n,i}function dn(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=e+e,a=n+n,c=r+r,h=e*o,l=n*o,d=n*a,f=r*o,p=r*a,g=r*c,u=s*o,b=s*a,M=s*c;return i[0]=1-d-g,i[1]=l+M,i[2]=f-b,i[3]=0,i[4]=l-M,i[5]=1-h-g,i[6]=p+u,i[7]=0,i[8]=f+b,i[9]=p-u,i[10]=1-h-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function fn(i,t,e,n,r,s,o){let a=1/(e-t),c=1/(r-n),h=1/(s-o);return i[0]=s*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+n)*c,i[10]=(o+s)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*s*2*h,i[15]=0,i}function Vr(i,t,e,n,r){let s=1/Math.tan(t/2);if(i[0]=s/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(n-r);i[10]=(r+n)*o,i[14]=2*r*n*o}else i[10]=-1,i[14]=-2*n;return i}var un=Vr;function Xr(i,t,e,n,r,s,o){let a=1/(t-e),c=1/(n-r),h=1/(s-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+n)*c,i[14]=(o+s)*h,i[15]=1,i}var mn=Xr;function pn(i,t,e,n){let r,s,o,a,c,h,l,d,f,p,g=t[0],u=t[1],b=t[2],M=n[0],I=n[1],m=n[2],x=e[0],y=e[1],_=e[2];return Math.abs(g-x)<1e-6&&Math.abs(u-y)<1e-6&&Math.abs(b-_)<1e-6?$r(i):(d=g-x,f=u-y,p=b-_,r=1/Math.sqrt(d*d+f*f+p*p),d*=r,f*=r,p*=r,s=I*p-m*f,o=m*d-M*p,a=M*f-I*d,r=Math.sqrt(s*s+o*o+a*a),r?(r=1/r,s*=r,o*=r,a*=r):(s=0,o=0,a=0),c=f*a-p*o,h=p*s-d*a,l=d*o-f*s,r=Math.sqrt(c*c+h*h+l*l),r?(r=1/r,c*=r,h*=r,l*=r):(c=0,h=0,l=0),i[0]=s,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=h,i[6]=f,i[7]=0,i[8]=a,i[9]=l,i[10]=p,i[11]=0,i[12]=-(s*g+o*u+a*b),i[13]=-(c*g+h*u+l*b),i[14]=-(d*g+f*u+p*b),i[15]=1,i)}function qr(){let i=new tt(4);return tt!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function gn(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3];return i[0]=e[0]*n+e[4]*r+e[8]*s+e[12]*o,i[1]=e[1]*n+e[5]*r+e[9]*s+e[13]*o,i[2]=e[2]*n+e[6]*r+e[10]*s+e[14]*o,i[3]=e[3]*n+e[7]*r+e[11]*s+e[15]*o,i}var sc=function(){let i=qr();return function(t,e,n,r,s,o){let a,c;for(e||(e=4),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2],t[a+3]=i[3];return t}}();var Qe;(function(i){i[i.COL0ROW0=0]="COL0ROW0",i[i.COL0ROW1=1]="COL0ROW1",i[i.COL0ROW2=2]="COL0ROW2",i[i.COL0ROW3=3]="COL0ROW3",i[i.COL1ROW0=4]="COL1ROW0",i[i.COL1ROW1=5]="COL1ROW1",i[i.COL1ROW2=6]="COL1ROW2",i[i.COL1ROW3=7]="COL1ROW3",i[i.COL2ROW0=8]="COL2ROW0",i[i.COL2ROW1=9]="COL2ROW1",i[i.COL2ROW2=10]="COL2ROW2",i[i.COL2ROW3=11]="COL2ROW3",i[i.COL3ROW0=12]="COL3ROW0",i[i.COL3ROW1=13]="COL3ROW1",i[i.COL3ROW2=14]="COL3ROW2",i[i.COL3ROW3=15]="COL3ROW3"})(Qe||(Qe={}));var Hr=45*Math.PI/180,Wr=1,Ke=.1,Ze=500,Yr=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),X=class extends le{static get IDENTITY(){return Zr()}static get ZERO(){return Kr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Qe}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,n,r,s,o,a,c,h,l,d,f,p,g,u,b){return this[0]=t,this[1]=e,this[2]=n,this[3]=r,this[4]=s,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=f,this[12]=p,this[13]=g,this[14]=u,this[15]=b,this.check()}setRowMajor(t,e,n,r,s,o,a,c,h,l,d,f,p,g,u,b){return this[0]=t,this[1]=s,this[2]=h,this[3]=p,this[4]=e,this[5]=o,this[6]=l,this[7]=g,this[8]=n,this[9]=a,this[10]=d,this[11]=u,this[12]=r,this[13]=c,this[14]=f,this[15]=b,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy(Yr)}fromObject(t){return this.check()}fromQuaternion(t){return dn(this,t),this.check()}frustum(t){let{left:e,right:n,bottom:r,top:s,near:o=Ke,far:a=Ze}=t;return a===1/0?Qr(this,e,n,r,s,o):fn(this,e,n,r,s,o,a),this.check()}lookAt(t){let{eye:e,center:n=[0,0,0],up:r=[0,1,0]}=t;return pn(this,e,n,r),this.check()}ortho(t){let{left:e,right:n,bottom:r,top:s,near:o=Ke,far:a=Ze}=t;return mn(this,e,n,r,s,o,a),this.check()}orthographic(t){let{fovy:e=Hr,aspect:n=Wr,focalDistance:r=1,near:s=Ke,far:o=Ze}=t;xn(e);let a=e/2,c=r*Math.tan(a),h=c*n;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:s,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:n=1,near:r=.1,far:s=500}=t;return xn(e),un(this,e,n,r,s),this.check()}determinant(){return rn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*s,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*s,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*s,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*s,t[8]=this[10]*o,t}transpose(){return en(this,this),this.check()}invert(){return nn(this,this),this.check()}multiplyLeft(t){return Ye(this,t,this),this.check()}multiplyRight(t){return Ye(this,this,t),this.check()}rotateX(t){return cn(this,this,t),this.check()}rotateY(t){return hn(this,this,t),this.check()}rotateZ(t){return ln(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return an(this,this,t,e),this.check()}scale(t){return on(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return sn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=gn(e||[-0,-0,-0,-0],t,this),se(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:n}=t,r;switch(n){case 2:r=Xi(e||[-0,-0],t,this);break;case 3:r=ce(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return se(r,t.length),r}transformAsVector(t,e){let n;switch(t.length){case 2:n=qi(e||[-0,-0],t,this);break;case 3:n=ae(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return se(n,t.length),n}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,n){return this.identity().translate([t,e,n])}},de,fe;function Kr(){return de||(de=new X([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(de)),de}function Zr(){return fe||(fe=new X,Object.freeze(fe)),fe}function xn(i){if(i>Math.PI*2)throw Error("expected radians")}function Qr(i,t,e,n,r,s){let o=2*s/(e-t),a=2*s/(r-n),c=(e+t)/(e-t),h=(r+n)/(r-n),l=-1,d=-1,f=-2*s;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=d,i[12]=0,i[13]=0,i[14]=f,i[15]=0,i}var Jr=.02,ts=.12,es=.15,is=.2,ei=[0,1,0],ns=[255,255,255],rs=1,Je=.35,ti=255,ss=1,os=.01,as={depthCompare:"less-equal",depthWriteEnabled:!1,cullMode:"none"},cs=[{name:"instancePosition",format:"float32x3",stepMode:"instance"},{name:"instanceDirection",format:"float32x3",stepMode:"instance"},{name:"instanceScale",format:"float32x3",stepMode:"instance"},{name:"instanceColor",format:"float32x4",stepMode:"instance"}],hs={name:"lightMarker",props:{},uniforms:{},uniformTypes:{viewProjectionMatrix:"mat4x4<f32>"}},ls="inputs.positions * inputs.instanceScale",ds="vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)",fs="positions * instanceScale",us="vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)",ot=class extends H{lightModelProps;_instanceData;_managedBuffers;buildInstanceData;sizePropNames;constructor(t,e,n){let r=n.buildInstanceData(e),s=bn(t,e.id||n.idPrefix,r),o=new G({lightMarker:hs});o.setProps({lightMarker:{viewProjectionMatrix:Mn(e)}});let{source:a,vs:c,fs:h}=bs(n.anchorMode),l=e;super(t,{...l,id:e.id||n.idPrefix,source:a,vs:c,fs:h,geometry:n.geometry,shaderInputs:o,bufferLayout:[...cs],attributes:s,instanceCount:r.instanceCount,parameters:_n(e.parameters)}),this.lightModelProps=e,this._instanceData=r,this._managedBuffers=s,this.buildInstanceData=n.buildInstanceData,this.sizePropNames=n.sizePropNames}destroy(){super.destroy(),yn(this._managedBuffers),this._managedBuffers={}}draw(t){return this.instanceCount===0?!0:super.draw(t)}setProps(t){this.lightModelProps={...this.lightModelProps,...t},t.parameters&&this.setParameters(_n(this.lightModelProps.parameters)),("viewMatrix"in t||"projectionMatrix"in t)&&(this.shaderInputs.setProps({lightMarker:{viewProjectionMatrix:Mn(this.lightModelProps)}}),this.setNeedsRedraw("lightMarker camera")),xs(t,this.sizePropNames)&&this.rebuildInstanceData()}rebuildInstanceData(){let t=this.buildInstanceData(this.lightModelProps),e=bn(this.device,this.id,t);this.setAttributes(e),this.setInstanceCount(t.instanceCount),yn(this._managedBuffers),this._managedBuffers=e,this._instanceData=t}};function In(i){let t=An(i.lights),e=ii(i),n=i.pointLightRadius??Jr*e.sceneScale*e.markerScale;return ri(t.length,(r,s)=>({color:ni(r),direction:ei,position:r.position,scale:[n,n,n]}),t)}function vn(i){let t=Tn(i.lights),e=ii(i),n=i.spotLightLength??ts*e.sceneScale*e.markerScale;return ri(t.length,(r,s)=>{let o=zt(r.outerConeAngle??Math.PI/4,0,Math.PI/2-os),a=Math.tan(o)*n;return{color:ni(r),direction:Pn(r.direction),position:r.position,scale:[a,n,a]}},t)}function wn(i){let t=ms(i.lights),e=ii(i),n=i.directionalLightLength??es*e.sceneScale*e.markerScale,r=n*is;return ri(t.length,(s,o)=>{let a=Pn(s.direction),c=[e.sceneCenter[0]-a[0]*e.sceneScale*Je,e.sceneCenter[1]-a[1]*e.sceneScale*Je,e.sceneCenter[2]-a[2]*e.sceneScale*Je];return{color:ni(s),direction:a,position:c,scale:[r,n,r]}},t)}function An(i){return i.filter(t=>t.type==="point")}function Tn(i){return i.filter(t=>t.type==="spot")}function ms(i){return i.filter(t=>t.type==="directional")}function ii(i){let t=ps(i.lights,i.bounds),e=[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2,(t[0][2]+t[1][2])/2],n=Math.max(Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1],t[1][2]-t[0][2]),ss);return{bounds:t,markerScale:Math.max(i.markerScale??rs,0),sceneCenter:e,sceneScale:n}}function ni(i){let t=i.color||ns,e=Math.max(i.intensity??1,0),n=zt(.35+.3*Math.log10(e+1),.35,1);return[zt(t[0]/ti,0,1)*n,zt(t[1]/ti,0,1)*n,zt(t[2]/ti,0,1)*n,1]}function Pn(i){let[t,e,n]=i||ei,r=Math.hypot(t,e,n);return r===0?[...ei]:[t/r,e/r,n/r]}function ri(i,t,e=[]){let n=new Float32Array(i*3),r=new Float32Array(i*3),s=new Float32Array(i*3),o=new Float32Array(i*4);for(let[a,c]of e.entries()){let h=t(c,a);n.set(h.position,a*3),r.set(h.direction,a*3),s.set(h.scale,a*3),o.set(h.color,a*4)}return{instanceCount:i,instancePositions:n,instanceDirections:r,instanceScales:s,instanceColors:o}}function ps(i,t){if(t)return gs(t);let e=[...An(i).map(s=>s.position),...Tn(i).map(s=>s.position)];if(e.length===0)return[[-.5,-.5,-.5],[.5,.5,.5]];let n=[...e[0]],r=[...e[0]];for(let s of e.slice(1))n[0]=Math.min(n[0],s[0]),n[1]=Math.min(n[1],s[1]),n[2]=Math.min(n[2],s[2]),r[0]=Math.max(r[0],s[0]),r[1]=Math.max(r[1],s[1]),r[2]=Math.max(r[2],s[2]);return[n,r]}function gs(i){return[[...i[0]],[...i[1]]]}function bn(i,t,e){return{instancePosition:i.createBuffer({id:`${t}-instance-position`,data:ue(e.instancePositions,3)}),instanceDirection:i.createBuffer({id:`${t}-instance-direction`,data:ue(e.instanceDirections,3)}),instanceScale:i.createBuffer({id:`${t}-instance-scale`,data:ue(e.instanceScales,3)}),instanceColor:i.createBuffer({id:`${t}-instance-color`,data:ue(e.instanceColors,4)})}}function ue(i,t){return i.length>0?i:new Float32Array(t)}function yn(i){for(let t of Object.values(i))t?.destroy()}function Mn(i){return new X(i.projectionMatrix).multiplyRight(i.viewMatrix)}function xs(i,t){return"lights"in i||"bounds"in i||"markerScale"in i?!0:t.some(e=>e in i)}function _n(i){return{...as,...i||{}}}function bs(i){let t=i==="apex"?ds:ls,e=i==="apex"?us:fs;return{source:`struct lightMarkerUniforms {
85
85
  viewProjectionMatrix: mat4x4<f32>,
86
86
  };
87
87
 
88
- @binding(0) @group(0) var<uniform> lightMarker : lightMarkerUniforms;
88
+ @group(0) @binding(auto) var<uniform> lightMarker : lightMarkerUniforms;
89
89
 
90
90
  struct VertexInputs {
91
91
  @location(0) positions : vec3<f32>,
@@ -134,7 +134,7 @@ in vec3 instanceDirection;
134
134
  in vec3 instanceScale;
135
135
  in vec4 instanceColor;
136
136
 
137
- uniform lightMarkerUniforms {
137
+ layout(std140) uniform lightMarkerUniforms {
138
138
  mat4 viewProjectionMatrix;
139
139
  } lightMarker;
140
140
 
@@ -163,8 +163,8 @@ out vec4 fragColor;
163
163
  void main(void) {
164
164
  fragColor = vColor;
165
165
  }
166
- `}}function jt(i,t,e){return Math.min(e,Math.max(t,i))}var fs=new It({nlat:8,nlong:12,radius:1}),pe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"centered",buildInstanceData:_n,geometry:fs,idPrefix:"point-light-model",sizePropNames:["pointLightRadius"]})}};var ms={x:[2,0,1],y:[0,1,2],z:[1,2,0]},at=class extends V{constructor(t={}){let{id:e=S("truncated-code-geometry")}=t,{indices:n,attributes:r}=ps(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function ps(i={}){let{bottomRadius:t=0,topRadius:e=0,height:n=1,nradial:r=10,nvertical:s=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(s+1+h),d=Math.atan2(t-e,n),u=Math.sin,g=Math.cos,p=Math.PI,f=g(d),y=u(d),M=a?-2:0,I=s+(c?2:0),m=r+1,x=new Uint16Array(r*(s+h)*6),b=ms[o],_=new Float32Array(l*3),T=new Float32Array(l*3),E=new Float32Array(l*2),L=0,O=0;for(let v=M;v<=I;v++){let P=v/s,C=n*P,A;v<0?(C=0,P=1,A=t):v>s?(C=n,P=1,A=e):A=t+(e-t)*(v/s),(v===-2||v===s+2)&&(A=0,P=0),C-=n/2;for(let B=0;B<m;B++){let tt=u(B*p*2/r),Z=g(B*p*2/r);_[L+b[0]]=tt*A,_[L+b[1]]=C,_[L+b[2]]=Z*A,T[L+b[0]]=v<0||v>s?0:tt*f,T[L+b[1]]=v<0?-1:v>s?1:y,T[L+b[2]]=v<0||v>s?0:Z*f,E[O+0]=B/r,E[O+1]=P,O+=2,L+=3}}for(let v=0;v<s+h;v++)for(let P=0;P<r;P++){let C=(v*r+P)*6;x[C+0]=m*(v+0)+0+P,x[C+1]=m*(v+0)+1+P,x[C+2]=m*(v+1)+1+P,x[C+3]=m*(v+0)+0+P,x[C+4]=m*(v+1)+1+P,x[C+5]=m*(v+1)+0+P}return{indices:x,attributes:{POSITION:_,NORMAL:T,TEXCOORD_0:E}}}var ct=class extends at{constructor(t={}){let{id:e=S("cone-geometry"),radius:n=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:n})}};var gs=new ct({cap:!0,nradial:16,nvertical:1,radius:1}),ge=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:In,geometry:gs,idPrefix:"spot-light-model",sizePropNames:["spotLightLength"]})}};var xs=new ct({cap:!0,nradial:12,nvertical:1,radius:1}),xe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:vn,geometry:xs,idPrefix:"directional-light-model",sizePropNames:["directionalLightLength"]})}};function ai(i,t){if(!i)throw new Error(t)}var it=class{id;matrix=new q;display=!0;position=new H;rotation=new H;scale=new H(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||S(this.constructor.name),this._setScenegraphNodeProps(t)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(t){return this._setScenegraphNodeProps(t),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(t){return ai(t.length===3,"setPosition requires vector argument"),this.position=t,this}setRotation(t){return ai(t.length===3||t.length===4,"setRotation requires vector argument"),this.rotation=t,this}setScale(t){return ai(t.length===3,"setScale requires vector argument"),this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:n,scale:r,update:s=!0}=t;return e&&this.setPosition(e),n&&this.setRotation(n),r&&this.setScale(r),s&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let t=new q().fromQuaternion(this.rotation);this.matrix.multiplyRight(t)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:t,rotation:e,scale:n}={}){return t&&this.setPosition(t),e&&this.setRotation(e),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let n=new q(t).multiplyRight(e),r=n.invert(),s=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:n,worldInverseMatrix:r,worldInverseTransposeMatrix:s}}_setScenegraphNodeProps(t){t?.position&&this.setPosition(t.position),t?.rotation&&this.setRotation(t.rotation),t?.scale&&this.setScale(t.scale),this.updateMatrix(),t?.matrix&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var Pn=R(U(),1);var ft=class extends it{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Pn.log.assert(e.every(n=>n instanceof it),"every child must an instance of ScenegraphNode"),super(t),this.children=e}getBounds(){let t=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((e,{worldMatrix:n})=>{let r=e.getBounds();if(!r)return;let[s,o]=r,a=new H(s).add(o).divide([2,2,2]);n.transformAsPoint(a,a);let c=new H(o).subtract(s).divide([2,2,2]);n.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new H(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],l[d]),t[1][d]=Math.max(t[1][d],l[d])}}),Number.isFinite(t[0][0])?t:null}destroy(){this.children.forEach(t=>t.destroy()),this.removeAll(),super.destroy()}add(...t){for(let e of t)Array.isArray(e)?this.add(...e):this.children.push(e);return this}remove(t){let e=this.children,n=e.indexOf(t);return n>-1&&e.splice(n,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof ft?r.traverse(t,{worldMatrix:n}):t(r,{worldMatrix:n})}preorderTraversal(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);t(this,{worldMatrix:n});for(let r of this.children)r instanceof ft?r.preorderTraversal(t,{worldMatrix:n}):t(r,{worldMatrix:n})}};var ye=class extends it{model;bounds=null;managedResources;constructor(t){super(t),this.model=t.model,this.managedResources=t.managedResources||[],this.bounds=t.bounds||null,this.setProps(t)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(t=>t.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(t){return this.model.draw(t)}};var be=class extends V{constructor(t={}){let{id:e=S("cube-geometry"),indices:n=!0}=t;super(n?{...t,id:e,topology:"triangle-list",indices:{size:1,value:ys},attributes:{...As,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Ts,...t.attributes}})}},ys=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]),bs=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1]),Ms=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]),_s=new Float32Array([0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1]),Is=new Float32Array([1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1]),vs=new Float32Array([1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0]),ws=new Float32Array([1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,1]),As={POSITION:{size:3,value:bs},NORMAL:{size:3,value:Ms},TEXCOORD_0:{size:2,value:_s}},Ts={POSITION:{size:3,value:Is},TEXCOORD_0:{size:2,value:vs},COLOR_0:{size:3,value:ws}};var Me=class extends at{constructor(t={}){let{id:e=S("cylinder-geometry"),radius:n=1}=t;super({...t,id:e,bottomRadius:n,topRadius:n})}};var Ps=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],Ss=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],_e=class extends V{constructor(t={}){let{id:e=S("ico-sphere-geometry")}=t,{indices:n,attributes:r}=Ls(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ls(i){let{iterations:t=0}=i,e=Math.PI,n=e*2,r=[...Ps],s=[...Ss];r.push(),s.push();let o=(()=>{let l={};return(d,u)=>{d*=3,u*=3;let g=d<u?d:u,p=d>u?d:u,f=`${g}|${p}`;if(f in l)return l[f];let y=r[d],M=r[d+1],I=r[d+2],m=r[u],x=r[u+1],b=r[u+2],_=(y+m)/2,T=(M+x)/2,E=(I+b)/2,L=Math.sqrt(_*_+T*T+E*E);return _/=L,T/=L,E/=L,r.push(_,T,E),l[f]=r.length/3-1}})();for(let l=0;l<t;l++){let d=[];for(let u=0;u<s.length;u+=3){let g=o(s[u+0],s[u+1]),p=o(s[u+1],s[u+2]),f=o(s[u+2],s[u+0]);d.push(f,s[u+0],g,g,s[u+1],p,p,s[u+2],f,g,p,f)}s=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=s.length;for(let l=h-3;l>=0;l-=3){let d=s[l+0],u=s[l+1],g=s[l+2],p=d*3,f=u*3,y=g*3,M=d*2,I=u*2,m=g*2,x=r[p+0],b=r[p+1],_=r[p+2],T=Math.acos(_/Math.sqrt(x*x+b*b+_*_)),E=Math.atan2(b,x)+e,L=T/e,O=1-E/n,v=r[f+0],P=r[f+1],C=r[f+2],A=Math.acos(C/Math.sqrt(v*v+P*P+C*C)),B=Math.atan2(P,v)+e,tt=A/e,Z=1-B/n,Xt=r[y+0],qt=r[y+1],Ht=r[y+2],$n=Math.acos(Ht/Math.sqrt(Xt*Xt+qt*qt+Ht*Ht)),Vn=Math.atan2(qt,Xt)+e,mi=$n/e,Wt=1-Vn/n,Xn=[Xt-v,qt-P,Ht-C],qn=[x-v,b-P,_-C],Y=new H(Xn).cross(qn).normalize(),N;(O===0||Z===0||Wt===0)&&(O===0||O>.5)&&(Z===0||Z>.5)&&(Wt===0||Wt>.5)&&(r.push(r[p+0],r[p+1],r[p+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=L,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[f+0],r[f+1],r[f+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=tt,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[y+0],r[y+1],r[y+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=mi,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z),a[p+0]=a[f+0]=a[y+0]=Y.x,a[p+1]=a[f+1]=a[y+1]=Y.y,a[p+2]=a[f+2]=a[y+2]=Y.z,c[M+0]=O,c[M+1]=L,c[I+0]=Z,c[I+1]=tt,c[m+0]=Wt,c[m+1]=mi}return{indices:{size:1,value:new Uint16Array(s)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function Sn(i){let{indices:t,attributes:e}=i;if(!t)return i;let n=t.value.length,r={};for(let s in e){let o=e[s],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(n*h);for(let d=0;d<n;++d){let u=t.value[d];for(let g=0;g<h;g++)l[d*h+g]=c[u*h+g]}r[s]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var Ie=class extends V{constructor(t={}){let{id:e=S("plane-geometry")}=t,{indices:n,attributes:r}=Cs(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cs(i){let{type:t="x,y",offset:e=0,flipCull:n=!1,unpack:r=!1}=i,s=t.split(","),o=i[`${s[0]}len`]||1,a=i[`${s[1]}len`]||1,c=i[`n${s[0]}`]||1,h=i[`n${s[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),u=new Float32Array(l*3),g=new Float32Array(l*2);n&&(o=-o);let p=0,f=0;for(let m=0;m<=h;m++)for(let x=0;x<=c;x++){let b=x/c,_=m/h;switch(g[p+0]=n?1-b:b,g[p+1]=_,t){case"x,y":d[f+0]=o*b-o*.5,d[f+1]=a*_-a*.5,d[f+2]=e,u[f+0]=0,u[f+1]=0,u[f+2]=n?1:-1;break;case"x,z":d[f+0]=o*b-o*.5,d[f+1]=e,d[f+2]=a*_-a*.5,u[f+0]=0,u[f+1]=n?1:-1,u[f+2]=0;break;case"y,z":d[f+0]=e,d[f+1]=o*b-o*.5,d[f+2]=a*_-a*.5,u[f+0]=n?1:-1,u[f+1]=0,u[f+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}p+=2,f+=3}let y=c+1,M=new Uint16Array(c*h*6);for(let m=0;m<h;m++)for(let x=0;x<c;x++){let b=(m*c+x)*6;M[b+0]=(m+0)*y+x,M[b+1]=(m+1)*y+x,M[b+2]=(m+0)*y+x+1,M[b+3]=(m+1)*y+x,M[b+4]=(m+1)*y+x+1,M[b+5]=(m+0)*y+x+1}let I={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}};return r?Sn(I):I}function Ln(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Es(Math.abs(i*t)*1432.71))}function Es(i){return i-Math.floor(i)}var ci="";function Cn(i){ci=i}async function En(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:ci+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function On(i,t){return await new Promise((e,n)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:ci+i}catch(r){n(r)}})}var Rn=R(rt(),1);var nt=R(U(),1),Tt=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},Pt=class extends Tt{constructor(t,e){e={...e};let{width:n=1,height:r=1}=e,s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-0`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r})),o=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-1`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r}));let a=t.createFramebuffer({...e,colorAttachments:s});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}},ve=class extends Tt{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}};function kn(i){let{shaderPass:t,action:e,shadingLanguage:n}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return n==="wgsl"?Os(r):Rs(r);case"sample":let s=`${t.name}_sampleColor`;return n==="wgsl"?ks(s):Ns(s);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Os(i){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
167
- @group(0) @binding(2) var sourceTextureSampler: sampler;
166
+ `}}function zt(i,t,e){return Math.min(e,Math.max(t,i))}var ys=new _t({nlat:8,nlong:12,radius:1}),me=class extends ot{constructor(t,e){super(t,e,{anchorMode:"centered",buildInstanceData:In,geometry:ys,idPrefix:"point-light-model",sizePropNames:["pointLightRadius"]})}};var Ms={x:[2,0,1],y:[0,1,2],z:[1,2,0]},at=class extends ${constructor(t={}){let{id:e=S("truncated-code-geometry")}=t,{indices:n,attributes:r}=_s(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function _s(i={}){let{bottomRadius:t=0,topRadius:e=0,height:n=1,nradial:r=10,nvertical:s=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(s+1+h),d=Math.atan2(t-e,n),f=Math.sin,p=Math.cos,g=Math.PI,u=p(d),b=f(d),M=a?-2:0,I=s+(c?2:0),m=r+1,x=new Uint16Array(r*(s+h)*6),y=Ms[o],_=new Float32Array(l*3),T=new Float32Array(l*3),C=new Float32Array(l*2),E=0,O=0;for(let v=M;v<=I;v++){let P=v/s,L=n*P,A;v<0?(L=0,P=1,A=t):v>s?(L=n,P=1,A=e):A=t+(e-t)*(v/s),(v===-2||v===s+2)&&(A=0,P=0),L-=n/2;for(let F=0;F<m;F++){let J=f(F*g*2/r),K=p(F*g*2/r);_[E+y[0]]=J*A,_[E+y[1]]=L,_[E+y[2]]=K*A,T[E+y[0]]=v<0||v>s?0:J*u,T[E+y[1]]=v<0?-1:v>s?1:b,T[E+y[2]]=v<0||v>s?0:K*u,C[O+0]=F/r,C[O+1]=P,O+=2,E+=3}}for(let v=0;v<s+h;v++)for(let P=0;P<r;P++){let L=(v*r+P)*6;x[L+0]=m*(v+0)+0+P,x[L+1]=m*(v+0)+1+P,x[L+2]=m*(v+1)+1+P,x[L+3]=m*(v+0)+0+P,x[L+4]=m*(v+1)+1+P,x[L+5]=m*(v+1)+0+P}return{indices:x,attributes:{POSITION:_,NORMAL:T,TEXCOORD_0:C}}}var ct=class extends at{constructor(t={}){let{id:e=S("cone-geometry"),radius:n=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:n})}};var Is=new ct({cap:!0,nradial:16,nvertical:1,radius:1}),pe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:vn,geometry:Is,idPrefix:"spot-light-model",sizePropNames:["spotLightLength"]})}};var vs=new ct({cap:!0,nradial:12,nvertical:1,radius:1}),ge=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:wn,geometry:vs,idPrefix:"directional-light-model",sizePropNames:["directionalLightLength"]})}};function si(i,t){if(!i)throw new Error(t)}var et=class{id;matrix=new X;display=!0;position=new q;rotation=new q;scale=new q(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||S(this.constructor.name),this._setScenegraphNodeProps(t)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(t){return this._setScenegraphNodeProps(t),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(t){return si(t.length===3,"setPosition requires vector argument"),this.position=t,this}setRotation(t){return si(t.length===3||t.length===4,"setRotation requires vector argument"),this.rotation=t,this}setScale(t){return si(t.length===3,"setScale requires vector argument"),this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:n,scale:r,update:s=!0}=t;return e&&this.setPosition(e),n&&this.setRotation(n),r&&this.setScale(r),s&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let t=new X().fromQuaternion(this.rotation);this.matrix.multiplyRight(t)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:t,rotation:e,scale:n}={}){return t&&this.setPosition(t),e&&this.setRotation(e),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let n=new X(t).multiplyRight(e),r=n.invert(),s=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:n,worldInverseMatrix:r,worldInverseTransposeMatrix:s}}_setScenegraphNodeProps(t){t?.position&&this.setPosition(t.position),t?.rotation&&this.setRotation(t.rotation),t?.scale&&this.setScale(t.scale),this.updateMatrix(),t?.matrix&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var Sn=k(U(),1);var ft=class extends et{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Sn.log.assert(e.every(n=>n instanceof et),"every child must an instance of ScenegraphNode"),super(t),this.children=e}getBounds(){let t=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((e,{worldMatrix:n})=>{let r=e.getBounds();if(!r)return;let[s,o]=r,a=new q(s).add(o).divide([2,2,2]);n.transformAsPoint(a,a);let c=new q(o).subtract(s).divide([2,2,2]);n.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new q(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],l[d]),t[1][d]=Math.max(t[1][d],l[d])}}),Number.isFinite(t[0][0])?t:null}destroy(){this.children.forEach(t=>t.destroy()),this.removeAll(),super.destroy()}add(...t){for(let e of t)Array.isArray(e)?this.add(...e):this.children.push(e);return this}remove(t){let e=this.children,n=e.indexOf(t);return n>-1&&e.splice(n,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new X}={}){let n=new X(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof ft?r.traverse(t,{worldMatrix:n}):t(r,{worldMatrix:n})}preorderTraversal(t,{worldMatrix:e=new X}={}){let n=new X(e).multiplyRight(this.matrix);t(this,{worldMatrix:n});for(let r of this.children)r instanceof ft?r.preorderTraversal(t,{worldMatrix:n}):t(r,{worldMatrix:n})}};var xe=class extends et{model;bounds=null;managedResources;constructor(t){super(t),this.model=t.model,this.managedResources=t.managedResources||[],this.bounds=t.bounds||null,this.setProps(t)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(t=>t.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(t){return this.model.draw(t)}};var be=class extends ${constructor(t={}){let{id:e=S("cube-geometry"),indices:n=!0}=t;super(n?{...t,id:e,topology:"triangle-list",indices:{size:1,value:ws},attributes:{...Cs,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Os,...t.attributes}})}},ws=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]),As=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1]),Ts=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]),Ps=new Float32Array([0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1]),Ss=new Float32Array([1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1]),Es=new Float32Array([1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0]),Ls=new Float32Array([1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,1]),Cs={POSITION:{size:3,value:As},NORMAL:{size:3,value:Ts},TEXCOORD_0:{size:2,value:Ps}},Os={POSITION:{size:3,value:Ss},TEXCOORD_0:{size:2,value:Es},COLOR_0:{size:3,value:Ls}};var ye=class extends at{constructor(t={}){let{id:e=S("cylinder-geometry"),radius:n=1}=t;super({...t,id:e,bottomRadius:n,topRadius:n})}};var Rs=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],ks=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],Me=class extends ${constructor(t={}){let{id:e=S("ico-sphere-geometry")}=t,{indices:n,attributes:r}=Ns(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ns(i){let{iterations:t=0}=i,e=Math.PI,n=e*2,r=[...Rs],s=[...ks];r.push(),s.push();let o=(()=>{let l={};return(d,f)=>{d*=3,f*=3;let p=d<f?d:f,g=d>f?d:f,u=`${p}|${g}`;if(u in l)return l[u];let b=r[d],M=r[d+1],I=r[d+2],m=r[f],x=r[f+1],y=r[f+2],_=(b+m)/2,T=(M+x)/2,C=(I+y)/2,E=Math.sqrt(_*_+T*T+C*C);_/=E,T/=E,C/=E,r.push(_,T,C);let O=r.length/3-1;return l[u]=O,O}})();for(let l=0;l<t;l++){let d=[];for(let f=0;f<s.length;f+=3){let p=o(s[f+0],s[f+1]),g=o(s[f+1],s[f+2]),u=o(s[f+2],s[f+0]);d.push(u,s[f+0],p,p,s[f+1],g,g,s[f+2],u,p,g,u)}s=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=s.length;for(let l=h-3;l>=0;l-=3){let d=s[l+0],f=s[l+1],p=s[l+2],g=d*3,u=f*3,b=p*3,M=d*2,I=f*2,m=p*2,x=r[g+0],y=r[g+1],_=r[g+2],T=Math.acos(_/Math.sqrt(x*x+y*y+_*_)),C=Math.atan2(y,x)+e,E=T/e,O=1-C/n,v=r[u+0],P=r[u+1],L=r[u+2],A=Math.acos(L/Math.sqrt(v*v+P*P+L*L)),F=Math.atan2(P,v)+e,J=A/e,K=1-F/n,Vt=r[b+0],Xt=r[b+1],qt=r[b+2],Vn=Math.acos(qt/Math.sqrt(Vt*Vt+Xt*Xt+qt*qt)),Xn=Math.atan2(Xt,Vt)+e,fi=Vn/e,Ht=1-Xn/n,qn=[Vt-v,Xt-P,qt-L],Hn=[x-v,y-P,_-L],W=new q(qn).cross(Hn).normalize(),N;(O===0||K===0||Ht===0)&&(O===0||O>.5)&&(K===0||K>.5)&&(Ht===0||Ht>.5)&&(r.push(r[g+0],r[g+1],r[g+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=E,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z,r.push(r[u+0],r[u+1],r[u+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=J,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z,r.push(r[b+0],r[b+1],r[b+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=fi,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z),a[g+0]=a[u+0]=a[b+0]=W.x,a[g+1]=a[u+1]=a[b+1]=W.y,a[g+2]=a[u+2]=a[b+2]=W.z,c[M+0]=O,c[M+1]=E,c[I+0]=K,c[I+1]=J,c[m+0]=Ht,c[m+1]=fi}return{indices:{size:1,value:new Uint16Array(s)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function En(i){let{indices:t,attributes:e}=i;if(!t)return i;let n=t.value.length,r={};for(let s in e){let o=e[s],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(n*h);for(let d=0;d<n;++d){let f=t.value[d];for(let p=0;p<h;p++)l[d*h+p]=c[f*h+p]}r[s]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var _e=class extends ${constructor(t={}){let{id:e=S("plane-geometry")}=t,{indices:n,attributes:r}=Ds(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ds(i){let{type:t="x,y",offset:e=0,flipCull:n=!1,unpack:r=!1}=i,s=t.split(","),o=i[`${s[0]}len`]||1,a=i[`${s[1]}len`]||1,c=i[`n${s[0]}`]||1,h=i[`n${s[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),f=new Float32Array(l*3),p=new Float32Array(l*2);n&&(o=-o);let g=0,u=0;for(let m=0;m<=h;m++)for(let x=0;x<=c;x++){let y=x/c,_=m/h;switch(p[g+0]=n?1-y:y,p[g+1]=_,t){case"x,y":d[u+0]=o*y-o*.5,d[u+1]=a*_-a*.5,d[u+2]=e,f[u+0]=0,f[u+1]=0,f[u+2]=n?1:-1;break;case"x,z":d[u+0]=o*y-o*.5,d[u+1]=e,d[u+2]=a*_-a*.5,f[u+0]=0,f[u+1]=n?1:-1,f[u+2]=0;break;case"y,z":d[u+0]=e,d[u+1]=o*y-o*.5,d[u+2]=a*_-a*.5,f[u+0]=n?1:-1,f[u+1]=0,f[u+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}g+=2,u+=3}let b=c+1,M=new Uint16Array(c*h*6);for(let m=0;m<h;m++)for(let x=0;x<c;x++){let y=(m*c+x)*6;M[y+0]=(m+0)*b+x,M[y+1]=(m+1)*b+x,M[y+2]=(m+0)*b+x+1,M[y+3]=(m+1)*b+x,M[y+4]=(m+1)*b+x+1,M[y+5]=(m+0)*b+x+1}let I={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:p}}};return r?En(I):I}function Ln(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Fs(Math.abs(i*t)*1432.71))}function Fs(i){return i-Math.floor(i)}var oi="";function Cn(i){oi=i}async function On(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:oi+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function Rn(i,t){return await new Promise((e,n)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:oi+i}catch(r){n(r)}})}var Nn=k(nt(),1);var it=k(U(),1),At=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},Tt=class extends At{constructor(t,e){e={...e};let{width:n=1,height:r=1}=e,s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-0`,format:c,usage:it.Texture.SAMPLE|it.Texture.RENDER|it.Texture.COPY_SRC|it.Texture.COPY_DST,width:n,height:r})),o=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-1`,format:c,usage:it.Texture.SAMPLE|it.Texture.RENDER|it.Texture.COPY_SRC|it.Texture.COPY_DST,width:n,height:r}));let a=t.createFramebuffer({...e,colorAttachments:s});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}},Ie=class extends At{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}};function kn(i){let{shaderPass:t,action:e,shadingLanguage:n}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return n==="wgsl"?Bs(r):js(r);case"sample":let s=`${t.name}_sampleColor`;return n==="wgsl"?zs(s):Us(s);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Bs(i){return`@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
167
+ @group(0) @binding(auto) var sourceTextureSampler: sampler;
168
168
 
169
169
  @fragment
170
170
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
@@ -175,8 +175,8 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
175
175
  fragColor = ${i}(fragColor, texSize, texCoord);
176
176
  return fragColor;
177
177
  }
178
- `}function ks(i){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
179
- @group(0) @binding(2) var sourceTextureSampler: sampler;
178
+ `}function zs(i){return`@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
179
+ @group(0) @binding(auto) var sourceTextureSampler: sampler;
180
180
 
181
181
  @fragment
182
182
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
@@ -184,7 +184,7 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
184
184
  let texSize = vec2f(textureDimensions(sourceTexture));
185
185
  return ${i}(sourceTexture, sourceTextureSampler, texSize, texCoord);
186
186
  }
187
- `}function Rs(i){return`#version 300 es
187
+ `}function js(i){return`#version 300 es
188
188
 
189
189
  uniform sampler2D sourceTexture;
190
190
 
@@ -202,7 +202,7 @@ void main() {
202
202
  fragColor = texture(sourceTexture, texCoord);
203
203
  fragColor = ${i}(fragColor, texSize, texCoord);
204
204
  }
205
- `}function Ns(i){return`#version 300 es
205
+ `}function Us(i){return`#version 300 es
206
206
 
207
207
  uniform sampler2D sourceTexture;
208
208
 
@@ -219,10 +219,10 @@ void main() {
219
219
 
220
220
  fragColor = ${i}(sourceTexture, texSize, texCoord);
221
221
  }
222
- `}var we=class{device;shaderInputs;passRenderers;swapFramebuffers;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(s=>(0,Rn.initializeShaderModule)(s));let n=e.shaderPasses.reduce((s,o)=>({...s,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new $(n);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new Pt(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new _t(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.passRenderers=e.shaderPasses.map(s=>new hi(t,s))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.textureModel.destroy()}resize(t){t||=this.device.getCanvasContext().getDrawingBufferSize(),this.swapFramebuffers.resize({width:t[0],height:t[1]})}renderToScreen(t){let e=this.renderToTexture(t);if(!e)return!1;let n=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilFormat:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:n,clearDepth:!1});return this.textureModel.setProps({backgroundTexture:e}),this.textureModel.draw(r),r.end(),!0}renderToTexture(t){let{sourceTexture:e}=t;if(!e.isReady)return null;if(this.passRenderers.length===0)return e.texture;this.textureModel.setProps({backgroundTexture:e});let n=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(n),n.end();let r=!0;for(let o of this.passRenderers)for(let a of o.subPassRenderers){r||this.swapFramebuffers.swap(),r=!1;let h={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},l=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:l,bindings:h}),l.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},hi=class{shaderPass;subPassRenderers;constructor(t,e,n={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(s=>new li(t,e,s))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},li=class{model;shaderPass;subPass;constructor(t,e,n){this.shaderPass=e,this.subPass=n;let r=n.action||n.filter&&"filter"||n.sampler&&"sample"||"filter",s=kn({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new st(t,{id:`${e.name}-subpass`,source:s,fs:s,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:n}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(n||{}),this.model.draw(e)}};var D=R(U(),1),Nn=R(rt(),1);var di=2,Ds=1e4,ui=class{device;id;pipelineFactory;shaderFactory;userData={};bindings={};pipeline;source;shader;shaderInputs;_uniformStore;_pipelineNeedsUpdate="newly created";_getModuleUniforms;props;_destroyed=!1;constructor(t,e){if(t.type!=="webgpu")throw new Error("Computation is only supported in WebGPU");this.props={...ui.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData);let n=Object.fromEntries(this.props.modules?.map(h=>[h.name,h])||[]);this.shaderInputs=e.shaderInputs||new $(n),this.setShaderInputs(this.shaderInputs);let r=Fs(t),s=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.props.shaderLayout=xt(this.props.shaderLayout,s)||null,this.pipelineFactory=e.pipelineFactory||D.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||D.ShaderFactory.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:s});this.source=o,this._getModuleUniforms=a;let c=t.getShaderLayout?.(this.source);this.props.shaderLayout=xt(this.props.shaderLayout||c||null,s)||null,this.pipeline=this._updatePipeline(),e.bindings&&this.setBindings(e.bindings),Object.seal(this)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.shader),this._uniformStore.destroy(),this._destroyed=!0)}predraw(){this.updateShaderInputs()}dispatch(t,e,n,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings({}),t.dispatch(e,n,r)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new D.UniformStore(this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(yt(n)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),n=Object.keys(e).filter(s=>{let o=e[s];return!kt(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let s of n)r[s]=e[s],delete e[s]}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues())}setBindings(t){Object.assign(this.bindings,t)}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate=this._pipelineNeedsUpdate||t}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null;this.pipeline&&(D.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.shader),this._pipelineNeedsUpdate=!1,this.shader=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"compute",source:this.source,debugShaders:this.props.debugShaders}),this.pipeline=this.pipelineFactory.createComputePipeline({...this.props,shader:this.shader}),t&&this.shaderFactory.release(t)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=D.log.level>3?0:Ds;D.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,D.log.group(di,`>>> DRAWING MODEL ${this.id}`,{collapsed:D.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();D.log.table(di,t)(),D.log.groupEnd(di)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let n=D.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof D.Buffer?new n(t.debugData):t).toString()}},Gt=ui;K(Gt,"defaultProps",{...D.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:Nn.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function Fs(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Q=R(U(),1);var Bs=[0,1,1,1],G=-1,zs={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},St=`precision highp float;
222
+ `}var ve=class{device;shaderInputs;passRenderers;swapFramebuffers;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(s=>(0,Nn.initializeShaderModule)(s));let n=e.shaderPasses.reduce((s,o)=>({...s,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new G(n);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new Tt(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new Mt(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.passRenderers=e.shaderPasses.map(s=>new ai(t,s))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.textureModel.destroy()}resize(t){t||=this.device.getCanvasContext().getDrawingBufferSize(),this.swapFramebuffers.resize({width:t[0],height:t[1]})}renderToScreen(t){let e=this.renderToTexture(t);if(!e)return!1;let n=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilFormat:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:n,clearDepth:!1});return this.textureModel.setProps({backgroundTexture:e}),this.textureModel.draw(r),r.end(),!0}renderToTexture(t){let{sourceTexture:e}=t;if(!e.isReady)return null;if(this.passRenderers.length===0)return e.texture;this.textureModel.setProps({backgroundTexture:e});let n=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(n),n.end();let r=!0;for(let o of this.passRenderers)for(let a of o.subPassRenderers){r||this.swapFramebuffers.swap(),r=!1;let h={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},l=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:l,bindings:h}),l.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},ai=class{shaderPass;subPassRenderers;constructor(t,e,n={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(s=>new ci(t,e,s))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},ci=class{model;shaderPass;subPass;constructor(t,e,n){this.shaderPass=e,this.subPass=n;let r=n.action||n.filter&&"filter"||n.sampler&&"sample"||"filter",s=kn({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new st(t,{id:`${e.name}-subpass`,source:s,fs:s,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:n}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(n||{}),this.model.draw(e)}};var D=k(U(),1),Dn=k(nt(),1);var hi=2,Gs=1e4,li=class{device;id;pipelineFactory;shaderFactory;userData={};bindings={};pipeline;source;shader;shaderInputs;_uniformStore;_pipelineNeedsUpdate="newly created";_getModuleUniforms;props;_destroyed=!1;constructor(t,e){if(t.type!=="webgpu")throw new Error("Computation is only supported in WebGPU");this.props={...li.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData);let n=Object.fromEntries(this.props.modules?.map(h=>[h.name,h])||[]);this.shaderInputs=e.shaderInputs||new G(n),this.setShaderInputs(this.shaderInputs);let r=$s(t),s=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.props.shaderLayout=gt(this.props.shaderLayout,s)||null,this.pipelineFactory=e.pipelineFactory||D.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||D.ShaderFactory.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:s});this.source=o,this._getModuleUniforms=a;let c=t.getShaderLayout?.(this.source);this.props.shaderLayout=gt(this.props.shaderLayout||c||null,s)||null,this.pipeline=this._updatePipeline(),e.bindings&&this.setBindings(e.bindings),Object.seal(this)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.shader),this._uniformStore.destroy(),this._destroyed=!0)}predraw(){this.updateShaderInputs()}dispatch(t,e,n,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings({}),t.dispatch(e,n,r)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new D.UniformStore(this.device,this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(xt(n)){let r=this._uniformStore.getManagedUniformBuffer(e);this.bindings[`${e}Uniforms`]=r}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),n=Object.keys(e).filter(s=>{let o=e[s];return!Ot(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let s of n)r[s]=e[s],delete e[s]}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues())}setBindings(t){Object.assign(this.bindings,t)}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate=this._pipelineNeedsUpdate||t}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null;this.pipeline&&(D.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.shader),this._pipelineNeedsUpdate=!1,this.shader=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"compute",source:this.source,debugShaders:this.props.debugShaders}),this.pipeline=this.pipelineFactory.createComputePipeline({...this.props,shader:this.shader}),t&&this.shaderFactory.release(t)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=D.log.level>3?0:Gs;D.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,D.log.group(hi,`>>> DRAWING MODEL ${this.id}`,{collapsed:D.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();D.log.table(hi,t)(),D.log.groupEnd(hi)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let n=D.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof D.Buffer?new n(t.debugData):t).toString()}},jt=li;Y(jt,"defaultProps",{...D.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:Dn.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function $s(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Z=k(U(),1);var Vs=[0,1,1,1],j=-1,Xs={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},Pt=`precision highp float;
223
223
  precision highp int;
224
224
 
225
- uniform pickingUniforms {
225
+ layout(std140) uniform pickingUniforms {
226
226
  int isActive;
227
227
  int indexMode;
228
228
  int batchIndex;
@@ -232,7 +232,7 @@ uniform pickingUniforms {
232
232
  int highlightedObjectIndex;
233
233
  vec4 highlightColor;
234
234
  } picking;
235
- `,Ae=`struct pickingUniforms {
235
+ `,we=`struct pickingUniforms {
236
236
  isActive: i32,
237
237
  indexMode: i32,
238
238
  batchIndex: i32,
@@ -244,9 +244,9 @@ uniform pickingUniforms {
244
244
  };
245
245
 
246
246
  @group(0) @binding(auto) var<uniform> picking: pickingUniforms;
247
- `;function js(i={},t){let e={...t};switch(i.isActive!==void 0&&(e.isActive=Boolean(i.isActive)),i.indexMode){case"instance":e.indexMode=0;break;case"attribute":e.indexMode=1;break;case void 0:break}switch(typeof i.batchIndex=="number"&&(e.batchIndex=i.batchIndex),i.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=G;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=i.highlightedObjectIndex}switch(i.highlightedBatchIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedBatchIndex=G;break;default:e.isHighlightActive=!0,e.highlightedBatchIndex=i.highlightedBatchIndex}return i.highlightColor&&(e.highlightColor=i.highlightColor),e}var Lt={props:{},uniforms:{},name:"picking",uniformTypes:zs,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!1,highlightedBatchIndex:G,highlightedObjectIndex:G,highlightColor:Bs},getUniforms:js};var Dn=1,Gs=new Int32Array([G,G,0,0]);function Pe(i,t="color",e=i==="webgpu"){if(t==="auto")return e?"index":"color";if(t==="index"&&!e)throw new Error(`Picking mode "${t}" requires WebGPU or a WebGL device that supports renderable rg32sint textures.`);return t}function fi(i){return i.type==="webgpu"||i.type==="webgl"&&i.isTextureFormatRenderable("rg32sint")}var zn=Pe;function Fn(i){return{objectIndex:i[0]===G?null:i[0],batchIndex:i[1]===G?null:i[1]}}function Bn(i){let t=i[0]+i[1]*256+i[2]*65536;if(t===0)return{objectIndex:null,batchIndex:null};let e=i[3]>0?i[3]-1:0;return{objectIndex:t-1,batchIndex:e}}var Te=class{device;props;mode;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Te.defaultProps,...e};let n=e.mode??e.backend??Te.defaultProps.mode;this.props.mode=n,this.props.backend=n,this.mode=Pe(this.device.type,n,fi(this.device))}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.mode==="index"?this.createIndexFramebuffer():this.createColorFramebuffer()),this.framebuffer}clearPickState(){this.setPickingProps({highlightedBatchIndex:null,highlightedObjectIndex:null})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.setPickingProps({isActive:!0}),this.mode==="index"?this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),Gs],clearDepth:1}):this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),n=this.getPickPosition(t),r=await this.readPickInfo(e,n);return r?(this.hasPickInfoChanged(r)&&(this.pickInfo=r,this.props.onObjectPicked(r)),this.setPickingProps({isActive:!1,highlightedBatchIndex:r.batchIndex,highlightedObjectIndex:r.objectIndex}),this.pickInfo):null}getPickPosition(t){let e=this.device.type!=="webgpu",n=this.device.getDefaultCanvasContext().cssToDevicePixels(t,e),r=n.x+Math.floor(n.width/2),s=n.y+Math.floor(n.height/2);return[r,s]}createIndexFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT}),e=this.device.createTexture({format:"rg32sint",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT|Q.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t,e],depthStencilAttachment:"depth24plus"})}createColorFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT|Q.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t],depthStencilAttachment:"depth24plus"})}setPickingProps(t){this.props.shaderInputs?.setProps({picking:t})}async readPickInfo(t,e){return this.mode==="index"?this.readIndexPickInfo(t,e):this.readColorPickInfo(t,e)}async readIndexPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[Dn]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Q.Buffer.COPY_DST|Q.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Fn(new Int32Array(c.buffer,c.byteOffset,2))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:Dn});return r?Fn(new Int32Array(r.buffer,r.byteOffset,2)):null}async readColorPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[0]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Q.Buffer.COPY_DST|Q.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Bn(new Uint8Array(c.buffer,c.byteOffset,4))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:0});return r?Bn(new Uint8Array(r.buffer,r.byteOffset,4)):null}hasPickInfoChanged(t){return t.objectIndex!==this.pickInfo.objectIndex||t.batchIndex!==this.pickInfo.batchIndex}},Ut=Te;K(Ut,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{},mode:"color",backend:"color"});var Us=`${Ae}
247
+ `;function qs(i={},t){let e={...t};switch(i.isActive!==void 0&&(e.isActive=Boolean(i.isActive)),i.indexMode){case"instance":e.indexMode=0;break;case"attribute":e.indexMode=1;break;case void 0:break}switch(typeof i.batchIndex=="number"&&(e.batchIndex=i.batchIndex),i.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=j;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=i.highlightedObjectIndex}switch(i.highlightedBatchIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedBatchIndex=j;break;default:e.isHighlightActive=!0,e.highlightedBatchIndex=i.highlightedBatchIndex}return i.highlightColor&&(e.highlightColor=i.highlightColor),e}var St={props:{},uniforms:{},name:"picking",uniformTypes:Xs,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!1,highlightedBatchIndex:j,highlightedObjectIndex:j,highlightColor:Vs},getUniforms:qs};var Fn=1,Hs=new Int32Array([j,j,0,0]);function Te(i,t="color",e=i==="webgpu"){if(t==="auto")return e?"index":"color";if(t==="index"&&!e)throw new Error(`Picking mode "${t}" requires WebGPU or a WebGL device that supports renderable rg32sint textures.`);return t}function di(i){return i.type==="webgpu"||i.type==="webgl"&&i.isTextureFormatRenderable("rg32sint")}var jn=Te;function Bn(i){return{objectIndex:i[0]===j?null:i[0],batchIndex:i[1]===j?null:i[1]}}function zn(i){let t=i[0]+i[1]*256+i[2]*65536;if(t===0)return{objectIndex:null,batchIndex:null};let e=i[3]>0?i[3]-1:0;return{objectIndex:t-1,batchIndex:e}}var Ae=class{device;props;mode;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Ae.defaultProps,...e};let n=e.mode??e.backend??Ae.defaultProps.mode;this.props.mode=n,this.props.backend=n,this.mode=Te(this.device.type,n,di(this.device))}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.mode==="index"?this.createIndexFramebuffer():this.createColorFramebuffer()),this.framebuffer}clearPickState(){this.setPickingProps({highlightedBatchIndex:null,highlightedObjectIndex:null})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.setPickingProps({isActive:!0}),this.mode==="index"?this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),Hs],clearDepth:1}):this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),n=this.getPickPosition(t),r=await this.readPickInfo(e,n);return r?(this.hasPickInfoChanged(r)&&(this.pickInfo=r,this.props.onObjectPicked(r)),this.setPickingProps({isActive:!1,highlightedBatchIndex:r.batchIndex,highlightedObjectIndex:r.objectIndex}),this.pickInfo):null}getPickPosition(t){let e=this.device.type!=="webgpu",n=this.device.getDefaultCanvasContext().cssToDevicePixels(t,e),r=n.x+Math.floor(n.width/2),s=n.y+Math.floor(n.height/2);return[r,s]}createIndexFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT}),e=this.device.createTexture({format:"rg32sint",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT|Z.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t,e],depthStencilAttachment:"depth24plus"})}createColorFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT|Z.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t],depthStencilAttachment:"depth24plus"})}setPickingProps(t){this.props.shaderInputs?.setProps({picking:t})}async readPickInfo(t,e){return this.mode==="index"?this.readIndexPickInfo(t,e):this.readColorPickInfo(t,e)}async readIndexPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[Fn]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Z.Buffer.COPY_DST|Z.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Bn(new Int32Array(c.buffer,c.byteOffset,2))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:Fn});return r?Bn(new Int32Array(r.buffer,r.byteOffset,2)):null}async readColorPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[0]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Z.Buffer.COPY_DST|Z.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return zn(new Uint8Array(c.buffer,c.byteOffset,4))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:0});return r?zn(new Uint8Array(r.buffer,r.byteOffset,4)):null}hasPickInfoChanged(t){return t.objectIndex!==this.pickInfo.objectIndex||t.batchIndex!==this.pickInfo.batchIndex}},Ut=Ae;Y(Ut,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{},mode:"color",backend:"color"});var Ws=`${we}
248
248
 
249
- const COLOR_PICKING_INVALID_INDEX = ${G};
249
+ const COLOR_PICKING_INVALID_INDEX = ${j};
250
250
  const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
251
251
  const COLOR_PICKING_MAX_BATCH_INDEX = 254;
252
252
 
@@ -315,12 +315,12 @@ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
315
315
 
316
316
  return color;
317
317
  }
318
- `,$s=`${St}
318
+ `,Ys=`${Pt}
319
319
 
320
320
  const int INDEX_PICKING_MODE_INSTANCE = 0;
321
321
  const int INDEX_PICKING_MODE_CUSTOM = 1;
322
322
 
323
- const int COLOR_PICKING_INVALID_INDEX = ${G};
323
+ const int COLOR_PICKING_INVALID_INDEX = ${j};
324
324
 
325
325
  flat out int picking_objectIndex;
326
326
 
@@ -334,9 +334,9 @@ void picking_setObjectIndex(int objectIndex) {
334
334
  break;
335
335
  }
336
336
  }
337
- `,Vs=`${St}
337
+ `,Ks=`${Pt}
338
338
 
339
- const int COLOR_PICKING_INVALID_INDEX = ${G};
339
+ const int COLOR_PICKING_INVALID_INDEX = ${j};
340
340
  const int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
341
341
  const int COLOR_PICKING_MAX_BATCH_INDEX = 254;
342
342
 
@@ -407,11 +407,11 @@ vec4 picking_filterColor(vec4 color) {
407
407
  outColor = picking_filterPickingColor(outColor);
408
408
  return outColor;
409
409
  }
410
- `,$t={...Lt,name:"picking",source:Us,vs:$s,fs:Vs};var Xs=`${Ae}
410
+ `,Gt={...St,name:"picking",source:Ws,vs:Ys,fs:Ks};var Zs=`${we}
411
411
 
412
412
  const INDEX_PICKING_MODE_INSTANCE = 0;
413
413
  const INDEX_PICKING_MODE_CUSTOM = 1;
414
- const INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
414
+ const INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
415
415
 
416
416
  /**
417
417
  * WGSL shaders need to carry the returned object index through their own stage outputs.
@@ -454,12 +454,12 @@ fn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {
454
454
  return vec2<i32>(objectIndex, picking.batchIndex);
455
455
  }
456
456
 
457
- `,qs=`${St}
457
+ `,Qs=`${Pt}
458
458
 
459
459
  const int INDEX_PICKING_MODE_INSTANCE = 0;
460
460
  const int INDEX_PICKING_MODE_CUSTOM = 1;
461
461
 
462
- const int INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
462
+ const int INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
463
463
 
464
464
  flat out int picking_objectIndex;
465
465
 
@@ -477,9 +477,9 @@ void picking_setObjectIndex(int objectIndex) {
477
477
  break;
478
478
  }
479
479
  }
480
- `,Hs=`${St}
480
+ `,Js=`${Pt}
481
481
 
482
- const int INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
482
+ const int INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
483
483
 
484
484
  flat in int picking_objectIndex;
485
485
 
@@ -545,6 +545,6 @@ vec4 picking_filterColor(vec4 color) {
545
545
  outColor = picking_filterPickingColor(outColor);
546
546
  return outColor;
547
547
  }
548
- `,Se={...Lt,name:"picking",source:Xs,vs:qs,fs:Hs};var jn={...Lt,name:"picking",source:Se.source,vs:$t.vs,fs:$t.fs};var Le=class{device;framebuffer=null;shaderInputs;constructor(t,e){this.device=t,this.shaderInputs=e}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.shaderInputs.setProps({picking:{highlightedObjectColor:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getCanvasContext().getDevicePixelSize()),this.shaderInputs.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}updatePickState(t){let e=this.getFramebuffer(),[n,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:n,sourceY:r,sourceWidth:1,sourceHeight:1})].map(c=>c/255);o[0]+o[1]+o[2]>0||(o=null),this.shaderInputs.setProps({picking:{isActive:!1,highlightedObjectColor:o}})}getPickPosition(t){let e=this.device.getCanvasContext().cssToDevicePixels(t),n=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[n,r]}};var Gn=R(rt(),1),Un=Gn.picking;var Ws=z;return tr(Vt);})();
548
+ `,Pe={...St,name:"picking",source:Zs,vs:Qs,fs:Js};var Un={...St,name:"picking",source:Pe.source,vs:Gt.vs,fs:Gt.fs};var Se=class{device;framebuffer=null;shaderInputs;constructor(t,e){this.device=t,this.shaderInputs=e}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.shaderInputs.setProps({picking:{highlightedObjectColor:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getCanvasContext().getDevicePixelSize()),this.shaderInputs.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}updatePickState(t){let e=this.getFramebuffer(),[n,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:n,sourceY:r,sourceWidth:1,sourceHeight:1})].map(c=>c/255);o[0]+o[1]+o[2]>0||(o=null),this.shaderInputs.setProps({picking:{isActive:!1,highlightedObjectColor:o}})}getPickPosition(t){let e=this.device.getCanvasContext().cssToDevicePixels(t),n=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[n,r]}};var Gn=k(nt(),1),$n=Gn.picking;var to=B;return er($t);})();
549
549
  return __exports__;
550
550
  });