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

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.
package/dist/dist.min.js CHANGED
@@ -4,7 +4,166 @@
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 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 {
7
+ "use strict";var __exports__=(()=>{var hs=Object.create;var Ct=Object.defineProperty;var ls=Object.getOwnPropertyDescriptor;var us=Object.getOwnPropertyNames;var ds=Object.getPrototypeOf,fs=Object.prototype.hasOwnProperty;var ps=(i,t,e)=>t in i?Ct(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var Ve=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),ms=(i,t)=>{for(var e in t)Ct(i,e,{get:t[e],enumerable:!0})},Ut=(i,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of us(t))!fs.call(i,r)&&r!==e&&Ct(i,r,{get:()=>t[r],enumerable:!(s=ls(t,r))||s.enumerable});return i},Vt=(i,t,e)=>(Ut(i,t,"default"),e&&Ut(e,t,"default")),O=(i,t,e)=>(e=i!=null?hs(ds(i)):{},Ut(t||!i||!i.__esModule?Ct(e,"default",{value:i,enumerable:!0}):e,i)),gs=i=>Ut(Ct({},"__esModule",{value:!0}),i);var B=(i,t,e)=>(ps(i,typeof t!="symbol"?t+"":t,e),e);var z=Ve((Vr,je)=>{je.exports=globalThis.luma});var ht=Ve((hn,Ye)=>{Ye.exports=globalThis.luma});var Nt={};ms(Nt,{AnimationLoop:()=>ct,AnimationLoopTemplate:()=>Wt,AsyncTexture:()=>Br,BackgroundTextureModel:()=>bt,BufferTransform:()=>kt,ClipSpace:()=>it,Computation:()=>ut,ConeGeometry:()=>ce,CubeGeometry:()=>he,CylinderGeometry:()=>le,DynamicTexture:()=>Y,GPUGeometry:()=>mt,Geometry:()=>V,GroupNode:()=>wt,IcoSphereGeometry:()=>ue,KeyFrames:()=>Gt,LegacyPickingManager:()=>ye,Model:()=>q,ModelNode:()=>ae,PickingManager:()=>Dt,PipelineFactory:()=>tt,PlaneGeometry:()=>de,ScenegraphNode:()=>rt,ShaderFactory:()=>et,ShaderInputs:()=>Z,ShaderPassRenderer:()=>me,SphereGeometry:()=>fe,Swap:()=>At,SwapBuffers:()=>pe,SwapFramebuffers:()=>St,TextureTransform:()=>Qt,Timeline:()=>jt,TruncatedConeGeometry:()=>ot,cancelAnimationFramePolyfill:()=>Yt,colorPicking:()=>rs,indexPicking:()=>ss,loadImage:()=>ts,loadImageBitmap:()=>Ji,makeAnimationLoop:()=>qe,makeRandomGenerator:()=>Zi,requestAnimationFramePolyfill:()=>qt,setPathPrefix:()=>Qi});Vt(Nt,O(z(),1));var xs=1,ys=1,jt=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:r=1,repeat:n=1}=t,o=xs++,a={time:0,delay:e,duration:s,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,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 r of e)this._setChannelTime(r,this.time);let s=this.animations.values();for(let r of s){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 s=ys++;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,r=t.duration*t.repeat;s>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,s)%t.duration,t.time*=t.rate)}};var Gt=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 r=this.times[this.startIndex],n=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(n-r)),1)}};var Wt=class{constructor(t){}async onInitialize(t){return null}};var Ge=O(z(),1);function qt(i){return typeof window<"u"&&window.requestAnimationFrame?window.requestAnimationFrame(i):setTimeout(i,1e3/60)}function Yt(i){return typeof window<"u"&&window.cancelAnimationFrame?window.cancelAnimationFrame(i):clearTimeout(i)}function It(){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=It(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(It()-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 pt=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,r=this.stats[e];return r||(t instanceof at?r=t:r=new at(e,s),this.stats[e]=r),r}};var bs=0,be=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={...be.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new pt({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=qt(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(Yt(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,r=this.device?.getDefaultCanvasContext().canvas;return r&&r.clientHeight?s=r.clientWidth/r.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=be;B(ct,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:Ge.luma.stats.get(`animation-loop-${bs++}`),autoResizeViewport:!1});var We=O(z(),1);function qe(i,t){let e=null,s=t?.device||We.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new ct({...t,device:s,async onInitialize(n){Ms(n.animationLoop.device);try{return e=new i(n),await e?.onInitialize(n)}catch(o){return vs(n.animationLoop.device,o),null}},onRender:n=>e?.onRender(n),onFinalize:n=>e?.onFinalize(n)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function vs(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 Ms(i){let t=document.getElementById("animation-loop-error");t&&t.remove()}var T=O(z(),1),mi=O(ht(),1);var Pt=O(z(),1);var ve={};function I(i="id"){ve[i]=ve[i]||1;let t=ve[i]++;return`${i}-${t}`}var mt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||I("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&Pt.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 Xe(i,t){if(t instanceof mt)return t;let e=_s(i,t),{attributes:s,bufferLayout:r}=ws(i,t);return new mt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:s})}function _s(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Pt.Buffer.INDEX,data:e})}function ws(i,t){let e=[],s={};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){s[a]=i.createBuffer({data:o.value,id:`${n}-buffer`});let{value:c,size:h,normalized:l}=o;e.push({name:a,format:(0,Pt.getVertexFormatFromAttribute)(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:s,bufferLayout:e,vertexCount:r}}var G=O(z(),1);var Me=class{static getDefaultPipelineFactory(t){let e=t.getModuleData("@luma.gl/engine");return e.defaultPipelineFactory||=new Me(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={...G.RenderPipeline.defaultProps,...t},s=this._renderPipelineCache,r=this._hashRenderPipeline(e),n=s[r]?.pipeline;return n?(s[r].useCount++,this.debug&&G.log.log(3,`${this}: ${s[r].pipeline} reused, count=${s[r].useCount}, (id=${t.id})`)()):(n=this.device.createRenderPipeline({...e,id:e.id?`${e.id}-cached`:I("unnamed-cached")}),n.hash=r,s[r]={pipeline:n,useCount:1},this.debug&&G.log.log(3,`${this}: ${n} created, count=${s[r].useCount}`)()),n}createComputePipeline(t){if(!this.cachingEnabled)return this.device.createComputePipeline(t);let e={...G.ComputePipeline.defaultProps,...t},s=this._computePipelineCache,r=this._hashComputePipeline(e),n=s[r]?.pipeline;return n?(s[r].useCount++,this.debug&&G.log.log(3,`${this}: ${s[r].pipeline} reused, count=${s[r].useCount}, (id=${t.id})`)()):(n=this.device.createComputePipeline({...e,id:e.id?`${e.id}-cached`:void 0}),n.hash=r,s[r]={pipeline:n,useCount:1},this.debug&&G.log.log(3,`${this}: ${n} created, count=${s[r].useCount}`)()),n}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&&G.log.log(3,`${this}: ${t} released and destroyed`)()):e[s].useCount<0?(G.log.error(`${this}: ${t} released, useCount < 0, resetting`)(),e[s].useCount=0):this.debug&&G.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 G.ComputePipeline&&(e=this._computePipelineCache),t instanceof G.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,r="-",n=this._getHash(JSON.stringify(t.bufferLayout)),{type:o}=this.device;switch(o){case"webgl":return`${o}/R/${e}/${s}V${r}BL${n}`;case"webgpu":default:let a=this._getHash(JSON.stringify(t.parameters));return`${o}/R/${e}/${s}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=Me;B(tt,"defaultProps",{...G.RenderPipeline.defaultProps});var lt=O(z(),1);var _e=class{static getDefaultShaderFactory(t){let e=t.getModuleData("@luma.gl/engine");return e.defaultShaderFactory||=new _e(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),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 r=this.device.createShader({...t,id:t.id?`${t.id}-cached`:void 0});this._cache[e]=s={shader:r,useCount:1},this.debug&&lt.log.log(3,`${this}: Created new shader ${r.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}`}},et=_e;B(et,"defaultProps",{...lt.Shader.defaultProps});function He(i,t){let e={},s="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[s]:"N/A"}};for(let r of i.attributes)if(r){let n=`${r.location} ${r.name}: ${r.type}`;e[`in ${n}`]={[s]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let n=`${r.location} ${r.name}`;e[`out ${n}`]={[s]:JSON.stringify(r)}}return e}var D=null,we=null;function Ke(i,{id:t,minimap:e,opaque:s,top:r="0",left:n="0",rgbaScale:o=1}){D||(D=document.createElement("canvas"),D.id=t,D.title=t,D.style.zIndex="100",D.style.position="absolute",D.style.top=r,D.style.left=n,D.style.border="blue 5px solid",D.style.transform="scaleY(-1)",document.body.appendChild(D),we=D.getContext("2d")),(D.width!==i.width||D.height!==i.height)&&(D.width=i.width/2,D.height=i.height/2,D.style.width="400px",D.style.height="400px");let a=i.device.readPixelsToArrayWebGL(i),c=we?.createImageData(i.width,i.height);if(c){for(let l=0;l<a.length;l+=4)c.data[0+l+0]=a[l+0]*o,c.data[0+l+1]=a[l+1]*o,c.data[0+l+2]=a[l+2]*o,c.data[0+l+3]=s?255:a[l+3]*o;we?.putImageData(c,0,0)}}function Xt(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(!Xt(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),r=Object.keys(t);if(s.length!==r.length)return!1;for(let n of s)if(!t.hasOwnProperty(n)||!Xt(i[n],t[n],e-1))return!1;return!0}return!1}var Ze=O(z(),1),gt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let s=[...t];for(let r of e){let n=s.findIndex(o=>o.name===r.name);n<0?s.push(r):s[n]=r}return s}getBufferIndex(t){let e=this.bufferLayouts.findIndex(s=>s.name===t);return e===-1&&Ze.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Qe(i,t){let e=1/0;for(let s of i){let r=t[s];r!==void 0&&(e=Math.min(e,r))}return e}function Je(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),s=t.slice();return s.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=Qe(o,e),h=Qe(a,e);return c-h}),s}var Ht=O(z(),1),si=O(ht(),1);function ti(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function ei(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function Et(i){return ti(i)||ei(i)}function As(i){return Et(i)||typeof i=="number"||typeof i=="boolean"}function ii(i){let t={bindings:{},uniforms:{}};return Object.keys(i).forEach(e=>{let s=i[e];As(s)?t.uniforms[e]=s:t.bindings[e]=s}),t}var Z=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let s=(0,si.getShaderModuleDependencies)(Object.values(t).filter(r=>r.dependencies));for(let r of s)t[r.name]=r;Ht.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&&Ht.log.warn(`Module name: ${r} vs ${n.name}`)()}destroy(){}setProps(t){for(let e of Object.keys(t)){let s=e,r=t[s]||{},n=this.modules[s];if(!n){this.options.disableWarnings||Ht.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[s],a=this.moduleBindings[s],c=n.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=ii(c);this.moduleUniforms[s]={...o,...h},this.moduleBindings[s]={...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,s]of Object.entries(this.moduleUniforms))for(let[r,n]of Object.entries(s))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 N=O(z(),1);var Ot=O(z(),1);var Ae={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Lt(i){return i?Array.isArray(i)?i[0]??null:i:null}function ri(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let s=Lt(e);if(!s)return null;let{width:r}=Rt(s);return{width:r,height:1}}case"2d":{let s=Lt(e);return s?Rt(s):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let s=Lt(e[0]);return s?Rt(s):null}case"cube":{let s=Object.keys(e)[0]??null;if(!s)return null;let r=e[s],n=Lt(r);return n?Rt(n):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let s=e[0],r=Object.keys(s)[0]??null;if(!r)return null;let n=Lt(s[r]);return n?Rt(n):null}default:return null}}function Rt(i){if((0,Ot.isExternalImage)(i))return(0,Ot.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function Ss(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function ni(i){let t=Ae[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function Ts(i,t){return 6*i+ni(t)}function oi(i){throw new Error("setTexture1DData not supported in WebGL.")}function Cs(i){return Array.isArray(i)?i:[i]}function xt(i,t){let e=Cs(t),s=i,r=[];for(let n=0;n<e.length;n++){let o=e[n];if((0,Ot.isExternalImage)(o))r.push({type:"external-image",image:o,z:s,mipLevel:n});else if(Ss(o))r.push({type:"texture-data",data:o,z:s,mipLevel:n});else throw new Error("Unsupported 2D mip-level payload")}return r}function ai(i){let t=[];for(let e=0;e<i.length;e++)t.push(...xt(e,i[e]));return t}function ci(i){let t=[];for(let e=0;e<i.length;e++)t.push(...xt(e,i[e]));return t}function hi(i){let t=[];for(let[e,s]of Object.entries(i)){let r=ni(e);t.push(...xt(r,s))}return t}function li(i){let t=[];return i.forEach((e,s)=>{for(let[r,n]of Object.entries(e)){let o=Ts(s,r);t.push(...xt(o,n))}}),t}var dt=O(z(),1);var U=O(z(),1),ui=O(ht(),1);var Se=2,Is=1e4,Te=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={...Te.defaultProps,...e},e=this.props,this.id=e.id||I("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 Z(s),this.setShaderInputs(this.shaderInputs),this.props.shaderLayout||=t.getShaderLayout(this.props.source);let r=Ps(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,s,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings([]),t.dispatch(e,s,r)}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(n=>{let o=e[n];return!Et(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let n of s)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&&(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:Is;U.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,U.log.group(Se,`>>> DRAWING MODEL ${this.id}`,{collapsed:U.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();U.log.table(Se,t)(),U.log.groupEnd(Se)(),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()}},ut=Te;B(ut,"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:ui.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function Ps(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Es=["2d","2d-array","cube","cube-array"],yt={x:4,y:4,z:4};function di(i,t){if(!(t.mipLevels<=1)){if(i.type!=="webgpu")throw new Error(`Cannot generate mipmaps on device type "${i.type}". Use generateMipmapsWebGL for WebGL devices.`);if(t.dimension==="3d"){Rs(i,t);return}if(Es.includes(t.dimension)){Ls(i,t);return}throw new Error(`Cannot generate mipmaps for texture dimension "${t.dimension}" with WebGPU.`)}}function Ls(i,t){Kt(i,t,["render","filter"],"render");let e=fi(t.format,"render",t.dimension),s=t.dimension,r=ks(s),n=i.createSampler({minFilter:"linear",magFilter:"linear"}),o=new Uint32Array(1),a=i.createBuffer({byteLength:16,usage:dt.Buffer.UNIFORM|dt.Buffer.COPY_DST}),c=new q(i,{source:r,colorAttachmentFormats:[e],topology:"triangle-list",vertexCount:3,shaderLayout:{attributes:[],bindings:[{type:"sampler",name:"sourceSampler",group:0,location:0},{type:"texture",name:"sourceTexture",group:0,location:1,viewDimension:s,sampleType:"float"},{type:"uniform",name:"uniforms",group:0,location:2}]},bindings:{sourceSampler:n,sourceTexture:t,uniforms:a}}),h=t.width,l=t.height,u=t.dimension==="2d"?1:t.depth;try{for(let d=1;d<t.mipLevels;++d){Kt(i,t,["render","filter"],"render");let m=d-1,x=Math.max(1,h>>1),f=Math.max(1,l>>1),y=t.createView({dimension:s,baseMipLevel:m,mipLevelCount:1,baseArrayLayer:0,arrayLayerCount:t.depth});c.setBindings({sourceTexture:y});for(let b=0;b<u;++b){o[0]=b,a.write(o);let _=t.createView({dimension:"2d",baseMipLevel:d,mipLevelCount:1,baseArrayLayer:b,arrayLayerCount:1}),p=i.createFramebuffer({colorAttachments:[_]}),g=i.beginRenderPass({id:`mipmap-generation:${t.format}:${d}:${b}`,framebuffer:p});g.setParameters({viewport:[0,0,x,f,0,1],scissorRect:[0,0,x,f]}),c.draw(g),g.end(),i.submit(),_.destroy(),p.destroy()}y.destroy(),h=x,l=f}}finally{c.destroy(),n.destroy(),a.destroy()}}function fi(i,t,e){if(dt.textureFormatDecoder.isColor(i))return i;throw new Error(`Cannot run ${t} mipmap generation for ${e} texture with format "${i}". Only color textures can be used for this operation. Required capabilities: color. Actual capabilities: color=false.`)}function Rs(i,t){Kt(i,t,["filter","store"],"compute");let e=fi(t.format,"compute",t.dimension),s=Ns(e),r=i.createBuffer({byteLength:32,usage:dt.Buffer.UNIFORM|dt.Buffer.COPY_DST}),n=new Uint32Array(8),o=t.width,a=t.height,c=t.depth;try{for(let h=1;h<t.mipLevels;++h){Kt(i,t,["filter","store"],"compute");let l=Math.max(1,o>>1),u=Math.max(1,a>>1),d=Math.max(1,c>>1);n[0]=o,n[1]=a,n[2]=c,n[3]=l,n[4]=u,n[5]=d,n[6]=0,r.write(n);let m=t.createView({dimension:"3d",baseMipLevel:h-1,mipLevelCount:1,baseArrayLayer:0,arrayLayerCount:1}),x=t.createView({dimension:"3d",baseMipLevel:h,mipLevelCount:1,baseArrayLayer:0,arrayLayerCount:1}),f=new ut(i,{source:s,shaderLayout:{bindings:[{type:"texture",name:"sourceTexture",group:0,location:0,viewDimension:"3d",sampleType:"float"},{type:"storage",name:"destinationTexture",group:0,location:1,format:e,viewDimension:"3d",access:"write-only"},{type:"uniform",name:"uniforms",group:0,location:2}]},bindings:{sourceTexture:m,destinationTexture:x,uniforms:r}}),y=Math.ceil(l/yt.x),b=Math.ceil(u/yt.y),_=Math.ceil(d/yt.z),p=i.beginComputePass({});f.dispatch(p,y,b,_),p.end(),i.submit(),f.destroy(),m.destroy(),x.destroy(),o=l,a=u,c=d}}finally{r.destroy()}}function Kt(i,t,e,s){let{format:r,dimension:n}=t,o=i.getTextureFormatCapabilities(r);if(e.filter(c=>!o[c]).length>0){let c=e.join(" + "),h=e.map(l=>`${l}=${o[l]}`).join(", ");throw new Error(`Cannot run ${s} mipmap generation for ${n} texture with format "${r}". Required capabilities: ${c}. Actual capabilities: ${h}.`)}}function Os(i){switch(i){case"2d":return"texture_2d<f32>";case"2d-array":return"texture_2d_array<f32>";case"cube":return"texture_cube<f32>";case"cube-array":return"texture_cube_array<f32>";default:throw new Error(`Unsupported render dimension "${i}" for mipmap generation.`)}}function ks(i){let t=Ds(i);return`
8
+ struct MipmapUniforms {
9
+ sourceLayer: u32,
10
+ };
11
+
12
+ fn _touchUniform(uniforms: MipmapUniforms) {
13
+ let unusedSourceLayer = uniforms.sourceLayer;
14
+ }
15
+
16
+ const faceMat = array(
17
+ mat3x3f(
18
+ 0.0, 0.0, -2.0,
19
+ 0.0, -2.0, 0.0,
20
+ 1.0, 1.0, 1.0
21
+ ), // pos-x
22
+ mat3x3f(
23
+ 0.0, 0.0, 2.0,
24
+ 0.0, -2.0, 0.0,
25
+ -1.0, 1.0, -1.0
26
+ ), // neg-x
27
+ mat3x3f(
28
+ 2.0, 0.0, 0.0,
29
+ 0.0, 0.0, 2.0,
30
+ -1.0, 1.0, -1.0
31
+ ), // pos-y
32
+ mat3x3f(
33
+ 2.0, 0.0, 0.0,
34
+ 0.0, 0.0, -2.0,
35
+ -1.0, -1.0, 1.0
36
+ ), // neg-y
37
+ mat3x3f(
38
+ 2.0, 0.0, 0.0,
39
+ 0.0, -2.0, 0.0,
40
+ -1.0, 1.0, 1.0
41
+ ), // pos-z
42
+ mat3x3f(
43
+ -2.0, 0.0, 0.0,
44
+ 0.0, -2.0, 0.0,
45
+ 1.0, 1.0, -1.0
46
+ ) // neg-z
47
+ );
48
+
49
+ struct FragmentInputs {
50
+ @builtin(position) position: vec4f,
51
+ @location(0) texcoord: vec2f
52
+ };
53
+
54
+ struct VertexOutput {
55
+ @builtin(position) position: vec4f,
56
+ @location(0) texcoord: vec2f
57
+ };
58
+
59
+ @group(0) @binding(0) var sourceSampler: sampler;
60
+ @group(0) @binding(1) var sourceTexture: ${Os(i)};
61
+ @group(0) @binding(2) var<uniform> uniforms: MipmapUniforms;
62
+
63
+ @vertex
64
+ fn vertexMain(
65
+ @builtin(vertex_index) vertexIndex: u32
66
+ ) -> VertexOutput {
67
+ const positions = array(
68
+ vec2f(-1.0, -1.0),
69
+ vec2f(-1.0, 3.0),
70
+ vec2f( 3.0, -1.0)
71
+ );
72
+
73
+ let xy = positions[vertexIndex];
74
+ return VertexOutput(
75
+ vec4f(xy, 0.0, 1.0),
76
+ xy * vec2f(0.5, -0.5) + vec2f(0.5)
77
+ );
78
+ }
79
+
80
+ @fragment
81
+ fn fragmentMain(fsInput: VertexOutput) -> @location(0) vec4f {
82
+ _touchUniform(uniforms);
83
+ return ${t};
84
+ }
85
+ `}function Ds(i){let t="uniforms.sourceLayer";switch(i){case"2d":return"textureSampleLevel(sourceTexture, sourceSampler, fsInput.texcoord, 0.0)";case"2d-array":return`textureSampleLevel(sourceTexture, sourceSampler, fsInput.texcoord, i32(${t}), 0.0)`;case"cube":return`textureSampleLevel(sourceTexture, sourceSampler, faceMat[i32(${t})] * vec3f(fract(fsInput.texcoord), 1.0), 0.0)`;case"cube-array":return`textureSampleLevel(sourceTexture, sourceSampler, faceMat[i32(${t} % 6u)] * vec3f(fract(fsInput.texcoord), 1.0), i32(${t} / 6u), 0.0)`;default:throw new Error(`Unsupported render dimension "${i}" for mipmap generation.`)}}function Ns(i){return`
86
+ struct MipmapUniforms {
87
+ sourceWidth: u32,
88
+ sourceHeight: u32,
89
+ sourceDepth: u32,
90
+ destinationWidth: u32,
91
+ destinationHeight: u32,
92
+ destinationDepth: u32,
93
+ padding: u32,
94
+ };
95
+
96
+ @group(0) @binding(0) var sourceTexture: texture_3d<f32>;
97
+ @group(0) @binding(1) var destinationTexture: texture_storage_3d<${i}, write>;
98
+ @group(0) @binding(2) var<uniform> uniforms: MipmapUniforms;
99
+
100
+ @compute @workgroup_size(${yt.x}, ${yt.y}, ${yt.z})
101
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
102
+ if (
103
+ id.x >= uniforms.destinationWidth ||
104
+ id.y >= uniforms.destinationHeight ||
105
+ id.z >= uniforms.destinationDepth
106
+ ) {
107
+ return;
108
+ }
109
+
110
+ let sourceBase = id * 2u;
111
+ let sourceX0 = min(sourceBase.x, uniforms.sourceWidth - 1u);
112
+ let sourceY0 = min(sourceBase.y, uniforms.sourceHeight - 1u);
113
+ let sourceZ0 = min(sourceBase.z, uniforms.sourceDepth - 1u);
114
+
115
+ let sourceX1 = min(sourceBase.x + 1u, uniforms.sourceWidth - 1u);
116
+ let sourceY1 = min(sourceBase.y + 1u, uniforms.sourceHeight - 1u);
117
+ let sourceZ1 = min(sourceBase.z + 1u, uniforms.sourceDepth - 1u);
118
+
119
+ var sum = textureLoad(
120
+ sourceTexture,
121
+ vec3<i32>(i32(sourceX0), i32(sourceY0), i32(sourceZ0)),
122
+ 0
123
+ );
124
+ sum += textureLoad(
125
+ sourceTexture,
126
+ vec3<i32>(i32(sourceX1), i32(sourceY0), i32(sourceZ0)),
127
+ 0
128
+ );
129
+ sum += textureLoad(
130
+ sourceTexture,
131
+ vec3<i32>(i32(sourceX0), i32(sourceY1), i32(sourceZ0)),
132
+ 0
133
+ );
134
+ sum += textureLoad(
135
+ sourceTexture,
136
+ vec3<i32>(i32(sourceX1), i32(sourceY1), i32(sourceZ0)),
137
+ 0
138
+ );
139
+ sum += textureLoad(
140
+ sourceTexture,
141
+ vec3<i32>(i32(sourceX0), i32(sourceY0), i32(sourceZ1)),
142
+ 0
143
+ );
144
+ sum += textureLoad(
145
+ sourceTexture,
146
+ vec3<i32>(i32(sourceX1), i32(sourceY0), i32(sourceZ1)),
147
+ 0
148
+ );
149
+ sum += textureLoad(
150
+ sourceTexture,
151
+ vec3<i32>(i32(sourceX0), i32(sourceY1), i32(sourceZ1)),
152
+ 0
153
+ );
154
+ sum += textureLoad(
155
+ sourceTexture,
156
+ vec3<i32>(i32(sourceX1), i32(sourceY1), i32(sourceZ1)),
157
+ 0
158
+ );
159
+
160
+ textureStore(
161
+ destinationTexture,
162
+ vec3<i32>(i32(id.x), i32(id.y), i32(id.z)),
163
+ vec4<f32>(sum.xyz / 8.0, sum.w / 8.0)
164
+ );
165
+ }
166
+ `}var Ce=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 s=I("dynamic-texture"),r=e;this.props={...Ce.defaultProps,id:s,...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=ri(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};if(this.device.type==="webgpu"&&this.props.mipmaps){let h=this.props.dimension==="3d"?N.Texture.SAMPLE|N.Texture.STORAGE|N.Texture.COPY_DST|N.Texture.COPY_SRC:N.Texture.SAMPLE|N.Texture.RENDER|N.Texture.COPY_DST|N.Texture.COPY_SRC;n.usage|=h}let 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),N.log.info(0,`${this} created`)()}catch(e){let s=e instanceof Error?e:new Error(String(e));throw this.rejectReady(s),s}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?di(this.device,this.texture):N.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof N.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(),N.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=Ae[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=oi(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let s=xt(e,t);this._setTextureSubresources(s)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=ai(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=ci(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=hi(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=li(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:s,mipLevel:r}=e;switch(e.type){case"external-image":let{image:n,flipY:o}=e;this.texture.copyExternalImage({image:n,z:s,mipLevel:r,flipY:o});break;case"texture-data":let{data:a}=e;this.texture.writeData(Fs(this.texture,a),{x:0,y:0,z:s,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await pi(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&N.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||N.log.warn(`${this} Cannot perform this operation before ready`)}},Y=Ce;B(Y,"defaultProps",{...N.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function Fs(i,t){let{width:e,height:s,data:r}=t,{bytesPerPixel:n}=i.device.getTextureFormatInfo(i.format),o=e*n,a=Math.ceil(o/i.byteAlignment)*i.byteAlignment;if(a===o)return r;let c=new Uint8Array(r.buffer,r.byteOffset,r.byteLength),h=new Uint8Array(a*s);for(let l=0;l<s;l++){let u=l*o,d=l*a;h.set(c.subarray(u,u+o),d)}return h}async function pi(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map(pi));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t)),s=Object.keys(t),r={};for(let n=0;n<s.length;n++)r[s[n]]=e[n];return r}return i}var ft=2,zs=1e4,Ie=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={...Ie.defaultProps,...e},e=this.props,this.id=e.id||I("model"),this.device=t,Object.assign(this.userData,e.userData);let s=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new Z(s,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let n=Bs(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(ft,`>>> 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 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;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&&Xe(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let s=new gt(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 gt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){Xt(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,s]of Object.entries(this.shaderInputs.modules))if($s(s)){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 s=e?.disableWarnings??this.props.disableWarnings;t.indices&&T.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Je(this.pipeline.shaderLayout,this.bufferLayout);let r=new gt(this.bufferLayout);for(let[n,o]of Object.entries(t)){let a=r.getBufferLayout(n);if(!a){s||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 u=this._attributeInfos[l];if(u){let d=this.device.type==="webgpu"?r.getBufferIndex(u.bufferName):u.location;this.vertexArray.setBuffer(d,o),h=!0}}!h&&!s&&T.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${n}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[s,r]of Object.entries(t)){let n=this._attributeInfos[s];n?this.vertexArray.setConstantWebGL(n.location,r):(e?.disableWarnings??this.props.disableWarnings)||T.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 Y&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,s]of Object.entries(this.bindings))s instanceof Y?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 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 Y?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[s]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.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&&(T.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}),r=null;this.source?r=s: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:s,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:zs;T.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,T.log.group(ft,`>>> DRAWING MODEL ${this.id}`,{collapsed:T.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=He(this.pipeline.shaderLayout,this.id);T.log.table(ft,t)();let e=this.shaderInputs.getDebugTable();T.log.table(ft,e)();let s=this._getAttributeDebugTable();T.log.table(ft,this._attributeInfos)(),T.log.table(ft,s)(),T.log.groupEnd(ft)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let s=t.props.framebuffer;s&&Ke(s,{id:s.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,s]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[s.location];t[s.location]={name:e,type:s.shaderType,values:r?this._getBufferOrConstantValues(r,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,T.getTypedArrayConstructor)(e);return(t instanceof T.Buffer?new s(t.debugData):t).toString()}},q=Ie;B(q,"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:mi.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function $s(i){return Boolean(i.uniformTypes&&!Us(i.uniformTypes))}function Bs(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}function Us(i){for(let t in i)return!1;return!0}var gi=O(z(),1),xi=O(ht(),1);var Zt=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=Zt.defaultProps){if(!Zt.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new q(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,xi.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 gi.Buffer)return e.readAsync();let{buffer:s,byteOffset:r=0,byteLength:n=s.byteLength}=e;return s.readAsync(r,n)}},kt=Zt;B(kt,"defaultProps",{...q.defaultProps,outputs:void 0,feedbackBuffers:void 0});var yi=O(ht(),1);var Vs="transform_output",Qt=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 q(this.device,{id:e.id||I("texture-transform-model"),fs:e.fs||(0,yi.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:Vs}),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:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,s),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 s in e)e[s].sampler=this.sampler}};var V=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:s=null,vertexCount:r=null}=t;this.id=t.id||I("geometry"),this.topology=t.topology,s&&(this.indices=ArrayBuffer.isView(s)?{value:s,size:1}:s),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 s=1/0;for(let r of Object.values(t)){let{value:n,size:o,constant:a}=r;!a&&n&&o!==void 0&&o>=1&&(s=Math.min(s,n.length/o))}return s}};var js=`struct VertexInputs {
8
167
  @location(0) clipSpacePosition: vec2<f32>,
9
168
  @location(1) texCoord: vec2<f32>,
10
169
  @location(2) coordinate: vec2<f32>
@@ -26,7 +185,7 @@ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
26
185
  outputs.uv = inputs.texCoord;
27
186
  return outputs;
28
187
  }
29
- `,Ci=`#version 300 es
188
+ `,Gs=`#version 300 es
30
189
  in vec2 clipSpacePositions;
31
190
  in vec2 texCoords;
32
191
  in vec2 coordinates;
@@ -41,8 +200,8 @@ void main(void) {
41
200
  coordinate = coordinates;
42
201
  uv = texCoords;
43
202
  }
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>;
203
+ `,bi=[-1,-1,1,-1,-1,1,1,1],it=class extends q{constructor(t,e){let s=bi.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${js}
204
+ ${e.source}`}),super(t,{id:e.id||I("clip-space"),...e,vs:Gs,vertexCount:4,geometry:new V({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(bi)},texCoords:{size:2,value:new Float32Array(s)},coordinates:{size:2,value:new Float32Array(s)}}})})}};var Ws={name:"background",uniformTypes:{scale:"vec2<f32>"}},qs=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
46
205
  @group(0) @binding(1) var backgroundTextureSampler: sampler;
47
206
  struct backgroundUniforms {
48
207
  scale: vec2<f32>,
@@ -60,7 +219,7 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
60
219
  let position: vec2<f32> = billboardTexture_getTextureUV(inputs.coordinate);
61
220
  return textureSample(backgroundTexture, backgroundTextureSampler, position);
62
221
  }
63
- `,Ri=`#version 300 es
222
+ `,Ys=`#version 300 es
64
223
  precision highp float;
65
224
 
66
225
  uniform sampler2D backgroundTexture;
@@ -81,7 +240,7 @@ void main(void) {
81
240
  vec2 position = billboardTexture_getTextureUV(coordinate);
82
241
  fragColor = texture(backgroundTexture, position);
83
242
  }
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
243
+ `,bt=class extends it{backgroundTexture=null;constructor(t,e){if(super(t,{id:e.id||"background-texture-model",source:qs,fs:Ys,modules:[Ws],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 s=e instanceof Y?e.texture:e;this.backgroundTexture=s,this.updateScale(s)}else e.ready.then(s=>{this.backgroundTexture=s,this.updateScale(s)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,s]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,n=t.height,o=e/s,a=r/n,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var Mo=1/Math.PI*180,_o=1/180*Math.PI,Xs={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Xs}};var $=globalThis.mathgl.config;function vi(i,{precision:t=$.precision}={}){return i=Hs(i),`${parseFloat(i.toPrecision(t))}`}function vt(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Pe(i,t,e){let s=$.EPSILON;e&&($.EPSILON=e);try{if(i===t)return!0;if(vt(i)&&vt(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!Pe(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=$.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{$.EPSILON=s}}function Hs(i){return Math.round(i/$.EPSILON)*$.EPSILON}var Mt=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:vt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString($)}formatString(t){let e="";for(let s=0;s<this.ELEMENTS;++s)e+=(s>0?", ":"")+vi(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(!Pe(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 r=0;r<this.ELEMENTS;++r){let n=t[r],o=typeof e=="number"?e:e[r];this[r]=n+s*(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 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($.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 Ks(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 j(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function Jt(i,t,e=""){if($.debug&&!Ks(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function Ee(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var te=class extends Mt{get x(){return this[0]}set x(t){this[0]=j(t)}get y(){return this[1]}set y(t){this[1]=j(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 r=this[s]-t[s];e+=r*r}return j(e)}dot(t){let e=0;for(let s=0;s<this.ELEMENTS;++s)e+=this[s]*t[s];return j(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 Ee(t>=0&&t<this.ELEMENTS,"index is out of range"),j(this[t])}setComponent(t,e){return Ee(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 st=typeof Float32Array<"u"?Float32Array:Array;var Oo=Math.PI/180;function Zs(){let i=new st(2);return st!=Float32Array&&(i[0]=0,i[1]=0),i}function wi(i,t,e){let s=t[0],r=t[1];return i[0]=e[0]*s+e[4]*r+e[12],i[1]=e[1]*s+e[5]*r+e[13],i}var ko=function(){let i=Zs();return function(t,e,s,r,n,o){let a,c;for(e||(e=2),s||(s=0),r?c=Math.min(r*e+s,t.length):c=t.length,a=s;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],n(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function Ai(i,t,e){let s=t[0],r=t[1],n=e[3]*s+e[7]*r||1;return i[0]=(e[0]*s+e[4]*r)/n,i[1]=(e[1]*s+e[5]*r)/n,i}function ee(i,t,e){let s=t[0],r=t[1],n=t[2],o=e[3]*s+e[7]*r+e[11]*n||1;return i[0]=(e[0]*s+e[4]*r+e[8]*n)/o,i[1]=(e[1]*s+e[5]*r+e[9]*n)/o,i[2]=(e[2]*s+e[6]*r+e[10]*n)/o,i}function Si(i,t,e){let s=t[0],r=t[1];return i[0]=e[0]*s+e[2]*r,i[1]=e[1]*s+e[3]*r,i[2]=t[2],i}function Qs(){let i=new st(3);return st!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Js(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Ti(i,t,e){let s=t[0],r=t[1],n=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-n*a,i[1]=n*o-s*c,i[2]=s*a-r*o,i}function ie(i,t,e){let s=t[0],r=t[1],n=t[2],o=e[3]*s+e[7]*r+e[11]*n+e[15];return o=o||1,i[0]=(e[0]*s+e[4]*r+e[8]*n+e[12])/o,i[1]=(e[1]*s+e[5]*r+e[9]*n+e[13])/o,i[2]=(e[2]*s+e[6]*r+e[10]*n+e[14])/o,i}function Ci(i,t,e){let s=t[0],r=t[1],n=t[2];return i[0]=s*e[0]+r*e[3]+n*e[6],i[1]=s*e[1]+r*e[4]+n*e[7],i[2]=s*e[2]+r*e[5]+n*e[8],i}function Ii(i,t,e){let s=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,u=n*a-s*h,d=s*c-r*a,m=r*d-n*u,x=n*l-s*d,f=s*u-r*l,y=o*2;return l*=y,u*=y,d*=y,m*=2,x*=2,f*=2,i[0]=a+l+m,i[1]=c+u+x,i[2]=h+d+f,i}function Pi(i,t,e,s){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(s)-r[2]*Math.sin(s),n[2]=r[1]*Math.sin(s)+r[2]*Math.cos(s),i[0]=n[0]+e[0],i[1]=n[1]+e[1],i[2]=n[2]+e[2],i}function Ei(i,t,e,s){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(s)+r[0]*Math.cos(s),n[1]=r[1],n[2]=r[2]*Math.cos(s)-r[0]*Math.sin(s),i[0]=n[0]+e[0],i[1]=n[1]+e[1],i[2]=n[2]+e[2],i}function Li(i,t,e,s){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(s)-r[1]*Math.sin(s),n[1]=r[0]*Math.sin(s)+r[1]*Math.cos(s),n[2]=r[2],i[0]=n[0]+e[0],i[1]=n[1]+e[1],i[2]=n[2]+e[2],i}function Ri(i,t){let e=i[0],s=i[1],r=i[2],n=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+s*s+r*r)*(n*n+o*o+a*a)),h=c&&Js(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var Fo=function(){let i=Qs();return function(t,e,s,r,n,o){let a,c;for(e||(e=3),s||(s=0),r?c=Math.min(r*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],n(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var Re=[0,0,0],se,W=class extends te{static get ZERO(){return se||(se=new W(0,0,0),Object.freeze(se)),se}constructor(t=0,e=0,s=0){super(-0,-0,-0),arguments.length===1&&vt(t)?this.copy(t):($.debug&&(j(t),j(e),j(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 $.debug&&(j(t.x),j(t.y),j(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]=j(t)}angle(t){return Ri(this,t)}cross(t){return Ti(this,this,t),this.check()}rotateX({radians:t,origin:e=Re}){return Pi(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Re}){return Ei(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Re}){return Li(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return ie(this,this,t),this.check()}transformAsVector(t){return ee(this,this,t),this.check()}transformByMatrix3(t){return Ci(this,this,t),this.check()}transformByMatrix2(t){return Si(this,this,t),this.check()}transformByQuaternion(t){return Ii(this,this,t),this.check()}};var re=class extends Mt{toString(){let t="[";if($.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]=j(s),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let s=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[s+r];return e}setColumn(t,e){let s=t*this.RANK;for(let r=0;r<this.RANK;++r)this[s+r]=e[r];return this}};function tr(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 Oi(i,t){if(i===t){let e=t[1],s=t[2],r=t[3],n=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]=n,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function ki(i,t){let e=t[0],s=t[1],r=t[2],n=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],u=t[9],d=t[10],m=t[11],x=t[12],f=t[13],y=t[14],b=t[15],_=e*a-s*o,p=e*c-r*o,g=e*h-n*o,v=s*c-r*a,M=s*h-n*a,C=r*h-n*c,L=l*f-u*x,P=l*y-d*x,R=l*b-m*x,w=u*y-d*f,S=u*b-m*f,E=d*b-m*y,A=_*E-p*S+g*w+v*R-M*P+C*L;return A?(A=1/A,i[0]=(a*E-c*S+h*w)*A,i[1]=(r*S-s*E-n*w)*A,i[2]=(f*C-y*M+b*v)*A,i[3]=(d*M-u*C-m*v)*A,i[4]=(c*R-o*E-h*P)*A,i[5]=(e*E-r*R+n*P)*A,i[6]=(y*g-x*C-b*p)*A,i[7]=(l*C-d*g+m*p)*A,i[8]=(o*S-a*R+h*L)*A,i[9]=(s*R-e*S-n*L)*A,i[10]=(x*M-f*g+b*_)*A,i[11]=(u*g-l*M-m*_)*A,i[12]=(a*P-o*w-c*L)*A,i[13]=(e*w-s*P+r*L)*A,i[14]=(f*p-x*v-y*_)*A,i[15]=(l*v-u*p+d*_)*A,i):null}function Di(i){let t=i[0],e=i[1],s=i[2],r=i[3],n=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],u=i[10],d=i[11],m=i[12],x=i[13],f=i[14],y=i[15],b=t*o-e*n,_=t*a-s*n,p=e*a-s*o,g=h*x-l*m,v=h*f-u*m,M=l*f-u*x,C=t*M-e*v+s*g,L=n*M-o*v+a*g,P=h*p-l*_+u*b,R=m*p-x*_+f*b;return c*C-r*L+y*P-d*R}function Oe(i,t,e){let s=t[0],r=t[1],n=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],u=t[8],d=t[9],m=t[10],x=t[11],f=t[12],y=t[13],b=t[14],_=t[15],p=e[0],g=e[1],v=e[2],M=e[3];return i[0]=p*s+g*a+v*u+M*f,i[1]=p*r+g*c+v*d+M*y,i[2]=p*n+g*h+v*m+M*b,i[3]=p*o+g*l+v*x+M*_,p=e[4],g=e[5],v=e[6],M=e[7],i[4]=p*s+g*a+v*u+M*f,i[5]=p*r+g*c+v*d+M*y,i[6]=p*n+g*h+v*m+M*b,i[7]=p*o+g*l+v*x+M*_,p=e[8],g=e[9],v=e[10],M=e[11],i[8]=p*s+g*a+v*u+M*f,i[9]=p*r+g*c+v*d+M*y,i[10]=p*n+g*h+v*m+M*b,i[11]=p*o+g*l+v*x+M*_,p=e[12],g=e[13],v=e[14],M=e[15],i[12]=p*s+g*a+v*u+M*f,i[13]=p*r+g*c+v*d+M*y,i[14]=p*n+g*h+v*m+M*b,i[15]=p*o+g*l+v*x+M*_,i}function Ni(i,t,e){let s=e[0],r=e[1],n=e[2],o,a,c,h,l,u,d,m,x,f,y,b;return t===i?(i[12]=t[0]*s+t[4]*r+t[8]*n+t[12],i[13]=t[1]*s+t[5]*r+t[9]*n+t[13],i[14]=t[2]*s+t[6]*r+t[10]*n+t[14],i[15]=t[3]*s+t[7]*r+t[11]*n+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],u=t[5],d=t[6],m=t[7],x=t[8],f=t[9],y=t[10],b=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=u,i[6]=d,i[7]=m,i[8]=x,i[9]=f,i[10]=y,i[11]=b,i[12]=o*s+l*r+x*n+t[12],i[13]=a*s+u*r+f*n+t[13],i[14]=c*s+d*r+y*n+t[14],i[15]=h*s+m*r+b*n+t[15]),i}function Fi(i,t,e){let s=e[0],r=e[1],n=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]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*n,i[9]=t[9]*n,i[10]=t[10]*n,i[11]=t[11]*n,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function zi(i,t,e,s){let r=s[0],n=s[1],o=s[2],a=Math.sqrt(r*r+n*n+o*o),c,h,l,u,d,m,x,f,y,b,_,p,g,v,M,C,L,P,R,w,S,E,A,F;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,u=t[0],d=t[1],m=t[2],x=t[3],f=t[4],y=t[5],b=t[6],_=t[7],p=t[8],g=t[9],v=t[10],M=t[11],C=r*r*l+c,L=n*r*l+o*h,P=o*r*l-n*h,R=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,F=o*o*l+c,i[0]=u*C+f*L+p*P,i[1]=d*C+y*L+g*P,i[2]=m*C+b*L+v*P,i[3]=x*C+_*L+M*P,i[4]=u*R+f*w+p*S,i[5]=d*R+y*w+g*S,i[6]=m*R+b*w+v*S,i[7]=x*R+_*w+M*S,i[8]=u*E+f*A+p*F,i[9]=d*E+y*A+g*F,i[10]=m*E+b*A+v*F,i[11]=x*E+_*A+M*F,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function $i(i,t,e){let s=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],u=t[10],d=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]=n*r+h*s,i[5]=o*r+l*s,i[6]=a*r+u*s,i[7]=c*r+d*s,i[8]=h*r-n*s,i[9]=l*r-o*s,i[10]=u*r-a*s,i[11]=d*r-c*s,i}function Bi(i,t,e){let s=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],u=t[10],d=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]=n*r-h*s,i[1]=o*r-l*s,i[2]=a*r-u*s,i[3]=c*r-d*s,i[8]=n*s+h*r,i[9]=o*s+l*r,i[10]=a*s+u*r,i[11]=c*s+d*r,i}function Ui(i,t,e){let s=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],u=t[6],d=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]=n*r+h*s,i[1]=o*r+l*s,i[2]=a*r+u*s,i[3]=c*r+d*s,i[4]=h*r-n*s,i[5]=l*r-o*s,i[6]=u*r-a*s,i[7]=d*r-c*s,i}function Vi(i,t){let e=t[0],s=t[1],r=t[2],n=t[3],o=e+e,a=s+s,c=r+r,h=e*o,l=s*o,u=s*a,d=r*o,m=r*a,x=r*c,f=n*o,y=n*a,b=n*c;return i[0]=1-u-x,i[1]=l+b,i[2]=d-y,i[3]=0,i[4]=l-b,i[5]=1-h-x,i[6]=m+f,i[7]=0,i[8]=d+y,i[9]=m-f,i[10]=1-h-u,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function ji(i,t,e,s,r,n,o){let a=1/(e-t),c=1/(r-s),h=1/(n-o);return i[0]=n*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=n*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+s)*c,i[10]=(o+n)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*n*2*h,i[15]=0,i}function er(i,t,e,s,r){let n=1/Math.tan(t/2);if(i[0]=n/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=n,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(s-r);i[10]=(r+s)*o,i[14]=2*r*s*o}else i[10]=-1,i[14]=-2*s;return i}var Gi=er;function ir(i,t,e,s,r,n,o){let a=1/(t-e),c=1/(s-r),h=1/(n-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+s)*c,i[14]=(o+n)*h,i[15]=1,i}var Wi=ir;function qi(i,t,e,s){let r,n,o,a,c,h,l,u,d,m,x=t[0],f=t[1],y=t[2],b=s[0],_=s[1],p=s[2],g=e[0],v=e[1],M=e[2];return Math.abs(x-g)<1e-6&&Math.abs(f-v)<1e-6&&Math.abs(y-M)<1e-6?tr(i):(u=x-g,d=f-v,m=y-M,r=1/Math.sqrt(u*u+d*d+m*m),u*=r,d*=r,m*=r,n=_*m-p*d,o=p*u-b*m,a=b*d-_*u,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=d*a-m*o,h=m*n-u*a,l=u*o-d*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),i[0]=n,i[1]=c,i[2]=u,i[3]=0,i[4]=o,i[5]=h,i[6]=d,i[7]=0,i[8]=a,i[9]=l,i[10]=m,i[11]=0,i[12]=-(n*x+o*f+a*y),i[13]=-(c*x+h*f+l*y),i[14]=-(u*x+d*f+m*y),i[15]=1,i)}function sr(){let i=new st(4);return st!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function Yi(i,t,e){let s=t[0],r=t[1],n=t[2],o=t[3];return i[0]=e[0]*s+e[4]*r+e[8]*n+e[12]*o,i[1]=e[1]*s+e[5]*r+e[9]*n+e[13]*o,i[2]=e[2]*s+e[6]*r+e[10]*n+e[14]*o,i[3]=e[3]*s+e[7]*r+e[11]*n+e[15]*o,i}var Ko=function(){let i=sr();return function(t,e,s,r,n,o){let a,c;for(e||(e=4),s||(s=0),r?c=Math.min(r*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],n(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 Ne;(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"})(Ne||(Ne={}));var rr=45*Math.PI/180,nr=1,ke=.1,De=500,or=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),K=class extends re{static get IDENTITY(){return cr()}static get ZERO(){return ar()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Ne}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,r,n,o,a,c,h,l,u,d,m,x,f,y){return this[0]=t,this[1]=e,this[2]=s,this[3]=r,this[4]=n,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=u,this[11]=d,this[12]=m,this[13]=x,this[14]=f,this[15]=y,this.check()}setRowMajor(t,e,s,r,n,o,a,c,h,l,u,d,m,x,f,y){return this[0]=t,this[1]=n,this[2]=h,this[3]=m,this[4]=e,this[5]=o,this[6]=l,this[7]=x,this[8]=s,this[9]=a,this[10]=u,this[11]=f,this[12]=r,this[13]=c,this[14]=d,this[15]=y,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy(or)}fromObject(t){return this.check()}fromQuaternion(t){return Vi(this,t),this.check()}frustum(t){let{left:e,right:s,bottom:r,top:n,near:o=ke,far:a=De}=t;return a===1/0?hr(this,e,s,r,n,o):ji(this,e,s,r,n,o,a),this.check()}lookAt(t){let{eye:e,center:s=[0,0,0],up:r=[0,1,0]}=t;return qi(this,e,s,r),this.check()}ortho(t){let{left:e,right:s,bottom:r,top:n,near:o=ke,far:a=De}=t;return Wi(this,e,s,r,n,o,a),this.check()}orthographic(t){let{fovy:e=rr,aspect:s=nr,focalDistance:r=1,near:n=ke,far:o=De}=t;Xi(e);let a=e/2,c=r*Math.tan(a),h=c*s;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:s=1,near:r=.1,far:n=500}=t;return Xi(e),Gi(this,e,s,r,n),this.check()}determinant(){return Di(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),r=1/s[0],n=1/s[1],o=1/s[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 s=this.getScale(e),r=1/s[0],n=1/s[1],o=1/s[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 Oi(this,this),this.check()}invert(){return ki(this,this),this.check()}multiplyLeft(t){return Oe(this,t,this),this.check()}multiplyRight(t){return Oe(this,this,t),this.check()}rotateX(t){return $i(this,this,t),this.check()}rotateY(t){return Bi(this,this,t),this.check()}rotateZ(t){return Ui(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return zi(this,this,t,e),this.check()}scale(t){return Fi(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return Ni(this,this,t),this.check()}transform(t,e){return t.length===4?(e=Yi(e||[-0,-0,-0,-0],t,this),Jt(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:s}=t,r;switch(s){case 2:r=wi(e||[-0,-0],t,this);break;case 3:r=ie(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Jt(r,t.length),r}transformAsVector(t,e){let s;switch(t.length){case 2:s=Ai(e||[-0,-0],t,this);break;case 3:s=ee(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return Jt(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])}},ne,oe;function ar(){return ne||(ne=new K([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(ne)),ne}function cr(){return oe||(oe=new K,Object.freeze(oe)),oe}function Xi(i){if(i>Math.PI*2)throw Error("expected radians")}function hr(i,t,e,s,r,n){let o=2*n/(e-t),a=2*n/(r-s),c=(e+t)/(e-t),h=(r+s)/(r-s),l=-1,u=-1,d=-2*n;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=u,i[12]=0,i[13]=0,i[14]=d,i[15]=0,i}var rt=class{id;matrix=new K;display=!0;position=new W;rotation=new W;scale=new W(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||I(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:r,update:n=!0}=t;return e&&this.setPosition(e),s&&this.setRotation(s),r&&this.setScale(r),n&&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:r}=t;return e&&this.setPosition(e),s&&this.setRotation(s),r&&this.setScale(r),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let s=new K(t).multiplyRight(e),r=s.invert(),n=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:s,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 Hi=O(z(),1);var wt=class extends rt{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Hi.log.assert(e.every(s=>s 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:s})=>{let r=e.getBounds();if(!r)return;let[n,o]=r,a=new W(n).add(o).divide([2,2,2]);s.transformAsPoint(a,a);let c=new W(o).subtract(n).divide([2,2,2]);s.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new W(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let u=0;u<3;u++)t[0][u]=Math.min(t[0][u],l[u]),t[1][u]=Math.max(t[1][u],l[u])}}),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 K}={}){let s=new K(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof wt?r.traverse(t,{worldMatrix:s}):t(r,{worldMatrix:s})}};var ae=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 lr={x:[2,0,1],y:[0,1,2],z:[1,2,0]},ot=class extends V{constructor(t={}){let{id:e=I("truncated-code-geometry")}=t,{indices:s,attributes:r}=ur(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function ur(i={}){let{bottomRadius:t=0,topRadius:e=0,height:s=1,nradial:r=10,nvertical:n=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(n+1+h),u=Math.atan2(t-e,s),d=Math.sin,m=Math.cos,x=Math.PI,f=m(u),y=d(u),b=a?-2:0,_=n+(c?2:0),p=r+1,g=new Uint16Array(r*(n+h)*6),v=lr[o],M=new Float32Array(l*3),C=new Float32Array(l*3),L=new Float32Array(l*2),P=0,R=0;for(let w=b;w<=_;w++){let S=w/n,E=s*S,A;w<0?(E=0,S=1,A=t):w>n?(E=s,S=1,A=e):A=t+(e-t)*(w/n),(w===-2||w===n+2)&&(A=0,S=0),E-=s/2;for(let F=0;F<p;F++){let J=d(F*x*2/r),H=m(F*x*2/r);M[P+v[0]]=J*A,M[P+v[1]]=E,M[P+v[2]]=H*A,C[P+v[0]]=w<0||w>n?0:J*f,C[P+v[1]]=w<0?-1:w>n?1:y,C[P+v[2]]=w<0||w>n?0:H*f,L[R+0]=F/r,L[R+1]=S,R+=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:C,TEXCOORD_0:L}}}var ce=class extends ot{constructor(t={}){let{id:e=I("cone-geometry"),radius:s=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:s})}};var he=class extends V{constructor(t={}){let{id:e=I("cube-geometry"),indices:s=!0}=t;super(s?{...t,id:e,topology:"triangle-list",indices:{size:1,value:dr},attributes:{...br,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...vr,...t.attributes}})}},dr=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]),fr=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]),pr=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]),mr=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]),gr=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]),xr=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]),yr=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]),br={POSITION:{size:3,value:fr},NORMAL:{size:3,value:pr},TEXCOORD_0:{size:2,value:mr}},vr={POSITION:{size:3,value:gr},TEXCOORD_0:{size:2,value:xr},COLOR_0:{size:3,value:yr}};var le=class extends ot{constructor(t={}){let{id:e=I("cylinder-geometry"),radius:s=1}=t;super({...t,id:e,bottomRadius:s,topRadius:s})}};var Mr=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],_r=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],ue=class extends V{constructor(t={}){let{id:e=I("ico-sphere-geometry")}=t,{indices:s,attributes:r}=wr(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...r,...t.attributes}})}};function wr(i){let{iterations:t=0}=i,e=Math.PI,s=e*2,r=[...Mr],n=[..._r];r.push(),n.push();let o=(()=>{let l={};return(u,d)=>{u*=3,d*=3;let m=u<d?u:d,x=u>d?u:d,f=`${m}|${x}`;if(f in l)return l[f];let y=r[u],b=r[u+1],_=r[u+2],p=r[d],g=r[d+1],v=r[d+2],M=(y+p)/2,C=(b+g)/2,L=(_+v)/2,P=Math.sqrt(M*M+C*C+L*L);return M/=P,C/=P,L/=P,r.push(M,C,L),l[f]=r.length/3-1}})();for(let l=0;l<t;l++){let u=[];for(let d=0;d<n.length;d+=3){let m=o(n[d+0],n[d+1]),x=o(n[d+1],n[d+2]),f=o(n[d+2],n[d+0]);u.push(f,n[d+0],m,m,n[d+1],x,x,n[d+2],f,m,x,f)}n=u}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 u=n[l+0],d=n[l+1],m=n[l+2],x=u*3,f=d*3,y=m*3,b=u*2,_=d*2,p=m*2,g=r[x+0],v=r[x+1],M=r[x+2],C=Math.acos(M/Math.sqrt(g*g+v*v+M*M)),L=Math.atan2(v,g)+e,P=C/e,R=1-L/s,w=r[f+0],S=r[f+1],E=r[f+2],A=Math.acos(E/Math.sqrt(w*w+S*S+E*E)),F=Math.atan2(S,w)+e,J=A/e,H=1-F/s,Ft=r[y+0],zt=r[y+1],$t=r[y+2],ns=Math.acos($t/Math.sqrt(Ft*Ft+zt*zt+$t*$t)),os=Math.atan2(zt,Ft)+e,Ue=ns/e,Bt=1-os/s,as=[Ft-w,zt-S,$t-E],cs=[g-w,v-S,M-E],X=new W(as).cross(cs).normalize(),k;(R===0||H===0||Bt===0)&&(R===0||R>.5)&&(H===0||H>.5)&&(Bt===0||Bt>.5)&&(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]=P,a[k*3+0]=X.x,a[k*3+1]=X.y,a[k*3+2]=X.z,r.push(r[f+0],r[f+1],r[f+2]),k=r.length/3-1,n.push(k),c[k*2+0]=1,c[k*2+1]=J,a[k*3+0]=X.x,a[k*3+1]=X.y,a[k*3+2]=X.z,r.push(r[y+0],r[y+1],r[y+2]),k=r.length/3-1,n.push(k),c[k*2+0]=1,c[k*2+1]=Ue,a[k*3+0]=X.x,a[k*3+1]=X.y,a[k*3+2]=X.z),a[x+0]=a[f+0]=a[y+0]=X.x,a[x+1]=a[f+1]=a[y+1]=X.y,a[x+2]=a[f+2]=a[y+2]=X.z,c[b+0]=R,c[b+1]=P,c[_+0]=H,c[_+1]=J,c[p+0]=Bt,c[p+1]=Ue}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 Ki(i){let{indices:t,attributes:e}=i;if(!t)return i;let s=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(s*h);for(let u=0;u<s;++u){let d=t.value[u];for(let m=0;m<h;m++)l[u*h+m]=c[d*h+m]}r[n]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var de=class extends V{constructor(t={}){let{id:e=I("plane-geometry")}=t,{indices:s,attributes:r}=Ar(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...r,...t.attributes}})}};function Ar(i){let{type:t="x,y",offset:e=0,flipCull:s=!1,unpack:r=!1}=i,n=t.split(","),o=i[`${n[0]}len`]||1,a=i[`${n[1]}len`]||1,c=i[`n${n[0]}`]||1,h=i[`n${n[1]}`]||1,l=(c+1)*(h+1),u=new Float32Array(l*3),d=new Float32Array(l*3),m=new Float32Array(l*2);s&&(o=-o);let x=0,f=0;for(let p=0;p<=h;p++)for(let g=0;g<=c;g++){let v=g/c,M=p/h;switch(m[x+0]=s?1-v:v,m[x+1]=M,t){case"x,y":u[f+0]=o*v-o*.5,u[f+1]=a*M-a*.5,u[f+2]=e,d[f+0]=0,d[f+1]=0,d[f+2]=s?1:-1;break;case"x,z":u[f+0]=o*v-o*.5,u[f+1]=e,u[f+2]=a*M-a*.5,d[f+0]=0,d[f+1]=s?1:-1,d[f+2]=0;break;case"y,z":u[f+0]=e,u[f+1]=o*v-o*.5,u[f+2]=a*M-a*.5,d[f+0]=s?1:-1,d[f+1]=0,d[f+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}x+=2,f+=3}let y=c+1,b=new Uint16Array(c*h*6);for(let p=0;p<h;p++)for(let g=0;g<c;g++){let v=(p*c+g)*6;b[v+0]=(p+0)*y+g,b[v+1]=(p+1)*y+g,b[v+2]=(p+0)*y+g+1,b[v+3]=(p+1)*y+g,b[v+4]=(p+1)*y+g+1,b[v+5]=(p+0)*y+g+1}let _={indices:{size:1,value:b},attributes:{POSITION:{size:3,value:u},NORMAL:{size:3,value:d},TEXCOORD_0:{size:2,value:m}}};return r?Ki(_):_}var fe=class extends V{constructor(t={}){let{id:e=I("sphere-geometry")}=t,{indices:s,attributes:r}=Sr(t);super({...t,id:e,topology:"triangle-list",indices:s,attributes:{...r,...t.attributes}})}};function Sr(i){let{nlat:t=10,nlong:e=10}=i,n=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(b,_,p,g,v)=>i.radius||1,u=new Float32Array(h*3),d=new Float32Array(h*3),m=new Float32Array(h*2),x=h>65535?Uint32Array:Uint16Array,f=new x(t*e*6);for(let b=0;b<=t;b++)for(let _=0;_<=e;_++){let p=_/e,g=b/t,v=_+b*(e+1),M=v*2,C=v*3,L=c*p,P=n*g,R=Math.sin(L),w=Math.cos(L),S=Math.sin(P),E=Math.cos(P),A=w*S,F=E,J=R*S,H=l(A,F,J,p,g);u[C+0]=H*A,u[C+1]=H*F,u[C+2]=H*J,d[C+0]=A,d[C+1]=F,d[C+2]=J,m[M+0]=p,m[M+1]=1-g}let y=e+1;for(let b=0;b<e;b++)for(let _=0;_<t;_++){let p=(b*t+_)*6;f[p+0]=_*y+b,f[p+1]=_*y+b+1,f[p+2]=(_+1)*y+b,f[p+3]=(_+1)*y+b,f[p+4]=_*y+b+1,f[p+5]=(_+1)*y+b+1}return{indices:{size:1,value:f},attributes:{POSITION:{size:3,value:u},NORMAL:{size:3,value:d},TEXCOORD_0:{size:2,value:m}}}}function Zi(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Tr(Math.abs(i*t)*1432.71))}function Tr(i){return i-Math.floor(i)}var Fe="";function Qi(i){Fe=i}async function Ji(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:Fe+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function ts(i,t){return await new Promise((e,s)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>s(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:Fe+i}catch(r){s(r)}})}var is=O(ht(),1);var nt=O(z(),1),At=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},St=class extends At{constructor(t,e){e={...e};let{width:s=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:s,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:s,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:s}=this;return this.current=e.clone(t),e.destroy(),this.next=s.clone(t),s.destroy(),!0}},pe=class extends At{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:s}=this;return this.current=e.clone(t),e.destroy(),this.next=s.clone(t),s.destroy(),!0}};function es(i){let{shaderPass:t,action:e,shadingLanguage:s}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return s==="wgsl"?Cr(r):Pr(r);case"sample":let n=`${t.name}_sampleColor`;return s==="wgsl"?Ir(n):Er(n);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Cr(i){return`// Binding 0:1 is reserved for shader passes
85
244
  // @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
86
245
  @group(0) @binding(1) var texture: texture_2d<f32>;
87
246
  @group(0) @binding(2) var textureSampler: sampler;
@@ -100,10 +259,10 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
100
259
  let texSize = vec2f(textureDimensions(texture, 0));
101
260
 
102
261
  var fragColor = textureSample(texture, textureSampler, fragUV);
103
- fragColor = ${s}(fragColor, texSize, fragCoordinate);
262
+ fragColor = ${i}(fragColor, texSize, fragCoordinate);
104
263
  return fragColor;
105
264
  }
106
- `}function fr(s){return`// Binding 0:1 is reserved for shader passes
265
+ `}function Ir(i){return`// Binding 0:1 is reserved for shader passes
107
266
  @group(0) @binding(0) var<uniform> brightnessContrast : brightnessContrastUniforms;
108
267
  @group(0) @binding(1) var texture: texture_2d<f32>;
109
268
  @group(0) @binding(2) var sampler: sampler;
@@ -118,10 +277,10 @@ struct FragmentInputs = {
118
277
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
119
278
  let texSize = vec2f(textureDimensions(texture, 0));
120
279
  var fragColor = textureSample(texture, sampler, fragUV);
121
- fragColor = ${s}(fragColor, texSize, texCoord);
280
+ fragColor = ${i}(fragColor, texSize, texCoord);
122
281
  return fragColor;
123
282
  }
124
- `}function ur(s){return`#version 300 es
283
+ `}function Pr(i){return`#version 300 es
125
284
 
126
285
  uniform sampler2D sourceTexture;
127
286
 
@@ -137,9 +296,9 @@ void main() {
137
296
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
138
297
 
139
298
  fragColor = texture(sourceTexture, texCoord);
140
- fragColor = ${s}(fragColor, texSize, texCoord);
299
+ fragColor = ${i}(fragColor, texSize, texCoord);
141
300
  }
142
- `}function pr(s){return`#version 300 es
301
+ `}function Er(i){return`#version 300 es
143
302
 
144
303
  uniform sampler2D sourceTexture;
145
304
 
@@ -154,9 +313,9 @@ void main() {
154
313
  ivec2 iTexSize = textureSize(sourceTexture, 0);
155
314
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
156
315
 
157
- fragColor = ${s}(sourceTexture, texSize, texCoord);
316
+ fragColor = ${i}(sourceTexture, texSize, texCoord);
158
317
  }
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>;
318
+ `}var me=class{device;shaderInputs;passRenderers;swapFramebuffers;clipSpace;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(n=>(0,is.initializeShaderModule)(n));let s=e.shaderPasses.reduce((n,o)=>({...n,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new Z(s);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new St(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new bt(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.clipSpace=new it(t,{source:` @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
160
319
  @group(0) @binding(1) var sourceTextureSampler: sampler;
161
320
 
162
321
  @fragment
@@ -173,7 +332,7 @@ out vec4 fragColor;
173
332
  void main() {
174
333
  fragColor = texture(sourceTexture, uv);
175
334
  }
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;
335
+ `}),this.passRenderers=e.shaderPasses.map(n=>new ze(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 s=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilAttachment:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:s,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 s=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(s),s.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}},ze=class{shaderPass;subPassRenderers;constructor(t,e,s={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(n=>new $e(t,e,n))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},$e=class{model;shaderPass;subPass;constructor(t,e,s){this.shaderPass=e,this.subPass=s;let r=s.action||s.filter&&"filter"||s.sampler&&"sample"||"filter",n=es({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new it(t,{id:`${e.name}-subpass`,source:n,fs:n,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 Lr=[0,1,1,1],Q=-1,Rr={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},Tt=`precision highp float;
177
336
  precision highp int;
178
337
 
179
338
  uniform pickingUniforms {
@@ -186,7 +345,7 @@ uniform pickingUniforms {
186
345
  int highlightedObjectIndex;
187
346
  vec4 highlightColor;
188
347
  } picking;
189
- `,ue=`struct pickingUniforms {
348
+ `,ge=`struct pickingUniforms {
190
349
  isActive: int32;
191
350
  indexMode: int32;
192
351
  batchIndex: int32;
@@ -196,7 +355,7 @@ uniform pickingUniforms {
196
355
  highlightedObjectIndex: int32;
197
356
  highlightColor: vec4<f32>;
198
357
  } picking;
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}
358
+ `;function Or(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=Q;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 xe={props:{},uniforms:{},name:"picking",uniformTypes:Rr,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!0,highlightedBatchIndex:Q,highlightedObjectIndex:Q,highlightColor:Lr},getUniforms:Or};var Be=class{device;props;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Be.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,r]=this.getPickPosition(t),n=this.device.readPixelsToArrayWebGL(e,{sourceX:s,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),s=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[s,r]}},Dt=Be;B(Dt,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{}});var kr=`${ge}
200
359
 
201
360
  const INDEX_PICKING_MODE_INSTANCE = 0;
202
361
  const INDEX_PICKING_MODE_CUSTOM = 1;
@@ -223,7 +382,7 @@ fn picking_setObjectIndex(objectIndex: int32) {
223
382
  }
224
383
  }
225
384
 
226
- `,Mr=`${wt}
385
+ `,Dr=`${Tt}
227
386
 
228
387
  const int INDEX_PICKING_MODE_INSTANCE = 0;
229
388
  const int INDEX_PICKING_MODE_CUSTOM = 1;
@@ -246,7 +405,7 @@ void picking_setObjectIndex(int objectIndex) {
246
405
  break;
247
406
  }
248
407
  }
249
- `,_r=`${wt}
408
+ `,Nr=`${Tt}
250
409
 
251
410
  const int INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
252
411
 
@@ -314,8 +473,8 @@ vec4 picking_filterColor(vec4 color) {
314
473
  outColor = picking_filterPickingColor(outColor);
315
474
  return outColor;
316
475
  }
317
- `,Zs={...pe,name:"picking",source:vr,vs:Mr,fs:_r};var wr=`${ue}
318
- `,Ar=`${wt}
476
+ `,ss={...xe,name:"picking",source:kr,vs:Dr,fs:Nr};var Fr=`${ge}
477
+ `,zr=`${Tt}
319
478
  out vec4 picking_vRGBcolor_Avalid;
320
479
 
321
480
  // Normalize unsigned byte color to 0-1 range
@@ -390,7 +549,7 @@ void picking_setPickingAttribute(vec3 value) {
390
549
  picking_vRGBcolor_Avalid.rgb = value;
391
550
  }
392
551
  }
393
- `,Sr=`${wt}
552
+ `,$r=`${Tt}
394
553
 
395
554
  in vec4 picking_vRGBcolor_Avalid;
396
555
 
@@ -439,6 +598,6 @@ vec4 picking_filterColor(vec4 color) {
439
598
  vec4 highlightColor = picking_filterHighlightColor(color);
440
599
  return picking_filterPickingColor(highlightColor);
441
600
  }
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);})();
601
+ `,rs={...xe,name:"picking",source:Fr,vs:zr,fs:$r};var ye=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,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:s,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),s=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[s,r]}};var Br=Y;return gs(Nt);})();
443
602
  return __exports__;
444
603
  });