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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/dist/animation-loop/animation-loop.d.ts.map +1 -1
  2. package/dist/animation-loop/animation-loop.js +3 -0
  3. package/dist/animation-loop/animation-loop.js.map +1 -1
  4. package/dist/compute/computation.d.ts +3 -7
  5. package/dist/compute/computation.d.ts.map +1 -1
  6. package/dist/compute/computation.js +14 -12
  7. package/dist/compute/computation.js.map +1 -1
  8. package/dist/dist.dev.js +1751 -831
  9. package/dist/dist.min.js +296 -148
  10. package/dist/dynamic-texture/dynamic-texture.d.ts +9 -2
  11. package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -1
  12. package/dist/dynamic-texture/dynamic-texture.js +54 -5
  13. package/dist/dynamic-texture/dynamic-texture.js.map +1 -1
  14. package/dist/dynamic-texture/texture-data.d.ts +4 -1
  15. package/dist/dynamic-texture/texture-data.d.ts.map +1 -1
  16. package/dist/dynamic-texture/texture-data.js +19 -2
  17. package/dist/dynamic-texture/texture-data.js.map +1 -1
  18. package/dist/geometry/gpu-geometry.d.ts.map +1 -1
  19. package/dist/geometry/gpu-geometry.js +8 -3
  20. package/dist/geometry/gpu-geometry.js.map +1 -1
  21. package/dist/index.cjs +1711 -847
  22. package/dist/index.cjs.map +4 -4
  23. package/dist/index.d.ts +12 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +8 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/material/material-factory.d.ts +73 -0
  28. package/dist/material/material-factory.d.ts.map +1 -0
  29. package/dist/material/material-factory.js +111 -0
  30. package/dist/material/material-factory.js.map +1 -0
  31. package/dist/material/material.d.ts +84 -0
  32. package/dist/material/material.d.ts.map +1 -0
  33. package/dist/material/material.js +176 -0
  34. package/dist/material/material.js.map +1 -0
  35. package/dist/model/model.d.ts +14 -6
  36. package/dist/model/model.d.ts.map +1 -1
  37. package/dist/model/model.js +69 -25
  38. package/dist/model/model.js.map +1 -1
  39. package/dist/model/split-uniforms-and-bindings.d.ts +4 -3
  40. package/dist/model/split-uniforms-and-bindings.d.ts.map +1 -1
  41. package/dist/model/split-uniforms-and-bindings.js +2 -2
  42. package/dist/model/split-uniforms-and-bindings.js.map +1 -1
  43. package/dist/models/directional-light-model.d.ts +7 -0
  44. package/dist/models/directional-light-model.d.ts.map +1 -0
  45. package/dist/models/directional-light-model.js +23 -0
  46. package/dist/models/directional-light-model.js.map +1 -0
  47. package/dist/models/light-model-utils.d.ts +69 -0
  48. package/dist/models/light-model-utils.d.ts.map +1 -0
  49. package/dist/models/light-model-utils.js +395 -0
  50. package/dist/models/light-model-utils.js.map +1 -0
  51. package/dist/models/point-light-model.d.ts +7 -0
  52. package/dist/models/point-light-model.d.ts.map +1 -0
  53. package/dist/models/point-light-model.js +22 -0
  54. package/dist/models/point-light-model.js.map +1 -0
  55. package/dist/models/spot-light-model.d.ts +7 -0
  56. package/dist/models/spot-light-model.d.ts.map +1 -0
  57. package/dist/models/spot-light-model.js +23 -0
  58. package/dist/models/spot-light-model.js.map +1 -0
  59. package/dist/modules/picking/color-picking.d.ts +5 -9
  60. package/dist/modules/picking/color-picking.d.ts.map +1 -1
  61. package/dist/modules/picking/color-picking.js +122 -115
  62. package/dist/modules/picking/color-picking.js.map +1 -1
  63. package/dist/modules/picking/index-picking.d.ts +2 -2
  64. package/dist/modules/picking/index-picking.d.ts.map +1 -1
  65. package/dist/modules/picking/index-picking.js +36 -10
  66. package/dist/modules/picking/index-picking.js.map +1 -1
  67. package/dist/modules/picking/legacy-color-picking.d.ts +26 -0
  68. package/dist/modules/picking/legacy-color-picking.d.ts.map +1 -0
  69. package/dist/modules/picking/legacy-color-picking.js +7 -0
  70. package/dist/modules/picking/legacy-color-picking.js.map +1 -0
  71. package/dist/modules/picking/picking-manager.d.ts +29 -3
  72. package/dist/modules/picking/picking-manager.d.ts.map +1 -1
  73. package/dist/modules/picking/picking-manager.js +188 -41
  74. package/dist/modules/picking/picking-manager.js.map +1 -1
  75. package/dist/modules/picking/picking-uniforms.d.ts +12 -11
  76. package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
  77. package/dist/modules/picking/picking-uniforms.js +26 -13
  78. package/dist/modules/picking/picking-uniforms.js.map +1 -1
  79. package/dist/modules/picking/picking.d.ts +25 -0
  80. package/dist/modules/picking/picking.d.ts.map +1 -0
  81. package/dist/modules/picking/picking.js +18 -0
  82. package/dist/modules/picking/picking.js.map +1 -0
  83. package/dist/shader-inputs.d.ts +9 -7
  84. package/dist/shader-inputs.d.ts.map +1 -1
  85. package/dist/shader-inputs.js +84 -4
  86. package/dist/shader-inputs.js.map +1 -1
  87. package/dist/utils/shader-module-utils.d.ts +7 -0
  88. package/dist/utils/shader-module-utils.d.ts.map +1 -0
  89. package/dist/utils/shader-module-utils.js +46 -0
  90. package/dist/utils/shader-module-utils.js.map +1 -0
  91. package/package.json +4 -4
  92. package/src/animation-loop/animation-loop.ts +3 -0
  93. package/src/compute/computation.ts +31 -17
  94. package/src/dynamic-texture/dynamic-texture.ts +79 -7
  95. package/src/dynamic-texture/texture-data.ts +25 -4
  96. package/src/geometry/gpu-geometry.ts +8 -3
  97. package/src/index.ts +29 -4
  98. package/src/material/material-factory.ts +157 -0
  99. package/src/material/material.ts +254 -0
  100. package/src/model/model.ts +108 -40
  101. package/src/model/split-uniforms-and-bindings.ts +8 -6
  102. package/src/models/directional-light-model.ts +32 -0
  103. package/src/models/light-model-utils.ts +587 -0
  104. package/src/models/point-light-model.ts +31 -0
  105. package/src/models/spot-light-model.ts +32 -0
  106. package/src/modules/picking/color-picking.ts +123 -122
  107. package/src/modules/picking/index-picking.ts +36 -10
  108. package/src/modules/picking/legacy-color-picking.ts +8 -0
  109. package/src/modules/picking/picking-manager.ts +252 -50
  110. package/src/modules/picking/picking-uniforms.ts +38 -23
  111. package/src/modules/picking/picking.ts +22 -0
  112. package/src/shader-inputs.ts +165 -15
  113. package/src/utils/shader-module-utils.ts +65 -0
  114. package/dist/factories/pipeline-factory.d.ts +0 -39
  115. package/dist/factories/pipeline-factory.d.ts.map +0 -1
  116. package/dist/factories/pipeline-factory.js +0 -216
  117. package/dist/factories/pipeline-factory.js.map +0 -1
  118. package/dist/factories/shader-factory.d.ts +0 -19
  119. package/dist/factories/shader-factory.d.ts.map +0 -1
  120. package/dist/factories/shader-factory.js +0 -83
  121. package/dist/factories/shader-factory.js.map +0 -1
  122. package/dist/types.d.ts +0 -7
  123. package/dist/types.d.ts.map +0 -1
  124. package/dist/types.js +0 -5
  125. package/dist/types.js.map +0 -1
  126. package/src/factories/pipeline-factory.ts +0 -266
  127. package/src/factories/shader-factory.ts +0 -101
  128. package/src/types.ts +0 -11
package/dist/dist.min.js CHANGED
@@ -4,7 +4,7 @@
4
4
  else if (typeof define === 'function' && define.amd) define([], factory);
5
5
  else if (typeof exports === 'object') exports['luma'] = factory();
6
6
  else root['luma'] = factory();})(globalThis, function () {
7
- "use strict";var __exports__=(()=>{var ci=Object.create;var Te=Object.defineProperty;var hi=Object.getOwnPropertyDescriptor;var li=Object.getOwnPropertyNames;var di=Object.getPrototypeOf,ui=Object.prototype.hasOwnProperty;var fi=(s,e,t)=>e in s?Te(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var Wt=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),pi=(s,e)=>{for(var t in e)Te(s,t,{get:e[t],enumerable:!0})},$e=(s,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of li(e))!ui.call(s,r)&&r!==t&&Te(s,r,{get:()=>e[r],enumerable:!(i=hi(e,r))||i.enumerable});return s},Be=(s,e,t)=>($e(s,e,"default"),t&&$e(t,e,"default")),k=(s,e,t)=>(t=s!=null?ci(di(s)):{},$e(e||!s||!s.__esModule?Te(t,"default",{value:s,enumerable:!0}):t,s)),mi=s=>$e(Te({},"__esModule",{value:!0}),s);var $=(s,e,t)=>(fi(s,typeof e!="symbol"?e+"":e,t),t);var B=Wt((Dr,Ht)=>{Ht.exports=globalThis.luma});var he=Wt((rn,Zt)=>{Zt.exports=globalThis.luma});var ke={};pi(ke,{AnimationLoop:()=>ce,AnimationLoopTemplate:()=>je,AsyncTexture:()=>Fr,BackgroundTextureModel:()=>xe,BufferTransform:()=>Re,ClipSpace:()=>ne,Computation:()=>Oe,ConeGeometry:()=>nt,CubeGeometry:()=>ot,CylinderGeometry:()=>at,DynamicTexture:()=>H,GPUGeometry:()=>me,Geometry:()=>G,GroupNode:()=>fe,IcoSphereGeometry:()=>ct,KeyFrames:()=>Ge,LegacyPickingManager:()=>mt,Model:()=>X,ModelNode:()=>rt,PickingManager:()=>Le,PipelineFactory:()=>ee,PlaneGeometry:()=>ht,ScenegraphNode:()=>ie,ShaderFactory:()=>te,ShaderInputs:()=>Z,ShaderPassRenderer:()=>ut,SphereGeometry:()=>lt,Swap:()=>Me,SwapBuffers:()=>dt,SwapFramebuffers:()=>_e,TextureTransform:()=>Xe,Timeline:()=>Ue,TruncatedConeGeometry:()=>oe,cancelAnimationFramePolyfill:()=>qe,colorPicking:()=>ii,indexPicking:()=>si,loadImage:()=>Qs,loadImageBitmap:()=>Zs,makeAnimationLoop:()=>Kt,makeRandomGenerator:()=>Xs,requestAnimationFramePolyfill:()=>Ve,setPathPrefix:()=>Ks});Be(ke,k(B(),1));var gi=1,xi=1,Ue=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(e){let{delay:t=0,duration:i=Number.POSITIVE_INFINITY,rate:r=1,repeat:n=1}=e,o=gi++,a={time:0,delay:t,duration:i,rate:r,repeat:n};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(e){this.channels.delete(e);for(let[t,i]of this.animations)i.channel===e&&this.detachAnimation(t)}isFinished(e){let t=this.channels.get(e);return t===void 0?!1:this.time>=t.delay+t.duration*t.repeat}getTime(e){if(e===void 0)return this.time;let t=this.channels.get(e);return t===void 0?-1:t.time}setTime(e){this.time=Math.max(0,e);let t=this.channels.values();for(let r of t)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(e,t){let i=xi++;return this.animations.set(i,{animation:e,channel:t}),e.setTime(this.getTime(t)),i}detachAnimation(e){this.animations.delete(e)}update(e){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=e),this.setTime(this.time+(e-this.lastEngineTime)),this.lastEngineTime=e)}_setChannelTime(e,t){let i=t-e.delay,r=e.duration*e.repeat;i>=r?e.time=e.duration*e.rate:(e.time=Math.max(0,i)%e.duration,e.time*=e.rate)}};var Ge=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(e){this.setKeyFrames(e),this.setTime(0)}setKeyFrames(e){let t=e.length;this.times.length=t,this.values.length=t;for(let i=0;i<t;++i)this.times[i]=e[i][0],this.values[i]=e[i][1];this._calculateKeys(this._lastTime)}setTime(e){e=Math.max(0,e),e!==this._lastTime&&(this._calculateKeys(e),this._lastTime=e)}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(e){let t=0,i=this.times.length;for(t=0;t<i-2&&!(this.times[t+1]>e);++t);this.startIndex=t,this.endIndex=t+1;let r=this.times[this.startIndex],n=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(e-r)/(n-r)),1)}};var je=class{constructor(e){}async onInitialize(e){return null}};var Yt=k(B(),1);function Ve(s){let e=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return e?e.call(window,s):setTimeout(()=>s(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function qe(s){let e=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(e){e.call(window,s);return}clearTimeout(s)}function Ae(){let s;if(typeof window<"u"&&window.performance)s=window.performance.now();else if(typeof process<"u"&&process.hrtime){let e=process.hrtime();s=e[0]*1e3+e[1]/1e6}else s=Date.now();return s}var ae=class{constructor(e,t){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=e,this.type=t,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(e){return this.sampleSize=e,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(e){return this._count+=e,this._samples++,this._checkSampling(),this}subtractCount(e){return this._count-=e,this._samples++,this._checkSampling(),this}addTime(e){return this._time+=e,this.lastTiming=e,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Ae(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Ae()-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 pe=class{constructor(e){this.stats={},this.id=e.id,this.stats={},this._initializeStats(e.stats),Object.seal(this)}get(e,t="count"){return this._getOrCreate({name:e,type:t})}get size(){return Object.keys(this.stats).length}reset(){for(let e of Object.values(this.stats))e.reset();return this}forEach(e){for(let t of Object.values(this.stats))e(t)}getTable(){let e={};return this.forEach(t=>{e[t.name]={time:t.time||0,count:t.count||0,average:t.getAverageTime()||0,hz:t.getHz()||0}}),e}_initializeStats(e=[]){e.forEach(t=>this._getOrCreate(t))}_getOrCreate(e){let{name:t,type:i}=e,r=this.stats[t];return r||(e instanceof ae?r=e:r=new ae(t,i),this.stats[t]=r),r}};var yi=0,bi="Animation Loop",gt=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(e){if(this.props={...gt.defaultAnimationLoopProps,...e},e=this.props,!e.device)throw new Error("No device provided");this.stats=e.stats||new pe({id:`animation-loop-${yi++}`}),this.sharedStats=Yt.luma.stats.get(bi),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:e.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(e){this.props.onError(e),this._error=e}setNeedsRedraw(e){return this._needsRedraw=this._needsRedraw||e,this}needsRedraw(){let e=this._needsRedraw;return this._needsRedraw=!1,e}setProps(e){return"autoResizeViewport"in e&&(this.props.autoResizeViewport=e.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let e;return this._initialized||(this._initialized=!0,await this._initDevice(),this._initialize(),await this.props.onInitialize(this._getAnimationProps())),this._running?(e!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(e){let t=e instanceof Error?e:new Error("Unknown error");throw this.props.onError(t),t}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(e){return this.device?.isLost||this._error?this:(this._beginFrameTimers(e),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(e){return this.timeline=e,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(e=>{this._resolveNextFrame=e})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(e){this.display&&(this.display.destroy(),this.display.animationLoop=null),e&&(e.animationLoop=this),this.display=e}_requestAnimationFrame(){this._running&&(this._animationFrameId=Ve(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(qe(this._animationFrameId),this._animationFrameId=null)}_animationFrame(e){this._running&&(this.redraw(e),this._requestAnimationFrame())}_renderFrame(e){if(this.display){this.display._renderFrame(e);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let e=this.device?.getDefaultCanvasContext();if(!this.device||!e)throw new Error("loop");let t=e?.canvas,i=e.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:e,canvas:t,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:e,height:t,aspect:i}=this._getSizeAndAspect();(e!==this.animationProps.width||t!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),i!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=e,this.animationProps.height=t,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 e=document.createElement("div");document.body.appendChild(e),e.style.position="relative";let t=document.createElement("div");t.style.position="absolute",t.style.left="10px",t.style.bottom="10px",t.style.width="300px",t.style.background="white",this.canvas instanceof HTMLCanvasElement&&e.appendChild(this.canvas),e.appendChild(t);let i=this.props.onAddHTML(t);i&&(t.innerHTML=i)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[e,t]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),i=e>0&&t>0?e/t:1;return{width:e,height:t,aspect:i}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(e){let t=e??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let i=t-this._lastFrameTime;i>0&&this.frameRate.addTime(i)}this._lastFrameTime=t,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let e=this.device.commandEncoder._gpuTimeMs;e!==void 0&&(this.gpuTime.addTime(e),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let e of Object.keys(this.sharedStats.stats))this.stats.stats[e]||delete this.sharedStats.stats[e];this.stats.forEach(e=>{let t=this.sharedStats.get(e.name,e.type);t.sampleSize=e.sampleSize,t.time=e.time,t.count=e.count,t.samples=e.samples,t.lastTiming=e.lastTiming,t.lastSampleTime=e.lastSampleTime,t.lastSampleCount=e.lastSampleCount,t._count=e._count,t._time=e._time,t._samples=e._samples,t._startTime=e._startTime,t._timerPending=e._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(e){e instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[e.offsetX,e.offsetY])}_onMouseleave(e){this._getAnimationProps()._mousePosition=null}},ce=gt;$(ce,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:e=>console.error(e),stats:void 0,autoResizeViewport:!1});var Xt=k(B(),1);function Kt(s,e){let t=null,i=e?.device||Xt.luma.createDevice({id:"animation-loop",adapters:e?.adapters,createCanvasContext:!0}),r=new ce({...e,device:i,async onInitialize(n){Mi(n.animationLoop.device);try{return t=new s(n),await t?.onInitialize(n)}catch(o){return vi(n.animationLoop.device,o),null}},onRender:n=>t?.onRender(n),onFinalize:n=>t?.onFinalize(n)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function vi(s,e){if(!s)return;let t=s.getDefaultCanvasContext().canvas;if(t instanceof HTMLCanvasElement){t.style.overflow="visible";let i=document.getElementById("animation-loop-error");i?.remove(),i=document.createElement("h1"),i.id="animation-loop-error",i.innerHTML=e.message,i.style.position="absolute",i.style.top="10px",i.style.left="10px",i.style.color="black",i.style.backgroundColor="red",t.parentElement?.appendChild(i)}}function Mi(s){if(!s)return;let e=document.getElementById("animation-loop-error");e&&e.remove()}var P=k(B(),1),fs=k(he(),1);var Se=k(B(),1);var xt={};function C(s="id"){xt[s]=xt[s]||1;let e=xt[s]++;return`${s}-${e}`}var me=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(e){if(this.id=e.id||C("geometry"),this.topology=e.topology,this.indices=e.indices||null,this.attributes=e.attributes,this.vertexCount=e.vertexCount,this.bufferLayout=e.bufferLayout||[],this.indices&&!(this.indices.usage&Se.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let e of Object.values(this.attributes))e.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(e){return e.byteLength/12}};function Qt(s,e){if(e instanceof me)return e;let t=_i(s,e),{attributes:i,bufferLayout:r}=wi(s,e);return new me({topology:e.topology||"triangle-list",bufferLayout:r,vertexCount:e.vertexCount,indices:t,attributes:i})}function _i(s,e){if(!e.indices)return;let t=e.indices.value;return s.createBuffer({usage:Se.Buffer.INDEX,data:t})}function wi(s,e){let t=[],i={};for(let[n,o]of Object.entries(e.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:l,normalized:h}=o;t.push({name:a,format:(0,Se.getVertexFormatFromAttribute)(c,l,h)})}}let r=e._calculateVertexCount(e.attributes,e.indices);return{attributes:i,bufferLayout:t,vertexCount:r}}var U=k(B(),1);var yt=class{static getDefaultPipelineFactory(e){let t=e.getModuleData("@luma.gl/engine");return t.defaultPipelineFactory||=new yt(e),t.defaultPipelineFactory}device;_hashCounter=0;_hashes={};_renderPipelineCache={};_computePipelineCache={};_sharedRenderPipelineCache={};get[Symbol.toStringTag](){return"PipelineFactory"}toString(){return`PipelineFactory(${this.device.id})`}constructor(e){this.device=e}createRenderPipeline(e){if(!this.device.props._cachePipelines)return this.device.createRenderPipeline(e);let t={...U.RenderPipeline.defaultProps,...e},i=this._renderPipelineCache,r=this._hashRenderPipeline(t),n=i[r]?.resource;if(n)i[r].useCount++,this.device.props.debugFactories&&U.log.log(3,`${this}: ${i[r].resource} reused, count=${i[r].useCount}, (id=${e.id})`)();else{let o=this.device.type==="webgl"&&this.device.props._sharePipelines?this.createSharedRenderPipeline(t):void 0;n=this.device.createRenderPipeline({...t,id:t.id?`${t.id}-cached`:C("unnamed-cached"),_sharedRenderPipeline:o}),n.hash=r,i[r]={resource:n,useCount:1},this.device.props.debugFactories&&U.log.log(3,`${this}: ${n} created, count=${i[r].useCount}`)()}return n}createComputePipeline(e){if(!this.device.props._cachePipelines)return this.device.createComputePipeline(e);let t={...U.ComputePipeline.defaultProps,...e},i=this._computePipelineCache,r=this._hashComputePipeline(t),n=i[r]?.resource;return n?(i[r].useCount++,this.device.props.debugFactories&&U.log.log(3,`${this}: ${i[r].resource} reused, count=${i[r].useCount}, (id=${e.id})`)()):(n=this.device.createComputePipeline({...t,id:t.id?`${t.id}-cached`:void 0}),n.hash=r,i[r]={resource:n,useCount:1},this.device.props.debugFactories&&U.log.log(3,`${this}: ${n} created, count=${i[r].useCount}`)()),n}release(e){if(!this.device.props._cachePipelines){e.destroy();return}let t=this._getCache(e),i=e.hash;t[i].useCount--,t[i].useCount===0?(this._destroyPipeline(e),this.device.props.debugFactories&&U.log.log(3,`${this}: ${e} released and destroyed`)()):t[i].useCount<0?(U.log.error(`${this}: ${e} released, useCount < 0, resetting`)(),t[i].useCount=0):this.device.props.debugFactories&&U.log.log(3,`${this}: ${e} released, count=${t[i].useCount}`)()}createSharedRenderPipeline(e){let t=this._hashSharedRenderPipeline(e),i=this._sharedRenderPipelineCache[t];return i||(i={resource:this.device._createSharedRenderPipelineWebGL(e),useCount:0},this._sharedRenderPipelineCache[t]=i),i.useCount++,i.resource}releaseSharedRenderPipeline(e){if(!e.sharedRenderPipeline)return;let t=this._hashSharedRenderPipeline(e.sharedRenderPipeline.props),i=this._sharedRenderPipelineCache[t];i&&(i.useCount--,i.useCount===0&&(i.resource.destroy(),delete this._sharedRenderPipelineCache[t]))}_destroyPipeline(e){let t=this._getCache(e);return this.device.props._destroyPipelines?(delete t[e.hash],e.destroy(),e instanceof U.RenderPipeline&&this.releaseSharedRenderPipeline(e),!0):!1}_getCache(e){let t;if(e instanceof U.ComputePipeline&&(t=this._computePipelineCache),e instanceof U.RenderPipeline&&(t=this._renderPipelineCache),!t)throw new Error(`${this}`);if(!t[e.hash])throw new Error(`${this}: ${e} matched incorrect entry`);return t}_hashComputePipeline(e){let{type:t}=this.device,i=this._getHash(e.shader.source);return`${t}/C/${i}`}_hashRenderPipeline(e){let t=e.vs?this._getHash(e.vs.source):0,i=e.fs?this._getHash(e.fs.source):0,r=this._getWebGLVaryingHash(e),n=this._getHash(JSON.stringify(e.bufferLayout)),{type:o}=this.device;switch(o){case"webgl":let a=this._getHash(JSON.stringify(e.parameters));return`${o}/R/${t}/${i}V${r}T${e.topology}P${a}BL${n}`;case"webgpu":default:let c=this._getHash(JSON.stringify(e.parameters));return`${o}/R/${t}/${i}V${r}T${e.topology}P${c}BL${n}`}}_hashSharedRenderPipeline(e){let t=e.vs?this._getHash(e.vs.source):0,i=e.fs?this._getHash(e.fs.source):0,r=this._getWebGLVaryingHash(e);return`webgl/S/${t}/${i}V${r}`}_getHash(e){return this._hashes[e]===void 0&&(this._hashes[e]=this._hashCounter++),this._hashes[e]}_getWebGLVaryingHash(e){let{varyings:t=[],bufferMode:i=null}=e;return this._getHash(JSON.stringify({varyings:t,bufferMode:i}))}},ee=yt;$(ee,"defaultProps",{...U.RenderPipeline.defaultProps});var le=k(B(),1);var bt=class{static getDefaultShaderFactory(e){let t=e.getModuleData("@luma.gl/engine");return t.defaultShaderFactory||=new bt(e),t.defaultShaderFactory}device;_cache={};get[Symbol.toStringTag](){return"ShaderFactory"}toString(){return`${this[Symbol.toStringTag]}(${this.device.id})`}constructor(e){this.device=e}createShader(e){if(!this.device.props._cacheShaders)return this.device.createShader(e);let t=this._hashShader(e),i=this._cache[t];if(i)i.useCount++,this.device.props.debugFactories&&le.log.log(3,`${this}: Reusing shader ${i.resource.id} count=${i.useCount}`)();else{let r=this.device.createShader({...e,id:e.id?`${e.id}-cached`:void 0});this._cache[t]=i={resource:r,useCount:1},this.device.props.debugFactories&&le.log.log(3,`${this}: Created new shader ${r.id}`)()}return i.resource}release(e){if(!this.device.props._cacheShaders){e.destroy();return}let t=this._hashShader(e),i=this._cache[t];if(i)if(i.useCount--,i.useCount===0)this.device.props._destroyShaders&&(delete this._cache[t],i.resource.destroy(),this.device.props.debugFactories&&le.log.log(3,`${this}: Releasing shader ${e.id}, destroyed`)());else{if(i.useCount<0)throw new Error(`ShaderFactory: Shader ${e.id} released too many times`);this.device.props.debugFactories&&le.log.log(3,`${this}: Releasing shader ${e.id} count=${i.useCount}`)()}}_hashShader(e){return`${e.stage}:${e.source}`}},te=bt;$(te,"defaultProps",{...le.Shader.defaultProps});function Jt(s,e){let t={},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}`;t[`in ${n}`]={[i]:r.stepMode||"vertex"}}for(let r of s.varyings||[]){let n=`${r.location} ${r.name}`;t[`out ${n}`]={[i]:JSON.stringify(r)}}return t}var N=null,vt=null;function es(s,{id:e,minimap:t,opaque:i,top:r="0",left:n="0",rgbaScale:o=1}){N||(N=document.createElement("canvas"),N.id=e,N.title=e,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),vt=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=vt?.createImageData(s.width,s.height);if(c){for(let h=0;h<a.length;h+=4)c.data[0+h+0]=a[h+0]*o,c.data[0+h+1]=a[h+1]*o,c.data[0+h+2]=a[h+2]*o,c.data[0+h+3]=i?255:a[h+3]*o;vt?.putImageData(c,0,0)}}function We(s,e,t){if(s===e)return!0;if(!t||!s||!e)return!1;if(Array.isArray(s)){if(!Array.isArray(e)||s.length!==e.length)return!1;for(let i=0;i<s.length;i++)if(!We(s[i],e[i],t-1))return!1;return!0}if(Array.isArray(e))return!1;if(typeof s=="object"&&typeof e=="object"){let i=Object.keys(s),r=Object.keys(e);if(i.length!==r.length)return!1;for(let n of i)if(!e.hasOwnProperty(n)||!We(s[n],e[n],t-1))return!1;return!0}return!1}var ts=k(B(),1),ge=class{bufferLayouts;constructor(e){this.bufferLayouts=e}getBufferLayout(e){return this.bufferLayouts.find(t=>t.name===e)||null}getAttributeNamesForBuffer(e){return e.attributes?e.attributes?.map(t=>t.attribute):[e.name]}mergeBufferLayouts(e,t){let i=[...e];for(let r of t){let n=i.findIndex(o=>o.name===r.name);n<0?i.push(r):i[n]=r}return i}getBufferIndex(e){let t=this.bufferLayouts.findIndex(i=>i.name===e);return t===-1&&ts.log.warn(`BufferLayout: Missing buffer for "${e}".`)(),t}};function ss(s,e){let t=1/0;for(let i of s){let r=e[i];r!==void 0&&(t=Math.min(t,r))}return t}function is(s,e){let t=Object.fromEntries(s.attributes.map(r=>[r.name,r.location])),i=e.slice();return i.sort((r,n)=>{let o=r.attributes?r.attributes.map(h=>h.attribute):[r.name],a=n.attributes?n.attributes.map(h=>h.attribute):[n.name],c=ss(o,t),l=ss(a,t);return c-l}),i}var He=k(B(),1),as=k(he(),1);function rs(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function ns(s){return Array.isArray(s)?s.length===0||typeof s[0]=="number":!1}function Pe(s){return rs(s)||ns(s)}function Ti(s){return Pe(s)||typeof s=="number"||typeof s=="boolean"}function os(s){let e={bindings:{},uniforms:{}};return Object.keys(s).forEach(t=>{let i=s[t];Ti(i)?e.uniforms[t]=i:e.bindings[t]=i}),e}var Z=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(e,t){Object.assign(this.options,t);let i=(0,as.getShaderModuleDependencies)(Object.values(e).filter(r=>r.dependencies));for(let r of i)e[r.name]=r;He.log.log(1,"Creating ShaderInputs with modules",Object.keys(e))(),this.modules=e,this.moduleUniforms={},this.moduleBindings={};for(let[r,n]of Object.entries(e))this._addModule(n),n.name&&r!==n.name&&!this.options.disableWarnings&&He.log.warn(`Module name: ${r} vs ${n.name}`)()}destroy(){}setProps(e){for(let t of Object.keys(e)){let i=t,r=e[i]||{},n=this.modules[i];if(!n){this.options.disableWarnings||He.log.warn(`Module ${t} not found`)();continue}let o=this.moduleUniforms[i],a=this.moduleBindings[i],c=n.getUniforms?.(r,o)||r,{uniforms:l,bindings:h}=os(c);this.moduleUniforms[i]={...o,...l},this.moduleBindings[i]={...a,...h}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let e={};for(let t of Object.values(this.moduleBindings))Object.assign(e,t);return e}getDebugTable(){let e={};for(let[t,i]of Object.entries(this.moduleUniforms))for(let[r,n]of Object.entries(i))e[`${t}.${r}`]={type:this.modules[t].uniformTypes?.[r],value:String(n)};return e}_addModule(e){let t=e.name;this.moduleUniforms[t]=e.defaultUniforms||{},this.moduleBindings[t]={}}};var F=k(B(),1);var Ee=k(B(),1);var Mt={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Ce(s){return s?Array.isArray(s)?s[0]??null:s:null}function cs(s){let{dimension:e,data:t}=s;if(!t)return null;switch(e){case"1d":{let i=Ce(t);if(!i)return null;let{width:r}=Ie(i);return{width:r,height:1}}case"2d":{let i=Ce(t);return i?Ie(i):null}case"3d":case"2d-array":{if(!Array.isArray(t)||t.length===0)return null;let i=Ce(t[0]);return i?Ie(i):null}case"cube":{let i=Object.keys(t)[0]??null;if(!i)return null;let r=t[i],n=Ce(r);return n?Ie(n):null}case"cube-array":{if(!Array.isArray(t)||t.length===0)return null;let i=t[0],r=Object.keys(i)[0]??null;if(!r)return null;let n=Ce(i[r]);return n?Ie(n):null}default:return null}}function Ie(s){if((0,Ee.isExternalImage)(s))return(0,Ee.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 Ai(s){return typeof s=="object"&&s!==null&&"data"in s&&"width"in s&&"height"in s}function _t(s){let{textureFormat:e,format:t}=s;if(e&&t&&e!==t)throw new Error(`Conflicting texture formats "${e}" and "${t}" provided for the same mip level`);return e??t}function hs(s){let e=Mt[s];if(e===void 0)throw new Error(`Invalid cube face: ${s}`);return e}function Si(s,e){return 6*s+hs(e)}function wt(s){throw new Error("setTexture1DData not supported in WebGL.")}function Pi(s){return Array.isArray(s)?s:[s]}function de(s,e){let t=Pi(e),i=s,r=[];for(let n=0;n<t.length;n++){let o=t[n];if((0,Ee.isExternalImage)(o))r.push({type:"external-image",image:o,z:i,mipLevel:n});else if(Ai(o))r.push({type:"texture-data",data:o,textureFormat:_t(o),z:i,mipLevel:n});else throw new Error("Unsupported 2D mip-level payload")}return r}function Tt(s){let e=[];for(let t=0;t<s.length;t++)e.push(...de(t,s[t]));return e}function At(s){let e=[];for(let t=0;t<s.length;t++)e.push(...de(t,s[t]));return e}function St(s){let e=[];for(let[t,i]of Object.entries(s)){let r=hs(t);e.push(...de(r,i))}return e}function Pt(s){let e=[];return s.forEach((t,i)=>{for(let[r,n]of Object.entries(t)){let o=Si(i,r);e.push(...de(o,n))}}),e}var Ct=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(e,t){this.device=e;let i=C("dynamic-texture"),r=t;this.props={...Ct.defaultProps,id:i,...t,data:null},this.id=this.props.id,this.ready=new Promise((n,o)=>{this.resolveReady=n,this.rejectReady=o}),this.initAsync(r)}async initAsync(e){try{let t=await this._loadAllData(e);this._checkNotDestroyed();let i=t.data?Ci(t):[],r="format"in e&&e.format!==void 0,n="usage"in e&&e.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let f=cs(t);return f||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=Ii(this.device,i,a,{format:r?e.format:void 0}),l=c.format??this.props.format,h={...this.props,...a,format:l,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(l)&&!n&&(h.usage=F.Texture.SAMPLE|F.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(l);if(this.device.type==="webgpu"&&d){let f=this.props.dimension==="3d"?F.Texture.SAMPLE|F.Texture.STORAGE|F.Texture.COPY_DST|F.Texture.COPY_SRC:F.Texture.SAMPLE|F.Texture.RENDER|F.Texture.COPY_DST|F.Texture.COPY_SRC;h.usage|=f}let u=this.device.getMipLevelCount(h.width,h.height),g=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?u:Math.max(1,Math.min(u,this.props.mipLevels??1)),m={...h,mipLevels:g};this._texture=this.device.createTexture(m),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&F.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),F.log.info(0,`${this} created`)()}catch(t){let i=t instanceof Error?t:new Error(String(t));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():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):F.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(e={}){this._checkReady();let t=e instanceof F.Sampler?e:this.device.createSampler(e);this.texture.setSampler(t),this._sampler=t}resize(e){if(this._checkReady(),e.width===this.texture.width&&e.height===this.texture.height)return!1;let t=this.texture;return this._texture=t.clone(e),this._sampler=this.texture.sampler,this._view=this.texture.view,t.destroy(),F.log.info(`${this} resized`),!0}getCubeFaceIndex(e){let t=Mt[e];if(t===void 0)throw new Error(`Invalid cube face: ${e}`);return t}getCubeArrayFaceIndex(e,t){return 6*e+this.getCubeFaceIndex(t)}setTexture1DData(e){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let t=wt(e);this._setTextureSubresources(t)}setTexture2DData(e,t=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let i=de(t,e);this._setTextureSubresources(i)}setTexture3DData(e){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let t=Tt(e);this._setTextureSubresources(t)}setTextureArrayData(e){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let t=At(e);this._setTextureSubresources(t)}setTextureCubeData(e){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let t=St(e);this._setTextureSubresources(t)}setTextureCubeArrayData(e){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let t=Pt(e);this._setTextureSubresources(t)}_setTextureSubresources(e){for(let t of e){let{z:i,mipLevel:r}=t;switch(t.type){case"external-image":let{image:n,flipY:o}=t;this.texture.copyExternalImage({image:n,z:i,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=t;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:i,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(e){let t=await us(e.data);return{dimension:e.dimension??"2d",data:t??null}}_checkNotDestroyed(){this.destroyed&&F.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||F.log.warn(`${this} Cannot perform this operation before ready`)}},H=Ct;$(H,"defaultProps",{...F.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function Ci(s){if(!s.data)return[];switch(s.dimension){case"1d":return wt(s.data);case"2d":return de(0,s.data);case"3d":return Tt(s.data);case"2d-array":return At(s.data);case"cube":return St(s.data);case"cube-array":return Pt(s.data);default:throw new Error(`Unhandled dimension ${s.dimension}`)}}function Ii(s,e,t,i){if(e.length===0)return{subresources:e,mipLevels:1,format:i.format,hasExplicitMipChain:!1};let r=new Map;for(let h of e){let d=r.get(h.z)??[];d.push(h),r.set(h.z,d)}let n=e.some(h=>h.mipLevel>0),o=i.format,a=Number.POSITIVE_INFINITY,c=[];for(let[h,d]of r){let u=[...d].sort((_,p)=>_.mipLevel-p.mipLevel),g=u[0];if(!g||g.mipLevel!==0)throw new Error(`DynamicTexture: slice ${h} is missing mip level 0`);let m=ds(s,g);if(m.width!==t.width||m.height!==t.height)throw new Error(`DynamicTexture: slice ${h} base level dimensions ${m.width}x${m.height} do not match expected ${t.width}x${t.height}`);let f=ls(g);if(f){if(o&&o!==f)throw new Error(`DynamicTexture: slice ${h} base level format "${f}" does not match texture format "${o}"`);o=f}let y=o&&s.isTextureFormatCompressed(o)?Ei(s,m.width,m.height,o):s.getMipLevelCount(m.width,m.height),v=0;for(let _=0;_<u.length;_++){let p=u[_];if(!p||p.mipLevel!==_||_>=y)break;let x=ds(s,p),b=Math.max(1,m.width>>_),M=Math.max(1,m.height>>_);if(x.width!==b||x.height!==M)break;let A=ls(p);if(A&&(o||(o=A),A!==o))break;v++,c.push(p)}a=Math.min(a,v)}let l=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(h=>h.mipLevel<l),mipLevels:l,format:o,hasExplicitMipChain:n}}function ls(s){if(s.type==="texture-data")return s.textureFormat??_t(s.data)}function ds(s,e){switch(e.type){case"external-image":return s.getExternalImageSize(e.image);case"texture-data":return{width:e.data.width,height:e.data.height};default:throw new Error("Unsupported texture subresource")}}function Ei(s,e,t,i){let{blockWidth:r=1,blockHeight:n=1}=s.getTextureFormatInfo(i),o=1;for(let a=1;;a++){let c=Math.max(1,e>>a),l=Math.max(1,t>>a);if(c<r||l<n)break;o++}return o}async function us(s){if(s=await s,Array.isArray(s))return await Promise.all(s.map(us));if(s&&typeof s=="object"&&s.constructor===Object){let e=s,t=await Promise.all(Object.values(e)),i=Object.keys(e),r={};for(let n=0;n<i.length;n++)r[i[n]]=t[n];return r}return s}var ue=2,Ri=1e4,It=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(e,t){this.props={...It.defaultProps,...t},t=this.props,this.id=t.id||C("model"),this.device=e,Object.assign(this.userData,t.userData);let i=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=t.shaderInputs||new Z(i,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let n=Li(e),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:n,...this.props,modules:o});this.source=c,this._getModuleUniforms=l,this.props.shaderLayout||=e.getShaderLayout(this.source)}else{let{vs:c,fs:l,getUniforms:h}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:n,...this.props,modules:o});this.vs=c,this.fs=l,this._getModuleUniforms=h}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,t.geometry&&this.setGeometry(t.geometry),this.pipelineFactory=t.pipelineFactory||ee.getDefaultPipelineFactory(this.device),this.shaderFactory=t.shaderFactory||te.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=e.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in t&&(this.isInstanced=t.isInstanced),t.instanceCount&&this.setInstanceCount(t.instanceCount),t.vertexCount&&this.setVertexCount(t.vertexCount),t.indexBuffer&&this.setIndexBuffer(t.indexBuffer),t.attributes&&this.setAttributes(t.attributes),t.constantAttributes&&this.setConstantAttributes(t.constantAttributes),t.bindings&&this.setBindings(t.bindings),t.transformFeedback&&(this.transformFeedback=t.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let e=this._needsRedraw;return this._needsRedraw=!1,e}setNeedsRedraw(e){this._needsRedraw||=e}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(e){let t=this._areBindingsLoading();if(t)return P.log.info(ue,`>>> DRAWING ABORTED ${this.id}: ${t} not loaded`)(),!1;try{e.pushDebugGroup(`${this}.predraw(${e})`),this.predraw()}finally{e.popDebugGroup()}let i;try{e.pushDebugGroup(`${this}.draw(${e})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let r=this._getBindings(),{indexBuffer:n}=this.vertexArray,o=n?n.byteLength/(n.indexType==="uint32"?4:2):void 0;i=this.pipeline.draw({renderPass:e,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:o,transformFeedback:this.transformFeedback||void 0,bindings:r,uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}finally{e.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(e),i?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",i}setGeometry(e){this._gpuGeometry?.destroy();let t=e&&Qt(this.device,e);if(t){this.setTopology(t.topology||"triangle-list");let i=new ge(this.bufferLayout);this.bufferLayout=i.mergeBufferLayouts(t.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(t)}this._gpuGeometry=t}setTopology(e){e!==this.topology&&(this.topology=e,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(e){let t=new ge(this.bufferLayout);this.bufferLayout=this._gpuGeometry?t.mergeBufferLayouts(e,this._gpuGeometry.bufferLayout):e,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(e){We(e,this.parameters,2)||(this.parameters=e,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(e){this.instanceCount=e,this.isInstanced===void 0&&e>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(e){this.vertexCount=e,this.setNeedsRedraw("vertexCount")}setShaderInputs(e){this.shaderInputs=e,this._uniformStore=new P.UniformStore(this.shaderInputs.modules);for(let[t,i]of Object.entries(this.shaderInputs.modules))if(Oi(i)){let r=this._uniformStore.getManagedUniformBuffer(this.device,t);this.bindings[`${t}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this.shaderInputs.getBindingValues()),this.setNeedsRedraw("shaderInputs")}setBindings(e){Object.assign(this.bindings,e),this.setNeedsRedraw("bindings")}setTransformFeedback(e){this.transformFeedback=e,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(e){this.vertexArray.setIndexBuffer(e),this.setNeedsRedraw("indexBuffer")}setAttributes(e,t){let i=t?.disableWarnings??this.props.disableWarnings;e.indices&&P.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=is(this.pipeline.shaderLayout,this.bufferLayout);let r=new ge(this.bufferLayout);for(let[n,o]of Object.entries(e)){let a=r.getBufferLayout(n);if(!a){i||P.log.warn(`Model(${this.id}): Missing layout for buffer "${n}".`)();continue}let c=r.getAttributeNamesForBuffer(a),l=!1;for(let h of c){let d=this._attributeInfos[h];if(d){let u=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(u,o),l=!0}}!l&&!i&&P.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${n}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(e,t){for(let[i,r]of Object.entries(e)){let n=this._attributeInfos[i];n?this.vertexArray.setConstantWebGL(n.location,r):(t?.disableWarnings??this.props.disableWarnings)||P.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${i}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let e of Object.values(this.bindings))if(e instanceof H&&!e.isReady)return e.id;return!1}_getBindings(){let e={};for(let[t,i]of Object.entries(this.bindings))i instanceof H?i.isReady&&(e[t]=i.texture):e[t]=i;return e}_getBindingsUpdateTimestamp(){let e=0;for(let t of Object.values(this.bindings))t instanceof P.TextureView?e=Math.max(e,t.texture.updateTimestamp):t instanceof P.Buffer||t instanceof P.Texture?e=Math.max(e,t.updateTimestamp):t instanceof H?e=t.texture?Math.max(e,t.texture.updateTimestamp):1/0:t instanceof P.Sampler||(e=Math.max(e,t.buffer.updateTimestamp));return e}_setGeometryAttributes(e){let t={...e.attributes};for(let[i]of Object.entries(t))!this.pipeline.shaderLayout.attributes.find(r=>r.name===i)&&i!=="positions"&&delete t[i];this.vertexCount=e.vertexCount,this.setIndexBuffer(e.indices||null),this.setAttributes(e.attributes,{disableWarnings:!0}),this.setAttributes(t,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(e){this._pipelineNeedsUpdate||=e,this.setNeedsRedraw(e)}_updatePipeline(){if(this._pipelineNeedsUpdate){let e=null,t=null;this.pipeline&&(P.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),e=this.pipeline.vs,t=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,P.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),e&&this.shaderFactory.release(e),t&&t!==e&&this.shaderFactory.release(t)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let e=P.log.level>3?0:Ri;P.log.level<2||Date.now()-this._lastLogTime<e||(this._lastLogTime=Date.now(),this._logOpen=!0,P.log.group(ue,`>>> DRAWING MODEL ${this.id}`,{collapsed:P.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let e=Jt(this.pipeline.shaderLayout,this.id);P.log.table(ue,e)();let t=this.shaderInputs.getDebugTable();P.log.table(ue,t)();let i=this._getAttributeDebugTable();P.log.table(ue,this._attributeInfos)(),P.log.table(ue,i)(),P.log.groupEnd(ue)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(e){let t=this.device.props.debugFramebuffers;if(this._drawCount++,!t)return;let i=e.props.framebuffer;i&&es(i,{id:i.id,minimap:!0})}_getAttributeDebugTable(){let e={};for(let[t,i]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[i.location];e[i.location]={name:t,type:i.shaderType,values:r?this._getBufferOrConstantValues(r,i.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:t}=this.vertexArray,i=t.indexType==="uint32"?new Uint32Array(t.debugData):new Uint16Array(t.debugData);e.indices={name:"indices",type:t.indexType,values:i.toString()}}return e}_getBufferOrConstantValues(e,t){let i=(0,P.getTypedArrayConstructor)(t);return(e instanceof P.Buffer?new i(e.debugData):e).toString()}},X=It;$(X,"defaultProps",{...P.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:fs.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function Oi(s){return Boolean(s.uniformTypes&&!ki(s.uniformTypes))}function Li(s){return{type:s.type,shaderLanguage:s.info.shadingLanguage,shaderLanguageVersion:s.info.shadingLanguageVersion,gpu:s.info.gpu,features:s.features}}function ki(s){for(let e in s)return!1;return!0}var ps=k(B(),1),ms=k(he(),1);var Ye=class{device;model;transformFeedback;static isSupported(e){return e?.info?.type==="webgl"}constructor(e,t=Ye.defaultProps){if(!Ye.isSupported(e))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=e,this.model=new X(this.device,{id:t.id||"buffer-transform-model",fs:t.fs||(0,ms.getPassthroughFS)(),topology:t.topology||"point-list",varyings:t.outputs||t.varyings,...t}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:t.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(e){e?.inputBuffers&&this.model.setAttributes(e.inputBuffers),e?.outputBuffers&&this.transformFeedback.setBuffers(e.outputBuffers);let t=this.device.beginRenderPass(e);this.model.draw(t),t.end()}getBuffer(e){return this.transformFeedback.getBuffer(e)}readAsync(e){let t=this.getBuffer(e);if(!t)throw new Error("BufferTransform#getBuffer");if(t instanceof ps.Buffer)return t.readAsync();let{buffer:i,byteOffset:r=0,byteLength:n=i.byteLength}=t;return i.readAsync(r,n)}},Re=Ye;$(Re,"defaultProps",{...X.defaultProps,outputs:void 0,feedbackBuffers:void 0});var gs=k(he(),1);var Fi="transform_output",Xe=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(e,t){this.device=e,this.sampler=e.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new X(this.device,{id:t.id||C("texture-transform-model"),fs:t.fs||(0,gs.getPassthroughFS)({input:t.targetTextureVarying,inputChannels:t.targetTextureChannels,output:Fi}),vertexCount:t.vertexCount,...t}),this._initialize(t),Object.seal(this)}destroy(){this.model.destroy();for(let e of this.bindings)e.framebuffer?.destroy()}delete(){this.destroy()}run(e){let{framebuffer:t}=this.bindings[this.currentIndex],i=this.device.beginRenderPass({framebuffer:t,...e});this.model.draw(i),i.end(),this.device.submit()}getTargetTexture(){let{targetTexture:e}=this.bindings[this.currentIndex];return e}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(e){this._updateBindings(e)}_updateBindings(e){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],e)}_updateBinding(e,{sourceBuffers:t,sourceTextures:i,targetTexture:r}){if(e||(e={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(e.sourceTextures,i),Object.assign(e.sourceBuffers,t),r){e.targetTexture=r;let{width:n,height:o}=r;e.framebuffer&&e.framebuffer.destroy(),e.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:n,height:o,colorAttachments:[r]}),e.framebuffer.resize({width:n,height:o})}return e}_setSourceTextureParameters(){let e=this.currentIndex,{sourceTextures:t}=this.bindings[e];for(let i in t)t[i].sampler=this.sampler}};var G=class{id;topology;vertexCount;indices;attributes;userData={};constructor(e){let{attributes:t={},indices:i=null,vertexCount:r=null}=e;this.id=e.id||C("geometry"),this.topology=e.topology,i&&(this.indices=ArrayBuffer.isView(i)?{value:i,size:1}:i),this.attributes={};for(let[n,o]of Object.entries(t)){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(e){return`Geometry ${this.id} attribute ${e}`}_setAttributes(e,t){return this}_calculateVertexCount(e,t){if(t)return t.value.length;let i=1/0;for(let r of Object.values(e)){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 Ni=`struct VertexInputs {
7
+ "use strict";var __exports__=(()=>{var Hn=Object.create;var Ct=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var Yn=Object.getOwnPropertyNames;var Kn=Object.getPrototypeOf,Zn=Object.prototype.hasOwnProperty;var Qn=(i,t,e)=>t in i?Ct(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var pi=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Jn=(i,t)=>{for(var e in t)Ct(i,e,{get:t[e],enumerable:!0})},Yt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Yn(t))!Zn.call(i,r)&&r!==e&&Ct(i,r,{get:()=>t[r],enumerable:!(n=Wn(t,r))||n.enumerable});return i},Kt=(i,t,e)=>(Yt(i,t,"default"),e&&Yt(e,t,"default")),R=(i,t,e)=>(e=i!=null?Hn(Kn(i)):{},Yt(t||!i||!i.__esModule?Ct(e,"default",{value:i,enumerable:!0}):e,i)),tr=i=>Yt(Ct({},"__esModule",{value:!0}),i);var K=(i,t,e)=>(Qn(i,typeof t!="symbol"?t+"":t,e),e);var U=pi((Ks,gi)=>{gi.exports=globalThis.luma});var rt=pi((xo,Mi)=>{Mi.exports=globalThis.luma});var Vt={};Jn(Vt,{AnimationLoop:()=>lt,AnimationLoopTemplate:()=>Jt,AsyncTexture:()=>Ws,BackgroundTextureModel:()=>_t,BufferTransform:()=>zt,ClipSpace:()=>st,Computation:()=>Gt,ConeGeometry:()=>ct,CubeGeometry:()=>be,CylinderGeometry:()=>Me,DirectionalLightModel:()=>xe,DynamicTexture:()=>z,GPUGeometry:()=>pt,Geometry:()=>V,GroupNode:()=>ft,IcoSphereGeometry:()=>_e,KeyFrames:()=>Qt,LegacyPickingManager:()=>Le,Material:()=>Mt,MaterialFactory:()=>bt,Model:()=>W,ModelNode:()=>ye,PickingManager:()=>Ut,PlaneGeometry:()=>Ie,PointLightModel:()=>pe,ScenegraphNode:()=>it,ShaderInputs:()=>$,ShaderPassRenderer:()=>we,SphereGeometry:()=>It,SpotLightModel:()=>ge,Swap:()=>Tt,SwapBuffers:()=>ve,SwapFramebuffers:()=>Pt,TextureTransform:()=>se,Timeline:()=>Zt,TruncatedConeGeometry:()=>at,cancelAnimationFramePolyfill:()=>ee,colorPicking:()=>$t,indexPicking:()=>Se,legacyColorPicking:()=>Un,loadImage:()=>On,loadImageBitmap:()=>En,makeAnimationLoop:()=>bi,makeRandomGenerator:()=>Ln,picking:()=>jn,requestAnimationFramePolyfill:()=>te,resolvePickingBackend:()=>zn,resolvePickingMode:()=>Pe,setPathPrefix:()=>Cn,supportsIndexPicking:()=>fi});Kt(Vt,R(U(),1));var er=1,ir=1,Zt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:n=Number.POSITIVE_INFINITY,rate:r=1,repeat:s=1}=t,o=er++,a={time:0,delay:e,duration:n,rate:r,repeat:s};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,n]of this.animations)n.channel===t&&this.detachAnimation(e)}isFinished(t){let e=this.channels.get(t);return e===void 0?!1:this.time>=e.delay+e.duration*e.repeat}getTime(t){if(t===void 0)return this.time;let e=this.channels.get(t);return e===void 0?-1:e.time}setTime(t){this.time=Math.max(0,t);let e=this.channels.values();for(let r of e)this._setChannelTime(r,this.time);let n=this.animations.values();for(let r of n){let{animation:s,channel:o}=r;s.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let n=ir++;return this.animations.set(n,{animation:t,channel:e}),t.setTime(this.getTime(e)),n}detachAnimation(t){this.animations.delete(t)}update(t){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=t),this.setTime(this.time+(t-this.lastEngineTime)),this.lastEngineTime=t)}_setChannelTime(t,e){let n=e-t.delay,r=t.duration*t.repeat;n>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,n)%t.duration,t.time*=t.rate)}};var Qt=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(t){this.setKeyFrames(t),this.setTime(0)}setKeyFrames(t){let e=t.length;this.times.length=e,this.values.length=e;for(let n=0;n<e;++n)this.times[n]=t[n][0],this.values[n]=t[n][1];this._calculateKeys(this._lastTime)}setTime(t){t=Math.max(0,t),t!==this._lastTime&&(this._calculateKeys(t),this._lastTime=t)}getStartTime(){return this.times[this.startIndex]}getEndTime(){return this.times[this.endIndex]}getStartData(){return this.values[this.startIndex]}getEndData(){return this.values[this.endIndex]}_calculateKeys(t){let e=0,n=this.times.length;for(e=0;e<n-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],s=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(s-r)),1)}};var Jt=class{constructor(t){}async onInitialize(t){return null}};var xi=R(U(),1);function te(i){let t=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return t?t.call(window,i):setTimeout(()=>i(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function ee(i){let t=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(t){t.call(window,i);return}clearTimeout(i)}function Et(){let i;if(typeof window<"u"&&window.performance)i=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();i=t[0]*1e3+t[1]/1e6}else i=Date.now();return i}var ht=class{constructor(t,e){this.sampleSize=1,this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this.name=t,this.type=e,this.reset()}reset(){return this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this}setSampleSize(t){return this.sampleSize=t,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(t){return this._count+=t,this._samples++,this._checkSampling(),this}subtractCount(t){return this._count-=t,this._samples++,this._checkSampling(),this}addTime(t){return this._time+=t,this.lastTiming=t,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Et(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Et()-this._startTime),this._timerPending=!1,this._checkSampling(),this):this}getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0}getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0}getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1e3):0}getAverageCount(){return this.samples>0?this.count/this.samples:0}getAverageTime(){return this.samples>0?this.time/this.samples:0}getHz(){return this.time>0?this.samples/(this.time/1e3):0}_checkSampling(){this._samples===this.sampleSize&&(this.lastSampleTime=this._time,this.lastSampleCount=this._count,this.count+=this._count,this.time+=this._time,this.samples+=this._samples,this._time=0,this._count=0,this._samples=0)}};var mt=class{constructor(t){this.stats={},this.id=t.id,this.stats={},this._initializeStats(t.stats),Object.seal(this)}get(t,e="count"){return this._getOrCreate({name:t,type:e})}get size(){return Object.keys(this.stats).length}reset(){for(let t of Object.values(this.stats))t.reset();return this}forEach(t){for(let e of Object.values(this.stats))t(e)}getTable(){let t={};return this.forEach(e=>{t[e.name]={time:e.time||0,count:e.count||0,average:e.getAverageTime()||0,hz:e.getHz()||0}}),t}_initializeStats(t=[]){t.forEach(e=>this._getOrCreate(e))}_getOrCreate(t){let{name:e,type:n}=t,r=this.stats[e];return r||(t instanceof ht?r=t:r=new ht(e,n),this.stats[e]=r),r}};var nr=0,rr="Animation Loop",Ce=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(t){if(this.props={...Ce.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new mt({id:`animation-loop-${nr++}`}),this.sharedStats=xi.luma.stats.get(rr),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:t.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this._needsRedraw=this._needsRedraw||t,this}needsRedraw(){let t=this._needsRedraw;return this._needsRedraw=!1,t}setProps(t){return"autoResizeViewport"in t&&(this.props.autoResizeViewport=t.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let t;if(!this._initialized){if(this._initialized=!0,await this._initDevice(),this._initialize(),!this._running)return null;await this.props.onInitialize(this._getAnimationProps())}return this._running?(t!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(t){let e=t instanceof Error?t:new Error("Unknown error");throw this.props.onError(e),e}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(t){return this.device?.isLost||this._error?this:(this._beginFrameTimers(t),this._setupFrame(),this._updateAnimationProps(),this._renderFrame(this._getAnimationProps()),this._clearNeedsRedraw(),this._resolveNextFrame&&(this._resolveNextFrame(this),this._nextFramePromise=null,this._resolveNextFrame=null),this._endFrameTimers(),this)}attachTimeline(t){return this.timeline=t,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(t=>{this._resolveNextFrame=t})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=te(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(ee(this._animationFrameId),this._animationFrameId=null)}_animationFrame(t){this._running&&(this.redraw(t),this._requestAnimationFrame())}_renderFrame(t){if(this.display){this.display._renderFrame(t);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let t=this.device?.getDefaultCanvasContext();if(!this.device||!t)throw new Error("loop");let e=t?.canvas,n=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:n,timeline:this.timeline,needsRedraw:!1,width:1,height:1,aspect:1,time:0,startTime:Date.now(),engineTime:0,tick:0,tock:0,_mousePosition:null}}_getAnimationProps(){if(!this.animationProps)throw new Error("animationProps");return this.animationProps}_updateAnimationProps(){if(!this.animationProps)return;let{width:t,height:e,aspect:n}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),n!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=n,this.animationProps.needsRedraw=this._needsRedraw,this.animationProps.engineTime=Date.now()-this.animationProps.startTime,this.timeline&&this.timeline.update(this.animationProps.engineTime),this.animationProps.tick=Math.floor(this.animationProps.time/1e3*60),this.animationProps.tock++,this.animationProps.time=this.timeline?this.timeline.getTime():this.animationProps.engineTime}async _initDevice(){if(this.device=await this.props.device,!this.device)throw new Error("No device provided");this.canvas=this.device.getDefaultCanvasContext().canvas||null}_createInfoDiv(){if(this.canvas&&this.props.onAddHTML){let t=document.createElement("div");document.body.appendChild(t),t.style.position="relative";let e=document.createElement("div");e.style.position="absolute",e.style.left="10px",e.style.bottom="10px",e.style.width="300px",e.style.background="white",this.canvas instanceof HTMLCanvasElement&&t.appendChild(this.canvas),t.appendChild(e);let n=this.props.onAddHTML(e);n&&(e.innerHTML=n)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),n=t>0&&e>0?t/e:1;return{width:t,height:e,aspect:n}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(t){let e=t??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let n=e-this._lastFrameTime;n>0&&this.frameRate.addTime(n)}this._lastFrameTime=e,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let t=this.device.commandEncoder._gpuTimeMs;t!==void 0&&(this.gpuTime.addTime(t),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let t of Object.keys(this.sharedStats.stats))this.stats.stats[t]||delete this.sharedStats.stats[t];this.stats.forEach(t=>{let e=this.sharedStats.get(t.name,t.type);e.sampleSize=t.sampleSize,e.time=t.time,e.count=t.count,e.samples=t.samples,e.lastTiming=t.lastTiming,e.lastSampleTime=t.lastSampleTime,e.lastSampleCount=t.lastSampleCount,e._count=t._count,e._time=t._time,e._samples=t._samples,e._startTime=t._startTime,e._timerPending=t._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(t){t instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[t.offsetX,t.offsetY])}_onMouseleave(t){this._getAnimationProps()._mousePosition=null}},lt=Ce;K(lt,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:void 0,autoResizeViewport:!1});var yi=R(U(),1);function bi(i,t){let e=null,n=t?.device||yi.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new lt({...t,device:n,async onInitialize(s){or(s.animationLoop.device);try{return e=new i(s),await e?.onInitialize(s)}catch(o){return sr(s.animationLoop.device,o),null}},onRender:s=>e?.onRender(s),onFinalize:s=>e?.onFinalize(s)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function sr(i,t){if(!i)return;let e=i.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let n=document.getElementById("animation-loop-error");n?.remove(),n=document.createElement("h1"),n.id="animation-loop-error",n.innerHTML=t.message,n.style.position="absolute",n.style.top="10px",n.style.left="10px",n.style.color="black",n.style.backgroundColor="red",e.parentElement?.appendChild(n)}}function or(i){if(!i)return;let t=document.getElementById("animation-loop-error");t&&t.remove()}var w=R(U(),1),Di=R(rt(),1);var Ot=R(U(),1);var Ee={};function S(i="id"){Ee[i]=Ee[i]||1;let t=Ee[i]++;return`${i}-${t}`}var pt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||S("geometry"),this.topology=t.topology,this.indices=t.indices||null,this.attributes=t.attributes,this.vertexCount=t.vertexCount,this.bufferLayout=t.bufferLayout||[],this.indices&&!(this.indices.usage&Ot.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let t of Object.values(this.attributes))t.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(t){return t.byteLength/12}};function _i(i,t){if(t instanceof pt)return t;let e=ar(i,t),{attributes:n,bufferLayout:r}=cr(i,t);return new pt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:n})}function ar(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Ot.Buffer.INDEX,data:e})}function cr(i,t){let e=[],n={};for(let[s,o]of Object.entries(t.attributes)){let a=s;switch(s){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"COLOR_0":a="colors";break}if(o){n[a]=i.createBuffer({data:o.value,id:`${s}-buffer`});let{value:c,size:h,normalized:l}=o;if(h===void 0)throw new Error(`Attribute ${s} is missing a size`);e.push({name:a,format:Ot.vertexFormatDecoder.getVertexFormatFromAttribute(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:n,bufferLayout:e,vertexCount:r}}function Ii(i,t){let e={},n="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[n]:"N/A"}};for(let r of i.attributes)if(r){let s=`${r.location} ${r.name}: ${r.type}`;e[`in ${s}`]={[n]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let s=`${r.location} ${r.name}`;e[`out ${s}`]={[n]:JSON.stringify(r)}}return e}var F=null,Oe=null;function vi(i,{id:t,minimap:e,opaque:n,top:r="0",left:s="0",rgbaScale:o=1}){F||(F=document.createElement("canvas"),F.id=t,F.title=t,F.style.zIndex="100",F.style.position="absolute",F.style.top=r,F.style.left=s,F.style.border="blue 5px solid",F.style.transform="scaleY(-1)",document.body.appendChild(F),Oe=F.getContext("2d")),(F.width!==i.width||F.height!==i.height)&&(F.width=i.width/2,F.height=i.height/2,F.style.width="400px",F.style.height="400px");let a=i.device.readPixelsToArrayWebGL(i),c=Oe?.createImageData(i.width,i.height);if(c){for(let l=0;l<a.length;l+=4)c.data[0+l+0]=a[l+0]*o,c.data[0+l+1]=a[l+1]*o,c.data[0+l+2]=a[l+2]*o,c.data[0+l+3]=n?255:a[l+3]*o;Oe?.putImageData(c,0,0)}}function ie(i,t,e){if(i===t)return!0;if(!e||!i||!t)return!1;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return!1;for(let n=0;n<i.length;n++)if(!ie(i[n],t[n],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let n=Object.keys(i),r=Object.keys(t);if(n.length!==r.length)return!1;for(let s of n)if(!t.hasOwnProperty(s)||!ie(i[s],t[s],e-1))return!1;return!0}return!1}var wi=R(U(),1),gt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let n=[...t];for(let r of e){let s=n.findIndex(o=>o.name===r.name);s<0?n.push(r):n[s]=r}return n}getBufferIndex(t){let e=this.bufferLayouts.findIndex(n=>n.name===t);return e===-1&&wi.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ai(i,t){let e=1/0;for(let n of i){let r=t[n];r!==void 0&&(e=Math.min(e,r))}return e}function Ti(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),n=t.slice();return n.sort((r,s)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=s.attributes?s.attributes.map(l=>l.attribute):[s.name],c=Ai(o,e),h=Ai(a,e);return c-h}),n}function xt(i,t){if(!i||!t.some(n=>n.bindingLayout?.length))return i;let e={...i,bindings:i.bindings.map(n=>({...n}))};"attributes"in(i||{})&&(e.attributes=i?.attributes||[]);for(let n of t)for(let r of n.bindingLayout||[])for(let s of hr(r.name)){let o=e.bindings.find(a=>a.name===s);o?.group===0&&(o.group=r.group)}return e}function yt(i){return Boolean(i.uniformTypes&&!lr(i.uniformTypes))}function hr(i){let t=new Set([i,`${i}Uniforms`]);return i.endsWith("Uniforms")||t.add(`${i}Sampler`),[...t]}function lr(i){for(let t in i)return!1;return!0}var ne=R(U(),1),Ei=R(rt(),1);function Pi(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Si(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function kt(i){return Pi(i)||Si(i)}function dr(i){return kt(i)||typeof i=="number"||typeof i=="boolean"}function Li(i,t={}){let e={bindings:{},uniforms:{}};return Object.keys(i).forEach(n=>{let r=i[n];Object.prototype.hasOwnProperty.call(t,n)||dr(r)?e.uniforms[n]=r:e.bindings[n]=r}),e}var $=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let n=(0,Ei.getShaderModuleDependencies)(Object.values(t).filter(ur));for(let r of n)t[r.name]=r;ne.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,s]of Object.entries(t))s&&(this._addModule(s),s.name&&r!==s.name&&!this.options.disableWarnings&&ne.log.warn(`Module name: ${r} vs ${s.name}`)())}destroy(){}setProps(t){for(let e of Object.keys(t)){let n=e,r=t[n]||{},s=this.modules[n];if(!s){this.options.disableWarnings||ne.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[n],a=this.moduleBindings[n],c=s.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Li(c,s.uniformTypes);this.moduleUniforms[n]=Ci(o,h,s.uniformTypes),this.moduleBindings[n]={...a,...l}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let t={};for(let e of Object.values(this.moduleBindings))Object.assign(t,e);return t}getDebugTable(){let t={};for(let[e,n]of Object.entries(this.moduleUniforms))for(let[r,s]of Object.entries(n))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(s)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=Ci({},t.defaultUniforms||{},t.uniformTypes),this.moduleBindings[e]={}}};function Ci(i={},t={},e={}){let n={...i};for(let[r,s]of Object.entries(t))s!==void 0&&(n[r]=ke(i[r],s,e[r]));return n}function ke(i,t,e){if(!e||typeof e=="string")return Rt(t);if(Array.isArray(e)){if(Re(t)||!Array.isArray(t))return Rt(t);let o=Array.isArray(i)&&!Re(i)?[...i]:[],a=o.slice();for(let c=0;c<t.length;c++){let h=t[c];h!==void 0&&(a[c]=ke(o[c],h,e[0]))}return a}if(!Ne(t))return Rt(t);let n=e,r=Ne(i)?i:{},s={...r};for(let[o,a]of Object.entries(t))a!==void 0&&(s[o]=ke(r[o],a,n[o]));return s}function Rt(i){return ArrayBuffer.isView(i)?Array.prototype.slice.call(i):Array.isArray(i)?Re(i)?i.slice():i.map(e=>e===void 0?void 0:Rt(e)):Ne(i)?Object.fromEntries(Object.entries(i).map(([t,e])=>[t,e===void 0?void 0:Rt(e)])):i}function Re(i){return ArrayBuffer.isView(i)||Array.isArray(i)&&(i.length===0||typeof i[0]=="number")}function Ne(i){return Boolean(i)&&typeof i=="object"&&!Array.isArray(i)&&!ArrayBuffer.isView(i)}function ur(i){return Boolean(i?.dependencies)}var k=R(U(),1);var Ft=R(U(),1);var De={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Nt(i){return i?Array.isArray(i)?i[0]??null:i:null}function Oi(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let n=Nt(e);if(!n)return null;let{width:r}=Dt(n);return{width:r,height:1}}case"2d":{let n=Nt(e);return n?Dt(n):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let n=Nt(e[0]);return n?Dt(n):null}case"cube":{let n=Object.keys(e)[0]??null;if(!n)return null;let r=e[n],s=Nt(r);return s?Dt(s):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let n=e[0],r=Object.keys(n)[0]??null;if(!r)return null;let s=Nt(n[r]);return s?Dt(s):null}default:return null}}function Dt(i){if((0,Ft.isExternalImage)(i))return(0,Ft.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function fr(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function mr(i){return ArrayBuffer.isView(i)}function Fe(i){let{textureFormat:t,format:e}=i;if(t&&e&&t!==e)throw new Error(`Conflicting texture formats "${t}" and "${e}" provided for the same mip level`);return t??e}function ki(i){let t=De[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function pr(i,t){return 6*i+ki(t)}function Be(i){throw new Error("setTexture1DData not supported in WebGL.")}function gr(i){return Array.isArray(i)?i:[i]}function dt(i,t,e,n){let r=gr(t),s=i,o=[];for(let a=0;a<r.length;a++){let c=r[a];if((0,Ft.isExternalImage)(c))o.push({type:"external-image",image:c,z:s,mipLevel:a});else if(fr(c))o.push({type:"texture-data",data:c,textureFormat:Fe(c),z:s,mipLevel:a});else if(mr(c)&&e)o.push({type:"texture-data",data:{data:c,width:Math.max(1,e.width>>a),height:Math.max(1,e.height>>a),...n?{format:n}:{}},textureFormat:n,z:s,mipLevel:a});else throw new Error("Unsupported 2D mip-level payload")}return o}function ze(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function je(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function Ge(i){let t=[];for(let[e,n]of Object.entries(i)){let r=ki(e);t.push(...dt(r,n))}return t}function Ue(i){let t=[];return i.forEach((e,n)=>{for(let[r,s]of Object.entries(e)){let o=pr(n,r);t.push(...dt(o,s))}}),t}var Ve=class{device;id;props;_texture=null;_sampler=null;_view=null;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get texture(){if(!this._texture)throw new Error("Texture not initialized yet");return this._texture}get sampler(){if(!this._sampler)throw new Error("Sampler not initialized yet");return this._sampler}get view(){if(!this._view)throw new Error("View not initialized yet");return this._view}get[Symbol.toStringTag](){return"DynamicTexture"}toString(){return`DynamicTexture:"${this.id}":${this.texture.width}x${this.texture.height}px:(${this.isReady?"ready":"loading..."})`}constructor(t,e){this.device=t;let n=S("dynamic-texture"),r=e;this.props={...Ve.defaultProps,id:n,...e,data:null},this.id=this.props.id,this.ready=new Promise((s,o)=>{this.resolveReady=s,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let n=e.data?xr({...e,width:t.width,height:t.height,format:t.format}):[],r="format"in t&&t.format!==void 0,s="usage"in t&&t.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let f=Oi(e);return f||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=yr(this.device,n,a,{format:r?t.format:void 0}),h=c.format??this.props.format,l={...this.props,...a,format:h,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(h)&&!s&&(l.usage=k.Texture.SAMPLE|k.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(h);if(this.device.type==="webgpu"&&d){let f=this.props.dimension==="3d"?k.Texture.SAMPLE|k.Texture.STORAGE|k.Texture.COPY_DST|k.Texture.COPY_SRC:k.Texture.SAMPLE|k.Texture.RENDER|k.Texture.COPY_DST|k.Texture.COPY_SRC;l.usage|=f}let u=this.device.getMipLevelCount(l.width,l.height),g=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?u:Math.max(1,Math.min(u,this.props.mipLevels??1)),p={...l,mipLevels:g};this._texture=this.device.createTexture(p),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&k.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),k.log.info(0,`${this} created`)()}catch(e){let n=e instanceof Error?e:new Error(String(e));this.rejectReady(n)}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):k.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof k.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}async readBuffer(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=this.device.createBuffer({byteLength:s.byteLength,usage:k.Buffer.COPY_DST|k.Buffer.MAP_READ});this.texture.readBuffer({...t,width:e,height:n,depthOrArrayLayers:r},o);let a=this.device.createFence();return await a.signaled,a.destroy(),o}async readAsync(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=await this.readBuffer(t),a=await o.readAsync(0,s.byteLength);return o.destroy(),a.buffer}resize(t){if(this._checkReady(),t.width===this.texture.width&&t.height===this.texture.height)return!1;let e=this.texture;return this._texture=e.clone(t),this._sampler=this.texture.sampler,this._view=this.texture.view,e.destroy(),k.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=De[t];if(e===void 0)throw new Error(`Invalid cube face: ${t}`);return e}getCubeArrayFaceIndex(t,e){return 6*t+this.getCubeFaceIndex(e)}setTexture1DData(t){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let e=Be(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let n=dt(e,t);this._setTextureSubresources(n)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=ze(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=je(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=Ge(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=Ue(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:n,mipLevel:r}=e;switch(e.type){case"external-image":let{image:s,flipY:o}=e;this.texture.copyExternalImage({image:s,z:n,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=e;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:n,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await $e(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&k.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||k.log.warn(`${this} Cannot perform this operation before ready`)}},z=Ve;K(z,"defaultProps",{...k.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function xr(i){if(!i.data)return[];let t=i.width&&i.height?{width:i.width,height:i.height}:void 0,e="format"in i?i.format:void 0;switch(i.dimension){case"1d":return Be(i.data);case"2d":return dt(0,i.data,t,e);case"3d":return ze(i.data);case"2d-array":return je(i.data);case"cube":return Ge(i.data);case"cube-array":return Ue(i.data);default:throw new Error(`Unhandled dimension ${i.dimension}`)}}function yr(i,t,e,n){if(t.length===0)return{subresources:t,mipLevels:1,format:n.format,hasExplicitMipChain:!1};let r=new Map;for(let l of t){let d=r.get(l.z)??[];d.push(l),r.set(l.z,d)}let s=t.some(l=>l.mipLevel>0),o=n.format,a=Number.POSITIVE_INFINITY,c=[];for(let[l,d]of r){let u=[...d].sort((I,m)=>I.mipLevel-m.mipLevel),g=u[0];if(!g||g.mipLevel!==0)throw new Error(`DynamicTexture: slice ${l} is missing mip level 0`);let p=Ni(i,g);if(p.width!==e.width||p.height!==e.height)throw new Error(`DynamicTexture: slice ${l} base level dimensions ${p.width}x${p.height} do not match expected ${e.width}x${e.height}`);let f=Ri(g);if(f){if(o&&o!==f)throw new Error(`DynamicTexture: slice ${l} base level format "${f}" does not match texture format "${o}"`);o=f}let y=o&&i.isTextureFormatCompressed(o)?br(i,p.width,p.height,o):i.getMipLevelCount(p.width,p.height),M=0;for(let I=0;I<u.length;I++){let m=u[I];if(!m||m.mipLevel!==I||I>=y)break;let x=Ni(i,m),b=Math.max(1,p.width>>I),_=Math.max(1,p.height>>I);if(x.width!==b||x.height!==_)break;let T=Ri(m);if(T&&(o||(o=T),T!==o))break;M++,c.push(m)}a=Math.min(a,M)}let h=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(l=>l.mipLevel<h),mipLevels:h,format:o,hasExplicitMipChain:s}}function Ri(i){if(i.type==="texture-data")return i.textureFormat??Fe(i.data)}function Ni(i,t){switch(t.type){case"external-image":return i.getExternalImageSize(t.image);case"texture-data":return{width:t.data.width,height:t.data.height};default:throw new Error("Unsupported texture subresource")}}function br(i,t,e,n){let{blockWidth:r=1,blockHeight:s=1}=i.getTextureFormatInfo(n),o=1;for(let a=1;;a++){let c=Math.max(1,t>>a),h=Math.max(1,e>>a);if(c<r||h<s)break;o++}return o}async function $e(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map($e));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t).map($e)),n=Object.keys(t),r={};for(let s=0;s<n.length;s++)r[n[s]]=e[s];return r}return i}var ut=2,Mr=1e4,Xe=class{device;id;source;vs;fs;pipelineFactory;shaderFactory;userData={};parameters;topology;bufferLayout;isInstanced=void 0;instanceCount=0;vertexCount;indexBuffer=null;bufferAttributes={};constantAttributes={};bindings={};vertexArray;transformFeedback=null;pipeline;shaderInputs;material=null;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;_bindingTable=[];get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...Xe.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData),this.material=e.material||null;let n=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new $(n,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let s=_r(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.props.shaderLayout=xt(this.props.shaderLayout,o)||null,this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h,bindingTable:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:s,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this._bindingTable=l;let d=t.getShaderLayout?.(this.source);this.props.shaderLayout=xt(this.props.shaderLayout||d||null,o)||null}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:s,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l,this._bindingTable=[]}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,e.geometry&&this.setGeometry(e.geometry),this.pipelineFactory=e.pipelineFactory||w.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||w.ShaderFactory.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=t.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in e&&(this.isInstanced=e.isInstanced),e.instanceCount&&this.setInstanceCount(e.instanceCount),e.vertexCount&&this.setVertexCount(e.vertexCount),e.indexBuffer&&this.setIndexBuffer(e.indexBuffer),e.attributes&&this.setAttributes(e.attributes),e.constantAttributes&&this.setConstantAttributes(e.constantAttributes),e.bindings&&this.setBindings(e.bindings),e.transformFeedback&&(this.transformFeedback=e.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let t=this._needsRedraw;return this._needsRedraw=!1,t}setNeedsRedraw(t){this._needsRedraw||=t}getBindingDebugTable(){return this._bindingTable}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return w.log.info(ut,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let n;try{t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let r=this._getBindings(),s=this._getBindGroups(),{indexBuffer:o}=this.vertexArray,a=o?o.byteLength/(o.indexType==="uint32"?4:2):void 0;n=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:a,transformFeedback:this.transformFeedback||void 0,bindings:r,bindGroups:s,_bindGroupCacheKeys:this._getBindGroupCacheKeys(),uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),n?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",n}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&_i(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let n=new gt(this.bufferLayout);this.bufferLayout=n.mergeBufferLayouts(e.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(e)}this._gpuGeometry=e}setTopology(t){t!==this.topology&&(this.topology=t,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(t){let e=new gt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){ie(t,this.parameters,2)||(this.parameters=t,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(t){this.instanceCount=t,this.isInstanced===void 0&&t>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(t){this.vertexCount=t,this.setNeedsRedraw("vertexCount")}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new w.UniformStore(this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(yt(n)&&!this.material?.ownsModule(e)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}setMaterial(t){this.material=t,this.setNeedsRedraw("material")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this._getNonMaterialBindings(this.shaderInputs.getBindingValues())),this.setNeedsRedraw("shaderInputs")}setBindings(t){Object.assign(this.bindings,t),this.setNeedsRedraw("bindings")}setTransformFeedback(t){this.transformFeedback=t,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(t){this.vertexArray.setIndexBuffer(t),this.setNeedsRedraw("indexBuffer")}setAttributes(t,e){let n=e?.disableWarnings??this.props.disableWarnings;t.indices&&w.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ti(this.pipeline.shaderLayout,this.bufferLayout);let r=new gt(this.bufferLayout);for(let[s,o]of Object.entries(t)){let a=r.getBufferLayout(s);if(!a){n||w.log.warn(`Model(${this.id}): Missing layout for buffer "${s}".`)();continue}let c=r.getAttributeNamesForBuffer(a),h=!1;for(let l of c){let d=this._attributeInfos[l];if(d){let u=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(u,o),h=!0}}!h&&!n&&w.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${s}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[n,r]of Object.entries(t)){let s=this._attributeInfos[n];s?this.vertexArray.setConstantWebGL(s.location,r):(e?.disableWarnings??this.props.disableWarnings)||w.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${n}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof z&&!t.isReady)return t.id;for(let t of Object.values(this.material?.bindings||{}))if(t instanceof z&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))n instanceof z?n.isReady&&(t[e]=n.texture):t[e]=n;return t}_getBindGroups(){let t=this.pipeline?.shaderLayout||this.props.shaderLayout||{bindings:[]},e=t.bindings.length?(0,w.normalizeBindingsByGroup)(t,this._getBindings()):{0:this._getBindings()};if(!this.material)return e;for(let[n,r]of Object.entries(this.material.getBindingsByGroup())){let s=Number(n);e[s]={...e[s]||{},...r}}return e}_getBindGroupCacheKeys(){let t=this.material?.getBindGroupCacheKey(3);return t?{3:t}:{}}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof w.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof w.Buffer||e instanceof w.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof w.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return Math.max(t,this.material?.getBindingsUpdateTimestamp()||0)}_setGeometryAttributes(t){let e={...t.attributes};for(let[n]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===n)&&n!=="positions"&&delete e[n];this.vertexCount=t.vertexCount,this.setIndexBuffer(t.indices||null),this.setAttributes(t.attributes,{disableWarnings:!0}),this.setAttributes(e,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate||=t,this.setNeedsRedraw(t)}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null,e=null;this.pipeline&&(w.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let n=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=n:this.fs&&(r=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"fragment",source:this.source||this.fs,debugShaders:this.props.debugShaders})),this.pipeline=this.pipelineFactory.createRenderPipeline({...this.props,bindings:void 0,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindGroups:this._getBindGroups(),vs:n,fs:r}),this._attributeInfos=(0,w.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&e!==t&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=w.log.level>3?0:Mr;w.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,w.log.group(ut,`>>> DRAWING MODEL ${this.id}`,{collapsed:w.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Ii(this.pipeline.shaderLayout,this.id);w.log.table(ut,t)();let e=this.shaderInputs.getDebugTable();w.log.table(ut,e)();let n=this._getAttributeDebugTable();w.log.table(ut,this._attributeInfos)(),w.log.table(ut,n)(),w.log.groupEnd(ut)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let n=t.props.framebuffer;n&&vi(n,{id:n.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,n]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[n.location];t[n.location]={name:e,type:n.shaderType,values:r?this._getBufferOrConstantValues(r,n.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,n=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:n.toString()}}return t}_getBufferOrConstantValues(t,e){let n=w.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof w.Buffer?new n(t.debugData):t).toString()}_getNonMaterialBindings(t){if(!this.material)return t;let e={};for(let[n,r]of Object.entries(t))this.material.ownsBinding(n)||(e[n]=r);return e}},W=Xe;K(W,"defaultProps",{...w.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,material:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:Di.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function _r(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var J=R(U(),1);var Bt=3,bt=class{device;modules;_materialBindingNames;_materialModuleNames;constructor(t,e={}){this.device=t,this.modules=e.modules||[];let n=new $(Object.fromEntries(this.modules.map(r=>[r.name,r])));this._materialBindingNames=Ir(n),this._materialModuleNames=vr(n)}createMaterial(t={}){return new Mt(this.device,{...t,factory:this})}getBindingNames(){return Array.from(this._materialBindingNames)}ownsBinding(t){if(this._materialBindingNames.has(t))return!0;let e=qe(t);return e?this._materialModuleNames.has(e):!1}ownsModule(t){return this._materialModuleNames.has(t)}getBindingsByGroup(t){return Object.keys(t).length>0?{[Bt]:t}:{}}};function qe(i){return i.endsWith("Uniforms")?i.slice(0,-8):null}function Ir(i){let t=new Set;for(let e of Object.values(i.modules))for(let n of e.bindingLayout||[])n.group===Bt&&t.add(n.name);return t}function vr(i){let t=new Set;for(let e of Object.values(i.modules))e.name&&e.bindingLayout?.some(n=>n.group===Bt&&n.name===e.name)&&t.add(e.name);return t}var Mt=class{id;device;factory;shaderInputs;bindings={};_uniformStore;_bindGroupCacheToken={};constructor(t,e={}){this.id=e.id||S("material"),this.device=t,this.factory=e.factory||new bt(t,{modules:e.modules||e.shaderInputs?.getModules()||[]});let n=Object.fromEntries((e.shaderInputs?.getModules()||this.factory.modules).map(r=>[r.name,r]));this.shaderInputs=e.shaderInputs||new $(n),this._uniformStore=new J.UniformStore(this.shaderInputs.modules);for(let[r,s]of Object.entries(this.shaderInputs.modules))if(this.ownsModule(r)&&yt(s)){let o=this._uniformStore.getManagedUniformBuffer(this.device,r);this.bindings[`${r}Uniforms`]=o}this.updateShaderInputs(),e.bindings&&this._replaceOwnedBindings(e.bindings)}destroy(){this._uniformStore.destroy()}clone(t={}){let e=this.factory.createMaterial({id:t.id,shaderInputs:t.shaderInputs,bindings:{...this.getResourceBindings(),...t.bindings}});return t.shaderInputs||e.setProps(this.shaderInputs.getUniformValues()),t.moduleProps&&e.setProps(t.moduleProps),e}ownsBinding(t){return this.factory.ownsBinding(t)}ownsModule(t){return this.factory.ownsModule(t)}setProps(t){this.shaderInputs.setProps(t),this.updateShaderInputs()}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this._setOwnedBindings(this.shaderInputs.getBindingValues())&&(this._bindGroupCacheToken={})}getResourceBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))qe(e)||(t[e]=n);return t}getBindings(){let t={},e=t;for(let[n,r]of Object.entries(this.bindings))r instanceof z?r.isReady&&(e[n]=r.texture):e[n]=r;return t}getBindingsByGroup(){return this.factory.getBindingsByGroup(this.getBindings())}getBindGroupCacheKey(t){return t===Bt?this._bindGroupCacheToken:null}getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof J.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof J.Buffer||e instanceof J.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof J.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_replaceOwnedBindings(t){this._setOwnedBindings(t)&&(this._bindGroupCacheToken={})}_setOwnedBindings(t){let e=!1;for(let[n,r]of Object.entries(t))r!==void 0&&this.ownsBinding(n)&&this.bindings[n]!==r&&(this.bindings[n]=r,e=!0);return e}};var Fi=R(U(),1),Bi=R(rt(),1);var re=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=re.defaultProps){if(!re.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new W(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,Bi.getPassthroughFS)(),topology:e.topology||"point-list",varyings:e.outputs||e.varyings,...e}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:e.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(t){t?.inputBuffers&&this.model.setAttributes(t.inputBuffers),t?.outputBuffers&&this.transformFeedback.setBuffers(t.outputBuffers);let e=this.device.beginRenderPass(t);this.model.draw(e),e.end()}getBuffer(t){return this.transformFeedback.getBuffer(t)}readAsync(t){let e=this.getBuffer(t);if(!e)throw new Error("BufferTransform#getBuffer");if(e instanceof Fi.Buffer)return e.readAsync();let{buffer:n,byteOffset:r=0,byteLength:s=n.byteLength}=e;return n.readAsync(r,s)}},zt=re;K(zt,"defaultProps",{...W.defaultProps,outputs:void 0,feedbackBuffers:void 0});var zi=R(rt(),1);var wr="transform_output",se=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(t,e){this.device=t,this.sampler=t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new W(this.device,{id:e.id||S("texture-transform-model"),fs:e.fs||(0,zi.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:wr}),vertexCount:e.vertexCount,...e}),this._initialize(e),Object.seal(this)}destroy(){this.model.destroy();for(let t of this.bindings)t.framebuffer?.destroy()}delete(){this.destroy()}run(t){let{framebuffer:e}=this.bindings[this.currentIndex],n=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(n),n.end(),this.device.submit()}getTargetTexture(){let{targetTexture:t}=this.bindings[this.currentIndex];return t}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(t){this._updateBindings(t)}_updateBindings(t){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],t)}_updateBinding(t,{sourceBuffers:e,sourceTextures:n,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,n),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:s,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:s,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:s,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let n in e)e[n].sampler=this.sampler}};var V=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:n=null,vertexCount:r=null}=t;this.id=t.id||S("geometry"),this.topology=t.topology,n&&(this.indices=ArrayBuffer.isView(n)?{value:n,size:1}:n),this.attributes={};for(let[s,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(s)}: must be typed array or object with value as typed array`);if((s==="POSITION"||s==="positions")&&!a.size&&(a.size=3),s==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[s]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=r||this._calculateVertexCount(this.attributes,this.indices)}getVertexCount(){return this.vertexCount}getAttributes(){return this.indices?{indices:this.indices,...this.attributes}:this.attributes}_print(t){return`Geometry ${this.id} attribute ${t}`}_setAttributes(t,e){return this}_calculateVertexCount(t,e){if(e)return e.value.length;let n=1/0;for(let r of Object.values(t)){let{value:s,size:o,constant:a}=r;!a&&s&&o!==void 0&&o>=1&&(n=Math.min(n,s.length/o))}return n}};var Ar=`struct VertexInputs {
8
8
  @location(0) clipSpacePositions: vec2<f32>,
9
9
  @location(1) texCoords: vec2<f32>,
10
10
  @location(2) coordinates: vec2<f32>
@@ -26,7 +26,7 @@ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
26
26
  outputs.uv = inputs.texCoords;
27
27
  return outputs;
28
28
  }
29
- `,Di=`#version 300 es
29
+ `,Tr=`#version 300 es
30
30
  in vec2 clipSpacePositions;
31
31
  in vec2 texCoords;
32
32
  in vec2 coordinates;
@@ -41,8 +41,8 @@ void main(void) {
41
41
  coordinate = coordinates;
42
42
  uv = texCoords;
43
43
  }
44
- `,xs=[-1,-1,1,-1,-1,1,1,1],ne=class extends X{constructor(e,t){let i=xs.map(r=>r===-1?0:r);t.source&&(t={...t,source:`${Ni}
45
- ${t.source}`}),super(e,{id:t.id||C("clip-space"),...t,vs:Di,vertexCount:4,geometry:new G({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(xs)},texCoords:{size:2,value:new Float32Array(i)},coordinates:{size:2,value:new Float32Array(i)}}})})}};var zi={name:"background",uniformTypes:{scale:"vec2<f32>"}},$i=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
44
+ `,ji=[-1,-1,1,-1,-1,1,1,1],st=class extends W{constructor(t,e){let n=ji.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${Ar}
45
+ ${e.source}`}),super(t,{id:e.id||S("clip-space"),...e,vs:Tr,vertexCount:4,geometry:new V({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(ji)},texCoords:{size:2,value:new Float32Array(n)},coordinates:{size:2,value:new Float32Array(n)}}})})}};var Pr={name:"background",uniformTypes:{scale:"vec2<f32>"}},Sr=`@group(0) @binding(0) var backgroundTexture: texture_2d<f32>;
46
46
  @group(0) @binding(1) var backgroundTextureSampler: sampler;
47
47
  struct backgroundUniforms {
48
48
  scale: vec2<f32>,
@@ -60,7 +60,7 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
60
60
  let position: vec2<f32> = billboardTexture_getTextureUV(inputs.uv);
61
61
  return textureSample(backgroundTexture, backgroundTextureSampler, position);
62
62
  }
63
- `,Bi=`#version 300 es
63
+ `,Lr=`#version 300 es
64
64
  precision highp float;
65
65
 
66
66
  uniform sampler2D backgroundTexture;
@@ -81,7 +81,89 @@ void main(void) {
81
81
  vec2 position = billboardTexture_getTextureUV(coordinate);
82
82
  fragColor = texture(backgroundTexture, position);
83
83
  }
84
- `,xe=class extends ne{backgroundTexture=null;constructor(e,t){if(super(e,{...t,id:t.id||"background-texture-model",source:$i,fs:Bi,modules:[...t.modules||[],zi],parameters:{depthWriteEnabled:!1,...t.parameters||{},...t.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!t.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(t)}setProps(e){let{backgroundTexture:t}=e;if(t)if(this.setBindings({backgroundTexture:t}),t.isReady){let i=t instanceof H?t.texture:t;this.backgroundTexture=i,this.updateScale(i)}else t.ready.then(i=>{this.backgroundTexture=i,this.updateScale(i)})}predraw(){super.predraw()}updateScale(e){if(!e){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[t,i]=this.device.getCanvasContext().getDrawingBufferSize(),r=e.width,n=e.height,o=t/i,a=r/n,c=1,l=1;o>a?l=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,l]}})}};var ro=1/Math.PI*180,no=1/180*Math.PI,Ui={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Ui}};var z=globalThis.mathgl.config;function ys(s,{precision:e=z.precision}={}){return s=Gi(s),`${parseFloat(s.toPrecision(e))}`}function ye(s){return Array.isArray(s)||ArrayBuffer.isView(s)&&!(s instanceof DataView)}function Et(s,e,t){let i=z.EPSILON;t&&(z.EPSILON=t);try{if(s===e)return!0;if(ye(s)&&ye(e)){if(s.length!==e.length)return!1;for(let r=0;r<s.length;++r)if(!Et(s[r],e[r]))return!1;return!0}return s&&s.equals?s.equals(e):e&&e.equals?e.equals(s):typeof s=="number"&&typeof e=="number"?Math.abs(s-e)<=z.EPSILON*Math.max(1,Math.abs(s),Math.abs(e)):!1}finally{z.EPSILON=i}}function Gi(s){return Math.round(s/z.EPSILON)*z.EPSILON}var be=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(e,t=0){for(let i=0;i<this.ELEMENTS;++i)this[i]=e[i+t];return this.check()}toArray(e=[],t=0){for(let i=0;i<this.ELEMENTS;++i)e[t+i]=this[i];return e}toObject(e){return e}from(e){return Array.isArray(e)?this.copy(e):this.fromObject(e)}to(e){return e===this?this:ye(e)?this.toArray(e):this.toObject(e)}toTarget(e){return e?this.to(e):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(z)}formatString(e){let t="";for(let i=0;i<this.ELEMENTS;++i)t+=(i>0?", ":"")+ys(this[i],e);return`${e.printTypes?this.constructor.name:""}[${t}]`}equals(e){if(!e||this.length!==e.length)return!1;for(let t=0;t<this.ELEMENTS;++t)if(!Et(this[t],e[t]))return!1;return!0}exactEquals(e){if(!e||this.length!==e.length)return!1;for(let t=0;t<this.ELEMENTS;++t)if(this[t]!==e[t])return!1;return!0}negate(){for(let e=0;e<this.ELEMENTS;++e)this[e]=-this[e];return this.check()}lerp(e,t,i){if(i===void 0)return this.lerp(this,e,t);for(let r=0;r<this.ELEMENTS;++r){let n=e[r],o=typeof t=="number"?t:t[r];this[r]=n+i*(o-n)}return this.check()}min(e){for(let t=0;t<this.ELEMENTS;++t)this[t]=Math.min(e[t],this[t]);return this.check()}max(e){for(let t=0;t<this.ELEMENTS;++t)this[t]=Math.max(e[t],this[t]);return this.check()}clamp(e,t){for(let i=0;i<this.ELEMENTS;++i)this[i]=Math.min(Math.max(this[i],e[i]),t[i]);return this.check()}add(...e){for(let t of e)for(let i=0;i<this.ELEMENTS;++i)this[i]+=t[i];return this.check()}subtract(...e){for(let t of e)for(let i=0;i<this.ELEMENTS;++i)this[i]-=t[i];return this.check()}scale(e){if(typeof e=="number")for(let t=0;t<this.ELEMENTS;++t)this[t]*=e;else for(let t=0;t<this.ELEMENTS&&t<e.length;++t)this[t]*=e[t];return this.check()}multiplyByScalar(e){for(let t=0;t<this.ELEMENTS;++t)this[t]*=e;return this.check()}check(){if(z.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let e=this.length===this.ELEMENTS;for(let t=0;t<this.ELEMENTS;++t)e=e&&Number.isFinite(this[t]);return e}sub(e){return this.subtract(e)}setScalar(e){for(let t=0;t<this.ELEMENTS;++t)this[t]=e;return this.check()}addScalar(e){for(let t=0;t<this.ELEMENTS;++t)this[t]+=e;return this.check()}subScalar(e){return this.addScalar(-e)}multiplyScalar(e){for(let t=0;t<this.ELEMENTS;++t)this[t]*=e;return this.check()}divideScalar(e){return this.multiplyByScalar(1/e)}clampScalar(e,t){for(let i=0;i<this.ELEMENTS;++i)this[i]=Math.min(Math.max(this[i],e),t);return this.check()}get elements(){return this}};function ji(s,e){if(s.length!==e)return!1;for(let t=0;t<s.length;++t)if(!Number.isFinite(s[t]))return!1;return!0}function j(s){if(!Number.isFinite(s))throw new Error(`Invalid number ${JSON.stringify(s)}`);return s}function Ke(s,e,t=""){if(z.debug&&!ji(s,e))throw new Error(`math.gl: ${t} some fields set to invalid numbers'`);return s}function Rt(s,e){if(!s)throw new Error(`math.gl assertion ${e}`)}var Ze=class extends be{get x(){return this[0]}set x(e){this[0]=j(e)}get y(){return this[1]}set y(e){this[1]=j(e)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let e=0;for(let t=0;t<this.ELEMENTS;++t)e+=this[t]*this[t];return e}magnitudeSquared(){return this.lengthSquared()}distance(e){return Math.sqrt(this.distanceSquared(e))}distanceSquared(e){let t=0;for(let i=0;i<this.ELEMENTS;++i){let r=this[i]-e[i];t+=r*r}return j(t)}dot(e){let t=0;for(let i=0;i<this.ELEMENTS;++i)t+=this[i]*e[i];return j(t)}normalize(){let e=this.magnitude();if(e!==0)for(let t=0;t<this.ELEMENTS;++t)this[t]/=e;return this.check()}multiply(...e){for(let t of e)for(let i=0;i<this.ELEMENTS;++i)this[i]*=t[i];return this.check()}divide(...e){for(let t of e)for(let i=0;i<this.ELEMENTS;++i)this[i]/=t[i];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(e){return this.distance(e)}distanceToSquared(e){return this.distanceSquared(e)}getComponent(e){return Rt(e>=0&&e<this.ELEMENTS,"index is out of range"),j(this[e])}setComponent(e,t){return Rt(e>=0&&e<this.ELEMENTS,"index is out of range"),this[e]=t,this.check()}addVectors(e,t){return this.copy(e).add(t)}subVectors(e,t){return this.copy(e).subtract(t)}multiplyVectors(e,t){return this.copy(e).multiply(t)}addScaledVector(e,t){return this.add(new this.constructor(e).multiplyScalar(t))}};var se=typeof Float32Array<"u"?Float32Array:Array;var xo=Math.PI/180;function Vi(){let s=new se(2);return se!=Float32Array&&(s[0]=0,s[1]=0),s}function Ms(s,e,t){let i=e[0],r=e[1];return s[0]=t[0]*i+t[4]*r+t[12],s[1]=t[1]*i+t[5]*r+t[13],s}var yo=function(){let s=Vi();return function(e,t,i,r,n,o){let a,c;for(t||(t=2),i||(i=0),r?c=Math.min(r*t+i,e.length):c=e.length,a=i;a<c;a+=t)s[0]=e[a],s[1]=e[a+1],n(s,s,o),e[a]=s[0],e[a+1]=s[1];return e}}();function _s(s,e,t){let i=e[0],r=e[1],n=t[3]*i+t[7]*r||1;return s[0]=(t[0]*i+t[4]*r)/n,s[1]=(t[1]*i+t[5]*r)/n,s}function Qe(s,e,t){let i=e[0],r=e[1],n=e[2],o=t[3]*i+t[7]*r+t[11]*n||1;return s[0]=(t[0]*i+t[4]*r+t[8]*n)/o,s[1]=(t[1]*i+t[5]*r+t[9]*n)/o,s[2]=(t[2]*i+t[6]*r+t[10]*n)/o,s}function ws(s,e,t){let i=e[0],r=e[1];return s[0]=t[0]*i+t[2]*r,s[1]=t[1]*i+t[3]*r,s[2]=e[2],s}function qi(){let s=new se(3);return se!=Float32Array&&(s[0]=0,s[1]=0,s[2]=0),s}function Wi(s,e){return s[0]*e[0]+s[1]*e[1]+s[2]*e[2]}function Ts(s,e,t){let i=e[0],r=e[1],n=e[2],o=t[0],a=t[1],c=t[2];return s[0]=r*c-n*a,s[1]=n*o-i*c,s[2]=i*a-r*o,s}function Je(s,e,t){let i=e[0],r=e[1],n=e[2],o=t[3]*i+t[7]*r+t[11]*n+t[15];return o=o||1,s[0]=(t[0]*i+t[4]*r+t[8]*n+t[12])/o,s[1]=(t[1]*i+t[5]*r+t[9]*n+t[13])/o,s[2]=(t[2]*i+t[6]*r+t[10]*n+t[14])/o,s}function As(s,e,t){let i=e[0],r=e[1],n=e[2];return s[0]=i*t[0]+r*t[3]+n*t[6],s[1]=i*t[1]+r*t[4]+n*t[7],s[2]=i*t[2]+r*t[5]+n*t[8],s}function Ss(s,e,t){let i=t[0],r=t[1],n=t[2],o=t[3],a=e[0],c=e[1],l=e[2],h=r*l-n*c,d=n*a-i*l,u=i*c-r*a,g=r*u-n*d,m=n*h-i*u,f=i*d-r*h,y=o*2;return h*=y,d*=y,u*=y,g*=2,m*=2,f*=2,s[0]=a+h+g,s[1]=c+d+m,s[2]=l+u+f,s}function Ps(s,e,t,i){let r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[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]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s}function Cs(s,e,t,i){let r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[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]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s}function Is(s,e,t,i){let r=[],n=[];return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[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]+t[0],s[1]=n[1]+t[1],s[2]=n[2]+t[2],s}function Es(s,e){let t=s[0],i=s[1],r=s[2],n=e[0],o=e[1],a=e[2],c=Math.sqrt((t*t+i*i+r*r)*(n*n+o*o+a*a)),l=c&&Wi(s,e)/c;return Math.acos(Math.min(Math.max(l,-1),1))}var Mo=function(){let s=qi();return function(e,t,i,r,n,o){let a,c;for(t||(t=3),i||(i=0),r?c=Math.min(r*t+i,e.length):c=e.length,a=i;a<c;a+=t)s[0]=e[a],s[1]=e[a+1],s[2]=e[a+2],n(s,s,o),e[a]=s[0],e[a+1]=s[1],e[a+2]=s[2];return e}}();var Lt=[0,0,0],et,q=class extends Ze{static get ZERO(){return et||(et=new q(0,0,0),Object.freeze(et)),et}constructor(e=0,t=0,i=0){super(-0,-0,-0),arguments.length===1&&ye(e)?this.copy(e):(z.debug&&(j(e),j(t),j(i)),this[0]=e,this[1]=t,this[2]=i)}set(e,t,i){return this[0]=e,this[1]=t,this[2]=i,this.check()}copy(e){return this[0]=e[0],this[1]=e[1],this[2]=e[2],this.check()}fromObject(e){return z.debug&&(j(e.x),j(e.y),j(e.z)),this[0]=e.x,this[1]=e.y,this[2]=e.z,this.check()}toObject(e){return e.x=this[0],e.y=this[1],e.z=this[2],e}get ELEMENTS(){return 3}get z(){return this[2]}set z(e){this[2]=j(e)}angle(e){return Es(this,e)}cross(e){return Ts(this,this,e),this.check()}rotateX({radians:e,origin:t=Lt}){return Ps(this,this,t,e),this.check()}rotateY({radians:e,origin:t=Lt}){return Cs(this,this,t,e),this.check()}rotateZ({radians:e,origin:t=Lt}){return Is(this,this,t,e),this.check()}transform(e){return this.transformAsPoint(e)}transformAsPoint(e){return Je(this,this,e),this.check()}transformAsVector(e){return Qe(this,this,e),this.check()}transformByMatrix3(e){return As(this,this,e),this.check()}transformByMatrix2(e){return ws(this,this,e),this.check()}transformByQuaternion(e){return Ss(this,this,e),this.check()}};var tt=class extends be{toString(){let e="[";if(z.printRowMajor){e+="row-major:";for(let t=0;t<this.RANK;++t)for(let i=0;i<this.RANK;++i)e+=` ${this[i*this.RANK+t]}`}else{e+="column-major:";for(let t=0;t<this.ELEMENTS;++t)e+=` ${this[t]}`}return e+="]",e}getElementIndex(e,t){return t*this.RANK+e}getElement(e,t){return this[t*this.RANK+e]}setElement(e,t,i){return this[t*this.RANK+e]=j(i),this}getColumn(e,t=new Array(this.RANK).fill(-0)){let i=e*this.RANK;for(let r=0;r<this.RANK;++r)t[r]=this[i+r];return t}setColumn(e,t){let i=e*this.RANK;for(let r=0;r<this.RANK;++r)this[i+r]=t[r];return this}};function Hi(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 Rs(s,e){if(s===e){let t=e[1],i=e[2],r=e[3],n=e[6],o=e[7],a=e[11];s[1]=e[4],s[2]=e[8],s[3]=e[12],s[4]=t,s[6]=e[9],s[7]=e[13],s[8]=i,s[9]=n,s[11]=e[14],s[12]=r,s[13]=o,s[14]=a}else s[0]=e[0],s[1]=e[4],s[2]=e[8],s[3]=e[12],s[4]=e[1],s[5]=e[5],s[6]=e[9],s[7]=e[13],s[8]=e[2],s[9]=e[6],s[10]=e[10],s[11]=e[14],s[12]=e[3],s[13]=e[7],s[14]=e[11],s[15]=e[15];return s}function Os(s,e){let t=e[0],i=e[1],r=e[2],n=e[3],o=e[4],a=e[5],c=e[6],l=e[7],h=e[8],d=e[9],u=e[10],g=e[11],m=e[12],f=e[13],y=e[14],v=e[15],_=t*a-i*o,p=t*c-r*o,x=t*l-n*o,b=i*c-r*a,M=i*l-n*a,A=r*l-n*c,R=h*f-d*m,I=h*y-u*m,O=h*v-g*m,w=d*y-u*f,S=d*v-g*f,E=u*v-g*y,T=_*E-p*S+x*w+b*O-M*I+A*R;return T?(T=1/T,s[0]=(a*E-c*S+l*w)*T,s[1]=(r*S-i*E-n*w)*T,s[2]=(f*A-y*M+v*b)*T,s[3]=(u*M-d*A-g*b)*T,s[4]=(c*O-o*E-l*I)*T,s[5]=(t*E-r*O+n*I)*T,s[6]=(y*x-m*A-v*p)*T,s[7]=(h*A-u*x+g*p)*T,s[8]=(o*S-a*O+l*R)*T,s[9]=(i*O-t*S-n*R)*T,s[10]=(m*M-f*x+v*_)*T,s[11]=(d*x-h*M-g*_)*T,s[12]=(a*I-o*w-c*R)*T,s[13]=(t*w-i*I+r*R)*T,s[14]=(f*p-m*b-y*_)*T,s[15]=(h*b-d*p+u*_)*T,s):null}function Ls(s){let e=s[0],t=s[1],i=s[2],r=s[3],n=s[4],o=s[5],a=s[6],c=s[7],l=s[8],h=s[9],d=s[10],u=s[11],g=s[12],m=s[13],f=s[14],y=s[15],v=e*o-t*n,_=e*a-i*n,p=t*a-i*o,x=l*m-h*g,b=l*f-d*g,M=h*f-d*m,A=e*M-t*b+i*x,R=n*M-o*b+a*x,I=l*p-h*_+d*v,O=g*p-m*_+f*v;return c*A-r*R+y*I-u*O}function kt(s,e,t){let i=e[0],r=e[1],n=e[2],o=e[3],a=e[4],c=e[5],l=e[6],h=e[7],d=e[8],u=e[9],g=e[10],m=e[11],f=e[12],y=e[13],v=e[14],_=e[15],p=t[0],x=t[1],b=t[2],M=t[3];return s[0]=p*i+x*a+b*d+M*f,s[1]=p*r+x*c+b*u+M*y,s[2]=p*n+x*l+b*g+M*v,s[3]=p*o+x*h+b*m+M*_,p=t[4],x=t[5],b=t[6],M=t[7],s[4]=p*i+x*a+b*d+M*f,s[5]=p*r+x*c+b*u+M*y,s[6]=p*n+x*l+b*g+M*v,s[7]=p*o+x*h+b*m+M*_,p=t[8],x=t[9],b=t[10],M=t[11],s[8]=p*i+x*a+b*d+M*f,s[9]=p*r+x*c+b*u+M*y,s[10]=p*n+x*l+b*g+M*v,s[11]=p*o+x*h+b*m+M*_,p=t[12],x=t[13],b=t[14],M=t[15],s[12]=p*i+x*a+b*d+M*f,s[13]=p*r+x*c+b*u+M*y,s[14]=p*n+x*l+b*g+M*v,s[15]=p*o+x*h+b*m+M*_,s}function ks(s,e,t){let i=t[0],r=t[1],n=t[2],o,a,c,l,h,d,u,g,m,f,y,v;return e===s?(s[12]=e[0]*i+e[4]*r+e[8]*n+e[12],s[13]=e[1]*i+e[5]*r+e[9]*n+e[13],s[14]=e[2]*i+e[6]*r+e[10]*n+e[14],s[15]=e[3]*i+e[7]*r+e[11]*n+e[15]):(o=e[0],a=e[1],c=e[2],l=e[3],h=e[4],d=e[5],u=e[6],g=e[7],m=e[8],f=e[9],y=e[10],v=e[11],s[0]=o,s[1]=a,s[2]=c,s[3]=l,s[4]=h,s[5]=d,s[6]=u,s[7]=g,s[8]=m,s[9]=f,s[10]=y,s[11]=v,s[12]=o*i+h*r+m*n+e[12],s[13]=a*i+d*r+f*n+e[13],s[14]=c*i+u*r+y*n+e[14],s[15]=l*i+g*r+v*n+e[15]),s}function Fs(s,e,t){let i=t[0],r=t[1],n=t[2];return s[0]=e[0]*i,s[1]=e[1]*i,s[2]=e[2]*i,s[3]=e[3]*i,s[4]=e[4]*r,s[5]=e[5]*r,s[6]=e[6]*r,s[7]=e[7]*r,s[8]=e[8]*n,s[9]=e[9]*n,s[10]=e[10]*n,s[11]=e[11]*n,s[12]=e[12],s[13]=e[13],s[14]=e[14],s[15]=e[15],s}function Ns(s,e,t,i){let r=i[0],n=i[1],o=i[2],a=Math.sqrt(r*r+n*n+o*o),c,l,h,d,u,g,m,f,y,v,_,p,x,b,M,A,R,I,O,w,S,E,T,D;return a<1e-6?null:(a=1/a,r*=a,n*=a,o*=a,l=Math.sin(t),c=Math.cos(t),h=1-c,d=e[0],u=e[1],g=e[2],m=e[3],f=e[4],y=e[5],v=e[6],_=e[7],p=e[8],x=e[9],b=e[10],M=e[11],A=r*r*h+c,R=n*r*h+o*l,I=o*r*h-n*l,O=r*n*h-o*l,w=n*n*h+c,S=o*n*h+r*l,E=r*o*h+n*l,T=n*o*h-r*l,D=o*o*h+c,s[0]=d*A+f*R+p*I,s[1]=u*A+y*R+x*I,s[2]=g*A+v*R+b*I,s[3]=m*A+_*R+M*I,s[4]=d*O+f*w+p*S,s[5]=u*O+y*w+x*S,s[6]=g*O+v*w+b*S,s[7]=m*O+_*w+M*S,s[8]=d*E+f*T+p*D,s[9]=u*E+y*T+x*D,s[10]=g*E+v*T+b*D,s[11]=m*E+_*T+M*D,e!==s&&(s[12]=e[12],s[13]=e[13],s[14]=e[14],s[15]=e[15]),s)}function Ds(s,e,t){let i=Math.sin(t),r=Math.cos(t),n=e[4],o=e[5],a=e[6],c=e[7],l=e[8],h=e[9],d=e[10],u=e[11];return e!==s&&(s[0]=e[0],s[1]=e[1],s[2]=e[2],s[3]=e[3],s[12]=e[12],s[13]=e[13],s[14]=e[14],s[15]=e[15]),s[4]=n*r+l*i,s[5]=o*r+h*i,s[6]=a*r+d*i,s[7]=c*r+u*i,s[8]=l*r-n*i,s[9]=h*r-o*i,s[10]=d*r-a*i,s[11]=u*r-c*i,s}function zs(s,e,t){let i=Math.sin(t),r=Math.cos(t),n=e[0],o=e[1],a=e[2],c=e[3],l=e[8],h=e[9],d=e[10],u=e[11];return e!==s&&(s[4]=e[4],s[5]=e[5],s[6]=e[6],s[7]=e[7],s[12]=e[12],s[13]=e[13],s[14]=e[14],s[15]=e[15]),s[0]=n*r-l*i,s[1]=o*r-h*i,s[2]=a*r-d*i,s[3]=c*r-u*i,s[8]=n*i+l*r,s[9]=o*i+h*r,s[10]=a*i+d*r,s[11]=c*i+u*r,s}function $s(s,e,t){let i=Math.sin(t),r=Math.cos(t),n=e[0],o=e[1],a=e[2],c=e[3],l=e[4],h=e[5],d=e[6],u=e[7];return e!==s&&(s[8]=e[8],s[9]=e[9],s[10]=e[10],s[11]=e[11],s[12]=e[12],s[13]=e[13],s[14]=e[14],s[15]=e[15]),s[0]=n*r+l*i,s[1]=o*r+h*i,s[2]=a*r+d*i,s[3]=c*r+u*i,s[4]=l*r-n*i,s[5]=h*r-o*i,s[6]=d*r-a*i,s[7]=u*r-c*i,s}function Bs(s,e){let t=e[0],i=e[1],r=e[2],n=e[3],o=t+t,a=i+i,c=r+r,l=t*o,h=i*o,d=i*a,u=r*o,g=r*a,m=r*c,f=n*o,y=n*a,v=n*c;return s[0]=1-d-m,s[1]=h+v,s[2]=u-y,s[3]=0,s[4]=h-v,s[5]=1-l-m,s[6]=g+f,s[7]=0,s[8]=u+y,s[9]=g-f,s[10]=1-l-d,s[11]=0,s[12]=0,s[13]=0,s[14]=0,s[15]=1,s}function Us(s,e,t,i,r,n,o){let a=1/(t-e),c=1/(r-i),l=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]=(t+e)*a,s[9]=(r+i)*c,s[10]=(o+n)*l,s[11]=-1,s[12]=0,s[13]=0,s[14]=o*n*2*l,s[15]=0,s}function Yi(s,e,t,i,r){let n=1/Math.tan(e/2);if(s[0]=n/t,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 Gs=Yi;function Xi(s,e,t,i,r,n,o){let a=1/(e-t),c=1/(i-r),l=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*l,s[11]=0,s[12]=(e+t)*a,s[13]=(r+i)*c,s[14]=(o+n)*l,s[15]=1,s}var js=Xi;function Vs(s,e,t,i){let r,n,o,a,c,l,h,d,u,g,m=e[0],f=e[1],y=e[2],v=i[0],_=i[1],p=i[2],x=t[0],b=t[1],M=t[2];return Math.abs(m-x)<1e-6&&Math.abs(f-b)<1e-6&&Math.abs(y-M)<1e-6?Hi(s):(d=m-x,u=f-b,g=y-M,r=1/Math.sqrt(d*d+u*u+g*g),d*=r,u*=r,g*=r,n=_*g-p*u,o=p*d-v*g,a=v*u-_*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=u*a-g*o,l=g*n-d*a,h=d*o-u*n,r=Math.sqrt(c*c+l*l+h*h),r?(r=1/r,c*=r,l*=r,h*=r):(c=0,l=0,h=0),s[0]=n,s[1]=c,s[2]=d,s[3]=0,s[4]=o,s[5]=l,s[6]=u,s[7]=0,s[8]=a,s[9]=h,s[10]=g,s[11]=0,s[12]=-(n*m+o*f+a*y),s[13]=-(c*m+l*f+h*y),s[14]=-(d*m+u*f+g*y),s[15]=1,s)}function Ki(){let s=new se(4);return se!=Float32Array&&(s[0]=0,s[1]=0,s[2]=0,s[3]=0),s}function qs(s,e,t){let i=e[0],r=e[1],n=e[2],o=e[3];return s[0]=t[0]*i+t[4]*r+t[8]*n+t[12]*o,s[1]=t[1]*i+t[5]*r+t[9]*n+t[13]*o,s[2]=t[2]*i+t[6]*r+t[10]*n+t[14]*o,s[3]=t[3]*i+t[7]*r+t[11]*n+t[15]*o,s}var ko=function(){let s=Ki();return function(e,t,i,r,n,o){let a,c;for(t||(t=4),i||(i=0),r?c=Math.min(r*t+i,e.length):c=e.length,a=i;a<c;a+=t)s[0]=e[a],s[1]=e[a+1],s[2]=e[a+2],s[3]=e[a+3],n(s,s,o),e[a]=s[0],e[a+1]=s[1],e[a+2]=s[2],e[a+3]=s[3];return e}}();var Dt;(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"})(Dt||(Dt={}));var Zi=45*Math.PI/180,Qi=1,Ft=.1,Nt=500,Ji=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),W=class extends tt{static get IDENTITY(){return tr()}static get ZERO(){return er()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Dt}constructor(e){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(e)?this.copy(e):this.identity()}copy(e){return this[0]=e[0],this[1]=e[1],this[2]=e[2],this[3]=e[3],this[4]=e[4],this[5]=e[5],this[6]=e[6],this[7]=e[7],this[8]=e[8],this[9]=e[9],this[10]=e[10],this[11]=e[11],this[12]=e[12],this[13]=e[13],this[14]=e[14],this[15]=e[15],this.check()}set(e,t,i,r,n,o,a,c,l,h,d,u,g,m,f,y){return this[0]=e,this[1]=t,this[2]=i,this[3]=r,this[4]=n,this[5]=o,this[6]=a,this[7]=c,this[8]=l,this[9]=h,this[10]=d,this[11]=u,this[12]=g,this[13]=m,this[14]=f,this[15]=y,this.check()}setRowMajor(e,t,i,r,n,o,a,c,l,h,d,u,g,m,f,y){return this[0]=e,this[1]=n,this[2]=l,this[3]=g,this[4]=t,this[5]=o,this[6]=h,this[7]=m,this[8]=i,this[9]=a,this[10]=d,this[11]=f,this[12]=r,this[13]=c,this[14]=u,this[15]=y,this.check()}toRowMajor(e){return e[0]=this[0],e[1]=this[4],e[2]=this[8],e[3]=this[12],e[4]=this[1],e[5]=this[5],e[6]=this[9],e[7]=this[13],e[8]=this[2],e[9]=this[6],e[10]=this[10],e[11]=this[14],e[12]=this[3],e[13]=this[7],e[14]=this[11],e[15]=this[15],e}identity(){return this.copy(Ji)}fromObject(e){return this.check()}fromQuaternion(e){return Bs(this,e),this.check()}frustum(e){let{left:t,right:i,bottom:r,top:n,near:o=Ft,far:a=Nt}=e;return a===1/0?sr(this,t,i,r,n,o):Us(this,t,i,r,n,o,a),this.check()}lookAt(e){let{eye:t,center:i=[0,0,0],up:r=[0,1,0]}=e;return Vs(this,t,i,r),this.check()}ortho(e){let{left:t,right:i,bottom:r,top:n,near:o=Ft,far:a=Nt}=e;return js(this,t,i,r,n,o,a),this.check()}orthographic(e){let{fovy:t=Zi,aspect:i=Qi,focalDistance:r=1,near:n=Ft,far:o=Nt}=e;Ws(t);let a=t/2,c=r*Math.tan(a),l=c*i;return this.ortho({left:-l,right:l,bottom:-c,top:c,near:n,far:o})}perspective(e){let{fovy:t=45*Math.PI/180,aspect:i=1,near:r=.1,far:n=500}=e;return Ws(t),Gs(this,t,i,r,n),this.check()}determinant(){return Ls(this)}getScale(e=[-0,-0,-0]){return e[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),e[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),e[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),e}getTranslation(e=[-0,-0,-0]){return e[0]=this[12],e[1]=this[13],e[2]=this[14],e}getRotation(e,t){e=e||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],t=t||[-0,-0,-0];let i=this.getScale(t),r=1/i[0],n=1/i[1],o=1/i[2];return e[0]=this[0]*r,e[1]=this[1]*n,e[2]=this[2]*o,e[3]=0,e[4]=this[4]*r,e[5]=this[5]*n,e[6]=this[6]*o,e[7]=0,e[8]=this[8]*r,e[9]=this[9]*n,e[10]=this[10]*o,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,e}getRotationMatrix3(e,t){e=e||[-0,-0,-0,-0,-0,-0,-0,-0,-0],t=t||[-0,-0,-0];let i=this.getScale(t),r=1/i[0],n=1/i[1],o=1/i[2];return e[0]=this[0]*r,e[1]=this[1]*n,e[2]=this[2]*o,e[3]=this[4]*r,e[4]=this[5]*n,e[5]=this[6]*o,e[6]=this[8]*r,e[7]=this[9]*n,e[8]=this[10]*o,e}transpose(){return Rs(this,this),this.check()}invert(){return Os(this,this),this.check()}multiplyLeft(e){return kt(this,e,this),this.check()}multiplyRight(e){return kt(this,this,e),this.check()}rotateX(e){return Ds(this,this,e),this.check()}rotateY(e){return zs(this,this,e),this.check()}rotateZ(e){return $s(this,this,e),this.check()}rotateXYZ(e){return this.rotateX(e[0]).rotateY(e[1]).rotateZ(e[2])}rotateAxis(e,t){return Ns(this,this,e,t),this.check()}scale(e){return Fs(this,this,Array.isArray(e)?e:[e,e,e]),this.check()}translate(e){return ks(this,this,e),this.check()}transform(e,t){return e.length===4?(t=qs(t||[-0,-0,-0,-0],e,this),Ke(t,4),t):this.transformAsPoint(e,t)}transformAsPoint(e,t){let{length:i}=e,r;switch(i){case 2:r=Ms(t||[-0,-0],e,this);break;case 3:r=Je(t||[-0,-0,-0],e,this);break;default:throw new Error("Illegal vector")}return Ke(r,e.length),r}transformAsVector(e,t){let i;switch(e.length){case 2:i=_s(t||[-0,-0],e,this);break;case 3:i=Qe(t||[-0,-0,-0],e,this);break;default:throw new Error("Illegal vector")}return Ke(i,e.length),i}transformPoint(e,t){return this.transformAsPoint(e,t)}transformVector(e,t){return this.transformAsPoint(e,t)}transformDirection(e,t){return this.transformAsVector(e,t)}makeRotationX(e){return this.identity().rotateX(e)}makeTranslation(e,t,i){return this.identity().translate([e,t,i])}},st,it;function er(){return st||(st=new W([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(st)),st}function tr(){return it||(it=new W,Object.freeze(it)),it}function Ws(s){if(s>Math.PI*2)throw Error("expected radians")}function sr(s,e,t,i,r,n){let o=2*n/(t-e),a=2*n/(r-i),c=(t+e)/(t-e),l=(r+i)/(r-i),h=-1,d=-1,u=-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]=l,s[10]=h,s[11]=d,s[12]=0,s[13]=0,s[14]=u,s[15]=0,s}function zt(s,e){if(!s)throw new Error(e)}var ie=class{id;matrix=new W;display=!0;position=new q;rotation=new q;scale=new q(1,1,1);userData={};props={};constructor(e={}){let{id:t}=e;this.id=t||C(this.constructor.name),this._setScenegraphNodeProps(e)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(e){return this._setScenegraphNodeProps(e),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(e){return zt(e.length===3,"setPosition requires vector argument"),this.position=e,this}setRotation(e){return zt(e.length===3||e.length===4,"setRotation requires vector argument"),this.rotation=e,this}setScale(e){return zt(e.length===3,"setScale requires vector argument"),this.scale=e,this}setMatrix(e,t=!0){t?this.matrix.copy(e):this.matrix=e}setMatrixComponents(e){let{position:t,rotation:i,scale:r,update:n=!0}=e;return t&&this.setPosition(t),i&&this.setRotation(i),r&&this.setScale(r),n&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let e=new W().fromQuaternion(this.rotation);this.matrix.multiplyRight(e)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:e,rotation:t,scale:i}={}){return e&&this.setPosition(e),t&&this.setRotation(t),i&&this.setScale(i),this.updateMatrix(),this}getCoordinateUniforms(e,t){t=t||this.matrix;let i=new W(e).multiplyRight(t),r=i.invert(),n=r.transpose();return{viewMatrix:e,modelMatrix:t,objectMatrix:t,worldMatrix:i,worldInverseMatrix:r,worldInverseTransposeMatrix:n}}_setScenegraphNodeProps(e){e?.position&&this.setPosition(e.position),e?.rotation&&this.setRotation(e.rotation),e?.scale&&this.setScale(e.scale),this.updateMatrix(),e?.matrix&&this.setMatrix(e.matrix),Object.assign(this.props,e)}};var Hs=k(B(),1);var fe=class extends ie{children;constructor(e={}){e=Array.isArray(e)?{children:e}:e;let{children:t=[]}=e;Hs.log.assert(t.every(i=>i instanceof ie),"every child must an instance of ScenegraphNode"),super(e),this.children=t}getBounds(){let e=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((t,{worldMatrix:i})=>{let r=t.getBounds();if(!r)return;let[n,o]=r,a=new q(n).add(o).divide([2,2,2]);i.transformAsPoint(a,a);let c=new q(o).subtract(n).divide([2,2,2]);i.transformAsVector(c,c);for(let l=0;l<8;l++){let h=new q(l&1?-1:1,l&2?-1:1,l&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)e[0][d]=Math.min(e[0][d],h[d]),e[1][d]=Math.max(e[1][d],h[d])}}),Number.isFinite(e[0][0])?e:null}destroy(){this.children.forEach(e=>e.destroy()),this.removeAll(),super.destroy()}add(...e){for(let t of e)Array.isArray(t)?this.add(...t):this.children.push(t);return this}remove(e){let t=this.children,i=t.indexOf(e);return i>-1&&t.splice(i,1),this}removeAll(){return this.children=[],this}traverse(e,{worldMatrix:t=new W}={}){let i=new W(t).multiplyRight(this.matrix);for(let r of this.children)r instanceof fe?r.traverse(e,{worldMatrix:i}):e(r,{worldMatrix:i})}preorderTraversal(e,{worldMatrix:t=new W}={}){let i=new W(t).multiplyRight(this.matrix);e(this,{worldMatrix:i});for(let r of this.children)r instanceof fe?r.preorderTraversal(e,{worldMatrix:i}):e(r,{worldMatrix:i})}};var rt=class extends ie{model;bounds=null;managedResources;constructor(e){super(e),this.model=e.model,this.managedResources=e.managedResources||[],this.bounds=e.bounds||null,this.setProps(e)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(e=>e.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(e){return this.model.draw(e)}};var ir={x:[2,0,1],y:[0,1,2],z:[1,2,0]},oe=class extends G{constructor(e={}){let{id:t=C("truncated-code-geometry")}=e,{indices:i,attributes:r}=rr(e);super({...e,id:t,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},...e.attributes}})}};function rr(s={}){let{bottomRadius:e=0,topRadius:t=0,height:i=1,nradial:r=10,nvertical:n=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=s,l=(a?2:0)+(c?2:0),h=(r+1)*(n+1+l),d=Math.atan2(e-t,i),u=Math.sin,g=Math.cos,m=Math.PI,f=g(d),y=u(d),v=a?-2:0,_=n+(c?2:0),p=r+1,x=new Uint16Array(r*(n+l)*6),b=ir[o],M=new Float32Array(h*3),A=new Float32Array(h*3),R=new Float32Array(h*2),I=0,O=0;for(let w=v;w<=_;w++){let S=w/n,E=i*S,T;w<0?(E=0,S=1,T=e):w>n?(E=i,S=1,T=t):T=e+(t-e)*(w/n),(w===-2||w===n+2)&&(T=0,S=0),E-=i/2;for(let D=0;D<p;D++){let J=u(D*m*2/r),K=g(D*m*2/r);M[I+b[0]]=J*T,M[I+b[1]]=E,M[I+b[2]]=K*T,A[I+b[0]]=w<0||w>n?0:J*f,A[I+b[1]]=w<0?-1:w>n?1:y,A[I+b[2]]=w<0||w>n?0:K*f,R[O+0]=D/r,R[O+1]=S,O+=2,I+=3}}for(let w=0;w<n+l;w++)for(let S=0;S<r;S++){let E=(w*r+S)*6;x[E+0]=p*(w+0)+0+S,x[E+1]=p*(w+0)+1+S,x[E+2]=p*(w+1)+1+S,x[E+3]=p*(w+0)+0+S,x[E+4]=p*(w+1)+1+S,x[E+5]=p*(w+1)+0+S}return{indices:x,attributes:{POSITION:M,NORMAL:A,TEXCOORD_0:R}}}var nt=class extends oe{constructor(e={}){let{id:t=C("cone-geometry"),radius:i=1,cap:r=!0}=e;super({...e,id:t,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:i})}};var ot=class extends G{constructor(e={}){let{id:t=C("cube-geometry"),indices:i=!0}=e;super(i?{...e,id:t,topology:"triangle-list",indices:{size:1,value:nr},attributes:{...ur,...e.attributes}}:{...e,id:t,topology:"triangle-list",indices:void 0,attributes:{...fr,...e.attributes}})}},nr=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]),or=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]),ar=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]),cr=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]),hr=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]),lr=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]),dr=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]),ur={POSITION:{size:3,value:or},NORMAL:{size:3,value:ar},TEXCOORD_0:{size:2,value:cr}},fr={POSITION:{size:3,value:hr},TEXCOORD_0:{size:2,value:lr},COLOR_0:{size:3,value:dr}};var at=class extends oe{constructor(e={}){let{id:t=C("cylinder-geometry"),radius:i=1}=e;super({...e,id:t,bottomRadius:i,topRadius:i})}};var pr=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],mr=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],ct=class extends G{constructor(e={}){let{id:t=C("ico-sphere-geometry")}=e,{indices:i,attributes:r}=gr(e);super({...e,id:t,topology:"triangle-list",indices:i,attributes:{...r,...e.attributes}})}};function gr(s){let{iterations:e=0}=s,t=Math.PI,i=t*2,r=[...pr],n=[...mr];r.push(),n.push();let o=(()=>{let h={};return(d,u)=>{d*=3,u*=3;let g=d<u?d:u,m=d>u?d:u,f=`${g}|${m}`;if(f in h)return h[f];let y=r[d],v=r[d+1],_=r[d+2],p=r[u],x=r[u+1],b=r[u+2],M=(y+p)/2,A=(v+x)/2,R=(_+b)/2,I=Math.sqrt(M*M+A*A+R*R);return M/=I,A/=I,R/=I,r.push(M,A,R),h[f]=r.length/3-1}})();for(let h=0;h<e;h++){let d=[];for(let u=0;u<n.length;u+=3){let g=o(n[u+0],n[u+1]),m=o(n[u+1],n[u+2]),f=o(n[u+2],n[u+0]);d.push(f,n[u+0],g,g,n[u+1],m,m,n[u+2],f,g,m,f)}n=d}let a=new Array(r.length),c=new Array(r.length/3*2),l=n.length;for(let h=l-3;h>=0;h-=3){let d=n[h+0],u=n[h+1],g=n[h+2],m=d*3,f=u*3,y=g*3,v=d*2,_=u*2,p=g*2,x=r[m+0],b=r[m+1],M=r[m+2],A=Math.acos(M/Math.sqrt(x*x+b*b+M*M)),R=Math.atan2(b,x)+t,I=A/t,O=1-R/i,w=r[f+0],S=r[f+1],E=r[f+2],T=Math.acos(E/Math.sqrt(w*w+S*S+E*E)),D=Math.atan2(S,w)+t,J=T/t,K=1-D/i,Fe=r[y+0],Ne=r[y+1],De=r[y+2],ri=Math.acos(De/Math.sqrt(Fe*Fe+Ne*Ne+De*De)),ni=Math.atan2(Ne,Fe)+t,qt=ri/t,ze=1-ni/i,oi=[Fe-w,Ne-S,De-E],ai=[x-w,b-S,M-E],Y=new q(oi).cross(ai).normalize(),L;(O===0||K===0||ze===0)&&(O===0||O>.5)&&(K===0||K>.5)&&(ze===0||ze>.5)&&(r.push(r[m+0],r[m+1],r[m+2]),L=r.length/3-1,n.push(L),c[L*2+0]=1,c[L*2+1]=I,a[L*3+0]=Y.x,a[L*3+1]=Y.y,a[L*3+2]=Y.z,r.push(r[f+0],r[f+1],r[f+2]),L=r.length/3-1,n.push(L),c[L*2+0]=1,c[L*2+1]=J,a[L*3+0]=Y.x,a[L*3+1]=Y.y,a[L*3+2]=Y.z,r.push(r[y+0],r[y+1],r[y+2]),L=r.length/3-1,n.push(L),c[L*2+0]=1,c[L*2+1]=qt,a[L*3+0]=Y.x,a[L*3+1]=Y.y,a[L*3+2]=Y.z),a[m+0]=a[f+0]=a[y+0]=Y.x,a[m+1]=a[f+1]=a[y+1]=Y.y,a[m+2]=a[f+2]=a[y+2]=Y.z,c[v+0]=O,c[v+1]=I,c[_+0]=K,c[_+1]=J,c[p+0]=ze,c[p+1]=qt}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 Ys(s){let{indices:e,attributes:t}=s;if(!e)return s;let i=e.value.length,r={};for(let n in t){let o=t[n],{constant:a,value:c,size:l}=o;if(a||!l)continue;let h=new c.constructor(i*l);for(let d=0;d<i;++d){let u=e.value[d];for(let g=0;g<l;g++)h[d*l+g]=c[u*l+g]}r[n]={size:l,value:h}}return{attributes:Object.assign({},t,r)}}var ht=class extends G{constructor(e={}){let{id:t=C("plane-geometry")}=e,{indices:i,attributes:r}=xr(e);super({...e,id:t,topology:"triangle-list",indices:i,attributes:{...r,...e.attributes}})}};function xr(s){let{type:e="x,y",offset:t=0,flipCull:i=!1,unpack:r=!1}=s,n=e.split(","),o=s[`${n[0]}len`]||1,a=s[`${n[1]}len`]||1,c=s[`n${n[0]}`]||1,l=s[`n${n[1]}`]||1,h=(c+1)*(l+1),d=new Float32Array(h*3),u=new Float32Array(h*3),g=new Float32Array(h*2);i&&(o=-o);let m=0,f=0;for(let p=0;p<=l;p++)for(let x=0;x<=c;x++){let b=x/c,M=p/l;switch(g[m+0]=i?1-b:b,g[m+1]=M,e){case"x,y":d[f+0]=o*b-o*.5,d[f+1]=a*M-a*.5,d[f+2]=t,u[f+0]=0,u[f+1]=0,u[f+2]=i?1:-1;break;case"x,z":d[f+0]=o*b-o*.5,d[f+1]=t,d[f+2]=a*M-a*.5,u[f+0]=0,u[f+1]=i?1:-1,u[f+2]=0;break;case"y,z":d[f+0]=t,d[f+1]=o*b-o*.5,d[f+2]=a*M-a*.5,u[f+0]=i?1:-1,u[f+1]=0,u[f+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}m+=2,f+=3}let y=c+1,v=new Uint16Array(c*l*6);for(let p=0;p<l;p++)for(let x=0;x<c;x++){let b=(p*c+x)*6;v[b+0]=(p+0)*y+x,v[b+1]=(p+1)*y+x,v[b+2]=(p+0)*y+x+1,v[b+3]=(p+1)*y+x,v[b+4]=(p+1)*y+x+1,v[b+5]=(p+0)*y+x+1}let _={indices:{size:1,value:v},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}};return r?Ys(_):_}var lt=class extends G{constructor(e={}){let{id:t=C("sphere-geometry")}=e,{indices:i,attributes:r}=yr(e);super({...e,id:t,topology:"triangle-list",indices:i,attributes:{...r,...e.attributes}})}};function yr(s){let{nlat:e=10,nlong:t=10}=s,n=Math.PI-0,o=0,c=2*Math.PI-o,l=(e+1)*(t+1),h=(v,_,p,x,b)=>s.radius||1,d=new Float32Array(l*3),u=new Float32Array(l*3),g=new Float32Array(l*2),m=l>65535?Uint32Array:Uint16Array,f=new m(e*t*6);for(let v=0;v<=e;v++)for(let _=0;_<=t;_++){let p=_/t,x=v/e,b=_+v*(t+1),M=b*2,A=b*3,R=c*p,I=n*x,O=Math.sin(R),w=Math.cos(R),S=Math.sin(I),E=Math.cos(I),T=w*S,D=E,J=O*S,K=h(T,D,J,p,x);d[A+0]=K*T,d[A+1]=K*D,d[A+2]=K*J,u[A+0]=T,u[A+1]=D,u[A+2]=J,g[M+0]=p,g[M+1]=1-x}let y=t+1;for(let v=0;v<t;v++)for(let _=0;_<e;_++){let p=(v*e+_)*6;f[p+0]=_*y+v,f[p+1]=_*y+v+1,f[p+2]=(_+1)*y+v,f[p+3]=(_+1)*y+v,f[p+4]=_*y+v+1,f[p+5]=(_+1)*y+v+1}return{indices:{size:1,value:f},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}}}function Xs(){let s=1,e=1;return()=>(s=Math.sin(e*17.23),e=Math.cos(s*27.92),br(Math.abs(s*e)*1432.71))}function br(s){return s-Math.floor(s)}var $t="";function Ks(s){$t=s}async function Zs(s,e){let t=new Image;return t.crossOrigin=e?.crossOrigin||"anonymous",t.src=s.startsWith("http")?s:$t+s,await t.decode(),e?await createImageBitmap(t,e):await createImageBitmap(t)}async function Qs(s,e){return await new Promise((t,i)=>{try{let r=new Image;r.onload=()=>t(r),r.onerror=()=>i(new Error(`Could not load image ${s}.`)),r.crossOrigin=e?.crossOrigin||"anonymous",r.src=s.startsWith("http")?s:$t+s}catch(r){i(r)}})}var ei=k(he(),1);var re=k(B(),1),Me=class{id;current;next;constructor(e){this.id=e.id||"swap",this.current=e.current,this.next=e.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let e=this.current;this.current=this.next,this.next=e}},_e=class extends Me{constructor(e,t){t={...t};let{width:i=1,height:r=1}=t,n=t.colorAttachments?.map(c=>typeof c!="string"?c:e.createTexture({id:`${t.id}-texture-0`,format:c,usage:re.Texture.SAMPLE|re.Texture.RENDER|re.Texture.COPY_SRC|re.Texture.COPY_DST,width:i,height:r})),o=e.createFramebuffer({...t,colorAttachments:n});n=t.colorAttachments?.map(c=>typeof c!="string"?c:e.createTexture({id:`${t.id}-texture-1`,format:c,usage:re.Texture.SAMPLE|re.Texture.RENDER|re.Texture.COPY_SRC|re.Texture.COPY_DST,width:i,height:r}));let a=e.createFramebuffer({...t,colorAttachments:n});super({current:o,next:a})}resize(e){if(e.width===this.current.width&&e.height===this.current.height)return!1;let{current:t,next:i}=this;return this.current=t.clone(e),t.destroy(),this.next=i.clone(e),i.destroy(),!0}},dt=class extends Me{constructor(e,t){super({current:e.createBuffer(t),next:e.createBuffer(t)})}resize(e){if(e.byteLength===this.current.byteLength)return!1;let{current:t,next:i}=this;return this.current=t.clone(e),t.destroy(),this.next=i.clone(e),i.destroy(),!0}};function Js(s){let{shaderPass:e,action:t,shadingLanguage:i}=s;switch(t){case"filter":let r=`${e.name}_filterColor_ext`;return i==="wgsl"?vr(r):_r(r);case"sample":let n=`${e.name}_sampleColor`;return i==="wgsl"?Mr(n):wr(n);default:throw new Error(`${e.name} no fragment shader generated for shader pass`)}}function vr(s){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
84
+ `,_t=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{...e,id:e.id||"background-texture-model",source:Sr,fs:Lr,modules:[...e.modules||[],Pr],parameters:{depthWriteEnabled:!1,...e.parameters||{},...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(e)}setProps(t){let{backgroundTexture:e}=t;if(e)if(this.setBindings({backgroundTexture:e}),e.isReady){let n=e instanceof z?e.texture:e;this.backgroundTexture=n,this.updateScale(n)}else e.ready.then(n=>{this.backgroundTexture=n,this.updateScale(n)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,n]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,s=t.height,o=e/n,a=r/s,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var It=class extends V{constructor(t={}){let{id:e=S("sphere-geometry")}=t,{indices:n,attributes:r}=Cr(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cr(i){let{nlat:t=10,nlong:e=10}=i,s=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(M,I,m,x,b)=>i.radius||1,d=new Float32Array(h*3),u=new Float32Array(h*3),g=new Float32Array(h*2),p=h>65535?Uint32Array:Uint16Array,f=new p(t*e*6);for(let M=0;M<=t;M++)for(let I=0;I<=e;I++){let m=I/e,x=M/t,b=I+M*(e+1),_=b*2,T=b*3,E=c*m,L=s*x,O=Math.sin(E),v=Math.cos(E),P=Math.sin(L),C=Math.cos(L),A=v*P,B=C,tt=O*P,Z=l(A,B,tt,m,x);d[T+0]=Z*A,d[T+1]=Z*B,d[T+2]=Z*tt,u[T+0]=A,u[T+1]=B,u[T+2]=tt,g[_+0]=m,g[_+1]=1-x}let y=e+1;for(let M=0;M<e;M++)for(let I=0;I<t;I++){let m=(M*t+I)*6;f[m+0]=I*y+M,f[m+1]=I*y+M+1,f[m+2]=(I+1)*y+M,f[m+3]=(I+1)*y+M,f[m+4]=I*y+M+1,f[m+5]=(I+1)*y+M+1}return{indices:{size:1,value:f},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}}}var wa=1/Math.PI*180,Aa=1/180*Math.PI,Er={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Er}};var j=globalThis.mathgl.config;function Gi(i,{precision:t=j.precision}={}){return i=Or(i),`${parseFloat(i.toPrecision(t))}`}function vt(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function He(i,t,e){let n=j.EPSILON;e&&(j.EPSILON=e);try{if(i===t)return!0;if(vt(i)&&vt(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!He(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=j.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{j.EPSILON=n}}function Or(i){return Math.round(i/j.EPSILON)*j.EPSILON}var wt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let n=0;n<this.ELEMENTS;++n)this[n]=t[n+e];return this.check()}toArray(t=[],e=0){for(let n=0;n<this.ELEMENTS;++n)t[e+n]=this[n];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:vt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(j)}formatString(t){let e="";for(let n=0;n<this.ELEMENTS;++n)e+=(n>0?", ":"")+Gi(this[n],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!He(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,n){if(n===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let s=t[r],o=typeof e=="number"?e:e[r];this[r]=s+n*(o-s)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t[n]),e[n]);return this.check()}add(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]+=e[n];return this.check()}subtract(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]-=e[n];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(j.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t),e);return this.check()}get elements(){return this}};function kr(i,t){if(i.length!==t)return!1;for(let e=0;e<i.length;++e)if(!Number.isFinite(i[e]))return!1;return!0}function X(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function oe(i,t,e=""){if(j.debug&&!kr(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function We(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var ae=class extends wt{get x(){return this[0]}set x(t){this[0]=X(t)}get y(){return this[1]}set y(t){this[1]=X(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let n=0;n<this.ELEMENTS;++n){let r=this[n]-t[n];e+=r*r}return X(e)}dot(t){let e=0;for(let n=0;n<this.ELEMENTS;++n)e+=this[n]*t[n];return X(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]*=e[n];return this.check()}divide(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]/=e[n];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),X(this[t])}setComponent(t,e){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var et=typeof Float32Array<"u"?Float32Array:Array;var Da=Math.PI/180;function Rr(){let i=new et(2);return et!=Float32Array&&(i[0]=0,i[1]=0),i}function Vi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[4]*r+e[12],i[1]=e[1]*n+e[5]*r+e[13],i}var Fa=function(){let i=Rr();return function(t,e,n,r,s,o){let a,c;for(e||(e=2),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],s(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function Xi(i,t,e){let n=t[0],r=t[1],s=e[3]*n+e[7]*r||1;return i[0]=(e[0]*n+e[4]*r)/s,i[1]=(e[1]*n+e[5]*r)/s,i}function ce(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s||1;return i[0]=(e[0]*n+e[4]*r+e[8]*s)/o,i[1]=(e[1]*n+e[5]*r+e[9]*s)/o,i[2]=(e[2]*n+e[6]*r+e[10]*s)/o,i}function qi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[2]*r,i[1]=e[1]*n+e[3]*r,i[2]=t[2],i}function Nr(){let i=new et(3);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Dr(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Hi(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-s*a,i[1]=s*o-n*c,i[2]=n*a-r*o,i}function he(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s+e[15];return o=o||1,i[0]=(e[0]*n+e[4]*r+e[8]*s+e[12])/o,i[1]=(e[1]*n+e[5]*r+e[9]*s+e[13])/o,i[2]=(e[2]*n+e[6]*r+e[10]*s+e[14])/o,i}function Wi(i,t,e){let n=t[0],r=t[1],s=t[2];return i[0]=n*e[0]+r*e[3]+s*e[6],i[1]=n*e[1]+r*e[4]+s*e[7],i[2]=n*e[2]+r*e[5]+s*e[8],i}function Yi(i,t,e){let n=e[0],r=e[1],s=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-s*c,d=s*a-n*h,u=n*c-r*a,g=r*u-s*d,p=s*l-n*u,f=n*d-r*l,y=o*2;return l*=y,d*=y,u*=y,g*=2,p*=2,f*=2,i[0]=a+l+g,i[1]=c+d+p,i[2]=h+u+f,i}function Ki(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0],s[1]=r[1]*Math.cos(n)-r[2]*Math.sin(n),s[2]=r[1]*Math.sin(n)+r[2]*Math.cos(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Zi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[2]*Math.sin(n)+r[0]*Math.cos(n),s[1]=r[1],s[2]=r[2]*Math.cos(n)-r[0]*Math.sin(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Qi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0]*Math.cos(n)-r[1]*Math.sin(n),s[1]=r[0]*Math.sin(n)+r[1]*Math.cos(n),s[2]=r[2],i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Ji(i,t){let e=i[0],n=i[1],r=i[2],s=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+n*n+r*r)*(s*s+o*o+a*a)),h=c&&Dr(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var ja=function(){let i=Nr();return function(t,e,n,r,s,o){let a,c;for(e||(e=3),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var Ke=[0,0,0],le,H=class extends ae{static get ZERO(){return le||(le=new H(0,0,0),Object.freeze(le)),le}constructor(t=0,e=0,n=0){super(-0,-0,-0),arguments.length===1&&vt(t)?this.copy(t):(j.debug&&(X(t),X(e),X(n)),this[0]=t,this[1]=e,this[2]=n)}set(t,e,n){return this[0]=t,this[1]=e,this[2]=n,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return j.debug&&(X(t.x),X(t.y),X(t.z)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this.check()}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t}get ELEMENTS(){return 3}get z(){return this[2]}set z(t){this[2]=X(t)}angle(t){return Ji(this,t)}cross(t){return Hi(this,this,t),this.check()}rotateX({radians:t,origin:e=Ke}){return Ki(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Ke}){return Zi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Ke}){return Qi(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return he(this,this,t),this.check()}transformAsVector(t){return ce(this,this,t),this.check()}transformByMatrix3(t){return Wi(this,this,t),this.check()}transformByMatrix2(t){return qi(this,this,t),this.check()}transformByQuaternion(t){return Yi(this,this,t),this.check()}};var de=class extends wt{toString(){let t="[";if(j.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let n=0;n<this.RANK;++n)t+=` ${this[n*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,n){return this[e*this.RANK+t]=X(n),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[n+r];return e}setColumn(t,e){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)this[n+r]=e[r];return this}};function Fr(i){return i[0]=1,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=1,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function tn(i,t){if(i===t){let e=t[1],n=t[2],r=t[3],s=t[6],o=t[7],a=t[11];i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=e,i[6]=t[9],i[7]=t[13],i[8]=n,i[9]=s,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function en(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],u=t[10],g=t[11],p=t[12],f=t[13],y=t[14],M=t[15],I=e*a-n*o,m=e*c-r*o,x=e*h-s*o,b=n*c-r*a,_=n*h-s*a,T=r*h-s*c,E=l*f-d*p,L=l*y-u*p,O=l*M-g*p,v=d*y-u*f,P=d*M-g*f,C=u*M-g*y,A=I*C-m*P+x*v+b*O-_*L+T*E;return A?(A=1/A,i[0]=(a*C-c*P+h*v)*A,i[1]=(r*P-n*C-s*v)*A,i[2]=(f*T-y*_+M*b)*A,i[3]=(u*_-d*T-g*b)*A,i[4]=(c*O-o*C-h*L)*A,i[5]=(e*C-r*O+s*L)*A,i[6]=(y*x-p*T-M*m)*A,i[7]=(l*T-u*x+g*m)*A,i[8]=(o*P-a*O+h*E)*A,i[9]=(n*O-e*P-s*E)*A,i[10]=(p*_-f*x+M*I)*A,i[11]=(d*x-l*_-g*I)*A,i[12]=(a*L-o*v-c*E)*A,i[13]=(e*v-n*L+r*E)*A,i[14]=(f*m-p*b-y*I)*A,i[15]=(l*b-d*m+u*I)*A,i):null}function nn(i){let t=i[0],e=i[1],n=i[2],r=i[3],s=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],d=i[10],u=i[11],g=i[12],p=i[13],f=i[14],y=i[15],M=t*o-e*s,I=t*a-n*s,m=e*a-n*o,x=h*p-l*g,b=h*f-d*g,_=l*f-d*p,T=t*_-e*b+n*x,E=s*_-o*b+a*x,L=h*m-l*I+d*M,O=g*m-p*I+f*M;return c*T-r*E+y*L-u*O}function Ze(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],u=t[9],g=t[10],p=t[11],f=t[12],y=t[13],M=t[14],I=t[15],m=e[0],x=e[1],b=e[2],_=e[3];return i[0]=m*n+x*a+b*d+_*f,i[1]=m*r+x*c+b*u+_*y,i[2]=m*s+x*h+b*g+_*M,i[3]=m*o+x*l+b*p+_*I,m=e[4],x=e[5],b=e[6],_=e[7],i[4]=m*n+x*a+b*d+_*f,i[5]=m*r+x*c+b*u+_*y,i[6]=m*s+x*h+b*g+_*M,i[7]=m*o+x*l+b*p+_*I,m=e[8],x=e[9],b=e[10],_=e[11],i[8]=m*n+x*a+b*d+_*f,i[9]=m*r+x*c+b*u+_*y,i[10]=m*s+x*h+b*g+_*M,i[11]=m*o+x*l+b*p+_*I,m=e[12],x=e[13],b=e[14],_=e[15],i[12]=m*n+x*a+b*d+_*f,i[13]=m*r+x*c+b*u+_*y,i[14]=m*s+x*h+b*g+_*M,i[15]=m*o+x*l+b*p+_*I,i}function rn(i,t,e){let n=e[0],r=e[1],s=e[2],o,a,c,h,l,d,u,g,p,f,y,M;return t===i?(i[12]=t[0]*n+t[4]*r+t[8]*s+t[12],i[13]=t[1]*n+t[5]*r+t[9]*s+t[13],i[14]=t[2]*n+t[6]*r+t[10]*s+t[14],i[15]=t[3]*n+t[7]*r+t[11]*s+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],u=t[6],g=t[7],p=t[8],f=t[9],y=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=d,i[6]=u,i[7]=g,i[8]=p,i[9]=f,i[10]=y,i[11]=M,i[12]=o*n+l*r+p*s+t[12],i[13]=a*n+d*r+f*s+t[13],i[14]=c*n+u*r+y*s+t[14],i[15]=h*n+g*r+M*s+t[15]),i}function sn(i,t,e){let n=e[0],r=e[1],s=e[2];return i[0]=t[0]*n,i[1]=t[1]*n,i[2]=t[2]*n,i[3]=t[3]*n,i[4]=t[4]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*s,i[9]=t[9]*s,i[10]=t[10]*s,i[11]=t[11]*s,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function on(i,t,e,n){let r=n[0],s=n[1],o=n[2],a=Math.sqrt(r*r+s*s+o*o),c,h,l,d,u,g,p,f,y,M,I,m,x,b,_,T,E,L,O,v,P,C,A,B;return a<1e-6?null:(a=1/a,r*=a,s*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],u=t[1],g=t[2],p=t[3],f=t[4],y=t[5],M=t[6],I=t[7],m=t[8],x=t[9],b=t[10],_=t[11],T=r*r*l+c,E=s*r*l+o*h,L=o*r*l-s*h,O=r*s*l-o*h,v=s*s*l+c,P=o*s*l+r*h,C=r*o*l+s*h,A=s*o*l-r*h,B=o*o*l+c,i[0]=d*T+f*E+m*L,i[1]=u*T+y*E+x*L,i[2]=g*T+M*E+b*L,i[3]=p*T+I*E+_*L,i[4]=d*O+f*v+m*P,i[5]=u*O+y*v+x*P,i[6]=g*O+M*v+b*P,i[7]=p*O+I*v+_*P,i[8]=d*C+f*A+m*B,i[9]=u*C+y*A+x*B,i[10]=g*C+M*A+b*B,i[11]=p*C+I*A+_*B,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function an(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[4]=s*r+h*n,i[5]=o*r+l*n,i[6]=a*r+d*n,i[7]=c*r+u*n,i[8]=h*r-s*n,i[9]=l*r-o*n,i[10]=d*r-a*n,i[11]=u*r-c*n,i}function cn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r-h*n,i[1]=o*r-l*n,i[2]=a*r-d*n,i[3]=c*r-u*n,i[8]=s*n+h*r,i[9]=o*n+l*r,i[10]=a*n+d*r,i[11]=c*n+u*r,i}function hn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[4],l=t[5],d=t[6],u=t[7];return t!==i&&(i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r+h*n,i[1]=o*r+l*n,i[2]=a*r+d*n,i[3]=c*r+u*n,i[4]=h*r-s*n,i[5]=l*r-o*n,i[6]=d*r-a*n,i[7]=u*r-c*n,i}function ln(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=e+e,a=n+n,c=r+r,h=e*o,l=n*o,d=n*a,u=r*o,g=r*a,p=r*c,f=s*o,y=s*a,M=s*c;return i[0]=1-d-p,i[1]=l+M,i[2]=u-y,i[3]=0,i[4]=l-M,i[5]=1-h-p,i[6]=g+f,i[7]=0,i[8]=u+y,i[9]=g-f,i[10]=1-h-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function dn(i,t,e,n,r,s,o){let a=1/(e-t),c=1/(r-n),h=1/(s-o);return i[0]=s*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+n)*c,i[10]=(o+s)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*s*2*h,i[15]=0,i}function Br(i,t,e,n,r){let s=1/Math.tan(t/2);if(i[0]=s/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(n-r);i[10]=(r+n)*o,i[14]=2*r*n*o}else i[10]=-1,i[14]=-2*n;return i}var un=Br;function zr(i,t,e,n,r,s,o){let a=1/(t-e),c=1/(n-r),h=1/(s-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+n)*c,i[14]=(o+s)*h,i[15]=1,i}var fn=zr;function mn(i,t,e,n){let r,s,o,a,c,h,l,d,u,g,p=t[0],f=t[1],y=t[2],M=n[0],I=n[1],m=n[2],x=e[0],b=e[1],_=e[2];return Math.abs(p-x)<1e-6&&Math.abs(f-b)<1e-6&&Math.abs(y-_)<1e-6?Fr(i):(d=p-x,u=f-b,g=y-_,r=1/Math.sqrt(d*d+u*u+g*g),d*=r,u*=r,g*=r,s=I*g-m*u,o=m*d-M*g,a=M*u-I*d,r=Math.sqrt(s*s+o*o+a*a),r?(r=1/r,s*=r,o*=r,a*=r):(s=0,o=0,a=0),c=u*a-g*o,h=g*s-d*a,l=d*o-u*s,r=Math.sqrt(c*c+h*h+l*l),r?(r=1/r,c*=r,h*=r,l*=r):(c=0,h=0,l=0),i[0]=s,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=h,i[6]=u,i[7]=0,i[8]=a,i[9]=l,i[10]=g,i[11]=0,i[12]=-(s*p+o*f+a*y),i[13]=-(c*p+h*f+l*y),i[14]=-(d*p+u*f+g*y),i[15]=1,i)}function jr(){let i=new et(4);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function pn(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3];return i[0]=e[0]*n+e[4]*r+e[8]*s+e[12]*o,i[1]=e[1]*n+e[5]*r+e[9]*s+e[13]*o,i[2]=e[2]*n+e[6]*r+e[10]*s+e[14]*o,i[3]=e[3]*n+e[7]*r+e[11]*s+e[15]*o,i}var Ja=function(){let i=jr();return function(t,e,n,r,s,o){let a,c;for(e||(e=4),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2],t[a+3]=i[3];return t}}();var ti;(function(i){i[i.COL0ROW0=0]="COL0ROW0",i[i.COL0ROW1=1]="COL0ROW1",i[i.COL0ROW2=2]="COL0ROW2",i[i.COL0ROW3=3]="COL0ROW3",i[i.COL1ROW0=4]="COL1ROW0",i[i.COL1ROW1=5]="COL1ROW1",i[i.COL1ROW2=6]="COL1ROW2",i[i.COL1ROW3=7]="COL1ROW3",i[i.COL2ROW0=8]="COL2ROW0",i[i.COL2ROW1=9]="COL2ROW1",i[i.COL2ROW2=10]="COL2ROW2",i[i.COL2ROW3=11]="COL2ROW3",i[i.COL3ROW0=12]="COL3ROW0",i[i.COL3ROW1=13]="COL3ROW1",i[i.COL3ROW2=14]="COL3ROW2",i[i.COL3ROW3=15]="COL3ROW3"})(ti||(ti={}));var Gr=45*Math.PI/180,Ur=1,Qe=.1,Je=500,$r=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),q=class extends de{static get IDENTITY(){return Xr()}static get ZERO(){return Vr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return ti}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=e,this[2]=n,this[3]=r,this[4]=s,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=u,this[12]=g,this[13]=p,this[14]=f,this[15]=y,this.check()}setRowMajor(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=s,this[2]=h,this[3]=g,this[4]=e,this[5]=o,this[6]=l,this[7]=p,this[8]=n,this[9]=a,this[10]=d,this[11]=f,this[12]=r,this[13]=c,this[14]=u,this[15]=y,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy($r)}fromObject(t){return this.check()}fromQuaternion(t){return ln(this,t),this.check()}frustum(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return a===1/0?qr(this,e,n,r,s,o):dn(this,e,n,r,s,o,a),this.check()}lookAt(t){let{eye:e,center:n=[0,0,0],up:r=[0,1,0]}=t;return mn(this,e,n,r),this.check()}ortho(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return fn(this,e,n,r,s,o,a),this.check()}orthographic(t){let{fovy:e=Gr,aspect:n=Ur,focalDistance:r=1,near:s=Qe,far:o=Je}=t;gn(e);let a=e/2,c=r*Math.tan(a),h=c*n;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:s,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:n=1,near:r=.1,far:s=500}=t;return gn(e),un(this,e,n,r,s),this.check()}determinant(){return nn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*s,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*s,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*s,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*s,t[8]=this[10]*o,t}transpose(){return tn(this,this),this.check()}invert(){return en(this,this),this.check()}multiplyLeft(t){return Ze(this,t,this),this.check()}multiplyRight(t){return Ze(this,this,t),this.check()}rotateX(t){return an(this,this,t),this.check()}rotateY(t){return cn(this,this,t),this.check()}rotateZ(t){return hn(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return on(this,this,t,e),this.check()}scale(t){return sn(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return rn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=pn(e||[-0,-0,-0,-0],t,this),oe(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:n}=t,r;switch(n){case 2:r=Vi(e||[-0,-0],t,this);break;case 3:r=he(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(r,t.length),r}transformAsVector(t,e){let n;switch(t.length){case 2:n=Xi(e||[-0,-0],t,this);break;case 3:n=ce(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(n,t.length),n}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,n){return this.identity().translate([t,e,n])}},ue,fe;function Vr(){return ue||(ue=new q([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(ue)),ue}function Xr(){return fe||(fe=new q,Object.freeze(fe)),fe}function gn(i){if(i>Math.PI*2)throw Error("expected radians")}function qr(i,t,e,n,r,s){let o=2*s/(e-t),a=2*s/(r-n),c=(e+t)/(e-t),h=(r+n)/(r-n),l=-1,d=-1,u=-2*s;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=d,i[12]=0,i[13]=0,i[14]=u,i[15]=0,i}var Hr=.02,Wr=.12,Yr=.15,Kr=.2,ni=[0,1,0],Zr=[255,255,255],Qr=1,ei=.35,ii=255,Jr=1,ts=.01,es={depthCompare:"less-equal",depthWriteEnabled:!1,cullMode:"none"},is=[{name:"instancePosition",format:"float32x3",stepMode:"instance"},{name:"instanceDirection",format:"float32x3",stepMode:"instance"},{name:"instanceScale",format:"float32x3",stepMode:"instance"},{name:"instanceColor",format:"float32x4",stepMode:"instance"}],ns={name:"lightMarker",props:{},uniforms:{},uniformTypes:{viewProjectionMatrix:"mat4x4<f32>"}},rs="inputs.positions * inputs.instanceScale",ss="vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)",os="positions * instanceScale",as="vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)",ot=class extends W{lightModelProps;_instanceData;_managedBuffers;buildInstanceData;sizePropNames;constructor(t,e,n){let r=n.buildInstanceData(e),s=xn(t,e.id||n.idPrefix,r),o=new $({lightMarker:ns});o.setProps({lightMarker:{viewProjectionMatrix:bn(e)}});let{source:a,vs:c,fs:h}=us(n.anchorMode),l=e;super(t,{...l,id:e.id||n.idPrefix,source:a,vs:c,fs:h,geometry:n.geometry,shaderInputs:o,bufferLayout:[...is],attributes:s,instanceCount:r.instanceCount,parameters:Mn(e.parameters)}),this.lightModelProps=e,this._instanceData=r,this._managedBuffers=s,this.buildInstanceData=n.buildInstanceData,this.sizePropNames=n.sizePropNames}destroy(){super.destroy(),yn(this._managedBuffers),this._managedBuffers={}}draw(t){return this.instanceCount===0?!0:super.draw(t)}setProps(t){this.lightModelProps={...this.lightModelProps,...t},t.parameters&&this.setParameters(Mn(this.lightModelProps.parameters)),("viewMatrix"in t||"projectionMatrix"in t)&&(this.shaderInputs.setProps({lightMarker:{viewProjectionMatrix:bn(this.lightModelProps)}}),this.setNeedsRedraw("lightMarker camera")),ds(t,this.sizePropNames)&&this.rebuildInstanceData()}rebuildInstanceData(){let t=this.buildInstanceData(this.lightModelProps),e=xn(this.device,this.id,t);this.setAttributes(e),this.setInstanceCount(t.instanceCount),yn(this._managedBuffers),this._managedBuffers=e,this._instanceData=t}};function _n(i){let t=wn(i.lights),e=ri(i),n=i.pointLightRadius??Hr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>({color:si(r),direction:ni,position:r.position,scale:[n,n,n]}),t)}function In(i){let t=An(i.lights),e=ri(i),n=i.spotLightLength??Wr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>{let o=jt(r.outerConeAngle??Math.PI/4,0,Math.PI/2-ts),a=Math.tan(o)*n;return{color:si(r),direction:Tn(r.direction),position:r.position,scale:[a,n,a]}},t)}function vn(i){let t=cs(i.lights),e=ri(i),n=i.directionalLightLength??Yr*e.sceneScale*e.markerScale,r=n*Kr;return oi(t.length,(s,o)=>{let a=Tn(s.direction),c=[e.sceneCenter[0]-a[0]*e.sceneScale*ei,e.sceneCenter[1]-a[1]*e.sceneScale*ei,e.sceneCenter[2]-a[2]*e.sceneScale*ei];return{color:si(s),direction:a,position:c,scale:[r,n,r]}},t)}function wn(i){return i.filter(t=>t.type==="point")}function An(i){return i.filter(t=>t.type==="spot")}function cs(i){return i.filter(t=>t.type==="directional")}function ri(i){let t=hs(i.lights,i.bounds),e=[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2,(t[0][2]+t[1][2])/2],n=Math.max(Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1],t[1][2]-t[0][2]),Jr);return{bounds:t,markerScale:Math.max(i.markerScale??Qr,0),sceneCenter:e,sceneScale:n}}function si(i){let t=i.color||Zr,e=Math.max(i.intensity??1,0),n=jt(.35+.3*Math.log10(e+1),.35,1);return[jt(t[0]/ii,0,1)*n,jt(t[1]/ii,0,1)*n,jt(t[2]/ii,0,1)*n,1]}function Tn(i){let[t,e,n]=i||ni,r=Math.hypot(t,e,n);return r===0?[...ni]:[t/r,e/r,n/r]}function oi(i,t,e=[]){let n=new Float32Array(i*3),r=new Float32Array(i*3),s=new Float32Array(i*3),o=new Float32Array(i*4);for(let[a,c]of e.entries()){let h=t(c,a);n.set(h.position,a*3),r.set(h.direction,a*3),s.set(h.scale,a*3),o.set(h.color,a*4)}return{instanceCount:i,instancePositions:n,instanceDirections:r,instanceScales:s,instanceColors:o}}function hs(i,t){if(t)return ls(t);let e=[...wn(i).map(s=>s.position),...An(i).map(s=>s.position)];if(e.length===0)return[[-.5,-.5,-.5],[.5,.5,.5]];let n=[...e[0]],r=[...e[0]];for(let s of e.slice(1))n[0]=Math.min(n[0],s[0]),n[1]=Math.min(n[1],s[1]),n[2]=Math.min(n[2],s[2]),r[0]=Math.max(r[0],s[0]),r[1]=Math.max(r[1],s[1]),r[2]=Math.max(r[2],s[2]);return[n,r]}function ls(i){return[[...i[0]],[...i[1]]]}function xn(i,t,e){return{instancePosition:i.createBuffer({id:`${t}-instance-position`,data:me(e.instancePositions,3)}),instanceDirection:i.createBuffer({id:`${t}-instance-direction`,data:me(e.instanceDirections,3)}),instanceScale:i.createBuffer({id:`${t}-instance-scale`,data:me(e.instanceScales,3)}),instanceColor:i.createBuffer({id:`${t}-instance-color`,data:me(e.instanceColors,4)})}}function me(i,t){return i.length>0?i:new Float32Array(t)}function yn(i){for(let t of Object.values(i))t?.destroy()}function bn(i){return new q(i.projectionMatrix).multiplyRight(i.viewMatrix)}function ds(i,t){return"lights"in i||"bounds"in i||"markerScale"in i?!0:t.some(e=>e in i)}function Mn(i){return{...es,...i||{}}}function us(i){let t=i==="apex"?ss:rs,e=i==="apex"?as:os;return{source:`struct lightMarkerUniforms {
85
+ viewProjectionMatrix: mat4x4<f32>,
86
+ };
87
+
88
+ @binding(0) @group(0) var<uniform> lightMarker : lightMarkerUniforms;
89
+
90
+ struct VertexInputs {
91
+ @location(0) positions : vec3<f32>,
92
+ @location(1) instancePosition : vec3<f32>,
93
+ @location(2) instanceDirection : vec3<f32>,
94
+ @location(3) instanceScale : vec3<f32>,
95
+ @location(4) instanceColor : vec4<f32>,
96
+ };
97
+
98
+ struct FragmentInputs {
99
+ @builtin(position) Position : vec4<f32>,
100
+ @location(0) color : vec4<f32>,
101
+ };
102
+
103
+ fn lightMarker_rotate(localPosition: vec3<f32>, direction: vec3<f32>) -> vec3<f32> {
104
+ let forward = normalize(direction);
105
+ var helperAxis = vec3<f32>(0.0, 1.0, 0.0);
106
+ if (abs(forward.y) > 0.999) {
107
+ helperAxis = vec3<f32>(1.0, 0.0, 0.0);
108
+ }
109
+
110
+ let tangent = normalize(cross(helperAxis, forward));
111
+ let bitangent = cross(forward, tangent);
112
+ return tangent * localPosition.x + forward * localPosition.y + bitangent * localPosition.z;
113
+ }
114
+
115
+ @vertex
116
+ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
117
+ var outputs : FragmentInputs;
118
+ let localPosition = ${t};
119
+ let worldPosition = inputs.instancePosition + lightMarker_rotate(localPosition, inputs.instanceDirection);
120
+ outputs.Position = lightMarker.viewProjectionMatrix * vec4<f32>(worldPosition, 1.0);
121
+ outputs.color = inputs.instanceColor;
122
+ return outputs;
123
+ }
124
+
125
+ @fragment
126
+ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
127
+ return inputs.color;
128
+ }
129
+ `,vs:`#version 300 es
130
+
131
+ in vec3 positions;
132
+ in vec3 instancePosition;
133
+ in vec3 instanceDirection;
134
+ in vec3 instanceScale;
135
+ in vec4 instanceColor;
136
+
137
+ uniform lightMarkerUniforms {
138
+ mat4 viewProjectionMatrix;
139
+ } lightMarker;
140
+
141
+ out vec4 vColor;
142
+
143
+ vec3 lightMarker_rotate(vec3 localPosition, vec3 direction) {
144
+ vec3 forward = normalize(direction);
145
+ vec3 helperAxis = abs(forward.y) > 0.999 ? vec3(1.0, 0.0, 0.0) : vec3(0.0, 1.0, 0.0);
146
+ vec3 tangent = normalize(cross(helperAxis, forward));
147
+ vec3 bitangent = cross(forward, tangent);
148
+ return tangent * localPosition.x + forward * localPosition.y + bitangent * localPosition.z;
149
+ }
150
+
151
+ void main(void) {
152
+ vec3 localPosition = ${e};
153
+ vec3 worldPosition = instancePosition + lightMarker_rotate(localPosition, instanceDirection);
154
+ gl_Position = lightMarker.viewProjectionMatrix * vec4(worldPosition, 1.0);
155
+ vColor = instanceColor;
156
+ }
157
+ `,fs:`#version 300 es
158
+ precision highp float;
159
+
160
+ in vec4 vColor;
161
+ out vec4 fragColor;
162
+
163
+ void main(void) {
164
+ fragColor = vColor;
165
+ }
166
+ `}}function jt(i,t,e){return Math.min(e,Math.max(t,i))}var fs=new It({nlat:8,nlong:12,radius:1}),pe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"centered",buildInstanceData:_n,geometry:fs,idPrefix:"point-light-model",sizePropNames:["pointLightRadius"]})}};var ms={x:[2,0,1],y:[0,1,2],z:[1,2,0]},at=class extends V{constructor(t={}){let{id:e=S("truncated-code-geometry")}=t,{indices:n,attributes:r}=ps(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function ps(i={}){let{bottomRadius:t=0,topRadius:e=0,height:n=1,nradial:r=10,nvertical:s=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(s+1+h),d=Math.atan2(t-e,n),u=Math.sin,g=Math.cos,p=Math.PI,f=g(d),y=u(d),M=a?-2:0,I=s+(c?2:0),m=r+1,x=new Uint16Array(r*(s+h)*6),b=ms[o],_=new Float32Array(l*3),T=new Float32Array(l*3),E=new Float32Array(l*2),L=0,O=0;for(let v=M;v<=I;v++){let P=v/s,C=n*P,A;v<0?(C=0,P=1,A=t):v>s?(C=n,P=1,A=e):A=t+(e-t)*(v/s),(v===-2||v===s+2)&&(A=0,P=0),C-=n/2;for(let B=0;B<m;B++){let tt=u(B*p*2/r),Z=g(B*p*2/r);_[L+b[0]]=tt*A,_[L+b[1]]=C,_[L+b[2]]=Z*A,T[L+b[0]]=v<0||v>s?0:tt*f,T[L+b[1]]=v<0?-1:v>s?1:y,T[L+b[2]]=v<0||v>s?0:Z*f,E[O+0]=B/r,E[O+1]=P,O+=2,L+=3}}for(let v=0;v<s+h;v++)for(let P=0;P<r;P++){let C=(v*r+P)*6;x[C+0]=m*(v+0)+0+P,x[C+1]=m*(v+0)+1+P,x[C+2]=m*(v+1)+1+P,x[C+3]=m*(v+0)+0+P,x[C+4]=m*(v+1)+1+P,x[C+5]=m*(v+1)+0+P}return{indices:x,attributes:{POSITION:_,NORMAL:T,TEXCOORD_0:E}}}var ct=class extends at{constructor(t={}){let{id:e=S("cone-geometry"),radius:n=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:n})}};var gs=new ct({cap:!0,nradial:16,nvertical:1,radius:1}),ge=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:In,geometry:gs,idPrefix:"spot-light-model",sizePropNames:["spotLightLength"]})}};var xs=new ct({cap:!0,nradial:12,nvertical:1,radius:1}),xe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:vn,geometry:xs,idPrefix:"directional-light-model",sizePropNames:["directionalLightLength"]})}};function ai(i,t){if(!i)throw new Error(t)}var it=class{id;matrix=new q;display=!0;position=new H;rotation=new H;scale=new H(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||S(this.constructor.name),this._setScenegraphNodeProps(t)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(t){return this._setScenegraphNodeProps(t),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(t){return ai(t.length===3,"setPosition requires vector argument"),this.position=t,this}setRotation(t){return ai(t.length===3||t.length===4,"setRotation requires vector argument"),this.rotation=t,this}setScale(t){return ai(t.length===3,"setScale requires vector argument"),this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:n,scale:r,update:s=!0}=t;return e&&this.setPosition(e),n&&this.setRotation(n),r&&this.setScale(r),s&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let t=new q().fromQuaternion(this.rotation);this.matrix.multiplyRight(t)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:t,rotation:e,scale:n}={}){return t&&this.setPosition(t),e&&this.setRotation(e),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let n=new q(t).multiplyRight(e),r=n.invert(),s=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:n,worldInverseMatrix:r,worldInverseTransposeMatrix:s}}_setScenegraphNodeProps(t){t?.position&&this.setPosition(t.position),t?.rotation&&this.setRotation(t.rotation),t?.scale&&this.setScale(t.scale),this.updateMatrix(),t?.matrix&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var Pn=R(U(),1);var ft=class extends it{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Pn.log.assert(e.every(n=>n instanceof it),"every child must an instance of ScenegraphNode"),super(t),this.children=e}getBounds(){let t=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((e,{worldMatrix:n})=>{let r=e.getBounds();if(!r)return;let[s,o]=r,a=new H(s).add(o).divide([2,2,2]);n.transformAsPoint(a,a);let c=new H(o).subtract(s).divide([2,2,2]);n.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new H(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],l[d]),t[1][d]=Math.max(t[1][d],l[d])}}),Number.isFinite(t[0][0])?t:null}destroy(){this.children.forEach(t=>t.destroy()),this.removeAll(),super.destroy()}add(...t){for(let e of t)Array.isArray(e)?this.add(...e):this.children.push(e);return this}remove(t){let e=this.children,n=e.indexOf(t);return n>-1&&e.splice(n,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof ft?r.traverse(t,{worldMatrix:n}):t(r,{worldMatrix:n})}preorderTraversal(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);t(this,{worldMatrix:n});for(let r of this.children)r instanceof ft?r.preorderTraversal(t,{worldMatrix:n}):t(r,{worldMatrix:n})}};var ye=class extends it{model;bounds=null;managedResources;constructor(t){super(t),this.model=t.model,this.managedResources=t.managedResources||[],this.bounds=t.bounds||null,this.setProps(t)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(t=>t.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(t){return this.model.draw(t)}};var be=class extends V{constructor(t={}){let{id:e=S("cube-geometry"),indices:n=!0}=t;super(n?{...t,id:e,topology:"triangle-list",indices:{size:1,value:ys},attributes:{...As,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Ts,...t.attributes}})}},ys=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]),bs=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1]),Ms=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]),_s=new Float32Array([0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1]),Is=new Float32Array([1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1]),vs=new Float32Array([1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0]),ws=new Float32Array([1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,1]),As={POSITION:{size:3,value:bs},NORMAL:{size:3,value:Ms},TEXCOORD_0:{size:2,value:_s}},Ts={POSITION:{size:3,value:Is},TEXCOORD_0:{size:2,value:vs},COLOR_0:{size:3,value:ws}};var Me=class extends at{constructor(t={}){let{id:e=S("cylinder-geometry"),radius:n=1}=t;super({...t,id:e,bottomRadius:n,topRadius:n})}};var Ps=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],Ss=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],_e=class extends V{constructor(t={}){let{id:e=S("ico-sphere-geometry")}=t,{indices:n,attributes:r}=Ls(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ls(i){let{iterations:t=0}=i,e=Math.PI,n=e*2,r=[...Ps],s=[...Ss];r.push(),s.push();let o=(()=>{let l={};return(d,u)=>{d*=3,u*=3;let g=d<u?d:u,p=d>u?d:u,f=`${g}|${p}`;if(f in l)return l[f];let y=r[d],M=r[d+1],I=r[d+2],m=r[u],x=r[u+1],b=r[u+2],_=(y+m)/2,T=(M+x)/2,E=(I+b)/2,L=Math.sqrt(_*_+T*T+E*E);return _/=L,T/=L,E/=L,r.push(_,T,E),l[f]=r.length/3-1}})();for(let l=0;l<t;l++){let d=[];for(let u=0;u<s.length;u+=3){let g=o(s[u+0],s[u+1]),p=o(s[u+1],s[u+2]),f=o(s[u+2],s[u+0]);d.push(f,s[u+0],g,g,s[u+1],p,p,s[u+2],f,g,p,f)}s=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=s.length;for(let l=h-3;l>=0;l-=3){let d=s[l+0],u=s[l+1],g=s[l+2],p=d*3,f=u*3,y=g*3,M=d*2,I=u*2,m=g*2,x=r[p+0],b=r[p+1],_=r[p+2],T=Math.acos(_/Math.sqrt(x*x+b*b+_*_)),E=Math.atan2(b,x)+e,L=T/e,O=1-E/n,v=r[f+0],P=r[f+1],C=r[f+2],A=Math.acos(C/Math.sqrt(v*v+P*P+C*C)),B=Math.atan2(P,v)+e,tt=A/e,Z=1-B/n,Xt=r[y+0],qt=r[y+1],Ht=r[y+2],$n=Math.acos(Ht/Math.sqrt(Xt*Xt+qt*qt+Ht*Ht)),Vn=Math.atan2(qt,Xt)+e,mi=$n/e,Wt=1-Vn/n,Xn=[Xt-v,qt-P,Ht-C],qn=[x-v,b-P,_-C],Y=new H(Xn).cross(qn).normalize(),N;(O===0||Z===0||Wt===0)&&(O===0||O>.5)&&(Z===0||Z>.5)&&(Wt===0||Wt>.5)&&(r.push(r[p+0],r[p+1],r[p+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=L,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[f+0],r[f+1],r[f+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=tt,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[y+0],r[y+1],r[y+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=mi,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z),a[p+0]=a[f+0]=a[y+0]=Y.x,a[p+1]=a[f+1]=a[y+1]=Y.y,a[p+2]=a[f+2]=a[y+2]=Y.z,c[M+0]=O,c[M+1]=L,c[I+0]=Z,c[I+1]=tt,c[m+0]=Wt,c[m+1]=mi}return{indices:{size:1,value:new Uint16Array(s)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function Sn(i){let{indices:t,attributes:e}=i;if(!t)return i;let n=t.value.length,r={};for(let s in e){let o=e[s],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(n*h);for(let d=0;d<n;++d){let u=t.value[d];for(let g=0;g<h;g++)l[d*h+g]=c[u*h+g]}r[s]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var Ie=class extends V{constructor(t={}){let{id:e=S("plane-geometry")}=t,{indices:n,attributes:r}=Cs(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cs(i){let{type:t="x,y",offset:e=0,flipCull:n=!1,unpack:r=!1}=i,s=t.split(","),o=i[`${s[0]}len`]||1,a=i[`${s[1]}len`]||1,c=i[`n${s[0]}`]||1,h=i[`n${s[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),u=new Float32Array(l*3),g=new Float32Array(l*2);n&&(o=-o);let p=0,f=0;for(let m=0;m<=h;m++)for(let x=0;x<=c;x++){let b=x/c,_=m/h;switch(g[p+0]=n?1-b:b,g[p+1]=_,t){case"x,y":d[f+0]=o*b-o*.5,d[f+1]=a*_-a*.5,d[f+2]=e,u[f+0]=0,u[f+1]=0,u[f+2]=n?1:-1;break;case"x,z":d[f+0]=o*b-o*.5,d[f+1]=e,d[f+2]=a*_-a*.5,u[f+0]=0,u[f+1]=n?1:-1,u[f+2]=0;break;case"y,z":d[f+0]=e,d[f+1]=o*b-o*.5,d[f+2]=a*_-a*.5,u[f+0]=n?1:-1,u[f+1]=0,u[f+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}p+=2,f+=3}let y=c+1,M=new Uint16Array(c*h*6);for(let m=0;m<h;m++)for(let x=0;x<c;x++){let b=(m*c+x)*6;M[b+0]=(m+0)*y+x,M[b+1]=(m+1)*y+x,M[b+2]=(m+0)*y+x+1,M[b+3]=(m+1)*y+x,M[b+4]=(m+1)*y+x+1,M[b+5]=(m+0)*y+x+1}let I={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}};return r?Sn(I):I}function Ln(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Es(Math.abs(i*t)*1432.71))}function Es(i){return i-Math.floor(i)}var ci="";function Cn(i){ci=i}async function En(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:ci+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function On(i,t){return await new Promise((e,n)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:ci+i}catch(r){n(r)}})}var Rn=R(rt(),1);var nt=R(U(),1),Tt=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},Pt=class extends Tt{constructor(t,e){e={...e};let{width:n=1,height:r=1}=e,s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-0`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r})),o=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-1`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r}));let a=t.createFramebuffer({...e,colorAttachments:s});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}},ve=class extends Tt{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}};function kn(i){let{shaderPass:t,action:e,shadingLanguage:n}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return n==="wgsl"?Os(r):Rs(r);case"sample":let s=`${t.name}_sampleColor`;return n==="wgsl"?ks(s):Ns(s);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Os(i){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
85
167
  @group(0) @binding(2) var sourceTextureSampler: sampler;
86
168
 
87
169
  @fragment
@@ -90,19 +172,19 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
90
172
  let texSize = vec2f(textureDimensions(sourceTexture));
91
173
 
92
174
  var fragColor = textureSample(sourceTexture, sourceTextureSampler, texCoord);
93
- fragColor = ${s}(fragColor, texSize, texCoord);
175
+ fragColor = ${i}(fragColor, texSize, texCoord);
94
176
  return fragColor;
95
177
  }
96
- `}function Mr(s){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
178
+ `}function ks(i){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
97
179
  @group(0) @binding(2) var sourceTextureSampler: sampler;
98
180
 
99
181
  @fragment
100
182
  fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
101
183
  let texCoord = inputs.coordinate;
102
184
  let texSize = vec2f(textureDimensions(sourceTexture));
103
- return ${s}(sourceTexture, sourceTextureSampler, texSize, texCoord);
185
+ return ${i}(sourceTexture, sourceTextureSampler, texSize, texCoord);
104
186
  }
105
- `}function _r(s){return`#version 300 es
187
+ `}function Rs(i){return`#version 300 es
106
188
 
107
189
  uniform sampler2D sourceTexture;
108
190
 
@@ -118,9 +200,9 @@ void main() {
118
200
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
119
201
 
120
202
  fragColor = texture(sourceTexture, texCoord);
121
- fragColor = ${s}(fragColor, texSize, texCoord);
203
+ fragColor = ${i}(fragColor, texSize, texCoord);
122
204
  }
123
- `}function wr(s){return`#version 300 es
205
+ `}function Ns(i){return`#version 300 es
124
206
 
125
207
  uniform sampler2D sourceTexture;
126
208
 
@@ -135,9 +217,9 @@ void main() {
135
217
  ivec2 iTexSize = textureSize(sourceTexture, 0);
136
218
  vec2 texSize = vec2(float(iTexSize.x), float(iTexSize.y));
137
219
 
138
- fragColor = ${s}(sourceTexture, texSize, texCoord);
220
+ fragColor = ${i}(sourceTexture, texSize, texCoord);
139
221
  }
140
- `}var ut=class{device;shaderInputs;passRenderers;swapFramebuffers;textureModel;constructor(e,t){this.device=e,t.shaderPasses.map(n=>(0,ei.initializeShaderModule)(n));let i=t.shaderPasses.reduce((n,o)=>({...n,[o.name]:o}),{});this.shaderInputs=t.shaderInputs||new Z(i);let r=e.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new _e(e,{colorAttachments:[e.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new xe(e,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.passRenderers=t.shaderPasses.map(n=>new Bt(e,n))}destroy(){for(let e of this.passRenderers)e.destroy();this.swapFramebuffers.destroy(),this.textureModel.destroy()}resize(e){e||=this.device.getCanvasContext().getDrawingBufferSize(),this.swapFramebuffers.resize({width:e[0],height:e[1]})}renderToScreen(e){let t=this.renderToTexture(e);if(!t)return!1;let i=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilFormat:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:i,clearDepth:!1});return this.textureModel.setProps({backgroundTexture:t}),this.textureModel.draw(r),r.end(),!0}renderToTexture(e){let{sourceTexture:t}=e;if(!t.isReady)return null;if(this.passRenderers.length===0)return t.texture;this.textureModel.setProps({backgroundTexture:t});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 l={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},h=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:h,bindings:l}),h.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},Bt=class{shaderPass;subPassRenderers;constructor(e,t,i={}){this.shaderPass=t;let r=t.passes||[];this.subPassRenderers=r.map(n=>new Ut(e,t,n))}destroy(){for(let e of this.subPassRenderers)e.destroy()}},Ut=class{model;shaderPass;subPass;constructor(e,t,i){this.shaderPass=t,this.subPass=i;let r=i.action||i.filter&&"filter"||i.sampler&&"sample"||"filter",n=Js({shaderPass:t,action:r,shadingLanguage:e.info.shadingLanguage});this.model=new ne(e,{id:`${t.name}-subpass`,source:n,fs:n,modules:[t],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(e){let{renderPass:t,bindings:i}=e;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(t)}};var V=k(B(),1),ti=k(he(),1);var Gt=2,Tr=1e4,jt=class{device;id;pipelineFactory;shaderFactory;userData={};bindings={};pipeline;source;shader;shaderInputs;_uniformStore;_pipelineNeedsUpdate="newly created";_getModuleUniforms;props;_destroyed=!1;constructor(e,t){if(e.type!=="webgpu")throw new Error("Computation is only supported in WebGPU");this.props={...jt.defaultProps,...t},t=this.props,this.id=t.id||C("model"),this.device=e,Object.assign(this.userData,t.userData);let i=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]);this.shaderInputs=t.shaderInputs||new Z(i),this.setShaderInputs(this.shaderInputs),this.props.shaderLayout||=e.getShaderLayout(this.props.source);let r=Ar(e),n=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.pipelineFactory=t.pipelineFactory||ee.getDefaultPipelineFactory(this.device),this.shaderFactory=t.shaderFactory||te.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(),t.bindings&&this.setBindings(t.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(e,t,i,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),e.setPipeline(this.pipeline),e.setBindings([]),e.dispatch(t,i,r)}finally{this._logDrawCallEnd()}}setVertexCount(e){}setInstanceCount(e){}setShaderInputs(e){this.shaderInputs=e,this._uniformStore=new V.UniformStore(this.shaderInputs.modules);for(let t of Object.keys(this.shaderInputs.modules)){let i=this._uniformStore.getManagedUniformBuffer(this.device,t);this.bindings[`${t}Uniforms`]=i}}setShaderModuleProps(e){let t=this._getModuleUniforms(e),i=Object.keys(t).filter(n=>{let o=t[n];return!Pe(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let n of i)r[n]=t[n],delete t[n]}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues())}setBindings(e){Object.assign(this.bindings,e)}_setPipelineNeedsUpdate(e){this._pipelineNeedsUpdate=this._pipelineNeedsUpdate||e}_updatePipeline(){if(this._pipelineNeedsUpdate){let e=null;this.pipeline&&(V.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),e=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}),e&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let e=V.log.level>3?0:Tr;V.log.level<2||Date.now()-this._lastLogTime<e||(this._lastLogTime=Date.now(),this._logOpen=!0,V.log.group(Gt,`>>> DRAWING MODEL ${this.id}`,{collapsed:V.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let e=this.shaderInputs.getDebugTable();V.log.table(Gt,e)(),V.log.groupEnd(Gt)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(e,t){let i=(0,V.getTypedArrayConstructor)(t);return(e instanceof V.Buffer?new i(e.debugData):e).toString()}},Oe=jt;$(Oe,"defaultProps",{...V.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:ti.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function Ar(s){return{type:s.type,shaderLanguage:s.info.shadingLanguage,shaderLanguageVersion:s.info.shadingLanguageVersion,gpu:s.info.gpu,features:s.features}}var Sr=[0,1,1,1],Q=-1,Pr={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},we=`precision highp float;
222
+ `}var we=class{device;shaderInputs;passRenderers;swapFramebuffers;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(s=>(0,Rn.initializeShaderModule)(s));let n=e.shaderPasses.reduce((s,o)=>({...s,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new $(n);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new Pt(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new _t(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.passRenderers=e.shaderPasses.map(s=>new hi(t,s))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.textureModel.destroy()}resize(t){t||=this.device.getCanvasContext().getDrawingBufferSize(),this.swapFramebuffers.resize({width:t[0],height:t[1]})}renderToScreen(t){let e=this.renderToTexture(t);if(!e)return!1;let n=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilFormat:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:n,clearDepth:!1});return this.textureModel.setProps({backgroundTexture:e}),this.textureModel.draw(r),r.end(),!0}renderToTexture(t){let{sourceTexture:e}=t;if(!e.isReady)return null;if(this.passRenderers.length===0)return e.texture;this.textureModel.setProps({backgroundTexture:e});let n=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(n),n.end();let r=!0;for(let o of this.passRenderers)for(let a of o.subPassRenderers){r||this.swapFramebuffers.swap(),r=!1;let h={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},l=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:l,bindings:h}),l.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},hi=class{shaderPass;subPassRenderers;constructor(t,e,n={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(s=>new li(t,e,s))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},li=class{model;shaderPass;subPass;constructor(t,e,n){this.shaderPass=e,this.subPass=n;let r=n.action||n.filter&&"filter"||n.sampler&&"sample"||"filter",s=kn({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new st(t,{id:`${e.name}-subpass`,source:s,fs:s,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:n}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(n||{}),this.model.draw(e)}};var D=R(U(),1),Nn=R(rt(),1);var di=2,Ds=1e4,ui=class{device;id;pipelineFactory;shaderFactory;userData={};bindings={};pipeline;source;shader;shaderInputs;_uniformStore;_pipelineNeedsUpdate="newly created";_getModuleUniforms;props;_destroyed=!1;constructor(t,e){if(t.type!=="webgpu")throw new Error("Computation is only supported in WebGPU");this.props={...ui.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData);let n=Object.fromEntries(this.props.modules?.map(h=>[h.name,h])||[]);this.shaderInputs=e.shaderInputs||new $(n),this.setShaderInputs(this.shaderInputs);let r=Fs(t),s=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.props.shaderLayout=xt(this.props.shaderLayout,s)||null,this.pipelineFactory=e.pipelineFactory||D.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||D.ShaderFactory.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:s});this.source=o,this._getModuleUniforms=a;let c=t.getShaderLayout?.(this.source);this.props.shaderLayout=xt(this.props.shaderLayout||c||null,s)||null,this.pipeline=this._updatePipeline(),e.bindings&&this.setBindings(e.bindings),Object.seal(this)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.shader),this._uniformStore.destroy(),this._destroyed=!0)}predraw(){this.updateShaderInputs()}dispatch(t,e,n,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings({}),t.dispatch(e,n,r)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new D.UniformStore(this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(yt(n)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),n=Object.keys(e).filter(s=>{let o=e[s];return!kt(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let s of n)r[s]=e[s],delete e[s]}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues())}setBindings(t){Object.assign(this.bindings,t)}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate=this._pipelineNeedsUpdate||t}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null;this.pipeline&&(D.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.shader),this._pipelineNeedsUpdate=!1,this.shader=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"compute",source:this.source,debugShaders:this.props.debugShaders}),this.pipeline=this.pipelineFactory.createComputePipeline({...this.props,shader:this.shader}),t&&this.shaderFactory.release(t)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=D.log.level>3?0:Ds;D.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,D.log.group(di,`>>> DRAWING MODEL ${this.id}`,{collapsed:D.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();D.log.table(di,t)(),D.log.groupEnd(di)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let n=D.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof D.Buffer?new n(t.debugData):t).toString()}},Gt=ui;K(Gt,"defaultProps",{...D.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:Nn.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function Fs(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Q=R(U(),1);var Bs=[0,1,1,1],G=-1,zs={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},St=`precision highp float;
141
223
  precision highp int;
142
224
 
143
225
  uniform pickingUniforms {
@@ -150,50 +232,98 @@ uniform pickingUniforms {
150
232
  int highlightedObjectIndex;
151
233
  vec4 highlightColor;
152
234
  } picking;
153
- `,ft=`struct pickingUniforms {
154
- isActive: int32;
155
- indexMode: int32;
156
- batchIndex: int32;
157
-
158
- isHighlightActive: int32;
159
- highlightedBatchIndex: int32;
160
- highlightedObjectIndex: int32;
161
- highlightColor: vec4<f32>;
162
- } picking;
163
- `;function Cr(s={},e){let t={...e};switch(s.isActive!==void 0&&(t.isActive=Boolean(s.isActive)),s.indexMode){case"instance":t.indexMode=0;break;case"custom":t.indexMode=1;break;case void 0:break}switch(s.highlightedObjectIndex){case void 0:break;case null:t.isHighlightActive=!1,t.highlightedObjectIndex=Q;break;default:t.isHighlightActive=!0,t.highlightedObjectIndex=s.highlightedObjectIndex}return typeof s.highlightedBatchIndex=="number"&&(t.highlightedBatchIndex=s.highlightedBatchIndex),s.highlightColor&&(t.highlightColor=s.highlightColor),t}var pt={props:{},uniforms:{},name:"picking",uniformTypes:Pr,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!0,highlightedBatchIndex:Q,highlightedObjectIndex:Q,highlightColor:Sr},getUniforms:Cr};var Vt=class{device;props;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(e,t){this.device=e,this.props={...Vt.defaultProps,...t}}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 e=this.getFramebuffer();return e.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.props.shaderInputs?.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:e,clearColors:[new Float32Array([0,0,0,0]),new Int32Array([-1,-1,0,0])],clearDepth:1})}async updatePickInfo(e){let t=this.getFramebuffer(),[i,r]=this.getPickPosition(e),n=this.device.readPixelsToArrayWebGL(t,{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(e){let t=this.device.getDefaultCanvasContext().cssToDevicePixels(e),i=t.x+Math.floor(t.width/2),r=t.y+Math.floor(t.height/2);return[i,r]}},Le=Vt;$(Le,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{}});var Ir=`${ft}
235
+ `,Ae=`struct pickingUniforms {
236
+ isActive: i32,
237
+ indexMode: i32,
238
+ batchIndex: i32,
239
+
240
+ isHighlightActive: i32,
241
+ highlightedBatchIndex: i32,
242
+ highlightedObjectIndex: i32,
243
+ highlightColor: vec4<f32>,
244
+ };
164
245
 
165
- const INDEX_PICKING_MODE_INSTANCE = 0;
166
- const INDEX_PICKING_MODE_CUSTOM = 1;
167
- const INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
246
+ @group(0) @binding(auto) var<uniform> picking: pickingUniforms;
247
+ `;function js(i={},t){let e={...t};switch(i.isActive!==void 0&&(e.isActive=Boolean(i.isActive)),i.indexMode){case"instance":e.indexMode=0;break;case"attribute":e.indexMode=1;break;case void 0:break}switch(typeof i.batchIndex=="number"&&(e.batchIndex=i.batchIndex),i.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=G;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=i.highlightedObjectIndex}switch(i.highlightedBatchIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedBatchIndex=G;break;default:e.isHighlightActive=!0,e.highlightedBatchIndex=i.highlightedBatchIndex}return i.highlightColor&&(e.highlightColor=i.highlightColor),e}var Lt={props:{},uniforms:{},name:"picking",uniformTypes:zs,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!1,highlightedBatchIndex:G,highlightedObjectIndex:G,highlightColor:Bs},getUniforms:js};var Dn=1,Gs=new Int32Array([G,G,0,0]);function Pe(i,t="color",e=i==="webgpu"){if(t==="auto")return e?"index":"color";if(t==="index"&&!e)throw new Error(`Picking mode "${t}" requires WebGPU or a WebGL device that supports renderable rg32sint textures.`);return t}function fi(i){return i.type==="webgpu"||i.type==="webgl"&&i.isTextureFormatRenderable("rg32sint")}var zn=Pe;function Fn(i){return{objectIndex:i[0]===G?null:i[0],batchIndex:i[1]===G?null:i[1]}}function Bn(i){let t=i[0]+i[1]*256+i[2]*65536;if(t===0)return{objectIndex:null,batchIndex:null};let e=i[3]>0?i[3]-1:0;return{objectIndex:t-1,batchIndex:e}}var Te=class{device;props;mode;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Te.defaultProps,...e};let n=e.mode??e.backend??Te.defaultProps.mode;this.props.mode=n,this.props.backend=n,this.mode=Pe(this.device.type,n,fi(this.device))}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.mode==="index"?this.createIndexFramebuffer():this.createColorFramebuffer()),this.framebuffer}clearPickState(){this.setPickingProps({highlightedBatchIndex:null,highlightedObjectIndex:null})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.setPickingProps({isActive:!0}),this.mode==="index"?this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),Gs],clearDepth:1}):this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),n=this.getPickPosition(t),r=await this.readPickInfo(e,n);return r?(this.hasPickInfoChanged(r)&&(this.pickInfo=r,this.props.onObjectPicked(r)),this.setPickingProps({isActive:!1,highlightedBatchIndex:r.batchIndex,highlightedObjectIndex:r.objectIndex}),this.pickInfo):null}getPickPosition(t){let e=this.device.type!=="webgpu",n=this.device.getDefaultCanvasContext().cssToDevicePixels(t,e),r=n.x+Math.floor(n.width/2),s=n.y+Math.floor(n.height/2);return[r,s]}createIndexFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT}),e=this.device.createTexture({format:"rg32sint",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT|Q.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t,e],depthStencilAttachment:"depth24plus"})}createColorFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Q.Texture.RENDER_ATTACHMENT|Q.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t],depthStencilAttachment:"depth24plus"})}setPickingProps(t){this.props.shaderInputs?.setProps({picking:t})}async readPickInfo(t,e){return this.mode==="index"?this.readIndexPickInfo(t,e):this.readColorPickInfo(t,e)}async readIndexPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[Dn]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Q.Buffer.COPY_DST|Q.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Fn(new Int32Array(c.buffer,c.byteOffset,2))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:Dn});return r?Fn(new Int32Array(r.buffer,r.byteOffset,2)):null}async readColorPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[0]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Q.Buffer.COPY_DST|Q.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Bn(new Uint8Array(c.buffer,c.byteOffset,4))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:0});return r?Bn(new Uint8Array(r.buffer,r.byteOffset,4)):null}hasPickInfoChanged(t){return t.objectIndex!==this.pickInfo.objectIndex||t.batchIndex!==this.pickInfo.batchIndex}},Ut=Te;K(Ut,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{},mode:"color",backend:"color"});var Us=`${Ae}
168
248
 
169
- /**
170
- * Vertex shaders should call this function to set the object index.
171
- * If using instance or vertex mode, argument will be ignored, 0 can be supplied.
172
- */
173
- fn picking_setObjectIndex(objectIndex: int32) {
174
- switch (picking.indexMode) {
175
- case INDEX_PICKING_MODE_INSTANCE, default: {
176
- picking_objectIndex = instance_index;
177
- };
178
- case INDEX_PICKING_MODE_CUSTOM: {
179
- picking_objectIndex = objectIndex;
180
- };
249
+ const COLOR_PICKING_INVALID_INDEX = ${G};
250
+ const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
251
+ const COLOR_PICKING_MAX_BATCH_INDEX = 254;
252
+
253
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
254
+ return objectIndex;
255
+ }
256
+
257
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
258
+ return
259
+ picking.isHighlightActive != 0 &&
260
+ picking.highlightedBatchIndex == picking.batchIndex &&
261
+ picking.highlightedObjectIndex == objectIndex;
262
+ }
263
+
264
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
265
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
266
+ return color;
267
+ }
268
+
269
+ let highLightAlpha = picking.highlightColor.a;
270
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
271
+ if (blendedAlpha == 0.0) {
272
+ return vec4<f32>(color.rgb, 0.0);
181
273
  }
274
+
275
+ let highLightRatio = highLightAlpha / blendedAlpha;
276
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
277
+ return vec4<f32>(blendedRGB, blendedAlpha);
278
+ }
279
+
280
+ fn picking_canEncodePickInfo(objectIndex: i32) -> bool {
281
+ return
282
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
283
+ objectIndex >= 0 &&
284
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
285
+ picking.batchIndex >= 0 &&
286
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
182
287
  }
183
288
 
184
- `,Er=`${we}
289
+ fn picking_getPickingColor(objectIndex: i32) -> vec4<f32> {
290
+ if (!picking_canEncodePickInfo(objectIndex)) {
291
+ return vec4<f32>(0.0, 0.0, 0.0, 0.0);
292
+ }
293
+
294
+ let encodedObjectIndex = objectIndex + 1;
295
+ let red = encodedObjectIndex % 256;
296
+ let green = (encodedObjectIndex / 256) % 256;
297
+ let blue = (encodedObjectIndex / 65536) % 256;
298
+ let alpha = picking.batchIndex + 1;
299
+
300
+ return vec4<f32>(
301
+ f32(red) / 255.0,
302
+ f32(green) / 255.0,
303
+ f32(blue) / 255.0,
304
+ f32(alpha) / 255.0
305
+ );
306
+ }
307
+
308
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
309
+ if (picking.isActive != 0) {
310
+ if (!picking_canEncodePickInfo(objectIndex)) {
311
+ discard;
312
+ }
313
+ return picking_getPickingColor(objectIndex);
314
+ }
315
+
316
+ return color;
317
+ }
318
+ `,$s=`${St}
185
319
 
186
320
  const int INDEX_PICKING_MODE_INSTANCE = 0;
187
321
  const int INDEX_PICKING_MODE_CUSTOM = 1;
188
322
 
189
- const int INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
323
+ const int COLOR_PICKING_INVALID_INDEX = ${G};
190
324
 
191
325
  flat out int picking_objectIndex;
192
326
 
193
- /**
194
- * Vertex shaders should call this function to set the object index.
195
- * If using instance or vertex mode, argument will be ignored, 0 can be supplied.
196
- */
197
327
  void picking_setObjectIndex(int objectIndex) {
198
328
  switch (picking.indexMode) {
199
329
  case INDEX_PICKING_MODE_INSTANCE:
@@ -204,38 +334,31 @@ void picking_setObjectIndex(int objectIndex) {
204
334
  break;
205
335
  }
206
336
  }
207
- `,Rr=`${we}
337
+ `,Vs=`${St}
208
338
 
209
- const int INDEX_PICKING_INVALID_INDEX = ${Q}; // 2^32 - 1
339
+ const int COLOR_PICKING_INVALID_INDEX = ${G};
340
+ const int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
341
+ const int COLOR_PICKING_MAX_BATCH_INDEX = 254;
210
342
 
211
343
  flat in int picking_objectIndex;
212
344
 
213
- /**
214
- * Check if this vertex is highlighted (part of the selected batch and object)
215
- */
216
345
  bool picking_isFragmentHighlighted() {
217
- return
346
+ return
218
347
  bool(picking.isHighlightActive) &&
219
348
  picking.highlightedBatchIndex == picking.batchIndex &&
220
349
  picking.highlightedObjectIndex == picking_objectIndex
221
350
  ;
222
351
  }
223
352
 
224
- /**
225
- * Returns highlight color if this item is selected.
226
- */
227
353
  vec4 picking_filterHighlightColor(vec4 color) {
228
- // If we are still picking, we don't highlight
229
354
  if (bool(picking.isActive)) {
230
355
  return color;
231
356
  }
232
357
 
233
- // If we are not highlighted, return color as is
234
358
  if (!picking_isFragmentHighlighted()) {
235
359
  return color;
236
360
  }
237
-
238
- // Blend in highlight color based on its alpha value
361
+
239
362
  float highLightAlpha = picking.highlightColor.a;
240
363
  float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
241
364
  float highLightRatio = highLightAlpha / blendedAlpha;
@@ -244,147 +367,170 @@ vec4 picking_filterHighlightColor(vec4 color) {
244
367
  return vec4(blendedRGB, blendedAlpha);
245
368
  }
246
369
 
247
- /*
248
- * Returns picking color if picking enabled else unmodified argument.
249
- */
250
- ivec4 picking_getPickingColor() {
251
- // Assumes that colorAttachment0 is rg32int
252
- // TODO? - we could render indices into a second color attachment and not mess with fragColor
253
- return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u);
370
+ bool picking_canEncodePickInfo(int objectIndex) {
371
+ return
372
+ objectIndex != COLOR_PICKING_INVALID_INDEX &&
373
+ objectIndex >= 0 &&
374
+ objectIndex <= COLOR_PICKING_MAX_OBJECT_INDEX &&
375
+ picking.batchIndex >= 0 &&
376
+ picking.batchIndex <= COLOR_PICKING_MAX_BATCH_INDEX;
377
+ }
378
+
379
+ vec4 picking_getPickingColor() {
380
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
381
+ return vec4(0.0);
382
+ }
383
+
384
+ int encodedObjectIndex = picking_objectIndex + 1;
385
+ int red = encodedObjectIndex % 256;
386
+ int green = (encodedObjectIndex / 256) % 256;
387
+ int blue = (encodedObjectIndex / 65536) % 256;
388
+ int alpha = picking.batchIndex + 1;
389
+
390
+ return vec4(float(red), float(green), float(blue), float(alpha)) / 255.0;
254
391
  }
255
392
 
256
393
  vec4 picking_filterPickingColor(vec4 color) {
257
394
  if (bool(picking.isActive)) {
258
- if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {
395
+ if (!picking_canEncodePickInfo(picking_objectIndex)) {
259
396
  discard;
260
397
  }
398
+ return picking_getPickingColor();
261
399
  }
400
+
262
401
  return color;
263
402
  }
264
403
 
265
- /*
266
- * Returns picking color if picking is enabled if not
267
- * highlight color if this item is selected, otherwise unmodified argument.
268
- */
269
404
  vec4 picking_filterColor(vec4 color) {
270
405
  vec4 outColor = color;
271
406
  outColor = picking_filterHighlightColor(outColor);
272
407
  outColor = picking_filterPickingColor(outColor);
273
408
  return outColor;
274
409
  }
275
- `,si={...pt,name:"picking",source:Ir,vs:Er,fs:Rr};var Or=`${ft}
276
- `,Lr=`${we}
277
- out vec4 picking_vRGBcolor_Avalid;
410
+ `,$t={...Lt,name:"picking",source:Us,vs:$s,fs:Vs};var Xs=`${Ae}
278
411
 
279
- // Normalize unsigned byte color to 0-1 range
280
- vec3 picking_normalizeColor(vec3 color) {
281
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
282
- }
283
-
284
- // Normalize unsigned byte color to 0-1 range
285
- vec4 picking_normalizeColor(vec4 color) {
286
- return picking.useFloatColors > 0.5 ? color : color / 255.0;
287
- }
288
-
289
- bool picking_isColorZero(vec3 color) {
290
- return dot(color, vec3(1.0)) < 0.00001;
291
- }
412
+ const INDEX_PICKING_MODE_INSTANCE = 0;
413
+ const INDEX_PICKING_MODE_CUSTOM = 1;
414
+ const INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
292
415
 
293
- bool picking_isColorValid(vec3 color) {
294
- return dot(color, vec3(1.0)) > 0.00001;
416
+ /**
417
+ * WGSL shaders need to carry the returned object index through their own stage outputs.
418
+ */
419
+ fn picking_setObjectIndex(objectIndex: i32) -> i32 {
420
+ return objectIndex;
295
421
  }
296
422
 
297
- // Check if this vertex is highlighted
298
- bool isVertexHighlighted(vec3 vertexColor) {
299
- vec3 highlightedObjectColor = picking_normalizeColor(picking.highlightedObjectColor);
423
+ fn picking_isObjectHighlighted(objectIndex: i32) -> bool {
300
424
  return
301
- bool(picking.isHighlightActive) && picking_isColorZero(abs(vertexColor - highlightedObjectColor));
425
+ picking.isHighlightActive != 0 &&
426
+ picking.highlightedBatchIndex == picking.batchIndex &&
427
+ picking.highlightedObjectIndex == objectIndex;
302
428
  }
303
429
 
304
- // Set the current picking color
305
- void picking_setPickingColor(vec3 pickingColor) {
306
- pickingColor = picking_normalizeColor(pickingColor);
307
-
308
- if (bool(picking.isActive)) {
309
- // Use alpha as the validity flag. If pickingColor is [0, 0, 0] fragment is non-pickable
310
- picking_vRGBcolor_Avalid.a = float(picking_isColorValid(pickingColor));
311
-
312
- if (!bool(picking.isAttribute)) {
313
- // Stores the picking color so that the fragment shader can render it during picking
314
- picking_vRGBcolor_Avalid.rgb = pickingColor;
315
- }
316
- } else {
317
- // Do the comparison with selected item color in vertex shader as it should mean fewer compares
318
- picking_vRGBcolor_Avalid.a = float(isVertexHighlighted(pickingColor));
430
+ fn picking_filterHighlightColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
431
+ if (picking.isActive != 0 || !picking_isObjectHighlighted(objectIndex)) {
432
+ return color;
319
433
  }
320
- }
321
434
 
322
- void picking_setObjectIndex(uint objectIndex) {
323
- if (bool(picking.isActive)) {
324
- uint index = objectIndex;
325
- if (picking.indexMode == PICKING_INDEX_MODE_INSTANCE) {
326
- index = uint(gl_InstanceID);
327
- }
328
- picking_vRGBcolor_Avalid.r = float(index % 255) / 255.0;
329
- picking_vRGBcolor_Avalid.g = float((index / 255) % 255) / 255.0;
330
- picking_vRGBcolor_Avalid.b = float((index / 255 / 255) %255) / 255.0;
435
+ let highLightAlpha = picking.highlightColor.a;
436
+ let blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
437
+ if (blendedAlpha == 0.0) {
438
+ return vec4<f32>(color.rgb, 0.0);
331
439
  }
440
+
441
+ let highLightRatio = highLightAlpha / blendedAlpha;
442
+ let blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
443
+ return vec4<f32>(blendedRGB, blendedAlpha);
332
444
  }
333
445
 
334
- void picking_setPickingAttribute(float value) {
335
- if (bool(picking.isAttribute)) {
336
- picking_vRGBcolor_Avalid.r = value;
446
+ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
447
+ if (picking.isActive != 0 && objectIndex == INDEX_PICKING_INVALID_INDEX) {
448
+ discard;
337
449
  }
450
+ return color;
338
451
  }
339
452
 
340
- void picking_setPickingAttribute(vec2 value) {
341
- if (bool(picking.isAttribute)) {
342
- picking_vRGBcolor_Avalid.rg = value;
343
- }
453
+ fn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {
454
+ return vec2<i32>(objectIndex, picking.batchIndex);
344
455
  }
345
456
 
346
- void picking_setPickingAttribute(vec3 value) {
347
- if (bool(picking.isAttribute)) {
348
- picking_vRGBcolor_Avalid.rgb = value;
457
+ `,qs=`${St}
458
+
459
+ const int INDEX_PICKING_MODE_INSTANCE = 0;
460
+ const int INDEX_PICKING_MODE_CUSTOM = 1;
461
+
462
+ const int INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
463
+
464
+ flat out int picking_objectIndex;
465
+
466
+ /**
467
+ * Vertex shaders should call this function to set the object index.
468
+ * If using instance or vertex mode, argument will be ignored, 0 can be supplied.
469
+ */
470
+ void picking_setObjectIndex(int objectIndex) {
471
+ switch (picking.indexMode) {
472
+ case INDEX_PICKING_MODE_INSTANCE:
473
+ picking_objectIndex = gl_InstanceID;
474
+ break;
475
+ case INDEX_PICKING_MODE_CUSTOM:
476
+ picking_objectIndex = objectIndex;
477
+ break;
349
478
  }
350
479
  }
351
- `,kr=`${we}
480
+ `,Hs=`${St}
352
481
 
353
- in vec4 picking_vRGBcolor_Avalid;
482
+ const int INDEX_PICKING_INVALID_INDEX = ${G}; // 2^32 - 1
354
483
 
355
- /*
484
+ flat in int picking_objectIndex;
485
+
486
+ /**
487
+ * Check if this vertex is highlighted (part of the selected batch and object)
488
+ */
489
+ bool picking_isFragmentHighlighted() {
490
+ return
491
+ bool(picking.isHighlightActive) &&
492
+ picking.highlightedBatchIndex == picking.batchIndex &&
493
+ picking.highlightedObjectIndex == picking_objectIndex
494
+ ;
495
+ }
496
+
497
+ /**
356
498
  * Returns highlight color if this item is selected.
357
499
  */
358
500
  vec4 picking_filterHighlightColor(vec4 color) {
359
501
  // If we are still picking, we don't highlight
360
- if (picking.isActive > 0.5) {
502
+ if (bool(picking.isActive)) {
361
503
  return color;
362
504
  }
363
505
 
364
- bool selected = bool(picking_vRGBcolor_Avalid.a);
365
-
366
- if (selected) {
367
- // Blend in highlight color based on its alpha value
368
- float highLightAlpha = picking.highlightColor.a;
369
- float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
370
- float highLightRatio = highLightAlpha / blendedAlpha;
371
-
372
- vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
373
- return vec4(blendedRGB, blendedAlpha);
374
- } else {
506
+ // If we are not highlighted, return color as is
507
+ if (!picking_isFragmentHighlighted()) {
375
508
  return color;
376
509
  }
510
+
511
+ // Blend in highlight color based on its alpha value
512
+ float highLightAlpha = picking.highlightColor.a;
513
+ float blendedAlpha = highLightAlpha + color.a * (1.0 - highLightAlpha);
514
+ float highLightRatio = highLightAlpha / blendedAlpha;
515
+
516
+ vec3 blendedRGB = mix(color.rgb, picking.highlightColor.rgb, highLightRatio);
517
+ return vec4(blendedRGB, blendedAlpha);
377
518
  }
378
519
 
379
520
  /*
380
521
  * Returns picking color if picking enabled else unmodified argument.
381
522
  */
523
+ ivec4 picking_getPickingColor() {
524
+ // Assumes that colorAttachment0 is rg32int
525
+ // TODO? - we could render indices into a second color attachment and not mess with fragColor
526
+ return ivec4(picking_objectIndex, picking.batchIndex, 0u, 0u);
527
+ }
528
+
382
529
  vec4 picking_filterPickingColor(vec4 color) {
383
530
  if (bool(picking.isActive)) {
384
- if (picking_vRGBcolor_Avalid.a == 0.0) {
531
+ if (picking_objectIndex == INDEX_PICKING_INVALID_INDEX) {
385
532
  discard;
386
533
  }
387
- return picking_vRGBcolor_Avalid;
388
534
  }
389
535
  return color;
390
536
  }
@@ -394,9 +540,11 @@ vec4 picking_filterPickingColor(vec4 color) {
394
540
  * highlight color if this item is selected, otherwise unmodified argument.
395
541
  */
396
542
  vec4 picking_filterColor(vec4 color) {
397
- vec4 highlightColor = picking_filterHighlightColor(color);
398
- return picking_filterPickingColor(highlightColor);
543
+ vec4 outColor = color;
544
+ outColor = picking_filterHighlightColor(outColor);
545
+ outColor = picking_filterPickingColor(outColor);
546
+ return outColor;
399
547
  }
400
- `,ii={...pt,name:"picking",source:Or,vs:Lr,fs:kr};var mt=class{device;framebuffer=null;shaderInputs;constructor(e,t){this.device=e,this.shaderInputs=t}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 e=this.getFramebuffer();return e.resize(this.device.getCanvasContext().getDevicePixelSize()),this.shaderInputs.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:e,clearColor:[0,0,0,0],clearDepth:1})}updatePickState(e){let t=this.getFramebuffer(),[i,r]=this.getPickPosition(e),o=[...this.device.readPixelsToArrayWebGL(t,{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(e){let t=this.device.getCanvasContext().cssToDevicePixels(e),i=t.x+Math.floor(t.width/2),r=t.y+Math.floor(t.height/2);return[i,r]}};var Fr=H;return mi(ke);})();
548
+ `,Se={...Lt,name:"picking",source:Xs,vs:qs,fs:Hs};var jn={...Lt,name:"picking",source:Se.source,vs:$t.vs,fs:$t.fs};var Le=class{device;framebuffer=null;shaderInputs;constructor(t,e){this.device=t,this.shaderInputs=e}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.shaderInputs.setProps({picking:{highlightedObjectColor:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getCanvasContext().getDevicePixelSize()),this.shaderInputs.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}updatePickState(t){let e=this.getFramebuffer(),[n,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:n,sourceY:r,sourceWidth:1,sourceHeight:1})].map(c=>c/255);o[0]+o[1]+o[2]>0||(o=null),this.shaderInputs.setProps({picking:{isActive:!1,highlightedObjectColor:o}})}getPickPosition(t){let e=this.device.getCanvasContext().cssToDevicePixels(t),n=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[n,r]}};var Gn=R(rt(),1),Un=Gn.picking;var Ws=z;return tr(Vt);})();
401
549
  return __exports__;
402
550
  });