@luma.gl/engine 9.2.6 → 9.3.0-alpha.2

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 (71) hide show
  1. package/dist/animation-loop/animation-loop.d.ts +3 -1
  2. package/dist/animation-loop/animation-loop.d.ts.map +1 -1
  3. package/dist/animation-loop/animation-loop.js +10 -4
  4. package/dist/animation-loop/animation-loop.js.map +1 -1
  5. package/dist/compute/computation.d.ts.map +1 -1
  6. package/dist/compute/computation.js +3 -2
  7. package/dist/compute/computation.js.map +1 -1
  8. package/dist/compute/swap.d.ts +2 -0
  9. package/dist/compute/swap.d.ts.map +1 -1
  10. package/dist/compute/swap.js +10 -5
  11. package/dist/compute/swap.js.map +1 -1
  12. package/dist/dist.dev.js +554 -358
  13. package/dist/dist.min.js +59 -50
  14. package/dist/dynamic-texture/dynamic-texture.d.ts +95 -0
  15. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -0
  16. package/dist/dynamic-texture/dynamic-texture.js +356 -0
  17. package/dist/dynamic-texture/dynamic-texture.js.map +1 -0
  18. package/dist/dynamic-texture/texture-data.d.ts +137 -0
  19. package/dist/dynamic-texture/texture-data.d.ts.map +1 -0
  20. package/dist/dynamic-texture/texture-data.js +183 -0
  21. package/dist/dynamic-texture/texture-data.js.map +1 -0
  22. package/dist/factories/pipeline-factory.d.ts.map +1 -1
  23. package/dist/factories/pipeline-factory.js +3 -3
  24. package/dist/factories/pipeline-factory.js.map +1 -1
  25. package/dist/factories/shader-factory.d.ts.map +1 -1
  26. package/dist/factories/shader-factory.js +3 -2
  27. package/dist/factories/shader-factory.js.map +1 -1
  28. package/dist/index.cjs +566 -370
  29. package/dist/index.cjs.map +4 -4
  30. package/dist/index.d.ts +8 -3
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/model/model.d.ts +31 -10
  35. package/dist/model/model.d.ts.map +1 -1
  36. package/dist/model/model.js +34 -14
  37. package/dist/model/model.js.map +1 -1
  38. package/dist/models/billboard-texture-model.d.ts +8 -5
  39. package/dist/models/billboard-texture-model.d.ts.map +1 -1
  40. package/dist/models/billboard-texture-model.js +70 -18
  41. package/dist/models/billboard-texture-model.js.map +1 -1
  42. package/dist/passes/get-fragment-shader.js +15 -11
  43. package/dist/passes/get-fragment-shader.js.map +1 -1
  44. package/dist/passes/shader-pass-renderer.d.ts +5 -5
  45. package/dist/passes/shader-pass-renderer.d.ts.map +1 -1
  46. package/dist/passes/shader-pass-renderer.js +13 -12
  47. package/dist/passes/shader-pass-renderer.js.map +1 -1
  48. package/dist/types.d.ts +7 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +5 -0
  51. package/dist/types.js.map +1 -0
  52. package/package.json +4 -4
  53. package/src/animation-loop/animation-loop.ts +11 -4
  54. package/src/compute/computation.ts +3 -2
  55. package/src/compute/swap.ts +13 -7
  56. package/src/dynamic-texture/dynamic-texture.ts +451 -0
  57. package/src/dynamic-texture/texture-data.ts +301 -0
  58. package/src/factories/pipeline-factory.ts +4 -3
  59. package/src/factories/shader-factory.ts +4 -2
  60. package/src/index.ts +9 -4
  61. package/src/model/model.ts +37 -18
  62. package/src/models/billboard-texture-model.ts +81 -22
  63. package/src/passes/get-fragment-shader.ts +15 -11
  64. package/src/passes/shader-pass-renderer.ts +22 -16
  65. package/src/types.ts +11 -0
  66. package/dist/async-texture/async-texture.d.ts +0 -166
  67. package/dist/async-texture/async-texture.d.ts.map +0 -1
  68. package/dist/async-texture/async-texture.js +0 -386
  69. package/dist/async-texture/async-texture.js.map +0 -1
  70. package/src/async-texture/async-texture.ts +0 -551
  71. /package/src/{async-texture/texture-setters.ts.disabled → dynamic-texture/texture-data.ts.disabled} +0 -0
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 qi=Object.create;var wt=Object.defineProperty;var Wi=Object.getOwnPropertyDescriptor;var Yi=Object.getOwnPropertyNames;var Xi=Object.getPrototypeOf,Hi=Object.prototype.hasOwnProperty;var Ki=(i,t,e)=>t in i?wt(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var De=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Zi=(i,t)=>{for(var e in t)wt(i,e,{get:t[e],enumerable:!0})},Nt=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Yi(t))!Hi.call(i,n)&&n!==e&&wt(i,n,{get:()=>t[n],enumerable:!(s=Wi(t,n))||s.enumerable});return i},Ft=(i,t,e)=>(Nt(i,t,"default"),e&&Nt(e,t,"default")),k=(i,t,e)=>(e=i!=null?qi(Xi(i)):{},Nt(t||!i||!i.__esModule?wt(e,"default",{value:i,enumerable:!0}):e,i)),Qi=i=>Nt(wt({},"__esModule",{value:!0}),i);var z=(i,t,e)=>(Ki(i,typeof t!="symbol"?t+"":t,e),e);var j=De((pn,ze)=>{ze.exports=globalThis.luma});var ht=De((kn,je)=>{je.exports=globalThis.luma});var Et={};Zi(Et,{AnimationLoop:()=>ct,AnimationLoopTemplate:()=>Bt,AsyncTexture:()=>tt,BackgroundTextureModel:()=>ft,BufferTransform:()=>It,ClipSpace:()=>et,Computation:()=>Ct,ConeGeometry:()=>se,CubeGeometry:()=>ne,CylinderGeometry:()=>re,GPUGeometry:()=>pt,Geometry:()=>B,GroupNode:()=>bt,IcoSphereGeometry:()=>oe,KeyFrames:()=>zt,LegacyPickingManager:()=>pe,Model:()=>W,ModelNode:()=>ie,PickingManager:()=>Pt,PipelineFactory:()=>Q,PlaneGeometry:()=>ae,ScenegraphNode:()=>st,ShaderFactory:()=>J,ShaderInputs:()=>H,ShaderPassRenderer:()=>le,SphereGeometry:()=>ce,Swap:()=>Mt,SwapBuffers:()=>he,SwapFramebuffers:()=>vt,TextureTransform:()=>Yt,Timeline:()=>Dt,TruncatedConeGeometry:()=>ot,cancelAnimationFramePolyfill:()=>Ut,colorPicking:()=>$i,indexPicking:()=>Bi,loadImage:()=>Je,loadImageBitmap:()=>Gt,makeAnimationLoop:()=>Ue,makeRandomGenerator:()=>Fi,requestAnimationFramePolyfill:()=>$t,setPathPrefix:()=>Qe});Ft(Et,k(j(),1));var Ji=1,ts=1,Dt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:s=Number.POSITIVE_INFINITY,rate:n=1,repeat:r=1}=t,o=Ji++,a={time:0,delay:e,duration:s,rate:n,repeat:r};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,s]of this.animations)s.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 n of e)this._setChannelTime(n,this.time);let s=this.animations.values();for(let n of s){let{animation:r,channel:o}=n;r.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let s=ts++;return this.animations.set(s,{animation:t,channel:e}),t.setTime(this.getTime(e)),s}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 s=e-t.delay,n=t.duration*t.repeat;s>=n?t.time=t.duration*t.rate:(t.time=Math.max(0,s)%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 s=0;s<e;++s)this.times[s]=t[s][0],this.values[s]=t[s][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,s=this.times.length;for(e=0;e<s-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let n=this.times[this.startIndex],r=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-n)/(r-n)),1)}};var Bt=class{constructor(t){}async onInitialize(t){return null}};var Be=k(j(),1);function $t(i){return typeof window<"u"&&window.requestAnimationFrame?window.requestAnimationFrame(i):setTimeout(i,1e3/60)}function Ut(i){return typeof window<"u"&&window.cancelAnimationFrame?window.cancelAnimationFrame(i):clearTimeout(i)}function At(){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 at=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=At(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(At()-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:s}=t,n=this.stats[e];return n||(t instanceof at?n=t:n=new at(e,s),this.stats[e]=n),n}};var es=0,me=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;cpuTime;gpuTime;frameRate;display;needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;constructor(t){if(this.props={...me.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new ut({id:"animation-loop-stats"}),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.frameRate=this.stats.get("Frame Rate"),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)}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this.needsRedraw=this.needsRedraw||t,this}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;return this._initialized||(this._initialized=!0,await this._initDevice(),this._initialize(),await this.props.onInitialize(this._getAnimationProps())),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}redraw(){return this.device?.isLost||this._error?this:(this._beginFrameTimers(),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()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=$t(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(Ut(this._animationFrameId),this._animationFrameId=null)}_animationFrame(){this._running&&(this.redraw(),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,s=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:s,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:s}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),s!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=s,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 s=this.props.onAddHTML(e);s&&(e.innerHTML=s)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device?.getDefaultCanvasContext().getDevicePixelSize()||[1,1],s=1,n=this.device?.getDefaultCanvasContext().canvas;return n&&n.clientHeight?s=n.clientWidth/n.clientHeight:t>0&&e>0&&(s=t/e),{width:t,height:e,aspect:s}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(){this.frameRate.timeEnd(),this.frameRate.timeStart(),this.cpuTime.timeStart()}_endFrameTimers(){this.cpuTime.timeEnd()}_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}},ct=me;z(ct,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:Be.luma.stats.get(`animation-loop-${es++}`),autoResizeViewport:!1});var $e=k(j(),1);function Ue(i,t){let e=null,s=t?.device||$e.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),n=new ct({...t,device:s,async onInitialize(r){ss(r.animationLoop.device);try{return e=new i(r),await e?.onInitialize(r)}catch(o){return is(r.animationLoop.device,o),null}},onRender:r=>e?.onRender(r),onFinalize:r=>e?.onFinalize(r)});return n.getInfo=()=>this.AnimationLoopTemplateCtor.info,n}function is(i,t){let e=i?.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let s=document.getElementById("animation-loop-error");s?.remove(),s=document.createElement("h1"),s.id="animation-loop-error",s.innerHTML=t.message,s.style.position="absolute",s.style.top="10px",s.style.left="10px",s.style.color="black",s.style.backgroundColor="red",e.parentElement?.appendChild(s)}}function ss(i){let t=document.getElementById("animation-loop-error");t&&t.remove()}var S=k(j(),1),qt=k(ht(),1);var Tt=k(j(),1);var ge={};function C(i="id"){ge[i]=ge[i]||1;let t=ge[i]++;return`${i}-${t}`}var pt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||C("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&Tt.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 Ve(i,t){if(t instanceof pt)return t;let e=ns(i,t),{attributes:s,bufferLayout:n}=rs(i,t);return new pt({topology:t.topology||"triangle-list",bufferLayout:n,vertexCount:t.vertexCount,indices:e,attributes:s})}function ns(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Tt.Buffer.INDEX,data:e})}function rs(i,t){let e=[],s={};for(let[r,o]of Object.entries(t.attributes)){let a=r;switch(r){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"COLOR_0":a="colors";break}if(o){s[a]=i.createBuffer({data:o.value,id:`${r}-buffer`});let{value:c,size:l,normalized:h}=o;e.push({name:a,format:(0,Tt.getVertexFormatFromAttribute)(c,l,h)})}}let n=t._calculateVertexCount(t.attributes,t.indices);return{attributes:s,bufferLayout:e,vertexCount:n}}var V=k(j(),1);var xe=class{static getDefaultPipelineFactory(t){return t._lumaData.defaultPipelineFactory=t._lumaData.defaultPipelineFactory||new xe(t),t._lumaData.defaultPipelineFactory}device;cachingEnabled;destroyPolicy;debug;_hashCounter=0;_hashes={};_renderPipelineCache={};_computePipelineCache={};get[Symbol.toStringTag](){return"PipelineFactory"}toString(){return`PipelineFactory(${this.device.id})`}constructor(t){this.device=t,this.cachingEnabled=t.props._cachePipelines,this.destroyPolicy=t.props._cacheDestroyPolicy,this.debug=t.props.debugFactories}createRenderPipeline(t){if(!this.cachingEnabled)return this.device.createRenderPipeline(t);let e={...V.RenderPipeline.defaultProps,...t},s=this._renderPipelineCache,n=this._hashRenderPipeline(e),r=s[n]?.pipeline;return r?(s[n].useCount++,this.debug&&V.log.log(3,`${this}: ${s[n].pipeline} reused, count=${s[n].useCount}, (id=${t.id})`)()):(r=this.device.createRenderPipeline({...e,id:e.id?`${e.id}-cached`:C("unnamed-cached")}),r.hash=n,s[n]={pipeline:r,useCount:1},this.debug&&V.log.log(3,`${this}: ${r} created, count=${s[n].useCount}`)()),r}createComputePipeline(t){if(!this.cachingEnabled)return this.device.createComputePipeline(t);let e={...V.ComputePipeline.defaultProps,...t},s=this._computePipelineCache,n=this._hashComputePipeline(e),r=s[n]?.pipeline;return r?(s[n].useCount++,this.debug&&V.log.log(3,`${this}: ${s[n].pipeline} reused, count=${s[n].useCount}, (id=${t.id})`)()):(r=this.device.createComputePipeline({...e,id:e.id?`${e.id}-cached`:void 0}),r.hash=n,s[n]={pipeline:r,useCount:1},this.debug&&V.log.log(3,`${this}: ${r} created, count=${s[n].useCount}`)()),r}release(t){if(!this.cachingEnabled){t.destroy();return}let e=this._getCache(t),s=t.hash;e[s].useCount--,e[s].useCount===0?(this._destroyPipeline(t),this.debug&&V.log.log(3,`${this}: ${t} released and destroyed`)()):e[s].useCount<0?(V.log.error(`${this}: ${t} released, useCount < 0, resetting`)(),e[s].useCount=0):this.debug&&V.log.log(3,`${this}: ${t} released, count=${e[s].useCount}`)()}_destroyPipeline(t){let e=this._getCache(t);switch(this.destroyPolicy){case"never":return!1;case"unused":return delete e[t.hash],t.destroy(),!0}}_getCache(t){let e;if(t instanceof V.ComputePipeline&&(e=this._computePipelineCache),t instanceof V.RenderPipeline&&(e=this._renderPipelineCache),!e)throw new Error(`${this}`);if(!e[t.hash])throw new Error(`${this}: ${t} matched incorrect entry`);return e}_hashComputePipeline(t){let{type:e}=this.device,s=this._getHash(t.shader.source);return`${e}/C/${s}`}_hashRenderPipeline(t){let e=t.vs?this._getHash(t.vs.source):0,s=t.fs?this._getHash(t.fs.source):0,n="-",r=this._getHash(JSON.stringify(t.bufferLayout)),{type:o}=this.device;switch(o){case"webgl":return`${o}/R/${e}/${s}V${n}BL${r}`;case"webgpu":default:let a=this._getHash(JSON.stringify(t.parameters));return`${o}/R/${e}/${s}V${n}T${t.topology}P${a}BL${r}`}}_getHash(t){return this._hashes[t]===void 0&&(this._hashes[t]=this._hashCounter++),this._hashes[t]}},Q=xe;z(Q,"defaultProps",{...V.RenderPipeline.defaultProps});var lt=k(j(),1);var ye=class{static getDefaultShaderFactory(t){return t._lumaData.defaultShaderFactory||=new ye(t),t._lumaData.defaultShaderFactory}device;cachingEnabled;destroyPolicy;debug;_cache={};get[Symbol.toStringTag](){return"ShaderFactory"}toString(){return`${this[Symbol.toStringTag]}(${this.device.id})`}constructor(t){this.device=t,this.cachingEnabled=t.props._cacheShaders,this.destroyPolicy=t.props._cacheDestroyPolicy,this.debug=!0}createShader(t){if(!this.cachingEnabled)return this.device.createShader(t);let e=this._hashShader(t),s=this._cache[e];if(s)s.useCount++,this.debug&&lt.log.log(3,`${this}: Reusing shader ${s.shader.id} count=${s.useCount}`)();else{let n=this.device.createShader({...t,id:t.id?`${t.id}-cached`:void 0});this._cache[e]=s={shader:n,useCount:1},this.debug&&lt.log.log(3,`${this}: Created new shader ${n.id}`)()}return s.shader}release(t){if(!this.cachingEnabled){t.destroy();return}let e=this._hashShader(t),s=this._cache[e];if(s)if(s.useCount--,s.useCount===0)this.destroyPolicy==="unused"&&(delete this._cache[e],s.shader.destroy(),this.debug&&lt.log.log(3,`${this}: Releasing shader ${t.id}, destroyed`)());else{if(s.useCount<0)throw new Error(`ShaderFactory: Shader ${t.id} released too many times`);this.debug&&lt.log.log(3,`${this}: Releasing shader ${t.id} count=${s.useCount}`)()}}_hashShader(t){return`${t.stage}:${t.source}`}},J=ye;z(J,"defaultProps",{...lt.Shader.defaultProps});function Ge(i,t){let e={},s="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[s]:"N/A"}};for(let n of i.attributes)if(n){let r=`${n.location} ${n.name}: ${n.type}`;e[`in ${r}`]={[s]:n.stepMode||"vertex"}}for(let n of i.varyings||[]){let r=`${n.location} ${n.name}`;e[`out ${r}`]={[s]:JSON.stringify(n)}}return e}var N=null,be=null;function qe(i,{id:t,minimap:e,opaque:s,top:n="0",left:r="0",rgbaScale:o=1}){N||(N=document.createElement("canvas"),N.id=t,N.title=t,N.style.zIndex="100",N.style.position="absolute",N.style.top=n,N.style.left=r,N.style.border="blue 5px solid",N.style.transform="scaleY(-1)",document.body.appendChild(N),be=N.getContext("2d")),(N.width!==i.width||N.height!==i.height)&&(N.width=i.width/2,N.height=i.height/2,N.style.width="400px",N.style.height="400px");let a=i.device.readPixelsToArrayWebGL(i),c=be?.createImageData(i.width,i.height);if(c){for(let h=0;h<a.length;h+=4)c.data[0+h+0]=a[h+0]*o,c.data[0+h+1]=a[h+1]*o,c.data[0+h+2]=a[h+2]*o,c.data[0+h+3]=s?255:a[h+3]*o;be?.putImageData(c,0,0)}}function jt(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 s=0;s<i.length;s++)if(!jt(i[s],t[s],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let s=Object.keys(i),n=Object.keys(t);if(s.length!==n.length)return!1;for(let r of s)if(!t.hasOwnProperty(r)||!jt(i[r],t[r],e-1))return!1;return!0}return!1}var We=k(j(),1),mt=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 s=[...t];for(let n of e){let r=s.findIndex(o=>o.name===n.name);r<0?s.push(n):s[r]=n}return s}getBufferIndex(t){let e=this.bufferLayouts.findIndex(s=>s.name===t);return e===-1&&We.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ye(i,t){let e=Object.fromEntries(i.attributes.map(n=>[n.name,n.location])),s=t.slice();return s.sort((n,r)=>{let o=n.attributes?n.attributes.map(h=>h.attribute):[n.name],a=r.attributes?r.attributes.map(h=>h.attribute):[r.name],c=Math.min(...o.map(h=>e[h])),l=Math.min(...a.map(h=>e[h]));return c-l}),s}var Vt=k(j(),1),Ze=k(ht(),1);function Xe(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function He(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function St(i){return Xe(i)||He(i)}function os(i){return St(i)||typeof i=="number"||typeof i=="boolean"}function Ke(i){let t={bindings:{},uniforms:{}};return Object.keys(i).forEach(e=>{let s=i[e];os(s)?t.uniforms[e]=s:t.bindings[e]=s}),t}var H=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let s=(0,Ze.getShaderModuleDependencies)(Object.values(t).filter(n=>n.dependencies));for(let n of s)t[n.name]=n;Vt.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[n,r]of Object.entries(t))this._addModule(r),r.name&&n!==r.name&&!this.options.disableWarnings&&Vt.log.warn(`Module name: ${n} vs ${r.name}`)()}destroy(){}setProps(t){for(let e of Object.keys(t)){let s=e,n=t[s]||{},r=this.modules[s];if(!r){this.options.disableWarnings||Vt.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[s],a=this.moduleBindings[s],c=r.getUniforms?.(n,o)||n,{uniforms:l,bindings:h}=Ke(c);this.moduleUniforms[s]={...o,...l},this.moduleBindings[s]={...a,...h}}}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,s]of Object.entries(this.moduleUniforms))for(let[n,r]of Object.entries(s))t[`${e}.${n}`]={type:this.modules[e].uniformTypes?.[n],value:String(r)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=t.defaultUniforms||{},this.moduleBindings[e]={}}};var rt=k(j(),1);var Me="";function Qe(i){Me=i}async function Gt(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:Me+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function Je(i,t){return await new Promise((e,s)=>{try{let n=new Image;n.onload=()=>e(n),n.onerror=()=>s(new Error(`Could not load image ${i}.`)),n.crossOrigin=t?.crossOrigin||"anonymous",n.src=i.startsWith("http")?i:Me+i}catch(n){s(n)}})}var as=["+X","-X","+Y","-Y","+Z","-Z"];var cs=["+X","-X","+Y","-Y","+Z","-Z"],ve=class{device;id;props;texture;sampler;view;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get[Symbol.toStringTag](){return"AsyncTexture"}toString(){return`AsyncTexture:"${this.id}"(${this.isReady?"ready":"loading"})`}constructor(t,e){this.device=t;let s=C("async-texture");this.props={...ve.defaultProps,id:s,...e},this.id=this.props.id,e={...e},typeof e?.data=="string"&&e.dimension==="2d"&&(e.data=Gt(e.data)),e.mipmaps&&(e.mipLevels="auto"),this.ready=new Promise((n,r)=>{this.resolveReady=()=>{this.isReady=!0,n()},this.rejectReady=r}),this.initAsync(e)}async initAsync(t){let e=t.data,s=await ti(e).then(void 0,this.rejectReady);if(this.destroyed)return;let n=this.props.width&&this.props.height?{width:this.props.width,height:this.props.height}:this.getTextureDataSize(s);if(!n)throw new Error("Texture size could not be determined");let r={...n,...t,data:void 0,mipLevels:1},o=this.device.getMipLevelCount(r.width,r.height);if(r.mipLevels=this.props.mipLevels==="auto"?o:Math.min(o,this.props.mipLevels),this.texture=this.device.createTexture(r),this.sampler=this.texture.sampler,this.view=this.texture.view,t.data)switch(this.props.dimension){case"1d":this._setTexture1DData(this.texture,s);break;case"2d":this._setTexture2DData(s);break;case"3d":this._setTexture3DData(this.texture,s);break;case"2d-array":this._setTextureArrayData(this.texture,s);break;case"cube":this._setTextureCubeData(this.texture,s);break;case"cube-array":this._setTextureCubeArrayData(this.texture,s);break}this.props.mipmaps&&this.generateMipmaps(),rt.log.info(1,`${this} loaded`),this.resolveReady()}destroy(){this.texture&&(this.texture.destroy(),this.texture=null),this.destroyed=!0}generateMipmaps(){this.texture.generateMipmapsWebGL()}setSampler(t={}){this.texture.setSampler(t instanceof rt.Sampler?t:this.device.createSampler(t))}resize(t){if(!this.isReady)throw new Error("Cannot resize texture before it is ready");if(t.width===this.texture.width&&t.height===this.texture.height)return!1;if(this.texture){let e=this.texture;this.texture=e.clone(t),e.destroy()}return!0}isTextureLevelData(t){let e=t?.data;return ArrayBuffer.isView(e)}getTextureDataSize(t){if(!t||ArrayBuffer.isView(t))return null;if(Array.isArray(t))return this.getTextureDataSize(t[0]);if(this.device.isExternalImage(t))return this.device.getExternalImageSize(t);if(t&&typeof t=="object"&&t.constructor===Object){let s=Object.values(t)[0];return{width:s.width,height:s.height}}throw new Error("texture size deduction failed")}getCubeFaceDepth(t){switch(t){case"+X":return 0;case"-X":return 1;case"+Y":return 2;case"-Y":return 3;case"+Z":return 4;case"-Z":return 5;default:throw new Error(t)}}setTextureData(t){}_setTexture1DData(t,e){throw new Error("setTexture1DData not supported in WebGL.")}_setTexture2DData(t,e=0){if(!this.texture)throw new Error("Texture not initialized");let s=this._normalizeTextureData(t);s.length>1&&this.props.mipmaps!==!1&&rt.log.warn(`Texture ${this.id} mipmap and multiple LODs.`)();for(let n=0;n<s.length;n++){let r=s[n];this.device.isExternalImage(r)?this.texture.copyExternalImage({image:r,depth:e,mipLevel:n,flipY:!0}):this.texture.copyImageData({data:r.data,mipLevel:n})}}_setTexture3DData(t,e){if(this.texture?.props.dimension!=="3d")throw new Error(this.id);for(let s=0;s<e.length;s++)this._setTexture2DData(e[s],s)}_setTextureCubeData(t,e){if(this.texture?.props.dimension!=="cube")throw new Error(this.id);for(let[s,n]of Object.entries(e)){let r=cs.indexOf(s);this._setTexture2DData(n,r)}}_setTextureArrayData(t,e){if(this.texture?.props.dimension!=="2d-array")throw new Error(this.id);for(let s=0;s<e.length;s++)this._setTexture2DData(e[s],s)}_setTextureCubeArrayData(t,e){throw new Error("setTextureCubeArrayData not supported in WebGL2.")}_setTextureCubeFaceData(t,e,s,n=0){Array.isArray(e)&&e.length>1&&this.props.mipmaps!==!1&&rt.log.warn(`${this.id} has mipmap and multiple LODs.`)();let r=as.indexOf(s);this._setTexture2DData(e,r)}_normalizeTextureData(t){let e=this.texture,s;return ArrayBuffer.isView(t)?s=[{data:t,width:e.width,height:e.height}]:Array.isArray(t)?s=t:s=[t],s}},tt=ve;z(tt,"defaultProps",{...rt.Texture.defaultProps,data:null,mipmaps:!1});async function ti(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map(ti));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t)),s=Object.keys(t),n={};for(let r=0;r<s.length;r++)n[s[r]]=e[r];return n}return i}var dt=2,hs=1e4,_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;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;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||C("model"),this.device=t,Object.assign(this.userData,e.userData);let s=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),n=e.shaderInputs||new H(s,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(n);let r=ds(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:o});this.source=c,this._getModuleUniforms=l,this.props.shaderLayout||=(0,qt.getShaderLayoutFromWGSL)(this.source)}else{let{vs:c,fs:l,getUniforms:h}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:r,...this.props,modules:o});this.vs=c,this.fs=l,this._getModuleUniforms=h}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||Q.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||J.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),Object.seal(this)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&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}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return S.log.info(dt,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let s;try{t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let n=this._getBindings();this.pipeline.setBindings(n,{disableWarnings:this.props.disableWarnings});let{indexBuffer:r}=this.vertexArray,o=r?r.byteLength/(r.indexType==="uint32"?4:2):void 0;s=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:o,transformFeedback:this.transformFeedback||void 0,parameters:this.parameters,topology:this.topology})}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),s?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",s}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&Ve(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let s=new mt(this.bufferLayout);this.bufferLayout=s.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 mt(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){jt(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 S.UniformStore(this.shaderInputs.modules);for(let[e,s]of Object.entries(this.shaderInputs.modules))if(ls(s)){let n=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=n}this.setNeedsRedraw("shaderInputs")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(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 s=e?.disableWarnings??this.props.disableWarnings;t.indices&&S.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ye(this.pipeline.shaderLayout,this.bufferLayout);let n=new mt(this.bufferLayout);for(let[r,o]of Object.entries(t)){let a=n.getBufferLayout(r);if(!a){s||S.log.warn(`Model(${this.id}): Missing layout for buffer "${r}".`)();continue}let c=n.getAttributeNamesForBuffer(a),l=!1;for(let h of c){let d=this._attributeInfos[h];if(d){let f=this.device.type==="webgpu"?n.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(f,o),l=!0}}!l&&!s&&S.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${r}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[s,n]of Object.entries(t)){let r=this._attributeInfos[s];r?this.vertexArray.setConstantWebGL(r.location,n):(e?.disableWarnings??this.props.disableWarnings)||S.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${s}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof tt&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,s]of Object.entries(this.bindings))s instanceof tt?s.isReady&&(t[e]=s.texture):t[e]=s;return t}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof S.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof S.Buffer||e instanceof S.Texture?t=Math.max(t,e.updateTimestamp):e instanceof tt?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof S.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_setGeometryAttributes(t){let e={...t.attributes};for(let[s]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(n=>n.name===s)&&s!=="positions"&&delete e[s];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&&(S.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let s=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),n=null;this.source?n=s:this.fs&&(n=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,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindings:this._getBindings(),vs:s,fs:n}),this._attributeInfos=(0,S.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=S.log.level>3?0:hs;S.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,S.log.group(dt,`>>> DRAWING MODEL ${this.id}`,{collapsed:S.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Ge(this.pipeline.shaderLayout,this.id);S.log.table(dt,t)();let e=this.shaderInputs.getDebugTable();S.log.table(dt,e)();let s=this._getAttributeDebugTable();S.log.table(dt,this._attributeInfos)(),S.log.table(dt,s)(),S.log.groupEnd(dt)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let s=t.props.framebuffer;s&&qe(s,{id:s.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,s]of Object.entries(this._attributeInfos)){let n=this.vertexArray.attributes[s.location];t[s.location]={name:e,type:s.shaderType,values:n?this._getBufferOrConstantValues(n,s.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,s=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:s.toString()}}return t}_getBufferOrConstantValues(t,e){let s=(0,S.getTypedArrayConstructor)(e);return(t instanceof S.Buffer?new s(t.debugData):t).toString()}},W=_e;z(W,"defaultProps",{...S.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:qt.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function ls(i){return Boolean(i.uniformTypes&&!fs(i.uniformTypes))}function ds(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}function fs(i){for(let t in i)return!1;return!0}var ei=k(j(),1),ii=k(ht(),1);var Wt=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=Wt.defaultProps){if(!Wt.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,ii.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 ei.Buffer)return e.readAsync();let{buffer:s,byteOffset:n=0,byteLength:r=s.byteLength}=e;return s.readAsync(n,r)}},It=Wt;z(It,"defaultProps",{...W.defaultProps,outputs:void 0,feedbackBuffers:void 0});var si=k(ht(),1);var us="transform_output",Yt=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||C("texture-transform-model"),fs:e.fs||(0,si.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:us}),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],s=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(s),s.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:s,targetTexture:n}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,s),Object.assign(t.sourceBuffers,e),n){t.targetTexture=n;let{width:r,height:o}=n;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:r,height:o,colorAttachments:[n]}),t.framebuffer.resize({width:r,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let s in e)e[s].sampler=this.sampler}};var B=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:s=null,vertexCount:n=null}=t;this.id=t.id||C("geometry"),this.topology=t.topology,s&&(this.indices=ArrayBuffer.isView(s)?{value:s,size:1}:s),this.attributes={};for(let[r,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(r)}: must be typed array or object with value as typed array`);if((r==="POSITION"||r==="positions")&&!a.size&&(a.size=3),r==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[r]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=n||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 s=1/0;for(let n of Object.values(t)){let{value:r,size:o,constant:a}=n;!a&&r&&o!==void 0&&o>=1&&(s=Math.min(s,r.length/o))}return s}};var ps=`struct VertexInputs {
7
+ "use strict";var __exports__=(()=>{var ii=Object.create;var At=Object.defineProperty;var ri=Object.getOwnPropertyDescriptor;var ni=Object.getOwnPropertyNames;var oi=Object.getPrototypeOf,ai=Object.prototype.hasOwnProperty;var ci=(s,t,e)=>t in s?At(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e;var Be=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports),hi=(s,t)=>{for(var e in t)At(s,e,{get:t[e],enumerable:!0})},Bt=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ni(t))!ai.call(s,r)&&r!==e&&At(s,r,{get:()=>t[r],enumerable:!(i=ri(t,r))||i.enumerable});return s},$t=(s,t,e)=>(Bt(s,t,"default"),e&&Bt(e,t,"default")),L=(s,t,e)=>(e=s!=null?ii(oi(s)):{},Bt(t||!s||!s.__esModule?At(e,"default",{value:s,enumerable:!0}):e,s)),li=s=>Bt(At({},"__esModule",{value:!0}),s);var z=(s,t,e)=>(ci(s,typeof t!="symbol"?t+"":t,e),e);var B=Be((Cr,$e)=>{$e.exports=globalThis.luma});var ht=Be((Xr,Ge)=>{Ge.exports=globalThis.luma});var Lt={};hi(Lt,{AnimationLoop:()=>ct,AnimationLoopTemplate:()=>Vt,AsyncTexture:()=>Tr,BackgroundTextureModel:()=>gt,BufferTransform:()=>Rt,ClipSpace:()=>st,Computation:()=>Ot,ConeGeometry:()=>ne,CubeGeometry:()=>oe,CylinderGeometry:()=>ae,DynamicTexture:()=>q,GPUGeometry:()=>ut,Geometry:()=>$,GroupNode:()=>vt,IcoSphereGeometry:()=>ce,KeyFrames:()=>jt,LegacyPickingManager:()=>me,Model:()=>Y,ModelNode:()=>re,PickingManager:()=>kt,PipelineFactory:()=>tt,PlaneGeometry:()=>he,ScenegraphNode:()=>rt,ShaderFactory:()=>et,ShaderInputs:()=>K,ShaderPassRenderer:()=>fe,SphereGeometry:()=>le,Swap:()=>Mt,SwapBuffers:()=>de,SwapFramebuffers:()=>_t,TextureTransform:()=>Ht,Timeline:()=>Ut,TruncatedConeGeometry:()=>ot,cancelAnimationFramePolyfill:()=>qt,colorPicking:()=>Qs,indexPicking:()=>Zs,loadImage:()=>Ys,loadImageBitmap:()=>Ws,makeAnimationLoop:()=>Ve,makeRandomGenerator:()=>Gs,requestAnimationFramePolyfill:()=>Gt,setPathPrefix:()=>qs});$t(Lt,L(B(),1));var di=1,fi=1,Ut=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:i=Number.POSITIVE_INFINITY,rate:r=1,repeat:n=1}=t,o=di++,a={time:0,delay:e,duration:i,rate:r,repeat:n};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,i]of this.animations)i.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 i=this.animations.values();for(let r of i){let{animation:n,channel:o}=r;n.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let i=fi++;return this.animations.set(i,{animation:t,channel:e}),t.setTime(this.getTime(e)),i}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 i=e-t.delay,r=t.duration*t.repeat;i>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,i)%t.duration,t.time*=t.rate)}};var jt=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 i=0;i<e;++i)this.times[i]=t[i][0],this.values[i]=t[i][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,i=this.times.length;for(e=0;e<i-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],n=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(n-r)),1)}};var Vt=class{constructor(t){}async onInitialize(t){return null}};var Ue=L(B(),1);function Gt(s){return typeof window<"u"&&window.requestAnimationFrame?window.requestAnimationFrame(s):setTimeout(s,1e3/60)}function qt(s){return typeof window<"u"&&window.cancelAnimationFrame?window.cancelAnimationFrame(s):clearTimeout(s)}function St(){let s;if(typeof window<"u"&&window.performance)s=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();s=t[0]*1e3+t[1]/1e6}else s=Date.now();return s}var at=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=St(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(St()-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 ft=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:i}=t,r=this.stats[e];return r||(t instanceof at?r=t:r=new at(e,i),this.stats[e]=r),r}};var ui=0,ge=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;constructor(t){if(this.props={...ge.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new ft({id:"animation-loop-stats"}),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.frameRate=this.stats.get("Frame Rate"),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)}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;return this._initialized||(this._initialized=!0,await this._initDevice(),this._initialize(),await this.props.onInitialize(this._getAnimationProps())),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}redraw(){return this.device?.isLost||this._error?this:(this._beginFrameTimers(),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()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=Gt(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(qt(this._animationFrameId),this._animationFrameId=null)}_animationFrame(){this._running&&(this.redraw(),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,i=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:i,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:i}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),i!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=i,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 i=this.props.onAddHTML(e);i&&(e.innerHTML=i)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device?.getDefaultCanvasContext().getDevicePixelSize()||[1,1],i=1,r=this.device?.getDefaultCanvasContext().canvas;return r&&r.clientHeight?i=r.clientWidth/r.clientHeight:t>0&&e>0&&(i=t/e),{width:t,height:e,aspect:i}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(){this.frameRate.timeEnd(),this.frameRate.timeStart(),this.cpuTime.timeStart()}_endFrameTimers(){this.cpuTime.timeEnd()}_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}},ct=ge;z(ct,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:Ue.luma.stats.get(`animation-loop-${ui++}`),autoResizeViewport:!1});var je=L(B(),1);function Ve(s,t){let e=null,i=t?.device||je.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new ct({...t,device:i,async onInitialize(n){mi(n.animationLoop.device);try{return e=new s(n),await e?.onInitialize(n)}catch(o){return pi(n.animationLoop.device,o),null}},onRender:n=>e?.onRender(n),onFinalize:n=>e?.onFinalize(n)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function pi(s,t){let e=s?.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let i=document.getElementById("animation-loop-error");i?.remove(),i=document.createElement("h1"),i.id="animation-loop-error",i.innerHTML=t.message,i.style.position="absolute",i.style.top="10px",i.style.left="10px",i.style.color="black",i.style.backgroundColor="red",e.parentElement?.appendChild(i)}}function mi(s){let t=document.getElementById("animation-loop-error");t&&t.remove()}var T=L(B(),1),cs=L(ht(),1);var Tt=L(B(),1);var xe={};function C(s="id"){xe[s]=xe[s]||1;let t=xe[s]++;return`${s}-${t}`}var ut=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||C("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&Tt.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 qe(s,t){if(t instanceof ut)return t;let e=gi(s,t),{attributes:i,bufferLayout:r}=xi(s,t);return new ut({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:i})}function gi(s,t){if(!t.indices)return;let e=t.indices.value;return s.createBuffer({usage:Tt.Buffer.INDEX,data:e})}function xi(s,t){let e=[],i={};for(let[n,o]of Object.entries(t.attributes)){let a=n;switch(n){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"COLOR_0":a="colors";break}if(o){i[a]=s.createBuffer({data:o.value,id:`${n}-buffer`});let{value:c,size:h,normalized:l}=o;e.push({name:a,format:(0,Tt.getVertexFormatFromAttribute)(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:i,bufferLayout:e,vertexCount:r}}var V=L(B(),1);var ye=class{static getDefaultPipelineFactory(t){let e=t.getModuleData("@luma.gl/engine");return e.defaultPipelineFactory||=new ye(t),e.defaultPipelineFactory}device;cachingEnabled;destroyPolicy;debug;_hashCounter=0;_hashes={};_renderPipelineCache={};_computePipelineCache={};get[Symbol.toStringTag](){return"PipelineFactory"}toString(){return`PipelineFactory(${this.device.id})`}constructor(t){this.device=t,this.cachingEnabled=t.props._cachePipelines,this.destroyPolicy=t.props._cacheDestroyPolicy,this.debug=t.props.debugFactories}createRenderPipeline(t){if(!this.cachingEnabled)return this.device.createRenderPipeline(t);let e={...V.RenderPipeline.defaultProps,...t},i=this._renderPipelineCache,r=this._hashRenderPipeline(e),n=i[r]?.pipeline;return n?(i[r].useCount++,this.debug&&V.log.log(3,`${this}: ${i[r].pipeline} reused, count=${i[r].useCount}, (id=${t.id})`)()):(n=this.device.createRenderPipeline({...e,id:e.id?`${e.id}-cached`:C("unnamed-cached")}),n.hash=r,i[r]={pipeline:n,useCount:1},this.debug&&V.log.log(3,`${this}: ${n} created, count=${i[r].useCount}`)()),n}createComputePipeline(t){if(!this.cachingEnabled)return this.device.createComputePipeline(t);let e={...V.ComputePipeline.defaultProps,...t},i=this._computePipelineCache,r=this._hashComputePipeline(e),n=i[r]?.pipeline;return n?(i[r].useCount++,this.debug&&V.log.log(3,`${this}: ${i[r].pipeline} reused, count=${i[r].useCount}, (id=${t.id})`)()):(n=this.device.createComputePipeline({...e,id:e.id?`${e.id}-cached`:void 0}),n.hash=r,i[r]={pipeline:n,useCount:1},this.debug&&V.log.log(3,`${this}: ${n} created, count=${i[r].useCount}`)()),n}release(t){if(!this.cachingEnabled){t.destroy();return}let e=this._getCache(t),i=t.hash;e[i].useCount--,e[i].useCount===0?(this._destroyPipeline(t),this.debug&&V.log.log(3,`${this}: ${t} released and destroyed`)()):e[i].useCount<0?(V.log.error(`${this}: ${t} released, useCount < 0, resetting`)(),e[i].useCount=0):this.debug&&V.log.log(3,`${this}: ${t} released, count=${e[i].useCount}`)()}_destroyPipeline(t){let e=this._getCache(t);switch(this.destroyPolicy){case"never":return!1;case"unused":return delete e[t.hash],t.destroy(),!0}}_getCache(t){let e;if(t instanceof V.ComputePipeline&&(e=this._computePipelineCache),t instanceof V.RenderPipeline&&(e=this._renderPipelineCache),!e)throw new Error(`${this}`);if(!e[t.hash])throw new Error(`${this}: ${t} matched incorrect entry`);return e}_hashComputePipeline(t){let{type:e}=this.device,i=this._getHash(t.shader.source);return`${e}/C/${i}`}_hashRenderPipeline(t){let e=t.vs?this._getHash(t.vs.source):0,i=t.fs?this._getHash(t.fs.source):0,r="-",n=this._getHash(JSON.stringify(t.bufferLayout)),{type:o}=this.device;switch(o){case"webgl":return`${o}/R/${e}/${i}V${r}BL${n}`;case"webgpu":default:let a=this._getHash(JSON.stringify(t.parameters));return`${o}/R/${e}/${i}V${r}T${t.topology}P${a}BL${n}`}}_getHash(t){return this._hashes[t]===void 0&&(this._hashes[t]=this._hashCounter++),this._hashes[t]}},tt=ye;z(tt,"defaultProps",{...V.RenderPipeline.defaultProps});var lt=L(B(),1);var be=class{static getDefaultShaderFactory(t){let e=t.getModuleData("@luma.gl/engine");return e.defaultShaderFactory||=new be(t),e.defaultShaderFactory}device;cachingEnabled;destroyPolicy;debug;_cache={};get[Symbol.toStringTag](){return"ShaderFactory"}toString(){return`${this[Symbol.toStringTag]}(${this.device.id})`}constructor(t){this.device=t,this.cachingEnabled=t.props._cacheShaders,this.destroyPolicy=t.props._cacheDestroyPolicy,this.debug=!0}createShader(t){if(!this.cachingEnabled)return this.device.createShader(t);let e=this._hashShader(t),i=this._cache[e];if(i)i.useCount++,this.debug&&lt.log.log(3,`${this}: Reusing shader ${i.shader.id} count=${i.useCount}`)();else{let r=this.device.createShader({...t,id:t.id?`${t.id}-cached`:void 0});this._cache[e]=i={shader:r,useCount:1},this.debug&&lt.log.log(3,`${this}: Created new shader ${r.id}`)()}return i.shader}release(t){if(!this.cachingEnabled){t.destroy();return}let e=this._hashShader(t),i=this._cache[e];if(i)if(i.useCount--,i.useCount===0)this.destroyPolicy==="unused"&&(delete this._cache[e],i.shader.destroy(),this.debug&&lt.log.log(3,`${this}: Releasing shader ${t.id}, destroyed`)());else{if(i.useCount<0)throw new Error(`ShaderFactory: Shader ${t.id} released too many times`);this.debug&&lt.log.log(3,`${this}: Releasing shader ${t.id} count=${i.useCount}`)()}}_hashShader(t){return`${t.stage}:${t.source}`}},et=be;z(et,"defaultProps",{...lt.Shader.defaultProps});function We(s,t){let e={},i="Values";if(s.attributes.length===0&&!s.varyings?.length)return{"No attributes or varyings":{[i]:"N/A"}};for(let r of s.attributes)if(r){let n=`${r.location} ${r.name}: ${r.type}`;e[`in ${n}`]={[i]:r.stepMode||"vertex"}}for(let r of s.varyings||[]){let n=`${r.location} ${r.name}`;e[`out ${n}`]={[i]:JSON.stringify(r)}}return e}var N=null,ve=null;function Ye(s,{id:t,minimap:e,opaque:i,top:r="0",left:n="0",rgbaScale:o=1}){N||(N=document.createElement("canvas"),N.id=t,N.title=t,N.style.zIndex="100",N.style.position="absolute",N.style.top=r,N.style.left=n,N.style.border="blue 5px solid",N.style.transform="scaleY(-1)",document.body.appendChild(N),ve=N.getContext("2d")),(N.width!==s.width||N.height!==s.height)&&(N.width=s.width/2,N.height=s.height/2,N.style.width="400px",N.style.height="400px");let a=s.device.readPixelsToArrayWebGL(s),c=ve?.createImageData(s.width,s.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]=i?255:a[l+3]*o;ve?.putImageData(c,0,0)}}function Wt(s,t,e){if(s===t)return!0;if(!e||!s||!t)return!1;if(Array.isArray(s)){if(!Array.isArray(t)||s.length!==t.length)return!1;for(let i=0;i<s.length;i++)if(!Wt(s[i],t[i],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof s=="object"&&typeof t=="object"){let i=Object.keys(s),r=Object.keys(t);if(i.length!==r.length)return!1;for(let n of i)if(!t.hasOwnProperty(n)||!Wt(s[n],t[n],e-1))return!1;return!0}return!1}var Xe=L(B(),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 i=[...t];for(let r of e){let n=i.findIndex(o=>o.name===r.name);n<0?i.push(r):i[n]=r}return i}getBufferIndex(t){let e=this.bufferLayouts.findIndex(i=>i.name===t);return e===-1&&Xe.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function He(s,t){let e=Object.fromEntries(s.attributes.map(r=>[r.name,r.location])),i=t.slice();return i.sort((r,n)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=n.attributes?n.attributes.map(l=>l.attribute):[n.name],c=Math.min(...o.map(l=>e[l])),h=Math.min(...a.map(l=>e[l]));return c-h}),i}var Yt=L(B(),1),Je=L(ht(),1);function Ke(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function Ze(s){return Array.isArray(s)?s.length===0||typeof s[0]=="number":!1}function It(s){return Ke(s)||Ze(s)}function yi(s){return It(s)||typeof s=="number"||typeof s=="boolean"}function Qe(s){let t={bindings:{},uniforms:{}};return Object.keys(s).forEach(e=>{let i=s[e];yi(i)?t.uniforms[e]=i:t.bindings[e]=i}),t}var K=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let i=(0,Je.getShaderModuleDependencies)(Object.values(t).filter(r=>r.dependencies));for(let r of i)t[r.name]=r;Yt.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,n]of Object.entries(t))this._addModule(n),n.name&&r!==n.name&&!this.options.disableWarnings&&Yt.log.warn(`Module name: ${r} vs ${n.name}`)()}destroy(){}setProps(t){for(let e of Object.keys(t)){let i=e,r=t[i]||{},n=this.modules[i];if(!n){this.options.disableWarnings||Yt.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[i],a=this.moduleBindings[i],c=n.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Qe(c);this.moduleUniforms[i]={...o,...h},this.moduleBindings[i]={...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,i]of Object.entries(this.moduleUniforms))for(let[r,n]of Object.entries(i))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(n)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=t.defaultUniforms||{},this.moduleBindings[e]={}}};var Z=L(B(),1);var Et=L(B(),1);var Me={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Ct(s){return s?Array.isArray(s)?s[0]??null:s:null}function ts(s){let{dimension:t,data:e}=s;if(!e)return null;switch(t){case"1d":{let i=Ct(e);if(!i)return null;let{width:r}=Pt(i);return{width:r,height:1}}case"2d":{let i=Ct(e);return i?Pt(i):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let i=Ct(e[0]);return i?Pt(i):null}case"cube":{let i=Object.keys(e)[0]??null;if(!i)return null;let r=e[i],n=Ct(r);return n?Pt(n):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let i=e[0],r=Object.keys(i)[0]??null;if(!r)return null;let n=Ct(i[r]);return n?Pt(n):null}default:return null}}function Pt(s){if((0,Et.isExternalImage)(s))return(0,Et.getExternalImageSize)(s);if(typeof s=="object"&&"width"in s&&"height"in s)return{width:s.width,height:s.height};throw new Error("Unsupported mip-level data")}function bi(s){return typeof s=="object"&&s!==null&&"data"in s&&"width"in s&&"height"in s}function es(s){let t=Me[s];if(t===void 0)throw new Error(`Invalid cube face: ${s}`);return t}function vi(s,t){return 6*s+es(t)}function ss(s){throw new Error("setTexture1DData not supported in WebGL.")}function Mi(s){return Array.isArray(s)?s:[s]}function mt(s,t){let e=Mi(t),i=s,r=[];for(let n=0;n<e.length;n++){let o=e[n];if((0,Et.isExternalImage)(o))r.push({type:"external-image",image:o,z:i,mipLevel:n});else if(bi(o))r.push({type:"texture-data",data:o,z:i,mipLevel:n});else throw new Error("Unsupported 2D mip-level payload")}return r}function is(s){let t=[];for(let e=0;e<s.length;e++)t.push(...mt(e,s[e]));return t}function rs(s){let t=[];for(let e=0;e<s.length;e++)t.push(...mt(e,s[e]));return t}function ns(s){let t=[];for(let[e,i]of Object.entries(s)){let r=es(e);t.push(...mt(r,i))}return t}function os(s){let t=[];return s.forEach((e,i)=>{for(let[r,n]of Object.entries(e)){let o=vi(i,r);mt(o,n)}}),t}var _e=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 i=C("dynamic-texture"),r=e;this.props={..._e.defaultProps,id:i,...e,data:null},this.id=this.props.id,this.ready=new Promise((n,o)=>{this.resolveReady=n,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let r=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let h=ts(e);return h||{width:this.props.width||1,height:this.props.height||1}})();if(!r||r.width<=0||r.height<=0)throw new Error(`${this} size could not be determined or was zero`);let n={...this.props,...r,mipLevels:1,data:void 0},o=this.device.getMipLevelCount(n.width,n.height),a=this.props.mipLevels==="auto"?o:Math.max(1,Math.min(o,this.props.mipLevels??1)),c={...n,mipLevels:a};if(this._texture=this.device.createTexture(c),this._sampler=this.texture.sampler,this._view=this.texture.view,e.data)switch(e.dimension){case"1d":this.setTexture1DData(e.data);break;case"2d":this.setTexture2DData(e.data);break;case"3d":this.setTexture3DData(e.data);break;case"2d-array":this.setTextureArrayData(e.data);break;case"cube":this.setTextureCubeData(e.data);break;case"cube-array":this.setTextureCubeArrayData(e.data);break;default:throw new Error(`Unhandled dimension ${e.dimension}`)}this.props.mipmaps&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),Z.log.info(0,`${this} created`)()}catch(e){let i=e instanceof Error?e:new Error(String(e));throw this.rejectReady(i),i}}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():Z.log.warn("Mipmap generation not yet implemented on WebGPU: your texture data will not be correctly initialized")}setSampler(t={}){this._checkReady();let e=t instanceof Z.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}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(),Z.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=Me[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=ss(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let i=mt(e,t);this._setTextureSubresources(i)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=is(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=rs(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=ns(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=os(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:i,mipLevel:r}=e;switch(e.type){case"external-image":let{image:n,flipY:o}=e;this.texture.copyExternalImage({image:n,z:i,mipLevel:r,flipY:o});break;case"texture-data":let{data:a}=e;this.texture.copyImageData({data:a.data,z:i,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await as(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&Z.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||Z.log.warn(`${this} Cannot perform this operation before ready`)}},q=_e;z(q,"defaultProps",{...Z.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});async function as(s){if(s=await s,Array.isArray(s))return await Promise.all(s.map(as));if(s&&typeof s=="object"&&s.constructor===Object){let t=s,e=await Promise.all(Object.values(t)),i=Object.keys(t),r={};for(let n=0;n<i.length;n++)r[i[n]]=e[n];return r}return s}var dt=2,_i=1e4,we=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;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...we.defaultProps,...e},e=this.props,this.id=e.id||C("model"),this.device=t,Object.assign(this.userData,e.userData);let i=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new K(i,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let n=Ai(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:n,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this.props.shaderLayout||=t.getShaderLayout(this.source)}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:n,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l}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||tt.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||et.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.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}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return T.log.info(dt,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let i;try{t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let r=this._getBindings();this.pipeline.setBindings(r,{disableWarnings:this.props.disableWarnings});let{indexBuffer:n}=this.vertexArray,o=n?n.byteLength/(n.indexType==="uint32"?4:2):void 0;i=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:o,transformFeedback:this.transformFeedback||void 0,parameters:this.parameters,topology:this.topology})}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),i?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",i}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&qe(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let i=new pt(this.bufferLayout);this.bufferLayout=i.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){Wt(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 T.UniformStore(this.shaderInputs.modules);for(let[e,i]of Object.entries(this.shaderInputs.modules))if(wi(i)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(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 i=e?.disableWarnings??this.props.disableWarnings;t.indices&&T.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=He(this.pipeline.shaderLayout,this.bufferLayout);let r=new pt(this.bufferLayout);for(let[n,o]of Object.entries(t)){let a=r.getBufferLayout(n);if(!a){i||T.log.warn(`Model(${this.id}): Missing layout for buffer "${n}".`)();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&&!i&&T.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${n}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[i,r]of Object.entries(t)){let n=this._attributeInfos[i];n?this.vertexArray.setConstantWebGL(n.location,r):(e?.disableWarnings??this.props.disableWarnings)||T.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${i}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof q&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,i]of Object.entries(this.bindings))i instanceof q?i.isReady&&(t[e]=i.texture):t[e]=i;return t}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof T.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof T.Buffer||e instanceof T.Texture?t=Math.max(t,e.updateTimestamp):e instanceof q?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof T.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_setGeometryAttributes(t){let e={...t.attributes};for(let[i]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===i)&&i!=="positions"&&delete e[i];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&&(T.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let i=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=i: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,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindings:this._getBindings(),vs:i,fs:r}),this._attributeInfos=(0,T.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=T.log.level>3?0:_i;T.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,T.log.group(dt,`>>> DRAWING MODEL ${this.id}`,{collapsed:T.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=We(this.pipeline.shaderLayout,this.id);T.log.table(dt,t)();let e=this.shaderInputs.getDebugTable();T.log.table(dt,e)();let i=this._getAttributeDebugTable();T.log.table(dt,this._attributeInfos)(),T.log.table(dt,i)(),T.log.groupEnd(dt)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let i=t.props.framebuffer;i&&Ye(i,{id:i.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,i]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[i.location];t[i.location]={name:e,type:i.shaderType,values:r?this._getBufferOrConstantValues(r,i.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,i=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:i.toString()}}return t}_getBufferOrConstantValues(t,e){let i=(0,T.getTypedArrayConstructor)(e);return(t instanceof T.Buffer?new i(t.debugData):t).toString()}},Y=we;z(Y,"defaultProps",{...T.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:cs.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function wi(s){return Boolean(s.uniformTypes&&!Si(s.uniformTypes))}function Ai(s){return{type:s.type,shaderLanguage:s.info.shadingLanguage,shaderLanguageVersion:s.info.shadingLanguageVersion,gpu:s.info.gpu,features:s.features}}function Si(s){for(let t in s)return!1;return!0}var hs=L(B(),1),ls=L(ht(),1);var Xt=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=Xt.defaultProps){if(!Xt.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new Y(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,ls.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 hs.Buffer)return e.readAsync();let{buffer:i,byteOffset:r=0,byteLength:n=i.byteLength}=e;return i.readAsync(r,n)}},Rt=Xt;z(Rt,"defaultProps",{...Y.defaultProps,outputs:void 0,feedbackBuffers:void 0});var ds=L(ht(),1);var Ti="transform_output",Ht=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 Y(this.device,{id:e.id||C("texture-transform-model"),fs:e.fs||(0,ds.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:Ti}),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],i=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(i),i.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:i,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,i),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:n,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:n,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:n,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let i in e)e[i].sampler=this.sampler}};var $=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:i=null,vertexCount:r=null}=t;this.id=t.id||C("geometry"),this.topology=t.topology,i&&(this.indices=ArrayBuffer.isView(i)?{value:i,size:1}:i),this.attributes={};for(let[n,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(n)}: must be typed array or object with value as typed array`);if((n==="POSITION"||n==="positions")&&!a.size&&(a.size=3),n==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[n]=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 i=1/0;for(let r of Object.values(t)){let{value:n,size:o,constant:a}=r;!a&&n&&o!==void 0&&o>=1&&(i=Math.min(i,n.length/o))}return i}};var Ii=`struct VertexInputs {
8
8
  @location(0) clipSpacePosition: vec2<f32>,
9
9
  @location(1) texCoord: vec2<f32>,
10
10
  @location(2) coordinate: vec2<f32>
@@ -26,7 +26,7 @@ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
26
26
  outputs.uv = inputs.texCoord;
27
27
  return outputs;
28
28
  }
29
- `,ms=`#version 300 es
29
+ `,Ci=`#version 300 es
30
30
  in vec2 clipSpacePositions;
31
31
  in vec2 texCoords;
32
32
  in vec2 coordinates;
@@ -41,58 +41,69 @@ void main(void) {
41
41
  coordinate = coordinates;
42
42
  uv = texCoords;
43
43
  }
44
- `,ni=[-1,-1,1,-1,-1,1,1,1],et=class extends W{constructor(t,e){let s=ni.map(n=>n===-1?0:n);e.source&&(e={...e,source:`${ps}
45
- ${e.source}`}),super(t,{id:e.id||C("clip-space"),...e,vs:ms,vertexCount:4,geometry:new B({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(ni)},texCoords:{size:2,value:new Float32Array(s)},coordinates:{size:2,value:new Float32Array(s)}}})})}};var gs=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
44
+ `,fs=[-1,-1,1,-1,-1,1,1,1],st=class extends Y{constructor(t,e){let i=fs.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${Ii}
45
+ ${e.source}`}),super(t,{id:e.id||C("clip-space"),...e,vs:Ci,vertexCount:4,geometry:new $({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(fs)},texCoords:{size:2,value:new Float32Array(i)},coordinates:{size:2,value:new Float32Array(i)}}})})}};var Pi={name:"background",uniformTypes:{scale:"vec2<f32>"}},Ei=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
46
46
  @group(0) @binding(1) var backgroundTextureSampler: sampler;
47
+ struct backgroundUniforms {
48
+ scale: vec2<f32>,
49
+ };
50
+ @group(0) @binding(2) var<uniform> background: backgroundUniforms;
47
51
 
48
52
  fn billboardTexture_getTextureUV(coordinates: vec2<f32>) -> vec2<f32> {
49
- let iTexSize: vec2<u32> = textureDimensions(backgroundTexture, 0);
50
- let texSize: vec2<f32> = vec2<f32>(f32(iTexSize.x), f32(iTexSize.y));
51
- var position: vec2<f32> = coordinates.xy / texSize;
52
- return position;
53
- }
53
+ let scale: vec2<f32> = background.scale;
54
+ var position: vec2<f32> = (coordinates - vec2<f32>(0.5, 0.5)) / scale + vec2<f32>(0.5, 0.5);
55
+ return position;
56
+ }
54
57
 
55
58
  @fragment
56
59
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
57
- let position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);
58
- return textureSample(backgroundTexture, backgroundTextureSampler, position);
60
+ let position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);
61
+ return textureSample(backgroundTexture, backgroundTextureSampler, position);
59
62
  }
60
- `,xs=`#version 300 es
63
+ `,Ri=`#version 300 es
61
64
  precision highp float;
62
65
 
63
66
  uniform sampler2D backgroundTexture;
67
+
68
+ uniform backgroundUniforms {
69
+ vec2 scale;
70
+ } background;
71
+
72
+ in vec2 coordinate;
64
73
  out vec4 fragColor;
65
74
 
66
- vec2 billboardTexture_getTextureUV() {
67
- ivec2 iTexSize = textureSize(backgroundTexture, 0);
68
- vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
69
- vec2 position = gl_FragCoord.xy / texSize;
75
+ vec2 billboardTexture_getTextureUV(vec2 coord) {
76
+ vec2 position = (coord - 0.5) / background.scale + 0.5;
70
77
  return position;
71
78
  }
72
79
 
73
80
  void main(void) {
74
- vec2 position = billboardTexture_getTextureUV();
81
+ vec2 position = billboardTexture_getTextureUV(coordinate);
75
82
  fragColor = texture(backgroundTexture, position);
76
83
  }
77
- `,ft=class extends et{constructor(t,e){if(super(t,{id:e.id||"background-texture-model",source:gs,fs:xs,parameters:{depthWriteEnabled:!1,...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one",blendColorDstFactor:"one-minus-src",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one-minus-src-alpha"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setTexture(e.backgroundTexture)}setTexture(t){this.setBindings({backgroundTexture:t})}predraw(){this.shaderInputs.setProps({}),super.predraw()}};var Lr=1/Math.PI*180,kr=1/180*Math.PI,ys={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...ys}};var D=globalThis.mathgl.config;function ri(i,{precision:t=D.precision}={}){return i=bs(i),`${parseFloat(i.toPrecision(t))}`}function gt(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function we(i,t,e){let s=D.EPSILON;e&&(D.EPSILON=e);try{if(i===t)return!0;if(gt(i)&&gt(t)){if(i.length!==t.length)return!1;for(let n=0;n<i.length;++n)if(!we(i[n],t[n]))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)<=D.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{D.EPSILON=s}}function bs(i){return Math.round(i/D.EPSILON)*D.EPSILON}var xt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let s=0;s<this.ELEMENTS;++s)this[s]=t[s+e];return this.check()}toArray(t=[],e=0){for(let s=0;s<this.ELEMENTS;++s)t[e+s]=this[s];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:gt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(D)}formatString(t){let e="";for(let s=0;s<this.ELEMENTS;++s)e+=(s>0?", ":"")+ri(this[s],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(!we(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,s){if(s===void 0)return this.lerp(this,t,e);for(let n=0;n<this.ELEMENTS;++n){let r=t[n],o=typeof e=="number"?e:e[n];this[n]=r+s*(o-r)}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 s=0;s<this.ELEMENTS;++s)this[s]=Math.min(Math.max(this[s],t[s]),e[s]);return this.check()}add(...t){for(let e of t)for(let s=0;s<this.ELEMENTS;++s)this[s]+=e[s];return this.check()}subtract(...t){for(let e of t)for(let s=0;s<this.ELEMENTS;++s)this[s]-=e[s];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(D.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 s=0;s<this.ELEMENTS;++s)this[s]=Math.min(Math.max(this[s],t),e);return this.check()}get elements(){return this}};function Ms(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 $(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function Xt(i,t,e=""){if(D.debug&&!Ms(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function Ae(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var Ht=class extends xt{get x(){return this[0]}set x(t){this[0]=$(t)}get y(){return this[1]}set y(t){this[1]=$(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 s=0;s<this.ELEMENTS;++s){let n=this[s]-t[s];e+=n*n}return $(e)}dot(t){let e=0;for(let s=0;s<this.ELEMENTS;++s)e+=this[s]*t[s];return $(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 s=0;s<this.ELEMENTS;++s)this[s]*=e[s];return this.check()}divide(...t){for(let e of t)for(let s=0;s<this.ELEMENTS;++s)this[s]/=e[s];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return Ae(t>=0&&t<this.ELEMENTS,"index is out of range"),$(this[t])}setComponent(t,e){return Ae(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 it=typeof Float32Array<"u"?Float32Array:Array;var qr=Math.PI/180;function vs(){let i=new it(2);return it!=Float32Array&&(i[0]=0,i[1]=0),i}function ci(i,t,e){let s=t[0],n=t[1];return i[0]=e[0]*s+e[4]*n+e[12],i[1]=e[1]*s+e[5]*n+e[13],i}var Wr=function(){let i=vs();return function(t,e,s,n,r,o){let a,c;for(e||(e=2),s||(s=0),n?c=Math.min(n*e+s,t.length):c=t.length,a=s;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],r(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function hi(i,t,e){let s=t[0],n=t[1],r=e[3]*s+e[7]*n||1;return i[0]=(e[0]*s+e[4]*n)/r,i[1]=(e[1]*s+e[5]*n)/r,i}function Kt(i,t,e){let s=t[0],n=t[1],r=t[2],o=e[3]*s+e[7]*n+e[11]*r||1;return i[0]=(e[0]*s+e[4]*n+e[8]*r)/o,i[1]=(e[1]*s+e[5]*n+e[9]*r)/o,i[2]=(e[2]*s+e[6]*n+e[10]*r)/o,i}function li(i,t,e){let s=t[0],n=t[1];return i[0]=e[0]*s+e[2]*n,i[1]=e[1]*s+e[3]*n,i[2]=t[2],i}function _s(){let i=new it(3);return it!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function ws(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function di(i,t,e){let s=t[0],n=t[1],r=t[2],o=e[0],a=e[1],c=e[2];return i[0]=n*c-r*a,i[1]=r*o-s*c,i[2]=s*a-n*o,i}function Zt(i,t,e){let s=t[0],n=t[1],r=t[2],o=e[3]*s+e[7]*n+e[11]*r+e[15];return o=o||1,i[0]=(e[0]*s+e[4]*n+e[8]*r+e[12])/o,i[1]=(e[1]*s+e[5]*n+e[9]*r+e[13])/o,i[2]=(e[2]*s+e[6]*n+e[10]*r+e[14])/o,i}function fi(i,t,e){let s=t[0],n=t[1],r=t[2];return i[0]=s*e[0]+n*e[3]+r*e[6],i[1]=s*e[1]+n*e[4]+r*e[7],i[2]=s*e[2]+n*e[5]+r*e[8],i}function ui(i,t,e){let s=e[0],n=e[1],r=e[2],o=e[3],a=t[0],c=t[1],l=t[2],h=n*l-r*c,d=r*a-s*l,f=s*c-n*a,m=n*f-r*d,b=r*h-s*f,u=s*d-n*h,x=o*2;return h*=x,d*=x,f*=x,m*=2,b*=2,u*=2,i[0]=a+h+m,i[1]=c+d+b,i[2]=l+f+u,i}function pi(i,t,e,s){let n=[],r=[];return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],r[0]=n[0],r[1]=n[1]*Math.cos(s)-n[2]*Math.sin(s),r[2]=n[1]*Math.sin(s)+n[2]*Math.cos(s),i[0]=r[0]+e[0],i[1]=r[1]+e[1],i[2]=r[2]+e[2],i}function mi(i,t,e,s){let n=[],r=[];return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],r[0]=n[2]*Math.sin(s)+n[0]*Math.cos(s),r[1]=n[1],r[2]=n[2]*Math.cos(s)-n[0]*Math.sin(s),i[0]=r[0]+e[0],i[1]=r[1]+e[1],i[2]=r[2]+e[2],i}function gi(i,t,e,s){let n=[],r=[];return n[0]=t[0]-e[0],n[1]=t[1]-e[1],n[2]=t[2]-e[2],r[0]=n[0]*Math.cos(s)-n[1]*Math.sin(s),r[1]=n[0]*Math.sin(s)+n[1]*Math.cos(s),r[2]=n[2],i[0]=r[0]+e[0],i[1]=r[1]+e[1],i[2]=r[2]+e[2],i}function xi(i,t){let e=i[0],s=i[1],n=i[2],r=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+s*s+n*n)*(r*r+o*o+a*a)),l=c&&ws(i,t)/c;return Math.acos(Math.min(Math.max(l,-1),1))}var Hr=function(){let i=_s();return function(t,e,s,n,r,o){let a,c;for(e||(e=3),s||(s=0),n?c=Math.min(n*e+s,t.length):c=t.length,a=s;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],r(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var Se=[0,0,0],Qt,G=class extends Ht{static get ZERO(){return Qt||(Qt=new G(0,0,0),Object.freeze(Qt)),Qt}constructor(t=0,e=0,s=0){super(-0,-0,-0),arguments.length===1&&gt(t)?this.copy(t):(D.debug&&($(t),$(e),$(s)),this[0]=t,this[1]=e,this[2]=s)}set(t,e,s){return this[0]=t,this[1]=e,this[2]=s,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return D.debug&&($(t.x),$(t.y),$(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]=$(t)}angle(t){return xi(this,t)}cross(t){return di(this,this,t),this.check()}rotateX({radians:t,origin:e=Se}){return pi(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Se}){return mi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Se}){return gi(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return Zt(this,this,t),this.check()}transformAsVector(t){return Kt(this,this,t),this.check()}transformByMatrix3(t){return fi(this,this,t),this.check()}transformByMatrix2(t){return li(this,this,t),this.check()}transformByQuaternion(t){return ui(this,this,t),this.check()}};var Jt=class extends xt{toString(){let t="[";if(D.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let s=0;s<this.RANK;++s)t+=` ${this[s*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,s){return this[e*this.RANK+t]=$(s),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let s=t*this.RANK;for(let n=0;n<this.RANK;++n)e[n]=this[s+n];return e}setColumn(t,e){let s=t*this.RANK;for(let n=0;n<this.RANK;++n)this[s+n]=e[n];return this}};function As(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 yi(i,t){if(i===t){let e=t[1],s=t[2],n=t[3],r=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]=s,i[9]=r,i[11]=t[14],i[12]=n,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 bi(i,t){let e=t[0],s=t[1],n=t[2],r=t[3],o=t[4],a=t[5],c=t[6],l=t[7],h=t[8],d=t[9],f=t[10],m=t[11],b=t[12],u=t[13],x=t[14],M=t[15],_=e*a-s*o,p=e*c-n*o,g=e*l-r*o,y=s*c-n*a,v=s*l-r*a,I=n*l-r*c,O=h*u-d*b,P=h*x-f*b,R=h*M-m*b,w=d*x-f*u,T=d*M-m*u,E=f*M-m*x,A=_*E-p*T+g*w+y*R-v*P+I*O;return A?(A=1/A,i[0]=(a*E-c*T+l*w)*A,i[1]=(n*T-s*E-r*w)*A,i[2]=(u*I-x*v+M*y)*A,i[3]=(f*v-d*I-m*y)*A,i[4]=(c*R-o*E-l*P)*A,i[5]=(e*E-n*R+r*P)*A,i[6]=(x*g-b*I-M*p)*A,i[7]=(h*I-f*g+m*p)*A,i[8]=(o*T-a*R+l*O)*A,i[9]=(s*R-e*T-r*O)*A,i[10]=(b*v-u*g+M*_)*A,i[11]=(d*g-h*v-m*_)*A,i[12]=(a*P-o*w-c*O)*A,i[13]=(e*w-s*P+n*O)*A,i[14]=(u*p-b*y-x*_)*A,i[15]=(h*y-d*p+f*_)*A,i):null}function Mi(i){let t=i[0],e=i[1],s=i[2],n=i[3],r=i[4],o=i[5],a=i[6],c=i[7],l=i[8],h=i[9],d=i[10],f=i[11],m=i[12],b=i[13],u=i[14],x=i[15],M=t*o-e*r,_=t*a-s*r,p=e*a-s*o,g=l*b-h*m,y=l*u-d*m,v=h*u-d*b,I=t*v-e*y+s*g,O=r*v-o*y+a*g,P=l*p-h*_+d*M,R=m*p-b*_+u*M;return c*I-n*O+x*P-f*R}function Ie(i,t,e){let s=t[0],n=t[1],r=t[2],o=t[3],a=t[4],c=t[5],l=t[6],h=t[7],d=t[8],f=t[9],m=t[10],b=t[11],u=t[12],x=t[13],M=t[14],_=t[15],p=e[0],g=e[1],y=e[2],v=e[3];return i[0]=p*s+g*a+y*d+v*u,i[1]=p*n+g*c+y*f+v*x,i[2]=p*r+g*l+y*m+v*M,i[3]=p*o+g*h+y*b+v*_,p=e[4],g=e[5],y=e[6],v=e[7],i[4]=p*s+g*a+y*d+v*u,i[5]=p*n+g*c+y*f+v*x,i[6]=p*r+g*l+y*m+v*M,i[7]=p*o+g*h+y*b+v*_,p=e[8],g=e[9],y=e[10],v=e[11],i[8]=p*s+g*a+y*d+v*u,i[9]=p*n+g*c+y*f+v*x,i[10]=p*r+g*l+y*m+v*M,i[11]=p*o+g*h+y*b+v*_,p=e[12],g=e[13],y=e[14],v=e[15],i[12]=p*s+g*a+y*d+v*u,i[13]=p*n+g*c+y*f+v*x,i[14]=p*r+g*l+y*m+v*M,i[15]=p*o+g*h+y*b+v*_,i}function vi(i,t,e){let s=e[0],n=e[1],r=e[2],o,a,c,l,h,d,f,m,b,u,x,M;return t===i?(i[12]=t[0]*s+t[4]*n+t[8]*r+t[12],i[13]=t[1]*s+t[5]*n+t[9]*r+t[13],i[14]=t[2]*s+t[6]*n+t[10]*r+t[14],i[15]=t[3]*s+t[7]*n+t[11]*r+t[15]):(o=t[0],a=t[1],c=t[2],l=t[3],h=t[4],d=t[5],f=t[6],m=t[7],b=t[8],u=t[9],x=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=l,i[4]=h,i[5]=d,i[6]=f,i[7]=m,i[8]=b,i[9]=u,i[10]=x,i[11]=M,i[12]=o*s+h*n+b*r+t[12],i[13]=a*s+d*n+u*r+t[13],i[14]=c*s+f*n+x*r+t[14],i[15]=l*s+m*n+M*r+t[15]),i}function _i(i,t,e){let s=e[0],n=e[1],r=e[2];return i[0]=t[0]*s,i[1]=t[1]*s,i[2]=t[2]*s,i[3]=t[3]*s,i[4]=t[4]*n,i[5]=t[5]*n,i[6]=t[6]*n,i[7]=t[7]*n,i[8]=t[8]*r,i[9]=t[9]*r,i[10]=t[10]*r,i[11]=t[11]*r,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function wi(i,t,e,s){let n=s[0],r=s[1],o=s[2],a=Math.sqrt(n*n+r*r+o*o),c,l,h,d,f,m,b,u,x,M,_,p,g,y,v,I,O,P,R,w,T,E,A,F;return a<1e-6?null:(a=1/a,n*=a,r*=a,o*=a,l=Math.sin(e),c=Math.cos(e),h=1-c,d=t[0],f=t[1],m=t[2],b=t[3],u=t[4],x=t[5],M=t[6],_=t[7],p=t[8],g=t[9],y=t[10],v=t[11],I=n*n*h+c,O=r*n*h+o*l,P=o*n*h-r*l,R=n*r*h-o*l,w=r*r*h+c,T=o*r*h+n*l,E=n*o*h+r*l,A=r*o*h-n*l,F=o*o*h+c,i[0]=d*I+u*O+p*P,i[1]=f*I+x*O+g*P,i[2]=m*I+M*O+y*P,i[3]=b*I+_*O+v*P,i[4]=d*R+u*w+p*T,i[5]=f*R+x*w+g*T,i[6]=m*R+M*w+y*T,i[7]=b*R+_*w+v*T,i[8]=d*E+u*A+p*F,i[9]=f*E+x*A+g*F,i[10]=m*E+M*A+y*F,i[11]=b*E+_*A+v*F,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function Ai(i,t,e){let s=Math.sin(e),n=Math.cos(e),r=t[4],o=t[5],a=t[6],c=t[7],l=t[8],h=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]=r*n+l*s,i[5]=o*n+h*s,i[6]=a*n+d*s,i[7]=c*n+f*s,i[8]=l*n-r*s,i[9]=h*n-o*s,i[10]=d*n-a*s,i[11]=f*n-c*s,i}function Ti(i,t,e){let s=Math.sin(e),n=Math.cos(e),r=t[0],o=t[1],a=t[2],c=t[3],l=t[8],h=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]=r*n-l*s,i[1]=o*n-h*s,i[2]=a*n-d*s,i[3]=c*n-f*s,i[8]=r*s+l*n,i[9]=o*s+h*n,i[10]=a*s+d*n,i[11]=c*s+f*n,i}function Si(i,t,e){let s=Math.sin(e),n=Math.cos(e),r=t[0],o=t[1],a=t[2],c=t[3],l=t[4],h=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]=r*n+l*s,i[1]=o*n+h*s,i[2]=a*n+d*s,i[3]=c*n+f*s,i[4]=l*n-r*s,i[5]=h*n-o*s,i[6]=d*n-a*s,i[7]=f*n-c*s,i}function Ii(i,t){let e=t[0],s=t[1],n=t[2],r=t[3],o=e+e,a=s+s,c=n+n,l=e*o,h=s*o,d=s*a,f=n*o,m=n*a,b=n*c,u=r*o,x=r*a,M=r*c;return i[0]=1-d-b,i[1]=h+M,i[2]=f-x,i[3]=0,i[4]=h-M,i[5]=1-l-b,i[6]=m+u,i[7]=0,i[8]=f+x,i[9]=m-u,i[10]=1-l-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function Ci(i,t,e,s,n,r,o){let a=1/(e-t),c=1/(n-s),l=1/(r-o);return i[0]=r*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=r*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(n+s)*c,i[10]=(o+r)*l,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*r*2*l,i[15]=0,i}function Ts(i,t,e,s,n){let r=1/Math.tan(t/2);if(i[0]=r/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=r,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,n!=null&&n!==1/0){let o=1/(s-n);i[10]=(n+s)*o,i[14]=2*n*s*o}else i[10]=-1,i[14]=-2*s;return i}var Pi=Ts;function Ss(i,t,e,s,n,r,o){let a=1/(t-e),c=1/(s-n),l=1/(r-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*l,i[11]=0,i[12]=(t+e)*a,i[13]=(n+s)*c,i[14]=(o+r)*l,i[15]=1,i}var Ei=Ss;function Oi(i,t,e,s){let n,r,o,a,c,l,h,d,f,m,b=t[0],u=t[1],x=t[2],M=s[0],_=s[1],p=s[2],g=e[0],y=e[1],v=e[2];return Math.abs(b-g)<1e-6&&Math.abs(u-y)<1e-6&&Math.abs(x-v)<1e-6?As(i):(d=b-g,f=u-y,m=x-v,n=1/Math.sqrt(d*d+f*f+m*m),d*=n,f*=n,m*=n,r=_*m-p*f,o=p*d-M*m,a=M*f-_*d,n=Math.sqrt(r*r+o*o+a*a),n?(n=1/n,r*=n,o*=n,a*=n):(r=0,o=0,a=0),c=f*a-m*o,l=m*r-d*a,h=d*o-f*r,n=Math.sqrt(c*c+l*l+h*h),n?(n=1/n,c*=n,l*=n,h*=n):(c=0,l=0,h=0),i[0]=r,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=l,i[6]=f,i[7]=0,i[8]=a,i[9]=h,i[10]=m,i[11]=0,i[12]=-(r*b+o*u+a*x),i[13]=-(c*b+l*u+h*x),i[14]=-(d*b+f*u+m*x),i[15]=1,i)}function Is(){let i=new it(4);return it!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function Ri(i,t,e){let s=t[0],n=t[1],r=t[2],o=t[3];return i[0]=e[0]*s+e[4]*n+e[8]*r+e[12]*o,i[1]=e[1]*s+e[5]*n+e[9]*r+e[13]*o,i[2]=e[2]*s+e[6]*n+e[10]*r+e[14]*o,i[3]=e[3]*s+e[7]*n+e[11]*r+e[15]*o,i}var co=function(){let i=Is();return function(t,e,s,n,r,o){let a,c;for(e||(e=4),s||(s=0),n?c=Math.min(n*e+s,t.length):c=t.length,a=s;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],r(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 Ee;(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"})(Ee||(Ee={}));var Cs=45*Math.PI/180,Ps=1,Ce=.1,Pe=500,Es=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),X=class extends Jt{static get IDENTITY(){return Rs()}static get ZERO(){return Os()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Ee}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,s,n,r,o,a,c,l,h,d,f,m,b,u,x){return this[0]=t,this[1]=e,this[2]=s,this[3]=n,this[4]=r,this[5]=o,this[6]=a,this[7]=c,this[8]=l,this[9]=h,this[10]=d,this[11]=f,this[12]=m,this[13]=b,this[14]=u,this[15]=x,this.check()}setRowMajor(t,e,s,n,r,o,a,c,l,h,d,f,m,b,u,x){return this[0]=t,this[1]=r,this[2]=l,this[3]=m,this[4]=e,this[5]=o,this[6]=h,this[7]=b,this[8]=s,this[9]=a,this[10]=d,this[11]=u,this[12]=n,this[13]=c,this[14]=f,this[15]=x,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(Es)}fromObject(t){return this.check()}fromQuaternion(t){return Ii(this,t),this.check()}frustum(t){let{left:e,right:s,bottom:n,top:r,near:o=Ce,far:a=Pe}=t;return a===1/0?Ls(this,e,s,n,r,o):Ci(this,e,s,n,r,o,a),this.check()}lookAt(t){let{eye:e,center:s=[0,0,0],up:n=[0,1,0]}=t;return Oi(this,e,s,n),this.check()}ortho(t){let{left:e,right:s,bottom:n,top:r,near:o=Ce,far:a=Pe}=t;return Ei(this,e,s,n,r,o,a),this.check()}orthographic(t){let{fovy:e=Cs,aspect:s=Ps,focalDistance:n=1,near:r=Ce,far:o=Pe}=t;Li(e);let a=e/2,c=n*Math.tan(a),l=c*s;return this.ortho({left:-l,right:l,bottom:-c,top:c,near:r,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:s=1,near:n=.1,far:r=500}=t;return Li(e),Pi(this,e,s,n,r),this.check()}determinant(){return Mi(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 s=this.getScale(e),n=1/s[0],r=1/s[1],o=1/s[2];return t[0]=this[0]*n,t[1]=this[1]*r,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*n,t[5]=this[5]*r,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*n,t[9]=this[9]*r,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 s=this.getScale(e),n=1/s[0],r=1/s[1],o=1/s[2];return t[0]=this[0]*n,t[1]=this[1]*r,t[2]=this[2]*o,t[3]=this[4]*n,t[4]=this[5]*r,t[5]=this[6]*o,t[6]=this[8]*n,t[7]=this[9]*r,t[8]=this[10]*o,t}transpose(){return yi(this,this),this.check()}invert(){return bi(this,this),this.check()}multiplyLeft(t){return Ie(this,t,this),this.check()}multiplyRight(t){return Ie(this,this,t),this.check()}rotateX(t){return Ai(this,this,t),this.check()}rotateY(t){return Ti(this,this,t),this.check()}rotateZ(t){return Si(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return wi(this,this,t,e),this.check()}scale(t){return _i(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return vi(this,this,t),this.check()}transform(t,e){return t.length===4?(e=Ri(e||[-0,-0,-0,-0],t,this),Xt(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:s}=t,n;switch(s){case 2:n=ci(e||[-0,-0],t,this);break;case 3:n=Zt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Xt(n,t.length),n}transformAsVector(t,e){let s;switch(t.length){case 2:s=hi(e||[-0,-0],t,this);break;case 3:s=Kt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Xt(s,t.length),s}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,s){return this.identity().translate([t,e,s])}},te,ee;function Os(){return te||(te=new X([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(te)),te}function Rs(){return ee||(ee=new X,Object.freeze(ee)),ee}function Li(i){if(i>Math.PI*2)throw Error("expected radians")}function Ls(i,t,e,s,n,r){let o=2*r/(e-t),a=2*r/(n-s),c=(e+t)/(e-t),l=(n+s)/(n-s),h=-1,d=-1,f=-2*r;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]=l,i[10]=h,i[11]=d,i[12]=0,i[13]=0,i[14]=f,i[15]=0,i}var st=class{id;matrix=new X;display=!0;position=new G;rotation=new G;scale=new G(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||C(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 this.position=t,this}setRotation(t){return this.rotation=t,this}setScale(t){return this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:s,scale:n,update:r=!0}=t;return e&&this.setPosition(e),s&&this.setRotation(s),n&&this.setScale(n),r&&this.updateMatrix(),this}updateMatrix(){let t=this.position,e=this.rotation,s=this.scale;return this.matrix.identity(),this.matrix.translate(t),this.matrix.rotateXYZ(e),this.matrix.scale(s),this}update(t={}){let{position:e,rotation:s,scale:n}=t;return e&&this.setPosition(e),s&&this.setRotation(s),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let s=new X(t).multiplyRight(e),n=s.invert(),r=n.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:s,worldInverseMatrix:n,worldInverseTransposeMatrix:r}}_setScenegraphNodeProps(t){"position"in t&&this.setPosition(t.position),"rotation"in t&&this.setRotation(t.rotation),"scale"in t&&this.setScale(t.scale),"matrix"in t&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var ki=k(j(),1);var bt=class extends st{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;ki.log.assert(e.every(s=>s instanceof st),"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:s})=>{let n=e.getBounds();if(!n)return;let[r,o]=n,a=new G(r).add(o).divide([2,2,2]);s.transformAsPoint(a,a);let c=new G(o).subtract(r).divide([2,2,2]);s.transformAsVector(c,c);for(let l=0;l<8;l++){let h=new G(l&1?-1:1,l&2?-1:1,l&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],h[d]),t[1][d]=Math.max(t[1][d],h[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,s=e.indexOf(t);return s>-1&&e.splice(s,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new X}={}){let s=new X(e).multiplyRight(this.matrix);for(let n of this.children)n instanceof bt?n.traverse(t,{worldMatrix:s}):t(n,{worldMatrix:s})}};var ie=class extends st{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 ks={x:[2,0,1],y:[0,1,2],z:[1,2,0]},ot=class extends B{constructor(t={}){let{id:e=C("truncated-code-geometry")}=t,{indices:s,attributes:n}=Ns(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{POSITION:{size:3,value:n.POSITION},NORMAL:{size:3,value:n.NORMAL},TEXCOORD_0:{size:2,value:n.TEXCOORD_0},...t.attributes}})}};function Ns(i={}){let{bottomRadius:t=0,topRadius:e=0,height:s=1,nradial:n=10,nvertical:r=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,l=(a?2:0)+(c?2:0),h=(n+1)*(r+1+l),d=Math.atan2(t-e,s),f=Math.sin,m=Math.cos,b=Math.PI,u=m(d),x=f(d),M=a?-2:0,_=r+(c?2:0),p=n+1,g=new Uint16Array(n*(r+l)*6),y=ks[o],v=new Float32Array(h*3),I=new Float32Array(h*3),O=new Float32Array(h*2),P=0,R=0;for(let w=M;w<=_;w++){let T=w/r,E=s*T,A;w<0?(E=0,T=1,A=t):w>r?(E=s,T=1,A=e):A=t+(e-t)*(w/r),(w===-2||w===r+2)&&(A=0,T=0),E-=s/2;for(let F=0;F<p;F++){let Z=f(F*b*2/n),Y=m(F*b*2/n);v[P+y[0]]=Z*A,v[P+y[1]]=E,v[P+y[2]]=Y*A,I[P+y[0]]=w<0||w>r?0:Z*u,I[P+y[1]]=w<0?-1:w>r?1:x,I[P+y[2]]=w<0||w>r?0:Y*u,O[R+0]=F/n,O[R+1]=T,R+=2,P+=3}}for(let w=0;w<r+l;w++)for(let T=0;T<n;T++){let E=(w*n+T)*6;g[E+0]=p*(w+0)+0+T,g[E+1]=p*(w+0)+1+T,g[E+2]=p*(w+1)+1+T,g[E+3]=p*(w+0)+0+T,g[E+4]=p*(w+1)+1+T,g[E+5]=p*(w+1)+0+T}return{indices:g,attributes:{POSITION:v,NORMAL:I,TEXCOORD_0:O}}}var se=class extends ot{constructor(t={}){let{id:e=C("cone-geometry"),radius:s=1,cap:n=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(n),bottomCap:Boolean(n),bottomRadius:s})}};var ne=class extends B{constructor(t={}){let{id:e=C("cube-geometry"),indices:s=!0}=t;super(s?{...t,id:e,topology:"triangle-list",indices:{size:1,value:Fs},attributes:{...Vs,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Gs,...t.attributes}})}},Fs=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]),Ds=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]),zs=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]),Bs=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]),$s=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]),Us=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]),js=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]),Vs={POSITION:{size:3,value:Ds},NORMAL:{size:3,value:zs},TEXCOORD_0:{size:2,value:Bs}},Gs={POSITION:{size:3,value:$s},TEXCOORD_0:{size:2,value:Us},COLOR_0:{size:3,value:js}};var re=class extends ot{constructor(t={}){let{id:e=C("cylinder-geometry"),radius:s=1}=t;super({...t,id:e,bottomRadius:s,topRadius:s})}};var qs=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],Ws=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],oe=class extends B{constructor(t={}){let{id:e=C("ico-sphere-geometry")}=t,{indices:s,attributes:n}=Ys(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...n,...t.attributes}})}};function Ys(i){let{iterations:t=0}=i,e=Math.PI,s=e*2,n=[...qs],r=[...Ws];n.push(),r.push();let o=(()=>{let h={};return(d,f)=>{d*=3,f*=3;let m=d<f?d:f,b=d>f?d:f,u=`${m}|${b}`;if(u in h)return h[u];let x=n[d],M=n[d+1],_=n[d+2],p=n[f],g=n[f+1],y=n[f+2],v=(x+p)/2,I=(M+g)/2,O=(_+y)/2,P=Math.sqrt(v*v+I*I+O*O);return v/=P,I/=P,O/=P,n.push(v,I,O),h[u]=n.length/3-1}})();for(let h=0;h<t;h++){let d=[];for(let f=0;f<r.length;f+=3){let m=o(r[f+0],r[f+1]),b=o(r[f+1],r[f+2]),u=o(r[f+2],r[f+0]);d.push(u,r[f+0],m,m,r[f+1],b,b,r[f+2],u,m,b,u)}r=d}let a=new Array(n.length),c=new Array(n.length/3*2),l=r.length;for(let h=l-3;h>=0;h-=3){let d=r[h+0],f=r[h+1],m=r[h+2],b=d*3,u=f*3,x=m*3,M=d*2,_=f*2,p=m*2,g=n[b+0],y=n[b+1],v=n[b+2],I=Math.acos(v/Math.sqrt(g*g+y*y+v*v)),O=Math.atan2(y,g)+e,P=I/e,R=1-O/s,w=n[u+0],T=n[u+1],E=n[u+2],A=Math.acos(E/Math.sqrt(w*w+T*T+E*E)),F=Math.atan2(T,w)+e,Z=A/e,Y=1-F/s,Ot=n[x+0],Rt=n[x+1],Lt=n[x+2],Ui=Math.acos(Lt/Math.sqrt(Ot*Ot+Rt*Rt+Lt*Lt)),ji=Math.atan2(Rt,Ot)+e,Fe=Ui/e,kt=1-ji/s,Vi=[Ot-w,Rt-T,Lt-E],Gi=[g-w,y-T,v-E],q=new G(Vi).cross(Gi).normalize(),L;(R===0||Y===0||kt===0)&&(R===0||R>.5)&&(Y===0||Y>.5)&&(kt===0||kt>.5)&&(n.push(n[b+0],n[b+1],n[b+2]),L=n.length/3-1,r.push(L),c[L*2+0]=1,c[L*2+1]=P,a[L*3+0]=q.x,a[L*3+1]=q.y,a[L*3+2]=q.z,n.push(n[u+0],n[u+1],n[u+2]),L=n.length/3-1,r.push(L),c[L*2+0]=1,c[L*2+1]=Z,a[L*3+0]=q.x,a[L*3+1]=q.y,a[L*3+2]=q.z,n.push(n[x+0],n[x+1],n[x+2]),L=n.length/3-1,r.push(L),c[L*2+0]=1,c[L*2+1]=Fe,a[L*3+0]=q.x,a[L*3+1]=q.y,a[L*3+2]=q.z),a[b+0]=a[u+0]=a[x+0]=q.x,a[b+1]=a[u+1]=a[x+1]=q.y,a[b+2]=a[u+2]=a[x+2]=q.z,c[M+0]=R,c[M+1]=P,c[_+0]=Y,c[_+1]=Z,c[p+0]=kt,c[p+1]=Fe}return{indices:{size:1,value:new Uint16Array(r)},attributes:{POSITION:{size:3,value:new Float32Array(n)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function Ni(i){let{indices:t,attributes:e}=i;if(!t)return i;let s=t.value.length,n={};for(let r in e){let o=e[r],{constant:a,value:c,size:l}=o;if(a||!l)continue;let h=new c.constructor(s*l);for(let d=0;d<s;++d){let f=t.value[d];for(let m=0;m<l;m++)h[d*l+m]=c[f*l+m]}n[r]={size:l,value:h}}return{attributes:Object.assign({},e,n)}}var ae=class extends B{constructor(t={}){let{id:e=C("plane-geometry")}=t,{indices:s,attributes:n}=Xs(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...n,...t.attributes}})}};function Xs(i){let{type:t="x,y",offset:e=0,flipCull:s=!1,unpack:n=!1}=i,r=t.split(","),o=i[`${r[0]}len`]||1,a=i[`${r[1]}len`]||1,c=i[`n${r[0]}`]||1,l=i[`n${r[1]}`]||1,h=(c+1)*(l+1),d=new Float32Array(h*3),f=new Float32Array(h*3),m=new Float32Array(h*2);s&&(o=-o);let b=0,u=0;for(let p=0;p<=l;p++)for(let g=0;g<=c;g++){let y=g/c,v=p/l;switch(m[b+0]=s?1-y:y,m[b+1]=v,t){case"x,y":d[u+0]=o*y-o*.5,d[u+1]=a*v-a*.5,d[u+2]=e,f[u+0]=0,f[u+1]=0,f[u+2]=s?1:-1;break;case"x,z":d[u+0]=o*y-o*.5,d[u+1]=e,d[u+2]=a*v-a*.5,f[u+0]=0,f[u+1]=s?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*v-a*.5,f[u+0]=s?1:-1,f[u+1]=0,f[u+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}b+=2,u+=3}let x=c+1,M=new Uint16Array(c*l*6);for(let p=0;p<l;p++)for(let g=0;g<c;g++){let y=(p*c+g)*6;M[y+0]=(p+0)*x+g,M[y+1]=(p+1)*x+g,M[y+2]=(p+0)*x+g+1,M[y+3]=(p+1)*x+g,M[y+4]=(p+1)*x+g+1,M[y+5]=(p+0)*x+g+1}let _={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:m}}};return n?Ni(_):_}var ce=class extends B{constructor(t={}){let{id:e=C("sphere-geometry")}=t,{indices:s,attributes:n}=Hs(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...n,...t.attributes}})}};function Hs(i){let{nlat:t=10,nlong:e=10}=i,r=Math.PI-0,o=0,c=2*Math.PI-o,l=(t+1)*(e+1),h=(M,_,p,g,y)=>i.radius||1,d=new Float32Array(l*3),f=new Float32Array(l*3),m=new Float32Array(l*2),b=l>65535?Uint32Array:Uint16Array,u=new b(t*e*6);for(let M=0;M<=t;M++)for(let _=0;_<=e;_++){let p=_/e,g=M/t,y=_+M*(e+1),v=y*2,I=y*3,O=c*p,P=r*g,R=Math.sin(O),w=Math.cos(O),T=Math.sin(P),E=Math.cos(P),A=w*T,F=E,Z=R*T,Y=h(A,F,Z,p,g);d[I+0]=Y*A,d[I+1]=Y*F,d[I+2]=Y*Z,f[I+0]=A,f[I+1]=F,f[I+2]=Z,m[v+0]=p,m[v+1]=1-g}let x=e+1;for(let M=0;M<e;M++)for(let _=0;_<t;_++){let p=(M*t+_)*6;u[p+0]=_*x+M,u[p+1]=_*x+M+1,u[p+2]=(_+1)*x+M,u[p+3]=(_+1)*x+M,u[p+4]=_*x+M+1,u[p+5]=(_+1)*x+M+1}return{indices:{size:1,value:u},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:m}}}}function Fi(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Ks(Math.abs(i*t)*1432.71))}function Ks(i){return i-Math.floor(i)}var zi=k(ht(),1);var nt=k(j(),1),Mt=class{current;next;constructor(t){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}},vt=class extends Mt{constructor(t,e){e={...e};let s=e.colorAttachments?.map(o=>typeof o!="string"?o:t.createTexture({format:o,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:1,height:1})),n=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(o=>typeof o!="string"?o:t.createTexture({format:o,usage:nt.Texture.TEXTURE|nt.Texture.COPY_SRC|nt.Texture.COPY_DST|nt.Texture.RENDER_ATTACHMENT,width:1,height:1}));let r=t.createFramebuffer({...e,colorAttachments:s});super({current:n,next:r})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:s}=this;return this.current=e.clone(t),e.destroy(),this.next=s.clone(t),s.destroy(),!0}},he=class extends Mt{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:s}=this;return this.current=e.clone(t),e.destroy(),this.next=s.clone(t),s.destroy(),!0}};function Di(i){let{shaderPass:t,action:e,shadingLanguage:s}=i;switch(e){case"filter":let n=`${t.name}_filterColor_ext`;return s==="wgsl"?Zs(n):Js(n);case"sample":let r=`${t.name}_sampleColor`;return s==="wgsl"?Qs(r):tn(r);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Zs(i){return`// Binding 0:1 is reserved for shader passes
84
+ `,gt=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{id:e.id||"background-texture-model",source:Ei,fs:Ri,modules:[Pi],parameters:{depthWriteEnabled:!1,...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one",blendColorDstFactor:"one-minus-src",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one-minus-src-alpha"}:{}}}),!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 i=e instanceof q?e.texture:e;this.backgroundTexture=i,this.updateScale(i)}else e.ready.then(i=>{this.backgroundTexture=i,this.updateScale(i)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,i]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,n=t.height,o=e/i,a=r/n,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var Hn=1/Math.PI*180,Kn=1/180*Math.PI,Oi={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Oi}};var F=globalThis.mathgl.config;function us(s,{precision:t=F.precision}={}){return s=ki(s),`${parseFloat(s.toPrecision(t))}`}function xt(s){return Array.isArray(s)||ArrayBuffer.isView(s)&&!(s instanceof DataView)}function Ae(s,t,e){let i=F.EPSILON;e&&(F.EPSILON=e);try{if(s===t)return!0;if(xt(s)&&xt(t)){if(s.length!==t.length)return!1;for(let r=0;r<s.length;++r)if(!Ae(s[r],t[r]))return!1;return!0}return s&&s.equals?s.equals(t):t&&t.equals?t.equals(s):typeof s=="number"&&typeof t=="number"?Math.abs(s-t)<=F.EPSILON*Math.max(1,Math.abs(s),Math.abs(t)):!1}finally{F.EPSILON=i}}function ki(s){return Math.round(s/F.EPSILON)*F.EPSILON}var yt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let i=0;i<this.ELEMENTS;++i)this[i]=t[i+e];return this.check()}toArray(t=[],e=0){for(let i=0;i<this.ELEMENTS;++i)t[e+i]=this[i];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:xt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(F)}formatString(t){let e="";for(let i=0;i<this.ELEMENTS;++i)e+=(i>0?", ":"")+us(this[i],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(!Ae(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,i){if(i===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let n=t[r],o=typeof e=="number"?e:e[r];this[r]=n+i*(o-n)}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 i=0;i<this.ELEMENTS;++i)this[i]=Math.min(Math.max(this[i],t[i]),e[i]);return this.check()}add(...t){for(let e of t)for(let i=0;i<this.ELEMENTS;++i)this[i]+=e[i];return this.check()}subtract(...t){for(let e of t)for(let i=0;i<this.ELEMENTS;++i)this[i]-=e[i];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(F.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 i=0;i<this.ELEMENTS;++i)this[i]=Math.min(Math.max(this[i],t),e);return this.check()}get elements(){return this}};function Li(s,t){if(s.length!==t)return!1;for(let e=0;e<s.length;++e)if(!Number.isFinite(s[e]))return!1;return!0}function U(s){if(!Number.isFinite(s))throw new Error(`Invalid number ${JSON.stringify(s)}`);return s}function Kt(s,t,e=""){if(F.debug&&!Li(s,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return s}function Se(s,t){if(!s)throw new Error(`math.gl assertion ${t}`)}var Zt=class extends yt{get x(){return this[0]}set x(t){this[0]=U(t)}get y(){return this[1]}set y(t){this[1]=U(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 i=0;i<this.ELEMENTS;++i){let r=this[i]-t[i];e+=r*r}return U(e)}dot(t){let e=0;for(let i=0;i<this.ELEMENTS;++i)e+=this[i]*t[i];return U(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 i=0;i<this.ELEMENTS;++i)this[i]*=e[i];return this.check()}divide(...t){for(let e of t)for(let i=0;i<this.ELEMENTS;++i)this[i]/=e[i];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return Se(t>=0&&t<this.ELEMENTS,"index is out of range"),U(this[t])}setComponent(t,e){return Se(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 it=typeof Float32Array<"u"?Float32Array:Array;var ao=Math.PI/180;function Ni(){let s=new it(2);return it!=Float32Array&&(s[0]=0,s[1]=0),s}function gs(s,t,e){let i=t[0],r=t[1];return s[0]=e[0]*i+e[4]*r+e[12],s[1]=e[1]*i+e[5]*r+e[13],s}var co=function(){let s=Ni();return function(t,e,i,r,n,o){let a,c;for(e||(e=2),i||(i=0),r?c=Math.min(r*e+i,t.length):c=t.length,a=i;a<c;a+=e)s[0]=t[a],s[1]=t[a+1],n(s,s,o),t[a]=s[0],t[a+1]=s[1];return t}}();function xs(s,t,e){let i=t[0],r=t[1],n=e[3]*i+e[7]*r||1;return s[0]=(e[0]*i+e[4]*r)/n,s[1]=(e[1]*i+e[5]*r)/n,s}function Qt(s,t,e){let i=t[0],r=t[1],n=t[2],o=e[3]*i+e[7]*r+e[11]*n||1;return s[0]=(e[0]*i+e[4]*r+e[8]*n)/o,s[1]=(e[1]*i+e[5]*r+e[9]*n)/o,s[2]=(e[2]*i+e[6]*r+e[10]*n)/o,s}function ys(s,t,e){let i=t[0],r=t[1];return s[0]=e[0]*i+e[2]*r,s[1]=e[1]*i+e[3]*r,s[2]=t[2],s}function Di(){let s=new it(3);return it!=Float32Array&&(s[0]=0,s[1]=0,s[2]=0),s}function Fi(s,t){return s[0]*t[0]+s[1]*t[1]+s[2]*t[2]}function bs(s,t,e){let i=t[0],r=t[1],n=t[2],o=e[0],a=e[1],c=e[2];return s[0]=r*c-n*a,s[1]=n*o-i*c,s[2]=i*a-r*o,s}function Jt(s,t,e){let i=t[0],r=t[1],n=t[2],o=e[3]*i+e[7]*r+e[11]*n+e[15];return o=o||1,s[0]=(e[0]*i+e[4]*r+e[8]*n+e[12])/o,s[1]=(e[1]*i+e[5]*r+e[9]*n+e[13])/o,s[2]=(e[2]*i+e[6]*r+e[10]*n+e[14])/o,s}function vs(s,t,e){let i=t[0],r=t[1],n=t[2];return s[0]=i*e[0]+r*e[3]+n*e[6],s[1]=i*e[1]+r*e[4]+n*e[7],s[2]=i*e[2]+r*e[5]+n*e[8],s}function Ms(s,t,e){let i=e[0],r=e[1],n=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-n*c,d=n*a-i*h,f=i*c-r*a,m=r*f-n*d,b=n*l-i*f,u=i*d-r*l,x=o*2;return l*=x,d*=x,f*=x,m*=2,b*=2,u*=2,s[0]=a+l+m,s[1]=c+d+b,s[2]=h+f+u,s}function _s(s,t,e,i){let r=[],n=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],n[0]=r[0],n[1]=r[1]*Math.cos(i)-r[2]*Math.sin(i),n[2]=r[1]*Math.sin(i)+r[2]*Math.cos(i),s[0]=n[0]+e[0],s[1]=n[1]+e[1],s[2]=n[2]+e[2],s}function ws(s,t,e,i){let r=[],n=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],n[0]=r[2]*Math.sin(i)+r[0]*Math.cos(i),n[1]=r[1],n[2]=r[2]*Math.cos(i)-r[0]*Math.sin(i),s[0]=n[0]+e[0],s[1]=n[1]+e[1],s[2]=n[2]+e[2],s}function As(s,t,e,i){let r=[],n=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],n[0]=r[0]*Math.cos(i)-r[1]*Math.sin(i),n[1]=r[0]*Math.sin(i)+r[1]*Math.cos(i),n[2]=r[2],s[0]=n[0]+e[0],s[1]=n[1]+e[1],s[2]=n[2]+e[2],s}function Ss(s,t){let e=s[0],i=s[1],r=s[2],n=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+i*i+r*r)*(n*n+o*o+a*a)),h=c&&Fi(s,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var fo=function(){let s=Di();return function(t,e,i,r,n,o){let a,c;for(e||(e=3),i||(i=0),r?c=Math.min(r*e+i,t.length):c=t.length,a=i;a<c;a+=e)s[0]=t[a],s[1]=t[a+1],s[2]=t[a+2],n(s,s,o),t[a]=s[0],t[a+1]=s[1],t[a+2]=s[2];return t}}();var Ie=[0,0,0],te,G=class extends Zt{static get ZERO(){return te||(te=new G(0,0,0),Object.freeze(te)),te}constructor(t=0,e=0,i=0){super(-0,-0,-0),arguments.length===1&&xt(t)?this.copy(t):(F.debug&&(U(t),U(e),U(i)),this[0]=t,this[1]=e,this[2]=i)}set(t,e,i){return this[0]=t,this[1]=e,this[2]=i,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return F.debug&&(U(t.x),U(t.y),U(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]=U(t)}angle(t){return Ss(this,t)}cross(t){return bs(this,this,t),this.check()}rotateX({radians:t,origin:e=Ie}){return _s(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Ie}){return ws(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Ie}){return As(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return Jt(this,this,t),this.check()}transformAsVector(t){return Qt(this,this,t),this.check()}transformByMatrix3(t){return vs(this,this,t),this.check()}transformByMatrix2(t){return ys(this,this,t),this.check()}transformByQuaternion(t){return Ms(this,this,t),this.check()}};var ee=class extends yt{toString(){let t="[";if(F.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let i=0;i<this.RANK;++i)t+=` ${this[i*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,i){return this[e*this.RANK+t]=U(i),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let i=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[i+r];return e}setColumn(t,e){let i=t*this.RANK;for(let r=0;r<this.RANK;++r)this[i+r]=e[r];return this}};function zi(s){return s[0]=1,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=1,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=1,s[11]=0,s[12]=0,s[13]=0,s[14]=0,s[15]=1,s}function Ts(s,t){if(s===t){let e=t[1],i=t[2],r=t[3],n=t[6],o=t[7],a=t[11];s[1]=t[4],s[2]=t[8],s[3]=t[12],s[4]=e,s[6]=t[9],s[7]=t[13],s[8]=i,s[9]=n,s[11]=t[14],s[12]=r,s[13]=o,s[14]=a}else s[0]=t[0],s[1]=t[4],s[2]=t[8],s[3]=t[12],s[4]=t[1],s[5]=t[5],s[6]=t[9],s[7]=t[13],s[8]=t[2],s[9]=t[6],s[10]=t[10],s[11]=t[14],s[12]=t[3],s[13]=t[7],s[14]=t[11],s[15]=t[15];return s}function Is(s,t){let e=t[0],i=t[1],r=t[2],n=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],f=t[10],m=t[11],b=t[12],u=t[13],x=t[14],v=t[15],_=e*a-i*o,p=e*c-r*o,g=e*h-n*o,y=i*c-r*a,M=i*h-n*a,I=r*h-n*c,R=l*u-d*b,P=l*x-f*b,O=l*v-m*b,w=d*x-f*u,S=d*v-m*u,E=f*v-m*x,A=_*E-p*S+g*w+y*O-M*P+I*R;return A?(A=1/A,s[0]=(a*E-c*S+h*w)*A,s[1]=(r*S-i*E-n*w)*A,s[2]=(u*I-x*M+v*y)*A,s[3]=(f*M-d*I-m*y)*A,s[4]=(c*O-o*E-h*P)*A,s[5]=(e*E-r*O+n*P)*A,s[6]=(x*g-b*I-v*p)*A,s[7]=(l*I-f*g+m*p)*A,s[8]=(o*S-a*O+h*R)*A,s[9]=(i*O-e*S-n*R)*A,s[10]=(b*M-u*g+v*_)*A,s[11]=(d*g-l*M-m*_)*A,s[12]=(a*P-o*w-c*R)*A,s[13]=(e*w-i*P+r*R)*A,s[14]=(u*p-b*y-x*_)*A,s[15]=(l*y-d*p+f*_)*A,s):null}function Cs(s){let t=s[0],e=s[1],i=s[2],r=s[3],n=s[4],o=s[5],a=s[6],c=s[7],h=s[8],l=s[9],d=s[10],f=s[11],m=s[12],b=s[13],u=s[14],x=s[15],v=t*o-e*n,_=t*a-i*n,p=e*a-i*o,g=h*b-l*m,y=h*u-d*m,M=l*u-d*b,I=t*M-e*y+i*g,R=n*M-o*y+a*g,P=h*p-l*_+d*v,O=m*p-b*_+u*v;return c*I-r*R+x*P-f*O}function Ce(s,t,e){let i=t[0],r=t[1],n=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],f=t[9],m=t[10],b=t[11],u=t[12],x=t[13],v=t[14],_=t[15],p=e[0],g=e[1],y=e[2],M=e[3];return s[0]=p*i+g*a+y*d+M*u,s[1]=p*r+g*c+y*f+M*x,s[2]=p*n+g*h+y*m+M*v,s[3]=p*o+g*l+y*b+M*_,p=e[4],g=e[5],y=e[6],M=e[7],s[4]=p*i+g*a+y*d+M*u,s[5]=p*r+g*c+y*f+M*x,s[6]=p*n+g*h+y*m+M*v,s[7]=p*o+g*l+y*b+M*_,p=e[8],g=e[9],y=e[10],M=e[11],s[8]=p*i+g*a+y*d+M*u,s[9]=p*r+g*c+y*f+M*x,s[10]=p*n+g*h+y*m+M*v,s[11]=p*o+g*l+y*b+M*_,p=e[12],g=e[13],y=e[14],M=e[15],s[12]=p*i+g*a+y*d+M*u,s[13]=p*r+g*c+y*f+M*x,s[14]=p*n+g*h+y*m+M*v,s[15]=p*o+g*l+y*b+M*_,s}function Ps(s,t,e){let i=e[0],r=e[1],n=e[2],o,a,c,h,l,d,f,m,b,u,x,v;return t===s?(s[12]=t[0]*i+t[4]*r+t[8]*n+t[12],s[13]=t[1]*i+t[5]*r+t[9]*n+t[13],s[14]=t[2]*i+t[6]*r+t[10]*n+t[14],s[15]=t[3]*i+t[7]*r+t[11]*n+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],f=t[6],m=t[7],b=t[8],u=t[9],x=t[10],v=t[11],s[0]=o,s[1]=a,s[2]=c,s[3]=h,s[4]=l,s[5]=d,s[6]=f,s[7]=m,s[8]=b,s[9]=u,s[10]=x,s[11]=v,s[12]=o*i+l*r+b*n+t[12],s[13]=a*i+d*r+u*n+t[13],s[14]=c*i+f*r+x*n+t[14],s[15]=h*i+m*r+v*n+t[15]),s}function Es(s,t,e){let i=e[0],r=e[1],n=e[2];return s[0]=t[0]*i,s[1]=t[1]*i,s[2]=t[2]*i,s[3]=t[3]*i,s[4]=t[4]*r,s[5]=t[5]*r,s[6]=t[6]*r,s[7]=t[7]*r,s[8]=t[8]*n,s[9]=t[9]*n,s[10]=t[10]*n,s[11]=t[11]*n,s[12]=t[12],s[13]=t[13],s[14]=t[14],s[15]=t[15],s}function Rs(s,t,e,i){let r=i[0],n=i[1],o=i[2],a=Math.sqrt(r*r+n*n+o*o),c,h,l,d,f,m,b,u,x,v,_,p,g,y,M,I,R,P,O,w,S,E,A,D;return a<1e-6?null:(a=1/a,r*=a,n*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],f=t[1],m=t[2],b=t[3],u=t[4],x=t[5],v=t[6],_=t[7],p=t[8],g=t[9],y=t[10],M=t[11],I=r*r*l+c,R=n*r*l+o*h,P=o*r*l-n*h,O=r*n*l-o*h,w=n*n*l+c,S=o*n*l+r*h,E=r*o*l+n*h,A=n*o*l-r*h,D=o*o*l+c,s[0]=d*I+u*R+p*P,s[1]=f*I+x*R+g*P,s[2]=m*I+v*R+y*P,s[3]=b*I+_*R+M*P,s[4]=d*O+u*w+p*S,s[5]=f*O+x*w+g*S,s[6]=m*O+v*w+y*S,s[7]=b*O+_*w+M*S,s[8]=d*E+u*A+p*D,s[9]=f*E+x*A+g*D,s[10]=m*E+v*A+y*D,s[11]=b*E+_*A+M*D,t!==s&&(s[12]=t[12],s[13]=t[13],s[14]=t[14],s[15]=t[15]),s)}function Os(s,t,e){let i=Math.sin(e),r=Math.cos(e),n=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!==s&&(s[0]=t[0],s[1]=t[1],s[2]=t[2],s[3]=t[3],s[12]=t[12],s[13]=t[13],s[14]=t[14],s[15]=t[15]),s[4]=n*r+h*i,s[5]=o*r+l*i,s[6]=a*r+d*i,s[7]=c*r+f*i,s[8]=h*r-n*i,s[9]=l*r-o*i,s[10]=d*r-a*i,s[11]=f*r-c*i,s}function ks(s,t,e){let i=Math.sin(e),r=Math.cos(e),n=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!==s&&(s[4]=t[4],s[5]=t[5],s[6]=t[6],s[7]=t[7],s[12]=t[12],s[13]=t[13],s[14]=t[14],s[15]=t[15]),s[0]=n*r-h*i,s[1]=o*r-l*i,s[2]=a*r-d*i,s[3]=c*r-f*i,s[8]=n*i+h*r,s[9]=o*i+l*r,s[10]=a*i+d*r,s[11]=c*i+f*r,s}function Ls(s,t,e){let i=Math.sin(e),r=Math.cos(e),n=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!==s&&(s[8]=t[8],s[9]=t[9],s[10]=t[10],s[11]=t[11],s[12]=t[12],s[13]=t[13],s[14]=t[14],s[15]=t[15]),s[0]=n*r+h*i,s[1]=o*r+l*i,s[2]=a*r+d*i,s[3]=c*r+f*i,s[4]=h*r-n*i,s[5]=l*r-o*i,s[6]=d*r-a*i,s[7]=f*r-c*i,s}function Ns(s,t){let e=t[0],i=t[1],r=t[2],n=t[3],o=e+e,a=i+i,c=r+r,h=e*o,l=i*o,d=i*a,f=r*o,m=r*a,b=r*c,u=n*o,x=n*a,v=n*c;return s[0]=1-d-b,s[1]=l+v,s[2]=f-x,s[3]=0,s[4]=l-v,s[5]=1-h-b,s[6]=m+u,s[7]=0,s[8]=f+x,s[9]=m-u,s[10]=1-h-d,s[11]=0,s[12]=0,s[13]=0,s[14]=0,s[15]=1,s}function Ds(s,t,e,i,r,n,o){let a=1/(e-t),c=1/(r-i),h=1/(n-o);return s[0]=n*2*a,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=n*2*c,s[6]=0,s[7]=0,s[8]=(e+t)*a,s[9]=(r+i)*c,s[10]=(o+n)*h,s[11]=-1,s[12]=0,s[13]=0,s[14]=o*n*2*h,s[15]=0,s}function Bi(s,t,e,i,r){let n=1/Math.tan(t/2);if(s[0]=n/e,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=n,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[11]=-1,s[12]=0,s[13]=0,s[15]=0,r!=null&&r!==1/0){let o=1/(i-r);s[10]=(r+i)*o,s[14]=2*r*i*o}else s[10]=-1,s[14]=-2*i;return s}var Fs=Bi;function $i(s,t,e,i,r,n,o){let a=1/(t-e),c=1/(i-r),h=1/(n-o);return s[0]=-2*a,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=-2*c,s[6]=0,s[7]=0,s[8]=0,s[9]=0,s[10]=2*h,s[11]=0,s[12]=(t+e)*a,s[13]=(r+i)*c,s[14]=(o+n)*h,s[15]=1,s}var zs=$i;function Bs(s,t,e,i){let r,n,o,a,c,h,l,d,f,m,b=t[0],u=t[1],x=t[2],v=i[0],_=i[1],p=i[2],g=e[0],y=e[1],M=e[2];return Math.abs(b-g)<1e-6&&Math.abs(u-y)<1e-6&&Math.abs(x-M)<1e-6?zi(s):(d=b-g,f=u-y,m=x-M,r=1/Math.sqrt(d*d+f*f+m*m),d*=r,f*=r,m*=r,n=_*m-p*f,o=p*d-v*m,a=v*f-_*d,r=Math.sqrt(n*n+o*o+a*a),r?(r=1/r,n*=r,o*=r,a*=r):(n=0,o=0,a=0),c=f*a-m*o,h=m*n-d*a,l=d*o-f*n,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),s[0]=n,s[1]=c,s[2]=d,s[3]=0,s[4]=o,s[5]=h,s[6]=f,s[7]=0,s[8]=a,s[9]=l,s[10]=m,s[11]=0,s[12]=-(n*b+o*u+a*x),s[13]=-(c*b+h*u+l*x),s[14]=-(d*b+f*u+m*x),s[15]=1,s)}function Ui(){let s=new it(4);return it!=Float32Array&&(s[0]=0,s[1]=0,s[2]=0,s[3]=0),s}function $s(s,t,e){let i=t[0],r=t[1],n=t[2],o=t[3];return s[0]=e[0]*i+e[4]*r+e[8]*n+e[12]*o,s[1]=e[1]*i+e[5]*r+e[9]*n+e[13]*o,s[2]=e[2]*i+e[6]*r+e[10]*n+e[14]*o,s[3]=e[3]*i+e[7]*r+e[11]*n+e[15]*o,s}var So=function(){let s=Ui();return function(t,e,i,r,n,o){let a,c;for(e||(e=4),i||(i=0),r?c=Math.min(r*e+i,t.length):c=t.length,a=i;a<c;a+=e)s[0]=t[a],s[1]=t[a+1],s[2]=t[a+2],s[3]=t[a+3],n(s,s,o),t[a]=s[0],t[a+1]=s[1],t[a+2]=s[2],t[a+3]=s[3];return t}}();var Re;(function(s){s[s.COL0ROW0=0]="COL0ROW0",s[s.COL0ROW1=1]="COL0ROW1",s[s.COL0ROW2=2]="COL0ROW2",s[s.COL0ROW3=3]="COL0ROW3",s[s.COL1ROW0=4]="COL1ROW0",s[s.COL1ROW1=5]="COL1ROW1",s[s.COL1ROW2=6]="COL1ROW2",s[s.COL1ROW3=7]="COL1ROW3",s[s.COL2ROW0=8]="COL2ROW0",s[s.COL2ROW1=9]="COL2ROW1",s[s.COL2ROW2=10]="COL2ROW2",s[s.COL2ROW3=11]="COL2ROW3",s[s.COL3ROW0=12]="COL3ROW0",s[s.COL3ROW1=13]="COL3ROW1",s[s.COL3ROW2=14]="COL3ROW2",s[s.COL3ROW3=15]="COL3ROW3"})(Re||(Re={}));var ji=45*Math.PI/180,Vi=1,Pe=.1,Ee=500,Gi=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),H=class extends ee{static get IDENTITY(){return Wi()}static get ZERO(){return qi()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Re}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,i,r,n,o,a,c,h,l,d,f,m,b,u,x){return this[0]=t,this[1]=e,this[2]=i,this[3]=r,this[4]=n,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=f,this[12]=m,this[13]=b,this[14]=u,this[15]=x,this.check()}setRowMajor(t,e,i,r,n,o,a,c,h,l,d,f,m,b,u,x){return this[0]=t,this[1]=n,this[2]=h,this[3]=m,this[4]=e,this[5]=o,this[6]=l,this[7]=b,this[8]=i,this[9]=a,this[10]=d,this[11]=u,this[12]=r,this[13]=c,this[14]=f,this[15]=x,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(Gi)}fromObject(t){return this.check()}fromQuaternion(t){return Ns(this,t),this.check()}frustum(t){let{left:e,right:i,bottom:r,top:n,near:o=Pe,far:a=Ee}=t;return a===1/0?Yi(this,e,i,r,n,o):Ds(this,e,i,r,n,o,a),this.check()}lookAt(t){let{eye:e,center:i=[0,0,0],up:r=[0,1,0]}=t;return Bs(this,e,i,r),this.check()}ortho(t){let{left:e,right:i,bottom:r,top:n,near:o=Pe,far:a=Ee}=t;return zs(this,e,i,r,n,o,a),this.check()}orthographic(t){let{fovy:e=ji,aspect:i=Vi,focalDistance:r=1,near:n=Pe,far:o=Ee}=t;Us(e);let a=e/2,c=r*Math.tan(a),h=c*i;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:n,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:i=1,near:r=.1,far:n=500}=t;return Us(e),Fs(this,e,i,r,n),this.check()}determinant(){return Cs(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 i=this.getScale(e),r=1/i[0],n=1/i[1],o=1/i[2];return t[0]=this[0]*r,t[1]=this[1]*n,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*n,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*n,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 i=this.getScale(e),r=1/i[0],n=1/i[1],o=1/i[2];return t[0]=this[0]*r,t[1]=this[1]*n,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*n,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*n,t[8]=this[10]*o,t}transpose(){return Ts(this,this),this.check()}invert(){return Is(this,this),this.check()}multiplyLeft(t){return Ce(this,t,this),this.check()}multiplyRight(t){return Ce(this,this,t),this.check()}rotateX(t){return Os(this,this,t),this.check()}rotateY(t){return ks(this,this,t),this.check()}rotateZ(t){return Ls(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return Rs(this,this,t,e),this.check()}scale(t){return Es(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return Ps(this,this,t),this.check()}transform(t,e){return t.length===4?(e=$s(e||[-0,-0,-0,-0],t,this),Kt(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:i}=t,r;switch(i){case 2:r=gs(e||[-0,-0],t,this);break;case 3:r=Jt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Kt(r,t.length),r}transformAsVector(t,e){let i;switch(t.length){case 2:i=xs(e||[-0,-0],t,this);break;case 3:i=Qt(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Kt(i,t.length),i}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,i){return this.identity().translate([t,e,i])}},se,ie;function qi(){return se||(se=new H([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(se)),se}function Wi(){return ie||(ie=new H,Object.freeze(ie)),ie}function Us(s){if(s>Math.PI*2)throw Error("expected radians")}function Yi(s,t,e,i,r,n){let o=2*n/(e-t),a=2*n/(r-i),c=(e+t)/(e-t),h=(r+i)/(r-i),l=-1,d=-1,f=-2*n;return s[0]=o,s[1]=0,s[2]=0,s[3]=0,s[4]=0,s[5]=a,s[6]=0,s[7]=0,s[8]=c,s[9]=h,s[10]=l,s[11]=d,s[12]=0,s[13]=0,s[14]=f,s[15]=0,s}var rt=class{id;matrix=new H;display=!0;position=new G;rotation=new G;scale=new G(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||C(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 this.position=t,this}setRotation(t){return this.rotation=t,this}setScale(t){return this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:i,scale:r,update:n=!0}=t;return e&&this.setPosition(e),i&&this.setRotation(i),r&&this.setScale(r),n&&this.updateMatrix(),this}updateMatrix(){let t=this.position,e=this.rotation,i=this.scale;return this.matrix.identity(),this.matrix.translate(t),this.matrix.rotateXYZ(e),this.matrix.scale(i),this}update(t={}){let{position:e,rotation:i,scale:r}=t;return e&&this.setPosition(e),i&&this.setRotation(i),r&&this.setScale(r),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let i=new H(t).multiplyRight(e),r=i.invert(),n=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:i,worldInverseMatrix:r,worldInverseTransposeMatrix:n}}_setScenegraphNodeProps(t){"position"in t&&this.setPosition(t.position),"rotation"in t&&this.setRotation(t.rotation),"scale"in t&&this.setScale(t.scale),"matrix"in t&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var js=L(B(),1);var vt=class extends rt{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;js.log.assert(e.every(i=>i instanceof rt),"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:i})=>{let r=e.getBounds();if(!r)return;let[n,o]=r,a=new G(n).add(o).divide([2,2,2]);i.transformAsPoint(a,a);let c=new G(o).subtract(n).divide([2,2,2]);i.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new G(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,i=e.indexOf(t);return i>-1&&e.splice(i,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new H}={}){let i=new H(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof vt?r.traverse(t,{worldMatrix:i}):t(r,{worldMatrix:i})}};var re=class extends rt{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 Xi={x:[2,0,1],y:[0,1,2],z:[1,2,0]},ot=class extends ${constructor(t={}){let{id:e=C("truncated-code-geometry")}=t,{indices:i,attributes:r}=Hi(t);super({...t,id:e,topology:"triangle-list",indices:i,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function Hi(s={}){let{bottomRadius:t=0,topRadius:e=0,height:i=1,nradial:r=10,nvertical:n=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=s,h=(a?2:0)+(c?2:0),l=(r+1)*(n+1+h),d=Math.atan2(t-e,i),f=Math.sin,m=Math.cos,b=Math.PI,u=m(d),x=f(d),v=a?-2:0,_=n+(c?2:0),p=r+1,g=new Uint16Array(r*(n+h)*6),y=Xi[o],M=new Float32Array(l*3),I=new Float32Array(l*3),R=new Float32Array(l*2),P=0,O=0;for(let w=v;w<=_;w++){let S=w/n,E=i*S,A;w<0?(E=0,S=1,A=t):w>n?(E=i,S=1,A=e):A=t+(e-t)*(w/n),(w===-2||w===n+2)&&(A=0,S=0),E-=i/2;for(let D=0;D<p;D++){let J=f(D*b*2/r),X=m(D*b*2/r);M[P+y[0]]=J*A,M[P+y[1]]=E,M[P+y[2]]=X*A,I[P+y[0]]=w<0||w>n?0:J*u,I[P+y[1]]=w<0?-1:w>n?1:x,I[P+y[2]]=w<0||w>n?0:X*u,R[O+0]=D/r,R[O+1]=S,O+=2,P+=3}}for(let w=0;w<n+h;w++)for(let S=0;S<r;S++){let E=(w*r+S)*6;g[E+0]=p*(w+0)+0+S,g[E+1]=p*(w+0)+1+S,g[E+2]=p*(w+1)+1+S,g[E+3]=p*(w+0)+0+S,g[E+4]=p*(w+1)+1+S,g[E+5]=p*(w+1)+0+S}return{indices:g,attributes:{POSITION:M,NORMAL:I,TEXCOORD_0:R}}}var ne=class extends ot{constructor(t={}){let{id:e=C("cone-geometry"),radius:i=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:i})}};var oe=class extends ${constructor(t={}){let{id:e=C("cube-geometry"),indices:i=!0}=t;super(i?{...t,id:e,topology:"triangle-list",indices:{size:1,value:Ki},attributes:{...ir,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...rr,...t.attributes}})}},Ki=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]),Zi=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]),Qi=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]),Ji=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]),tr=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]),er=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]),sr=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]),ir={POSITION:{size:3,value:Zi},NORMAL:{size:3,value:Qi},TEXCOORD_0:{size:2,value:Ji}},rr={POSITION:{size:3,value:tr},TEXCOORD_0:{size:2,value:er},COLOR_0:{size:3,value:sr}};var ae=class extends ot{constructor(t={}){let{id:e=C("cylinder-geometry"),radius:i=1}=t;super({...t,id:e,bottomRadius:i,topRadius:i})}};var nr=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],or=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],ce=class extends ${constructor(t={}){let{id:e=C("ico-sphere-geometry")}=t,{indices:i,attributes:r}=ar(t);super({...t,id:e,topology:"triangle-list",indices:i,attributes:{...r,...t.attributes}})}};function ar(s){let{iterations:t=0}=s,e=Math.PI,i=e*2,r=[...nr],n=[...or];r.push(),n.push();let o=(()=>{let l={};return(d,f)=>{d*=3,f*=3;let m=d<f?d:f,b=d>f?d:f,u=`${m}|${b}`;if(u in l)return l[u];let x=r[d],v=r[d+1],_=r[d+2],p=r[f],g=r[f+1],y=r[f+2],M=(x+p)/2,I=(v+g)/2,R=(_+y)/2,P=Math.sqrt(M*M+I*I+R*R);return M/=P,I/=P,R/=P,r.push(M,I,R),l[u]=r.length/3-1}})();for(let l=0;l<t;l++){let d=[];for(let f=0;f<n.length;f+=3){let m=o(n[f+0],n[f+1]),b=o(n[f+1],n[f+2]),u=o(n[f+2],n[f+0]);d.push(u,n[f+0],m,m,n[f+1],b,b,n[f+2],u,m,b,u)}n=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=n.length;for(let l=h-3;l>=0;l-=3){let d=n[l+0],f=n[l+1],m=n[l+2],b=d*3,u=f*3,x=m*3,v=d*2,_=f*2,p=m*2,g=r[b+0],y=r[b+1],M=r[b+2],I=Math.acos(M/Math.sqrt(g*g+y*y+M*M)),R=Math.atan2(y,g)+e,P=I/e,O=1-R/i,w=r[u+0],S=r[u+1],E=r[u+2],A=Math.acos(E/Math.sqrt(w*w+S*S+E*E)),D=Math.atan2(S,w)+e,J=A/e,X=1-D/i,Nt=r[x+0],Dt=r[x+1],Ft=r[x+2],Js=Math.acos(Ft/Math.sqrt(Nt*Nt+Dt*Dt+Ft*Ft)),ti=Math.atan2(Dt,Nt)+e,ze=Js/e,zt=1-ti/i,ei=[Nt-w,Dt-S,Ft-E],si=[g-w,y-S,M-E],W=new G(ei).cross(si).normalize(),k;(O===0||X===0||zt===0)&&(O===0||O>.5)&&(X===0||X>.5)&&(zt===0||zt>.5)&&(r.push(r[b+0],r[b+1],r[b+2]),k=r.length/3-1,n.push(k),c[k*2+0]=1,c[k*2+1]=P,a[k*3+0]=W.x,a[k*3+1]=W.y,a[k*3+2]=W.z,r.push(r[u+0],r[u+1],r[u+2]),k=r.length/3-1,n.push(k),c[k*2+0]=1,c[k*2+1]=J,a[k*3+0]=W.x,a[k*3+1]=W.y,a[k*3+2]=W.z,r.push(r[x+0],r[x+1],r[x+2]),k=r.length/3-1,n.push(k),c[k*2+0]=1,c[k*2+1]=ze,a[k*3+0]=W.x,a[k*3+1]=W.y,a[k*3+2]=W.z),a[b+0]=a[u+0]=a[x+0]=W.x,a[b+1]=a[u+1]=a[x+1]=W.y,a[b+2]=a[u+2]=a[x+2]=W.z,c[v+0]=O,c[v+1]=P,c[_+0]=X,c[_+1]=J,c[p+0]=zt,c[p+1]=ze}return{indices:{size:1,value:new Uint16Array(n)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function Vs(s){let{indices:t,attributes:e}=s;if(!t)return s;let i=t.value.length,r={};for(let n in e){let o=e[n],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(i*h);for(let d=0;d<i;++d){let f=t.value[d];for(let m=0;m<h;m++)l[d*h+m]=c[f*h+m]}r[n]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var he=class extends ${constructor(t={}){let{id:e=C("plane-geometry")}=t,{indices:i,attributes:r}=cr(t);super({...t,id:e,topology:"triangle-list",indices:i,attributes:{...r,...t.attributes}})}};function cr(s){let{type:t="x,y",offset:e=0,flipCull:i=!1,unpack:r=!1}=s,n=t.split(","),o=s[`${n[0]}len`]||1,a=s[`${n[1]}len`]||1,c=s[`n${n[0]}`]||1,h=s[`n${n[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),f=new Float32Array(l*3),m=new Float32Array(l*2);i&&(o=-o);let b=0,u=0;for(let p=0;p<=h;p++)for(let g=0;g<=c;g++){let y=g/c,M=p/h;switch(m[b+0]=i?1-y:y,m[b+1]=M,t){case"x,y":d[u+0]=o*y-o*.5,d[u+1]=a*M-a*.5,d[u+2]=e,f[u+0]=0,f[u+1]=0,f[u+2]=i?1:-1;break;case"x,z":d[u+0]=o*y-o*.5,d[u+1]=e,d[u+2]=a*M-a*.5,f[u+0]=0,f[u+1]=i?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*M-a*.5,f[u+0]=i?1:-1,f[u+1]=0,f[u+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}b+=2,u+=3}let x=c+1,v=new Uint16Array(c*h*6);for(let p=0;p<h;p++)for(let g=0;g<c;g++){let y=(p*c+g)*6;v[y+0]=(p+0)*x+g,v[y+1]=(p+1)*x+g,v[y+2]=(p+0)*x+g+1,v[y+3]=(p+1)*x+g,v[y+4]=(p+1)*x+g+1,v[y+5]=(p+0)*x+g+1}let _={indices:{size:1,value:v},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:m}}};return r?Vs(_):_}var le=class extends ${constructor(t={}){let{id:e=C("sphere-geometry")}=t,{indices:i,attributes:r}=hr(t);super({...t,id:e,topology:"triangle-list",indices:i,attributes:{...r,...t.attributes}})}};function hr(s){let{nlat:t=10,nlong:e=10}=s,n=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(v,_,p,g,y)=>s.radius||1,d=new Float32Array(h*3),f=new Float32Array(h*3),m=new Float32Array(h*2),b=h>65535?Uint32Array:Uint16Array,u=new b(t*e*6);for(let v=0;v<=t;v++)for(let _=0;_<=e;_++){let p=_/e,g=v/t,y=_+v*(e+1),M=y*2,I=y*3,R=c*p,P=n*g,O=Math.sin(R),w=Math.cos(R),S=Math.sin(P),E=Math.cos(P),A=w*S,D=E,J=O*S,X=l(A,D,J,p,g);d[I+0]=X*A,d[I+1]=X*D,d[I+2]=X*J,f[I+0]=A,f[I+1]=D,f[I+2]=J,m[M+0]=p,m[M+1]=1-g}let x=e+1;for(let v=0;v<e;v++)for(let _=0;_<t;_++){let p=(v*t+_)*6;u[p+0]=_*x+v,u[p+1]=_*x+v+1,u[p+2]=(_+1)*x+v,u[p+3]=(_+1)*x+v,u[p+4]=_*x+v+1,u[p+5]=(_+1)*x+v+1}return{indices:{size:1,value:u},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:m}}}}function Gs(){let s=1,t=1;return()=>(s=Math.sin(t*17.23),t=Math.cos(s*27.92),lr(Math.abs(s*t)*1432.71))}function lr(s){return s-Math.floor(s)}var Oe="";function qs(s){Oe=s}async function Ws(s,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=s.startsWith("http")?s:Oe+s,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function Ys(s,t){return await new Promise((e,i)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>i(new Error(`Could not load image ${s}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=s.startsWith("http")?s:Oe+s}catch(r){i(r)}})}var Hs=L(ht(),1);var nt=L(B(),1),Mt=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}},_t=class extends Mt{constructor(t,e){e={...e};let{width:i=1,height:r=1}=e,n=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:i,height:r})),o=t.createFramebuffer({...e,colorAttachments:n});n=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:i,height:r}));let a=t.createFramebuffer({...e,colorAttachments:n});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:i}=this;return this.current=e.clone(t),e.destroy(),this.next=i.clone(t),i.destroy(),!0}},de=class extends Mt{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:i}=this;return this.current=e.clone(t),e.destroy(),this.next=i.clone(t),i.destroy(),!0}};function Xs(s){let{shaderPass:t,action:e,shadingLanguage:i}=s;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return i==="wgsl"?dr(r):ur(r);case"sample":let n=`${t.name}_sampleColor`;return i==="wgsl"?fr(n):pr(n);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function dr(s){return`// Binding 0:1 is reserved for shader passes
78
85
  // @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
79
86
  @group(0) @binding(1) var texture: texture_2d<f32>;
80
- @group(0) @binding(2) var sampler: sampler;
87
+ @group(0) @binding(2) var textureSampler: sampler;
81
88
 
82
- struct FragmentInputs {
83
- @location(0) fragUV: vec2f,
84
- @location(1) fragPosition: vec4f,
85
- @location(2) fragCoordinate: vec4f
86
- };
89
+ // This needs to be aligned with
90
+ // struct FragmentInputs {
91
+ // @location(0) fragUV: vec2f,
92
+ // @location(1) fragPosition: vec4f,
93
+ // @location(2) fragCoordinate: vec4f
94
+ // };
87
95
 
88
96
  @fragment
89
97
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
90
- let texSize = textureDimensions(texture, 0);
91
- var fragColor = textureSample(texture, sampler, fragUV);
92
- fragColor = ${i}(gl_FragColor, texSize, texCoord);
98
+ let fragUV = inputs.uv;
99
+ let fragCoordinate = inputs.coordinate;
100
+ let texSize = vec2f(textureDimensions(texture, 0));
101
+
102
+ var fragColor = textureSample(texture, textureSampler, fragUV);
103
+ fragColor = ${s}(fragColor, texSize, fragCoordinate);
93
104
  return fragColor;
94
105
  }
95
- `}function Qs(i){return`// Binding 0:1 is reserved for shader passes
106
+ `}function fr(s){return`// Binding 0:1 is reserved for shader passes
96
107
  @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
97
108
  @group(0) @binding(1) var texture: texture_2d<f32>;
98
109
  @group(0) @binding(2) var sampler: sampler;
@@ -105,12 +116,12 @@ struct FragmentInputs = {
105
116
 
106
117
  @fragment
107
118
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
108
- let texSize = textureDimensions(texture, 0);
119
+ let texSize = vec2f(textureDimensions(texture, 0));
109
120
  var fragColor = textureSample(texture, sampler, fragUV);
110
- fragColor = ${i}(gl_FragColor, texSize, texCoord);
121
+ fragColor = ${s}(fragColor, texSize, texCoord);
111
122
  return fragColor;
112
123
  }
113
- `}function Js(i){return`#version 300 es
124
+ `}function ur(s){return`#version 300 es
114
125
 
115
126
  uniform sampler2D sourceTexture;
116
127
 
@@ -126,9 +137,9 @@ void main() {
126
137
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
127
138
 
128
139
  fragColor = texture(sourceTexture, texCoord);
129
- fragColor = ${i}(fragColor, texSize, texCoord);
140
+ fragColor = ${s}(fragColor, texSize, texCoord);
130
141
  }
131
- `}function tn(i){return`#version 300 es
142
+ `}function pr(s){return`#version 300 es
132
143
 
133
144
  uniform sampler2D sourceTexture;
134
145
 
@@ -143,9 +154,9 @@ void main() {
143
154
  ivec2 iTexSize = textureSize(sourceTexture, 0);
144
155
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
145
156
 
146
- fragColor = ${i}(sourceTexture, texSize, texCoord);
157
+ fragColor = ${s}(sourceTexture, texSize, texCoord);
147
158
  }
148
- `}var le=class{device;shaderInputs;passRenderers;swapFramebuffers;clipSpace;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(r=>(0,zi.initializeShaderModule)(r));let s=e.shaderPasses.reduce((r,o)=>({...r,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new H(s);let n=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new vt(t,{colorAttachments:[t.preferredColorFormat],width:n[0],height:n[1]}),this.textureModel=new ft(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.clipSpace=new et(t,{source:` @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
159
+ `}var fe=class{device;shaderInputs;passRenderers;swapFramebuffers;clipSpace;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(n=>(0,Hs.initializeShaderModule)(n));let i=e.shaderPasses.reduce((n,o)=>({...n,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new K(i);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new _t(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new gt(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.clipSpace=new st(t,{source:` @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
149
160
  @group(0) @binding(1) var sourceTextureSampler: sampler;
150
161
 
151
162
  @fragment
@@ -157,14 +168,12 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
157
168
 
158
169
  uniform sampler2D sourceTexture;
159
170
  in vec2 uv;
160
- in vec2 coordinate;
161
171
  out vec4 fragColor;
162
172
 
163
173
  void main() {
164
- vec2 texCoord = coordinate;
165
- fragColor = texture(sourceTexture, coordinate);
174
+ fragColor = texture(sourceTexture, uv);
166
175
  }
167
- `}),this.passRenderers=e.shaderPasses.map(r=>new Oe(t,r))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.clipSpace.destroy()}resize(t,e){this.swapFramebuffers.resize({width:t,height:e})}renderToScreen(t){let e=this.renderToTexture(t);if(!e)return!1;let s=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilAttachment:!1}),n=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:s,clearColor:[0,0,0,1],clearDepth:1});return this.clipSpace.setBindings({sourceTexture:e}),this.clipSpace.draw(n),n.end(),!0}renderToTexture(t){let{sourceTexture:e}=t;if(!e.isReady)return null;this.textureModel.destroy(),this.textureModel=new ft(this.device,{backgroundTexture:e});let s=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[0,0,0,1]});this.textureModel.draw(s),s.end();let n=!0;for(let o of this.passRenderers)for(let a of o.subPassRenderers){n||this.swapFramebuffers.swap(),n=!1;let l={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},h=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:h,bindings:l}),h.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},Oe=class{shaderPass;subPassRenderers;constructor(t,e,s={}){this.shaderPass=e;let n=e.passes||[];this.subPassRenderers=n.map(r=>new Re(t,e,r))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},Re=class{model;shaderPass;subPass;constructor(t,e,s){this.shaderPass=e,this.subPass=s;let n=s.action||s.filter&&"filter"||s.sampler&&"sample"||"filter",r=Di({shaderPass:e,action:n,shadingLanguage:t.info.shadingLanguage});this.model=new et(t,{id:`${e.name}-subpass`,source:r,fs:r,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:s}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(s||{}),this.model.draw(e)}};var U=k(j(),1),de=k(ht(),1);var Le=2,en=1e4,ke=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={...ke.defaultProps,...e},e=this.props,this.id=e.id||C("model"),this.device=t,Object.assign(this.userData,e.userData);let s=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]);this.shaderInputs=e.shaderInputs||new H(s),this.setShaderInputs(this.shaderInputs),this.props.shaderLayout||=(0,de.getShaderLayoutFromWGSL)(this.props.source);let n=sn(t),r=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.pipelineFactory=e.pipelineFactory||Q.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||J.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:n,...this.props,modules:r});this.source=o,this._getModuleUniforms=a,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,s,n){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings([]),t.dispatch(e,s,n)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new U.UniformStore(this.shaderInputs.modules);for(let e of Object.keys(this.shaderInputs.modules)){let s=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=s}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),s=Object.keys(e).filter(r=>{let o=e[r];return!St(o)&&typeof o!="number"&&typeof o!="boolean"}),n={};for(let r of s)n[r]=e[r],delete e[r]}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&&(U.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=U.log.level>3?0:en;U.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,U.log.group(Le,`>>> DRAWING MODEL ${this.id}`,{collapsed:U.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();U.log.table(Le,t)(),U.log.groupEnd(Le)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let s=(0,U.getTypedArrayConstructor)(e);return(t instanceof U.Buffer?new s(t.debugData):t).toString()}},Ct=ke;z(Ct,"defaultProps",{...U.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:de.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function sn(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var nn=[0,1,1,1],K=-1,rn={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},_t=`precision highp float;
176
+ `}),this.passRenderers=e.shaderPasses.map(n=>new ke(t,n))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.clipSpace.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 i=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilAttachment:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:i,clearDepth:1});return this.clipSpace.setBindings({sourceTexture:e}),this.clipSpace.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 i=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(i),i.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}},ke=class{shaderPass;subPassRenderers;constructor(t,e,i={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(n=>new Le(t,e,n))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},Le=class{model;shaderPass;subPass;constructor(t,e,i){this.shaderPass=e,this.subPass=i;let r=i.action||i.filter&&"filter"||i.sampler&&"sample"||"filter",n=Xs({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new st(t,{id:`${e.name}-subpass`,source:n,fs:n,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:i}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(i||{}),this.model.draw(e)}};var j=L(B(),1),Ks=L(ht(),1);var Ne=2,mr=1e4,De=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={...De.defaultProps,...e},e=this.props,this.id=e.id||C("model"),this.device=t,Object.assign(this.userData,e.userData);let i=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]);this.shaderInputs=e.shaderInputs||new K(i),this.setShaderInputs(this.shaderInputs),this.props.shaderLayout||=t.getShaderLayout(this.props.source);let r=gr(t),n=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.pipelineFactory=e.pipelineFactory||tt.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||et.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:n});this.source=o,this._getModuleUniforms=a,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,i,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings([]),t.dispatch(e,i,r)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new j.UniformStore(this.shaderInputs.modules);for(let e of Object.keys(this.shaderInputs.modules)){let i=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=i}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),i=Object.keys(e).filter(n=>{let o=e[n];return!It(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let n of i)r[n]=e[n],delete e[n]}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&&(j.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=j.log.level>3?0:mr;j.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,j.log.group(Ne,`>>> DRAWING MODEL ${this.id}`,{collapsed:j.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();j.log.table(Ne,t)(),j.log.groupEnd(Ne)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let i=(0,j.getTypedArrayConstructor)(e);return(t instanceof j.Buffer?new i(t.debugData):t).toString()}},Ot=De;z(Ot,"defaultProps",{...j.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:Ks.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function gr(s){return{type:s.type,shaderLanguage:s.info.shadingLanguage,shaderLanguageVersion:s.info.shadingLanguageVersion,gpu:s.info.gpu,features:s.features}}var xr=[0,1,1,1],Q=-1,yr={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},wt=`precision highp float;
168
177
  precision highp int;
169
178
 
170
179
  uniform pickingUniforms {
@@ -177,7 +186,7 @@ uniform pickingUniforms {
177
186
  int highlightedObjectIndex;
178
187
  vec4 highlightColor;
179
188
  } picking;
180
- `,fe=`struct pickingUniforms {
189
+ `,ue=`struct pickingUniforms {
181
190
  isActive: int32;
182
191
  indexMode: int32;
183
192
  batchIndex: int32;
@@ -187,11 +196,11 @@ uniform pickingUniforms {
187
196
  highlightedObjectIndex: int32;
188
197
  highlightColor: vec4<f32>;
189
198
  } picking;
190
- `;function on(i={},t){let e={...t};switch(i.isActive!==void 0&&(e.isActive=Boolean(i.isActive)),i.indexMode){case"instance":e.indexMode=0;break;case"custom":e.indexMode=1;break;case void 0:break}switch(i.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=K;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=i.highlightedObjectIndex}return typeof i.highlightedBatchIndex=="number"&&(e.highlightedBatchIndex=i.highlightedBatchIndex),i.highlightColor&&(e.highlightColor=i.highlightColor),e}var ue={props:{},uniforms:{},name:"picking",uniformTypes:rn,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!0,highlightedBatchIndex:K,highlightedObjectIndex:K,highlightColor:nn},getUniforms:on};var Ne=class{device;props;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Ne.defaultProps,...e}}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm","rg32sint"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.props.shaderInputs.setProps({picking:{highlightedObjectIndex:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.props.shaderInputs?.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),new Int32Array([-1,-1,0,0])],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),[s,n]=this.getPickPosition(t),r=this.device.readPixelsToArrayWebGL(e,{sourceX:s,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:1});if(!r)return null;let o={objectIndex:r[0]===K?null:r[0],batchIndex:r[1]===K?null:r[1]};return(o.objectIndex!==this.pickInfo.objectIndex||o.batchIndex!==this.pickInfo.batchIndex)&&(this.pickInfo=o,this.props.onObjectPicked(o)),this.props.shaderInputs?.setProps({picking:{isActive:!1,highlightedBatchIndex:o.batchIndex,highlightedObjectIndex:o.objectIndex}}),this.pickInfo}getPickPosition(t){let e=this.device.getDefaultCanvasContext().cssToDevicePixels(t),s=e.x+Math.floor(e.width/2),n=e.y+Math.floor(e.height/2);return[s,n]}},Pt=Ne;z(Pt,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{}});var an=`${fe}
199
+ `;function br(s={},t){let e={...t};switch(s.isActive!==void 0&&(e.isActive=Boolean(s.isActive)),s.indexMode){case"instance":e.indexMode=0;break;case"custom":e.indexMode=1;break;case void 0:break}switch(s.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=Q;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=s.highlightedObjectIndex}return typeof s.highlightedBatchIndex=="number"&&(e.highlightedBatchIndex=s.highlightedBatchIndex),s.highlightColor&&(e.highlightColor=s.highlightColor),e}var pe={props:{},uniforms:{},name:"picking",uniformTypes:yr,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!0,highlightedBatchIndex:Q,highlightedObjectIndex:Q,highlightColor:xr},getUniforms:br};var Fe=class{device;props;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Fe.defaultProps,...e}}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm","rg32sint"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.props.shaderInputs.setProps({picking:{highlightedObjectIndex:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.props.shaderInputs?.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),new Int32Array([-1,-1,0,0])],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),[i,r]=this.getPickPosition(t),n=this.device.readPixelsToArrayWebGL(e,{sourceX:i,sourceY:r,sourceWidth:1,sourceHeight:1,sourceAttachment:1});if(!n)return null;let o={objectIndex:n[0]===Q?null:n[0],batchIndex:n[1]===Q?null:n[1]};return(o.objectIndex!==this.pickInfo.objectIndex||o.batchIndex!==this.pickInfo.batchIndex)&&(this.pickInfo=o,this.props.onObjectPicked(o)),this.props.shaderInputs?.setProps({picking:{isActive:!1,highlightedBatchIndex:o.batchIndex,highlightedObjectIndex:o.objectIndex}}),this.pickInfo}getPickPosition(t){let e=this.device.getDefaultCanvasContext().cssToDevicePixels(t),i=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[i,r]}},kt=Fe;z(kt,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{}});var vr=`${ue}
191
200
 
192
201
  const INDEX_PICKING_MODE_INSTANCE = 0;
193
202
  const INDEX_PICKING_MODE_CUSTOM = 1;
194
- const INDEX_PICKING_INVALID_INDEX = ${K}; // 2^32 - 1
203
+ const INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
195
204
 
196
205
  struct indexPickingFragmentInputs = {
197
206
  objectIndex: int32;
@@ -214,12 +223,12 @@ fn picking_setObjectIndex(objectIndex: int32) {
214
223
  }
215
224
  }
216
225
 
217
- `,cn=`${_t}
226
+ `,Mr=`${wt}
218
227
 
219
228
  const int INDEX_PICKING_MODE_INSTANCE = 0;
220
229
  const int INDEX_PICKING_MODE_CUSTOM = 1;
221
230
 
222
- const int INDEX_PICKING_INVALID_INDEX = ${K}; // 2^32 - 1
231
+ const int INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
223
232
 
224
233
  flat out int picking_objectIndex;
225
234
 
@@ -237,9 +246,9 @@ void picking_setObjectIndex(int objectIndex) {
237
246
  break;
238
247
  }
239
248
  }
240
- `,hn=`${_t}
249
+ `,_r=`${wt}
241
250
 
242
- const int INDEX_PICKING_INVALID_INDEX = ${K}; // 2^32 - 1
251
+ const int INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
243
252
 
244
253
  flat in int picking_objectIndex;
245
254
 
@@ -305,8 +314,8 @@ vec4 picking_filterColor(vec4 color) {
305
314
  outColor = picking_filterPickingColor(outColor);
306
315
  return outColor;
307
316
  }
308
- `,Bi={...ue,name:"picking",source:an,vs:cn,fs:hn};var ln=`${fe}
309
- `,dn=`${_t}
317
+ `,Zs={...pe,name:"picking",source:vr,vs:Mr,fs:_r};var wr=`${ue}
318
+ `,Ar=`${wt}
310
319
  out vec4 picking_vRGBcolor_Avalid;
311
320
 
312
321
  // Normalize unsigned byte color to 0-1 range
@@ -381,7 +390,7 @@ void picking_setPickingAttribute(vec3 value) {
381
390
  picking_vRGBcolor_Avalid.rgb = value;
382
391
  }
383
392
  }
384
- `,fn=`${_t}
393
+ `,Sr=`${wt}
385
394
 
386
395
  in vec4 picking_vRGBcolor_Avalid;
387
396
 
@@ -430,6 +439,6 @@ vec4 picking_filterColor(vec4 color) {
430
439
  vec4 highlightColor = picking_filterHighlightColor(color);
431
440
  return picking_filterPickingColor(highlightColor);
432
441
  }
433
- `,$i={...ue,name:"picking",source:ln,vs:dn,fs:fn};var pe=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(),[s,n]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:s,sourceY:n,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),s=e.x+Math.floor(e.width/2),n=e.y+Math.floor(e.height/2);return[s,n]}};return Qi(Et);})();
442
+ `,Qs={...pe,name:"picking",source:wr,vs:Ar,fs:Sr};var me=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(),[i,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:i,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),i=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[i,r]}};var Tr=q;return li(Lt);})();
434
443
  return __exports__;
435
444
  });