@luma.gl/engine 9.3.0-alpha.8 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation-loop/make-animation-loop.d.ts.map +1 -1
- package/dist/animation-loop/make-animation-loop.js +1 -0
- package/dist/animation-loop/make-animation-loop.js.map +1 -1
- package/dist/compute/computation.js +2 -2
- package/dist/compute/computation.js.map +1 -1
- package/dist/debug/debug-framebuffer.d.ts +9 -4
- package/dist/debug/debug-framebuffer.d.ts.map +1 -1
- package/dist/debug/debug-framebuffer.js +91 -45
- package/dist/debug/debug-framebuffer.js.map +1 -1
- package/dist/dist.dev.js +200 -126
- package/dist/dist.min.js +33 -33
- package/dist/dynamic-texture/dynamic-texture.d.ts.map +1 -1
- package/dist/dynamic-texture/dynamic-texture.js +3 -1
- package/dist/dynamic-texture/dynamic-texture.js.map +1 -1
- package/dist/dynamic-texture/texture-data.js +2 -2
- package/dist/dynamic-texture/texture-data.js.map +1 -1
- package/dist/geometries/cube-geometry.js +7 -7
- package/dist/geometries/cube-geometry.js.map +1 -1
- package/dist/geometries/ico-sphere-geometry.js +3 -1
- package/dist/geometries/ico-sphere-geometry.js.map +1 -1
- package/dist/geometry/gpu-geometry.d.ts.map +1 -1
- package/dist/geometry/gpu-geometry.js +3 -0
- package/dist/geometry/gpu-geometry.js.map +1 -1
- package/dist/index.cjs +176 -108
- package/dist/index.cjs.map +3 -3
- package/dist/material/material.js +2 -2
- package/dist/material/material.js.map +1 -1
- package/dist/model/model.d.ts.map +1 -1
- package/dist/model/model.js +45 -34
- package/dist/model/model.js.map +1 -1
- package/dist/models/billboard-texture-model.js +4 -4
- package/dist/models/billboard-texture-module.d.ts +1 -1
- package/dist/models/billboard-texture-module.js +1 -1
- package/dist/models/light-model-utils.js +2 -2
- package/dist/modules/picking/color-picking.d.ts +2 -2
- package/dist/modules/picking/index-picking.d.ts +2 -2
- package/dist/modules/picking/legacy-color-picking.d.ts +4 -4
- package/dist/modules/picking/picking-uniforms.d.ts +1 -1
- package/dist/modules/picking/picking-uniforms.d.ts.map +1 -1
- package/dist/modules/picking/picking-uniforms.js +1 -1
- package/dist/modules/picking/picking.d.ts +2 -2
- package/dist/passes/get-fragment-shader.js +4 -4
- package/dist/shader-inputs.d.ts.map +1 -1
- package/dist/shader-inputs.js +20 -23
- package/dist/shader-inputs.js.map +1 -1
- package/package.json +2 -2
- package/src/animation-loop/make-animation-loop.ts +1 -0
- package/src/compute/computation.ts +2 -2
- package/src/debug/debug-framebuffer.ts +139 -61
- package/src/dynamic-texture/dynamic-texture.ts +3 -5
- package/src/dynamic-texture/texture-data.ts +2 -2
- package/src/dynamic-texture/texture-data.ts.disabled +1 -1
- package/src/geometries/cube-geometry.ts +7 -7
- package/src/geometries/ico-sphere-geometry.ts +3 -1
- package/src/geometry/gpu-geometry.ts +3 -0
- package/src/material/material.ts +2 -2
- package/src/model/model.ts +48 -36
- package/src/models/billboard-texture-model.ts +4 -4
- package/src/models/billboard-texture-module.ts +1 -1
- package/src/models/light-model-utils.ts +2 -2
- package/src/modules/picking/picking-uniforms.ts +1 -1
- package/src/passes/get-fragment-shader.ts +4 -4
- package/src/shader-inputs.ts +32 -41
package/dist/dist.min.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
else if (typeof define === 'function' && define.amd) define([], factory);
|
|
5
5
|
else if (typeof exports === 'object') exports['luma'] = factory();
|
|
6
6
|
else root['luma'] = factory();})(globalThis, function () {
|
|
7
|
-
"use strict";var __exports__=(()=>{var Hn=Object.create;var Ct=Object.defineProperty;var Wn=Object.getOwnPropertyDescriptor;var Yn=Object.getOwnPropertyNames;var Kn=Object.getPrototypeOf,Zn=Object.prototype.hasOwnProperty;var Qn=(i,t,e)=>t in i?Ct(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var pi=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),Jn=(i,t)=>{for(var e in t)Ct(i,e,{get:t[e],enumerable:!0})},Yt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Yn(t))!Zn.call(i,r)&&r!==e&&Ct(i,r,{get:()=>t[r],enumerable:!(n=Wn(t,r))||n.enumerable});return i},Kt=(i,t,e)=>(Yt(i,t,"default"),e&&Yt(e,t,"default")),R=(i,t,e)=>(e=i!=null?Hn(Kn(i)):{},Yt(t||!i||!i.__esModule?Ct(e,"default",{value:i,enumerable:!0}):e,i)),tr=i=>Yt(Ct({},"__esModule",{value:!0}),i);var K=(i,t,e)=>(Qn(i,typeof t!="symbol"?t+"":t,e),e);var U=pi((Ks,gi)=>{gi.exports=globalThis.luma});var rt=pi((xo,Mi)=>{Mi.exports=globalThis.luma});var Vt={};Jn(Vt,{AnimationLoop:()=>lt,AnimationLoopTemplate:()=>Jt,AsyncTexture:()=>Ws,BackgroundTextureModel:()=>_t,BufferTransform:()=>zt,ClipSpace:()=>st,Computation:()=>Gt,ConeGeometry:()=>ct,CubeGeometry:()=>be,CylinderGeometry:()=>Me,DirectionalLightModel:()=>xe,DynamicTexture:()=>z,GPUGeometry:()=>pt,Geometry:()=>V,GroupNode:()=>ft,IcoSphereGeometry:()=>_e,KeyFrames:()=>Qt,LegacyPickingManager:()=>Le,Material:()=>Mt,MaterialFactory:()=>bt,Model:()=>W,ModelNode:()=>ye,PickingManager:()=>Ut,PlaneGeometry:()=>Ie,PointLightModel:()=>pe,ScenegraphNode:()=>it,ShaderInputs:()=>$,ShaderPassRenderer:()=>we,SphereGeometry:()=>It,SpotLightModel:()=>ge,Swap:()=>Tt,SwapBuffers:()=>ve,SwapFramebuffers:()=>Pt,TextureTransform:()=>se,Timeline:()=>Zt,TruncatedConeGeometry:()=>at,cancelAnimationFramePolyfill:()=>ee,colorPicking:()=>$t,indexPicking:()=>Se,legacyColorPicking:()=>Un,loadImage:()=>On,loadImageBitmap:()=>En,makeAnimationLoop:()=>bi,makeRandomGenerator:()=>Ln,picking:()=>jn,requestAnimationFramePolyfill:()=>te,resolvePickingBackend:()=>zn,resolvePickingMode:()=>Pe,setPathPrefix:()=>Cn,supportsIndexPicking:()=>fi});Kt(Vt,R(U(),1));var er=1,ir=1,Zt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:n=Number.POSITIVE_INFINITY,rate:r=1,repeat:s=1}=t,o=er++,a={time:0,delay:e,duration:n,rate:r,repeat:s};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,n]of this.animations)n.channel===t&&this.detachAnimation(e)}isFinished(t){let e=this.channels.get(t);return e===void 0?!1:this.time>=e.delay+e.duration*e.repeat}getTime(t){if(t===void 0)return this.time;let e=this.channels.get(t);return e===void 0?-1:e.time}setTime(t){this.time=Math.max(0,t);let e=this.channels.values();for(let r of e)this._setChannelTime(r,this.time);let n=this.animations.values();for(let r of n){let{animation:s,channel:o}=r;s.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let n=ir++;return this.animations.set(n,{animation:t,channel:e}),t.setTime(this.getTime(e)),n}detachAnimation(t){this.animations.delete(t)}update(t){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=t),this.setTime(this.time+(t-this.lastEngineTime)),this.lastEngineTime=t)}_setChannelTime(t,e){let n=e-t.delay,r=t.duration*t.repeat;n>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,n)%t.duration,t.time*=t.rate)}};var Qt=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(t){this.setKeyFrames(t),this.setTime(0)}setKeyFrames(t){let e=t.length;this.times.length=e,this.values.length=e;for(let n=0;n<e;++n)this.times[n]=t[n][0],this.values[n]=t[n][1];this._calculateKeys(this._lastTime)}setTime(t){t=Math.max(0,t),t!==this._lastTime&&(this._calculateKeys(t),this._lastTime=t)}getStartTime(){return this.times[this.startIndex]}getEndTime(){return this.times[this.endIndex]}getStartData(){return this.values[this.startIndex]}getEndData(){return this.values[this.endIndex]}_calculateKeys(t){let e=0,n=this.times.length;for(e=0;e<n-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],s=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(s-r)),1)}};var Jt=class{constructor(t){}async onInitialize(t){return null}};var xi=R(U(),1);function te(i){let t=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return t?t.call(window,i):setTimeout(()=>i(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function ee(i){let t=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(t){t.call(window,i);return}clearTimeout(i)}function Et(){let i;if(typeof window<"u"&&window.performance)i=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();i=t[0]*1e3+t[1]/1e6}else i=Date.now();return i}var ht=class{constructor(t,e){this.sampleSize=1,this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this.name=t,this.type=e,this.reset()}reset(){return this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this}setSampleSize(t){return this.sampleSize=t,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(t){return this._count+=t,this._samples++,this._checkSampling(),this}subtractCount(t){return this._count-=t,this._samples++,this._checkSampling(),this}addTime(t){return this._time+=t,this.lastTiming=t,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Et(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Et()-this._startTime),this._timerPending=!1,this._checkSampling(),this):this}getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0}getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0}getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1e3):0}getAverageCount(){return this.samples>0?this.count/this.samples:0}getAverageTime(){return this.samples>0?this.time/this.samples:0}getHz(){return this.time>0?this.samples/(this.time/1e3):0}_checkSampling(){this._samples===this.sampleSize&&(this.lastSampleTime=this._time,this.lastSampleCount=this._count,this.count+=this._count,this.time+=this._time,this.samples+=this._samples,this._time=0,this._count=0,this._samples=0)}};var mt=class{constructor(t){this.stats={},this.id=t.id,this.stats={},this._initializeStats(t.stats),Object.seal(this)}get(t,e="count"){return this._getOrCreate({name:t,type:e})}get size(){return Object.keys(this.stats).length}reset(){for(let t of Object.values(this.stats))t.reset();return this}forEach(t){for(let e of Object.values(this.stats))t(e)}getTable(){let t={};return this.forEach(e=>{t[e.name]={time:e.time||0,count:e.count||0,average:e.getAverageTime()||0,hz:e.getHz()||0}}),t}_initializeStats(t=[]){t.forEach(e=>this._getOrCreate(e))}_getOrCreate(t){let{name:e,type:n}=t,r=this.stats[e];return r||(t instanceof ht?r=t:r=new ht(e,n),this.stats[e]=r),r}};var nr=0,rr="Animation Loop",Ce=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(t){if(this.props={...Ce.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new mt({id:`animation-loop-${nr++}`}),this.sharedStats=xi.luma.stats.get(rr),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:t.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this._needsRedraw=this._needsRedraw||t,this}needsRedraw(){let t=this._needsRedraw;return this._needsRedraw=!1,t}setProps(t){return"autoResizeViewport"in t&&(this.props.autoResizeViewport=t.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let t;if(!this._initialized){if(this._initialized=!0,await this._initDevice(),this._initialize(),!this._running)return null;await this.props.onInitialize(this._getAnimationProps())}return this._running?(t!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(t){let e=t instanceof Error?t:new Error("Unknown error");throw this.props.onError(e),e}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(t){return this.device?.isLost||this._error?this:(this._beginFrameTimers(t),this._setupFrame(),this._updateAnimationProps(),this._renderFrame(this._getAnimationProps()),this._clearNeedsRedraw(),this._resolveNextFrame&&(this._resolveNextFrame(this),this._nextFramePromise=null,this._resolveNextFrame=null),this._endFrameTimers(),this)}attachTimeline(t){return this.timeline=t,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(t=>{this._resolveNextFrame=t})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=te(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(ee(this._animationFrameId),this._animationFrameId=null)}_animationFrame(t){this._running&&(this.redraw(t),this._requestAnimationFrame())}_renderFrame(t){if(this.display){this.display._renderFrame(t);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let t=this.device?.getDefaultCanvasContext();if(!this.device||!t)throw new Error("loop");let e=t?.canvas,n=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:n,timeline:this.timeline,needsRedraw:!1,width:1,height:1,aspect:1,time:0,startTime:Date.now(),engineTime:0,tick:0,tock:0,_mousePosition:null}}_getAnimationProps(){if(!this.animationProps)throw new Error("animationProps");return this.animationProps}_updateAnimationProps(){if(!this.animationProps)return;let{width:t,height:e,aspect:n}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),n!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=n,this.animationProps.needsRedraw=this._needsRedraw,this.animationProps.engineTime=Date.now()-this.animationProps.startTime,this.timeline&&this.timeline.update(this.animationProps.engineTime),this.animationProps.tick=Math.floor(this.animationProps.time/1e3*60),this.animationProps.tock++,this.animationProps.time=this.timeline?this.timeline.getTime():this.animationProps.engineTime}async _initDevice(){if(this.device=await this.props.device,!this.device)throw new Error("No device provided");this.canvas=this.device.getDefaultCanvasContext().canvas||null}_createInfoDiv(){if(this.canvas&&this.props.onAddHTML){let t=document.createElement("div");document.body.appendChild(t),t.style.position="relative";let e=document.createElement("div");e.style.position="absolute",e.style.left="10px",e.style.bottom="10px",e.style.width="300px",e.style.background="white",this.canvas instanceof HTMLCanvasElement&&t.appendChild(this.canvas),t.appendChild(e);let n=this.props.onAddHTML(e);n&&(e.innerHTML=n)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),n=t>0&&e>0?t/e:1;return{width:t,height:e,aspect:n}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(t){let e=t??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let n=e-this._lastFrameTime;n>0&&this.frameRate.addTime(n)}this._lastFrameTime=e,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let t=this.device.commandEncoder._gpuTimeMs;t!==void 0&&(this.gpuTime.addTime(t),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let t of Object.keys(this.sharedStats.stats))this.stats.stats[t]||delete this.sharedStats.stats[t];this.stats.forEach(t=>{let e=this.sharedStats.get(t.name,t.type);e.sampleSize=t.sampleSize,e.time=t.time,e.count=t.count,e.samples=t.samples,e.lastTiming=t.lastTiming,e.lastSampleTime=t.lastSampleTime,e.lastSampleCount=t.lastSampleCount,e._count=t._count,e._time=t._time,e._samples=t._samples,e._startTime=t._startTime,e._timerPending=t._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(t){t instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[t.offsetX,t.offsetY])}_onMouseleave(t){this._getAnimationProps()._mousePosition=null}},lt=Ce;K(lt,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:void 0,autoResizeViewport:!1});var yi=R(U(),1);function bi(i,t){let e=null,n=t?.device||yi.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new lt({...t,device:n,async onInitialize(s){or(s.animationLoop.device);try{return e=new i(s),await e?.onInitialize(s)}catch(o){return sr(s.animationLoop.device,o),null}},onRender:s=>e?.onRender(s),onFinalize:s=>e?.onFinalize(s)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function sr(i,t){if(!i)return;let e=i.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let n=document.getElementById("animation-loop-error");n?.remove(),n=document.createElement("h1"),n.id="animation-loop-error",n.innerHTML=t.message,n.style.position="absolute",n.style.top="10px",n.style.left="10px",n.style.color="black",n.style.backgroundColor="red",e.parentElement?.appendChild(n)}}function or(i){if(!i)return;let t=document.getElementById("animation-loop-error");t&&t.remove()}var w=R(U(),1),Di=R(rt(),1);var Ot=R(U(),1);var Ee={};function S(i="id"){Ee[i]=Ee[i]||1;let t=Ee[i]++;return`${i}-${t}`}var pt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||S("geometry"),this.topology=t.topology,this.indices=t.indices||null,this.attributes=t.attributes,this.vertexCount=t.vertexCount,this.bufferLayout=t.bufferLayout||[],this.indices&&!(this.indices.usage&Ot.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let t of Object.values(this.attributes))t.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(t){return t.byteLength/12}};function _i(i,t){if(t instanceof pt)return t;let e=ar(i,t),{attributes:n,bufferLayout:r}=cr(i,t);return new pt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:n})}function ar(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Ot.Buffer.INDEX,data:e})}function cr(i,t){let e=[],n={};for(let[s,o]of Object.entries(t.attributes)){let a=s;switch(s){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"COLOR_0":a="colors";break}if(o){n[a]=i.createBuffer({data:o.value,id:`${s}-buffer`});let{value:c,size:h,normalized:l}=o;if(h===void 0)throw new Error(`Attribute ${s} is missing a size`);e.push({name:a,format:Ot.vertexFormatDecoder.getVertexFormatFromAttribute(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:n,bufferLayout:e,vertexCount:r}}function Ii(i,t){let e={},n="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[n]:"N/A"}};for(let r of i.attributes)if(r){let s=`${r.location} ${r.name}: ${r.type}`;e[`in ${s}`]={[n]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let s=`${r.location} ${r.name}`;e[`out ${s}`]={[n]:JSON.stringify(r)}}return e}var F=null,Oe=null;function vi(i,{id:t,minimap:e,opaque:n,top:r="0",left:s="0",rgbaScale:o=1}){F||(F=document.createElement("canvas"),F.id=t,F.title=t,F.style.zIndex="100",F.style.position="absolute",F.style.top=r,F.style.left=s,F.style.border="blue 5px solid",F.style.transform="scaleY(-1)",document.body.appendChild(F),Oe=F.getContext("2d")),(F.width!==i.width||F.height!==i.height)&&(F.width=i.width/2,F.height=i.height/2,F.style.width="400px",F.style.height="400px");let a=i.device.readPixelsToArrayWebGL(i),c=Oe?.createImageData(i.width,i.height);if(c){for(let l=0;l<a.length;l+=4)c.data[0+l+0]=a[l+0]*o,c.data[0+l+1]=a[l+1]*o,c.data[0+l+2]=a[l+2]*o,c.data[0+l+3]=n?255:a[l+3]*o;Oe?.putImageData(c,0,0)}}function ie(i,t,e){if(i===t)return!0;if(!e||!i||!t)return!1;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return!1;for(let n=0;n<i.length;n++)if(!ie(i[n],t[n],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let n=Object.keys(i),r=Object.keys(t);if(n.length!==r.length)return!1;for(let s of n)if(!t.hasOwnProperty(s)||!ie(i[s],t[s],e-1))return!1;return!0}return!1}var wi=R(U(),1),gt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let n=[...t];for(let r of e){let s=n.findIndex(o=>o.name===r.name);s<0?n.push(r):n[s]=r}return n}getBufferIndex(t){let e=this.bufferLayouts.findIndex(n=>n.name===t);return e===-1&&wi.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ai(i,t){let e=1/0;for(let n of i){let r=t[n];r!==void 0&&(e=Math.min(e,r))}return e}function Ti(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),n=t.slice();return n.sort((r,s)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=s.attributes?s.attributes.map(l=>l.attribute):[s.name],c=Ai(o,e),h=Ai(a,e);return c-h}),n}function xt(i,t){if(!i||!t.some(n=>n.bindingLayout?.length))return i;let e={...i,bindings:i.bindings.map(n=>({...n}))};"attributes"in(i||{})&&(e.attributes=i?.attributes||[]);for(let n of t)for(let r of n.bindingLayout||[])for(let s of hr(r.name)){let o=e.bindings.find(a=>a.name===s);o?.group===0&&(o.group=r.group)}return e}function yt(i){return Boolean(i.uniformTypes&&!lr(i.uniformTypes))}function hr(i){let t=new Set([i,`${i}Uniforms`]);return i.endsWith("Uniforms")||t.add(`${i}Sampler`),[...t]}function lr(i){for(let t in i)return!1;return!0}var ne=R(U(),1),Ei=R(rt(),1);function Pi(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Si(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function kt(i){return Pi(i)||Si(i)}function dr(i){return kt(i)||typeof i=="number"||typeof i=="boolean"}function Li(i,t={}){let e={bindings:{},uniforms:{}};return Object.keys(i).forEach(n=>{let r=i[n];Object.prototype.hasOwnProperty.call(t,n)||dr(r)?e.uniforms[n]=r:e.bindings[n]=r}),e}var $=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let n=(0,Ei.getShaderModuleDependencies)(Object.values(t).filter(ur));for(let r of n)t[r.name]=r;ne.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,s]of Object.entries(t))s&&(this._addModule(s),s.name&&r!==s.name&&!this.options.disableWarnings&&ne.log.warn(`Module name: ${r} vs ${s.name}`)())}destroy(){}setProps(t){for(let e of Object.keys(t)){let n=e,r=t[n]||{},s=this.modules[n];if(!s){this.options.disableWarnings||ne.log.warn(`Module ${e} not found`)();continue}let o=this.moduleUniforms[n],a=this.moduleBindings[n],c=s.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Li(c,s.uniformTypes);this.moduleUniforms[n]=Ci(o,h,s.uniformTypes),this.moduleBindings[n]={...a,...l}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let t={};for(let e of Object.values(this.moduleBindings))Object.assign(t,e);return t}getDebugTable(){let t={};for(let[e,n]of Object.entries(this.moduleUniforms))for(let[r,s]of Object.entries(n))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(s)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=Ci({},t.defaultUniforms||{},t.uniformTypes),this.moduleBindings[e]={}}};function Ci(i={},t={},e={}){let n={...i};for(let[r,s]of Object.entries(t))s!==void 0&&(n[r]=ke(i[r],s,e[r]));return n}function ke(i,t,e){if(!e||typeof e=="string")return Rt(t);if(Array.isArray(e)){if(Re(t)||!Array.isArray(t))return Rt(t);let o=Array.isArray(i)&&!Re(i)?[...i]:[],a=o.slice();for(let c=0;c<t.length;c++){let h=t[c];h!==void 0&&(a[c]=ke(o[c],h,e[0]))}return a}if(!Ne(t))return Rt(t);let n=e,r=Ne(i)?i:{},s={...r};for(let[o,a]of Object.entries(t))a!==void 0&&(s[o]=ke(r[o],a,n[o]));return s}function Rt(i){return ArrayBuffer.isView(i)?Array.prototype.slice.call(i):Array.isArray(i)?Re(i)?i.slice():i.map(e=>e===void 0?void 0:Rt(e)):Ne(i)?Object.fromEntries(Object.entries(i).map(([t,e])=>[t,e===void 0?void 0:Rt(e)])):i}function Re(i){return ArrayBuffer.isView(i)||Array.isArray(i)&&(i.length===0||typeof i[0]=="number")}function Ne(i){return Boolean(i)&&typeof i=="object"&&!Array.isArray(i)&&!ArrayBuffer.isView(i)}function ur(i){return Boolean(i?.dependencies)}var k=R(U(),1);var Ft=R(U(),1);var De={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function Nt(i){return i?Array.isArray(i)?i[0]??null:i:null}function Oi(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let n=Nt(e);if(!n)return null;let{width:r}=Dt(n);return{width:r,height:1}}case"2d":{let n=Nt(e);return n?Dt(n):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let n=Nt(e[0]);return n?Dt(n):null}case"cube":{let n=Object.keys(e)[0]??null;if(!n)return null;let r=e[n],s=Nt(r);return s?Dt(s):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let n=e[0],r=Object.keys(n)[0]??null;if(!r)return null;let s=Nt(n[r]);return s?Dt(s):null}default:return null}}function Dt(i){if((0,Ft.isExternalImage)(i))return(0,Ft.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function fr(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function mr(i){return ArrayBuffer.isView(i)}function Fe(i){let{textureFormat:t,format:e}=i;if(t&&e&&t!==e)throw new Error(`Conflicting texture formats "${t}" and "${e}" provided for the same mip level`);return t??e}function ki(i){let t=De[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function pr(i,t){return 6*i+ki(t)}function Be(i){throw new Error("setTexture1DData not supported in WebGL.")}function gr(i){return Array.isArray(i)?i:[i]}function dt(i,t,e,n){let r=gr(t),s=i,o=[];for(let a=0;a<r.length;a++){let c=r[a];if((0,Ft.isExternalImage)(c))o.push({type:"external-image",image:c,z:s,mipLevel:a});else if(fr(c))o.push({type:"texture-data",data:c,textureFormat:Fe(c),z:s,mipLevel:a});else if(mr(c)&&e)o.push({type:"texture-data",data:{data:c,width:Math.max(1,e.width>>a),height:Math.max(1,e.height>>a),...n?{format:n}:{}},textureFormat:n,z:s,mipLevel:a});else throw new Error("Unsupported 2D mip-level payload")}return o}function ze(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function je(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function Ge(i){let t=[];for(let[e,n]of Object.entries(i)){let r=ki(e);t.push(...dt(r,n))}return t}function Ue(i){let t=[];return i.forEach((e,n)=>{for(let[r,s]of Object.entries(e)){let o=pr(n,r);t.push(...dt(o,s))}}),t}var Ve=class{device;id;props;_texture=null;_sampler=null;_view=null;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get texture(){if(!this._texture)throw new Error("Texture not initialized yet");return this._texture}get sampler(){if(!this._sampler)throw new Error("Sampler not initialized yet");return this._sampler}get view(){if(!this._view)throw new Error("View not initialized yet");return this._view}get[Symbol.toStringTag](){return"DynamicTexture"}toString(){return`DynamicTexture:"${this.id}":${this.texture.width}x${this.texture.height}px:(${this.isReady?"ready":"loading..."})`}constructor(t,e){this.device=t;let n=S("dynamic-texture"),r=e;this.props={...Ve.defaultProps,id:n,...e,data:null},this.id=this.props.id,this.ready=new Promise((s,o)=>{this.resolveReady=s,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let n=e.data?xr({...e,width:t.width,height:t.height,format:t.format}):[],r="format"in t&&t.format!==void 0,s="usage"in t&&t.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let f=Oi(e);return f||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=yr(this.device,n,a,{format:r?t.format:void 0}),h=c.format??this.props.format,l={...this.props,...a,format:h,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(h)&&!s&&(l.usage=k.Texture.SAMPLE|k.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(h);if(this.device.type==="webgpu"&&d){let f=this.props.dimension==="3d"?k.Texture.SAMPLE|k.Texture.STORAGE|k.Texture.COPY_DST|k.Texture.COPY_SRC:k.Texture.SAMPLE|k.Texture.RENDER|k.Texture.COPY_DST|k.Texture.COPY_SRC;l.usage|=f}let u=this.device.getMipLevelCount(l.width,l.height),g=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?u:Math.max(1,Math.min(u,this.props.mipLevels??1)),p={...l,mipLevels:g};this._texture=this.device.createTexture(p),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&k.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),k.log.info(0,`${this} created`)()}catch(e){let n=e instanceof Error?e:new Error(String(e));this.rejectReady(n)}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):k.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof k.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}async readBuffer(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=this.device.createBuffer({byteLength:s.byteLength,usage:k.Buffer.COPY_DST|k.Buffer.MAP_READ});this.texture.readBuffer({...t,width:e,height:n,depthOrArrayLayers:r},o);let a=this.device.createFence();return await a.signaled,a.destroy(),o}async readAsync(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=await this.readBuffer(t),a=await o.readAsync(0,s.byteLength);return o.destroy(),a.buffer}resize(t){if(this._checkReady(),t.width===this.texture.width&&t.height===this.texture.height)return!1;let e=this.texture;return this._texture=e.clone(t),this._sampler=this.texture.sampler,this._view=this.texture.view,e.destroy(),k.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=De[t];if(e===void 0)throw new Error(`Invalid cube face: ${t}`);return e}getCubeArrayFaceIndex(t,e){return 6*t+this.getCubeFaceIndex(e)}setTexture1DData(t){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let e=Be(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let n=dt(e,t);this._setTextureSubresources(n)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=ze(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=je(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=Ge(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=Ue(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:n,mipLevel:r}=e;switch(e.type){case"external-image":let{image:s,flipY:o}=e;this.texture.copyExternalImage({image:s,z:n,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=e;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:n,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await $e(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&k.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||k.log.warn(`${this} Cannot perform this operation before ready`)}},z=Ve;K(z,"defaultProps",{...k.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function xr(i){if(!i.data)return[];let t=i.width&&i.height?{width:i.width,height:i.height}:void 0,e="format"in i?i.format:void 0;switch(i.dimension){case"1d":return Be(i.data);case"2d":return dt(0,i.data,t,e);case"3d":return ze(i.data);case"2d-array":return je(i.data);case"cube":return Ge(i.data);case"cube-array":return Ue(i.data);default:throw new Error(`Unhandled dimension ${i.dimension}`)}}function yr(i,t,e,n){if(t.length===0)return{subresources:t,mipLevels:1,format:n.format,hasExplicitMipChain:!1};let r=new Map;for(let l of t){let d=r.get(l.z)??[];d.push(l),r.set(l.z,d)}let s=t.some(l=>l.mipLevel>0),o=n.format,a=Number.POSITIVE_INFINITY,c=[];for(let[l,d]of r){let u=[...d].sort((I,m)=>I.mipLevel-m.mipLevel),g=u[0];if(!g||g.mipLevel!==0)throw new Error(`DynamicTexture: slice ${l} is missing mip level 0`);let p=Ni(i,g);if(p.width!==e.width||p.height!==e.height)throw new Error(`DynamicTexture: slice ${l} base level dimensions ${p.width}x${p.height} do not match expected ${e.width}x${e.height}`);let f=Ri(g);if(f){if(o&&o!==f)throw new Error(`DynamicTexture: slice ${l} base level format "${f}" does not match texture format "${o}"`);o=f}let y=o&&i.isTextureFormatCompressed(o)?br(i,p.width,p.height,o):i.getMipLevelCount(p.width,p.height),M=0;for(let I=0;I<u.length;I++){let m=u[I];if(!m||m.mipLevel!==I||I>=y)break;let x=Ni(i,m),b=Math.max(1,p.width>>I),_=Math.max(1,p.height>>I);if(x.width!==b||x.height!==_)break;let T=Ri(m);if(T&&(o||(o=T),T!==o))break;M++,c.push(m)}a=Math.min(a,M)}let h=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(l=>l.mipLevel<h),mipLevels:h,format:o,hasExplicitMipChain:s}}function Ri(i){if(i.type==="texture-data")return i.textureFormat??Fe(i.data)}function Ni(i,t){switch(t.type){case"external-image":return i.getExternalImageSize(t.image);case"texture-data":return{width:t.data.width,height:t.data.height};default:throw new Error("Unsupported texture subresource")}}function br(i,t,e,n){let{blockWidth:r=1,blockHeight:s=1}=i.getTextureFormatInfo(n),o=1;for(let a=1;;a++){let c=Math.max(1,t>>a),h=Math.max(1,e>>a);if(c<r||h<s)break;o++}return o}async function $e(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map($e));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t).map($e)),n=Object.keys(t),r={};for(let s=0;s<n.length;s++)r[n[s]]=e[s];return r}return i}var ut=2,Mr=1e4,Xe=class{device;id;source;vs;fs;pipelineFactory;shaderFactory;userData={};parameters;topology;bufferLayout;isInstanced=void 0;instanceCount=0;vertexCount;indexBuffer=null;bufferAttributes={};constantAttributes={};bindings={};vertexArray;transformFeedback=null;pipeline;shaderInputs;material=null;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;_bindingTable=[];get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...Xe.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData),this.material=e.material||null;let n=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new $(n,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let s=_r(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.props.shaderLayout=xt(this.props.shaderLayout,o)||null,this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h,bindingTable:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:s,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this._bindingTable=l;let d=t.getShaderLayout?.(this.source);this.props.shaderLayout=xt(this.props.shaderLayout||d||null,o)||null}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:s,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l,this._bindingTable=[]}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,e.geometry&&this.setGeometry(e.geometry),this.pipelineFactory=e.pipelineFactory||w.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||w.ShaderFactory.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=t.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in e&&(this.isInstanced=e.isInstanced),e.instanceCount&&this.setInstanceCount(e.instanceCount),e.vertexCount&&this.setVertexCount(e.vertexCount),e.indexBuffer&&this.setIndexBuffer(e.indexBuffer),e.attributes&&this.setAttributes(e.attributes),e.constantAttributes&&this.setConstantAttributes(e.constantAttributes),e.bindings&&this.setBindings(e.bindings),e.transformFeedback&&(this.transformFeedback=e.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let t=this._needsRedraw;return this._needsRedraw=!1,t}setNeedsRedraw(t){this._needsRedraw||=t}getBindingDebugTable(){return this._bindingTable}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return w.log.info(ut,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let n;try{t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline();let r=this._getBindings(),s=this._getBindGroups(),{indexBuffer:o}=this.vertexArray,a=o?o.byteLength/(o.indexType==="uint32"?4:2):void 0;n=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:a,transformFeedback:this.transformFeedback||void 0,bindings:r,bindGroups:s,_bindGroupCacheKeys:this._getBindGroupCacheKeys(),uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),n?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):this._needsRedraw="waiting for resource initialization",n}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&_i(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let n=new gt(this.bufferLayout);this.bufferLayout=n.mergeBufferLayouts(e.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(e)}this._gpuGeometry=e}setTopology(t){t!==this.topology&&(this.topology=t,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(t){let e=new gt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){ie(t,this.parameters,2)||(this.parameters=t,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(t){this.instanceCount=t,this.isInstanced===void 0&&t>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(t){this.vertexCount=t,this.setNeedsRedraw("vertexCount")}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new w.UniformStore(this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(yt(n)&&!this.material?.ownsModule(e)){let r=this._uniformStore.getManagedUniformBuffer(this.device,e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}setMaterial(t){this.material=t,this.setNeedsRedraw("material")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this._getNonMaterialBindings(this.shaderInputs.getBindingValues())),this.setNeedsRedraw("shaderInputs")}setBindings(t){Object.assign(this.bindings,t),this.setNeedsRedraw("bindings")}setTransformFeedback(t){this.transformFeedback=t,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(t){this.vertexArray.setIndexBuffer(t),this.setNeedsRedraw("indexBuffer")}setAttributes(t,e){let n=e?.disableWarnings??this.props.disableWarnings;t.indices&&w.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ti(this.pipeline.shaderLayout,this.bufferLayout);let r=new gt(this.bufferLayout);for(let[s,o]of Object.entries(t)){let a=r.getBufferLayout(s);if(!a){n||w.log.warn(`Model(${this.id}): Missing layout for buffer "${s}".`)();continue}let c=r.getAttributeNamesForBuffer(a),h=!1;for(let l of c){let d=this._attributeInfos[l];if(d){let u=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(u,o),h=!0}}!h&&!n&&w.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${s}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[n,r]of Object.entries(t)){let s=this._attributeInfos[n];s?this.vertexArray.setConstantWebGL(s.location,r):(e?.disableWarnings??this.props.disableWarnings)||w.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${n}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof z&&!t.isReady)return t.id;for(let t of Object.values(this.material?.bindings||{}))if(t instanceof z&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))n instanceof z?n.isReady&&(t[e]=n.texture):t[e]=n;return t}_getBindGroups(){let t=this.pipeline?.shaderLayout||this.props.shaderLayout||{bindings:[]},e=t.bindings.length?(0,w.normalizeBindingsByGroup)(t,this._getBindings()):{0:this._getBindings()};if(!this.material)return e;for(let[n,r]of Object.entries(this.material.getBindingsByGroup())){let s=Number(n);e[s]={...e[s]||{},...r}}return e}_getBindGroupCacheKeys(){let t=this.material?.getBindGroupCacheKey(3);return t?{3:t}:{}}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof w.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof w.Buffer||e instanceof w.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof w.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return Math.max(t,this.material?.getBindingsUpdateTimestamp()||0)}_setGeometryAttributes(t){let e={...t.attributes};for(let[n]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===n)&&n!=="positions"&&delete e[n];this.vertexCount=t.vertexCount,this.setIndexBuffer(t.indices||null),this.setAttributes(t.attributes,{disableWarnings:!0}),this.setAttributes(e,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate||=t,this.setNeedsRedraw(t)}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null,e=null;this.pipeline&&(w.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let n=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=n:this.fs&&(r=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"fragment",source:this.source||this.fs,debugShaders:this.props.debugShaders})),this.pipeline=this.pipelineFactory.createRenderPipeline({...this.props,bindings:void 0,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindGroups:this._getBindGroups(),vs:n,fs:r}),this._attributeInfos=(0,w.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&e!==t&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=w.log.level>3?0:Mr;w.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,w.log.group(ut,`>>> DRAWING MODEL ${this.id}`,{collapsed:w.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Ii(this.pipeline.shaderLayout,this.id);w.log.table(ut,t)();let e=this.shaderInputs.getDebugTable();w.log.table(ut,e)();let n=this._getAttributeDebugTable();w.log.table(ut,this._attributeInfos)(),w.log.table(ut,n)(),w.log.groupEnd(ut)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let n=t.props.framebuffer;n&&vi(n,{id:n.id,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,n]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[n.location];t[n.location]={name:e,type:n.shaderType,values:r?this._getBufferOrConstantValues(r,n.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,n=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:n.toString()}}return t}_getBufferOrConstantValues(t,e){let n=w.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof w.Buffer?new n(t.debugData):t).toString()}_getNonMaterialBindings(t){if(!this.material)return t;let e={};for(let[n,r]of Object.entries(t))this.material.ownsBinding(n)||(e[n]=r);return e}},W=Xe;K(W,"defaultProps",{...w.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,material:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:Di.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function _r(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var J=R(U(),1);var Bt=3,bt=class{device;modules;_materialBindingNames;_materialModuleNames;constructor(t,e={}){this.device=t,this.modules=e.modules||[];let n=new $(Object.fromEntries(this.modules.map(r=>[r.name,r])));this._materialBindingNames=Ir(n),this._materialModuleNames=vr(n)}createMaterial(t={}){return new Mt(this.device,{...t,factory:this})}getBindingNames(){return Array.from(this._materialBindingNames)}ownsBinding(t){if(this._materialBindingNames.has(t))return!0;let e=qe(t);return e?this._materialModuleNames.has(e):!1}ownsModule(t){return this._materialModuleNames.has(t)}getBindingsByGroup(t){return Object.keys(t).length>0?{[Bt]:t}:{}}};function qe(i){return i.endsWith("Uniforms")?i.slice(0,-8):null}function Ir(i){let t=new Set;for(let e of Object.values(i.modules))for(let n of e.bindingLayout||[])n.group===Bt&&t.add(n.name);return t}function vr(i){let t=new Set;for(let e of Object.values(i.modules))e.name&&e.bindingLayout?.some(n=>n.group===Bt&&n.name===e.name)&&t.add(e.name);return t}var Mt=class{id;device;factory;shaderInputs;bindings={};_uniformStore;_bindGroupCacheToken={};constructor(t,e={}){this.id=e.id||S("material"),this.device=t,this.factory=e.factory||new bt(t,{modules:e.modules||e.shaderInputs?.getModules()||[]});let n=Object.fromEntries((e.shaderInputs?.getModules()||this.factory.modules).map(r=>[r.name,r]));this.shaderInputs=e.shaderInputs||new $(n),this._uniformStore=new J.UniformStore(this.shaderInputs.modules);for(let[r,s]of Object.entries(this.shaderInputs.modules))if(this.ownsModule(r)&&yt(s)){let o=this._uniformStore.getManagedUniformBuffer(this.device,r);this.bindings[`${r}Uniforms`]=o}this.updateShaderInputs(),e.bindings&&this._replaceOwnedBindings(e.bindings)}destroy(){this._uniformStore.destroy()}clone(t={}){let e=this.factory.createMaterial({id:t.id,shaderInputs:t.shaderInputs,bindings:{...this.getResourceBindings(),...t.bindings}});return t.shaderInputs||e.setProps(this.shaderInputs.getUniformValues()),t.moduleProps&&e.setProps(t.moduleProps),e}ownsBinding(t){return this.factory.ownsBinding(t)}ownsModule(t){return this.factory.ownsModule(t)}setProps(t){this.shaderInputs.setProps(t),this.updateShaderInputs()}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this._setOwnedBindings(this.shaderInputs.getBindingValues())&&(this._bindGroupCacheToken={})}getResourceBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))qe(e)||(t[e]=n);return t}getBindings(){let t={},e=t;for(let[n,r]of Object.entries(this.bindings))r instanceof z?r.isReady&&(e[n]=r.texture):e[n]=r;return t}getBindingsByGroup(){return this.factory.getBindingsByGroup(this.getBindings())}getBindGroupCacheKey(t){return t===Bt?this._bindGroupCacheToken:null}getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof J.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof J.Buffer||e instanceof J.Texture?t=Math.max(t,e.updateTimestamp):e instanceof z?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof J.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_replaceOwnedBindings(t){this._setOwnedBindings(t)&&(this._bindGroupCacheToken={})}_setOwnedBindings(t){let e=!1;for(let[n,r]of Object.entries(t))r!==void 0&&this.ownsBinding(n)&&this.bindings[n]!==r&&(this.bindings[n]=r,e=!0);return e}};var Fi=R(U(),1),Bi=R(rt(),1);var re=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=re.defaultProps){if(!re.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new W(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,Bi.getPassthroughFS)(),topology:e.topology||"point-list",varyings:e.outputs||e.varyings,...e}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:e.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(t){t?.inputBuffers&&this.model.setAttributes(t.inputBuffers),t?.outputBuffers&&this.transformFeedback.setBuffers(t.outputBuffers);let e=this.device.beginRenderPass(t);this.model.draw(e),e.end()}getBuffer(t){return this.transformFeedback.getBuffer(t)}readAsync(t){let e=this.getBuffer(t);if(!e)throw new Error("BufferTransform#getBuffer");if(e instanceof Fi.Buffer)return e.readAsync();let{buffer:n,byteOffset:r=0,byteLength:s=n.byteLength}=e;return n.readAsync(r,s)}},zt=re;K(zt,"defaultProps",{...W.defaultProps,outputs:void 0,feedbackBuffers:void 0});var zi=R(rt(),1);var wr="transform_output",se=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(t,e){this.device=t,this.sampler=t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new W(this.device,{id:e.id||S("texture-transform-model"),fs:e.fs||(0,zi.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:wr}),vertexCount:e.vertexCount,...e}),this._initialize(e),Object.seal(this)}destroy(){this.model.destroy();for(let t of this.bindings)t.framebuffer?.destroy()}delete(){this.destroy()}run(t){let{framebuffer:e}=this.bindings[this.currentIndex],n=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(n),n.end(),this.device.submit()}getTargetTexture(){let{targetTexture:t}=this.bindings[this.currentIndex];return t}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(t){this._updateBindings(t)}_updateBindings(t){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],t)}_updateBinding(t,{sourceBuffers:e,sourceTextures:n,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,n),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:s,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:s,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:s,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let n in e)e[n].sampler=this.sampler}};var V=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:n=null,vertexCount:r=null}=t;this.id=t.id||S("geometry"),this.topology=t.topology,n&&(this.indices=ArrayBuffer.isView(n)?{value:n,size:1}:n),this.attributes={};for(let[s,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(s)}: must be typed array or object with value as typed array`);if((s==="POSITION"||s==="positions")&&!a.size&&(a.size=3),s==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[s]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=r||this._calculateVertexCount(this.attributes,this.indices)}getVertexCount(){return this.vertexCount}getAttributes(){return this.indices?{indices:this.indices,...this.attributes}:this.attributes}_print(t){return`Geometry ${this.id} attribute ${t}`}_setAttributes(t,e){return this}_calculateVertexCount(t,e){if(e)return e.value.length;let n=1/0;for(let r of Object.values(t)){let{value:s,size:o,constant:a}=r;!a&&s&&o!==void 0&&o>=1&&(n=Math.min(n,s.length/o))}return n}};var Ar=`struct VertexInputs {
|
|
7
|
+
"use strict";var __exports__=(()=>{var Wn=Object.create;var Et=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var Kn=Object.getOwnPropertyNames;var Zn=Object.getPrototypeOf,Qn=Object.prototype.hasOwnProperty;var Jn=(i,t,e)=>t in i?Et(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var ui=(i,t)=>()=>(t||i((t={exports:{}}).exports,t),t.exports),tr=(i,t)=>{for(var e in t)Et(i,e,{get:t[e],enumerable:!0})},Wt=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Kn(t))!Qn.call(i,r)&&r!==e&&Et(i,r,{get:()=>t[r],enumerable:!(n=Yn(t,r))||n.enumerable});return i},Yt=(i,t,e)=>(Wt(i,t,"default"),e&&Wt(e,t,"default")),k=(i,t,e)=>(e=i!=null?Wn(Zn(i)):{},Wt(t||!i||!i.__esModule?Et(e,"default",{value:i,enumerable:!0}):e,i)),er=i=>Wt(Et({},"__esModule",{value:!0}),i);var Y=(i,t,e)=>(Jn(i,typeof t!="symbol"?t+"":t,e),e);var U=ui((io,mi)=>{mi.exports=globalThis.luma});var nt=ui((vo,bi)=>{bi.exports=globalThis.luma});var $t={};tr($t,{AnimationLoop:()=>lt,AnimationLoopTemplate:()=>Qt,AsyncTexture:()=>to,BackgroundTextureModel:()=>Mt,BufferTransform:()=>Bt,ClipSpace:()=>st,Computation:()=>jt,ConeGeometry:()=>ct,CubeGeometry:()=>be,CylinderGeometry:()=>ye,DirectionalLightModel:()=>ge,DynamicTexture:()=>B,GPUGeometry:()=>mt,Geometry:()=>$,GroupNode:()=>ft,IcoSphereGeometry:()=>Me,KeyFrames:()=>Zt,LegacyPickingManager:()=>Se,Material:()=>yt,MaterialFactory:()=>bt,Model:()=>H,ModelNode:()=>xe,PickingManager:()=>Ut,PlaneGeometry:()=>_e,PointLightModel:()=>me,ScenegraphNode:()=>et,ShaderInputs:()=>G,ShaderPassRenderer:()=>ve,SphereGeometry:()=>_t,SpotLightModel:()=>pe,Swap:()=>At,SwapBuffers:()=>Ie,SwapFramebuffers:()=>Tt,TextureTransform:()=>re,Timeline:()=>Kt,TruncatedConeGeometry:()=>at,cancelAnimationFramePolyfill:()=>te,colorPicking:()=>Gt,indexPicking:()=>Pe,legacyColorPicking:()=>$n,loadImage:()=>Rn,loadImageBitmap:()=>On,makeAnimationLoop:()=>xi,makeRandomGenerator:()=>Ln,picking:()=>Un,requestAnimationFramePolyfill:()=>Jt,resolvePickingBackend:()=>jn,resolvePickingMode:()=>Te,setPathPrefix:()=>Cn,supportsIndexPicking:()=>di});Yt($t,k(U(),1));var ir=1,nr=1,Kt=class{time=0;channels=new Map;animations=new Map;playing=!1;lastEngineTime=-1;constructor(){}addChannel(t){let{delay:e=0,duration:n=Number.POSITIVE_INFINITY,rate:r=1,repeat:s=1}=t,o=ir++,a={time:0,delay:e,duration:n,rate:r,repeat:s};return this._setChannelTime(a,this.time),this.channels.set(o,a),o}removeChannel(t){this.channels.delete(t);for(let[e,n]of this.animations)n.channel===t&&this.detachAnimation(e)}isFinished(t){let e=this.channels.get(t);return e===void 0?!1:this.time>=e.delay+e.duration*e.repeat}getTime(t){if(t===void 0)return this.time;let e=this.channels.get(t);return e===void 0?-1:e.time}setTime(t){this.time=Math.max(0,t);let e=this.channels.values();for(let r of e)this._setChannelTime(r,this.time);let n=this.animations.values();for(let r of n){let{animation:s,channel:o}=r;s.setTime(this.getTime(o))}}play(){this.playing=!0}pause(){this.playing=!1,this.lastEngineTime=-1}reset(){this.setTime(0)}attachAnimation(t,e){let n=nr++;return this.animations.set(n,{animation:t,channel:e}),t.setTime(this.getTime(e)),n}detachAnimation(t){this.animations.delete(t)}update(t){this.playing&&(this.lastEngineTime===-1&&(this.lastEngineTime=t),this.setTime(this.time+(t-this.lastEngineTime)),this.lastEngineTime=t)}_setChannelTime(t,e){let n=e-t.delay,r=t.duration*t.repeat;n>=r?t.time=t.duration*t.rate:(t.time=Math.max(0,n)%t.duration,t.time*=t.rate)}};var Zt=class{startIndex=-1;endIndex=-1;factor=0;times=[];values=[];_lastTime=-1;constructor(t){this.setKeyFrames(t),this.setTime(0)}setKeyFrames(t){let e=t.length;this.times.length=e,this.values.length=e;for(let n=0;n<e;++n)this.times[n]=t[n][0],this.values[n]=t[n][1];this._calculateKeys(this._lastTime)}setTime(t){t=Math.max(0,t),t!==this._lastTime&&(this._calculateKeys(t),this._lastTime=t)}getStartTime(){return this.times[this.startIndex]}getEndTime(){return this.times[this.endIndex]}getStartData(){return this.values[this.startIndex]}getEndData(){return this.values[this.endIndex]}_calculateKeys(t){let e=0,n=this.times.length;for(e=0;e<n-2&&!(this.times[e+1]>t);++e);this.startIndex=e,this.endIndex=e+1;let r=this.times[this.startIndex],s=this.times[this.endIndex];this.factor=Math.min(Math.max(0,(t-r)/(s-r)),1)}};var Qt=class{constructor(t){}async onInitialize(t){return null}};var pi=k(U(),1);function Jt(i){let t=typeof window<"u"?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame:null;return t?t.call(window,i):setTimeout(()=>i(typeof performance<"u"?performance.now():Date.now()),1e3/60)}function te(i){let t=typeof window<"u"?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame:null;if(t){t.call(window,i);return}clearTimeout(i)}function Lt(){let i;if(typeof window<"u"&&window.performance)i=window.performance.now();else if(typeof process<"u"&&process.hrtime){let t=process.hrtime();i=t[0]*1e3+t[1]/1e6}else i=Date.now();return i}var ht=class{constructor(t,e){this.sampleSize=1,this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this.name=t,this.type=e,this.reset()}reset(){return this.time=0,this.count=0,this.samples=0,this.lastTiming=0,this.lastSampleTime=0,this.lastSampleCount=0,this._count=0,this._time=0,this._samples=0,this._startTime=0,this._timerPending=!1,this}setSampleSize(t){return this.sampleSize=t,this}incrementCount(){return this.addCount(1),this}decrementCount(){return this.subtractCount(1),this}addCount(t){return this._count+=t,this._samples++,this._checkSampling(),this}subtractCount(t){return this._count-=t,this._samples++,this._checkSampling(),this}addTime(t){return this._time+=t,this.lastTiming=t,this._samples++,this._checkSampling(),this}timeStart(){return this._startTime=Lt(),this._timerPending=!0,this}timeEnd(){return this._timerPending?(this.addTime(Lt()-this._startTime),this._timerPending=!1,this._checkSampling(),this):this}getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0}getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0}getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1e3):0}getAverageCount(){return this.samples>0?this.count/this.samples:0}getAverageTime(){return this.samples>0?this.time/this.samples:0}getHz(){return this.time>0?this.samples/(this.time/1e3):0}_checkSampling(){this._samples===this.sampleSize&&(this.lastSampleTime=this._time,this.lastSampleCount=this._count,this.count+=this._count,this.time+=this._time,this.samples+=this._samples,this._time=0,this._count=0,this._samples=0)}};var ut=class{constructor(t){this.stats={},this.id=t.id,this.stats={},this._initializeStats(t.stats),Object.seal(this)}get(t,e="count"){return this._getOrCreate({name:t,type:e})}get size(){return Object.keys(this.stats).length}reset(){for(let t of Object.values(this.stats))t.reset();return this}forEach(t){for(let e of Object.values(this.stats))t(e)}getTable(){let t={};return this.forEach(e=>{t[e.name]={time:e.time||0,count:e.count||0,average:e.getAverageTime()||0,hz:e.getHz()||0}}),t}_initializeStats(t=[]){t.forEach(e=>this._getOrCreate(e))}_getOrCreate(t){let{name:e,type:n}=t,r=this.stats[e];return r||(t instanceof ht?r=t:r=new ht(e,n),this.stats[e]=r),r}};var rr=0,sr="Animation Loop",Ee=class{device=null;canvas=null;props;animationProps=null;timeline=null;stats;sharedStats;cpuTime;gpuTime;frameRate;display;_needsRedraw="initialized";_initialized=!1;_running=!1;_animationFrameId=null;_nextFramePromise=null;_resolveNextFrame=null;_cpuStartTime=0;_error=null;_lastFrameTime=0;constructor(t){if(this.props={...Ee.defaultAnimationLoopProps,...t},t=this.props,!t.device)throw new Error("No device provided");this.stats=t.stats||new ut({id:`animation-loop-${rr++}`}),this.sharedStats=pi.luma.stats.get(sr),this.frameRate=this.stats.get("Frame Rate"),this.frameRate.setSampleSize(1),this.cpuTime=this.stats.get("CPU Time"),this.gpuTime=this.stats.get("GPU Time"),this.setProps({autoResizeViewport:t.autoResizeViewport}),this.start=this.start.bind(this),this.stop=this.stop.bind(this),this._onMousemove=this._onMousemove.bind(this),this._onMouseleave=this._onMouseleave.bind(this)}destroy(){this.stop(),this._setDisplay(null),this.device?._disableDebugGPUTime()}delete(){this.destroy()}reportError(t){this.props.onError(t),this._error=t}setNeedsRedraw(t){return this._needsRedraw=this._needsRedraw||t,this}needsRedraw(){let t=this._needsRedraw;return this._needsRedraw=!1,t}setProps(t){return"autoResizeViewport"in t&&(this.props.autoResizeViewport=t.autoResizeViewport||!1),this}async start(){if(this._running)return this;this._running=!0;try{let t;if(!this._initialized){if(this._initialized=!0,await this._initDevice(),this._initialize(),!this._running)return null;await this.props.onInitialize(this._getAnimationProps())}return this._running?(t!==!1&&(this._cancelAnimationFrame(),this._requestAnimationFrame()),this):null}catch(t){let e=t instanceof Error?t:new Error("Unknown error");throw this.props.onError(e),e}}stop(){return this._running&&(this.animationProps&&!this._error&&this.props.onFinalize(this.animationProps),this._cancelAnimationFrame(),this._nextFramePromise=null,this._resolveNextFrame=null,this._running=!1,this._lastFrameTime=0),this}redraw(t){return this.device?.isLost||this._error?this:(this._beginFrameTimers(t),this._setupFrame(),this._updateAnimationProps(),this._renderFrame(this._getAnimationProps()),this._clearNeedsRedraw(),this._resolveNextFrame&&(this._resolveNextFrame(this),this._nextFramePromise=null,this._resolveNextFrame=null),this._endFrameTimers(),this)}attachTimeline(t){return this.timeline=t,this.timeline}detachTimeline(){this.timeline=null}waitForRender(){return this.setNeedsRedraw("waitForRender"),this._nextFramePromise||(this._nextFramePromise=new Promise(t=>{this._resolveNextFrame=t})),this._nextFramePromise}async toDataURL(){if(this.setNeedsRedraw("toDataURL"),await this.waitForRender(),this.canvas instanceof HTMLCanvasElement)return this.canvas.toDataURL();throw new Error("OffscreenCanvas")}_initialize(){this._startEventHandling(),this._initializeAnimationProps(),this._updateAnimationProps(),this._resizeViewport(),this.device?._enableDebugGPUTime()}_setDisplay(t){this.display&&(this.display.destroy(),this.display.animationLoop=null),t&&(t.animationLoop=this),this.display=t}_requestAnimationFrame(){this._running&&(this._animationFrameId=Jt(this._animationFrame.bind(this)))}_cancelAnimationFrame(){this._animationFrameId!==null&&(te(this._animationFrameId),this._animationFrameId=null)}_animationFrame(t){this._running&&(this.redraw(t),this._requestAnimationFrame())}_renderFrame(t){if(this.display){this.display._renderFrame(t);return}this.props.onRender(this._getAnimationProps()),this.device?.submit()}_clearNeedsRedraw(){this._needsRedraw=!1}_setupFrame(){this._resizeViewport()}_initializeAnimationProps(){let t=this.device?.getDefaultCanvasContext();if(!this.device||!t)throw new Error("loop");let e=t?.canvas,n=t.props.useDevicePixels;this.animationProps={animationLoop:this,device:this.device,canvasContext:t,canvas:e,useDevicePixels:n,timeline:this.timeline,needsRedraw:!1,width:1,height:1,aspect:1,time:0,startTime:Date.now(),engineTime:0,tick:0,tock:0,_mousePosition:null}}_getAnimationProps(){if(!this.animationProps)throw new Error("animationProps");return this.animationProps}_updateAnimationProps(){if(!this.animationProps)return;let{width:t,height:e,aspect:n}=this._getSizeAndAspect();(t!==this.animationProps.width||e!==this.animationProps.height)&&this.setNeedsRedraw("drawing buffer resized"),n!==this.animationProps.aspect&&this.setNeedsRedraw("drawing buffer aspect changed"),this.animationProps.width=t,this.animationProps.height=e,this.animationProps.aspect=n,this.animationProps.needsRedraw=this._needsRedraw,this.animationProps.engineTime=Date.now()-this.animationProps.startTime,this.timeline&&this.timeline.update(this.animationProps.engineTime),this.animationProps.tick=Math.floor(this.animationProps.time/1e3*60),this.animationProps.tock++,this.animationProps.time=this.timeline?this.timeline.getTime():this.animationProps.engineTime}async _initDevice(){if(this.device=await this.props.device,!this.device)throw new Error("No device provided");this.canvas=this.device.getDefaultCanvasContext().canvas||null}_createInfoDiv(){if(this.canvas&&this.props.onAddHTML){let t=document.createElement("div");document.body.appendChild(t),t.style.position="relative";let e=document.createElement("div");e.style.position="absolute",e.style.left="10px",e.style.bottom="10px",e.style.width="300px",e.style.background="white",this.canvas instanceof HTMLCanvasElement&&t.appendChild(this.canvas),t.appendChild(e);let n=this.props.onAddHTML(e);n&&(e.innerHTML=n)}}_getSizeAndAspect(){if(!this.device)return{width:1,height:1,aspect:1};let[t,e]=this.device.getDefaultCanvasContext().getDrawingBufferSize(),n=t>0&&e>0?t/e:1;return{width:t,height:e,aspect:n}}_resizeViewport(){this.props.autoResizeViewport&&this.device.gl&&this.device.gl.viewport(0,0,this.device.gl.drawingBufferWidth,this.device.gl.drawingBufferHeight)}_beginFrameTimers(t){let e=t??(typeof performance<"u"?performance.now():Date.now());if(this._lastFrameTime){let n=e-this._lastFrameTime;n>0&&this.frameRate.addTime(n)}this._lastFrameTime=e,this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeStart()}_endFrameTimers(){this.device?._isDebugGPUTimeEnabled()&&this._consumeEncodedGpuTime(),this.cpuTime.timeEnd(),this._updateSharedStats()}_consumeEncodedGpuTime(){if(!this.device)return;let t=this.device.commandEncoder._gpuTimeMs;t!==void 0&&(this.gpuTime.addTime(t),this.device.commandEncoder._gpuTimeMs=void 0)}_updateSharedStats(){if(this.stats!==this.sharedStats){for(let t of Object.keys(this.sharedStats.stats))this.stats.stats[t]||delete this.sharedStats.stats[t];this.stats.forEach(t=>{let e=this.sharedStats.get(t.name,t.type);e.sampleSize=t.sampleSize,e.time=t.time,e.count=t.count,e.samples=t.samples,e.lastTiming=t.lastTiming,e.lastSampleTime=t.lastSampleTime,e.lastSampleCount=t.lastSampleCount,e._count=t._count,e._time=t._time,e._samples=t._samples,e._startTime=t._startTime,e._timerPending=t._timerPending})}}_startEventHandling(){this.canvas&&(this.canvas.addEventListener("mousemove",this._onMousemove.bind(this)),this.canvas.addEventListener("mouseleave",this._onMouseleave.bind(this)))}_onMousemove(t){t instanceof MouseEvent&&(this._getAnimationProps()._mousePosition=[t.offsetX,t.offsetY])}_onMouseleave(t){this._getAnimationProps()._mousePosition=null}},lt=Ee;Y(lt,"defaultAnimationLoopProps",{device:null,onAddHTML:()=>"",onInitialize:async()=>null,onRender:()=>{},onFinalize:()=>{},onError:t=>console.error(t),stats:void 0,autoResizeViewport:!1});var gi=k(U(),1);function xi(i,t){let e=null,n=t?.device||gi.luma.createDevice({id:"animation-loop",adapters:t?.adapters,createCanvasContext:!0}),r=new lt({...t,device:n,async onInitialize(s){ar(s.animationLoop.device);try{return e=new i(s),await e?.onInitialize(s)}catch(o){return console.error(o),or(s.animationLoop.device,o),null}},onRender:s=>e?.onRender(s),onFinalize:s=>e?.onFinalize(s)});return r.getInfo=()=>this.AnimationLoopTemplateCtor.info,r}function or(i,t){if(!i)return;let e=i.getDefaultCanvasContext().canvas;if(e instanceof HTMLCanvasElement){e.style.overflow="visible";let n=document.getElementById("animation-loop-error");n?.remove(),n=document.createElement("h1"),n.id="animation-loop-error",n.innerHTML=t.message,n.style.position="absolute",n.style.top="10px",n.style.left="10px",n.style.color="black",n.style.backgroundColor="red",e.parentElement?.appendChild(n)}}function ar(i){if(!i)return;let t=document.getElementById("animation-loop-error");t&&t.remove()}var w=k(U(),1),Fi=k(nt(),1);var Ct=k(U(),1);var Le={};function S(i="id"){Le[i]=Le[i]||1;let t=Le[i]++;return`${i}-${t}`}var mt=class{id;userData={};topology;bufferLayout=[];vertexCount;indices;attributes;constructor(t){if(this.id=t.id||S("geometry"),this.topology=t.topology,this.indices=t.indices||null,this.attributes=t.attributes,this.vertexCount=t.vertexCount,this.bufferLayout=t.bufferLayout||[],this.indices&&!(this.indices.usage&Ct.Buffer.INDEX))throw new Error("Index buffer must have INDEX usage")}destroy(){this.indices?.destroy();for(let t of Object.values(this.attributes))t.destroy()}getVertexCount(){return this.vertexCount}getAttributes(){return this.attributes}getIndexes(){return this.indices||null}_calculateVertexCount(t){return t.byteLength/12}};function yi(i,t){if(t instanceof mt)return t;let e=cr(i,t),{attributes:n,bufferLayout:r}=hr(i,t);return new mt({topology:t.topology||"triangle-list",bufferLayout:r,vertexCount:t.vertexCount,indices:e,attributes:n})}function cr(i,t){if(!t.indices)return;let e=t.indices.value;return i.createBuffer({usage:Ct.Buffer.INDEX,data:e})}function hr(i,t){let e=[],n={};for(let[s,o]of Object.entries(t.attributes)){let a=s;switch(s){case"POSITION":a="positions";break;case"NORMAL":a="normals";break;case"TEXCOORD_0":a="texCoords";break;case"TEXCOORD_1":a="texCoords1";break;case"COLOR_0":a="colors";break}if(o){n[a]=i.createBuffer({data:o.value,id:`${s}-buffer`});let{value:c,size:h,normalized:l}=o;if(h===void 0)throw new Error(`Attribute ${s} is missing a size`);e.push({name:a,format:Ct.vertexFormatDecoder.getVertexFormatFromAttribute(c,h,l)})}}let r=t._calculateVertexCount(t.attributes,t.indices);return{attributes:n,bufferLayout:e,vertexCount:r}}function Mi(i,t){let e={},n="Values";if(i.attributes.length===0&&!i.varyings?.length)return{"No attributes or varyings":{[n]:"N/A"}};for(let r of i.attributes)if(r){let s=`${r.location} ${r.name}: ${r.type}`;e[`in ${s}`]={[n]:r.stepMode||"vertex"}}for(let r of i.varyings||[]){let s=`${r.location} ${r.name}`;e[`out ${s}`]={[n]:JSON.stringify(r)}}return e}var _i="__debugFramebufferState";function vi(i,t,e){if(i.device.type!=="webgl")return;let n=fr(i.device);if(!n.flushing){if(mr(i)){lr(i,e,n);return}t&&ur(t)&&t.handle!==null&&(n.queuedFramebuffers.includes(t)||n.queuedFramebuffers.push(t))}}function lr(i,t,e){if(e.queuedFramebuffers.length===0)return;let n=i.device,{gl:r}=n,s=r.getParameter(36010),o=r.getParameter(36006),[a,c]=i.device.getDefaultCanvasContext().getDrawingBufferSize(),h=Ii(t.top,8),l=Ii(t.left,8);e.flushing=!0;try{for(let d of e.queuedFramebuffers){let[f,p,g,u,b]=dr({framebuffer:d,targetWidth:a,targetHeight:c,topPx:h,leftPx:l,minimap:t.minimap});r.bindFramebuffer(36008,d.handle),r.bindFramebuffer(36009,null),r.blitFramebuffer(0,0,d.width,d.height,f,p,g,u,16384,9728),h+=b+8}}finally{r.bindFramebuffer(36008,s),r.bindFramebuffer(36009,o),e.flushing=!1}}function dr(i){let{framebuffer:t,targetWidth:e,targetHeight:n,topPx:r,leftPx:s,minimap:o}=i,a=o?Math.max(Math.floor(e/4),1):e,c=o?Math.max(Math.floor(n/4),1):n,h=Math.min(a/t.width,c/t.height),l=Math.max(Math.floor(t.width*h),1),d=Math.max(Math.floor(t.height*h),1),f=s,p=Math.max(n-r-d,0),g=f+l,u=p+d;return[f,p,g,u,d]}function fr(i){return i.userData[_i]||={flushing:!1,queuedFramebuffers:[]},i.userData[_i]}function ur(i){return"colorAttachments"in i}function mr(i){let t=i.props.framebuffer;return!t||t.handle===null}function Ii(i,t){if(!i)return t;let e=Number.parseInt(i,10);return Number.isFinite(e)?e:t}function ee(i,t,e){if(i===t)return!0;if(!e||!i||!t)return!1;if(Array.isArray(i)){if(!Array.isArray(t)||i.length!==t.length)return!1;for(let n=0;n<i.length;n++)if(!ee(i[n],t[n],e-1))return!1;return!0}if(Array.isArray(t))return!1;if(typeof i=="object"&&typeof t=="object"){let n=Object.keys(i),r=Object.keys(t);if(n.length!==r.length)return!1;for(let s of n)if(!t.hasOwnProperty(s)||!ee(i[s],t[s],e-1))return!1;return!0}return!1}var wi=k(U(),1),pt=class{bufferLayouts;constructor(t){this.bufferLayouts=t}getBufferLayout(t){return this.bufferLayouts.find(e=>e.name===t)||null}getAttributeNamesForBuffer(t){return t.attributes?t.attributes?.map(e=>e.attribute):[t.name]}mergeBufferLayouts(t,e){let n=[...t];for(let r of e){let s=n.findIndex(o=>o.name===r.name);s<0?n.push(r):n[s]=r}return n}getBufferIndex(t){let e=this.bufferLayouts.findIndex(n=>n.name===t);return e===-1&&wi.log.warn(`BufferLayout: Missing buffer for "${t}".`)(),e}};function Ai(i,t){let e=1/0;for(let n of i){let r=t[n];r!==void 0&&(e=Math.min(e,r))}return e}function Ti(i,t){let e=Object.fromEntries(i.attributes.map(r=>[r.name,r.location])),n=t.slice();return n.sort((r,s)=>{let o=r.attributes?r.attributes.map(l=>l.attribute):[r.name],a=s.attributes?s.attributes.map(l=>l.attribute):[s.name],c=Ai(o,e),h=Ai(a,e);return c-h}),n}function gt(i,t){if(!i||!t.some(n=>n.bindingLayout?.length))return i;let e={...i,bindings:i.bindings.map(n=>({...n}))};"attributes"in(i||{})&&(e.attributes=i?.attributes||[]);for(let n of t)for(let r of n.bindingLayout||[])for(let s of pr(r.name)){let o=e.bindings.find(a=>a.name===s);o?.group===0&&(o.group=r.group)}return e}function xt(i){return Boolean(i.uniformTypes&&!gr(i.uniformTypes))}function pr(i){let t=new Set([i,`${i}Uniforms`]);return i.endsWith("Uniforms")||t.add(`${i}Sampler`),[...t]}function gr(i){for(let t in i)return!1;return!0}var ie=k(U(),1),Ci=k(nt(),1);function Pi(i){return ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Si(i){return Array.isArray(i)?i.length===0||typeof i[0]=="number":!1}function Ot(i){return Pi(i)||Si(i)}function xr(i){return Ot(i)||typeof i=="number"||typeof i=="boolean"}function Ei(i,t={}){let e={bindings:{},uniforms:{}};return Object.keys(i).forEach(n=>{let r=i[n];Object.prototype.hasOwnProperty.call(t,n)||xr(r)?e.uniforms[n]=r:e.bindings[n]=r}),e}var G=class{options={disableWarnings:!1};modules;moduleUniforms;moduleBindings;constructor(t,e){Object.assign(this.options,e);let n=(0,Ci.getShaderModuleDependencies)(Object.values(t).filter(br));for(let r of n)t[r.name]=r;ie.log.log(1,"Creating ShaderInputs with modules",Object.keys(t))(),this.modules=t,this.moduleUniforms={},this.moduleBindings={};for(let[r,s]of Object.entries(t))s&&(this._addModule(s),s.name&&r!==s.name&&!this.options.disableWarnings&&ie.log.warn(`Module name: ${r} vs ${s.name}`)())}destroy(){}setProps(t){for(let e of Object.keys(t)){let n=e,r=t[n]||{},s=this.modules[n];if(!s)this.options.disableWarnings||ie.log.warn(`Module ${e} not found`)();else{let o=this.moduleUniforms[n],a=this.moduleBindings[n],c=s.getUniforms?.(r,o)||r,{uniforms:h,bindings:l}=Ei(c,s.uniformTypes);this.moduleUniforms[n]=Li(o,h,s.uniformTypes),this.moduleBindings[n]={...a,...l}}}}getModules(){return Object.values(this.modules)}getUniformValues(){return this.moduleUniforms}getBindingValues(){let t={};for(let e of Object.values(this.moduleBindings))Object.assign(t,e);return t}getDebugTable(){let t={};for(let[e,n]of Object.entries(this.moduleUniforms))for(let[r,s]of Object.entries(n))t[`${e}.${r}`]={type:this.modules[e].uniformTypes?.[r],value:String(s)};return t}_addModule(t){let e=t.name;this.moduleUniforms[e]=Li({},t.defaultUniforms||{},t.uniformTypes),this.moduleBindings[e]={}}};function Li(i={},t={},e={}){let n={...i};for(let[r,s]of Object.entries(t))s!==void 0&&(n[r]=Ce(i[r],s,e[r]));return n}function Ce(i,t,e){if(!e||typeof e=="string")return Rt(t);if(Array.isArray(e)){if(Oe(t)||!Array.isArray(t))return Rt(t);let o=Array.isArray(i)&&!Oe(i)?[...i]:[],a=o.slice();for(let c=0;c<t.length;c++){let h=t[c];h!==void 0&&(a[c]=Ce(o[c],h,e[0]))}return a}if(!Re(t))return Rt(t);let n=e,r=Re(i)?i:{},s={...r};for(let[o,a]of Object.entries(t))a!==void 0&&(s[o]=Ce(r[o],a,n[o]));return s}function Rt(i){return ArrayBuffer.isView(i)?Array.prototype.slice.call(i):Array.isArray(i)?Oe(i)?i.slice():i.map(e=>e===void 0?void 0:Rt(e)):Re(i)?Object.fromEntries(Object.entries(i).map(([t,e])=>[t,e===void 0?void 0:Rt(e)])):i}function Oe(i){return ArrayBuffer.isView(i)||Array.isArray(i)&&(i.length===0||typeof i[0]=="number")}function Re(i){return Boolean(i)&&typeof i=="object"&&!Array.isArray(i)&&!ArrayBuffer.isView(i)}function br(i){return Boolean(i?.dependencies)}var R=k(U(),1);var Dt=k(U(),1);var ke={"+X":0,"-X":1,"+Y":2,"-Y":3,"+Z":4,"-Z":5};function kt(i){return i?Array.isArray(i)?i[0]??null:i:null}function Oi(i){let{dimension:t,data:e}=i;if(!e)return null;switch(t){case"1d":{let n=kt(e);if(!n)return null;let{width:r}=Nt(n);return{width:r,height:1}}case"2d":{let n=kt(e);return n?Nt(n):null}case"3d":case"2d-array":{if(!Array.isArray(e)||e.length===0)return null;let n=kt(e[0]);return n?Nt(n):null}case"cube":{let n=Object.keys(e)[0]??null;if(!n)return null;let r=e[n],s=kt(r);return s?Nt(s):null}case"cube-array":{if(!Array.isArray(e)||e.length===0)return null;let n=e[0],r=Object.keys(n)[0]??null;if(!r)return null;let s=kt(n[r]);return s?Nt(s):null}default:return null}}function Nt(i){if((0,Dt.isExternalImage)(i))return(0,Dt.getExternalImageSize)(i);if(typeof i=="object"&&"width"in i&&"height"in i)return{width:i.width,height:i.height};throw new Error("Unsupported mip-level data")}function yr(i){return typeof i=="object"&&i!==null&&"data"in i&&"width"in i&&"height"in i}function Mr(i){return ArrayBuffer.isView(i)}function Ne(i){let{textureFormat:t,format:e}=i;if(t&&e&&t!==e)throw new Error(`Conflicting texture formats "${t}" and "${e}" provided for the same mip level`);return t??e}function Ri(i){let t=ke[i];if(t===void 0)throw new Error(`Invalid cube face: ${i}`);return t}function _r(i,t){return 6*i+Ri(t)}function De(i){throw new Error("setTexture1DData not supported in WebGL.")}function Ir(i){return Array.isArray(i)?i:[i]}function dt(i,t,e,n){let r=Ir(t),s=i,o=[];for(let a=0;a<r.length;a++){let c=r[a];if((0,Dt.isExternalImage)(c))o.push({type:"external-image",image:c,z:s,mipLevel:a});else if(yr(c))o.push({type:"texture-data",data:c,textureFormat:Ne(c),z:s,mipLevel:a});else if(Mr(c)&&e)o.push({type:"texture-data",data:{data:c,width:Math.max(1,e.width>>a),height:Math.max(1,e.height>>a),...n?{format:n}:{}},textureFormat:n,z:s,mipLevel:a});else throw new Error("Unsupported 2D mip-level payload")}return o}function Fe(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function Be(i){let t=[];for(let e=0;e<i.length;e++)t.push(...dt(e,i[e]));return t}function ze(i){let t=[];for(let[e,n]of Object.entries(i)){let r=Ri(e);t.push(...dt(r,n))}return t}function je(i){let t=[];return i.forEach((e,n)=>{for(let[r,s]of Object.entries(e)){let o=_r(n,r);t.push(...dt(o,s))}}),t}var Ge=class{device;id;props;_texture=null;_sampler=null;_view=null;ready;isReady=!1;destroyed=!1;resolveReady=()=>{};rejectReady=()=>{};get texture(){if(!this._texture)throw new Error("Texture not initialized yet");return this._texture}get sampler(){if(!this._sampler)throw new Error("Sampler not initialized yet");return this._sampler}get view(){if(!this._view)throw new Error("View not initialized yet");return this._view}get[Symbol.toStringTag](){return"DynamicTexture"}toString(){let t=this._texture?.width??this.props.width??"?",e=this._texture?.height??this.props.height??"?";return`DynamicTexture:"${this.id}":${t}x${e}px:(${this.isReady?"ready":"loading..."})`}constructor(t,e){this.device=t;let n=S("dynamic-texture"),r=e;this.props={...Ge.defaultProps,id:n,...e,data:null},this.id=this.props.id,this.ready=new Promise((s,o)=>{this.resolveReady=s,this.rejectReady=o}),this.initAsync(r)}async initAsync(t){try{let e=await this._loadAllData(t);this._checkNotDestroyed();let n=e.data?vr({...e,width:t.width,height:t.height,format:t.format}):[],r="format"in t&&t.format!==void 0,s="usage"in t&&t.usage!==void 0,a=(()=>{if(this.props.width&&this.props.height)return{width:this.props.width,height:this.props.height};let u=Oi(e);return u||{width:this.props.width||1,height:this.props.height||1}})();if(!a||a.width<=0||a.height<=0)throw new Error(`${this} size could not be determined or was zero`);let c=wr(this.device,n,a,{format:r?t.format:void 0}),h=c.format??this.props.format,l={...this.props,...a,format:h,mipLevels:1,data:void 0};this.device.isTextureFormatCompressed(h)&&!s&&(l.usage=R.Texture.SAMPLE|R.Texture.COPY_DST);let d=this.props.mipmaps&&!c.hasExplicitMipChain&&!this.device.isTextureFormatCompressed(h);if(this.device.type==="webgpu"&&d){let u=this.props.dimension==="3d"?R.Texture.SAMPLE|R.Texture.STORAGE|R.Texture.COPY_DST|R.Texture.COPY_SRC:R.Texture.SAMPLE|R.Texture.RENDER|R.Texture.COPY_DST|R.Texture.COPY_SRC;l.usage|=u}let f=this.device.getMipLevelCount(l.width,l.height),p=c.hasExplicitMipChain?c.mipLevels:this.props.mipLevels==="auto"?f:Math.max(1,Math.min(f,this.props.mipLevels??1)),g={...l,mipLevels:p};this._texture=this.device.createTexture(g),this._sampler=this.texture.sampler,this._view=this.texture.view,c.subresources.length&&this._setTextureSubresources(c.subresources),this.props.mipmaps&&!c.hasExplicitMipChain&&!d&&R.log.warn(`${this} skipping auto-generated mipmaps for compressed texture format`)(),d&&this.generateMipmaps(),this.isReady=!0,this.resolveReady(this.texture),R.log.info(0,`${this} created`)()}catch(e){let n=e instanceof Error?e:new Error(String(e));this.rejectReady(n)}}destroy(){this._texture&&(this._texture.destroy(),this._texture=null,this._sampler=null,this._view=null),this.destroyed=!0}generateMipmaps(){this.device.type==="webgl"?this.texture.generateMipmapsWebGL():this.device.type==="webgpu"?this.device.generateMipmapsWebGPU(this.texture):R.log.warn(`${this} mipmaps not supported on ${this.device.type}`)}setSampler(t={}){this._checkReady();let e=t instanceof R.Sampler?t:this.device.createSampler(t);this.texture.setSampler(e),this._sampler=e}async readBuffer(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=this.device.createBuffer({byteLength:s.byteLength,usage:R.Buffer.COPY_DST|R.Buffer.MAP_READ});this.texture.readBuffer({...t,width:e,height:n,depthOrArrayLayers:r},o);let a=this.device.createFence();return await a.signaled,a.destroy(),o}async readAsync(t={}){this.isReady||await this.ready;let e=t.width??this.texture.width,n=t.height??this.texture.height,r=t.depthOrArrayLayers??this.texture.depth,s=this.texture.computeMemoryLayout({width:e,height:n,depthOrArrayLayers:r}),o=await this.readBuffer(t),a=await o.readAsync(0,s.byteLength);return o.destroy(),a.buffer}resize(t){if(this._checkReady(),t.width===this.texture.width&&t.height===this.texture.height)return!1;let e=this.texture;return this._texture=e.clone(t),this._sampler=this.texture.sampler,this._view=this.texture.view,e.destroy(),R.log.info(`${this} resized`),!0}getCubeFaceIndex(t){let e=ke[t];if(e===void 0)throw new Error(`Invalid cube face: ${t}`);return e}getCubeArrayFaceIndex(t,e){return 6*t+this.getCubeFaceIndex(e)}setTexture1DData(t){if(this._checkReady(),this.texture.props.dimension!=="1d")throw new Error(`${this} is not 1d`);let e=De(t);this._setTextureSubresources(e)}setTexture2DData(t,e=0){if(this._checkReady(),this.texture.props.dimension!=="2d")throw new Error(`${this} is not 2d`);let n=dt(e,t);this._setTextureSubresources(n)}setTexture3DData(t){if(this.texture.props.dimension!=="3d")throw new Error(`${this} is not 3d`);let e=Fe(t);this._setTextureSubresources(e)}setTextureArrayData(t){if(this.texture.props.dimension!=="2d-array")throw new Error(`${this} is not 2d-array`);let e=Be(t);this._setTextureSubresources(e)}setTextureCubeData(t){if(this.texture.props.dimension!=="cube")throw new Error(`${this} is not cube`);let e=ze(t);this._setTextureSubresources(e)}setTextureCubeArrayData(t){if(this.texture.props.dimension!=="cube-array")throw new Error(`${this} is not cube-array`);let e=je(t);this._setTextureSubresources(e)}_setTextureSubresources(t){for(let e of t){let{z:n,mipLevel:r}=e;switch(e.type){case"external-image":let{image:s,flipY:o}=e;this.texture.copyExternalImage({image:s,z:n,mipLevel:r,flipY:o});break;case"texture-data":let{data:a,textureFormat:c}=e;if(c&&c!==this.texture.format)throw new Error(`${this} mip level ${r} uses format "${c}" but texture format is "${this.texture.format}"`);this.texture.writeData(a.data,{x:0,y:0,z:n,width:a.width,height:a.height,depthOrArrayLayers:1,mipLevel:r});break;default:throw new Error("Unsupported 2D mip-level payload")}}}async _loadAllData(t){let e=await Ue(t.data);return{dimension:t.dimension??"2d",data:e??null}}_checkNotDestroyed(){this.destroyed&&R.log.warn(`${this} already destroyed`)}_checkReady(){this.isReady||R.log.warn(`${this} Cannot perform this operation before ready`)}},B=Ge;Y(B,"defaultProps",{...R.Texture.defaultProps,dimension:"2d",data:null,mipmaps:!1});function vr(i){if(!i.data)return[];let t=i.width&&i.height?{width:i.width,height:i.height}:void 0,e="format"in i?i.format:void 0;switch(i.dimension){case"1d":return De(i.data);case"2d":return dt(0,i.data,t,e);case"3d":return Fe(i.data);case"2d-array":return Be(i.data);case"cube":return ze(i.data);case"cube-array":return je(i.data);default:throw new Error(`Unhandled dimension ${i.dimension}`)}}function wr(i,t,e,n){if(t.length===0)return{subresources:t,mipLevels:1,format:n.format,hasExplicitMipChain:!1};let r=new Map;for(let l of t){let d=r.get(l.z)??[];d.push(l),r.set(l.z,d)}let s=t.some(l=>l.mipLevel>0),o=n.format,a=Number.POSITIVE_INFINITY,c=[];for(let[l,d]of r){let f=[...d].sort((I,m)=>I.mipLevel-m.mipLevel),p=f[0];if(!p||p.mipLevel!==0)throw new Error(`DynamicTexture: slice ${l} is missing mip level 0`);let g=Ni(i,p);if(g.width!==e.width||g.height!==e.height)throw new Error(`DynamicTexture: slice ${l} base level dimensions ${g.width}x${g.height} do not match expected ${e.width}x${e.height}`);let u=ki(p);if(u){if(o&&o!==u)throw new Error(`DynamicTexture: slice ${l} base level format "${u}" does not match texture format "${o}"`);o=u}let b=o&&i.isTextureFormatCompressed(o)?Ar(i,g.width,g.height,o):i.getMipLevelCount(g.width,g.height),M=0;for(let I=0;I<f.length;I++){let m=f[I];if(!m||m.mipLevel!==I||I>=b)break;let x=Ni(i,m),y=Math.max(1,g.width>>I),_=Math.max(1,g.height>>I);if(x.width!==y||x.height!==_)break;let T=ki(m);if(T&&(o||(o=T),T!==o))break;M++,c.push(m)}a=Math.min(a,M)}let h=Number.isFinite(a)?Math.max(1,a):1;return{subresources:c.filter(l=>l.mipLevel<h),mipLevels:h,format:o,hasExplicitMipChain:s}}function ki(i){if(i.type==="texture-data")return i.textureFormat??Ne(i.data)}function Ni(i,t){switch(t.type){case"external-image":return i.getExternalImageSize(t.image);case"texture-data":return{width:t.data.width,height:t.data.height};default:throw new Error("Unsupported texture subresource")}}function Ar(i,t,e,n){let{blockWidth:r=1,blockHeight:s=1}=i.getTextureFormatInfo(n),o=1;for(let a=1;;a++){let c=Math.max(1,t>>a),h=Math.max(1,e>>a);if(c<r||h<s)break;o++}return o}async function Ue(i){if(i=await i,Array.isArray(i))return await Promise.all(i.map(Ue));if(i&&typeof i=="object"&&i.constructor===Object){let t=i,e=await Promise.all(Object.values(t).map(Ue)),n=Object.keys(t),r={};for(let s=0;s<n.length;s++)r[n[s]]=e[s];return r}return i}var rt=2,Tr=1e4,Di="render pipeline initialization failed",$e=class{device;id;source;vs;fs;pipelineFactory;shaderFactory;userData={};parameters;topology;bufferLayout;isInstanced=void 0;instanceCount=0;vertexCount;indexBuffer=null;bufferAttributes={};constantAttributes={};bindings={};vertexArray;transformFeedback=null;pipeline;shaderInputs;material=null;_uniformStore;_attributeInfos={};_gpuGeometry=null;props;_pipelineNeedsUpdate="newly created";_needsRedraw="initializing";_destroyed=!1;_lastDrawTimestamp=-1;_bindingTable=[];get[Symbol.toStringTag](){return"Model"}toString(){return`Model(${this.id})`}constructor(t,e){this.props={...$e.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData),this.material=e.material||null;let n=Object.fromEntries(this.props.modules?.map(c=>[c.name,c])||[]),r=e.shaderInputs||new G(n,{disableWarnings:this.props.disableWarnings});this.setShaderInputs(r);let s=Pr(t),o=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];if(this.props.shaderLayout=gt(this.props.shaderLayout,o)||null,this.device.type==="webgpu"&&this.props.source){let{source:c,getUniforms:h,bindingTable:l}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:s,...this.props,modules:o});this.source=c,this._getModuleUniforms=h,this._bindingTable=l;let d=t.getShaderLayout?.(this.source);this.props.shaderLayout=gt(this.props.shaderLayout||d||null,o)||null}else{let{vs:c,fs:h,getUniforms:l}=this.props.shaderAssembler.assembleGLSLShaderPair({platformInfo:s,...this.props,modules:o});this.vs=c,this.fs=h,this._getModuleUniforms=l,this._bindingTable=[]}this.vertexCount=this.props.vertexCount,this.instanceCount=this.props.instanceCount,this.topology=this.props.topology,this.bufferLayout=this.props.bufferLayout,this.parameters=this.props.parameters,e.geometry&&this.setGeometry(e.geometry),this.pipelineFactory=e.pipelineFactory||w.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||w.ShaderFactory.getDefaultShaderFactory(this.device),this.pipeline=this._updatePipeline(),this.vertexArray=t.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry),"isInstanced"in e&&(this.isInstanced=e.isInstanced),e.instanceCount&&this.setInstanceCount(e.instanceCount),e.vertexCount&&this.setVertexCount(e.vertexCount),e.indexBuffer&&this.setIndexBuffer(e.indexBuffer),e.attributes&&this.setAttributes(e.attributes),e.constantAttributes&&this.setConstantAttributes(e.constantAttributes),e.bindings&&this.setBindings(e.bindings),e.transformFeedback&&(this.transformFeedback=e.transformFeedback)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.pipeline.vs),this.pipeline.fs&&this.pipeline.fs!==this.pipeline.vs&&this.shaderFactory.release(this.pipeline.fs),this._uniformStore.destroy(),this._gpuGeometry?.destroy(),this._destroyed=!0)}needsRedraw(){this._getBindingsUpdateTimestamp()>this._lastDrawTimestamp&&this.setNeedsRedraw("contents of bound textures or buffers updated");let t=this._needsRedraw;return this._needsRedraw=!1,t}setNeedsRedraw(t){this._needsRedraw||=t}getBindingDebugTable(){return this._bindingTable}predraw(){this.updateShaderInputs(),this.pipeline=this._updatePipeline()}draw(t){let e=this._areBindingsLoading();if(e)return w.log.info(rt,`>>> DRAWING ABORTED ${this.id}: ${e} not loaded`)(),!1;try{t.pushDebugGroup(`${this}.predraw(${t})`),this.predraw()}finally{t.popDebugGroup()}let n,r=this.pipeline.isErrored;try{if(t.pushDebugGroup(`${this}.draw(${t})`),this._logDrawCallStart(),this.pipeline=this._updatePipeline(),r=this.pipeline.isErrored,r)w.log.info(rt,`>>> DRAWING ABORTED ${this.id}: ${Di}`)(),n=!1;else{let s=this._getBindings(),o=this._getBindGroups(),{indexBuffer:a}=this.vertexArray,c=a?a.byteLength/(a.indexType==="uint32"?4:2):void 0;n=this.pipeline.draw({renderPass:t,vertexArray:this.vertexArray,isInstanced:this.isInstanced,vertexCount:this.vertexCount,instanceCount:this.instanceCount,indexCount:c,transformFeedback:this.transformFeedback||void 0,bindings:s,bindGroups:o,_bindGroupCacheKeys:this._getBindGroupCacheKeys(),uniforms:this.props.uniforms,parameters:this.parameters,topology:this.topology})}}finally{t.popDebugGroup(),this._logDrawCallEnd()}return this._logFramebuffer(t),n?(this._lastDrawTimestamp=this.device.timestamp,this._needsRedraw=!1):r?this._needsRedraw=Di:this._needsRedraw="waiting for resource initialization",n}setGeometry(t){this._gpuGeometry?.destroy();let e=t&&yi(this.device,t);if(e){this.setTopology(e.topology||"triangle-list");let n=new pt(this.bufferLayout);this.bufferLayout=n.mergeBufferLayouts(e.bufferLayout,this.bufferLayout),this.vertexArray&&this._setGeometryAttributes(e)}this._gpuGeometry=e}setTopology(t){t!==this.topology&&(this.topology=t,this._setPipelineNeedsUpdate("topology"))}setBufferLayout(t){let e=new pt(this.bufferLayout);this.bufferLayout=this._gpuGeometry?e.mergeBufferLayouts(t,this._gpuGeometry.bufferLayout):t,this._setPipelineNeedsUpdate("bufferLayout"),this.pipeline=this._updatePipeline(),this.vertexArray=this.device.createVertexArray({shaderLayout:this.pipeline.shaderLayout,bufferLayout:this.pipeline.bufferLayout}),this._gpuGeometry&&this._setGeometryAttributes(this._gpuGeometry)}setParameters(t){ee(t,this.parameters,2)||(this.parameters=t,this._setPipelineNeedsUpdate("parameters"))}setInstanceCount(t){this.instanceCount=t,this.isInstanced===void 0&&t>0&&(this.isInstanced=!0),this.setNeedsRedraw("instanceCount")}setVertexCount(t){this.vertexCount=t,this.setNeedsRedraw("vertexCount")}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new w.UniformStore(this.device,this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(xt(n)&&!this.material?.ownsModule(e)){let r=this._uniformStore.getManagedUniformBuffer(e);this.bindings[`${e}Uniforms`]=r}this.setNeedsRedraw("shaderInputs")}setMaterial(t){this.material=t,this.setNeedsRedraw("material")}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this.setBindings(this._getNonMaterialBindings(this.shaderInputs.getBindingValues())),this.setNeedsRedraw("shaderInputs")}setBindings(t){Object.assign(this.bindings,t),this.setNeedsRedraw("bindings")}setTransformFeedback(t){this.transformFeedback=t,this.setNeedsRedraw("transformFeedback")}setIndexBuffer(t){this.vertexArray.setIndexBuffer(t),this.setNeedsRedraw("indexBuffer")}setAttributes(t,e){let n=e?.disableWarnings??this.props.disableWarnings;t.indices&&w.log.warn(`Model:${this.id} setAttributes() - indexBuffer should be set using setIndexBuffer()`)(),this.bufferLayout=Ti(this.pipeline.shaderLayout,this.bufferLayout);let r=new pt(this.bufferLayout);for(let[s,o]of Object.entries(t)){let a=r.getBufferLayout(s);if(!a){n||w.log.warn(`Model(${this.id}): Missing layout for buffer "${s}".`)();continue}let c=r.getAttributeNamesForBuffer(a),h=!1;for(let l of c){let d=this._attributeInfos[l];if(d){let f=this.device.type==="webgpu"?r.getBufferIndex(d.bufferName):d.location;this.vertexArray.setBuffer(f,o),h=!0}}!h&&!n&&w.log.warn(`Model(${this.id}): Ignoring buffer "${o.id}" for unknown attribute "${s}"`)()}this.setNeedsRedraw("attributes")}setConstantAttributes(t,e){for(let[n,r]of Object.entries(t)){let s=this._attributeInfos[n];s?this.vertexArray.setConstantWebGL(s.location,r):(e?.disableWarnings??this.props.disableWarnings)||w.log.warn(`Model "${this.id}: Ignoring constant supplied for unknown attribute "${n}"`)()}this.setNeedsRedraw("constants")}_areBindingsLoading(){for(let t of Object.values(this.bindings))if(t instanceof B&&!t.isReady)return t.id;for(let t of Object.values(this.material?.bindings||{}))if(t instanceof B&&!t.isReady)return t.id;return!1}_getBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))n instanceof B?n.isReady&&(t[e]=n.texture):t[e]=n;return t}_getBindGroups(){let t=this.pipeline?.shaderLayout||this.props.shaderLayout||{bindings:[]},e=t.bindings.length?(0,w.normalizeBindingsByGroup)(t,this._getBindings()):{0:this._getBindings()};if(!this.material)return e;for(let[n,r]of Object.entries(this.material.getBindingsByGroup())){let s=Number(n);e[s]={...e[s]||{},...r}}return e}_getBindGroupCacheKeys(){let t=this.material?.getBindGroupCacheKey(3);return t?{3:t}:{}}_getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof w.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof w.Buffer||e instanceof w.Texture?t=Math.max(t,e.updateTimestamp):e instanceof B?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof w.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return Math.max(t,this.material?.getBindingsUpdateTimestamp()||0)}_setGeometryAttributes(t){let e={...t.attributes};for(let[n]of Object.entries(e))!this.pipeline.shaderLayout.attributes.find(r=>r.name===n)&&n!=="positions"&&delete e[n];this.vertexCount=t.vertexCount,this.setIndexBuffer(t.indices||null),this.setAttributes(t.attributes,{disableWarnings:!0}),this.setAttributes(e,{disableWarnings:this.props.disableWarnings}),this.setNeedsRedraw("geometry attributes")}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate||=t,this.setNeedsRedraw(t)}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null,e=null;this.pipeline&&(w.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.pipeline.vs,e=this.pipeline.fs),this._pipelineNeedsUpdate=!1;let n=this.shaderFactory.createShader({id:`${this.id}-vertex`,stage:"vertex",source:this.source||this.vs,debugShaders:this.props.debugShaders}),r=null;this.source?r=n:this.fs&&(r=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"fragment",source:this.source||this.fs,debugShaders:this.props.debugShaders})),this.pipeline=this.pipelineFactory.createRenderPipeline({...this.props,bindings:void 0,bufferLayout:this.bufferLayout,topology:this.topology,parameters:this.parameters,bindGroups:this._getBindGroups(),vs:n,fs:r}),this._attributeInfos=(0,w.getAttributeInfosFromLayouts)(this.pipeline.shaderLayout,this.bufferLayout),t&&this.shaderFactory.release(t),e&&e!==t&&this.shaderFactory.release(e)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=w.log.level>3?0:Tr;w.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,w.log.group(rt,`>>> DRAWING MODEL ${this.id}`,{collapsed:w.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=Mi(this.pipeline.shaderLayout,this.id);w.log.table(rt,t)();let e=this.shaderInputs.getDebugTable();w.log.table(rt,e)();let n=this._getAttributeDebugTable();w.log.table(rt,this._attributeInfos)(),w.log.table(rt,n)(),w.log.groupEnd(rt)(),this._logOpen=!1}}_drawCount=0;_logFramebuffer(t){let e=this.device.props.debugFramebuffers;if(this._drawCount++,!e)return;let n=t.props.framebuffer;vi(t,n,{id:n?.id||`${this.id}-framebuffer`,minimap:!0})}_getAttributeDebugTable(){let t={};for(let[e,n]of Object.entries(this._attributeInfos)){let r=this.vertexArray.attributes[n.location];t[n.location]={name:e,type:n.shaderType,values:r?this._getBufferOrConstantValues(r,n.bufferDataType):"null"}}if(this.vertexArray.indexBuffer){let{indexBuffer:e}=this.vertexArray,n=e.indexType==="uint32"?new Uint32Array(e.debugData):new Uint16Array(e.debugData);t.indices={name:"indices",type:e.indexType,values:n.toString()}}return t}_getBufferOrConstantValues(t,e){let n=w.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof w.Buffer?new n(t.debugData):t).toString()}_getNonMaterialBindings(t){if(!this.material)return t;let e={};for(let[n,r]of Object.entries(t))this.material.ownsBinding(n)||(e[n]=r);return e}},H=$e;Y(H,"defaultProps",{...w.RenderPipeline.defaultProps,source:void 0,vs:null,fs:null,id:"unnamed",handle:void 0,userData:{},defines:{},modules:[],geometry:null,indexBuffer:null,attributes:{},constantAttributes:{},bindings:{},uniforms:{},varyings:[],isInstanced:void 0,instanceCount:0,vertexCount:0,shaderInputs:void 0,material:void 0,pipelineFactory:void 0,shaderFactory:void 0,transformFeedback:void 0,shaderAssembler:Fi.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0,disableWarnings:void 0});function Pr(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Q=k(U(),1);var Ft=3,bt=class{device;modules;_materialBindingNames;_materialModuleNames;constructor(t,e={}){this.device=t,this.modules=e.modules||[];let n=new G(Object.fromEntries(this.modules.map(r=>[r.name,r])));this._materialBindingNames=Sr(n),this._materialModuleNames=Er(n)}createMaterial(t={}){return new yt(this.device,{...t,factory:this})}getBindingNames(){return Array.from(this._materialBindingNames)}ownsBinding(t){if(this._materialBindingNames.has(t))return!0;let e=Ve(t);return e?this._materialModuleNames.has(e):!1}ownsModule(t){return this._materialModuleNames.has(t)}getBindingsByGroup(t){return Object.keys(t).length>0?{[Ft]:t}:{}}};function Ve(i){return i.endsWith("Uniforms")?i.slice(0,-8):null}function Sr(i){let t=new Set;for(let e of Object.values(i.modules))for(let n of e.bindingLayout||[])n.group===Ft&&t.add(n.name);return t}function Er(i){let t=new Set;for(let e of Object.values(i.modules))e.name&&e.bindingLayout?.some(n=>n.group===Ft&&n.name===e.name)&&t.add(e.name);return t}var yt=class{id;device;factory;shaderInputs;bindings={};_uniformStore;_bindGroupCacheToken={};constructor(t,e={}){this.id=e.id||S("material"),this.device=t,this.factory=e.factory||new bt(t,{modules:e.modules||e.shaderInputs?.getModules()||[]});let n=Object.fromEntries((e.shaderInputs?.getModules()||this.factory.modules).map(r=>[r.name,r]));this.shaderInputs=e.shaderInputs||new G(n),this._uniformStore=new Q.UniformStore(this.device,this.shaderInputs.modules);for(let[r,s]of Object.entries(this.shaderInputs.modules))if(this.ownsModule(r)&&xt(s)){let o=this._uniformStore.getManagedUniformBuffer(r);this.bindings[`${r}Uniforms`]=o}this.updateShaderInputs(),e.bindings&&this._replaceOwnedBindings(e.bindings)}destroy(){this._uniformStore.destroy()}clone(t={}){let e=this.factory.createMaterial({id:t.id,shaderInputs:t.shaderInputs,bindings:{...this.getResourceBindings(),...t.bindings}});return t.shaderInputs||e.setProps(this.shaderInputs.getUniformValues()),t.moduleProps&&e.setProps(t.moduleProps),e}ownsBinding(t){return this.factory.ownsBinding(t)}ownsModule(t){return this.factory.ownsModule(t)}setProps(t){this.shaderInputs.setProps(t),this.updateShaderInputs()}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues()),this._setOwnedBindings(this.shaderInputs.getBindingValues())&&(this._bindGroupCacheToken={})}getResourceBindings(){let t={};for(let[e,n]of Object.entries(this.bindings))Ve(e)||(t[e]=n);return t}getBindings(){let t={},e=t;for(let[n,r]of Object.entries(this.bindings))r instanceof B?r.isReady&&(e[n]=r.texture):e[n]=r;return t}getBindingsByGroup(){return this.factory.getBindingsByGroup(this.getBindings())}getBindGroupCacheKey(t){return t===Ft?this._bindGroupCacheToken:null}getBindingsUpdateTimestamp(){let t=0;for(let e of Object.values(this.bindings))e instanceof Q.TextureView?t=Math.max(t,e.texture.updateTimestamp):e instanceof Q.Buffer||e instanceof Q.Texture?t=Math.max(t,e.updateTimestamp):e instanceof B?t=e.texture?Math.max(t,e.texture.updateTimestamp):1/0:e instanceof Q.Sampler||(t=Math.max(t,e.buffer.updateTimestamp));return t}_replaceOwnedBindings(t){this._setOwnedBindings(t)&&(this._bindGroupCacheToken={})}_setOwnedBindings(t){let e=!1;for(let[n,r]of Object.entries(t))r!==void 0&&this.ownsBinding(n)&&this.bindings[n]!==r&&(this.bindings[n]=r,e=!0);return e}};var Bi=k(U(),1),zi=k(nt(),1);var ne=class{device;model;transformFeedback;static isSupported(t){return t?.info?.type==="webgl"}constructor(t,e=ne.defaultProps){if(!ne.isSupported(t))throw new Error("BufferTransform not yet implemented on WebGPU");this.device=t,this.model=new H(this.device,{id:e.id||"buffer-transform-model",fs:e.fs||(0,zi.getPassthroughFS)(),topology:e.topology||"point-list",varyings:e.outputs||e.varyings,...e}),this.transformFeedback=this.device.createTransformFeedback({layout:this.model.pipeline.shaderLayout,buffers:e.feedbackBuffers}),this.model.setTransformFeedback(this.transformFeedback),Object.seal(this)}destroy(){this.model&&this.model.destroy()}delete(){this.destroy()}run(t){t?.inputBuffers&&this.model.setAttributes(t.inputBuffers),t?.outputBuffers&&this.transformFeedback.setBuffers(t.outputBuffers);let e=this.device.beginRenderPass(t);this.model.draw(e),e.end()}getBuffer(t){return this.transformFeedback.getBuffer(t)}readAsync(t){let e=this.getBuffer(t);if(!e)throw new Error("BufferTransform#getBuffer");if(e instanceof Bi.Buffer)return e.readAsync();let{buffer:n,byteOffset:r=0,byteLength:s=n.byteLength}=e;return n.readAsync(r,s)}},Bt=ne;Y(Bt,"defaultProps",{...H.defaultProps,outputs:void 0,feedbackBuffers:void 0});var ji=k(nt(),1);var Lr="transform_output",re=class{device;model;sampler;currentIndex=0;samplerTextureMap=null;bindings=[];resources={};constructor(t,e){this.device=t,this.sampler=t.createSampler({addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge",minFilter:"nearest",magFilter:"nearest",mipmapFilter:"nearest"}),this.model=new H(this.device,{id:e.id||S("texture-transform-model"),fs:e.fs||(0,ji.getPassthroughFS)({input:e.targetTextureVarying,inputChannels:e.targetTextureChannels,output:Lr}),vertexCount:e.vertexCount,...e}),this._initialize(e),Object.seal(this)}destroy(){this.model.destroy();for(let t of this.bindings)t.framebuffer?.destroy()}delete(){this.destroy()}run(t){let{framebuffer:e}=this.bindings[this.currentIndex],n=this.device.beginRenderPass({framebuffer:e,...t});this.model.draw(n),n.end(),this.device.submit()}getTargetTexture(){let{targetTexture:t}=this.bindings[this.currentIndex];return t}getFramebuffer(){return this.bindings[this.currentIndex].framebuffer}_initialize(t){this._updateBindings(t)}_updateBindings(t){this.bindings[this.currentIndex]=this._updateBinding(this.bindings[this.currentIndex],t)}_updateBinding(t,{sourceBuffers:e,sourceTextures:n,targetTexture:r}){if(t||(t={sourceBuffers:{},sourceTextures:{},targetTexture:null}),Object.assign(t.sourceTextures,n),Object.assign(t.sourceBuffers,e),r){t.targetTexture=r;let{width:s,height:o}=r;t.framebuffer&&t.framebuffer.destroy(),t.framebuffer=this.device.createFramebuffer({id:"transform-framebuffer",width:s,height:o,colorAttachments:[r]}),t.framebuffer.resize({width:s,height:o})}return t}_setSourceTextureParameters(){let t=this.currentIndex,{sourceTextures:e}=this.bindings[t];for(let n in e)e[n].sampler=this.sampler}};var $=class{id;topology;vertexCount;indices;attributes;userData={};constructor(t){let{attributes:e={},indices:n=null,vertexCount:r=null}=t;this.id=t.id||S("geometry"),this.topology=t.topology,n&&(this.indices=ArrayBuffer.isView(n)?{value:n,size:1}:n),this.attributes={};for(let[s,o]of Object.entries(e)){let a=ArrayBuffer.isView(o)?{value:o}:o;if(!ArrayBuffer.isView(a.value))throw new Error(`${this._print(s)}: must be typed array or object with value as typed array`);if((s==="POSITION"||s==="positions")&&!a.size&&(a.size=3),s==="indices"){if(this.indices)throw new Error("Multiple indices detected");this.indices=a}else this.attributes[s]=a}this.indices&&this.indices.isIndexed!==void 0&&(this.indices=Object.assign({},this.indices),delete this.indices.isIndexed),this.vertexCount=r||this._calculateVertexCount(this.attributes,this.indices)}getVertexCount(){return this.vertexCount}getAttributes(){return this.indices?{indices:this.indices,...this.attributes}:this.attributes}_print(t){return`Geometry ${this.id} attribute ${t}`}_setAttributes(t,e){return this}_calculateVertexCount(t,e){if(e)return e.value.length;let n=1/0;for(let r of Object.values(t)){let{value:s,size:o,constant:a}=r;!a&&s&&o!==void 0&&o>=1&&(n=Math.min(n,s.length/o))}return n}};var Cr=`struct VertexInputs {
|
|
8
8
|
@location(0) clipSpacePositions: vec2<f32>,
|
|
9
9
|
@location(1) texCoords: vec2<f32>,
|
|
10
10
|
@location(2) coordinates: vec2<f32>
|
|
@@ -26,7 +26,7 @@ fn vertexMain(inputs: VertexInputs) -> FragmentInputs {
|
|
|
26
26
|
outputs.uv = inputs.texCoords;
|
|
27
27
|
return outputs;
|
|
28
28
|
}
|
|
29
|
-
`,
|
|
29
|
+
`,Or=`#version 300 es
|
|
30
30
|
in vec2 clipSpacePositions;
|
|
31
31
|
in vec2 texCoords;
|
|
32
32
|
in vec2 coordinates;
|
|
@@ -41,13 +41,13 @@ void main(void) {
|
|
|
41
41
|
coordinate = coordinates;
|
|
42
42
|
uv = texCoords;
|
|
43
43
|
}
|
|
44
|
-
`,
|
|
45
|
-
${e.source}`}),super(t,{id:e.id||S("clip-space"),...e,vs:
|
|
46
|
-
@group(0) @binding(
|
|
44
|
+
`,Ui=[-1,-1,1,-1,-1,1,1,1],st=class extends H{constructor(t,e){let n=Ui.map(r=>r===-1?0:r);e.source&&(e={...e,source:`${Cr}
|
|
45
|
+
${e.source}`}),super(t,{id:e.id||S("clip-space"),...e,vs:Or,vertexCount:4,geometry:new $({topology:"triangle-strip",vertexCount:4,attributes:{clipSpacePositions:{size:2,value:new Float32Array(Ui)},texCoords:{size:2,value:new Float32Array(n)},coordinates:{size:2,value:new Float32Array(n)}}})})}};var Rr={name:"background",uniformTypes:{scale:"vec2<f32>"}},kr=`@group(0) @binding(auto) var backgroundTexture: texture_2d<f32>;
|
|
46
|
+
@group(0) @binding(auto) var backgroundTextureSampler: sampler;
|
|
47
47
|
struct backgroundUniforms {
|
|
48
48
|
scale: vec2<f32>,
|
|
49
49
|
};
|
|
50
|
-
@group(0) @binding(
|
|
50
|
+
@group(0) @binding(auto) var<uniform> background: backgroundUniforms;
|
|
51
51
|
|
|
52
52
|
fn billboardTexture_getTextureUV(uv: vec2<f32>) -> vec2<f32> {
|
|
53
53
|
let scale: vec2<f32> = background.scale;
|
|
@@ -60,12 +60,12 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4<f32> {
|
|
|
60
60
|
let position: vec2<f32> = billboardTexture_getTextureUV(inputs.uv);
|
|
61
61
|
return textureSample(backgroundTexture, backgroundTextureSampler, position);
|
|
62
62
|
}
|
|
63
|
-
`,
|
|
63
|
+
`,Nr=`#version 300 es
|
|
64
64
|
precision highp float;
|
|
65
65
|
|
|
66
66
|
uniform sampler2D backgroundTexture;
|
|
67
67
|
|
|
68
|
-
uniform backgroundUniforms {
|
|
68
|
+
layout(std140) uniform backgroundUniforms {
|
|
69
69
|
vec2 scale;
|
|
70
70
|
} background;
|
|
71
71
|
|
|
@@ -81,11 +81,11 @@ void main(void) {
|
|
|
81
81
|
vec2 position = billboardTexture_getTextureUV(coordinate);
|
|
82
82
|
fragColor = texture(backgroundTexture, position);
|
|
83
83
|
}
|
|
84
|
-
`,_t=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{...e,id:e.id||"background-texture-model",source:Sr,fs:Lr,modules:[...e.modules||[],Pr],parameters:{depthWriteEnabled:!1,...e.parameters||{},...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(e)}setProps(t){let{backgroundTexture:e}=t;if(e)if(this.setBindings({backgroundTexture:e}),e.isReady){let n=e instanceof z?e.texture:e;this.backgroundTexture=n,this.updateScale(n)}else e.ready.then(n=>{this.backgroundTexture=n,this.updateScale(n)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,n]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,s=t.height,o=e/n,a=r/s,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var It=class extends V{constructor(t={}){let{id:e=S("sphere-geometry")}=t,{indices:n,attributes:r}=Cr(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cr(i){let{nlat:t=10,nlong:e=10}=i,s=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(M,I,m,x,b)=>i.radius||1,d=new Float32Array(h*3),u=new Float32Array(h*3),g=new Float32Array(h*2),p=h>65535?Uint32Array:Uint16Array,f=new p(t*e*6);for(let M=0;M<=t;M++)for(let I=0;I<=e;I++){let m=I/e,x=M/t,b=I+M*(e+1),_=b*2,T=b*3,E=c*m,L=s*x,O=Math.sin(E),v=Math.cos(E),P=Math.sin(L),C=Math.cos(L),A=v*P,B=C,tt=O*P,Z=l(A,B,tt,m,x);d[T+0]=Z*A,d[T+1]=Z*B,d[T+2]=Z*tt,u[T+0]=A,u[T+1]=B,u[T+2]=tt,g[_+0]=m,g[_+1]=1-x}let y=e+1;for(let M=0;M<e;M++)for(let I=0;I<t;I++){let m=(M*t+I)*6;f[m+0]=I*y+M,f[m+1]=I*y+M+1,f[m+2]=(I+1)*y+M,f[m+3]=(I+1)*y+M,f[m+4]=I*y+M+1,f[m+5]=(I+1)*y+M+1}return{indices:{size:1,value:f},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}}}var wa=1/Math.PI*180,Aa=1/180*Math.PI,Er={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Er}};var j=globalThis.mathgl.config;function Gi(i,{precision:t=j.precision}={}){return i=Or(i),`${parseFloat(i.toPrecision(t))}`}function vt(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function He(i,t,e){let n=j.EPSILON;e&&(j.EPSILON=e);try{if(i===t)return!0;if(vt(i)&&vt(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!He(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=j.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{j.EPSILON=n}}function Or(i){return Math.round(i/j.EPSILON)*j.EPSILON}var wt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let n=0;n<this.ELEMENTS;++n)this[n]=t[n+e];return this.check()}toArray(t=[],e=0){for(let n=0;n<this.ELEMENTS;++n)t[e+n]=this[n];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:vt(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(j)}formatString(t){let e="";for(let n=0;n<this.ELEMENTS;++n)e+=(n>0?", ":"")+Gi(this[n],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!He(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,n){if(n===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let s=t[r],o=typeof e=="number"?e:e[r];this[r]=s+n*(o-s)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t[n]),e[n]);return this.check()}add(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]+=e[n];return this.check()}subtract(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]-=e[n];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(j.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t),e);return this.check()}get elements(){return this}};function kr(i,t){if(i.length!==t)return!1;for(let e=0;e<i.length;++e)if(!Number.isFinite(i[e]))return!1;return!0}function X(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function oe(i,t,e=""){if(j.debug&&!kr(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function We(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var ae=class extends wt{get x(){return this[0]}set x(t){this[0]=X(t)}get y(){return this[1]}set y(t){this[1]=X(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let n=0;n<this.ELEMENTS;++n){let r=this[n]-t[n];e+=r*r}return X(e)}dot(t){let e=0;for(let n=0;n<this.ELEMENTS;++n)e+=this[n]*t[n];return X(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]*=e[n];return this.check()}divide(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]/=e[n];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),X(this[t])}setComponent(t,e){return We(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var et=typeof Float32Array<"u"?Float32Array:Array;var Da=Math.PI/180;function Rr(){let i=new et(2);return et!=Float32Array&&(i[0]=0,i[1]=0),i}function Vi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[4]*r+e[12],i[1]=e[1]*n+e[5]*r+e[13],i}var Fa=function(){let i=Rr();return function(t,e,n,r,s,o){let a,c;for(e||(e=2),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],s(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function Xi(i,t,e){let n=t[0],r=t[1],s=e[3]*n+e[7]*r||1;return i[0]=(e[0]*n+e[4]*r)/s,i[1]=(e[1]*n+e[5]*r)/s,i}function ce(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s||1;return i[0]=(e[0]*n+e[4]*r+e[8]*s)/o,i[1]=(e[1]*n+e[5]*r+e[9]*s)/o,i[2]=(e[2]*n+e[6]*r+e[10]*s)/o,i}function qi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[2]*r,i[1]=e[1]*n+e[3]*r,i[2]=t[2],i}function Nr(){let i=new et(3);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Dr(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Hi(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-s*a,i[1]=s*o-n*c,i[2]=n*a-r*o,i}function he(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s+e[15];return o=o||1,i[0]=(e[0]*n+e[4]*r+e[8]*s+e[12])/o,i[1]=(e[1]*n+e[5]*r+e[9]*s+e[13])/o,i[2]=(e[2]*n+e[6]*r+e[10]*s+e[14])/o,i}function Wi(i,t,e){let n=t[0],r=t[1],s=t[2];return i[0]=n*e[0]+r*e[3]+s*e[6],i[1]=n*e[1]+r*e[4]+s*e[7],i[2]=n*e[2]+r*e[5]+s*e[8],i}function Yi(i,t,e){let n=e[0],r=e[1],s=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-s*c,d=s*a-n*h,u=n*c-r*a,g=r*u-s*d,p=s*l-n*u,f=n*d-r*l,y=o*2;return l*=y,d*=y,u*=y,g*=2,p*=2,f*=2,i[0]=a+l+g,i[1]=c+d+p,i[2]=h+u+f,i}function Ki(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0],s[1]=r[1]*Math.cos(n)-r[2]*Math.sin(n),s[2]=r[1]*Math.sin(n)+r[2]*Math.cos(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Zi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[2]*Math.sin(n)+r[0]*Math.cos(n),s[1]=r[1],s[2]=r[2]*Math.cos(n)-r[0]*Math.sin(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Qi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0]*Math.cos(n)-r[1]*Math.sin(n),s[1]=r[0]*Math.sin(n)+r[1]*Math.cos(n),s[2]=r[2],i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Ji(i,t){let e=i[0],n=i[1],r=i[2],s=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+n*n+r*r)*(s*s+o*o+a*a)),h=c&&Dr(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var ja=function(){let i=Nr();return function(t,e,n,r,s,o){let a,c;for(e||(e=3),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var Ke=[0,0,0],le,H=class extends ae{static get ZERO(){return le||(le=new H(0,0,0),Object.freeze(le)),le}constructor(t=0,e=0,n=0){super(-0,-0,-0),arguments.length===1&&vt(t)?this.copy(t):(j.debug&&(X(t),X(e),X(n)),this[0]=t,this[1]=e,this[2]=n)}set(t,e,n){return this[0]=t,this[1]=e,this[2]=n,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return j.debug&&(X(t.x),X(t.y),X(t.z)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this.check()}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t}get ELEMENTS(){return 3}get z(){return this[2]}set z(t){this[2]=X(t)}angle(t){return Ji(this,t)}cross(t){return Hi(this,this,t),this.check()}rotateX({radians:t,origin:e=Ke}){return Ki(this,this,e,t),this.check()}rotateY({radians:t,origin:e=Ke}){return Zi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=Ke}){return Qi(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return he(this,this,t),this.check()}transformAsVector(t){return ce(this,this,t),this.check()}transformByMatrix3(t){return Wi(this,this,t),this.check()}transformByMatrix2(t){return qi(this,this,t),this.check()}transformByQuaternion(t){return Yi(this,this,t),this.check()}};var de=class extends wt{toString(){let t="[";if(j.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let n=0;n<this.RANK;++n)t+=` ${this[n*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,n){return this[e*this.RANK+t]=X(n),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[n+r];return e}setColumn(t,e){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)this[n+r]=e[r];return this}};function Fr(i){return i[0]=1,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=1,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function tn(i,t){if(i===t){let e=t[1],n=t[2],r=t[3],s=t[6],o=t[7],a=t[11];i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=e,i[6]=t[9],i[7]=t[13],i[8]=n,i[9]=s,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function en(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],u=t[10],g=t[11],p=t[12],f=t[13],y=t[14],M=t[15],I=e*a-n*o,m=e*c-r*o,x=e*h-s*o,b=n*c-r*a,_=n*h-s*a,T=r*h-s*c,E=l*f-d*p,L=l*y-u*p,O=l*M-g*p,v=d*y-u*f,P=d*M-g*f,C=u*M-g*y,A=I*C-m*P+x*v+b*O-_*L+T*E;return A?(A=1/A,i[0]=(a*C-c*P+h*v)*A,i[1]=(r*P-n*C-s*v)*A,i[2]=(f*T-y*_+M*b)*A,i[3]=(u*_-d*T-g*b)*A,i[4]=(c*O-o*C-h*L)*A,i[5]=(e*C-r*O+s*L)*A,i[6]=(y*x-p*T-M*m)*A,i[7]=(l*T-u*x+g*m)*A,i[8]=(o*P-a*O+h*E)*A,i[9]=(n*O-e*P-s*E)*A,i[10]=(p*_-f*x+M*I)*A,i[11]=(d*x-l*_-g*I)*A,i[12]=(a*L-o*v-c*E)*A,i[13]=(e*v-n*L+r*E)*A,i[14]=(f*m-p*b-y*I)*A,i[15]=(l*b-d*m+u*I)*A,i):null}function nn(i){let t=i[0],e=i[1],n=i[2],r=i[3],s=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],d=i[10],u=i[11],g=i[12],p=i[13],f=i[14],y=i[15],M=t*o-e*s,I=t*a-n*s,m=e*a-n*o,x=h*p-l*g,b=h*f-d*g,_=l*f-d*p,T=t*_-e*b+n*x,E=s*_-o*b+a*x,L=h*m-l*I+d*M,O=g*m-p*I+f*M;return c*T-r*E+y*L-u*O}function Ze(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],u=t[9],g=t[10],p=t[11],f=t[12],y=t[13],M=t[14],I=t[15],m=e[0],x=e[1],b=e[2],_=e[3];return i[0]=m*n+x*a+b*d+_*f,i[1]=m*r+x*c+b*u+_*y,i[2]=m*s+x*h+b*g+_*M,i[3]=m*o+x*l+b*p+_*I,m=e[4],x=e[5],b=e[6],_=e[7],i[4]=m*n+x*a+b*d+_*f,i[5]=m*r+x*c+b*u+_*y,i[6]=m*s+x*h+b*g+_*M,i[7]=m*o+x*l+b*p+_*I,m=e[8],x=e[9],b=e[10],_=e[11],i[8]=m*n+x*a+b*d+_*f,i[9]=m*r+x*c+b*u+_*y,i[10]=m*s+x*h+b*g+_*M,i[11]=m*o+x*l+b*p+_*I,m=e[12],x=e[13],b=e[14],_=e[15],i[12]=m*n+x*a+b*d+_*f,i[13]=m*r+x*c+b*u+_*y,i[14]=m*s+x*h+b*g+_*M,i[15]=m*o+x*l+b*p+_*I,i}function rn(i,t,e){let n=e[0],r=e[1],s=e[2],o,a,c,h,l,d,u,g,p,f,y,M;return t===i?(i[12]=t[0]*n+t[4]*r+t[8]*s+t[12],i[13]=t[1]*n+t[5]*r+t[9]*s+t[13],i[14]=t[2]*n+t[6]*r+t[10]*s+t[14],i[15]=t[3]*n+t[7]*r+t[11]*s+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],u=t[6],g=t[7],p=t[8],f=t[9],y=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=d,i[6]=u,i[7]=g,i[8]=p,i[9]=f,i[10]=y,i[11]=M,i[12]=o*n+l*r+p*s+t[12],i[13]=a*n+d*r+f*s+t[13],i[14]=c*n+u*r+y*s+t[14],i[15]=h*n+g*r+M*s+t[15]),i}function sn(i,t,e){let n=e[0],r=e[1],s=e[2];return i[0]=t[0]*n,i[1]=t[1]*n,i[2]=t[2]*n,i[3]=t[3]*n,i[4]=t[4]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*s,i[9]=t[9]*s,i[10]=t[10]*s,i[11]=t[11]*s,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function on(i,t,e,n){let r=n[0],s=n[1],o=n[2],a=Math.sqrt(r*r+s*s+o*o),c,h,l,d,u,g,p,f,y,M,I,m,x,b,_,T,E,L,O,v,P,C,A,B;return a<1e-6?null:(a=1/a,r*=a,s*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],u=t[1],g=t[2],p=t[3],f=t[4],y=t[5],M=t[6],I=t[7],m=t[8],x=t[9],b=t[10],_=t[11],T=r*r*l+c,E=s*r*l+o*h,L=o*r*l-s*h,O=r*s*l-o*h,v=s*s*l+c,P=o*s*l+r*h,C=r*o*l+s*h,A=s*o*l-r*h,B=o*o*l+c,i[0]=d*T+f*E+m*L,i[1]=u*T+y*E+x*L,i[2]=g*T+M*E+b*L,i[3]=p*T+I*E+_*L,i[4]=d*O+f*v+m*P,i[5]=u*O+y*v+x*P,i[6]=g*O+M*v+b*P,i[7]=p*O+I*v+_*P,i[8]=d*C+f*A+m*B,i[9]=u*C+y*A+x*B,i[10]=g*C+M*A+b*B,i[11]=p*C+I*A+_*B,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function an(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[4]=s*r+h*n,i[5]=o*r+l*n,i[6]=a*r+d*n,i[7]=c*r+u*n,i[8]=h*r-s*n,i[9]=l*r-o*n,i[10]=d*r-a*n,i[11]=u*r-c*n,i}function cn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[8],l=t[9],d=t[10],u=t[11];return t!==i&&(i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r-h*n,i[1]=o*r-l*n,i[2]=a*r-d*n,i[3]=c*r-u*n,i[8]=s*n+h*r,i[9]=o*n+l*r,i[10]=a*n+d*r,i[11]=c*n+u*r,i}function hn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[4],l=t[5],d=t[6],u=t[7];return t!==i&&(i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r+h*n,i[1]=o*r+l*n,i[2]=a*r+d*n,i[3]=c*r+u*n,i[4]=h*r-s*n,i[5]=l*r-o*n,i[6]=d*r-a*n,i[7]=u*r-c*n,i}function ln(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=e+e,a=n+n,c=r+r,h=e*o,l=n*o,d=n*a,u=r*o,g=r*a,p=r*c,f=s*o,y=s*a,M=s*c;return i[0]=1-d-p,i[1]=l+M,i[2]=u-y,i[3]=0,i[4]=l-M,i[5]=1-h-p,i[6]=g+f,i[7]=0,i[8]=u+y,i[9]=g-f,i[10]=1-h-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function dn(i,t,e,n,r,s,o){let a=1/(e-t),c=1/(r-n),h=1/(s-o);return i[0]=s*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+n)*c,i[10]=(o+s)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*s*2*h,i[15]=0,i}function Br(i,t,e,n,r){let s=1/Math.tan(t/2);if(i[0]=s/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(n-r);i[10]=(r+n)*o,i[14]=2*r*n*o}else i[10]=-1,i[14]=-2*n;return i}var un=Br;function zr(i,t,e,n,r,s,o){let a=1/(t-e),c=1/(n-r),h=1/(s-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+n)*c,i[14]=(o+s)*h,i[15]=1,i}var fn=zr;function mn(i,t,e,n){let r,s,o,a,c,h,l,d,u,g,p=t[0],f=t[1],y=t[2],M=n[0],I=n[1],m=n[2],x=e[0],b=e[1],_=e[2];return Math.abs(p-x)<1e-6&&Math.abs(f-b)<1e-6&&Math.abs(y-_)<1e-6?Fr(i):(d=p-x,u=f-b,g=y-_,r=1/Math.sqrt(d*d+u*u+g*g),d*=r,u*=r,g*=r,s=I*g-m*u,o=m*d-M*g,a=M*u-I*d,r=Math.sqrt(s*s+o*o+a*a),r?(r=1/r,s*=r,o*=r,a*=r):(s=0,o=0,a=0),c=u*a-g*o,h=g*s-d*a,l=d*o-u*s,r=Math.sqrt(c*c+h*h+l*l),r?(r=1/r,c*=r,h*=r,l*=r):(c=0,h=0,l=0),i[0]=s,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=h,i[6]=u,i[7]=0,i[8]=a,i[9]=l,i[10]=g,i[11]=0,i[12]=-(s*p+o*f+a*y),i[13]=-(c*p+h*f+l*y),i[14]=-(d*p+u*f+g*y),i[15]=1,i)}function jr(){let i=new et(4);return et!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function pn(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3];return i[0]=e[0]*n+e[4]*r+e[8]*s+e[12]*o,i[1]=e[1]*n+e[5]*r+e[9]*s+e[13]*o,i[2]=e[2]*n+e[6]*r+e[10]*s+e[14]*o,i[3]=e[3]*n+e[7]*r+e[11]*s+e[15]*o,i}var Ja=function(){let i=jr();return function(t,e,n,r,s,o){let a,c;for(e||(e=4),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2],t[a+3]=i[3];return t}}();var ti;(function(i){i[i.COL0ROW0=0]="COL0ROW0",i[i.COL0ROW1=1]="COL0ROW1",i[i.COL0ROW2=2]="COL0ROW2",i[i.COL0ROW3=3]="COL0ROW3",i[i.COL1ROW0=4]="COL1ROW0",i[i.COL1ROW1=5]="COL1ROW1",i[i.COL1ROW2=6]="COL1ROW2",i[i.COL1ROW3=7]="COL1ROW3",i[i.COL2ROW0=8]="COL2ROW0",i[i.COL2ROW1=9]="COL2ROW1",i[i.COL2ROW2=10]="COL2ROW2",i[i.COL2ROW3=11]="COL2ROW3",i[i.COL3ROW0=12]="COL3ROW0",i[i.COL3ROW1=13]="COL3ROW1",i[i.COL3ROW2=14]="COL3ROW2",i[i.COL3ROW3=15]="COL3ROW3"})(ti||(ti={}));var Gr=45*Math.PI/180,Ur=1,Qe=.1,Je=500,$r=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),q=class extends de{static get IDENTITY(){return Xr()}static get ZERO(){return Vr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return ti}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=e,this[2]=n,this[3]=r,this[4]=s,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=u,this[12]=g,this[13]=p,this[14]=f,this[15]=y,this.check()}setRowMajor(t,e,n,r,s,o,a,c,h,l,d,u,g,p,f,y){return this[0]=t,this[1]=s,this[2]=h,this[3]=g,this[4]=e,this[5]=o,this[6]=l,this[7]=p,this[8]=n,this[9]=a,this[10]=d,this[11]=f,this[12]=r,this[13]=c,this[14]=u,this[15]=y,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy($r)}fromObject(t){return this.check()}fromQuaternion(t){return ln(this,t),this.check()}frustum(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return a===1/0?qr(this,e,n,r,s,o):dn(this,e,n,r,s,o,a),this.check()}lookAt(t){let{eye:e,center:n=[0,0,0],up:r=[0,1,0]}=t;return mn(this,e,n,r),this.check()}ortho(t){let{left:e,right:n,bottom:r,top:s,near:o=Qe,far:a=Je}=t;return fn(this,e,n,r,s,o,a),this.check()}orthographic(t){let{fovy:e=Gr,aspect:n=Ur,focalDistance:r=1,near:s=Qe,far:o=Je}=t;gn(e);let a=e/2,c=r*Math.tan(a),h=c*n;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:s,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:n=1,near:r=.1,far:s=500}=t;return gn(e),un(this,e,n,r,s),this.check()}determinant(){return nn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*s,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*s,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*s,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*s,t[8]=this[10]*o,t}transpose(){return tn(this,this),this.check()}invert(){return en(this,this),this.check()}multiplyLeft(t){return Ze(this,t,this),this.check()}multiplyRight(t){return Ze(this,this,t),this.check()}rotateX(t){return an(this,this,t),this.check()}rotateY(t){return cn(this,this,t),this.check()}rotateZ(t){return hn(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return on(this,this,t,e),this.check()}scale(t){return sn(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return rn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=pn(e||[-0,-0,-0,-0],t,this),oe(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:n}=t,r;switch(n){case 2:r=Vi(e||[-0,-0],t,this);break;case 3:r=he(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(r,t.length),r}transformAsVector(t,e){let n;switch(t.length){case 2:n=Xi(e||[-0,-0],t,this);break;case 3:n=ce(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return oe(n,t.length),n}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,n){return this.identity().translate([t,e,n])}},ue,fe;function Vr(){return ue||(ue=new q([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(ue)),ue}function Xr(){return fe||(fe=new q,Object.freeze(fe)),fe}function gn(i){if(i>Math.PI*2)throw Error("expected radians")}function qr(i,t,e,n,r,s){let o=2*s/(e-t),a=2*s/(r-n),c=(e+t)/(e-t),h=(r+n)/(r-n),l=-1,d=-1,u=-2*s;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=d,i[12]=0,i[13]=0,i[14]=u,i[15]=0,i}var Hr=.02,Wr=.12,Yr=.15,Kr=.2,ni=[0,1,0],Zr=[255,255,255],Qr=1,ei=.35,ii=255,Jr=1,ts=.01,es={depthCompare:"less-equal",depthWriteEnabled:!1,cullMode:"none"},is=[{name:"instancePosition",format:"float32x3",stepMode:"instance"},{name:"instanceDirection",format:"float32x3",stepMode:"instance"},{name:"instanceScale",format:"float32x3",stepMode:"instance"},{name:"instanceColor",format:"float32x4",stepMode:"instance"}],ns={name:"lightMarker",props:{},uniforms:{},uniformTypes:{viewProjectionMatrix:"mat4x4<f32>"}},rs="inputs.positions * inputs.instanceScale",ss="vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)",os="positions * instanceScale",as="vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)",ot=class extends W{lightModelProps;_instanceData;_managedBuffers;buildInstanceData;sizePropNames;constructor(t,e,n){let r=n.buildInstanceData(e),s=xn(t,e.id||n.idPrefix,r),o=new $({lightMarker:ns});o.setProps({lightMarker:{viewProjectionMatrix:bn(e)}});let{source:a,vs:c,fs:h}=us(n.anchorMode),l=e;super(t,{...l,id:e.id||n.idPrefix,source:a,vs:c,fs:h,geometry:n.geometry,shaderInputs:o,bufferLayout:[...is],attributes:s,instanceCount:r.instanceCount,parameters:Mn(e.parameters)}),this.lightModelProps=e,this._instanceData=r,this._managedBuffers=s,this.buildInstanceData=n.buildInstanceData,this.sizePropNames=n.sizePropNames}destroy(){super.destroy(),yn(this._managedBuffers),this._managedBuffers={}}draw(t){return this.instanceCount===0?!0:super.draw(t)}setProps(t){this.lightModelProps={...this.lightModelProps,...t},t.parameters&&this.setParameters(Mn(this.lightModelProps.parameters)),("viewMatrix"in t||"projectionMatrix"in t)&&(this.shaderInputs.setProps({lightMarker:{viewProjectionMatrix:bn(this.lightModelProps)}}),this.setNeedsRedraw("lightMarker camera")),ds(t,this.sizePropNames)&&this.rebuildInstanceData()}rebuildInstanceData(){let t=this.buildInstanceData(this.lightModelProps),e=xn(this.device,this.id,t);this.setAttributes(e),this.setInstanceCount(t.instanceCount),yn(this._managedBuffers),this._managedBuffers=e,this._instanceData=t}};function _n(i){let t=wn(i.lights),e=ri(i),n=i.pointLightRadius??Hr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>({color:si(r),direction:ni,position:r.position,scale:[n,n,n]}),t)}function In(i){let t=An(i.lights),e=ri(i),n=i.spotLightLength??Wr*e.sceneScale*e.markerScale;return oi(t.length,(r,s)=>{let o=jt(r.outerConeAngle??Math.PI/4,0,Math.PI/2-ts),a=Math.tan(o)*n;return{color:si(r),direction:Tn(r.direction),position:r.position,scale:[a,n,a]}},t)}function vn(i){let t=cs(i.lights),e=ri(i),n=i.directionalLightLength??Yr*e.sceneScale*e.markerScale,r=n*Kr;return oi(t.length,(s,o)=>{let a=Tn(s.direction),c=[e.sceneCenter[0]-a[0]*e.sceneScale*ei,e.sceneCenter[1]-a[1]*e.sceneScale*ei,e.sceneCenter[2]-a[2]*e.sceneScale*ei];return{color:si(s),direction:a,position:c,scale:[r,n,r]}},t)}function wn(i){return i.filter(t=>t.type==="point")}function An(i){return i.filter(t=>t.type==="spot")}function cs(i){return i.filter(t=>t.type==="directional")}function ri(i){let t=hs(i.lights,i.bounds),e=[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2,(t[0][2]+t[1][2])/2],n=Math.max(Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1],t[1][2]-t[0][2]),Jr);return{bounds:t,markerScale:Math.max(i.markerScale??Qr,0),sceneCenter:e,sceneScale:n}}function si(i){let t=i.color||Zr,e=Math.max(i.intensity??1,0),n=jt(.35+.3*Math.log10(e+1),.35,1);return[jt(t[0]/ii,0,1)*n,jt(t[1]/ii,0,1)*n,jt(t[2]/ii,0,1)*n,1]}function Tn(i){let[t,e,n]=i||ni,r=Math.hypot(t,e,n);return r===0?[...ni]:[t/r,e/r,n/r]}function oi(i,t,e=[]){let n=new Float32Array(i*3),r=new Float32Array(i*3),s=new Float32Array(i*3),o=new Float32Array(i*4);for(let[a,c]of e.entries()){let h=t(c,a);n.set(h.position,a*3),r.set(h.direction,a*3),s.set(h.scale,a*3),o.set(h.color,a*4)}return{instanceCount:i,instancePositions:n,instanceDirections:r,instanceScales:s,instanceColors:o}}function hs(i,t){if(t)return ls(t);let e=[...wn(i).map(s=>s.position),...An(i).map(s=>s.position)];if(e.length===0)return[[-.5,-.5,-.5],[.5,.5,.5]];let n=[...e[0]],r=[...e[0]];for(let s of e.slice(1))n[0]=Math.min(n[0],s[0]),n[1]=Math.min(n[1],s[1]),n[2]=Math.min(n[2],s[2]),r[0]=Math.max(r[0],s[0]),r[1]=Math.max(r[1],s[1]),r[2]=Math.max(r[2],s[2]);return[n,r]}function ls(i){return[[...i[0]],[...i[1]]]}function xn(i,t,e){return{instancePosition:i.createBuffer({id:`${t}-instance-position`,data:me(e.instancePositions,3)}),instanceDirection:i.createBuffer({id:`${t}-instance-direction`,data:me(e.instanceDirections,3)}),instanceScale:i.createBuffer({id:`${t}-instance-scale`,data:me(e.instanceScales,3)}),instanceColor:i.createBuffer({id:`${t}-instance-color`,data:me(e.instanceColors,4)})}}function me(i,t){return i.length>0?i:new Float32Array(t)}function yn(i){for(let t of Object.values(i))t?.destroy()}function bn(i){return new q(i.projectionMatrix).multiplyRight(i.viewMatrix)}function ds(i,t){return"lights"in i||"bounds"in i||"markerScale"in i?!0:t.some(e=>e in i)}function Mn(i){return{...es,...i||{}}}function us(i){let t=i==="apex"?ss:rs,e=i==="apex"?as:os;return{source:`struct lightMarkerUniforms {
|
|
84
|
+
`,Mt=class extends st{backgroundTexture=null;constructor(t,e){if(super(t,{...e,id:e.id||"background-texture-model",source:kr,fs:Nr,modules:[...e.modules||[],Rr],parameters:{depthWriteEnabled:!1,...e.parameters||{},...e.blend?{blend:!0,blendColorOperation:"add",blendAlphaOperation:"add",blendColorSrcFactor:"one-minus-dst-alpha",blendColorDstFactor:"one",blendAlphaSrcFactor:"one-minus-dst-alpha",blendAlphaDstFactor:"one"}:{}}}),!e.backgroundTexture)throw new Error("BackgroundTextureModel requires a backgroundTexture prop");this.setProps(e)}setProps(t){let{backgroundTexture:e}=t;if(e)if(this.setBindings({backgroundTexture:e}),e.isReady){let n=e instanceof B?e.texture:e;this.backgroundTexture=n,this.updateScale(n)}else e.ready.then(n=>{this.backgroundTexture=n,this.updateScale(n)})}predraw(){super.predraw()}updateScale(t){if(!t){this.shaderInputs.setProps({background:{scale:[1,1]}});return}let[e,n]=this.device.getCanvasContext().getDrawingBufferSize(),r=t.width,s=t.height,o=e/n,a=r/s,c=1,h=1;o>a?h=o/a:c=a/o,this.shaderInputs.setProps({background:{scale:[c,h]}})}};var _t=class extends ${constructor(t={}){let{id:e=S("sphere-geometry")}=t,{indices:n,attributes:r}=Dr(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Dr(i){let{nlat:t=10,nlong:e=10}=i,s=Math.PI-0,o=0,c=2*Math.PI-o,h=(t+1)*(e+1),l=(M,I,m,x,y)=>i.radius||1,d=new Float32Array(h*3),f=new Float32Array(h*3),p=new Float32Array(h*2),g=h>65535?Uint32Array:Uint16Array,u=new g(t*e*6);for(let M=0;M<=t;M++)for(let I=0;I<=e;I++){let m=I/e,x=M/t,y=I+M*(e+1),_=y*2,T=y*3,C=c*m,E=s*x,O=Math.sin(C),v=Math.cos(C),P=Math.sin(E),L=Math.cos(E),A=v*P,F=L,J=O*P,K=l(A,F,J,m,x);d[T+0]=K*A,d[T+1]=K*F,d[T+2]=K*J,f[T+0]=A,f[T+1]=F,f[T+2]=J,p[_+0]=m,p[_+1]=1-x}let b=e+1;for(let M=0;M<e;M++)for(let I=0;I<t;I++){let m=(M*t+I)*6;u[m+0]=I*b+M,u[m+1]=I*b+M+1,u[m+2]=(I+1)*b+M,u[m+3]=(I+1)*b+M,u[m+4]=I*b+M+1,u[m+5]=(I+1)*b+M+1}return{indices:{size:1,value:u},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:p}}}}var La=1/Math.PI*180,Ca=1/180*Math.PI,Fr={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Fr}};var z=globalThis.mathgl.config;function Gi(i,{precision:t=z.precision}={}){return i=Br(i),`${parseFloat(i.toPrecision(t))}`}function It(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function Xe(i,t,e){let n=z.EPSILON;e&&(z.EPSILON=e);try{if(i===t)return!0;if(It(i)&&It(t)){if(i.length!==t.length)return!1;for(let r=0;r<i.length;++r)if(!Xe(i[r],t[r]))return!1;return!0}return i&&i.equals?i.equals(t):t&&t.equals?t.equals(i):typeof i=="number"&&typeof t=="number"?Math.abs(i-t)<=z.EPSILON*Math.max(1,Math.abs(i),Math.abs(t)):!1}finally{z.EPSILON=n}}function Br(i){return Math.round(i/z.EPSILON)*z.EPSILON}var vt=class extends Array{clone(){return new this.constructor().copy(this)}fromArray(t,e=0){for(let n=0;n<this.ELEMENTS;++n)this[n]=t[n+e];return this.check()}toArray(t=[],e=0){for(let n=0;n<this.ELEMENTS;++n)t[e+n]=this[n];return t}toObject(t){return t}from(t){return Array.isArray(t)?this.copy(t):this.fromObject(t)}to(t){return t===this?this:It(t)?this.toArray(t):this.toObject(t)}toTarget(t){return t?this.to(t):this}toFloat32Array(){return new Float32Array(this)}toString(){return this.formatString(z)}formatString(t){let e="";for(let n=0;n<this.ELEMENTS;++n)e+=(n>0?", ":"")+Gi(this[n],t);return`${t.printTypes?this.constructor.name:""}[${e}]`}equals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(!Xe(this[e],t[e]))return!1;return!0}exactEquals(t){if(!t||this.length!==t.length)return!1;for(let e=0;e<this.ELEMENTS;++e)if(this[e]!==t[e])return!1;return!0}negate(){for(let t=0;t<this.ELEMENTS;++t)this[t]=-this[t];return this.check()}lerp(t,e,n){if(n===void 0)return this.lerp(this,t,e);for(let r=0;r<this.ELEMENTS;++r){let s=t[r],o=typeof e=="number"?e:e[r];this[r]=s+n*(o-s)}return this.check()}min(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.min(t[e],this[e]);return this.check()}max(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=Math.max(t[e],this[e]);return this.check()}clamp(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t[n]),e[n]);return this.check()}add(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]+=e[n];return this.check()}subtract(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]-=e[n];return this.check()}scale(t){if(typeof t=="number")for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;else for(let e=0;e<this.ELEMENTS&&e<t.length;++e)this[e]*=t[e];return this.check()}multiplyByScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}check(){if(z.debug&&!this.validate())throw new Error(`math.gl: ${this.constructor.name} some fields set to invalid numbers'`);return this}validate(){let t=this.length===this.ELEMENTS;for(let e=0;e<this.ELEMENTS;++e)t=t&&Number.isFinite(this[e]);return t}sub(t){return this.subtract(t)}setScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]=t;return this.check()}addScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]+=t;return this.check()}subScalar(t){return this.addScalar(-t)}multiplyScalar(t){for(let e=0;e<this.ELEMENTS;++e)this[e]*=t;return this.check()}divideScalar(t){return this.multiplyByScalar(1/t)}clampScalar(t,e){for(let n=0;n<this.ELEMENTS;++n)this[n]=Math.min(Math.max(this[n],t),e);return this.check()}get elements(){return this}};function zr(i,t){if(i.length!==t)return!1;for(let e=0;e<i.length;++e)if(!Number.isFinite(i[e]))return!1;return!0}function V(i){if(!Number.isFinite(i))throw new Error(`Invalid number ${JSON.stringify(i)}`);return i}function se(i,t,e=""){if(z.debug&&!zr(i,t))throw new Error(`math.gl: ${e} some fields set to invalid numbers'`);return i}function qe(i,t){if(!i)throw new Error(`math.gl assertion ${t}`)}var oe=class extends vt{get x(){return this[0]}set x(t){this[0]=V(t)}get y(){return this[1]}set y(t){this[1]=V(t)}len(){return Math.sqrt(this.lengthSquared())}magnitude(){return this.len()}lengthSquared(){let t=0;for(let e=0;e<this.ELEMENTS;++e)t+=this[e]*this[e];return t}magnitudeSquared(){return this.lengthSquared()}distance(t){return Math.sqrt(this.distanceSquared(t))}distanceSquared(t){let e=0;for(let n=0;n<this.ELEMENTS;++n){let r=this[n]-t[n];e+=r*r}return V(e)}dot(t){let e=0;for(let n=0;n<this.ELEMENTS;++n)e+=this[n]*t[n];return V(e)}normalize(){let t=this.magnitude();if(t!==0)for(let e=0;e<this.ELEMENTS;++e)this[e]/=t;return this.check()}multiply(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]*=e[n];return this.check()}divide(...t){for(let e of t)for(let n=0;n<this.ELEMENTS;++n)this[n]/=e[n];return this.check()}lengthSq(){return this.lengthSquared()}distanceTo(t){return this.distance(t)}distanceToSquared(t){return this.distanceSquared(t)}getComponent(t){return qe(t>=0&&t<this.ELEMENTS,"index is out of range"),V(this[t])}setComponent(t,e){return qe(t>=0&&t<this.ELEMENTS,"index is out of range"),this[t]=e,this.check()}addVectors(t,e){return this.copy(t).add(e)}subVectors(t,e){return this.copy(t).subtract(e)}multiplyVectors(t,e){return this.copy(t).multiply(e)}addScaledVector(t,e){return this.add(new this.constructor(t).multiplyScalar(e))}};var tt=typeof Float32Array<"u"?Float32Array:Array;var Ga=Math.PI/180;function jr(){let i=new tt(2);return tt!=Float32Array&&(i[0]=0,i[1]=0),i}function Xi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[4]*r+e[12],i[1]=e[1]*n+e[5]*r+e[13],i}var $a=function(){let i=jr();return function(t,e,n,r,s,o){let a,c;for(e||(e=2),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],s(i,i,o),t[a]=i[0],t[a+1]=i[1];return t}}();function qi(i,t,e){let n=t[0],r=t[1],s=e[3]*n+e[7]*r||1;return i[0]=(e[0]*n+e[4]*r)/s,i[1]=(e[1]*n+e[5]*r)/s,i}function ae(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s||1;return i[0]=(e[0]*n+e[4]*r+e[8]*s)/o,i[1]=(e[1]*n+e[5]*r+e[9]*s)/o,i[2]=(e[2]*n+e[6]*r+e[10]*s)/o,i}function Hi(i,t,e){let n=t[0],r=t[1];return i[0]=e[0]*n+e[2]*r,i[1]=e[1]*n+e[3]*r,i[2]=t[2],i}function Ur(){let i=new tt(3);return tt!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function Gr(i,t){return i[0]*t[0]+i[1]*t[1]+i[2]*t[2]}function Wi(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[0],a=e[1],c=e[2];return i[0]=r*c-s*a,i[1]=s*o-n*c,i[2]=n*a-r*o,i}function ce(i,t,e){let n=t[0],r=t[1],s=t[2],o=e[3]*n+e[7]*r+e[11]*s+e[15];return o=o||1,i[0]=(e[0]*n+e[4]*r+e[8]*s+e[12])/o,i[1]=(e[1]*n+e[5]*r+e[9]*s+e[13])/o,i[2]=(e[2]*n+e[6]*r+e[10]*s+e[14])/o,i}function Yi(i,t,e){let n=t[0],r=t[1],s=t[2];return i[0]=n*e[0]+r*e[3]+s*e[6],i[1]=n*e[1]+r*e[4]+s*e[7],i[2]=n*e[2]+r*e[5]+s*e[8],i}function Ki(i,t,e){let n=e[0],r=e[1],s=e[2],o=e[3],a=t[0],c=t[1],h=t[2],l=r*h-s*c,d=s*a-n*h,f=n*c-r*a,p=r*f-s*d,g=s*l-n*f,u=n*d-r*l,b=o*2;return l*=b,d*=b,f*=b,p*=2,g*=2,u*=2,i[0]=a+l+p,i[1]=c+d+g,i[2]=h+f+u,i}function Zi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0],s[1]=r[1]*Math.cos(n)-r[2]*Math.sin(n),s[2]=r[1]*Math.sin(n)+r[2]*Math.cos(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Qi(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[2]*Math.sin(n)+r[0]*Math.cos(n),s[1]=r[1],s[2]=r[2]*Math.cos(n)-r[0]*Math.sin(n),i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function Ji(i,t,e,n){let r=[],s=[];return r[0]=t[0]-e[0],r[1]=t[1]-e[1],r[2]=t[2]-e[2],s[0]=r[0]*Math.cos(n)-r[1]*Math.sin(n),s[1]=r[0]*Math.sin(n)+r[1]*Math.cos(n),s[2]=r[2],i[0]=s[0]+e[0],i[1]=s[1]+e[1],i[2]=s[2]+e[2],i}function tn(i,t){let e=i[0],n=i[1],r=i[2],s=t[0],o=t[1],a=t[2],c=Math.sqrt((e*e+n*n+r*r)*(s*s+o*o+a*a)),h=c&&Gr(i,t)/c;return Math.acos(Math.min(Math.max(h,-1),1))}var qa=function(){let i=Ur();return function(t,e,n,r,s,o){let a,c;for(e||(e=3),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2];return t}}();var We=[0,0,0],he,q=class extends oe{static get ZERO(){return he||(he=new q(0,0,0),Object.freeze(he)),he}constructor(t=0,e=0,n=0){super(-0,-0,-0),arguments.length===1&&It(t)?this.copy(t):(z.debug&&(V(t),V(e),V(n)),this[0]=t,this[1]=e,this[2]=n)}set(t,e,n){return this[0]=t,this[1]=e,this[2]=n,this.check()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this.check()}fromObject(t){return z.debug&&(V(t.x),V(t.y),V(t.z)),this[0]=t.x,this[1]=t.y,this[2]=t.z,this.check()}toObject(t){return t.x=this[0],t.y=this[1],t.z=this[2],t}get ELEMENTS(){return 3}get z(){return this[2]}set z(t){this[2]=V(t)}angle(t){return tn(this,t)}cross(t){return Wi(this,this,t),this.check()}rotateX({radians:t,origin:e=We}){return Zi(this,this,e,t),this.check()}rotateY({radians:t,origin:e=We}){return Qi(this,this,e,t),this.check()}rotateZ({radians:t,origin:e=We}){return Ji(this,this,e,t),this.check()}transform(t){return this.transformAsPoint(t)}transformAsPoint(t){return ce(this,this,t),this.check()}transformAsVector(t){return ae(this,this,t),this.check()}transformByMatrix3(t){return Yi(this,this,t),this.check()}transformByMatrix2(t){return Hi(this,this,t),this.check()}transformByQuaternion(t){return Ki(this,this,t),this.check()}};var le=class extends vt{toString(){let t="[";if(z.printRowMajor){t+="row-major:";for(let e=0;e<this.RANK;++e)for(let n=0;n<this.RANK;++n)t+=` ${this[n*this.RANK+e]}`}else{t+="column-major:";for(let e=0;e<this.ELEMENTS;++e)t+=` ${this[e]}`}return t+="]",t}getElementIndex(t,e){return e*this.RANK+t}getElement(t,e){return this[e*this.RANK+t]}setElement(t,e,n){return this[e*this.RANK+t]=V(n),this}getColumn(t,e=new Array(this.RANK).fill(-0)){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)e[r]=this[n+r];return e}setColumn(t,e){let n=t*this.RANK;for(let r=0;r<this.RANK;++r)this[n+r]=e[r];return this}};function $r(i){return i[0]=1,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=1,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=1,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function en(i,t){if(i===t){let e=t[1],n=t[2],r=t[3],s=t[6],o=t[7],a=t[11];i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=e,i[6]=t[9],i[7]=t[13],i[8]=n,i[9]=s,i[11]=t[14],i[12]=r,i[13]=o,i[14]=a}else i[0]=t[0],i[1]=t[4],i[2]=t[8],i[3]=t[12],i[4]=t[1],i[5]=t[5],i[6]=t[9],i[7]=t[13],i[8]=t[2],i[9]=t[6],i[10]=t[10],i[11]=t[14],i[12]=t[3],i[13]=t[7],i[14]=t[11],i[15]=t[15];return i}function nn(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=t[4],a=t[5],c=t[6],h=t[7],l=t[8],d=t[9],f=t[10],p=t[11],g=t[12],u=t[13],b=t[14],M=t[15],I=e*a-n*o,m=e*c-r*o,x=e*h-s*o,y=n*c-r*a,_=n*h-s*a,T=r*h-s*c,C=l*u-d*g,E=l*b-f*g,O=l*M-p*g,v=d*b-f*u,P=d*M-p*u,L=f*M-p*b,A=I*L-m*P+x*v+y*O-_*E+T*C;return A?(A=1/A,i[0]=(a*L-c*P+h*v)*A,i[1]=(r*P-n*L-s*v)*A,i[2]=(u*T-b*_+M*y)*A,i[3]=(f*_-d*T-p*y)*A,i[4]=(c*O-o*L-h*E)*A,i[5]=(e*L-r*O+s*E)*A,i[6]=(b*x-g*T-M*m)*A,i[7]=(l*T-f*x+p*m)*A,i[8]=(o*P-a*O+h*C)*A,i[9]=(n*O-e*P-s*C)*A,i[10]=(g*_-u*x+M*I)*A,i[11]=(d*x-l*_-p*I)*A,i[12]=(a*E-o*v-c*C)*A,i[13]=(e*v-n*E+r*C)*A,i[14]=(u*m-g*y-b*I)*A,i[15]=(l*y-d*m+f*I)*A,i):null}function rn(i){let t=i[0],e=i[1],n=i[2],r=i[3],s=i[4],o=i[5],a=i[6],c=i[7],h=i[8],l=i[9],d=i[10],f=i[11],p=i[12],g=i[13],u=i[14],b=i[15],M=t*o-e*s,I=t*a-n*s,m=e*a-n*o,x=h*g-l*p,y=h*u-d*p,_=l*u-d*g,T=t*_-e*y+n*x,C=s*_-o*y+a*x,E=h*m-l*I+d*M,O=p*m-g*I+u*M;return c*T-r*C+b*E-f*O}function Ye(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3],a=t[4],c=t[5],h=t[6],l=t[7],d=t[8],f=t[9],p=t[10],g=t[11],u=t[12],b=t[13],M=t[14],I=t[15],m=e[0],x=e[1],y=e[2],_=e[3];return i[0]=m*n+x*a+y*d+_*u,i[1]=m*r+x*c+y*f+_*b,i[2]=m*s+x*h+y*p+_*M,i[3]=m*o+x*l+y*g+_*I,m=e[4],x=e[5],y=e[6],_=e[7],i[4]=m*n+x*a+y*d+_*u,i[5]=m*r+x*c+y*f+_*b,i[6]=m*s+x*h+y*p+_*M,i[7]=m*o+x*l+y*g+_*I,m=e[8],x=e[9],y=e[10],_=e[11],i[8]=m*n+x*a+y*d+_*u,i[9]=m*r+x*c+y*f+_*b,i[10]=m*s+x*h+y*p+_*M,i[11]=m*o+x*l+y*g+_*I,m=e[12],x=e[13],y=e[14],_=e[15],i[12]=m*n+x*a+y*d+_*u,i[13]=m*r+x*c+y*f+_*b,i[14]=m*s+x*h+y*p+_*M,i[15]=m*o+x*l+y*g+_*I,i}function sn(i,t,e){let n=e[0],r=e[1],s=e[2],o,a,c,h,l,d,f,p,g,u,b,M;return t===i?(i[12]=t[0]*n+t[4]*r+t[8]*s+t[12],i[13]=t[1]*n+t[5]*r+t[9]*s+t[13],i[14]=t[2]*n+t[6]*r+t[10]*s+t[14],i[15]=t[3]*n+t[7]*r+t[11]*s+t[15]):(o=t[0],a=t[1],c=t[2],h=t[3],l=t[4],d=t[5],f=t[6],p=t[7],g=t[8],u=t[9],b=t[10],M=t[11],i[0]=o,i[1]=a,i[2]=c,i[3]=h,i[4]=l,i[5]=d,i[6]=f,i[7]=p,i[8]=g,i[9]=u,i[10]=b,i[11]=M,i[12]=o*n+l*r+g*s+t[12],i[13]=a*n+d*r+u*s+t[13],i[14]=c*n+f*r+b*s+t[14],i[15]=h*n+p*r+M*s+t[15]),i}function on(i,t,e){let n=e[0],r=e[1],s=e[2];return i[0]=t[0]*n,i[1]=t[1]*n,i[2]=t[2]*n,i[3]=t[3]*n,i[4]=t[4]*r,i[5]=t[5]*r,i[6]=t[6]*r,i[7]=t[7]*r,i[8]=t[8]*s,i[9]=t[9]*s,i[10]=t[10]*s,i[11]=t[11]*s,i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15],i}function an(i,t,e,n){let r=n[0],s=n[1],o=n[2],a=Math.sqrt(r*r+s*s+o*o),c,h,l,d,f,p,g,u,b,M,I,m,x,y,_,T,C,E,O,v,P,L,A,F;return a<1e-6?null:(a=1/a,r*=a,s*=a,o*=a,h=Math.sin(e),c=Math.cos(e),l=1-c,d=t[0],f=t[1],p=t[2],g=t[3],u=t[4],b=t[5],M=t[6],I=t[7],m=t[8],x=t[9],y=t[10],_=t[11],T=r*r*l+c,C=s*r*l+o*h,E=o*r*l-s*h,O=r*s*l-o*h,v=s*s*l+c,P=o*s*l+r*h,L=r*o*l+s*h,A=s*o*l-r*h,F=o*o*l+c,i[0]=d*T+u*C+m*E,i[1]=f*T+b*C+x*E,i[2]=p*T+M*C+y*E,i[3]=g*T+I*C+_*E,i[4]=d*O+u*v+m*P,i[5]=f*O+b*v+x*P,i[6]=p*O+M*v+y*P,i[7]=g*O+I*v+_*P,i[8]=d*L+u*A+m*F,i[9]=f*L+b*A+x*F,i[10]=p*L+M*A+y*F,i[11]=g*L+I*A+_*F,t!==i&&(i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i)}function cn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[4],o=t[5],a=t[6],c=t[7],h=t[8],l=t[9],d=t[10],f=t[11];return t!==i&&(i[0]=t[0],i[1]=t[1],i[2]=t[2],i[3]=t[3],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[4]=s*r+h*n,i[5]=o*r+l*n,i[6]=a*r+d*n,i[7]=c*r+f*n,i[8]=h*r-s*n,i[9]=l*r-o*n,i[10]=d*r-a*n,i[11]=f*r-c*n,i}function hn(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[8],l=t[9],d=t[10],f=t[11];return t!==i&&(i[4]=t[4],i[5]=t[5],i[6]=t[6],i[7]=t[7],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r-h*n,i[1]=o*r-l*n,i[2]=a*r-d*n,i[3]=c*r-f*n,i[8]=s*n+h*r,i[9]=o*n+l*r,i[10]=a*n+d*r,i[11]=c*n+f*r,i}function ln(i,t,e){let n=Math.sin(e),r=Math.cos(e),s=t[0],o=t[1],a=t[2],c=t[3],h=t[4],l=t[5],d=t[6],f=t[7];return t!==i&&(i[8]=t[8],i[9]=t[9],i[10]=t[10],i[11]=t[11],i[12]=t[12],i[13]=t[13],i[14]=t[14],i[15]=t[15]),i[0]=s*r+h*n,i[1]=o*r+l*n,i[2]=a*r+d*n,i[3]=c*r+f*n,i[4]=h*r-s*n,i[5]=l*r-o*n,i[6]=d*r-a*n,i[7]=f*r-c*n,i}function dn(i,t){let e=t[0],n=t[1],r=t[2],s=t[3],o=e+e,a=n+n,c=r+r,h=e*o,l=n*o,d=n*a,f=r*o,p=r*a,g=r*c,u=s*o,b=s*a,M=s*c;return i[0]=1-d-g,i[1]=l+M,i[2]=f-b,i[3]=0,i[4]=l-M,i[5]=1-h-g,i[6]=p+u,i[7]=0,i[8]=f+b,i[9]=p-u,i[10]=1-h-d,i[11]=0,i[12]=0,i[13]=0,i[14]=0,i[15]=1,i}function fn(i,t,e,n,r,s,o){let a=1/(e-t),c=1/(r-n),h=1/(s-o);return i[0]=s*2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s*2*c,i[6]=0,i[7]=0,i[8]=(e+t)*a,i[9]=(r+n)*c,i[10]=(o+s)*h,i[11]=-1,i[12]=0,i[13]=0,i[14]=o*s*2*h,i[15]=0,i}function Vr(i,t,e,n,r){let s=1/Math.tan(t/2);if(i[0]=s/e,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=s,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[11]=-1,i[12]=0,i[13]=0,i[15]=0,r!=null&&r!==1/0){let o=1/(n-r);i[10]=(r+n)*o,i[14]=2*r*n*o}else i[10]=-1,i[14]=-2*n;return i}var un=Vr;function Xr(i,t,e,n,r,s,o){let a=1/(t-e),c=1/(n-r),h=1/(s-o);return i[0]=-2*a,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=-2*c,i[6]=0,i[7]=0,i[8]=0,i[9]=0,i[10]=2*h,i[11]=0,i[12]=(t+e)*a,i[13]=(r+n)*c,i[14]=(o+s)*h,i[15]=1,i}var mn=Xr;function pn(i,t,e,n){let r,s,o,a,c,h,l,d,f,p,g=t[0],u=t[1],b=t[2],M=n[0],I=n[1],m=n[2],x=e[0],y=e[1],_=e[2];return Math.abs(g-x)<1e-6&&Math.abs(u-y)<1e-6&&Math.abs(b-_)<1e-6?$r(i):(d=g-x,f=u-y,p=b-_,r=1/Math.sqrt(d*d+f*f+p*p),d*=r,f*=r,p*=r,s=I*p-m*f,o=m*d-M*p,a=M*f-I*d,r=Math.sqrt(s*s+o*o+a*a),r?(r=1/r,s*=r,o*=r,a*=r):(s=0,o=0,a=0),c=f*a-p*o,h=p*s-d*a,l=d*o-f*s,r=Math.sqrt(c*c+h*h+l*l),r?(r=1/r,c*=r,h*=r,l*=r):(c=0,h=0,l=0),i[0]=s,i[1]=c,i[2]=d,i[3]=0,i[4]=o,i[5]=h,i[6]=f,i[7]=0,i[8]=a,i[9]=l,i[10]=p,i[11]=0,i[12]=-(s*g+o*u+a*b),i[13]=-(c*g+h*u+l*b),i[14]=-(d*g+f*u+p*b),i[15]=1,i)}function qr(){let i=new tt(4);return tt!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0,i[3]=0),i}function gn(i,t,e){let n=t[0],r=t[1],s=t[2],o=t[3];return i[0]=e[0]*n+e[4]*r+e[8]*s+e[12]*o,i[1]=e[1]*n+e[5]*r+e[9]*s+e[13]*o,i[2]=e[2]*n+e[6]*r+e[10]*s+e[14]*o,i[3]=e[3]*n+e[7]*r+e[11]*s+e[15]*o,i}var sc=function(){let i=qr();return function(t,e,n,r,s,o){let a,c;for(e||(e=4),n||(n=0),r?c=Math.min(r*e+n,t.length):c=t.length,a=n;a<c;a+=e)i[0]=t[a],i[1]=t[a+1],i[2]=t[a+2],i[3]=t[a+3],s(i,i,o),t[a]=i[0],t[a+1]=i[1],t[a+2]=i[2],t[a+3]=i[3];return t}}();var Qe;(function(i){i[i.COL0ROW0=0]="COL0ROW0",i[i.COL0ROW1=1]="COL0ROW1",i[i.COL0ROW2=2]="COL0ROW2",i[i.COL0ROW3=3]="COL0ROW3",i[i.COL1ROW0=4]="COL1ROW0",i[i.COL1ROW1=5]="COL1ROW1",i[i.COL1ROW2=6]="COL1ROW2",i[i.COL1ROW3=7]="COL1ROW3",i[i.COL2ROW0=8]="COL2ROW0",i[i.COL2ROW1=9]="COL2ROW1",i[i.COL2ROW2=10]="COL2ROW2",i[i.COL2ROW3=11]="COL2ROW3",i[i.COL3ROW0=12]="COL3ROW0",i[i.COL3ROW1=13]="COL3ROW1",i[i.COL3ROW2=14]="COL3ROW2",i[i.COL3ROW3=15]="COL3ROW3"})(Qe||(Qe={}));var Hr=45*Math.PI/180,Wr=1,Ke=.1,Ze=500,Yr=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),X=class extends le{static get IDENTITY(){return Zr()}static get ZERO(){return Kr()}get ELEMENTS(){return 16}get RANK(){return 4}get INDICES(){return Qe}constructor(t){super(-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0),arguments.length===1&&Array.isArray(t)?this.copy(t):this.identity()}copy(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this[3]=t[3],this[4]=t[4],this[5]=t[5],this[6]=t[6],this[7]=t[7],this[8]=t[8],this[9]=t[9],this[10]=t[10],this[11]=t[11],this[12]=t[12],this[13]=t[13],this[14]=t[14],this[15]=t[15],this.check()}set(t,e,n,r,s,o,a,c,h,l,d,f,p,g,u,b){return this[0]=t,this[1]=e,this[2]=n,this[3]=r,this[4]=s,this[5]=o,this[6]=a,this[7]=c,this[8]=h,this[9]=l,this[10]=d,this[11]=f,this[12]=p,this[13]=g,this[14]=u,this[15]=b,this.check()}setRowMajor(t,e,n,r,s,o,a,c,h,l,d,f,p,g,u,b){return this[0]=t,this[1]=s,this[2]=h,this[3]=p,this[4]=e,this[5]=o,this[6]=l,this[7]=g,this[8]=n,this[9]=a,this[10]=d,this[11]=u,this[12]=r,this[13]=c,this[14]=f,this[15]=b,this.check()}toRowMajor(t){return t[0]=this[0],t[1]=this[4],t[2]=this[8],t[3]=this[12],t[4]=this[1],t[5]=this[5],t[6]=this[9],t[7]=this[13],t[8]=this[2],t[9]=this[6],t[10]=this[10],t[11]=this[14],t[12]=this[3],t[13]=this[7],t[14]=this[11],t[15]=this[15],t}identity(){return this.copy(Yr)}fromObject(t){return this.check()}fromQuaternion(t){return dn(this,t),this.check()}frustum(t){let{left:e,right:n,bottom:r,top:s,near:o=Ke,far:a=Ze}=t;return a===1/0?Qr(this,e,n,r,s,o):fn(this,e,n,r,s,o,a),this.check()}lookAt(t){let{eye:e,center:n=[0,0,0],up:r=[0,1,0]}=t;return pn(this,e,n,r),this.check()}ortho(t){let{left:e,right:n,bottom:r,top:s,near:o=Ke,far:a=Ze}=t;return mn(this,e,n,r,s,o,a),this.check()}orthographic(t){let{fovy:e=Hr,aspect:n=Wr,focalDistance:r=1,near:s=Ke,far:o=Ze}=t;xn(e);let a=e/2,c=r*Math.tan(a),h=c*n;return this.ortho({left:-h,right:h,bottom:-c,top:c,near:s,far:o})}perspective(t){let{fovy:e=45*Math.PI/180,aspect:n=1,near:r=.1,far:s=500}=t;return xn(e),un(this,e,n,r,s),this.check()}determinant(){return rn(this)}getScale(t=[-0,-0,-0]){return t[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]),t[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]),t[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]),t}getTranslation(t=[-0,-0,-0]){return t[0]=this[12],t[1]=this[13],t[2]=this[14],t}getRotation(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=0,t[4]=this[4]*r,t[5]=this[5]*s,t[6]=this[6]*o,t[7]=0,t[8]=this[8]*r,t[9]=this[9]*s,t[10]=this[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}getRotationMatrix3(t,e){t=t||[-0,-0,-0,-0,-0,-0,-0,-0,-0],e=e||[-0,-0,-0];let n=this.getScale(e),r=1/n[0],s=1/n[1],o=1/n[2];return t[0]=this[0]*r,t[1]=this[1]*s,t[2]=this[2]*o,t[3]=this[4]*r,t[4]=this[5]*s,t[5]=this[6]*o,t[6]=this[8]*r,t[7]=this[9]*s,t[8]=this[10]*o,t}transpose(){return en(this,this),this.check()}invert(){return nn(this,this),this.check()}multiplyLeft(t){return Ye(this,t,this),this.check()}multiplyRight(t){return Ye(this,this,t),this.check()}rotateX(t){return cn(this,this,t),this.check()}rotateY(t){return hn(this,this,t),this.check()}rotateZ(t){return ln(this,this,t),this.check()}rotateXYZ(t){return this.rotateX(t[0]).rotateY(t[1]).rotateZ(t[2])}rotateAxis(t,e){return an(this,this,t,e),this.check()}scale(t){return on(this,this,Array.isArray(t)?t:[t,t,t]),this.check()}translate(t){return sn(this,this,t),this.check()}transform(t,e){return t.length===4?(e=gn(e||[-0,-0,-0,-0],t,this),se(e,4),e):this.transformAsPoint(t,e)}transformAsPoint(t,e){let{length:n}=t,r;switch(n){case 2:r=Xi(e||[-0,-0],t,this);break;case 3:r=ce(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return se(r,t.length),r}transformAsVector(t,e){let n;switch(t.length){case 2:n=qi(e||[-0,-0],t,this);break;case 3:n=ae(e||[-0,-0,-0],t,this);break;default:throw new Error("Illegal vector")}return se(n,t.length),n}transformPoint(t,e){return this.transformAsPoint(t,e)}transformVector(t,e){return this.transformAsPoint(t,e)}transformDirection(t,e){return this.transformAsVector(t,e)}makeRotationX(t){return this.identity().rotateX(t)}makeTranslation(t,e,n){return this.identity().translate([t,e,n])}},de,fe;function Kr(){return de||(de=new X([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),Object.freeze(de)),de}function Zr(){return fe||(fe=new X,Object.freeze(fe)),fe}function xn(i){if(i>Math.PI*2)throw Error("expected radians")}function Qr(i,t,e,n,r,s){let o=2*s/(e-t),a=2*s/(r-n),c=(e+t)/(e-t),h=(r+n)/(r-n),l=-1,d=-1,f=-2*s;return i[0]=o,i[1]=0,i[2]=0,i[3]=0,i[4]=0,i[5]=a,i[6]=0,i[7]=0,i[8]=c,i[9]=h,i[10]=l,i[11]=d,i[12]=0,i[13]=0,i[14]=f,i[15]=0,i}var Jr=.02,ts=.12,es=.15,is=.2,ei=[0,1,0],ns=[255,255,255],rs=1,Je=.35,ti=255,ss=1,os=.01,as={depthCompare:"less-equal",depthWriteEnabled:!1,cullMode:"none"},cs=[{name:"instancePosition",format:"float32x3",stepMode:"instance"},{name:"instanceDirection",format:"float32x3",stepMode:"instance"},{name:"instanceScale",format:"float32x3",stepMode:"instance"},{name:"instanceColor",format:"float32x4",stepMode:"instance"}],hs={name:"lightMarker",props:{},uniforms:{},uniformTypes:{viewProjectionMatrix:"mat4x4<f32>"}},ls="inputs.positions * inputs.instanceScale",ds="vec3<f32>(inputs.positions.x * inputs.instanceScale.x, (inputs.positions.y - 0.5) * inputs.instanceScale.y, inputs.positions.z * inputs.instanceScale.z)",fs="positions * instanceScale",us="vec3(positions.x * instanceScale.x, (positions.y - 0.5) * instanceScale.y, positions.z * instanceScale.z)",ot=class extends H{lightModelProps;_instanceData;_managedBuffers;buildInstanceData;sizePropNames;constructor(t,e,n){let r=n.buildInstanceData(e),s=bn(t,e.id||n.idPrefix,r),o=new G({lightMarker:hs});o.setProps({lightMarker:{viewProjectionMatrix:Mn(e)}});let{source:a,vs:c,fs:h}=bs(n.anchorMode),l=e;super(t,{...l,id:e.id||n.idPrefix,source:a,vs:c,fs:h,geometry:n.geometry,shaderInputs:o,bufferLayout:[...cs],attributes:s,instanceCount:r.instanceCount,parameters:_n(e.parameters)}),this.lightModelProps=e,this._instanceData=r,this._managedBuffers=s,this.buildInstanceData=n.buildInstanceData,this.sizePropNames=n.sizePropNames}destroy(){super.destroy(),yn(this._managedBuffers),this._managedBuffers={}}draw(t){return this.instanceCount===0?!0:super.draw(t)}setProps(t){this.lightModelProps={...this.lightModelProps,...t},t.parameters&&this.setParameters(_n(this.lightModelProps.parameters)),("viewMatrix"in t||"projectionMatrix"in t)&&(this.shaderInputs.setProps({lightMarker:{viewProjectionMatrix:Mn(this.lightModelProps)}}),this.setNeedsRedraw("lightMarker camera")),xs(t,this.sizePropNames)&&this.rebuildInstanceData()}rebuildInstanceData(){let t=this.buildInstanceData(this.lightModelProps),e=bn(this.device,this.id,t);this.setAttributes(e),this.setInstanceCount(t.instanceCount),yn(this._managedBuffers),this._managedBuffers=e,this._instanceData=t}};function In(i){let t=An(i.lights),e=ii(i),n=i.pointLightRadius??Jr*e.sceneScale*e.markerScale;return ri(t.length,(r,s)=>({color:ni(r),direction:ei,position:r.position,scale:[n,n,n]}),t)}function vn(i){let t=Tn(i.lights),e=ii(i),n=i.spotLightLength??ts*e.sceneScale*e.markerScale;return ri(t.length,(r,s)=>{let o=zt(r.outerConeAngle??Math.PI/4,0,Math.PI/2-os),a=Math.tan(o)*n;return{color:ni(r),direction:Pn(r.direction),position:r.position,scale:[a,n,a]}},t)}function wn(i){let t=ms(i.lights),e=ii(i),n=i.directionalLightLength??es*e.sceneScale*e.markerScale,r=n*is;return ri(t.length,(s,o)=>{let a=Pn(s.direction),c=[e.sceneCenter[0]-a[0]*e.sceneScale*Je,e.sceneCenter[1]-a[1]*e.sceneScale*Je,e.sceneCenter[2]-a[2]*e.sceneScale*Je];return{color:ni(s),direction:a,position:c,scale:[r,n,r]}},t)}function An(i){return i.filter(t=>t.type==="point")}function Tn(i){return i.filter(t=>t.type==="spot")}function ms(i){return i.filter(t=>t.type==="directional")}function ii(i){let t=ps(i.lights,i.bounds),e=[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2,(t[0][2]+t[1][2])/2],n=Math.max(Math.hypot(t[1][0]-t[0][0],t[1][1]-t[0][1],t[1][2]-t[0][2]),ss);return{bounds:t,markerScale:Math.max(i.markerScale??rs,0),sceneCenter:e,sceneScale:n}}function ni(i){let t=i.color||ns,e=Math.max(i.intensity??1,0),n=zt(.35+.3*Math.log10(e+1),.35,1);return[zt(t[0]/ti,0,1)*n,zt(t[1]/ti,0,1)*n,zt(t[2]/ti,0,1)*n,1]}function Pn(i){let[t,e,n]=i||ei,r=Math.hypot(t,e,n);return r===0?[...ei]:[t/r,e/r,n/r]}function ri(i,t,e=[]){let n=new Float32Array(i*3),r=new Float32Array(i*3),s=new Float32Array(i*3),o=new Float32Array(i*4);for(let[a,c]of e.entries()){let h=t(c,a);n.set(h.position,a*3),r.set(h.direction,a*3),s.set(h.scale,a*3),o.set(h.color,a*4)}return{instanceCount:i,instancePositions:n,instanceDirections:r,instanceScales:s,instanceColors:o}}function ps(i,t){if(t)return gs(t);let e=[...An(i).map(s=>s.position),...Tn(i).map(s=>s.position)];if(e.length===0)return[[-.5,-.5,-.5],[.5,.5,.5]];let n=[...e[0]],r=[...e[0]];for(let s of e.slice(1))n[0]=Math.min(n[0],s[0]),n[1]=Math.min(n[1],s[1]),n[2]=Math.min(n[2],s[2]),r[0]=Math.max(r[0],s[0]),r[1]=Math.max(r[1],s[1]),r[2]=Math.max(r[2],s[2]);return[n,r]}function gs(i){return[[...i[0]],[...i[1]]]}function bn(i,t,e){return{instancePosition:i.createBuffer({id:`${t}-instance-position`,data:ue(e.instancePositions,3)}),instanceDirection:i.createBuffer({id:`${t}-instance-direction`,data:ue(e.instanceDirections,3)}),instanceScale:i.createBuffer({id:`${t}-instance-scale`,data:ue(e.instanceScales,3)}),instanceColor:i.createBuffer({id:`${t}-instance-color`,data:ue(e.instanceColors,4)})}}function ue(i,t){return i.length>0?i:new Float32Array(t)}function yn(i){for(let t of Object.values(i))t?.destroy()}function Mn(i){return new X(i.projectionMatrix).multiplyRight(i.viewMatrix)}function xs(i,t){return"lights"in i||"bounds"in i||"markerScale"in i?!0:t.some(e=>e in i)}function _n(i){return{...as,...i||{}}}function bs(i){let t=i==="apex"?ds:ls,e=i==="apex"?us:fs;return{source:`struct lightMarkerUniforms {
|
|
85
85
|
viewProjectionMatrix: mat4x4<f32>,
|
|
86
86
|
};
|
|
87
87
|
|
|
88
|
-
@
|
|
88
|
+
@group(0) @binding(auto) var<uniform> lightMarker : lightMarkerUniforms;
|
|
89
89
|
|
|
90
90
|
struct VertexInputs {
|
|
91
91
|
@location(0) positions : vec3<f32>,
|
|
@@ -134,7 +134,7 @@ in vec3 instanceDirection;
|
|
|
134
134
|
in vec3 instanceScale;
|
|
135
135
|
in vec4 instanceColor;
|
|
136
136
|
|
|
137
|
-
uniform lightMarkerUniforms {
|
|
137
|
+
layout(std140) uniform lightMarkerUniforms {
|
|
138
138
|
mat4 viewProjectionMatrix;
|
|
139
139
|
} lightMarker;
|
|
140
140
|
|
|
@@ -163,8 +163,8 @@ out vec4 fragColor;
|
|
|
163
163
|
void main(void) {
|
|
164
164
|
fragColor = vColor;
|
|
165
165
|
}
|
|
166
|
-
`}}function jt(i,t,e){return Math.min(e,Math.max(t,i))}var fs=new It({nlat:8,nlong:12,radius:1}),pe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"centered",buildInstanceData:_n,geometry:fs,idPrefix:"point-light-model",sizePropNames:["pointLightRadius"]})}};var ms={x:[2,0,1],y:[0,1,2],z:[1,2,0]},at=class extends V{constructor(t={}){let{id:e=S("truncated-code-geometry")}=t,{indices:n,attributes:r}=ps(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function ps(i={}){let{bottomRadius:t=0,topRadius:e=0,height:n=1,nradial:r=10,nvertical:s=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(s+1+h),d=Math.atan2(t-e,n),u=Math.sin,g=Math.cos,p=Math.PI,f=g(d),y=u(d),M=a?-2:0,I=s+(c?2:0),m=r+1,x=new Uint16Array(r*(s+h)*6),b=ms[o],_=new Float32Array(l*3),T=new Float32Array(l*3),E=new Float32Array(l*2),L=0,O=0;for(let v=M;v<=I;v++){let P=v/s,C=n*P,A;v<0?(C=0,P=1,A=t):v>s?(C=n,P=1,A=e):A=t+(e-t)*(v/s),(v===-2||v===s+2)&&(A=0,P=0),C-=n/2;for(let B=0;B<m;B++){let tt=u(B*p*2/r),Z=g(B*p*2/r);_[L+b[0]]=tt*A,_[L+b[1]]=C,_[L+b[2]]=Z*A,T[L+b[0]]=v<0||v>s?0:tt*f,T[L+b[1]]=v<0?-1:v>s?1:y,T[L+b[2]]=v<0||v>s?0:Z*f,E[O+0]=B/r,E[O+1]=P,O+=2,L+=3}}for(let v=0;v<s+h;v++)for(let P=0;P<r;P++){let C=(v*r+P)*6;x[C+0]=m*(v+0)+0+P,x[C+1]=m*(v+0)+1+P,x[C+2]=m*(v+1)+1+P,x[C+3]=m*(v+0)+0+P,x[C+4]=m*(v+1)+1+P,x[C+5]=m*(v+1)+0+P}return{indices:x,attributes:{POSITION:_,NORMAL:T,TEXCOORD_0:E}}}var ct=class extends at{constructor(t={}){let{id:e=S("cone-geometry"),radius:n=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:n})}};var gs=new ct({cap:!0,nradial:16,nvertical:1,radius:1}),ge=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:In,geometry:gs,idPrefix:"spot-light-model",sizePropNames:["spotLightLength"]})}};var xs=new ct({cap:!0,nradial:12,nvertical:1,radius:1}),xe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:vn,geometry:xs,idPrefix:"directional-light-model",sizePropNames:["directionalLightLength"]})}};function ai(i,t){if(!i)throw new Error(t)}var it=class{id;matrix=new q;display=!0;position=new H;rotation=new H;scale=new H(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||S(this.constructor.name),this._setScenegraphNodeProps(t)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(t){return this._setScenegraphNodeProps(t),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(t){return ai(t.length===3,"setPosition requires vector argument"),this.position=t,this}setRotation(t){return ai(t.length===3||t.length===4,"setRotation requires vector argument"),this.rotation=t,this}setScale(t){return ai(t.length===3,"setScale requires vector argument"),this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:n,scale:r,update:s=!0}=t;return e&&this.setPosition(e),n&&this.setRotation(n),r&&this.setScale(r),s&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let t=new q().fromQuaternion(this.rotation);this.matrix.multiplyRight(t)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:t,rotation:e,scale:n}={}){return t&&this.setPosition(t),e&&this.setRotation(e),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let n=new q(t).multiplyRight(e),r=n.invert(),s=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:n,worldInverseMatrix:r,worldInverseTransposeMatrix:s}}_setScenegraphNodeProps(t){t?.position&&this.setPosition(t.position),t?.rotation&&this.setRotation(t.rotation),t?.scale&&this.setScale(t.scale),this.updateMatrix(),t?.matrix&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var Pn=R(U(),1);var ft=class extends it{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Pn.log.assert(e.every(n=>n instanceof it),"every child must an instance of ScenegraphNode"),super(t),this.children=e}getBounds(){let t=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((e,{worldMatrix:n})=>{let r=e.getBounds();if(!r)return;let[s,o]=r,a=new H(s).add(o).divide([2,2,2]);n.transformAsPoint(a,a);let c=new H(o).subtract(s).divide([2,2,2]);n.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new H(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],l[d]),t[1][d]=Math.max(t[1][d],l[d])}}),Number.isFinite(t[0][0])?t:null}destroy(){this.children.forEach(t=>t.destroy()),this.removeAll(),super.destroy()}add(...t){for(let e of t)Array.isArray(e)?this.add(...e):this.children.push(e);return this}remove(t){let e=this.children,n=e.indexOf(t);return n>-1&&e.splice(n,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof ft?r.traverse(t,{worldMatrix:n}):t(r,{worldMatrix:n})}preorderTraversal(t,{worldMatrix:e=new q}={}){let n=new q(e).multiplyRight(this.matrix);t(this,{worldMatrix:n});for(let r of this.children)r instanceof ft?r.preorderTraversal(t,{worldMatrix:n}):t(r,{worldMatrix:n})}};var ye=class extends it{model;bounds=null;managedResources;constructor(t){super(t),this.model=t.model,this.managedResources=t.managedResources||[],this.bounds=t.bounds||null,this.setProps(t)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(t=>t.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(t){return this.model.draw(t)}};var be=class extends V{constructor(t={}){let{id:e=S("cube-geometry"),indices:n=!0}=t;super(n?{...t,id:e,topology:"triangle-list",indices:{size:1,value:ys},attributes:{...As,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Ts,...t.attributes}})}},ys=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]),bs=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1]),Ms=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]),_s=new Float32Array([0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1]),Is=new Float32Array([1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1]),vs=new Float32Array([1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0]),ws=new Float32Array([1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,1]),As={POSITION:{size:3,value:bs},NORMAL:{size:3,value:Ms},TEXCOORD_0:{size:2,value:_s}},Ts={POSITION:{size:3,value:Is},TEXCOORD_0:{size:2,value:vs},COLOR_0:{size:3,value:ws}};var Me=class extends at{constructor(t={}){let{id:e=S("cylinder-geometry"),radius:n=1}=t;super({...t,id:e,bottomRadius:n,topRadius:n})}};var Ps=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],Ss=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],_e=class extends V{constructor(t={}){let{id:e=S("ico-sphere-geometry")}=t,{indices:n,attributes:r}=Ls(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ls(i){let{iterations:t=0}=i,e=Math.PI,n=e*2,r=[...Ps],s=[...Ss];r.push(),s.push();let o=(()=>{let l={};return(d,u)=>{d*=3,u*=3;let g=d<u?d:u,p=d>u?d:u,f=`${g}|${p}`;if(f in l)return l[f];let y=r[d],M=r[d+1],I=r[d+2],m=r[u],x=r[u+1],b=r[u+2],_=(y+m)/2,T=(M+x)/2,E=(I+b)/2,L=Math.sqrt(_*_+T*T+E*E);return _/=L,T/=L,E/=L,r.push(_,T,E),l[f]=r.length/3-1}})();for(let l=0;l<t;l++){let d=[];for(let u=0;u<s.length;u+=3){let g=o(s[u+0],s[u+1]),p=o(s[u+1],s[u+2]),f=o(s[u+2],s[u+0]);d.push(f,s[u+0],g,g,s[u+1],p,p,s[u+2],f,g,p,f)}s=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=s.length;for(let l=h-3;l>=0;l-=3){let d=s[l+0],u=s[l+1],g=s[l+2],p=d*3,f=u*3,y=g*3,M=d*2,I=u*2,m=g*2,x=r[p+0],b=r[p+1],_=r[p+2],T=Math.acos(_/Math.sqrt(x*x+b*b+_*_)),E=Math.atan2(b,x)+e,L=T/e,O=1-E/n,v=r[f+0],P=r[f+1],C=r[f+2],A=Math.acos(C/Math.sqrt(v*v+P*P+C*C)),B=Math.atan2(P,v)+e,tt=A/e,Z=1-B/n,Xt=r[y+0],qt=r[y+1],Ht=r[y+2],$n=Math.acos(Ht/Math.sqrt(Xt*Xt+qt*qt+Ht*Ht)),Vn=Math.atan2(qt,Xt)+e,mi=$n/e,Wt=1-Vn/n,Xn=[Xt-v,qt-P,Ht-C],qn=[x-v,b-P,_-C],Y=new H(Xn).cross(qn).normalize(),N;(O===0||Z===0||Wt===0)&&(O===0||O>.5)&&(Z===0||Z>.5)&&(Wt===0||Wt>.5)&&(r.push(r[p+0],r[p+1],r[p+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=L,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[f+0],r[f+1],r[f+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=tt,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z,r.push(r[y+0],r[y+1],r[y+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=mi,a[N*3+0]=Y.x,a[N*3+1]=Y.y,a[N*3+2]=Y.z),a[p+0]=a[f+0]=a[y+0]=Y.x,a[p+1]=a[f+1]=a[y+1]=Y.y,a[p+2]=a[f+2]=a[y+2]=Y.z,c[M+0]=O,c[M+1]=L,c[I+0]=Z,c[I+1]=tt,c[m+0]=Wt,c[m+1]=mi}return{indices:{size:1,value:new Uint16Array(s)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function Sn(i){let{indices:t,attributes:e}=i;if(!t)return i;let n=t.value.length,r={};for(let s in e){let o=e[s],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(n*h);for(let d=0;d<n;++d){let u=t.value[d];for(let g=0;g<h;g++)l[d*h+g]=c[u*h+g]}r[s]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var Ie=class extends V{constructor(t={}){let{id:e=S("plane-geometry")}=t,{indices:n,attributes:r}=Cs(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Cs(i){let{type:t="x,y",offset:e=0,flipCull:n=!1,unpack:r=!1}=i,s=t.split(","),o=i[`${s[0]}len`]||1,a=i[`${s[1]}len`]||1,c=i[`n${s[0]}`]||1,h=i[`n${s[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),u=new Float32Array(l*3),g=new Float32Array(l*2);n&&(o=-o);let p=0,f=0;for(let m=0;m<=h;m++)for(let x=0;x<=c;x++){let b=x/c,_=m/h;switch(g[p+0]=n?1-b:b,g[p+1]=_,t){case"x,y":d[f+0]=o*b-o*.5,d[f+1]=a*_-a*.5,d[f+2]=e,u[f+0]=0,u[f+1]=0,u[f+2]=n?1:-1;break;case"x,z":d[f+0]=o*b-o*.5,d[f+1]=e,d[f+2]=a*_-a*.5,u[f+0]=0,u[f+1]=n?1:-1,u[f+2]=0;break;case"y,z":d[f+0]=e,d[f+1]=o*b-o*.5,d[f+2]=a*_-a*.5,u[f+0]=n?1:-1,u[f+1]=0,u[f+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}p+=2,f+=3}let y=c+1,M=new Uint16Array(c*h*6);for(let m=0;m<h;m++)for(let x=0;x<c;x++){let b=(m*c+x)*6;M[b+0]=(m+0)*y+x,M[b+1]=(m+1)*y+x,M[b+2]=(m+0)*y+x+1,M[b+3]=(m+1)*y+x,M[b+4]=(m+1)*y+x+1,M[b+5]=(m+0)*y+x+1}let I={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:u},TEXCOORD_0:{size:2,value:g}}};return r?Sn(I):I}function Ln(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Es(Math.abs(i*t)*1432.71))}function Es(i){return i-Math.floor(i)}var ci="";function Cn(i){ci=i}async function En(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:ci+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function On(i,t){return await new Promise((e,n)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:ci+i}catch(r){n(r)}})}var Rn=R(rt(),1);var nt=R(U(),1),Tt=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},Pt=class extends Tt{constructor(t,e){e={...e};let{width:n=1,height:r=1}=e,s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-0`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r})),o=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-1`,format:c,usage:nt.Texture.SAMPLE|nt.Texture.RENDER|nt.Texture.COPY_SRC|nt.Texture.COPY_DST,width:n,height:r}));let a=t.createFramebuffer({...e,colorAttachments:s});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}},ve=class extends Tt{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}};function kn(i){let{shaderPass:t,action:e,shadingLanguage:n}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return n==="wgsl"?Os(r):Rs(r);case"sample":let s=`${t.name}_sampleColor`;return n==="wgsl"?ks(s):Ns(s);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Os(i){return`@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
|
|
167
|
-
@group(0) @binding(
|
|
166
|
+
`}}function zt(i,t,e){return Math.min(e,Math.max(t,i))}var ys=new _t({nlat:8,nlong:12,radius:1}),me=class extends ot{constructor(t,e){super(t,e,{anchorMode:"centered",buildInstanceData:In,geometry:ys,idPrefix:"point-light-model",sizePropNames:["pointLightRadius"]})}};var Ms={x:[2,0,1],y:[0,1,2],z:[1,2,0]},at=class extends ${constructor(t={}){let{id:e=S("truncated-code-geometry")}=t,{indices:n,attributes:r}=_s(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{POSITION:{size:3,value:r.POSITION},NORMAL:{size:3,value:r.NORMAL},TEXCOORD_0:{size:2,value:r.TEXCOORD_0},...t.attributes}})}};function _s(i={}){let{bottomRadius:t=0,topRadius:e=0,height:n=1,nradial:r=10,nvertical:s=10,verticalAxis:o="y",topCap:a=!1,bottomCap:c=!1}=i,h=(a?2:0)+(c?2:0),l=(r+1)*(s+1+h),d=Math.atan2(t-e,n),f=Math.sin,p=Math.cos,g=Math.PI,u=p(d),b=f(d),M=a?-2:0,I=s+(c?2:0),m=r+1,x=new Uint16Array(r*(s+h)*6),y=Ms[o],_=new Float32Array(l*3),T=new Float32Array(l*3),C=new Float32Array(l*2),E=0,O=0;for(let v=M;v<=I;v++){let P=v/s,L=n*P,A;v<0?(L=0,P=1,A=t):v>s?(L=n,P=1,A=e):A=t+(e-t)*(v/s),(v===-2||v===s+2)&&(A=0,P=0),L-=n/2;for(let F=0;F<m;F++){let J=f(F*g*2/r),K=p(F*g*2/r);_[E+y[0]]=J*A,_[E+y[1]]=L,_[E+y[2]]=K*A,T[E+y[0]]=v<0||v>s?0:J*u,T[E+y[1]]=v<0?-1:v>s?1:b,T[E+y[2]]=v<0||v>s?0:K*u,C[O+0]=F/r,C[O+1]=P,O+=2,E+=3}}for(let v=0;v<s+h;v++)for(let P=0;P<r;P++){let L=(v*r+P)*6;x[L+0]=m*(v+0)+0+P,x[L+1]=m*(v+0)+1+P,x[L+2]=m*(v+1)+1+P,x[L+3]=m*(v+0)+0+P,x[L+4]=m*(v+1)+1+P,x[L+5]=m*(v+1)+0+P}return{indices:x,attributes:{POSITION:_,NORMAL:T,TEXCOORD_0:C}}}var ct=class extends at{constructor(t={}){let{id:e=S("cone-geometry"),radius:n=1,cap:r=!0}=t;super({...t,id:e,topRadius:0,topCap:Boolean(r),bottomCap:Boolean(r),bottomRadius:n})}};var Is=new ct({cap:!0,nradial:16,nvertical:1,radius:1}),pe=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:vn,geometry:Is,idPrefix:"spot-light-model",sizePropNames:["spotLightLength"]})}};var vs=new ct({cap:!0,nradial:12,nvertical:1,radius:1}),ge=class extends ot{constructor(t,e){super(t,e,{anchorMode:"apex",buildInstanceData:wn,geometry:vs,idPrefix:"directional-light-model",sizePropNames:["directionalLightLength"]})}};function si(i,t){if(!i)throw new Error(t)}var et=class{id;matrix=new X;display=!0;position=new q;rotation=new q;scale=new q(1,1,1);userData={};props={};constructor(t={}){let{id:e}=t;this.id=e||S(this.constructor.name),this._setScenegraphNodeProps(t)}getBounds(){return null}destroy(){}delete(){this.destroy()}setProps(t){return this._setScenegraphNodeProps(t),this}toString(){return`{type: ScenegraphNode, id: ${this.id})}`}setPosition(t){return si(t.length===3,"setPosition requires vector argument"),this.position=t,this}setRotation(t){return si(t.length===3||t.length===4,"setRotation requires vector argument"),this.rotation=t,this}setScale(t){return si(t.length===3,"setScale requires vector argument"),this.scale=t,this}setMatrix(t,e=!0){e?this.matrix.copy(t):this.matrix=t}setMatrixComponents(t){let{position:e,rotation:n,scale:r,update:s=!0}=t;return e&&this.setPosition(e),n&&this.setRotation(n),r&&this.setScale(r),s&&this.updateMatrix(),this}updateMatrix(){if(this.matrix.identity(),this.matrix.translate(this.position),this.rotation.length===4){let t=new X().fromQuaternion(this.rotation);this.matrix.multiplyRight(t)}else this.matrix.rotateXYZ(this.rotation);return this.matrix.scale(this.scale),this}update({position:t,rotation:e,scale:n}={}){return t&&this.setPosition(t),e&&this.setRotation(e),n&&this.setScale(n),this.updateMatrix(),this}getCoordinateUniforms(t,e){e=e||this.matrix;let n=new X(t).multiplyRight(e),r=n.invert(),s=r.transpose();return{viewMatrix:t,modelMatrix:e,objectMatrix:e,worldMatrix:n,worldInverseMatrix:r,worldInverseTransposeMatrix:s}}_setScenegraphNodeProps(t){t?.position&&this.setPosition(t.position),t?.rotation&&this.setRotation(t.rotation),t?.scale&&this.setScale(t.scale),this.updateMatrix(),t?.matrix&&this.setMatrix(t.matrix),Object.assign(this.props,t)}};var Sn=k(U(),1);var ft=class extends et{children;constructor(t={}){t=Array.isArray(t)?{children:t}:t;let{children:e=[]}=t;Sn.log.assert(e.every(n=>n instanceof et),"every child must an instance of ScenegraphNode"),super(t),this.children=e}getBounds(){let t=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];return this.traverse((e,{worldMatrix:n})=>{let r=e.getBounds();if(!r)return;let[s,o]=r,a=new q(s).add(o).divide([2,2,2]);n.transformAsPoint(a,a);let c=new q(o).subtract(s).divide([2,2,2]);n.transformAsVector(c,c);for(let h=0;h<8;h++){let l=new q(h&1?-1:1,h&2?-1:1,h&4?-1:1).multiply(c).add(a);for(let d=0;d<3;d++)t[0][d]=Math.min(t[0][d],l[d]),t[1][d]=Math.max(t[1][d],l[d])}}),Number.isFinite(t[0][0])?t:null}destroy(){this.children.forEach(t=>t.destroy()),this.removeAll(),super.destroy()}add(...t){for(let e of t)Array.isArray(e)?this.add(...e):this.children.push(e);return this}remove(t){let e=this.children,n=e.indexOf(t);return n>-1&&e.splice(n,1),this}removeAll(){return this.children=[],this}traverse(t,{worldMatrix:e=new X}={}){let n=new X(e).multiplyRight(this.matrix);for(let r of this.children)r instanceof ft?r.traverse(t,{worldMatrix:n}):t(r,{worldMatrix:n})}preorderTraversal(t,{worldMatrix:e=new X}={}){let n=new X(e).multiplyRight(this.matrix);t(this,{worldMatrix:n});for(let r of this.children)r instanceof ft?r.preorderTraversal(t,{worldMatrix:n}):t(r,{worldMatrix:n})}};var xe=class extends et{model;bounds=null;managedResources;constructor(t){super(t),this.model=t.model,this.managedResources=t.managedResources||[],this.bounds=t.bounds||null,this.setProps(t)}destroy(){this.model&&(this.model.destroy(),this.model=null),this.managedResources.forEach(t=>t.destroy()),this.managedResources=[]}getBounds(){return this.bounds}draw(t){return this.model.draw(t)}};var be=class extends ${constructor(t={}){let{id:e=S("cube-geometry"),indices:n=!0}=t;super(n?{...t,id:e,topology:"triangle-list",indices:{size:1,value:ws},attributes:{...Cs,...t.attributes}}:{...t,id:e,topology:"triangle-list",indices:void 0,attributes:{...Os,...t.attributes}})}},ws=new Uint16Array([0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23]),As=new Float32Array([-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1]),Ts=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]),Ps=new Float32Array([0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1]),Ss=new Float32Array([1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1,-1,1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,1,-1,1,1,1,-1,1,1,-1,-1,1,-1,-1,1,1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1,-1,-1,1,-1]),Es=new Float32Array([1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,1,0,0]),Ls=new Float32Array([1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,1]),Cs={POSITION:{size:3,value:As},NORMAL:{size:3,value:Ts},TEXCOORD_0:{size:2,value:Ps}},Os={POSITION:{size:3,value:Ss},TEXCOORD_0:{size:2,value:Es},COLOR_0:{size:3,value:Ls}};var ye=class extends at{constructor(t={}){let{id:e=S("cylinder-geometry"),radius:n=1}=t;super({...t,id:e,bottomRadius:n,topRadius:n})}};var Rs=[-1,0,0,0,1,0,0,0,-1,0,0,1,0,-1,0,1,0,0],ks=[3,4,5,3,5,1,3,1,0,3,0,4,4,0,2,4,2,5,2,0,1,5,2,1],Me=class extends ${constructor(t={}){let{id:e=S("ico-sphere-geometry")}=t,{indices:n,attributes:r}=Ns(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ns(i){let{iterations:t=0}=i,e=Math.PI,n=e*2,r=[...Rs],s=[...ks];r.push(),s.push();let o=(()=>{let l={};return(d,f)=>{d*=3,f*=3;let p=d<f?d:f,g=d>f?d:f,u=`${p}|${g}`;if(u in l)return l[u];let b=r[d],M=r[d+1],I=r[d+2],m=r[f],x=r[f+1],y=r[f+2],_=(b+m)/2,T=(M+x)/2,C=(I+y)/2,E=Math.sqrt(_*_+T*T+C*C);_/=E,T/=E,C/=E,r.push(_,T,C);let O=r.length/3-1;return l[u]=O,O}})();for(let l=0;l<t;l++){let d=[];for(let f=0;f<s.length;f+=3){let p=o(s[f+0],s[f+1]),g=o(s[f+1],s[f+2]),u=o(s[f+2],s[f+0]);d.push(u,s[f+0],p,p,s[f+1],g,g,s[f+2],u,p,g,u)}s=d}let a=new Array(r.length),c=new Array(r.length/3*2),h=s.length;for(let l=h-3;l>=0;l-=3){let d=s[l+0],f=s[l+1],p=s[l+2],g=d*3,u=f*3,b=p*3,M=d*2,I=f*2,m=p*2,x=r[g+0],y=r[g+1],_=r[g+2],T=Math.acos(_/Math.sqrt(x*x+y*y+_*_)),C=Math.atan2(y,x)+e,E=T/e,O=1-C/n,v=r[u+0],P=r[u+1],L=r[u+2],A=Math.acos(L/Math.sqrt(v*v+P*P+L*L)),F=Math.atan2(P,v)+e,J=A/e,K=1-F/n,Vt=r[b+0],Xt=r[b+1],qt=r[b+2],Vn=Math.acos(qt/Math.sqrt(Vt*Vt+Xt*Xt+qt*qt)),Xn=Math.atan2(Xt,Vt)+e,fi=Vn/e,Ht=1-Xn/n,qn=[Vt-v,Xt-P,qt-L],Hn=[x-v,y-P,_-L],W=new q(qn).cross(Hn).normalize(),N;(O===0||K===0||Ht===0)&&(O===0||O>.5)&&(K===0||K>.5)&&(Ht===0||Ht>.5)&&(r.push(r[g+0],r[g+1],r[g+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=E,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z,r.push(r[u+0],r[u+1],r[u+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=J,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z,r.push(r[b+0],r[b+1],r[b+2]),N=r.length/3-1,s.push(N),c[N*2+0]=1,c[N*2+1]=fi,a[N*3+0]=W.x,a[N*3+1]=W.y,a[N*3+2]=W.z),a[g+0]=a[u+0]=a[b+0]=W.x,a[g+1]=a[u+1]=a[b+1]=W.y,a[g+2]=a[u+2]=a[b+2]=W.z,c[M+0]=O,c[M+1]=E,c[I+0]=K,c[I+1]=J,c[m+0]=Ht,c[m+1]=fi}return{indices:{size:1,value:new Uint16Array(s)},attributes:{POSITION:{size:3,value:new Float32Array(r)},NORMAL:{size:3,value:new Float32Array(a)},TEXCOORD_0:{size:2,value:new Float32Array(c)}}}}function En(i){let{indices:t,attributes:e}=i;if(!t)return i;let n=t.value.length,r={};for(let s in e){let o=e[s],{constant:a,value:c,size:h}=o;if(a||!h)continue;let l=new c.constructor(n*h);for(let d=0;d<n;++d){let f=t.value[d];for(let p=0;p<h;p++)l[d*h+p]=c[f*h+p]}r[s]={size:h,value:l}}return{attributes:Object.assign({},e,r)}}var _e=class extends ${constructor(t={}){let{id:e=S("plane-geometry")}=t,{indices:n,attributes:r}=Ds(t);super({...t,id:e,topology:"triangle-list",indices:n,attributes:{...r,...t.attributes}})}};function Ds(i){let{type:t="x,y",offset:e=0,flipCull:n=!1,unpack:r=!1}=i,s=t.split(","),o=i[`${s[0]}len`]||1,a=i[`${s[1]}len`]||1,c=i[`n${s[0]}`]||1,h=i[`n${s[1]}`]||1,l=(c+1)*(h+1),d=new Float32Array(l*3),f=new Float32Array(l*3),p=new Float32Array(l*2);n&&(o=-o);let g=0,u=0;for(let m=0;m<=h;m++)for(let x=0;x<=c;x++){let y=x/c,_=m/h;switch(p[g+0]=n?1-y:y,p[g+1]=_,t){case"x,y":d[u+0]=o*y-o*.5,d[u+1]=a*_-a*.5,d[u+2]=e,f[u+0]=0,f[u+1]=0,f[u+2]=n?1:-1;break;case"x,z":d[u+0]=o*y-o*.5,d[u+1]=e,d[u+2]=a*_-a*.5,f[u+0]=0,f[u+1]=n?1:-1,f[u+2]=0;break;case"y,z":d[u+0]=e,d[u+1]=o*y-o*.5,d[u+2]=a*_-a*.5,f[u+0]=n?1:-1,f[u+1]=0,f[u+2]=0;break;default:throw new Error("PlaneGeometry: unknown type")}g+=2,u+=3}let b=c+1,M=new Uint16Array(c*h*6);for(let m=0;m<h;m++)for(let x=0;x<c;x++){let y=(m*c+x)*6;M[y+0]=(m+0)*b+x,M[y+1]=(m+1)*b+x,M[y+2]=(m+0)*b+x+1,M[y+3]=(m+1)*b+x,M[y+4]=(m+1)*b+x+1,M[y+5]=(m+0)*b+x+1}let I={indices:{size:1,value:M},attributes:{POSITION:{size:3,value:d},NORMAL:{size:3,value:f},TEXCOORD_0:{size:2,value:p}}};return r?En(I):I}function Ln(){let i=1,t=1;return()=>(i=Math.sin(t*17.23),t=Math.cos(i*27.92),Fs(Math.abs(i*t)*1432.71))}function Fs(i){return i-Math.floor(i)}var oi="";function Cn(i){oi=i}async function On(i,t){let e=new Image;return e.crossOrigin=t?.crossOrigin||"anonymous",e.src=i.startsWith("http")?i:oi+i,await e.decode(),t?await createImageBitmap(e,t):await createImageBitmap(e)}async function Rn(i,t){return await new Promise((e,n)=>{try{let r=new Image;r.onload=()=>e(r),r.onerror=()=>n(new Error(`Could not load image ${i}.`)),r.crossOrigin=t?.crossOrigin||"anonymous",r.src=i.startsWith("http")?i:oi+i}catch(r){n(r)}})}var Nn=k(nt(),1);var it=k(U(),1),At=class{id;current;next;constructor(t){this.id=t.id||"swap",this.current=t.current,this.next=t.next}destroy(){this.current?.destroy(),this.next?.destroy()}swap(){let t=this.current;this.current=this.next,this.next=t}},Tt=class extends At{constructor(t,e){e={...e};let{width:n=1,height:r=1}=e,s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-0`,format:c,usage:it.Texture.SAMPLE|it.Texture.RENDER|it.Texture.COPY_SRC|it.Texture.COPY_DST,width:n,height:r})),o=t.createFramebuffer({...e,colorAttachments:s});s=e.colorAttachments?.map(c=>typeof c!="string"?c:t.createTexture({id:`${e.id}-texture-1`,format:c,usage:it.Texture.SAMPLE|it.Texture.RENDER|it.Texture.COPY_SRC|it.Texture.COPY_DST,width:n,height:r}));let a=t.createFramebuffer({...e,colorAttachments:s});super({current:o,next:a})}resize(t){if(t.width===this.current.width&&t.height===this.current.height)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}},Ie=class extends At{constructor(t,e){super({current:t.createBuffer(e),next:t.createBuffer(e)})}resize(t){if(t.byteLength===this.current.byteLength)return!1;let{current:e,next:n}=this;return this.current=e.clone(t),e.destroy(),this.next=n.clone(t),n.destroy(),!0}};function kn(i){let{shaderPass:t,action:e,shadingLanguage:n}=i;switch(e){case"filter":let r=`${t.name}_filterColor_ext`;return n==="wgsl"?Bs(r):js(r);case"sample":let s=`${t.name}_sampleColor`;return n==="wgsl"?zs(s):Us(s);default:throw new Error(`${t.name} no fragment shader generated for shader pass`)}}function Bs(i){return`@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
|
|
167
|
+
@group(0) @binding(auto) var sourceTextureSampler: sampler;
|
|
168
168
|
|
|
169
169
|
@fragment
|
|
170
170
|
fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
@@ -175,8 +175,8 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
|
175
175
|
fragColor = ${i}(fragColor, texSize, texCoord);
|
|
176
176
|
return fragColor;
|
|
177
177
|
}
|
|
178
|
-
`}function
|
|
179
|
-
@group(0) @binding(
|
|
178
|
+
`}function zs(i){return`@group(0) @binding(auto) var sourceTexture: texture_2d<f32>;
|
|
179
|
+
@group(0) @binding(auto) var sourceTextureSampler: sampler;
|
|
180
180
|
|
|
181
181
|
@fragment
|
|
182
182
|
fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
@@ -184,7 +184,7 @@ fn fragmentMain(inputs: FragmentInputs) -> @location(0) vec4f {
|
|
|
184
184
|
let texSize = vec2f(textureDimensions(sourceTexture));
|
|
185
185
|
return ${i}(sourceTexture, sourceTextureSampler, texSize, texCoord);
|
|
186
186
|
}
|
|
187
|
-
`}function
|
|
187
|
+
`}function js(i){return`#version 300 es
|
|
188
188
|
|
|
189
189
|
uniform sampler2D sourceTexture;
|
|
190
190
|
|
|
@@ -202,7 +202,7 @@ void main() {
|
|
|
202
202
|
fragColor = texture(sourceTexture, texCoord);
|
|
203
203
|
fragColor = ${i}(fragColor, texSize, texCoord);
|
|
204
204
|
}
|
|
205
|
-
`}function
|
|
205
|
+
`}function Us(i){return`#version 300 es
|
|
206
206
|
|
|
207
207
|
uniform sampler2D sourceTexture;
|
|
208
208
|
|
|
@@ -219,10 +219,10 @@ void main() {
|
|
|
219
219
|
|
|
220
220
|
fragColor = ${i}(sourceTexture, texSize, texCoord);
|
|
221
221
|
}
|
|
222
|
-
`}var
|
|
222
|
+
`}var ve=class{device;shaderInputs;passRenderers;swapFramebuffers;textureModel;constructor(t,e){this.device=t,e.shaderPasses.map(s=>(0,Nn.initializeShaderModule)(s));let n=e.shaderPasses.reduce((s,o)=>({...s,[o.name]:o}),{});this.shaderInputs=e.shaderInputs||new G(n);let r=t.getCanvasContext().getDrawingBufferSize();this.swapFramebuffers=new Tt(t,{colorAttachments:[t.preferredColorFormat],width:r[0],height:r[1]}),this.textureModel=new Mt(t,{backgroundTexture:this.swapFramebuffers.current.colorAttachments[0].texture}),this.passRenderers=e.shaderPasses.map(s=>new ai(t,s))}destroy(){for(let t of this.passRenderers)t.destroy();this.swapFramebuffers.destroy(),this.textureModel.destroy()}resize(t){t||=this.device.getCanvasContext().getDrawingBufferSize(),this.swapFramebuffers.resize({width:t[0],height:t[1]})}renderToScreen(t){let e=this.renderToTexture(t);if(!e)return!1;let n=this.device.getDefaultCanvasContext().getCurrentFramebuffer({depthStencilFormat:!1}),r=this.device.beginRenderPass({id:"shader-pass-renderer-to-screen",framebuffer:n,clearDepth:!1});return this.textureModel.setProps({backgroundTexture:e}),this.textureModel.draw(r),r.end(),!0}renderToTexture(t){let{sourceTexture:e}=t;if(!e.isReady)return null;if(this.passRenderers.length===0)return e.texture;this.textureModel.setProps({backgroundTexture:e});let n=this.device.beginRenderPass({id:"shader-pass-renderer-clear-texture",framebuffer:this.swapFramebuffers.current,clearColor:[1,0,0,1]});this.textureModel.draw(n),n.end();let r=!0;for(let o of this.passRenderers)for(let a of o.subPassRenderers){r||this.swapFramebuffers.swap(),r=!1;let h={sourceTexture:this.swapFramebuffers.current.colorAttachments[0].texture},l=this.device.beginRenderPass({id:"shader-pass-renderer-run-pass",framebuffer:this.swapFramebuffers.next,clearColor:[0,0,0,1],clearDepth:1});a.render({renderPass:l,bindings:h}),l.end()}return this.swapFramebuffers.swap(),this.swapFramebuffers.current.colorAttachments[0].texture}},ai=class{shaderPass;subPassRenderers;constructor(t,e,n={}){this.shaderPass=e;let r=e.passes||[];this.subPassRenderers=r.map(s=>new ci(t,e,s))}destroy(){for(let t of this.subPassRenderers)t.destroy()}},ci=class{model;shaderPass;subPass;constructor(t,e,n){this.shaderPass=e,this.subPass=n;let r=n.action||n.filter&&"filter"||n.sampler&&"sample"||"filter",s=kn({shaderPass:e,action:r,shadingLanguage:t.info.shadingLanguage});this.model=new st(t,{id:`${e.name}-subpass`,source:s,fs:s,modules:[e],parameters:{depthWriteEnabled:!1}})}destroy(){this.model.destroy()}render(t){let{renderPass:e,bindings:n}=t;this.model.shaderInputs.setProps({[this.shaderPass.name]:this.shaderPass.uniforms||{}}),this.model.shaderInputs.setProps({[this.shaderPass.name]:this.subPass.uniforms||{}}),this.model.setBindings(n||{}),this.model.draw(e)}};var D=k(U(),1),Dn=k(nt(),1);var hi=2,Gs=1e4,li=class{device;id;pipelineFactory;shaderFactory;userData={};bindings={};pipeline;source;shader;shaderInputs;_uniformStore;_pipelineNeedsUpdate="newly created";_getModuleUniforms;props;_destroyed=!1;constructor(t,e){if(t.type!=="webgpu")throw new Error("Computation is only supported in WebGPU");this.props={...li.defaultProps,...e},e=this.props,this.id=e.id||S("model"),this.device=t,Object.assign(this.userData,e.userData);let n=Object.fromEntries(this.props.modules?.map(h=>[h.name,h])||[]);this.shaderInputs=e.shaderInputs||new G(n),this.setShaderInputs(this.shaderInputs);let r=$s(t),s=(this.props.modules?.length>0?this.props.modules:this.shaderInputs?.getModules())||[];this.props.shaderLayout=gt(this.props.shaderLayout,s)||null,this.pipelineFactory=e.pipelineFactory||D.PipelineFactory.getDefaultPipelineFactory(this.device),this.shaderFactory=e.shaderFactory||D.ShaderFactory.getDefaultShaderFactory(this.device);let{source:o,getUniforms:a}=this.props.shaderAssembler.assembleWGSLShader({platformInfo:r,...this.props,modules:s});this.source=o,this._getModuleUniforms=a;let c=t.getShaderLayout?.(this.source);this.props.shaderLayout=gt(this.props.shaderLayout||c||null,s)||null,this.pipeline=this._updatePipeline(),e.bindings&&this.setBindings(e.bindings),Object.seal(this)}destroy(){this._destroyed||(this.pipelineFactory.release(this.pipeline),this.shaderFactory.release(this.shader),this._uniformStore.destroy(),this._destroyed=!0)}predraw(){this.updateShaderInputs()}dispatch(t,e,n,r){try{this._logDrawCallStart(),this.pipeline=this._updatePipeline(),this.pipeline.setBindings(this.bindings),t.setPipeline(this.pipeline),t.setBindings({}),t.dispatch(e,n,r)}finally{this._logDrawCallEnd()}}setVertexCount(t){}setInstanceCount(t){}setShaderInputs(t){this.shaderInputs=t,this._uniformStore=new D.UniformStore(this.device,this.shaderInputs.modules);for(let[e,n]of Object.entries(this.shaderInputs.modules))if(xt(n)){let r=this._uniformStore.getManagedUniformBuffer(e);this.bindings[`${e}Uniforms`]=r}}setShaderModuleProps(t){let e=this._getModuleUniforms(t),n=Object.keys(e).filter(s=>{let o=e[s];return!Ot(o)&&typeof o!="number"&&typeof o!="boolean"}),r={};for(let s of n)r[s]=e[s],delete e[s]}updateShaderInputs(){this._uniformStore.setUniforms(this.shaderInputs.getUniformValues())}setBindings(t){Object.assign(this.bindings,t)}_setPipelineNeedsUpdate(t){this._pipelineNeedsUpdate=this._pipelineNeedsUpdate||t}_updatePipeline(){if(this._pipelineNeedsUpdate){let t=null;this.pipeline&&(D.log.log(1,`Model ${this.id}: Recreating pipeline because "${this._pipelineNeedsUpdate}".`)(),t=this.shader),this._pipelineNeedsUpdate=!1,this.shader=this.shaderFactory.createShader({id:`${this.id}-fragment`,stage:"compute",source:this.source,debugShaders:this.props.debugShaders}),this.pipeline=this.pipelineFactory.createComputePipeline({...this.props,shader:this.shader}),t&&this.shaderFactory.release(t)}return this.pipeline}_lastLogTime=0;_logOpen=!1;_logDrawCallStart(){let t=D.log.level>3?0:Gs;D.log.level<2||Date.now()-this._lastLogTime<t||(this._lastLogTime=Date.now(),this._logOpen=!0,D.log.group(hi,`>>> DRAWING MODEL ${this.id}`,{collapsed:D.log.level<=2})())}_logDrawCallEnd(){if(this._logOpen){let t=this.shaderInputs.getDebugTable();D.log.table(hi,t)(),D.log.groupEnd(hi)(),this._logOpen=!1}}_drawCount=0;_getBufferOrConstantValues(t,e){let n=D.dataTypeDecoder.getTypedArrayConstructor(e);return(t instanceof D.Buffer?new n(t.debugData):t).toString()}},jt=li;Y(jt,"defaultProps",{...D.ComputePipeline.defaultProps,id:"unnamed",handle:void 0,userData:{},source:"",modules:[],defines:{},bindings:void 0,shaderInputs:void 0,pipelineFactory:void 0,shaderFactory:void 0,shaderAssembler:Dn.ShaderAssembler.getDefaultShaderAssembler(),debugShaders:void 0});function $s(i){return{type:i.type,shaderLanguage:i.info.shadingLanguage,shaderLanguageVersion:i.info.shadingLanguageVersion,gpu:i.info.gpu,features:i.features}}var Z=k(U(),1);var Vs=[0,1,1,1],j=-1,Xs={isActive:"i32",indexMode:"i32",batchIndex:"i32",isHighlightActive:"i32",highlightedBatchIndex:"i32",highlightedObjectIndex:"i32",highlightColor:"vec4<f32>"},Pt=`precision highp float;
|
|
223
223
|
precision highp int;
|
|
224
224
|
|
|
225
|
-
uniform pickingUniforms {
|
|
225
|
+
layout(std140) uniform pickingUniforms {
|
|
226
226
|
int isActive;
|
|
227
227
|
int indexMode;
|
|
228
228
|
int batchIndex;
|
|
@@ -232,7 +232,7 @@ uniform pickingUniforms {
|
|
|
232
232
|
int highlightedObjectIndex;
|
|
233
233
|
vec4 highlightColor;
|
|
234
234
|
} picking;
|
|
235
|
-
`,
|
|
235
|
+
`,we=`struct pickingUniforms {
|
|
236
236
|
isActive: i32,
|
|
237
237
|
indexMode: i32,
|
|
238
238
|
batchIndex: i32,
|
|
@@ -244,9 +244,9 @@ uniform pickingUniforms {
|
|
|
244
244
|
};
|
|
245
245
|
|
|
246
246
|
@group(0) @binding(auto) var<uniform> picking: pickingUniforms;
|
|
247
|
-
`;function
|
|
247
|
+
`;function qs(i={},t){let e={...t};switch(i.isActive!==void 0&&(e.isActive=Boolean(i.isActive)),i.indexMode){case"instance":e.indexMode=0;break;case"attribute":e.indexMode=1;break;case void 0:break}switch(typeof i.batchIndex=="number"&&(e.batchIndex=i.batchIndex),i.highlightedObjectIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedObjectIndex=j;break;default:e.isHighlightActive=!0,e.highlightedObjectIndex=i.highlightedObjectIndex}switch(i.highlightedBatchIndex){case void 0:break;case null:e.isHighlightActive=!1,e.highlightedBatchIndex=j;break;default:e.isHighlightActive=!0,e.highlightedBatchIndex=i.highlightedBatchIndex}return i.highlightColor&&(e.highlightColor=i.highlightColor),e}var St={props:{},uniforms:{},name:"picking",uniformTypes:Xs,defaultUniforms:{isActive:!1,indexMode:0,batchIndex:0,isHighlightActive:!1,highlightedBatchIndex:j,highlightedObjectIndex:j,highlightColor:Vs},getUniforms:qs};var Fn=1,Hs=new Int32Array([j,j,0,0]);function Te(i,t="color",e=i==="webgpu"){if(t==="auto")return e?"index":"color";if(t==="index"&&!e)throw new Error(`Picking mode "${t}" requires WebGPU or a WebGL device that supports renderable rg32sint textures.`);return t}function di(i){return i.type==="webgpu"||i.type==="webgl"&&i.isTextureFormatRenderable("rg32sint")}var jn=Te;function Bn(i){return{objectIndex:i[0]===j?null:i[0],batchIndex:i[1]===j?null:i[1]}}function zn(i){let t=i[0]+i[1]*256+i[2]*65536;if(t===0)return{objectIndex:null,batchIndex:null};let e=i[3]>0?i[3]-1:0;return{objectIndex:t-1,batchIndex:e}}var Ae=class{device;props;mode;pickInfo={batchIndex:null,objectIndex:null};framebuffer=null;constructor(t,e){this.device=t,this.props={...Ae.defaultProps,...e};let n=e.mode??e.backend??Ae.defaultProps.mode;this.props.mode=n,this.props.backend=n,this.mode=Te(this.device.type,n,di(this.device))}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.mode==="index"?this.createIndexFramebuffer():this.createColorFramebuffer()),this.framebuffer}clearPickState(){this.setPickingProps({highlightedBatchIndex:null,highlightedObjectIndex:null})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getDefaultCanvasContext().getDevicePixelSize()),this.setPickingProps({isActive:!0}),this.mode==="index"?this.device.beginRenderPass({framebuffer:t,clearColors:[new Float32Array([0,0,0,0]),Hs],clearDepth:1}):this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}async updatePickInfo(t){let e=this.getFramebuffer(),n=this.getPickPosition(t),r=await this.readPickInfo(e,n);return r?(this.hasPickInfoChanged(r)&&(this.pickInfo=r,this.props.onObjectPicked(r)),this.setPickingProps({isActive:!1,highlightedBatchIndex:r.batchIndex,highlightedObjectIndex:r.objectIndex}),this.pickInfo):null}getPickPosition(t){let e=this.device.type!=="webgpu",n=this.device.getDefaultCanvasContext().cssToDevicePixels(t,e),r=n.x+Math.floor(n.width/2),s=n.y+Math.floor(n.height/2);return[r,s]}createIndexFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT}),e=this.device.createTexture({format:"rg32sint",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT|Z.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t,e],depthStencilAttachment:"depth24plus"})}createColorFramebuffer(){let t=this.device.createTexture({format:"rgba8unorm",width:1,height:1,usage:Z.Texture.RENDER_ATTACHMENT|Z.Texture.COPY_SRC});return this.device.createFramebuffer({colorAttachments:[t],depthStencilAttachment:"depth24plus"})}setPickingProps(t){this.props.shaderInputs?.setProps({picking:t})}async readPickInfo(t,e){return this.mode==="index"?this.readIndexPickInfo(t,e):this.readColorPickInfo(t,e)}async readIndexPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[Fn]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Z.Buffer.COPY_DST|Z.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return Bn(new Int32Array(c.buffer,c.byteOffset,2))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:Fn});return r?Bn(new Int32Array(r.buffer,r.byteOffset,2)):null}async readColorPickInfo(t,[e,n]){if(this.device.type==="webgpu"){let s=t.colorAttachments[0]?.texture;if(!s)return null;let o=s.computeMemoryLayout({width:1,height:1}),a=this.device.createBuffer({byteLength:o.byteLength,usage:Z.Buffer.COPY_DST|Z.Buffer.MAP_READ});try{s.readBuffer({x:e,y:n,width:1,height:1},a);let c=await a.readAsync(0,o.byteLength);return zn(new Uint8Array(c.buffer,c.byteOffset,4))}finally{a.destroy()}}let r=this.device.readPixelsToArrayWebGL(t,{sourceX:e,sourceY:n,sourceWidth:1,sourceHeight:1,sourceAttachment:0});return r?zn(new Uint8Array(r.buffer,r.byteOffset,4)):null}hasPickInfoChanged(t){return t.objectIndex!==this.pickInfo.objectIndex||t.batchIndex!==this.pickInfo.batchIndex}},Ut=Ae;Y(Ut,"defaultProps",{shaderInputs:void 0,onObjectPicked:()=>{},mode:"color",backend:"color"});var Ws=`${we}
|
|
248
248
|
|
|
249
|
-
const COLOR_PICKING_INVALID_INDEX = ${
|
|
249
|
+
const COLOR_PICKING_INVALID_INDEX = ${j};
|
|
250
250
|
const COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
|
|
251
251
|
const COLOR_PICKING_MAX_BATCH_INDEX = 254;
|
|
252
252
|
|
|
@@ -315,12 +315,12 @@ fn picking_filterPickingColor(color: vec4<f32>, objectIndex: i32) -> vec4<f32> {
|
|
|
315
315
|
|
|
316
316
|
return color;
|
|
317
317
|
}
|
|
318
|
-
|
|
318
|
+
`,Ys=`${Pt}
|
|
319
319
|
|
|
320
320
|
const int INDEX_PICKING_MODE_INSTANCE = 0;
|
|
321
321
|
const int INDEX_PICKING_MODE_CUSTOM = 1;
|
|
322
322
|
|
|
323
|
-
const int COLOR_PICKING_INVALID_INDEX = ${
|
|
323
|
+
const int COLOR_PICKING_INVALID_INDEX = ${j};
|
|
324
324
|
|
|
325
325
|
flat out int picking_objectIndex;
|
|
326
326
|
|
|
@@ -334,9 +334,9 @@ void picking_setObjectIndex(int objectIndex) {
|
|
|
334
334
|
break;
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
|
-
`,
|
|
337
|
+
`,Ks=`${Pt}
|
|
338
338
|
|
|
339
|
-
const int COLOR_PICKING_INVALID_INDEX = ${
|
|
339
|
+
const int COLOR_PICKING_INVALID_INDEX = ${j};
|
|
340
340
|
const int COLOR_PICKING_MAX_OBJECT_INDEX = 16777214;
|
|
341
341
|
const int COLOR_PICKING_MAX_BATCH_INDEX = 254;
|
|
342
342
|
|
|
@@ -407,11 +407,11 @@ vec4 picking_filterColor(vec4 color) {
|
|
|
407
407
|
outColor = picking_filterPickingColor(outColor);
|
|
408
408
|
return outColor;
|
|
409
409
|
}
|
|
410
|
-
|
|
410
|
+
`,Gt={...St,name:"picking",source:Ws,vs:Ys,fs:Ks};var Zs=`${we}
|
|
411
411
|
|
|
412
412
|
const INDEX_PICKING_MODE_INSTANCE = 0;
|
|
413
413
|
const INDEX_PICKING_MODE_CUSTOM = 1;
|
|
414
|
-
const INDEX_PICKING_INVALID_INDEX = ${
|
|
414
|
+
const INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
|
|
415
415
|
|
|
416
416
|
/**
|
|
417
417
|
* WGSL shaders need to carry the returned object index through their own stage outputs.
|
|
@@ -454,12 +454,12 @@ fn picking_getPickingColor(objectIndex: i32) -> vec2<i32> {
|
|
|
454
454
|
return vec2<i32>(objectIndex, picking.batchIndex);
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
-
`,
|
|
457
|
+
`,Qs=`${Pt}
|
|
458
458
|
|
|
459
459
|
const int INDEX_PICKING_MODE_INSTANCE = 0;
|
|
460
460
|
const int INDEX_PICKING_MODE_CUSTOM = 1;
|
|
461
461
|
|
|
462
|
-
const int INDEX_PICKING_INVALID_INDEX = ${
|
|
462
|
+
const int INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
|
|
463
463
|
|
|
464
464
|
flat out int picking_objectIndex;
|
|
465
465
|
|
|
@@ -477,9 +477,9 @@ void picking_setObjectIndex(int objectIndex) {
|
|
|
477
477
|
break;
|
|
478
478
|
}
|
|
479
479
|
}
|
|
480
|
-
`,
|
|
480
|
+
`,Js=`${Pt}
|
|
481
481
|
|
|
482
|
-
const int INDEX_PICKING_INVALID_INDEX = ${
|
|
482
|
+
const int INDEX_PICKING_INVALID_INDEX = ${j}; // 2^32 - 1
|
|
483
483
|
|
|
484
484
|
flat in int picking_objectIndex;
|
|
485
485
|
|
|
@@ -545,6 +545,6 @@ vec4 picking_filterColor(vec4 color) {
|
|
|
545
545
|
outColor = picking_filterPickingColor(outColor);
|
|
546
546
|
return outColor;
|
|
547
547
|
}
|
|
548
|
-
`,
|
|
548
|
+
`,Pe={...St,name:"picking",source:Zs,vs:Qs,fs:Js};var Un={...St,name:"picking",source:Pe.source,vs:Gt.vs,fs:Gt.fs};var Se=class{device;framebuffer=null;shaderInputs;constructor(t,e){this.device=t,this.shaderInputs=e}destroy(){this.framebuffer?.destroy()}getFramebuffer(){return this.framebuffer||(this.framebuffer=this.device.createFramebuffer({colorAttachments:["rgba8unorm"],depthStencilAttachment:"depth24plus"})),this.framebuffer}clearPickState(){this.shaderInputs.setProps({picking:{highlightedObjectColor:null}})}beginRenderPass(){let t=this.getFramebuffer();return t.resize(this.device.getCanvasContext().getDevicePixelSize()),this.shaderInputs.setProps({picking:{isActive:!0}}),this.device.beginRenderPass({framebuffer:t,clearColor:[0,0,0,0],clearDepth:1})}updatePickState(t){let e=this.getFramebuffer(),[n,r]=this.getPickPosition(t),o=[...this.device.readPixelsToArrayWebGL(e,{sourceX:n,sourceY:r,sourceWidth:1,sourceHeight:1})].map(c=>c/255);o[0]+o[1]+o[2]>0||(o=null),this.shaderInputs.setProps({picking:{isActive:!1,highlightedObjectColor:o}})}getPickPosition(t){let e=this.device.getCanvasContext().cssToDevicePixels(t),n=e.x+Math.floor(e.width/2),r=e.y+Math.floor(e.height/2);return[n,r]}};var Gn=k(nt(),1),$n=Gn.picking;var to=B;return er($t);})();
|
|
549
549
|
return __exports__;
|
|
550
550
|
});
|