@deck.gl/extensions 9.4.0-alpha.2 → 9.4.0-beta.1

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.min.js CHANGED
@@ -4,13 +4,13 @@
4
4
  else if (typeof define === 'function' && define.amd) define([], factory);
5
5
  else if (typeof exports === 'object') exports['deck'] = factory();
6
6
  else root['deck'] = factory();})(globalThis, function () {
7
- "use strict";var __exports__=(()=>{var Yt=Object.create;var Q=Object.defineProperty;var Kt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var Zt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var Ae=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),Se=(i,e)=>{for(var t in e)Q(i,t,{get:e[t],enumerable:!0})},X=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of $t(e))!Jt.call(i,o)&&o!==t&&Q(i,o,{get:()=>e[o],enumerable:!(r=Kt(e,o))||r.enumerable});return i},y=(i,e,t)=>(X(i,e,"default"),t&&X(t,e,"default")),d=(i,e,t)=>(t=i!=null?Yt(Zt(i)):{},X(e||!i||!i.__esModule?Q(t,"default",{value:i,enumerable:!0}):t,i)),Xt=i=>X(Q({},"__esModule",{value:!0}),i);var _=Ae((qr,Ie)=>{Ie.exports=globalThis.deck});var Ye=Ae((Jr,We)=>{We.exports=globalThis.luma});var J={};Se(J,{BrushingExtension:()=>Be,ClipExtension:()=>Ft,CollisionFilterExtension:()=>It,DataFilterExtension:()=>Qe,FillStyleExtension:()=>Pt,Fp64Extension:()=>dt,MaskExtension:()=>Nt,PathStyleExtension:()=>gt,_TerrainExtension:()=>Wt,project64:()=>oe});var x={},Ce=d(_(),1);y(x,d(_(),1));if(!Ce.Layer)throw new Error("@deck.gl/core is not found");y(J,x);var Ne=d(_(),1);var Re=d(_(),1),ke=`layout(std140) uniform brushingUniforms {
7
+ "use strict";var __exports__=(()=>{var Kt=Object.create;var J=Object.defineProperty;var Zt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var Qt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var Be=(i,e)=>()=>{try{return e||i((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},Le=(i,e)=>{for(var t in e)J(i,t,{get:e[t],enumerable:!0})},Q=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of $t(e))!Jt.call(i,n)&&n!==t&&J(i,n,{get:()=>e[n],enumerable:!(r=Zt(e,n))||r.enumerable});return i},b=(i,e,t)=>(Q(i,e,"default"),t&&Q(t,e,"default")),d=(i,e,t)=>(t=i!=null?Kt(Qt(i)):{},Q(e||!i||!i.__esModule?J(t,"default",{value:i,enumerable:!0}):t,i)),Xt=i=>Q(J({},"__esModule",{value:!0}),i);var _=Be((Wr,Oe)=>{Oe.exports=globalThis.deck});var Ye=Be((Jr,We)=>{We.exports=globalThis.luma});var $={};Le($,{BrushingExtension:()=>Ne,ClipExtension:()=>At,CollisionFilterExtension:()=>wt,DataFilterExtension:()=>Xe,FillStyleExtension:()=>Et,Fp64Extension:()=>_t,MaskExtension:()=>Nt,PathStyleExtension:()=>xt,_TerrainExtension:()=>Yt,project64:()=>ne});var x={},we=d(_(),1);b(x,d(_(),1));if(!we.Layer)throw new Error("@deck.gl/core is not found");b($,x);var ke=d(_(),1);var Ie=d(_(),1),Re=`layout(std140) uniform brushingUniforms {
8
8
  bool enabled;
9
9
  highp int target;
10
10
  vec2 mousePos;
11
11
  float radius;
12
12
  } brushing;
13
- `,Qt=`
13
+ `,ei=`
14
14
  in vec2 brushingTargets;
15
15
 
16
16
  out float brushing_isVisible;
@@ -33,15 +33,15 @@
33
33
  void brushing_setVisible(bool visible) {
34
34
  brushing_isVisible = float(visible);
35
35
  }
36
- `,ei=`
37
- ${ke}
38
- ${Qt}
39
36
  `,ti=`
40
- in float brushing_isVisible;
37
+ ${Re}
38
+ ${ei}
41
39
  `,ii=`
42
- ${ke}
43
- ${ti}
44
- `,ri={source:0,target:1,custom:2,source_target:3},oi={"vs:DECKGL_FILTER_GL_POSITION":`
40
+ in float brushing_isVisible;
41
+ `,ri=`
42
+ ${Re}
43
+ ${ii}
44
+ `,ni={source:0,target:1,custom:2,source_target:3},oi={"vs:DECKGL_FILTER_GL_POSITION":`
45
45
  vec2 brushingTarget;
46
46
  vec2 brushingSource;
47
47
  if (brushing.target == 3) {
@@ -65,7 +65,7 @@ ${ti}
65
65
  if (brushing.enabled && brushing_isVisible < 0.5) {
66
66
  discard;
67
67
  }
68
- `},we={name:"brushing",dependencies:[Re.project],vs:ei,fs:ii,inject:oi,getUniforms:i=>{if(!i||!("viewport"in i))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:r="source",mousePosition:o,viewport:s}=i;return{enabled:Boolean(e&&o&&s.containsPixel(o)),radius:t,target:ri[r]||0,mousePos:o?s.unproject([o.x-s.x,o.y-s.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var si={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},S=class extends Ne.LayerExtension{getShaders(){return{modules:[we]}}initializeState(e,t){let r=this.getAttributeManager();r&&r.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let o=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=o,e.deck&&e.deck.eventManager.on({pointermove:o,pointerleave:o})}finalizeState(e,t){if(e.deck){let r=this.state.onMouseMove;e.deck.eventManager.off({pointermove:r,pointerleave:r})}}draw(e,t){let{viewport:r,mousePosition:o}=e.context,{brushingEnabled:s,brushingRadius:n,brushingTarget:a}=this.props,l={viewport:r,mousePosition:o,brushingEnabled:s,brushingRadius:n,brushingTarget:a};this.setShaderModuleProps({brushing:l})}};S.defaultProps=si;S.extensionName="BrushingExtension";var Be=S;var E=d(_(),1);var De=`layout(std140) uniform dataFilterUniforms {
68
+ `},Ce={name:"brushing",dependencies:[Ie.project],vs:ti,fs:ri,inject:oi,getUniforms:i=>{if(!i||!("viewport"in i))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:r="source",mousePosition:n,viewport:o}=i;return{enabled:!!(e&&n&&o.containsPixel(n)),radius:t,target:ni[r]||0,mousePos:n?o.unproject([n.x-o.x,n.y-o.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var si={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},L=class extends ke.LayerExtension{getShaders(){return{modules:[Ce]}}initializeState(e,t){let r=this.getAttributeManager();r&&r.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let n=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=n,e.deck&&e.deck.eventManager.on({pointermove:n,pointerleave:n})}finalizeState(e,t){if(e.deck){let r=this.state.onMouseMove;e.deck.eventManager.off({pointermove:r,pointerleave:r})}}draw(e,t){let{viewport:r,mousePosition:n}=e.context,{brushingEnabled:o,brushingRadius:s,brushingTarget:a}=this.props,f={viewport:r,mousePosition:n,brushingEnabled:o,brushingRadius:s,brushingTarget:a};this.setShaderModuleProps({brushing:f})}};L.defaultProps=si;L.extensionName="BrushingExtension";var Ne=L;var E=d(_(),1);var De=`layout(std140) uniform dataFilterUniforms {
69
69
  bool useSoftMargin;
70
70
  bool enabled;
71
71
  bool transformSize;
@@ -78,7 +78,7 @@ ${ti}
78
78
  vec4 max64High;
79
79
  highp uvec4 categoryBitMask;
80
80
  } dataFilter;
81
- `,ni=`
81
+ `,ai=`
82
82
  #ifdef DATAFILTER_TYPE
83
83
  in DATAFILTER_TYPE filterValues;
84
84
  #ifdef DATAFILTER_DOUBLE
@@ -241,13 +241,13 @@ float dataFilter_reduceValue(vec4 value) {
241
241
  #endif
242
242
  `,ze=`
243
243
  ${De}
244
- ${ni}
245
- `,ai=`
244
+ ${ai}
245
+ `,fi=`
246
246
  in float dataFilter_value;
247
247
  `,Ve=`
248
248
  ${De}
249
- ${ai}
250
- `;function je(i){if(!i||!("extensions"in i))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:r=!0,filterTransformColor:o=!0,categoryBitMask:s}=i,n=i.filterSoftRange||e,a=l=>Array.isArray(l)?[l[0]||0,l[1]||0,l[2]||0,l[3]||0]:[l,0,0,0];return{...Number.isFinite(e[0])?{min:a(e[0]),softMin:a(n[0]),softMax:a(n[1]),max:a(e[1])}:{min:a(e.map(l=>l[0])),softMin:a(n.map(l=>l[0])),softMax:a(n.map(l=>l[1])),max:a(e.map(l=>l[1]))},enabled:t,useSoftMargin:Boolean(i.filterSoftRange),transformSize:t&&r,transformColor:t&&o,...s&&{categoryBitMask:s}}}function li(i){if(!i||!("extensions"in i))return{};let e=je(i),t=e.min.map(Math.fround);e.min=e.min.map((o,s)=>o-t[s]),e.softMin=e.softMin.map((o,s)=>o-t[s]),e.min64High=t;let r=e.max.map(Math.fround);return e.max=e.max.map((o,s)=>o-r[s]),e.softMax=e.softMax.map((o,s)=>o-r[s]),e.max64High=r,e}var Ue={"vs:#main-start":`
249
+ ${fi}
250
+ `;function Ue(i){if(!i||!("extensions"in i))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:r=!0,filterTransformColor:n=!0,categoryBitMask:o}=i,s=i.filterSoftRange||e,a=f=>Array.isArray(f)?[f[0]||0,f[1]||0,f[2]||0,f[3]||0]:[f,0,0,0];return{...Number.isFinite(e[0])?{min:a(e[0]),softMin:a(s[0]),softMax:a(s[1]),max:a(e[1])}:{min:a(e.map(f=>f[0])),softMin:a(s.map(f=>f[0])),softMax:a(s.map(f=>f[1])),max:a(e.map(f=>f[1]))},enabled:t,useSoftMargin:!!i.filterSoftRange,transformSize:t&&r,transformColor:t&&n,...o&&{categoryBitMask:o}}}function li(i){if(!i||!("extensions"in i))return{};let e=Ue(i),t=e.min.map(Math.fround);e.min=e.min.map((n,o)=>n-t[o]),e.softMin=e.softMin.map((n,o)=>n-t[o]),e.min64High=t;let r=e.max.map(Math.fround);return e.max=e.max.map((n,o)=>n-r[o]),e.softMax=e.softMax.map((n,o)=>n-r[o]),e.max64High=r,e}var je={"vs:#main-start":`
251
251
  dataFilter_value = 1.0;
252
252
  if (dataFilter.enabled) {
253
253
  #ifdef DATAFILTER_TYPE
@@ -278,7 +278,7 @@ ${ai}
278
278
  if (dataFilter.transformColor) {
279
279
  color.a *= dataFilter_value;
280
280
  }
281
- `};function Ge(i){return{useSoftMargin:"i32",enabled:"i32",transformSize:"i32",transformColor:"i32",min:"vec4<f32>",softMin:"vec4<f32>",softMax:"vec4<f32>",max:"vec4<f32>",min64High:"vec4<f32>",max64High:"vec4<f32>",categoryBitMask:"vec4<u32>"}}var He={name:"dataFilter",vs:ze,fs:Ve,inject:Ue,getUniforms:je,uniformTypesFromOptions:Ge},qe={name:"dataFilter",vs:ze,fs:Ve,inject:Ue,getUniforms:li,uniformTypesFromOptions:Ge};var Ke=d(Ye(),1),fi=`#version 300 es
281
+ `};function Ge(i){return{useSoftMargin:"i32",enabled:"i32",transformSize:"i32",transformColor:"i32",min:"vec4<f32>",softMin:"vec4<f32>",softMax:"vec4<f32>",max:"vec4<f32>",min64High:"vec4<f32>",max64High:"vec4<f32>",categoryBitMask:"vec4<u32>"}}var He={name:"dataFilter",vs:ze,fs:Ve,inject:je,getUniforms:Ue,uniformTypesFromOptions:Ge},qe={name:"dataFilter",vs:ze,fs:Ve,inject:je,getUniforms:li,uniformTypesFromOptions:Ge};var Ke=d(Ye(),1),ui=`#version 300 es
282
282
  #define SHADER_NAME data-filter-vertex-shader
283
283
 
284
284
  #ifdef FLOAT_TARGET
@@ -323,7 +323,7 @@ void main() {
323
323
  }
324
324
  fragColor = vColor;
325
325
  }
326
- `,ui=["float32-renderable-webgl","texture-blend-float-webgl"];function $e(i){return ui.every(e=>i.features.has(e))}function Ze(i,e){return e?i.createFramebuffer({width:1,height:1,colorAttachments:[i.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):i.createFramebuffer({width:256,height:64,colorAttachments:[i.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function Je(i,e,t,r){return t.defines.NON_INSTANCED_MODEL=1,r&&(t.defines.FLOAT_TARGET=1),new Ke.Model(i,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:fi,fs:ci,bufferLayout:e,...t})}var Xe={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var di={getFilterValue:{type:"accessor",value:0},getFilterCategory:{type:"accessor",value:0},onFilteredItemsChange:{type:"function",value:null,optional:!0},filterEnabled:!0,filterRange:[-1,1],filterSoftRange:null,filterCategories:[0],filterTransformSize:!0,filterTransformColor:!0},_i={categorySize:0,filterSize:1,fp64:!1,countItems:!1},mi={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},hi={1:"float",2:"vec2",3:"vec3",4:"vec4"},I=class extends E.LayerExtension{constructor(e={}){super({..._i,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:o}=e.opts,s={};t&&(s.DATACATEGORY_TYPE=mi[t],s.DATACATEGORY_CHANNELS=t),r&&(s.DATAFILTER_TYPE=hi[r],s.DATAFILTER_DOUBLE=Boolean(o));let n=o?qe:He;return n.uniformTypes=n.uniformTypesFromOptions(e.opts),{modules:[n],defines:s}}initializeState(e,t){let r=this.getAttributeManager(),{categorySize:o,filterSize:s,fp64:n}=t.opts;r&&(s&&r.add({filterValues:{size:s,type:n?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),o&&r.add({filterCategoryValues:{size:o,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:o===1?l=>t._getCategoryKey.call(this,l,0):l=>l.map((f,u)=>t._getCategoryKey.call(this,f,u))}}));let{device:a}=this.context;if(r&&t.opts.countItems){let l=$e(a);r.add({filterVertexIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(c,{index:p})=>{let m=c&&c.__source?c.__source.index:p;return l?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let f=Ze(a,l),u=Je(a,r.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),l);this.setState({filterFBO:f,filterModel:u})}}updateState({props:e,oldProps:t,changeFlags:r},o){let s=this.getAttributeManager(),{categorySize:n}=o.opts;if(this.state.filterModel){let a=s.attributes.filterValues?.needsUpdate()||s.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}s?.attributes.filterCategoryValues&&((s.attributes.filterCategoryValues.needsUpdate()||!(0,E._deepEqual)(e.filterCategories,t.filterCategories,2))&&this.setState({categoryBitMask:null}),r.dataChanged&&(this.setState({categoryMap:Array(n).fill(0).map(()=>({}))}),s.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let r=this.state.filterFBO,o=this.state.filterModel,s=this.state.filterNeedsUpdate;this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t);let{onFilteredItemsChange:n,extensions:a,filterEnabled:l,filterRange:f,filterSoftRange:u,filterTransformSize:c,filterTransformColor:p,filterCategories:m}=this.props,h={extensions:a,filterEnabled:l,filterRange:f,filterSoftRange:u,filterTransformSize:c,filterTransformColor:p,filterCategories:m};if(this.state.categoryBitMask&&(h.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:h}),s&&n&&o){let P=this.getAttributeManager(),{attributes:{filterValues:v,filterCategoryValues:A,filterVertexIndices:ue}}=P;o.setVertexCount(this.getNumInstances());let pe={...v?.getValue(),...A?.getValue(),...ue?.getValue()};o.setAttributes(pe),o.shaderInputs.setProps({dataFilter:h});let de=[0,0,r.width,r.height],Te=o.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:de},clearColor:[0,0,0,0]});o.setParameters(Xe),o.draw(Te),Te.end();let Oe=o.device.readPixelsToArrayWebGL(r),Le=0;for(let _e=0;_e<Oe.length;_e++)Le+=Oe[_e];n({id:this.id,count:Le}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:r}=t.opts;if(!r)return;let{filterCategories:o}=this.props,s=new Uint32Array([0,0,0,0]),n=r===1?[o]:o,a=r===1?128:r===2?64:32;for(let l=0;l<n.length;l++){let f=n[l];for(let u of f){let c=t._getCategoryKey.call(this,u,l);if(c<a){let p=l*(a/32)+Math.floor(c/32);s[p]+=Math.pow(2,c%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=s}_getCategoryKey(e,t){let r=this.state.categoryMap[t];return e in r||(r[e]=Object.keys(r).length),r[e]}};I.defaultProps=di;I.extensionName="DataFilterExtension";var Qe=I;var pt=d(_(),1);var eo=1/Math.PI*180,to=1/180*Math.PI,vi={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...vi}};var C=globalThis.mathgl.config;function me(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function M(i,e,t){let r=C.EPSILON;t&&(C.EPSILON=t);try{if(i===e)return!0;if(me(i)&&me(e)){if(i.length!==e.length)return!1;for(let o=0;o<i.length;++o)if(!M(i[o],e[o]))return!1;return!0}return i&&i.equals?i.equals(e):e&&e.equals?e.equals(i):typeof i=="number"&&typeof e=="number"?Math.abs(i-e)<=C.EPSILON*Math.max(1,Math.abs(i),Math.abs(e)):!1}finally{C.EPSILON=r}}var R=typeof Float32Array<"u"?Float32Array:Array,he=Math.random;function ee(i){return i>=0?Math.round(i):i%.5===0?Math.floor(i):Math.round(i)}var ro=Math.PI/180;var k={};Se(k,{add:()=>Ei,angle:()=>Wi,bezier:()=>Di,ceil:()=>Mi,clone:()=>xi,copy:()=>bi,create:()=>et,cross:()=>ki,dist:()=>er,distance:()=>st,div:()=>Qi,divide:()=>ot,dot:()=>ge,equals:()=>Zi,exactEquals:()=>$i,floor:()=>Fi,forEach:()=>or,fromValues:()=>yi,hermite:()=>Bi,inverse:()=>Ci,len:()=>ir,length:()=>tt,lerp:()=>wi,max:()=>Oi,min:()=>Ti,mul:()=>Xi,multiply:()=>rt,negate:()=>Ii,normalize:()=>Ri,random:()=>zi,rotateX:()=>Gi,rotateY:()=>Hi,rotateZ:()=>qi,round:()=>Li,scale:()=>Ai,scaleAndAdd:()=>Si,set:()=>Pi,slerp:()=>Ni,sqrDist:()=>tr,sqrLen:()=>rr,squaredDistance:()=>nt,squaredLength:()=>at,str:()=>Ki,sub:()=>Ji,subtract:()=>it,transformMat3:()=>ji,transformMat4:()=>Vi,transformQuat:()=>Ui,zero:()=>Yi});function et(){let i=new R(3);return R!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function xi(i){let e=new R(3);return e[0]=i[0],e[1]=i[1],e[2]=i[2],e}function tt(i){let e=i[0],t=i[1],r=i[2];return Math.sqrt(e*e+t*t+r*r)}function yi(i,e,t){let r=new R(3);return r[0]=i,r[1]=e,r[2]=t,r}function bi(i,e){return i[0]=e[0],i[1]=e[1],i[2]=e[2],i}function Pi(i,e,t,r){return i[0]=e,i[1]=t,i[2]=r,i}function Ei(i,e,t){return i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i}function it(i,e,t){return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i}function rt(i,e,t){return i[0]=e[0]*t[0],i[1]=e[1]*t[1],i[2]=e[2]*t[2],i}function ot(i,e,t){return i[0]=e[0]/t[0],i[1]=e[1]/t[1],i[2]=e[2]/t[2],i}function Mi(i,e){return i[0]=Math.ceil(e[0]),i[1]=Math.ceil(e[1]),i[2]=Math.ceil(e[2]),i}function Fi(i,e){return i[0]=Math.floor(e[0]),i[1]=Math.floor(e[1]),i[2]=Math.floor(e[2]),i}function Ti(i,e,t){return i[0]=Math.min(e[0],t[0]),i[1]=Math.min(e[1],t[1]),i[2]=Math.min(e[2],t[2]),i}function Oi(i,e,t){return i[0]=Math.max(e[0],t[0]),i[1]=Math.max(e[1],t[1]),i[2]=Math.max(e[2],t[2]),i}function Li(i,e){return i[0]=ee(e[0]),i[1]=ee(e[1]),i[2]=ee(e[2]),i}function Ai(i,e,t){return i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i}function Si(i,e,t,r){return i[0]=e[0]+t[0]*r,i[1]=e[1]+t[1]*r,i[2]=e[2]+t[2]*r,i}function st(i,e){let t=e[0]-i[0],r=e[1]-i[1],o=e[2]-i[2];return Math.sqrt(t*t+r*r+o*o)}function nt(i,e){let t=e[0]-i[0],r=e[1]-i[1],o=e[2]-i[2];return t*t+r*r+o*o}function at(i){let e=i[0],t=i[1],r=i[2];return e*e+t*t+r*r}function Ii(i,e){return i[0]=-e[0],i[1]=-e[1],i[2]=-e[2],i}function Ci(i,e){return i[0]=1/e[0],i[1]=1/e[1],i[2]=1/e[2],i}function Ri(i,e){let t=e[0],r=e[1],o=e[2],s=t*t+r*r+o*o;return s>0&&(s=1/Math.sqrt(s)),i[0]=e[0]*s,i[1]=e[1]*s,i[2]=e[2]*s,i}function ge(i,e){return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]}function ki(i,e,t){let r=e[0],o=e[1],s=e[2],n=t[0],a=t[1],l=t[2];return i[0]=o*l-s*a,i[1]=s*n-r*l,i[2]=r*a-o*n,i}function wi(i,e,t,r){let o=e[0],s=e[1],n=e[2];return i[0]=o+r*(t[0]-o),i[1]=s+r*(t[1]-s),i[2]=n+r*(t[2]-n),i}function Ni(i,e,t,r){let o=Math.acos(Math.min(Math.max(ge(e,t),-1),1)),s=Math.sin(o),n=Math.sin((1-r)*o)/s,a=Math.sin(r*o)/s;return i[0]=n*e[0]+a*t[0],i[1]=n*e[1]+a*t[1],i[2]=n*e[2]+a*t[2],i}function Bi(i,e,t,r,o,s){let n=s*s,a=n*(2*s-3)+1,l=n*(s-2)+s,f=n*(s-1),u=n*(3-2*s);return i[0]=e[0]*a+t[0]*l+r[0]*f+o[0]*u,i[1]=e[1]*a+t[1]*l+r[1]*f+o[1]*u,i[2]=e[2]*a+t[2]*l+r[2]*f+o[2]*u,i}function Di(i,e,t,r,o,s){let n=1-s,a=n*n,l=s*s,f=a*n,u=3*s*a,c=3*l*n,p=l*s;return i[0]=e[0]*f+t[0]*u+r[0]*c+o[0]*p,i[1]=e[1]*f+t[1]*u+r[1]*c+o[1]*p,i[2]=e[2]*f+t[2]*u+r[2]*c+o[2]*p,i}function zi(i,e){e=e===void 0?1:e;let t=he()*2*Math.PI,r=he()*2-1,o=Math.sqrt(1-r*r)*e;return i[0]=Math.cos(t)*o,i[1]=Math.sin(t)*o,i[2]=r*e,i}function Vi(i,e,t){let r=e[0],o=e[1],s=e[2],n=t[3]*r+t[7]*o+t[11]*s+t[15];return n=n||1,i[0]=(t[0]*r+t[4]*o+t[8]*s+t[12])/n,i[1]=(t[1]*r+t[5]*o+t[9]*s+t[13])/n,i[2]=(t[2]*r+t[6]*o+t[10]*s+t[14])/n,i}function ji(i,e,t){let r=e[0],o=e[1],s=e[2];return i[0]=r*t[0]+o*t[3]+s*t[6],i[1]=r*t[1]+o*t[4]+s*t[7],i[2]=r*t[2]+o*t[5]+s*t[8],i}function Ui(i,e,t){let r=t[0],o=t[1],s=t[2],n=t[3],a=e[0],l=e[1],f=e[2],u=o*f-s*l,c=s*a-r*f,p=r*l-o*a,m=o*p-s*c,h=s*u-r*p,P=r*c-o*u,v=n*2;return u*=v,c*=v,p*=v,m*=2,h*=2,P*=2,i[0]=a+u+m,i[1]=l+c+h,i[2]=f+p+P,i}function Gi(i,e,t,r){let o=[],s=[];return o[0]=e[0]-t[0],o[1]=e[1]-t[1],o[2]=e[2]-t[2],s[0]=o[0],s[1]=o[1]*Math.cos(r)-o[2]*Math.sin(r),s[2]=o[1]*Math.sin(r)+o[2]*Math.cos(r),i[0]=s[0]+t[0],i[1]=s[1]+t[1],i[2]=s[2]+t[2],i}function Hi(i,e,t,r){let o=[],s=[];return o[0]=e[0]-t[0],o[1]=e[1]-t[1],o[2]=e[2]-t[2],s[0]=o[2]*Math.sin(r)+o[0]*Math.cos(r),s[1]=o[1],s[2]=o[2]*Math.cos(r)-o[0]*Math.sin(r),i[0]=s[0]+t[0],i[1]=s[1]+t[1],i[2]=s[2]+t[2],i}function qi(i,e,t,r){let o=[],s=[];return o[0]=e[0]-t[0],o[1]=e[1]-t[1],o[2]=e[2]-t[2],s[0]=o[0]*Math.cos(r)-o[1]*Math.sin(r),s[1]=o[0]*Math.sin(r)+o[1]*Math.cos(r),s[2]=o[2],i[0]=s[0]+t[0],i[1]=s[1]+t[1],i[2]=s[2]+t[2],i}function Wi(i,e){let t=i[0],r=i[1],o=i[2],s=e[0],n=e[1],a=e[2],l=Math.sqrt((t*t+r*r+o*o)*(s*s+n*n+a*a)),f=l&&ge(i,e)/l;return Math.acos(Math.min(Math.max(f,-1),1))}function Yi(i){return i[0]=0,i[1]=0,i[2]=0,i}function Ki(i){return`vec3(${i[0]}, ${i[1]}, ${i[2]})`}function $i(i,e){return i[0]===e[0]&&i[1]===e[1]&&i[2]===e[2]}function Zi(i,e){let t=i[0],r=i[1],o=i[2],s=e[0],n=e[1],a=e[2];return Math.abs(t-s)<=1e-6*Math.max(1,Math.abs(t),Math.abs(s))&&Math.abs(r-n)<=1e-6*Math.max(1,Math.abs(r),Math.abs(n))&&Math.abs(o-a)<=1e-6*Math.max(1,Math.abs(o),Math.abs(a))}var Ji=it,Xi=rt,Qi=ot,er=st,tr=nt,ir=tt,rr=at,or=function(){let i=et();return function(e,t,r,o,s,n){let a,l;for(t||(t=3),r||(r=0),o?l=Math.min(o*t+r,e.length):l=e.length,a=r;a<l;a+=t)i[0]=e[a],i[1]=e[a+1],i[2]=e[a+2],s(i,i,n),e[a]=i[0],e[a+1]=i[1],e[a+2]=i[2];return e}}();function te(i,e=[],t=0){let r=Math.fround(i),o=i-r;return e[t]=r,e[t+1]=o,e}function xe(i){return i-Math.fround(i)}function ye(i){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let r=0;r<4;++r){let o=t*4+r;te(i[r*4+t],e,o*2)}return e}var be=`
326
+ `,pi=["float32-renderable-webgl","texture-blend-float-webgl"];function Ze(i){return pi.every(e=>i.features.has(e))}function $e(i,e){return e?i.createFramebuffer({width:1,height:1,colorAttachments:[i.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):i.createFramebuffer({width:256,height:64,colorAttachments:[i.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function Qe(i,e,t,r){return t.defines.NON_INSTANCED_MODEL=1,r&&(t.defines.FLOAT_TARGET=1),new Ke.Model(i,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:ui,fs:ci,bufferLayout:e,...t})}var Je={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var _i={getFilterValue:{type:"accessor",value:0},getFilterCategory:{type:"accessor",value:0},onFilteredItemsChange:{type:"function",value:null,optional:!0},filterEnabled:!0,filterRange:[-1,1],filterSoftRange:null,filterCategories:[0],filterTransformSize:!0,filterTransformColor:!0},mi={categorySize:0,filterSize:1,fp64:!1,countItems:!1},hi={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},gi={1:"float",2:"vec2",3:"vec3",4:"vec4"},O=class extends E.LayerExtension{constructor(e={}){super({...mi,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:n}=e.opts,o={};t&&(o.DATACATEGORY_TYPE=hi[t],o.DATACATEGORY_CHANNELS=t),r&&(o.DATAFILTER_TYPE=gi[r],o.DATAFILTER_DOUBLE=!!n);let s=n?qe:He;return s.uniformTypes=s.uniformTypesFromOptions(e.opts),{modules:[s],defines:o}}initializeState(e,t){let r=this.getAttributeManager(),{categorySize:n,filterSize:o,fp64:s}=t.opts;r&&(o&&r.add({filterValues:{size:o,type:s?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),n&&r.add({filterCategoryValues:{size:n,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:n===1?f=>t._getCategoryKey.call(this,f,0):f=>f.map((l,c)=>t._getCategoryKey.call(this,l,c))}}));let{device:a}=this.context;if(r&&t.opts.countItems){let f=Ze(a);r.add({filterVertexIndices:{size:f?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:p})=>{let m=u&&u.__source?u.__source.index:p;return f?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let l=$e(a,f),c=Qe(a,r.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),f);this.setState({filterFBO:l,filterModel:c})}}updateState({props:e,oldProps:t,changeFlags:r},n){let o=this.getAttributeManager(),{categorySize:s}=n.opts;if(this.state.filterModel){let a=o.attributes.filterValues?.needsUpdate()||o.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}o?.attributes.filterCategoryValues&&((o.attributes.filterCategoryValues.needsUpdate()||!(0,E._deepEqual)(e.filterCategories,t.filterCategories,2))&&this.setState({categoryBitMask:null}),r.dataChanged&&(this.setState({categoryMap:Array(s).fill(0).map(()=>({}))}),o.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let r=this.state.filterFBO,n=this.state.filterModel,o=this.state.filterNeedsUpdate;this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t);let{onFilteredItemsChange:s,extensions:a,filterEnabled:f,filterRange:l,filterSoftRange:c,filterTransformSize:u,filterTransformColor:p,filterCategories:m}=this.props,h={extensions:a,filterEnabled:f,filterRange:l,filterSoftRange:c,filterTransformSize:u,filterTransformColor:p,filterCategories:m};if(this.state.categoryBitMask&&(h.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:h}),o&&s&&n){let P=this.getAttributeManager(),{attributes:{filterValues:g,filterCategoryValues:B,filterVertexIndices:ce}}=P;n.setVertexCount(this.getNumInstances());let pe={...g?.getValue(),...B?.getValue(),...ce?.getValue()};n.setAttributes(pe),n.shaderInputs.setProps({dataFilter:h});let de=[0,0,r.width,r.height],Ae=n.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:de},clearColor:[0,0,0,0]});n.setParameters(Je),n.draw(Ae),Ae.end();let Se=n.device.readPixelsToArrayWebGL(r),Te=0;for(let _e=0;_e<Se.length;_e++)Te+=Se[_e];s({id:this.id,count:Te}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:r}=t.opts;if(!r)return;let{filterCategories:n}=this.props,o=new Uint32Array([0,0,0,0]),s=r===1?[n]:n,a=r===1?128:r===2?64:32;for(let f=0;f<s.length;f++){let l=s[f];for(let c of l){let u=t._getCategoryKey.call(this,c,f);if(u<a){let p=f*(a/32)+Math.floor(u/32);o[p]+=Math.pow(2,u%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=o}_getCategoryKey(e,t){let r=this.state.categoryMap[t];return e in r||(r[e]=Object.keys(r).length),r[e]}};O.defaultProps=_i;O.extensionName="DataFilterExtension";var Xe=O;var dt=d(_(),1);var tn=1/Math.PI*180,rn=1/180*Math.PI,vi={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...vi}};var w=globalThis.mathgl.config;function me(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function M(i,e,t){let r=w.EPSILON;t&&(w.EPSILON=t);try{if(i===e)return!0;if(me(i)&&me(e)){if(i.length!==e.length)return!1;for(let n=0;n<i.length;++n)if(!M(i[n],e[n]))return!1;return!0}return i&&i.equals?i.equals(e):e&&e.equals?e.equals(i):typeof i=="number"&&typeof e=="number"?Math.abs(i-e)<=w.EPSILON*Math.max(1,Math.abs(i),Math.abs(e)):!1}finally{w.EPSILON=r}}var I=typeof Float32Array<"u"?Float32Array:Array,he=Math.random;function X(i){return i>=0?Math.round(i):i%.5===0?Math.floor(i):Math.round(i)}var on=Math.PI/180;var ee={};Le(ee,{add:()=>Mi,angle:()=>Yi,bezier:()=>zi,ceil:()=>Fi,clone:()=>bi,copy:()=>Pi,create:()=>et,cross:()=>Ci,dist:()=>tr,distance:()=>ot,div:()=>er,divide:()=>nt,dot:()=>ve,equals:()=>Qi,exactEquals:()=>$i,floor:()=>Ai,forEach:()=>or,fromValues:()=>yi,hermite:()=>Di,inverse:()=>Ii,len:()=>rr,length:()=>tt,lerp:()=>ki,max:()=>Ti,min:()=>Si,mul:()=>Xi,multiply:()=>rt,negate:()=>wi,normalize:()=>Ri,random:()=>Vi,rotateX:()=>Hi,rotateY:()=>qi,rotateZ:()=>Wi,round:()=>Bi,scale:()=>Li,scaleAndAdd:()=>Oi,set:()=>Ei,slerp:()=>Ni,sqrDist:()=>ir,sqrLen:()=>nr,squaredDistance:()=>st,squaredLength:()=>at,str:()=>Zi,sub:()=>Ji,subtract:()=>it,transformMat3:()=>ji,transformMat4:()=>Ui,transformQuat:()=>Gi,zero:()=>Ki});function et(){let i=new I(3);return I!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function bi(i){let e=new I(3);return e[0]=i[0],e[1]=i[1],e[2]=i[2],e}function tt(i){let e=i[0],t=i[1],r=i[2];return Math.sqrt(e*e+t*t+r*r)}function yi(i,e,t){let r=new I(3);return r[0]=i,r[1]=e,r[2]=t,r}function Pi(i,e){return i[0]=e[0],i[1]=e[1],i[2]=e[2],i}function Ei(i,e,t,r){return i[0]=e,i[1]=t,i[2]=r,i}function Mi(i,e,t){return i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i}function it(i,e,t){return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i}function rt(i,e,t){return i[0]=e[0]*t[0],i[1]=e[1]*t[1],i[2]=e[2]*t[2],i}function nt(i,e,t){return i[0]=e[0]/t[0],i[1]=e[1]/t[1],i[2]=e[2]/t[2],i}function Fi(i,e){return i[0]=Math.ceil(e[0]),i[1]=Math.ceil(e[1]),i[2]=Math.ceil(e[2]),i}function Ai(i,e){return i[0]=Math.floor(e[0]),i[1]=Math.floor(e[1]),i[2]=Math.floor(e[2]),i}function Si(i,e,t){return i[0]=Math.min(e[0],t[0]),i[1]=Math.min(e[1],t[1]),i[2]=Math.min(e[2],t[2]),i}function Ti(i,e,t){return i[0]=Math.max(e[0],t[0]),i[1]=Math.max(e[1],t[1]),i[2]=Math.max(e[2],t[2]),i}function Bi(i,e){return i[0]=X(e[0]),i[1]=X(e[1]),i[2]=X(e[2]),i}function Li(i,e,t){return i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i}function Oi(i,e,t,r){return i[0]=e[0]+t[0]*r,i[1]=e[1]+t[1]*r,i[2]=e[2]+t[2]*r,i}function ot(i,e){let t=e[0]-i[0],r=e[1]-i[1],n=e[2]-i[2];return Math.sqrt(t*t+r*r+n*n)}function st(i,e){let t=e[0]-i[0],r=e[1]-i[1],n=e[2]-i[2];return t*t+r*r+n*n}function at(i){let e=i[0],t=i[1],r=i[2];return e*e+t*t+r*r}function wi(i,e){return i[0]=-e[0],i[1]=-e[1],i[2]=-e[2],i}function Ii(i,e){return i[0]=1/e[0],i[1]=1/e[1],i[2]=1/e[2],i}function Ri(i,e){let t=e[0],r=e[1],n=e[2],o=t*t+r*r+n*n;return o>0&&(o=1/Math.sqrt(o)),i[0]=e[0]*o,i[1]=e[1]*o,i[2]=e[2]*o,i}function ve(i,e){return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]}function Ci(i,e,t){let r=e[0],n=e[1],o=e[2],s=t[0],a=t[1],f=t[2];return i[0]=n*f-o*a,i[1]=o*s-r*f,i[2]=r*a-n*s,i}function ki(i,e,t,r){let n=e[0],o=e[1],s=e[2];return i[0]=n+r*(t[0]-n),i[1]=o+r*(t[1]-o),i[2]=s+r*(t[2]-s),i}function Ni(i,e,t,r){let n=Math.acos(Math.min(Math.max(ve(e,t),-1),1)),o=Math.sin(n),s=Math.sin((1-r)*n)/o,a=Math.sin(r*n)/o;return i[0]=s*e[0]+a*t[0],i[1]=s*e[1]+a*t[1],i[2]=s*e[2]+a*t[2],i}function Di(i,e,t,r,n,o){let s=o*o,a=s*(2*o-3)+1,f=s*(o-2)+o,l=s*(o-1),c=s*(3-2*o);return i[0]=e[0]*a+t[0]*f+r[0]*l+n[0]*c,i[1]=e[1]*a+t[1]*f+r[1]*l+n[1]*c,i[2]=e[2]*a+t[2]*f+r[2]*l+n[2]*c,i}function zi(i,e,t,r,n,o){let s=1-o,a=s*s,f=o*o,l=a*s,c=3*o*a,u=3*f*s,p=f*o;return i[0]=e[0]*l+t[0]*c+r[0]*u+n[0]*p,i[1]=e[1]*l+t[1]*c+r[1]*u+n[1]*p,i[2]=e[2]*l+t[2]*c+r[2]*u+n[2]*p,i}function Vi(i,e){e=e===void 0?1:e;let t=he()*2*Math.PI,r=he()*2-1,n=Math.sqrt(1-r*r)*e;return i[0]=Math.cos(t)*n,i[1]=Math.sin(t)*n,i[2]=r*e,i}function Ui(i,e,t){let r=e[0],n=e[1],o=e[2],s=t[3]*r+t[7]*n+t[11]*o+t[15];return s=s||1,i[0]=(t[0]*r+t[4]*n+t[8]*o+t[12])/s,i[1]=(t[1]*r+t[5]*n+t[9]*o+t[13])/s,i[2]=(t[2]*r+t[6]*n+t[10]*o+t[14])/s,i}function ji(i,e,t){let r=e[0],n=e[1],o=e[2];return i[0]=r*t[0]+n*t[3]+o*t[6],i[1]=r*t[1]+n*t[4]+o*t[7],i[2]=r*t[2]+n*t[5]+o*t[8],i}function Gi(i,e,t){let r=t[0],n=t[1],o=t[2],s=t[3],a=e[0],f=e[1],l=e[2],c=n*l-o*f,u=o*a-r*l,p=r*f-n*a,m=n*p-o*u,h=o*c-r*p,P=r*u-n*c,g=s*2;return c*=g,u*=g,p*=g,m*=2,h*=2,P*=2,i[0]=a+c+m,i[1]=f+u+h,i[2]=l+p+P,i}function Hi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[0],o[1]=n[1]*Math.cos(r)-n[2]*Math.sin(r),o[2]=n[1]*Math.sin(r)+n[2]*Math.cos(r),i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function qi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[2]*Math.sin(r)+n[0]*Math.cos(r),o[1]=n[1],o[2]=n[2]*Math.cos(r)-n[0]*Math.sin(r),i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function Wi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[0]*Math.cos(r)-n[1]*Math.sin(r),o[1]=n[0]*Math.sin(r)+n[1]*Math.cos(r),o[2]=n[2],i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function Yi(i,e){let t=i[0],r=i[1],n=i[2],o=e[0],s=e[1],a=e[2],f=Math.sqrt((t*t+r*r+n*n)*(o*o+s*s+a*a)),l=f&&ve(i,e)/f;return Math.acos(Math.min(Math.max(l,-1),1))}function Ki(i){return i[0]=0,i[1]=0,i[2]=0,i}function Zi(i){return`vec3(${i[0]}, ${i[1]}, ${i[2]})`}function $i(i,e){return i[0]===e[0]&&i[1]===e[1]&&i[2]===e[2]}function Qi(i,e){let t=i[0],r=i[1],n=i[2],o=e[0],s=e[1],a=e[2];return Math.abs(t-o)<=1e-6*Math.max(1,Math.abs(t),Math.abs(o))&&Math.abs(r-s)<=1e-6*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(n-a)<=1e-6*Math.max(1,Math.abs(n),Math.abs(a))}var Ji=it,Xi=rt,er=nt,tr=ot,ir=st,rr=tt,nr=at,or=(function(){let i=et();return function(e,t,r,n,o,s){let a,f;for(t||(t=3),r||(r=0),n?f=Math.min(n*t+r,e.length):f=e.length,a=r;a<f;a+=t)i[0]=e[a],i[1]=e[a+1],i[2]=e[a+2],o(i,i,s),e[a]=i[0],e[a+1]=i[1],e[a+2]=i[2];return e}})();function te(i,e=[],t=0){let r=Math.fround(i),n=i-r;return e[t]=r,e[t+1]=n,e}function xe(i){return i-Math.fround(i)}function be(i){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let r=0;r<4;++r){let n=t*4+r;te(i[r*4+t],e,n*2)}return e}var ye=`
327
327
  layout(std140) uniform fp64arithmeticUniforms {
328
328
  uniform float ONE;
329
329
  uniform float SPLIT;
@@ -522,6 +522,456 @@ vec2 sqrt_fp64(vec2 a) {
522
522
  return sum_fp64(vec2(yn, 0.0), prod);
523
523
  #endif
524
524
  }
525
+ `;var ft=`struct Fp64F32Bits {
526
+ sign: u32,
527
+ baseExponent: i32,
528
+ significand: u32,
529
+ isZero: bool,
530
+ isInf: bool,
531
+ isNan: bool,
532
+ };
533
+
534
+ // Decode an f32 as (-1)^sign * significand * 2^baseExponent.
535
+ fn fp64_decode_f32_bits(bits: u32) -> Fp64F32Bits {
536
+ let sign = bits >> 31u;
537
+ let exponentBits = (bits >> 23u) & 0xffu;
538
+ let fraction = bits & 0x7fffffu;
539
+
540
+ if (exponentBits == 0xffu) {
541
+ return Fp64F32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);
542
+ }
543
+ if (exponentBits == 0u) {
544
+ return Fp64F32Bits(sign, -149, fraction, fraction == 0u, false, false);
545
+ }
546
+ return Fp64F32Bits(sign, i32(exponentBits) - 150, 0x800000u | fraction, false, false, false);
547
+ }
548
+
549
+ fn fp64_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {
550
+ let aMagnitude = aBits & 0x7fffffffu;
551
+ let bMagnitude = bBits & 0x7fffffffu;
552
+ if (aMagnitude == bMagnitude) {
553
+ return 0;
554
+ }
555
+ return select(-1, 1, aMagnitude > bMagnitude);
556
+ }
557
+
558
+ fn fp64_make_residual_f32_bits(
559
+ exactSign: u32,
560
+ exactMagnitude: vec2u,
561
+ exactBaseExponent: i32,
562
+ highBits: u32
563
+ ) -> u32 {
564
+ if (fp64_u64_is_zero(exactMagnitude)) {
565
+ return 0u;
566
+ }
567
+
568
+ let high = fp64_decode_f32_bits(highBits);
569
+ if (high.isInf || high.isNan) {
570
+ return exactSign << 31u;
571
+ }
572
+ if (high.isZero) {
573
+ return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);
574
+ }
575
+
576
+ let commonBaseExponent = min(exactBaseExponent, high.baseExponent);
577
+ let exactShift = exactBaseExponent - commonBaseExponent;
578
+ let highShift = high.baseExponent - commonBaseExponent;
579
+
580
+ // A normal two-sum/two-product residual never needs a shift this large.
581
+ // This guard gives deterministic underflow behavior outside that contract.
582
+ if (exactShift >= 64 || highShift >= 64) {
583
+ return exactSign << 31u;
584
+ }
585
+
586
+ let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));
587
+ let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));
588
+ let comparison = fp64_u64_compare(exactAligned, highAligned);
589
+ if (comparison == 0) {
590
+ return 0u;
591
+ }
592
+
593
+ var residualSign = exactSign;
594
+ var residualMagnitude: vec2u;
595
+ if (comparison > 0) {
596
+ residualMagnitude = fp64_u64_sub(exactAligned, highAligned);
597
+ } else {
598
+ residualSign = exactSign ^ 1u;
599
+ residualMagnitude = fp64_u64_sub(highAligned, exactAligned);
600
+ }
601
+ return fp64_make_f32_bits_from_u64(
602
+ residualSign,
603
+ residualMagnitude,
604
+ commonBaseExponent
605
+ );
606
+ }
607
+
608
+ fn fp64_split_accumulator_bits(
609
+ sign: u32,
610
+ magnitude: vec2u,
611
+ baseExponent: i32
612
+ ) -> vec2u {
613
+ let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);
614
+ let lowBits = fp64_make_residual_f32_bits(sign, magnitude, baseExponent, highBits);
615
+ return vec2u(highBits, lowBits);
616
+ }
617
+
618
+ fn fp64_two_sum_integer_bits(aBits: u32, bBits: u32) -> vec2u {
619
+ let a = fp64_decode_f32_bits(aBits);
620
+ let b = fp64_decode_f32_bits(bBits);
621
+
622
+ if (a.isNan || b.isNan) {
623
+ return vec2u(0x7fc00000u, 0u);
624
+ }
625
+ if (a.isInf || b.isInf) {
626
+ if (a.isInf && b.isInf && a.sign != b.sign) {
627
+ return vec2u(0x7fc00000u, 0u);
628
+ }
629
+ return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);
630
+ }
631
+ if (a.isZero && b.isZero) {
632
+ return vec2u((a.sign & b.sign) << 31u, 0u);
633
+ }
634
+ if (a.isZero) {
635
+ return vec2u(bBits, 0u);
636
+ }
637
+ if (b.isZero) {
638
+ return vec2u(aBits, 0u);
639
+ }
640
+
641
+ let exponentDifference = select(
642
+ b.baseExponent - a.baseExponent,
643
+ a.baseExponent - b.baseExponent,
644
+ a.baseExponent >= b.baseExponent
645
+ );
646
+
647
+ // Beyond half an ulp, rounding cannot change the larger operand. Returning
648
+ // the smaller operand intact also avoids an unbounded integer alignment.
649
+ // At a power-of-two boundary the spacing below the larger operand is half
650
+ // the spacing above it, so an opposite-sign gap-25 operand can still change
651
+ // the rounded high limb. Gap 26 is the first universally safe early-out.
652
+ if (exponentDifference > 25) {
653
+ if (fp64_f32_magnitude_compare(aBits, bBits) >= 0) {
654
+ return vec2u(aBits, bBits);
655
+ }
656
+ return vec2u(bBits, aBits);
657
+ }
658
+
659
+ let commonBaseExponent = min(a.baseExponent, b.baseExponent);
660
+ let aMagnitude = fp64_u64_shift_left(
661
+ vec2u(0u, a.significand),
662
+ u32(a.baseExponent - commonBaseExponent)
663
+ );
664
+ let bMagnitude = fp64_u64_shift_left(
665
+ vec2u(0u, b.significand),
666
+ u32(b.baseExponent - commonBaseExponent)
667
+ );
668
+
669
+ var resultSign = a.sign;
670
+ var resultMagnitude: vec2u;
671
+ if (a.sign == b.sign) {
672
+ resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);
673
+ } else {
674
+ let comparison = fp64_u64_compare(aMagnitude, bMagnitude);
675
+ if (comparison == 0) {
676
+ return vec2u(0u, 0u);
677
+ }
678
+ if (comparison > 0) {
679
+ resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);
680
+ } else {
681
+ resultSign = b.sign;
682
+ resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);
683
+ }
684
+ }
685
+
686
+ return fp64_split_accumulator_bits(resultSign, resultMagnitude, commonBaseExponent);
687
+ }
688
+
689
+ fn fp64_two_sum_integer(a: f32, b: f32) -> vec2f {
690
+ let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bitcast<u32>(b));
691
+ return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
692
+ }
693
+
694
+ fn fp64_multiply_significands(a: u32, b: u32) -> vec2u {
695
+ let aLow = a & 0xffffu;
696
+ let aHigh = a >> 16u;
697
+ let bLow = b & 0xffffu;
698
+ let bHigh = b >> 16u;
699
+ let lowProduct = aLow * bLow;
700
+ let crossProduct = aLow * bHigh + aHigh * bLow;
701
+ let highProduct = aHigh * bHigh;
702
+
703
+ var result = vec2u(0u, lowProduct);
704
+ result = fp64_u64_add(
705
+ result,
706
+ fp64_u64_shift_left(vec2u(0u, crossProduct), 16u)
707
+ );
708
+ result = fp64_u64_add(result, vec2u(highProduct, 0u));
709
+ return result;
710
+ }
711
+
712
+ fn fp64_two_prod_integer_bits(aBits: u32, bBits: u32) -> vec2u {
713
+ let a = fp64_decode_f32_bits(aBits);
714
+ let b = fp64_decode_f32_bits(bBits);
715
+ let resultSign = a.sign ^ b.sign;
716
+
717
+ if (a.isNan || b.isNan || ((a.isZero || b.isZero) && (a.isInf || b.isInf))) {
718
+ return vec2u(0x7fc00000u, 0u);
719
+ }
720
+ if (a.isInf || b.isInf) {
721
+ return vec2u((resultSign << 31u) | 0x7f800000u, resultSign << 31u);
722
+ }
723
+ if (a.isZero || b.isZero) {
724
+ return vec2u(resultSign << 31u, resultSign << 31u);
725
+ }
726
+
727
+ let magnitude = fp64_multiply_significands(a.significand, b.significand);
728
+ return fp64_split_accumulator_bits(
729
+ resultSign,
730
+ magnitude,
731
+ a.baseExponent + b.baseExponent
732
+ );
733
+ }
734
+
735
+ fn fp64_two_prod_integer(a: f32, b: f32) -> vec2f {
736
+ let resultBits = fp64_two_prod_integer_bits(bitcast<u32>(a), bitcast<u32>(b));
737
+ return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
738
+ }
739
+
740
+ fn fp64_round_add_integer(a: f32, b: f32) -> f32 {
741
+ return fp64_two_sum_integer(a, b).x;
742
+ }
743
+
744
+ fn fp64_round_mul_integer(a: f32, b: f32) -> f32 {
745
+ return fp64_two_prod_integer(a, b).x;
746
+ }
747
+
748
+ #ifndef LUMA_FP64_PREDICATE_ONLY
749
+ fn fp64_f32_finite_exponent(value: Fp64F32Bits) -> i32 {
750
+ let mostSignificantBit = 31u - countLeadingZeros(value.significand);
751
+ return value.baseExponent + i32(mostSignificantBit);
752
+ }
753
+
754
+ fn fp64_scale_f32_integer(value: f32, exponent: i32) -> f32 {
755
+ let decoded = fp64_decode_f32_bits(bitcast<u32>(value));
756
+ if (decoded.isZero || decoded.isInf || decoded.isNan) {
757
+ return value;
758
+ }
759
+ let resultBits = fp64_make_f32_bits_from_u64(
760
+ decoded.sign,
761
+ vec2u(0u, decoded.significand),
762
+ decoded.baseExponent + exponent
763
+ );
764
+ return bitcast<f32>(resultBits);
765
+ }
766
+
767
+ // Divide normalized significands so the hardware operation cannot overflow,
768
+ // underflow, or flush a subnormal result. Reapply the exponent with integer
769
+ // packing, which also produces subnormal correction limbs without relying on
770
+ // floating-point arithmetic to preserve them.
771
+ fn fp64_divide_f32_integer(aValue: f32, bValue: f32) -> f32 {
772
+ let a = fp64_decode_f32_bits(bitcast<u32>(aValue));
773
+ let b = fp64_decode_f32_bits(bitcast<u32>(bValue));
774
+ if (a.isZero || b.isZero || a.isInf || b.isInf || a.isNan || b.isNan) {
775
+ return aValue / bValue;
776
+ }
777
+
778
+ let aMostSignificantBit = 31u - countLeadingZeros(a.significand);
779
+ let bMostSignificantBit = 31u - countLeadingZeros(b.significand);
780
+ let normalizedABits = fp64_make_f32_bits_from_u64(
781
+ a.sign,
782
+ vec2u(0u, a.significand),
783
+ -i32(aMostSignificantBit)
784
+ );
785
+ let normalizedBBits = fp64_make_f32_bits_from_u64(
786
+ b.sign,
787
+ vec2u(0u, b.significand),
788
+ -i32(bMostSignificantBit)
789
+ );
790
+ let normalizedQuotient = bitcast<f32>(normalizedABits) / bitcast<f32>(normalizedBBits);
791
+ let quotient = fp64_decode_f32_bits(bitcast<u32>(normalizedQuotient));
792
+ let exponentShift =
793
+ a.baseExponent + i32(aMostSignificantBit) -
794
+ b.baseExponent - i32(bMostSignificantBit);
795
+ let quotientBits = fp64_make_f32_bits_from_u64(
796
+ quotient.sign,
797
+ vec2u(0u, quotient.significand),
798
+ quotient.baseExponent + exponentShift
799
+ );
800
+ return bitcast<f32>(quotientBits);
801
+ }
802
+ #endif
803
+
804
+ #ifndef LUMA_FP64_PREDICATE_ONLY
805
+ fn split(a: f32) -> vec2f {
806
+ let aBits = bitcast<u32>(a);
807
+ let decoded = fp64_decode_f32_bits(aBits);
808
+ if (decoded.isZero || decoded.isInf || decoded.isNan) {
809
+ return vec2f(a, 0.0);
810
+ }
811
+
812
+ var roundedHigh = decoded.significand >> 12u;
813
+ let remainder = decoded.significand & 0xfffu;
814
+ if (remainder > 0x800u || (remainder == 0x800u && (roundedHigh & 1u) == 1u)) {
815
+ roundedHigh = roundedHigh + 1u;
816
+ }
817
+ var highMagnitude = vec2u(0u, roundedHigh << 12u);
818
+ var highBits = fp64_make_f32_bits_from_u64(
819
+ decoded.sign,
820
+ highMagnitude,
821
+ decoded.baseExponent
822
+ );
823
+ // Rounding the high limb of a maximum-exponent value can overflow even
824
+ // though the original value is finite. Truncate only in that boundary case
825
+ // so split remains an exact finite decomposition.
826
+ if (fp64_decode_f32_bits(highBits).isInf) {
827
+ roundedHigh = decoded.significand >> 12u;
828
+ highMagnitude = vec2u(0u, roundedHigh << 12u);
829
+ highBits = fp64_make_f32_bits_from_u64(
830
+ decoded.sign,
831
+ highMagnitude,
832
+ decoded.baseExponent
833
+ );
834
+ }
835
+ let lowBits = fp64_make_residual_f32_bits(
836
+ decoded.sign,
837
+ vec2u(0u, decoded.significand),
838
+ decoded.baseExponent,
839
+ highBits
840
+ );
841
+ return vec2f(bitcast<f32>(highBits), bitcast<f32>(lowBits));
842
+ }
843
+
844
+ fn split2(a: vec2f) -> vec2f {
845
+ var result = split(a.x);
846
+ result.y = fp64_round_add_integer(result.y, a.y);
847
+ return result;
848
+ }
849
+ #endif
850
+
851
+ #ifndef LUMA_FP64_PREDICATE_ONLY
852
+ fn quickTwoSum(a: f32, b: f32) -> vec2f {
853
+ return fp64_two_sum_integer(a, b);
854
+ }
855
+ #endif
856
+
857
+ fn twoSum(a: f32, b: f32) -> vec2f {
858
+ return fp64_two_sum_integer(a, b);
859
+ }
860
+
861
+ fn twoSub(a: f32, b: f32) -> vec2f {
862
+ let bBits = bitcast<u32>(b) ^ 0x80000000u;
863
+ let resultBits = fp64_two_sum_integer_bits(bitcast<u32>(a), bBits);
864
+ return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
865
+ }
866
+
867
+ #ifndef LUMA_FP64_PREDICATE_ONLY
868
+ fn twoSqr(a: f32) -> vec2f {
869
+ return fp64_two_prod_integer(a, a);
870
+ }
871
+
872
+ fn twoProd(a: f32, b: f32) -> vec2f {
873
+ return fp64_two_prod_integer(a, b);
874
+ }
875
+ #endif
876
+
877
+ fn sum_fp64(a: vec2f, b: vec2f) -> vec2f {
878
+ var sum = fp64_two_sum_integer(a.x, b.x);
879
+ let lowSum = fp64_two_sum_integer(a.y, b.y);
880
+ sum.y = fp64_round_add_integer(sum.y, lowSum.x);
881
+ sum = fp64_two_sum_integer(sum.x, sum.y);
882
+ sum.y = fp64_round_add_integer(sum.y, lowSum.y);
883
+ return fp64_two_sum_integer(sum.x, sum.y);
884
+ }
885
+
886
+ fn sub_fp64(a: vec2f, b: vec2f) -> vec2f {
887
+ let negatedB = vec2f(
888
+ bitcast<f32>(bitcast<u32>(b.x) ^ 0x80000000u),
889
+ bitcast<f32>(bitcast<u32>(b.y) ^ 0x80000000u)
890
+ );
891
+ return sum_fp64(a, negatedB);
892
+ }
893
+
894
+ fn mul_fp64(a: vec2f, b: vec2f) -> vec2f {
895
+ var product = fp64_two_prod_integer(a.x, b.x);
896
+ let crossProduct1 = fp64_round_mul_integer(a.x, b.y);
897
+ product.y = fp64_round_add_integer(product.y, crossProduct1);
898
+ product = fp64_two_sum_integer(product.x, product.y);
899
+ let crossProduct2 = fp64_round_mul_integer(a.y, b.x);
900
+ product.y = fp64_round_add_integer(product.y, crossProduct2);
901
+ return fp64_two_sum_integer(product.x, product.y);
902
+ }
903
+
904
+ #ifndef LUMA_FP64_PREDICATE_ONLY
905
+ fn fp64_scale_fp64_integer(value: vec2f, exponent: i32) -> vec2f {
906
+ let high = fp64_scale_f32_integer(value.x, exponent);
907
+ let low = fp64_scale_f32_integer(value.y, exponent);
908
+ return sum_fp64(vec2f(high, 0.0), vec2f(low, 0.0));
909
+ }
910
+
911
+ fn fp64_div_fp64_normalized(a: vec2f, b: vec2f) -> vec2f {
912
+ let quotientHigh = fp64_divide_f32_integer(a.x, b.x);
913
+ var quotient = vec2f(quotientHigh, 0.0);
914
+
915
+ let remainder = sub_fp64(a, mul_fp64(b, quotient));
916
+ let quotientLow = fp64_divide_f32_integer(remainder.x, b.x);
917
+ quotient = sum_fp64(quotient, vec2f(quotientLow, 0.0));
918
+
919
+ let secondRemainder = sub_fp64(a, mul_fp64(b, quotient));
920
+ let correction = fp64_divide_f32_integer(secondRemainder.x, b.x);
921
+ return sum_fp64(quotient, vec2f(correction, 0.0));
922
+ }
923
+
924
+ fn div_fp64(a: vec2f, b: vec2f) -> vec2f {
925
+ let decodedA = fp64_decode_f32_bits(bitcast<u32>(a.x));
926
+ let decodedB = fp64_decode_f32_bits(bitcast<u32>(b.x));
927
+ if (
928
+ decodedA.isZero || decodedB.isZero ||
929
+ decodedA.isInf || decodedB.isInf ||
930
+ decodedA.isNan || decodedB.isNan
931
+ ) {
932
+ return fp64_div_fp64_normalized(a, b);
933
+ }
934
+
935
+ let exponentA = fp64_f32_finite_exponent(decodedA);
936
+ let exponentB = fp64_f32_finite_exponent(decodedB);
937
+ // Correct the quotient near unity so b * q and the remainder stay clear of
938
+ // both f32 underflow and overflow. The exponent difference is applied once.
939
+ let normalizedA = fp64_scale_fp64_integer(a, -exponentA);
940
+ let normalizedB = fp64_scale_fp64_integer(b, -exponentB);
941
+ let normalizedQuotient = fp64_div_fp64_normalized(normalizedA, normalizedB);
942
+ return fp64_scale_fp64_integer(normalizedQuotient, exponentA - exponentB);
943
+ }
944
+
945
+ fn fp64_sqrt_fp64_normalized(a: vec2f) -> vec2f {
946
+ let estimate = sqrt(a.x);
947
+ let difference = sub_fp64(a, fp64_two_prod_integer(estimate, estimate)).x;
948
+ let denominator = fp64_round_add_integer(estimate, estimate);
949
+ let correction = fp64_divide_f32_integer(difference, denominator);
950
+ return sum_fp64(vec2f(estimate, 0.0), vec2f(correction, 0.0));
951
+ }
952
+
953
+ fn sqrt_fp64(a: vec2f) -> vec2f {
954
+ let decoded = fp64_decode_f32_bits(bitcast<u32>(a.x));
955
+ let decodedLow = fp64_decode_f32_bits(bitcast<u32>(a.y));
956
+ if (decoded.isZero && decodedLow.isZero) {
957
+ return vec2f(0.0, 0.0);
958
+ }
959
+ if (decoded.sign == 1u) {
960
+ let nanValue = fp64_nan(a.x);
961
+ return vec2f(nanValue, nanValue);
962
+ }
963
+
964
+ if (decoded.isInf || decoded.isNan) {
965
+ return fp64_sqrt_fp64_normalized(a);
966
+ }
967
+ let exponent = fp64_f32_finite_exponent(decoded);
968
+ // An even scale lets the final square-root rescale use an integer exponent.
969
+ let evenExponent = exponent - (exponent & 1);
970
+ let normalizedA = fp64_scale_fp64_integer(a, -evenExponent);
971
+ let normalizedRoot = fp64_sqrt_fp64_normalized(normalizedA);
972
+ return fp64_scale_fp64_integer(normalizedRoot, evenExponent / 2);
973
+ }
974
+ #endif
525
975
  `;var lt=`struct Fp64ArithmeticUniforms {
526
976
  ONE: f32,
527
977
  SPLIT: f32,
@@ -529,6 +979,7 @@ vec2 sqrt_fp64(vec2 a) {
529
979
 
530
980
  @group(0) @binding(auto) var<uniform> fp64arithmetic : Fp64ArithmeticUniforms;
531
981
 
982
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
532
983
  struct Fp64Bits {
533
984
  sign: u32,
534
985
  exponent: i32,
@@ -537,11 +988,14 @@ struct Fp64Bits {
537
988
  isInf: bool,
538
989
  isNan: bool,
539
990
  };
991
+ #endif
540
992
 
993
+ #ifndef LUMA_FP64_PREDICATE_ONLY
541
994
  fn fp64_nan(seed: f32) -> f32 {
542
995
  let nanBits = 0x7fc00000u | select(0u, 1u, seed < 0.0);
543
996
  return bitcast<f32>(nanBits);
544
997
  }
998
+ #endif
545
999
 
546
1000
  fn fp64_u64_is_zero(value: vec2u) -> bool {
547
1001
  return value.x == 0u && value.y == 0u;
@@ -629,6 +1083,7 @@ fn fp64_u64_has_bits_below(value: vec2u, bitCount: u32) -> bool {
629
1083
  return (value.y & lowMask) != 0u;
630
1084
  }
631
1085
 
1086
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
632
1087
  fn fp64_u64_shift_right_sticky(value: vec2u, shift: u32) -> vec2u {
633
1088
  var shifted = fp64_u64_shift_right(value, shift);
634
1089
  if (fp64_u64_has_bits_below(value, shift)) {
@@ -636,6 +1091,7 @@ fn fp64_u64_shift_right_sticky(value: vec2u, shift: u32) -> vec2u {
636
1091
  }
637
1092
  return shifted;
638
1093
  }
1094
+ #endif
639
1095
 
640
1096
  fn fp64_u64_count_leading_zeros(value: vec2u) -> u32 {
641
1097
  if (value.x != 0u) {
@@ -659,6 +1115,22 @@ fn fp64_round_shift_right_to_u32(value: vec2u, shift: u32) -> u32 {
659
1115
  return rounded;
660
1116
  }
661
1117
 
1118
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
1119
+ fn fp64_round_shift_right(value: vec2u, shift: u32) -> vec2u {
1120
+ if (shift == 0u) {
1121
+ return value;
1122
+ }
1123
+
1124
+ var rounded = fp64_u64_shift_right(value, shift);
1125
+ let guard = fp64_u64_get_bit(value, shift - 1u);
1126
+ let hasTrailingBits = fp64_u64_has_bits_below(value, shift - 1u);
1127
+ if (guard && (hasTrailingBits || (rounded.y & 1u) == 1u)) {
1128
+ rounded = fp64_u64_add(rounded, vec2u(0u, 1u));
1129
+ }
1130
+ return rounded;
1131
+ }
1132
+ #endif
1133
+
662
1134
  fn fp64_make_f32_bits_from_u64(sign: u32, significand: vec2u, baseExponent: i32) -> u32 {
663
1135
  if (fp64_u64_is_zero(significand)) {
664
1136
  return sign << 31u;
@@ -706,6 +1178,7 @@ fn fp64_make_f32_bits_from_u64(sign: u32, significand: vec2u, baseExponent: i32)
706
1178
  return (sign << 31u) | mantissa;
707
1179
  }
708
1180
 
1181
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
709
1182
  fn fp64_decode_bits(bits: vec2u) -> Fp64Bits {
710
1183
  let sign = bits.x >> 31u;
711
1184
  let exponentBits = (bits.x >> 20u) & 0x7ffu;
@@ -732,6 +1205,261 @@ fn fp64_finite_magnitude_compare(a: Fp64Bits, b: Fp64Bits) -> i32 {
732
1205
  }
733
1206
  return fp64_u64_compare(a.significand, b.significand);
734
1207
  }
1208
+ #endif
1209
+
1210
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
1211
+ struct Fp64RawF32Bits {
1212
+ sign: u32,
1213
+ baseExponent: i32,
1214
+ significand: u32,
1215
+ isZero: bool,
1216
+ isInf: bool,
1217
+ isNan: bool,
1218
+ };
1219
+
1220
+ // Decode an f32 as (-1)^sign * significand * 2^baseExponent. This shared
1221
+ // integer representation lets normalization remain independent of the
1222
+ // selected double-single arithmetic implementation.
1223
+ fn fp64_decode_raw_f32_bits(bits: u32) -> Fp64RawF32Bits {
1224
+ let sign = bits >> 31u;
1225
+ let exponentBits = (bits >> 23u) & 0xffu;
1226
+ let fraction = bits & 0x7fffffu;
1227
+
1228
+ if (exponentBits == 0xffu) {
1229
+ return Fp64RawF32Bits(sign, 0, 0u, false, fraction == 0u, fraction != 0u);
1230
+ }
1231
+ if (exponentBits == 0u) {
1232
+ return Fp64RawF32Bits(sign, -149, fraction, fraction == 0u, false, false);
1233
+ }
1234
+ return Fp64RawF32Bits(
1235
+ sign,
1236
+ i32(exponentBits) - 150,
1237
+ 0x800000u | fraction,
1238
+ false,
1239
+ false,
1240
+ false
1241
+ );
1242
+ }
1243
+
1244
+ fn fp64_raw_f32_magnitude_compare(aBits: u32, bBits: u32) -> i32 {
1245
+ let aMagnitude = aBits & 0x7fffffffu;
1246
+ let bMagnitude = bBits & 0x7fffffffu;
1247
+ if (aMagnitude == bMagnitude) {
1248
+ return 0;
1249
+ }
1250
+ return select(-1, 1, aMagnitude > bMagnitude);
1251
+ }
1252
+
1253
+ fn fp64_make_raw_residual_f32_bits(
1254
+ exactSign: u32,
1255
+ exactMagnitude: vec2u,
1256
+ exactBaseExponent: i32,
1257
+ highBits: u32
1258
+ ) -> u32 {
1259
+ if (fp64_u64_is_zero(exactMagnitude)) {
1260
+ return 0u;
1261
+ }
1262
+
1263
+ let high = fp64_decode_raw_f32_bits(highBits);
1264
+ if (high.isInf || high.isNan) {
1265
+ return 0u;
1266
+ }
1267
+ if (high.isZero) {
1268
+ return fp64_make_f32_bits_from_u64(exactSign, exactMagnitude, exactBaseExponent);
1269
+ }
1270
+
1271
+ let commonBaseExponent = min(exactBaseExponent, high.baseExponent);
1272
+ let exactShift = exactBaseExponent - commonBaseExponent;
1273
+ let highShift = high.baseExponent - commonBaseExponent;
1274
+ if (exactShift >= 64 || highShift >= 64) {
1275
+ return 0u;
1276
+ }
1277
+
1278
+ let exactAligned = fp64_u64_shift_left(exactMagnitude, u32(exactShift));
1279
+ let highAligned = fp64_u64_shift_left(vec2u(0u, high.significand), u32(highShift));
1280
+ let comparison = fp64_u64_compare(exactAligned, highAligned);
1281
+ if (comparison == 0) {
1282
+ return 0u;
1283
+ }
1284
+
1285
+ var residualSign = exactSign;
1286
+ var residualMagnitude: vec2u;
1287
+ if (comparison > 0) {
1288
+ residualMagnitude = fp64_u64_sub(exactAligned, highAligned);
1289
+ } else {
1290
+ residualSign = exactSign ^ 1u;
1291
+ residualMagnitude = fp64_u64_sub(highAligned, exactAligned);
1292
+ }
1293
+ return fp64_make_f32_bits_from_u64(
1294
+ residualSign,
1295
+ residualMagnitude,
1296
+ commonBaseExponent
1297
+ );
1298
+ }
1299
+
1300
+ fn fp64_split_raw_accumulator_bits(
1301
+ sign: u32,
1302
+ magnitude: vec2u,
1303
+ baseExponent: i32
1304
+ ) -> vec2u {
1305
+ if (fp64_u64_is_zero(magnitude)) {
1306
+ return vec2u(0u);
1307
+ }
1308
+ let highBits = fp64_make_f32_bits_from_u64(sign, magnitude, baseExponent);
1309
+ let rawLowBits = fp64_make_raw_residual_f32_bits(sign, magnitude, baseExponent, highBits);
1310
+ let lowBits = select(rawLowBits, 0u, (rawLowBits & 0x7fffffffu) == 0u);
1311
+ if ((highBits & 0x7fffffffu) == 0u && (lowBits & 0x7fffffffu) == 0u) {
1312
+ return vec2u(0u);
1313
+ }
1314
+ return vec2u(highBits, lowBits);
1315
+ }
1316
+ #endif
1317
+
1318
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
1319
+ // Round an arithmetic accumulator to binary64 before splitting it. The
1320
+ // aligned add/subtract paths retain three guard bits plus a sticky bit, which
1321
+ // is sufficient for round-to-nearest-even at the binary64 boundary.
1322
+ fn fp64_split_binary64_accumulator_bits(
1323
+ sign: u32,
1324
+ magnitude: vec2u,
1325
+ baseExponent: i32
1326
+ ) -> vec2u {
1327
+ if (fp64_u64_is_zero(magnitude)) {
1328
+ return vec2u(0u);
1329
+ }
1330
+
1331
+ let mostSignificantBit = 63u - fp64_u64_count_leading_zeros(magnitude);
1332
+ let exponent = baseExponent + i32(mostSignificantBit);
1333
+ if (exponent > 1023) {
1334
+ return vec2u((sign << 31u) | 0x7f800000u, 0u);
1335
+ }
1336
+
1337
+ var roundedMagnitude = magnitude;
1338
+ var roundedBaseExponent = baseExponent;
1339
+ if (exponent >= -1022) {
1340
+ if (mostSignificantBit > 52u) {
1341
+ let shift = mostSignificantBit - 52u;
1342
+ roundedMagnitude = fp64_round_shift_right(magnitude, shift);
1343
+ roundedBaseExponent = baseExponent + i32(shift);
1344
+ }
1345
+ } else {
1346
+ let shift = -1074 - baseExponent;
1347
+ if (shift > 0) {
1348
+ roundedMagnitude = fp64_round_shift_right(magnitude, u32(shift));
1349
+ roundedBaseExponent = -1074;
1350
+ }
1351
+ }
1352
+
1353
+ if (fp64_u64_is_zero(roundedMagnitude)) {
1354
+ return vec2u(0u);
1355
+ }
1356
+ return fp64_split_raw_accumulator_bits(sign, roundedMagnitude, roundedBaseExponent);
1357
+ }
1358
+ #endif
1359
+
1360
+ #ifndef LUMA_FP64_PREDICATE_ONLY
1361
+ fn fp64_add_raw_f32_bits(aBits: u32, bBits: u32) -> vec2u {
1362
+ let a = fp64_decode_raw_f32_bits(aBits);
1363
+ let b = fp64_decode_raw_f32_bits(bBits);
1364
+
1365
+ if (a.isNan || b.isNan) {
1366
+ return vec2u(0x7fc00000u, 0u);
1367
+ }
1368
+ if (a.isInf || b.isInf) {
1369
+ if (a.isInf && b.isInf && a.sign != b.sign) {
1370
+ return vec2u(0x7fc00000u, 0u);
1371
+ }
1372
+ return select(vec2u(bBits, 0u), vec2u(aBits, 0u), a.isInf);
1373
+ }
1374
+ if (a.isZero && b.isZero) {
1375
+ return vec2u(0u);
1376
+ }
1377
+ if (a.isZero) {
1378
+ return vec2u(bBits, 0u);
1379
+ }
1380
+ if (b.isZero) {
1381
+ return vec2u(aBits, 0u);
1382
+ }
1383
+
1384
+ let exponentDifference = abs(a.baseExponent - b.baseExponent);
1385
+ if (exponentDifference > 25) {
1386
+ if (fp64_raw_f32_magnitude_compare(aBits, bBits) >= 0) {
1387
+ return vec2u(aBits, bBits);
1388
+ }
1389
+ return vec2u(bBits, aBits);
1390
+ }
1391
+
1392
+ let commonBaseExponent = min(a.baseExponent, b.baseExponent);
1393
+ let aMagnitude = fp64_u64_shift_left(
1394
+ vec2u(0u, a.significand),
1395
+ u32(a.baseExponent - commonBaseExponent)
1396
+ );
1397
+ let bMagnitude = fp64_u64_shift_left(
1398
+ vec2u(0u, b.significand),
1399
+ u32(b.baseExponent - commonBaseExponent)
1400
+ );
1401
+
1402
+ var resultSign = a.sign;
1403
+ var resultMagnitude: vec2u;
1404
+ if (a.sign == b.sign) {
1405
+ resultMagnitude = fp64_u64_add(aMagnitude, bMagnitude);
1406
+ } else {
1407
+ let comparison = fp64_u64_compare(aMagnitude, bMagnitude);
1408
+ if (comparison == 0) {
1409
+ return vec2u(0u);
1410
+ }
1411
+ if (comparison > 0) {
1412
+ resultMagnitude = fp64_u64_sub(aMagnitude, bMagnitude);
1413
+ } else {
1414
+ resultSign = b.sign;
1415
+ resultMagnitude = fp64_u64_sub(bMagnitude, aMagnitude);
1416
+ }
1417
+ }
1418
+
1419
+ return fp64_split_raw_accumulator_bits(
1420
+ resultSign,
1421
+ resultMagnitude,
1422
+ commonBaseExponent
1423
+ );
1424
+ }
1425
+ #endif
1426
+
1427
+ #ifndef LUMA_FP64_F32_INPUT_ONLY
1428
+ fn fp64_add_aligned_magnitudes_to_fp64_bits(
1429
+ sign: u32,
1430
+ larger: Fp64Bits,
1431
+ smaller: Fp64Bits
1432
+ ) -> vec2u {
1433
+ let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);
1434
+ let smallSignificand = fp64_u64_shift_right_sticky(
1435
+ fp64_u64_shift_left(smaller.significand, 3u),
1436
+ u32(larger.exponent - smaller.exponent)
1437
+ );
1438
+ let resultSignificand = fp64_u64_add(largeSignificand, smallSignificand);
1439
+ return fp64_split_binary64_accumulator_bits(
1440
+ sign,
1441
+ resultSignificand,
1442
+ larger.exponent - 55
1443
+ );
1444
+ }
1445
+
1446
+ fn fp64_sub_aligned_magnitudes_to_fp64_bits(
1447
+ sign: u32,
1448
+ larger: Fp64Bits,
1449
+ smaller: Fp64Bits
1450
+ ) -> vec2u {
1451
+ let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);
1452
+ let smallSignificand = fp64_u64_shift_right_sticky(
1453
+ fp64_u64_shift_left(smaller.significand, 3u),
1454
+ u32(larger.exponent - smaller.exponent)
1455
+ );
1456
+ let resultSignificand = fp64_u64_sub(largeSignificand, smallSignificand);
1457
+ return fp64_split_binary64_accumulator_bits(
1458
+ sign,
1459
+ resultSignificand,
1460
+ larger.exponent - 55
1461
+ );
1462
+ }
735
1463
 
736
1464
  fn fp64_add_aligned_magnitudes_to_f32_bits(sign: u32, larger: Fp64Bits, smaller: Fp64Bits) -> u32 {
737
1465
  let largeSignificand = fp64_u64_shift_left(larger.significand, 3u);
@@ -801,6 +1529,58 @@ fn sub_fp64u32_to_f32(aBits: vec2u, bBits: vec2u) -> f32 {
801
1529
  return bitcast<f32>(sub_fp64u32_to_f32_bits(aBits, bBits));
802
1530
  }
803
1531
 
1532
+ // Subtract two raw binary64 values, round once to binary64, then split the
1533
+ // result into normalized f32 limbs. Finite results must fit within the f32
1534
+ // exponent range; larger magnitudes map to infinity and smaller magnitudes
1535
+ // map to zero. The input words use canonical high/low word order.
1536
+ fn sub_fp64u32_to_fp64_bits(aBits: vec2u, bBits: vec2u) -> vec2u {
1537
+ let a = fp64_decode_bits(aBits);
1538
+ let b = fp64_decode_bits(bBits);
1539
+ let bSubtractionSign = b.sign ^ 1u;
1540
+
1541
+ if (a.isNan || b.isNan) {
1542
+ return vec2u(0x7fc00000u, 0u);
1543
+ }
1544
+ if (a.isInf && b.isInf) {
1545
+ if (a.sign == bSubtractionSign) {
1546
+ return vec2u((a.sign << 31u) | 0x7f800000u, 0u);
1547
+ }
1548
+ return vec2u(0x7fc00000u, 0u);
1549
+ }
1550
+ if (a.isInf) {
1551
+ return vec2u((a.sign << 31u) | 0x7f800000u, 0u);
1552
+ }
1553
+ if (b.isInf) {
1554
+ return vec2u((bSubtractionSign << 31u) | 0x7f800000u, 0u);
1555
+ }
1556
+ if (a.isZero && b.isZero) {
1557
+ return vec2u(0u);
1558
+ }
1559
+
1560
+ let magnitudeComparison = fp64_finite_magnitude_compare(a, b);
1561
+ if (a.sign == bSubtractionSign) {
1562
+ if (magnitudeComparison >= 0) {
1563
+ return fp64_add_aligned_magnitudes_to_fp64_bits(a.sign, a, b);
1564
+ }
1565
+ return fp64_add_aligned_magnitudes_to_fp64_bits(a.sign, b, a);
1566
+ }
1567
+
1568
+ if (magnitudeComparison == 0) {
1569
+ return vec2u(0u);
1570
+ }
1571
+ if (magnitudeComparison > 0) {
1572
+ return fp64_sub_aligned_magnitudes_to_fp64_bits(a.sign, a, b);
1573
+ }
1574
+ return fp64_sub_aligned_magnitudes_to_fp64_bits(bSubtractionSign, b, a);
1575
+ }
1576
+
1577
+ fn sub_fp64u32_to_fp64(aBits: vec2u, bBits: vec2u) -> vec2f {
1578
+ let resultBits = sub_fp64u32_to_fp64_bits(aBits, bBits);
1579
+ return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
1580
+ }
1581
+ #endif
1582
+
1583
+ #ifndef LUMA_FP64_PREDICATE_ONLY
804
1584
  fn fp64_runtime_zero() -> f32 {
805
1585
  return fp64arithmetic.ONE * 0.0;
806
1586
  }
@@ -812,7 +1592,11 @@ fn prevent_fp64_optimization(value: f32) -> f32 {
812
1592
  return value;
813
1593
  #endif
814
1594
  }
1595
+ #endif
815
1596
 
1597
+ #ifdef LUMA_FP64_INTEGER_ARITHMETIC
1598
+ ${ft}
1599
+ #else
816
1600
  fn split(a: f32) -> vec2f {
817
1601
  let splitValue = prevent_fp64_optimization(fp64arithmetic.SPLIT + fp64_runtime_zero());
818
1602
  let t = prevent_fp64_optimization(a * splitValue);
@@ -963,6 +1747,7 @@ fn mul_fp64(a: vec2f, b: vec2f) -> vec2f {
963
1747
  return prod;
964
1748
  }
965
1749
 
1750
+ #ifndef LUMA_FP64_PREDICATE_ONLY
966
1751
  fn div_fp64(a: vec2f, b: vec2f) -> vec2f {
967
1752
  let xn = prevent_fp64_optimization(1.0 / b.x);
968
1753
  let yn = mul_fp64(a, vec2f(xn, fp64_runtime_zero()));
@@ -995,7 +1780,98 @@ fn sqrt_fp64(a: vec2f) -> vec2f {
995
1780
  return sum_fp64(vec2f(yn, 0.0), prod);
996
1781
  #endif
997
1782
  }
998
- `;var ft=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
1783
+ #endif
1784
+ #endif
1785
+
1786
+ #ifndef LUMA_FP64_PREDICATE_ONLY
1787
+ fn fp64_f32_bits_is_nan(bits: u32) -> bool {
1788
+ return (bits & 0x7fffffffu) > 0x7f800000u;
1789
+ }
1790
+
1791
+ fn fp64_f32_bits_is_inf(bits: u32) -> bool {
1792
+ return (bits & 0x7fffffffu) == 0x7f800000u;
1793
+ }
1794
+
1795
+ fn fp64_compare_f32_bits(aBits: u32, bBits: u32) -> i32 {
1796
+ let aMagnitude = aBits & 0x7fffffffu;
1797
+ let bMagnitude = bBits & 0x7fffffffu;
1798
+ if (aMagnitude == 0u && bMagnitude == 0u) {
1799
+ return 0;
1800
+ }
1801
+ let aSign = aBits >> 31u;
1802
+ let bSign = bBits >> 31u;
1803
+ if (aSign != bSign) {
1804
+ return select(1, -1, aSign == 1u);
1805
+ }
1806
+ if (aMagnitude == bMagnitude) {
1807
+ return 0;
1808
+ }
1809
+ let magnitudeComparison = select(-1, 1, aMagnitude > bMagnitude);
1810
+ return select(magnitudeComparison, -magnitudeComparison, aSign == 1u);
1811
+ }
1812
+
1813
+ // Normalize an arbitrary pair of finite f32 limbs with integer accumulation.
1814
+ // This is independent of LUMA_FP64_INTEGER_ARITHMETIC and canonicalizes every
1815
+ // representation of zero to vec2f(+0.0, +0.0).
1816
+ fn normalize_fp64(value: vec2f) -> vec2f {
1817
+ let resultBits = fp64_add_raw_f32_bits(bitcast<u32>(value.x), bitcast<u32>(value.y));
1818
+ return vec2f(bitcast<f32>(resultBits.x), bitcast<f32>(resultBits.y));
1819
+ }
1820
+
1821
+ fn is_nan_fp64(value: vec2f) -> bool {
1822
+ let normalized = normalize_fp64(value);
1823
+ return fp64_f32_bits_is_nan(bitcast<u32>(normalized.x)) ||
1824
+ fp64_f32_bits_is_nan(bitcast<u32>(normalized.y));
1825
+ }
1826
+
1827
+ fn is_finite_fp64(value: vec2f) -> bool {
1828
+ let normalized = normalize_fp64(value);
1829
+ let highBits = bitcast<u32>(normalized.x);
1830
+ let lowBits = bitcast<u32>(normalized.y);
1831
+ return !fp64_f32_bits_is_nan(highBits) && !fp64_f32_bits_is_nan(lowBits) &&
1832
+ !fp64_f32_bits_is_inf(highBits) && !fp64_f32_bits_is_inf(lowBits);
1833
+ }
1834
+
1835
+ // Returns -1, 0, or 1. NaN is unordered and returns 0; call is_nan_fp64 or
1836
+ // is_finite_fp64 first when 0 must mean a finite zero.
1837
+ fn sign_fp64(value: vec2f) -> i32 {
1838
+ let normalized = normalize_fp64(value);
1839
+ let highBits = bitcast<u32>(normalized.x);
1840
+ let lowBits = bitcast<u32>(normalized.y);
1841
+ if (fp64_f32_bits_is_nan(highBits) || fp64_f32_bits_is_nan(lowBits)) {
1842
+ return 0;
1843
+ }
1844
+ if ((highBits & 0x7fffffffu) != 0u) {
1845
+ return select(1, -1, (highBits >> 31u) == 1u);
1846
+ }
1847
+ if ((lowBits & 0x7fffffffu) != 0u) {
1848
+ return select(1, -1, (lowBits >> 31u) == 1u);
1849
+ }
1850
+ return 0;
1851
+ }
1852
+
1853
+ // Compares double-single values and returns -1, 0, or 1. NaN is unordered
1854
+ // and returns 0; callers that require equality semantics must first check
1855
+ // is_nan_fp64 or is_finite_fp64.
1856
+ fn compare_fp64(a: vec2f, b: vec2f) -> i32 {
1857
+ let normalizedA = normalize_fp64(a);
1858
+ let normalizedB = normalize_fp64(b);
1859
+ let aHighBits = bitcast<u32>(normalizedA.x);
1860
+ let aLowBits = bitcast<u32>(normalizedA.y);
1861
+ let bHighBits = bitcast<u32>(normalizedB.x);
1862
+ let bLowBits = bitcast<u32>(normalizedB.y);
1863
+ if (fp64_f32_bits_is_nan(aHighBits) || fp64_f32_bits_is_nan(aLowBits) ||
1864
+ fp64_f32_bits_is_nan(bHighBits) || fp64_f32_bits_is_nan(bLowBits)) {
1865
+ return 0;
1866
+ }
1867
+ let highComparison = fp64_compare_f32_bits(aHighBits, bHighBits);
1868
+ if (highComparison != 0) {
1869
+ return highComparison;
1870
+ }
1871
+ return fp64_compare_f32_bits(aLowBits, bLowBits);
1872
+ }
1873
+ #endif
1874
+ `;var ut=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
999
1875
  const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
1000
1876
  const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
1001
1877
  const vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);
@@ -1664,7 +2540,7 @@ void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
1664
2540
  vec4_dot_fp64(a, tmp, out_val[i]);
1665
2541
  }
1666
2542
  }
1667
- `;var sr={ONE:1,SPLIT:4097},ct={name:"fp64arithmetic",source:lt,fs:be,vs:be,defaultUniforms:sr,uniformTypes:{ONE:"f32",SPLIT:"f32"},fp64ify:te,fp64LowPart:xe,fp64ifyMatrix4:ye},ie={name:"fp64",vs:ft,dependencies:[ct],fp64ify:te,fp64LowPart:xe,fp64ifyMatrix4:ye};var re=d(_(),1);var ut=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
2543
+ `;var sr={ONE:1,SPLIT:4097},ct={name:"fp64arithmetic",source:lt,fs:ye,vs:ye,defaultUniforms:sr,uniformTypes:{ONE:"f32",SPLIT:"f32"},fp64ify:te,fp64LowPart:xe,fp64ifyMatrix4:be},ie={name:"fp64",vs:ut,dependencies:[ct],fp64ify:te,fp64LowPart:xe,fp64ifyMatrix4:be};var re=d(_(),1);var pt=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
1668
2544
  layout(std140) uniform project64Uniforms {
1669
2545
  vec2 scale;
1670
2546
  mat4 viewProjectionMatrix;
@@ -1737,7 +2613,7 @@ return project_position_to_clipspace(
1737
2613
  position, position64xyLow, offset, commonPosition
1738
2614
  );
1739
2615
  }
1740
- `;var{fp64ify:nr,fp64ifyMatrix4:ar}=ie,oe={name:"project64",dependencies:[re.project,ie],vs:ut,getUniforms:fr,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},lr=(0,re._memoize)(cr);function fr(i){if(i&&"viewport"in i){let{viewProjectionMatrix:e,scale:t}=i.viewport;return lr({viewProjectionMatrix:e,scale:t})}return{}}function cr({viewProjectionMatrix:i,scale:e}){let t=ar(i),r=new Float32Array(16),o=new Float32Array(16);for(let s=0;s<4;s++)for(let n=0;n<4;n++){let a=4*s+n,l=4*n+s;r[l]=t[2*a],o[l]=t[2*a+1]}return{scale:nr(e),viewProjectionMatrix:[...r],viewProjectionMatrix64Low:[...o]}}var se=class extends pt.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!=="lnglat"&&e!=="default")throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[oe]}}draw(e,t){let{viewport:r}=e.context;this.setShaderModuleProps({project64:{viewport:r}})}};se.extensionName="Fp64Extension";var dt=se;var w=d(_(),1);var _t={inject:{"vs:#decl":`
2616
+ `;var{fp64ify:ar,fp64ifyMatrix4:fr}=ie,ne={name:"project64",dependencies:[re.project,ie],vs:pt,getUniforms:ur,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},lr=(0,re._memoize)(cr);function ur(i){if(i&&"viewport"in i){let{viewProjectionMatrix:e,scale:t}=i.viewport;return lr({viewProjectionMatrix:e,scale:t})}return{}}function cr({viewProjectionMatrix:i,scale:e}){let t=fr(i),r=new Float32Array(16),n=new Float32Array(16);for(let o=0;o<4;o++)for(let s=0;s<4;s++){let a=4*o+s,f=4*s+o;r[f]=t[2*a],n[f]=t[2*a+1]}return{scale:ar(e),viewProjectionMatrix:[...r],viewProjectionMatrix64Low:[...n]}}var oe=class extends dt.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!=="lnglat"&&e!=="default")throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[ne]}}draw(e,t){let{viewport:r}=e.context;this.setShaderModuleProps({project64:{viewport:r}})}};oe.extensionName="Fp64Extension";var _t=oe;var R=d(_(),1);var mt={inject:{"vs:#decl":`
1741
2617
  in vec2 instanceDashArrays;
1742
2618
  #ifdef HIGH_PRECISION_DASH
1743
2619
  in float instanceDashOffsets;
@@ -1789,7 +2665,7 @@ discard;
1789
2665
  }
1790
2666
  }
1791
2667
  }
1792
- `}},mt={inject:{"vs:#decl":`
2668
+ `}},ht={inject:{"vs:#decl":`
1793
2669
  in vec2 instanceDashArrays;
1794
2670
  out vec2 vDashArray;
1795
2671
  `,"vs:#main-end":`
@@ -1831,7 +2707,7 @@ fragColor = vec4(vFillColor.rgb, vFillColor.a * alphaFactor);
1831
2707
  fragColor = picking_filterPickingColor(fragColor);
1832
2708
  fragColor = picking_filterHighlightColor(fragColor);
1833
2709
  }
1834
- `}},ht={inject:{"vs:#decl":`
2710
+ `}},gt={inject:{"vs:#decl":`
1835
2711
  in vec2 instanceDashArrays;
1836
2712
  out vec2 vDashArray;
1837
2713
  `,"vs:#main-end":`
@@ -1970,14 +2846,14 @@ isInside = step(-1.0, vPathPosition.x) * step(vPathPosition.x, 1.0);
1970
2846
  if (isInside == 0.0) {
1971
2847
  discard;
1972
2848
  }
1973
- `}};var ur={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},N=class extends w.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:r=!1}={}){super({dash:e||r,offset:t,highPrecisionDash:r})}getLayerType(e){if("pathTesselator"in e.state)return"path";let t=e.constructor.layerName;return t==="ScatterplotLayer"?"scatterplot":t==="TextBackgroundLayer"?"textBackground":null}isEnabled(e){return this.getLayerType(e)!==null}getShaders(e){let t=e.getLayerType(this);if(!t)return null;if(t==="scatterplot"||t==="textBackground")return e.opts.dash?{modules:[{name:"pathStyle",inject:t==="scatterplot"?mt.inject:ht.inject,uniformTypes:{dashGapPickable:"i32"}}]}:null;let r={},o={};e.opts.dash&&(r=(0,w._mergeShaders)(r,_t),e.opts.highPrecisionDash&&(o.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(r=(0,w._mergeShaders)(r,vt));let{inject:s}=r;return{modules:[{name:"pathStyle",inject:s,uniformTypes:{dashAlignMode:"f32",dashGapPickable:"i32"}}],defines:o}}initializeState(e,t){let r=this.getAttributeManager(),o=t.getLayerType(this);!r||!o||(t.opts.dash&&r.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},...o==="path"&&t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}}:{}}),o==="path"&&t.opts.offset&&r.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let r=t.getLayerType(this);if(r==="scatterplot"||r==="textBackground"){let o={dashGapPickable:Boolean(this.props.dashGapPickable)};this.setShaderModuleProps({pathStyle:o})}else{let o={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:Boolean(this.props.dashGapPickable)};this.setShaderModuleProps({pathStyle:o})}}}getDashOffsets(e){let t=[0],r=this.props.positionFormat==="XY"?2:3,o=Array.isArray(e[0]),s=o?e.length:e.length/r,n,a;for(let l=0;l<s-1;l++)n=o?e[l]:e.slice(l*r,l*r+r),n=this.projectPosition(n),l>0&&(t[l]=t[l-1]+k.dist(a,n)),a=n;return t[s-1]=0,t}};N.defaultProps=ur;N.extensionName="PathStyleExtension";var gt=N;var bt=d(_(),1);var F=d(_(),1),xt=`layout(std140) uniform fillUniforms {
2849
+ `}};var pr={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},C=class extends R.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:r=!1}={}){super({dash:e||r,offset:t,highPrecisionDash:r})}getLayerType(e){if("pathTesselator"in e.state)return"path";let t=e.constructor.layerName;return t==="ScatterplotLayer"?"scatterplot":t==="TextBackgroundLayer"?"textBackground":null}isEnabled(e){return this.getLayerType(e)!==null}getShaders(e){let t=e.getLayerType(this);if(!t)return null;if(t==="scatterplot"||t==="textBackground")return e.opts.dash?{modules:[{name:"pathStyle",inject:t==="scatterplot"?ht.inject:gt.inject,uniformTypes:{dashGapPickable:"i32"}}]}:null;let r={},n={};e.opts.dash&&(r=(0,R._mergeShaders)(r,mt),e.opts.highPrecisionDash&&(n.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(r=(0,R._mergeShaders)(r,vt));let{inject:o}=r;return{modules:[{name:"pathStyle",inject:o,uniformTypes:{dashAlignMode:"f32",dashGapPickable:"i32"}}],defines:n}}initializeState(e,t){let r=this.getAttributeManager(),n=t.getLayerType(this);!r||!n||(t.opts.dash&&r.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},...n==="path"&&t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}}:{}}),n==="path"&&t.opts.offset&&r.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let r=t.getLayerType(this);if(r==="scatterplot"||r==="textBackground"){let n={dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:n})}else{let n={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:n})}}}getDashOffsets(e){let t=[0],r=this.props.positionFormat==="XY"?2:3,n=Array.isArray(e[0]),o=n?e.length:e.length/r,s,a;for(let f=0;f<o-1;f++)s=n?e[f]:e.slice(f*r,f*r+r),s=this.projectPosition(s),f>0&&(t[f]=t[f-1]+ee.dist(a,s)),a=s;return t[o-1]=0,t}};C.defaultProps=pr;C.extensionName="PathStyleExtension";var xt=C;var Pt=d(_(),1);var F=d(_(),1),bt=`layout(std140) uniform fillUniforms {
1974
2850
  vec2 patternTextureSize;
1975
2851
  bool patternEnabled;
1976
2852
  bool patternMask;
1977
2853
  vec2 uvCoordinateOrigin;
1978
2854
  vec2 uvCoordinateOrigin64Low;
1979
2855
  } fill;
1980
- `,pr=`
2856
+ `,dr=`
1981
2857
  in vec4 fillPatternFrames;
1982
2858
  in float fillPatternScales;
1983
2859
  in vec2 fillPatternOffsets;
@@ -1985,10 +2861,10 @@ in vec2 fillPatternOffsets;
1985
2861
  out vec2 fill_uv;
1986
2862
  out vec4 fill_patternBounds;
1987
2863
  out vec4 fill_patternPlacement;
1988
- `,dr=`
1989
- ${xt}
1990
- ${pr}
1991
2864
  `,_r=`
2865
+ ${bt}
2866
+ ${dr}
2867
+ `,mr=`
1992
2868
  uniform sampler2D fill_patternTexture;
1993
2869
 
1994
2870
  in vec4 fill_patternBounds;
@@ -1996,10 +2872,10 @@ in vec4 fill_patternPlacement;
1996
2872
  in vec2 fill_uv;
1997
2873
 
1998
2874
  const float FILL_UV_SCALE = 512.0 / 40000000.0;
1999
- `,mr=`
2000
- ${xt}
2001
- ${_r}
2002
- `,hr={"vs:DECKGL_FILTER_GL_POSITION":`
2875
+ `,hr=`
2876
+ ${bt}
2877
+ ${mr}
2878
+ `,gr={"vs:DECKGL_FILTER_GL_POSITION":`
2003
2879
  fill_uv = geometry.position.xy;
2004
2880
  `,"vs:DECKGL_FILTER_COLOR":`
2005
2881
  if (fill.patternEnabled) {
@@ -2021,7 +2897,7 @@ ${_r}
2021
2897
  color.rgb = patternColor.rgb;
2022
2898
  }
2023
2899
  }
2024
- `};function vr(i){if(!i)return{};let e={};if("fillPatternTexture"in i){let{fillPatternTexture:t}=i;e.fill_patternTexture=t,e.patternTextureSize=[t.width,t.height]}if("project"in i){let{fillPatternMask:t=!0,fillPatternEnabled:r=!0}=i,o=F.project.getUniforms(i.project),{commonOrigin:s}=o,n=[(0,F.fp64LowPart)(s[0]),(0,F.fp64LowPart)(s[1])];e.uvCoordinateOrigin=s.slice(0,2),e.uvCoordinateOrigin64Low=n,e.patternMask=t,e.patternEnabled=r}return e}var yt={name:"fill",vs:dr,fs:mr,inject:hr,dependencies:[F.project],getUniforms:vr,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var gr={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:i=>i.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},B=class extends bt.LayerExtension{constructor({pattern:e=!1}={}){super({pattern:e})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&yt].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let r=this.getAttributeManager();t.opts.pattern&&r.add({fillPatternFrames:{size:4,stepMode:"dynamic",accessor:"getFillPattern",transform:t.getPatternFrame.bind(this)},fillPatternScales:{size:1,stepMode:"dynamic",accessor:"getFillPatternScale",defaultValue:1},fillPatternOffsets:{size:2,stepMode:"dynamic",accessor:"getFillPatternOffset"}}),this.setState({emptyTexture:this.context.device.createTexture({data:new Uint8Array(4),width:1,height:1})})}updateState({props:e,oldProps:t},r){r.isEnabled(this)&&e.fillPatternMapping&&e.fillPatternMapping!==t.fillPatternMapping&&this.getAttributeManager().invalidate("getFillPattern")}draw(e,t){if(!t.isEnabled(this))return;let{fillPatternAtlas:r,fillPatternEnabled:o,fillPatternMask:s}=this.props,n={project:e.shaderModuleProps.project,fillPatternEnabled:o,fillPatternMask:s,fillPatternTexture:r||this.state.emptyTexture};this.setShaderModuleProps({fill:n})}finalizeState(){this.state.emptyTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:t}=this.getCurrentLayer().props,r=t&&t[e];return r?[r.x,r.y,r.width,r.height]:[0,0,0,0]}};B.defaultProps=gr;B.extensionName="FillStyleExtension";var Pt=B;var Et=d(_(),1),xr={clipBounds:[0,0,1,1],clipByInstance:void 0},Mt=`
2900
+ `};function vr(i){if(!i)return{};let e={};if("fillPatternTexture"in i){let{fillPatternTexture:t}=i;e.fill_patternTexture=t,e.patternTextureSize=[t.width,t.height]}if("project"in i){let{fillPatternMask:t=!0,fillPatternEnabled:r=!0}=i,n=F.project.getUniforms(i.project),{commonOrigin:o}=n,s=[(0,F.fp64LowPart)(o[0]),(0,F.fp64LowPart)(o[1])];e.uvCoordinateOrigin=o.slice(0,2),e.uvCoordinateOrigin64Low=s,e.patternMask=t,e.patternEnabled=r}return e}var yt={name:"fill",vs:_r,fs:hr,inject:gr,dependencies:[F.project],getUniforms:vr,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var xr={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:i=>i.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},k=class extends Pt.LayerExtension{constructor({pattern:e=!1}={}){super({pattern:e})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&yt].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let r=this.getAttributeManager();t.opts.pattern&&r.add({fillPatternFrames:{size:4,stepMode:"dynamic",accessor:"getFillPattern",transform:t.getPatternFrame.bind(this)},fillPatternScales:{size:1,stepMode:"dynamic",accessor:"getFillPatternScale",defaultValue:1},fillPatternOffsets:{size:2,stepMode:"dynamic",accessor:"getFillPatternOffset"}}),this.setState({emptyTexture:this.context.device.createTexture({data:new Uint8Array(4),width:1,height:1})})}updateState({props:e,oldProps:t},r){r.isEnabled(this)&&e.fillPatternMapping&&e.fillPatternMapping!==t.fillPatternMapping&&this.getAttributeManager().invalidate("getFillPattern")}draw(e,t){if(!t.isEnabled(this))return;let{fillPatternAtlas:r,fillPatternEnabled:n,fillPatternMask:o}=this.props,s={project:e.shaderModuleProps.project,fillPatternEnabled:n,fillPatternMask:o,fillPatternTexture:r||this.state.emptyTexture};this.setShaderModuleProps({fill:s})}finalizeState(){this.state.emptyTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:t}=this.getCurrentLayer().props,r=t&&t[e];return r?[r.x,r.y,r.width,r.height]:[0,0,0,0]}};k.defaultProps=xr;k.extensionName="FillStyleExtension";var Et=k;var Mt=d(_(),1),br={clipBounds:[0,0,1,1],clipByInstance:void 0},Ft=`
2025
2901
  layout(std140) uniform clipUniforms {
2026
2902
  vec4 bounds;
2027
2903
  } clip;
@@ -2029,7 +2905,7 @@ layout(std140) uniform clipUniforms {
2029
2905
  bool clip_isInBounds(vec2 position) {
2030
2906
  return position.x >= clip.bounds[0] && position.y >= clip.bounds[1] && position.x < clip.bounds[2] && position.y < clip.bounds[3];
2031
2907
  }
2032
- `,yr={name:"clip",vs:Mt,uniformTypes:{bounds:"vec4<f32>"}},br={"vs:#decl":`
2908
+ `,yr={name:"clip",vs:Ft,uniformTypes:{bounds:"vec4<f32>"}},Pr={"vs:#decl":`
2033
2909
  out float clip_isVisible;
2034
2910
  `,"vs:DECKGL_FILTER_GL_POSITION":`
2035
2911
  clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
@@ -2037,7 +2913,7 @@ out float clip_isVisible;
2037
2913
  in float clip_isVisible;
2038
2914
  `,"fs:DECKGL_FILTER_COLOR":`
2039
2915
  if (clip_isVisible < 0.5) discard;
2040
- `},Pr={name:"clip",fs:Mt,uniformTypes:{bounds:"vec4<f32>"}},Er={"vs:#decl":`
2916
+ `},Er={name:"clip",fs:Ft,uniformTypes:{bounds:"vec4<f32>"}},Mr={"vs:#decl":`
2041
2917
  out vec2 clip_commonPosition;
2042
2918
  `,"vs:DECKGL_FILTER_GL_POSITION":`
2043
2919
  clip_commonPosition = geometry.position.xy;
@@ -2045,7 +2921,7 @@ out vec2 clip_commonPosition;
2045
2921
  in vec2 clip_commonPosition;
2046
2922
  `,"fs:DECKGL_FILTER_COLOR":`
2047
2923
  if (!clip_isInBounds(clip_commonPosition)) discard;
2048
- `},D=class extends Et.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=Boolean(this.props.clipByInstance)),this.state.clipByInstance=e,e?{modules:[yr],inject:br}:{modules:[Pr],inject:Er}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),o=this.projectPosition([e[2],e[3],0]);t.bounds=[Math.min(r[0],o[0]),Math.min(r[1],o[1]),Math.max(r[0],o[0]),Math.max(r[1],o[1])]}this.setShaderModuleProps({clip:t})}};D.defaultProps=xr;D.extensionName="ClipExtension";var Ft=D;var St=d(_(),1);var Tt=d(_(),1),Mr=`
2924
+ `},N=class extends Mt.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=!!this.props.clipByInstance),this.state.clipByInstance=e,this.context.device.type==="webgpu"?{}:e?{modules:[yr],inject:Pr}:{modules:[Er],inject:Mr}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),n=this.projectPosition([e[2],e[3],0]);t.bounds=[Math.min(r[0],n[0]),Math.min(r[1],n[1]),Math.max(r[0],n[0]),Math.max(r[1],n[1])]}this.context.device.type==="webgpu"&&(t.enabled=!0,t.mode=this.state.clipByInstance?"instance":"geometry"),this.setShaderModuleProps({clip:t})}};N.defaultProps=br;N.extensionName="ClipExtension";var At=N;var Ot=d(_(),1);var St=d(_(),1),Fr=`
2049
2925
  in float collisionPriorities;
2050
2926
 
2051
2927
  uniform sampler2D collision_texture;
@@ -2093,7 +2969,7 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
2093
2969
  float W = 2.0 * floatN + 1.0;
2094
2970
  return pow(accumulator / (W * W), 2.2);
2095
2971
  }
2096
- `,Fr={"vs:#decl":`
2972
+ `,Ar={"vs:#decl":`
2097
2973
  float collision_fade = 1.0;
2098
2974
  `,"vs:DECKGL_FILTER_GL_POSITION":`
2099
2975
  if (collision.sort) {
@@ -2112,21 +2988,21 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
2112
2988
  }
2113
2989
  `,"vs:DECKGL_FILTER_COLOR":`
2114
2990
  color.a *= collision_fade;
2115
- `},Tr=i=>{if(!i||!("dummyCollisionMap"in i))return{};let{enabled:e,collisionFBO:t,drawToCollisionMap:r,dummyCollisionMap:o}=i;return{enabled:e&&!r,sort:Boolean(r),collision_texture:!r&&t?t.colorAttachments[0]:o}},Ot={name:"collision",dependencies:[Tt.project],vs:Mr,inject:Fr,getUniforms:Tr,uniformTypes:{sort:"i32",enabled:"i32"}};var At=d(_(),1);var Lt=d(_(),1),z=class extends Lt._LayersPass{renderCollisionMap(e,t){let o=[0,0,0,0],s=[1,1,e.width-2*1,e.height-2*1];this.render({...t,clearColor:o,scissorRect:s,target:e,pass:"collision"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!1,depthWriteEnabled:!0,depthCompare:"less-equal"}}getShaderModuleProps(){return{collision:{drawToCollisionMap:!0},picking:{isActive:1,isAttribute:!1},lighting:{enabled:!1}}}};var Pe=2,V=class{constructor(){this.id="collision-filter-effect",this.props=null,this.useInPicking=!0,this.order=1,this.channels={},this.collisionFBOs={}}setup(e){this.context=e;let{device:t}=e;this.dummyCollisionMap=t.createTexture({width:1,height:1}),this.collisionFilterPass=new z(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:r,viewports:o,onViewportActive:s,views:n,isPicking:a,preRenderStats:l={}}){let{device:f}=this.context;if(a)return;let u=t.filter(({props:{visible:v,collisionEnabled:A}})=>v&&A);if(u.length===0){this.channels={};return}let c=e?.filter(v=>v.useInPicking&&l[v.id]),p=l["mask-effect"]?.didRender,m=this._groupByCollisionGroup(f,u),h=o[0],P=!this.lastViewport||!this.lastViewport.equals(h)||p;for(let v in m){let A=this.collisionFBOs[v],ue=m[v],[pe,de]=f.canvasContext.getPixelSize();A.resize({width:pe/Pe,height:de/Pe}),this._render(ue,{effects:c,layerFilter:r,onViewportActive:s,views:n,viewport:h,viewportChanged:P})}}_render(e,{effects:t,layerFilter:r,onViewportActive:o,views:s,viewport:n,viewportChanged:a}){let{collisionGroup:l}=e,f=this.channels[l];if(!f)return;let u=a||e===f||!(0,At._deepEqual)(f.layers,e.layers,1)||e.layerBounds.some((c,p)=>!M(c,f.layerBounds[p]))||e.allLayersLoaded!==f.allLayersLoaded||e.layers.some(c=>c.props.transitions);if(this.channels[l]=e,u){this.lastViewport=n;let c=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(c,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:r,viewports:n?[n]:[],onViewportActive:o,views:s,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:c.device.canvasContext.getDevicePixelRatio()/Pe}}})}}_groupByCollisionGroup(e,t){let r={};for(let o of t){let s=o.props.collisionGroup,n=r[s];n||(n={collisionGroup:s,layers:[],layerBounds:[],allLayersLoaded:!0},r[s]=n),n.layers.push(o),n.layerBounds.push(o.getBounds()),o.isLoaded||(n.allLayersLoaded=!1)}for(let o of Object.keys(r))this.collisionFBOs[o]||this.createFBO(e,o),this.channels[o]||(this.channels[o]=r[o]);for(let o of Object.keys(this.collisionFBOs))r[o]||this.destroyFBO(o);return r}getShaderModuleProps(e){let{collisionGroup:t,collisionEnabled:r}=e.props,{collisionFBOs:o,dummyCollisionMap:s}=this,n=o[t];return{collision:{enabled:r&&Boolean(n),collisionFBO:n,dummyCollisionMap:s}}}cleanup(){this.dummyCollisionMap&&(this.dummyCollisionMap.delete(),this.dummyCollisionMap=void 0),this.channels={};for(let e of Object.keys(this.collisionFBOs))this.destroyFBO(e);this.collisionFBOs={},this.lastViewport=void 0}createFBO(e,t){let{width:r,height:o}=e.getDefaultCanvasContext().canvas,s=e.createTexture({format:"rgba8unorm",width:r,height:o,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),n=e.createTexture({format:"depth16unorm",width:r,height:o});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:r,height:o,colorAttachments:[s],depthStencilAttachment:n})}destroyFBO(e){let t=this.collisionFBOs[e];t.colorAttachments[0]?.destroy(),t.depthStencilAttachment?.destroy(),t.destroy(),delete this.collisionFBOs[e]}};var Or={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},j=class extends St.LayerExtension{getShaders(){return{modules:[Ot]}}draw({shaderModuleProps:e}){e.collision?.drawToCollisionMap&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,t){if(this.getAttributeManager()===null)return;this.context.deck?._addDefaultEffect(new V),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};j.defaultProps=Or;j.extensionName="CollisionFilterExtension";var It=j;var b=d(_(),1);var Ct=d(_(),1),Rt=`layout(std140) uniform maskUniforms {
2991
+ `},Sr=i=>{if(!i||!("dummyCollisionMap"in i))return{};let{enabled:e,collisionFBO:t,drawToCollisionMap:r,dummyCollisionMap:n}=i;return{enabled:e&&!r,sort:!!r,collision_texture:!r&&t?t.colorAttachments[0]:n}},Tt={name:"collision",dependencies:[St.project],vs:Fr,inject:Ar,getUniforms:Sr,uniformTypes:{sort:"i32",enabled:"i32"}};var Lt=d(_(),1);var Bt=d(_(),1),D=class extends Bt._LayersPass{renderCollisionMap(e,t){let n=[0,0,0,0],o=[1,1,e.width-2,e.height-2];this.render({...t,clearColor:n,scissorRect:o,target:e,pass:"collision"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!1,depthWriteEnabled:!0,depthCompare:"less-equal"}}getShaderModuleProps(){return{collision:{drawToCollisionMap:!0},picking:{isActive:1,isAttribute:!1},lighting:{enabled:!1}}}};var Pe=2,z=class{constructor(){this.id="collision-filter-effect",this.props=null,this.useInPicking=!0,this.order=1,this.channels={},this.collisionFBOs={}}setup(e){this.context=e;let{device:t}=e;this.dummyCollisionMap=t.createTexture({width:1,height:1}),this.collisionFilterPass=new D(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:r,viewports:n,onViewportActive:o,views:s,isPicking:a,preRenderStats:f={}}){let{device:l}=this.context;if(a)return;let c=t.filter(({props:{visible:g,collisionEnabled:B}})=>g&&B);if(c.length===0){this.channels={};return}let u=e?.filter(g=>g.useInPicking&&f[g.id]),p=f["mask-effect"]?.didRender,m=this._groupByCollisionGroup(l,c),h=n[0],P=!this.lastViewport||!this.lastViewport.equals(h)||p;for(let g in m){let B=this.collisionFBOs[g],ce=m[g],[pe,de]=l.canvasContext.getPixelSize();B.resize({width:pe/Pe,height:de/Pe}),this._render(ce,{effects:u,layerFilter:r,onViewportActive:o,views:s,viewport:h,viewportChanged:P})}}_render(e,{effects:t,layerFilter:r,onViewportActive:n,views:o,viewport:s,viewportChanged:a}){let{collisionGroup:f}=e,l=this.channels[f];if(!l)return;let c=a||e===l||!(0,Lt._deepEqual)(l.layers,e.layers,1)||e.layerBounds.some((u,p)=>!M(u,l.layerBounds[p]))||e.allLayersLoaded!==l.allLayersLoaded||e.layers.some(u=>u.props.transitions);if(this.channels[f]=e,c){this.lastViewport=s;let u=this.collisionFBOs[f];this.collisionFilterPass.renderCollisionMap(u,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:r,viewports:s?[s]:[],onViewportActive:n,views:o,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:u.device.canvasContext.getDevicePixelRatio()/Pe}}})}}_groupByCollisionGroup(e,t){let r={};for(let n of t){let o=n.props.collisionGroup,s=r[o];s||(s={collisionGroup:o,layers:[],layerBounds:[],allLayersLoaded:!0},r[o]=s),s.layers.push(n),s.layerBounds.push(n.getBounds()),n.isLoaded||(s.allLayersLoaded=!1)}for(let n of Object.keys(r))this.collisionFBOs[n]||this.createFBO(e,n),this.channels[n]||(this.channels[n]=r[n]);for(let n of Object.keys(this.collisionFBOs))r[n]||this.destroyFBO(n);return r}getShaderModuleProps(e){let{collisionGroup:t,collisionEnabled:r}=e.props,{collisionFBOs:n,dummyCollisionMap:o}=this,s=n[t];return{collision:{enabled:r&&!!s,collisionFBO:s,dummyCollisionMap:o}}}cleanup(){this.dummyCollisionMap&&(this.dummyCollisionMap.delete(),this.dummyCollisionMap=void 0),this.channels={};for(let e of Object.keys(this.collisionFBOs))this.destroyFBO(e);this.collisionFBOs={},this.lastViewport=void 0}createFBO(e,t){let{width:r,height:n}=e.getDefaultCanvasContext().canvas,o=e.createTexture({format:"rgba8unorm",width:r,height:n,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),s=e.createTexture({format:"depth16unorm",width:r,height:n});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:r,height:n,colorAttachments:[o],depthStencilAttachment:s})}destroyFBO(e){let t=this.collisionFBOs[e];t.colorAttachments[0]?.destroy(),t.depthStencilAttachment?.destroy(),t.destroy(),delete this.collisionFBOs[e]}};var Tr={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},V=class extends Ot.LayerExtension{getShaders(){return{modules:[Tt]}}draw({shaderModuleProps:e}){e.collision?.drawToCollisionMap&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,t){if(this.getAttributeManager()===null)return;this.context.deck?._addDefaultEffect(new z),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};V.defaultProps=Tr;V.extensionName="CollisionFilterExtension";var wt=V;var y=d(_(),1);var It=d(_(),1),Rt=`layout(std140) uniform maskUniforms {
2116
2992
  vec4 bounds;
2117
2993
  highp int channel;
2118
2994
  bool enabled;
2119
2995
  bool inverted;
2120
2996
  bool maskByInstance;
2121
2997
  } mask;
2122
- `,Lr=`
2998
+ `,Br=`
2123
2999
  vec2 mask_getCoords(vec4 position) {
2124
3000
  return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy);
2125
3001
  }
2126
- `,Ar=`
3002
+ `,Lr=`
2127
3003
  ${Rt}
2128
- ${Lr}
2129
- `,Sr=`
3004
+ ${Br}
3005
+ `,Or=`
2130
3006
  uniform sampler2D mask_texture;
2131
3007
 
2132
3008
  bool mask_isInBounds(vec2 texCoords) {
@@ -2151,10 +3027,10 @@ bool mask_isInBounds(vec2 texCoords) {
2151
3027
  return maskValue < 0.5;
2152
3028
  }
2153
3029
  }
2154
- `,Ir=`
3030
+ `,wr=`
2155
3031
  ${Rt}
2156
- ${Sr}
2157
- `,Cr={"vs:#decl":`
3032
+ ${Or}
3033
+ `,Ir={"vs:#decl":`
2158
3034
  out vec2 mask_texCoords;
2159
3035
  `,"vs:#main-end":`
2160
3036
  vec4 mask_common_position;
@@ -2176,15 +3052,15 @@ in vec2 mask_texCoords;
2176
3052
 
2177
3053
  if (!mask) discard;
2178
3054
  }
2179
- `},Rr=i=>i&&"maskMap"in i?{mask_texture:i.maskMap}:i||{},kt={name:"mask",dependencies:[Ct.project],vs:Ar,fs:Ir,inject:Cr,getUniforms:Rr,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var Me=d(_(),1);var wt=d(_(),1),kr={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},U=class extends wt._LayersPass{constructor(e,t){super(e,t);let{mapSize:r=2048}=t;this.maskMap=e.createTexture({format:"rgba8unorm",width:r,height:r,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:r,height:r,colorAttachments:[this.maskMap]})}render(e){let t=2**e.channel,r=[255,255,255,255];super.render({...e,clearColor:r,colorMask:t,target:this.fbo,pass:"mask"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...kr}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var G=d(_(),1),Ee=new G.WebMercatorViewport({width:1,height:1,longitude:0,latitude:0,zoom:0});function H(i){let[e,t]=Ee.projectPosition(i);return[e,t]}function ne(i){return i.isGeospatial?Ee:i}function T(i,e){let t=[1/0,1/0,-1/0,-1/0];for(let r of i){let o=r.getBounds();if(o){let s=r.projectPosition(o[0],{viewport:e,autoOffset:!1}),n=r.projectPosition(o[1],{viewport:e,autoOffset:!1});t[0]=Math.min(t[0],s[0]),t[1]=Math.min(t[1],s[1]),t[2]=Math.max(t[2],n[0]),t[3]=Math.max(t[3],n[1])}}return Number.isFinite(t[0])?t:null}var wr=2048;function O(i){let{bounds:e,viewport:t,border:r=0}=i,{isGeospatial:o}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let s=o?Ee.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]):t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:n,height:a,zoom:l}=i;if(l===void 0){n=n-r*2,a=a-r*2;let f=Math.min(n/(e[2]-e[0]),a/(e[3]-e[1]));l=Math.min(Math.log2(f),20)}else if(!n||!a){let f=2**l;n=Math.round(Math.abs(e[2]-e[0])*f),a=Math.round(Math.abs(e[3]-e[1])*f);let u=wr-r*2;if(n>u||a>u){let c=u/Math.max(n,a);n=Math.round(n*c),a=Math.round(a*c),l+=Math.log2(c)}}return o?new G.WebMercatorViewport({id:t.id,x:r,y:r,width:n,height:a,longitude:s[0],latitude:s[1],zoom:l,orthographic:!0}):new G.OrthographicViewport({id:t.id,x:r,y:r,width:n,height:a,target:s,zoom:l,flipY:!1})}function Nr(i,e){let t;if(e&&e.length===2){let[s,n]=e,a=i.getBounds({z:s}),l=i.getBounds({z:n});t=[Math.min(a[0],l[0]),Math.min(a[1],l[1]),Math.max(a[2],l[2]),Math.max(a[3],l[3])]}else t=i.getBounds();let r=i.projectPosition(t.slice(0,2)),o=i.projectPosition(t.slice(2,4));return[r[0],r[1],o[0],o[1]]}function L(i,e,t){if(!i)return[0,0,1,1];let r=Nr(e,t),o=Br(r);return i[2]-i[0]<=o[2]-o[0]&&i[3]-i[1]<=o[3]-o[1]?i:[Math.max(i[0],o[0]),Math.max(i[1],o[1]),Math.min(i[2],o[2]),Math.min(i[3],o[3])]}function Br(i){let e=i[2]-i[0],t=i[3]-i[1],r=(i[0]+i[2])/2,o=(i[1]+i[3])/2;return[r-e,o-t,r+e,o+t]}var q=class{constructor(){this.id="mask-effect",this.props=null,this.useInPicking=!0,this.order=0,this.channels=[],this.masks=null}setup({device:e}){this.dummyMaskMap=e.createTexture({width:1,height:1}),this.maskPass=new U(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:r,onViewportActive:o,views:s,effects:n,isPicking:a}){let l=!1;if(a)return{didRender:l};let f=e.filter(m=>m.props.visible&&m.props.operation.includes("mask"));if(f.length===0)return this.masks=null,this.channels.length=0,{didRender:l};this.masks={};let u=this._sortMaskChannels(f),c=r[0],p=!this.lastViewport||!this.lastViewport.equals(c);if(c.resolution!==void 0)return Me.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:l};for(let m in u){let h=this._renderChannel(u[m],{layerFilter:t,onViewportActive:o,views:s,effects:n,viewport:c,viewportChanged:p});l||(l=h)}return{didRender:l}}_renderChannel(e,{layerFilter:t,onViewportActive:r,views:o,effects:s,viewport:n,viewportChanged:a}){let l=!1,f=this.channels[e.index];if(!f)return l;let u=e===f||e.layers.length!==f.layers.length||e.layers.some((c,p)=>c!==f.layers[p]||c.props.transitions)||e.layerBounds.some((c,p)=>c!==f.layerBounds[p]);if(e.bounds=f.bounds,e.maskBounds=f.maskBounds,this.channels[e.index]=e,u||a){this.lastViewport=n;let c=T(e.layers,n);if(e.bounds=c&&L(c,n),u||!M(e.bounds,f.bounds)){let{maskPass:p,maskMap:m}=this,h=c&&O({bounds:e.bounds,viewport:n,width:m.width,height:m.height,border:1});e.maskBounds=h?h.getBounds():[0,0,1,1],p.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:h?[h]:[],onViewportActive:r,views:o,effects:s,shaderModuleProps:{project:{devicePixelRatio:1}}}),l=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},l}_sortMaskChannels(e){let t={},r=0;for(let o of e){let{id:s}=o.root,n=t[s];if(!n){if(++r>4){Me.log.warn("Too many mask layers. The max supported is 4")();continue}n={id:s,index:this.channels.findIndex(a=>a?.id===s),layers:[],layerBounds:[],coordinateOrigin:o.root.props.coordinateOrigin,coordinateSystem:o.root.props.coordinateSystem},t[s]=n}n.layers.push(o),n.layerBounds.push(o.getBounds())}for(let o=0;o<4;o++){let s=this.channels[o];(!s||!(s.id in t))&&(this.channels[o]=null)}for(let o in t){let s=t[o];s.index<0&&(s.index=this.channels.findIndex(n=>!n),this.channels[s.index]=s)}return t}getShaderModuleProps(){return{mask:{maskMap:this.masks?this.maskMap:this.dummyMaskMap,maskChannels:this.masks}}}cleanup(){this.dummyMaskMap&&(this.dummyMaskMap.delete(),this.dummyMaskMap=void 0),this.maskPass&&(this.maskPass.delete(),this.maskPass=void 0,this.maskMap=void 0),this.lastViewport=void 0,this.masks=null,this.channels.length=0}};var Dr={maskId:"",maskByInstance:void 0,maskInverted:!1},W=class extends b.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new q)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=Boolean(this.props.maskByInstance)),this.state.maskByInstance=e,{modules:[kt]}}draw({context:e,shaderModuleProps:t}){let r={};r.maskByInstance=Boolean(this.state.maskByInstance);let{maskId:o,maskInverted:s}=this.props,{maskChannels:n}=t.mask||{},{viewport:a}=e;if(n&&n[o]){let{index:l,bounds:f,coordinateOrigin:u}=n[o],{coordinateSystem:c}=n[o];r.enabled=!0,r.channel=l,r.inverted=s,c===b.COORDINATE_SYSTEM.DEFAULT&&(c=a.isGeospatial?b.COORDINATE_SYSTEM.LNGLAT:b.COORDINATE_SYSTEM.CARTESIAN);let p={modelMatrix:null,fromCoordinateOrigin:u,fromCoordinateSystem:c},m=this.projectPosition([f[0],f[1],0],p),h=this.projectPosition([f[2],f[3],0],p);r.bounds=[m[0],m[1],h[0],h[1]]}else o&&b.log.warn(`Could not find a mask layer with id: ${o}`)(),r.enabled=!1;this.setShaderModuleProps({mask:r})}};W.defaultProps=Dr;W.extensionName="MaskExtension";var Nt=W;var qt=d(_(),1);var Ht=d(_(),1);var Fe=d(_(),1),g={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},zr=Object.keys(g).map(i=>`const float TERRAIN_MODE_${i} = ${g[i]}.0;`).join(`
2180
- `),Bt=zr+`
3055
+ `},Rr=i=>i&&"maskMap"in i?{mask_texture:i.maskMap}:i||{},Ct={name:"mask",dependencies:[It.project],vs:Lr,fs:wr,inject:Ir,getUniforms:Rr,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var Me=d(_(),1);var kt=d(_(),1),Cr={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},U=class extends kt._LayersPass{constructor(e,t){super(e,t);let{mapSize:r=2048}=t;this.maskMap=e.createTexture({format:"rgba8unorm",width:r,height:r,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:r,height:r,colorAttachments:[this.maskMap]})}render(e){let t=2**e.channel,r=[255,255,255,255];super.render({...e,clearColor:r,colorMask:t,target:this.fbo,pass:"mask"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...Cr}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var j=d(_(),1),Ee=new j.WebMercatorViewport({width:1,height:1,longitude:0,latitude:0,zoom:0});function G(i){let[e,t]=Ee.projectPosition(i);return[e,t]}function se(i){return i.isGeospatial?Ee:i}function A(i,e){let t=[1/0,1/0,-1/0,-1/0];for(let r of i){let n=r.getBounds();if(n){let o=r.projectPosition(n[0],{viewport:e,autoOffset:!1}),s=r.projectPosition(n[1],{viewport:e,autoOffset:!1});t[0]=Math.min(t[0],o[0]),t[1]=Math.min(t[1],o[1]),t[2]=Math.max(t[2],s[0]),t[3]=Math.max(t[3],s[1])}}return Number.isFinite(t[0])?t:null}var kr=2048;function S(i){let{bounds:e,viewport:t,border:r=0}=i,{isGeospatial:n}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let o=n?Ee.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]):t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:s,height:a,zoom:f}=i;if(f===void 0){s=s-r*2,a=a-r*2;let l=Math.min(s/(e[2]-e[0]),a/(e[3]-e[1]));f=Math.min(Math.log2(l),20)}else if(!s||!a){let l=2**f;s=Math.round(Math.abs(e[2]-e[0])*l),a=Math.round(Math.abs(e[3]-e[1])*l);let c=kr-r*2;if(s>c||a>c){let u=c/Math.max(s,a);s=Math.round(s*u),a=Math.round(a*u),f+=Math.log2(u)}}return n?new j.WebMercatorViewport({id:t.id,x:r,y:r,width:s,height:a,longitude:o[0],latitude:o[1],zoom:f,orthographic:!0}):new j.OrthographicViewport({id:t.id,x:r,y:r,width:s,height:a,target:o,zoom:f,flipY:!1})}function Nr(i,e){let t;if(e&&e.length===2){let[o,s]=e,a=i.getBounds({z:o}),f=i.getBounds({z:s});t=[Math.min(a[0],f[0]),Math.min(a[1],f[1]),Math.max(a[2],f[2]),Math.max(a[3],f[3])]}else t=i.getBounds();let r=i.projectPosition(t.slice(0,2)),n=i.projectPosition(t.slice(2,4));return[r[0],r[1],n[0],n[1]]}function T(i,e,t){if(!i)return[0,0,1,1];let r=Nr(e,t),n=Dr(r);return i[2]-i[0]<=n[2]-n[0]&&i[3]-i[1]<=n[3]-n[1]?i:[Math.max(i[0],n[0]),Math.max(i[1],n[1]),Math.min(i[2],n[2]),Math.min(i[3],n[3])]}function Dr(i){let e=i[2]-i[0],t=i[3]-i[1],r=(i[0]+i[2])/2,n=(i[1]+i[3])/2;return[r-e,n-t,r+e,n+t]}var H=class{constructor(){this.id="mask-effect",this.props=null,this.useInPicking=!0,this.order=0,this.channels=[],this.masks=null}setup({device:e}){this.dummyMaskMap=e.createTexture({width:1,height:1}),this.maskPass=new U(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:r,onViewportActive:n,views:o,effects:s,isPicking:a}){let f=!1;if(a)return{didRender:f};let l=e.filter(m=>m.props.visible&&m.props.operation.includes("mask"));if(l.length===0)return this.masks=null,this.channels.length=0,{didRender:f};this.masks={};let c=this._sortMaskChannels(l),u=r[0],p=!this.lastViewport||!this.lastViewport.equals(u);if(u.resolution!==void 0)return Me.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:f};for(let m in c){let h=this._renderChannel(c[m],{layerFilter:t,onViewportActive:n,views:o,effects:s,viewport:u,viewportChanged:p});f||(f=h)}return{didRender:f}}_renderChannel(e,{layerFilter:t,onViewportActive:r,views:n,effects:o,viewport:s,viewportChanged:a}){let f=!1,l=this.channels[e.index];if(!l)return f;let c=e===l||e.layers.length!==l.layers.length||e.layers.some((u,p)=>u!==l.layers[p]||u.props.transitions)||e.layerBounds.some((u,p)=>u!==l.layerBounds[p]);if(e.bounds=l.bounds,e.maskBounds=l.maskBounds,this.channels[e.index]=e,c||a){this.lastViewport=s;let u=A(e.layers,s);if(e.bounds=u&&T(u,s),c||!M(e.bounds,l.bounds)){let{maskPass:p,maskMap:m}=this,h=u&&S({bounds:e.bounds,viewport:s,width:m.width,height:m.height,border:1});e.maskBounds=h?h.getBounds():[0,0,1,1],p.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:h?[h]:[],onViewportActive:r,views:n,effects:o,shaderModuleProps:{project:{devicePixelRatio:1}}}),f=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},f}_sortMaskChannels(e){let t={},r=0;for(let n of e){let{id:o}=n.root,s=t[o];if(!s){if(++r>4){Me.log.warn("Too many mask layers. The max supported is 4")();continue}s={id:o,index:this.channels.findIndex(a=>a?.id===o),layers:[],layerBounds:[],coordinateOrigin:n.root.props.coordinateOrigin,coordinateSystem:n.root.props.coordinateSystem},t[o]=s}s.layers.push(n),s.layerBounds.push(n.getBounds())}for(let n=0;n<4;n++){let o=this.channels[n];(!o||!(o.id in t))&&(this.channels[n]=null)}for(let n in t){let o=t[n];o.index<0&&(o.index=this.channels.findIndex(s=>!s),this.channels[o.index]=o)}return t}getShaderModuleProps(){return{mask:{maskMap:this.masks?this.maskMap:this.dummyMaskMap,maskChannels:this.masks}}}cleanup(){this.dummyMaskMap&&(this.dummyMaskMap.delete(),this.dummyMaskMap=void 0),this.maskPass&&(this.maskPass.delete(),this.maskPass=void 0,this.maskMap=void 0),this.lastViewport=void 0,this.masks=null,this.channels.length=0}};var zr={maskId:"",maskByInstance:void 0,maskInverted:!1},q=class extends y.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new H)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=!!this.props.maskByInstance),this.state.maskByInstance=e,{modules:[Ct]}}draw({context:e,shaderModuleProps:t}){let r={};r.maskByInstance=!!this.state.maskByInstance;let{maskId:n,maskInverted:o}=this.props,{maskChannels:s}=t.mask||{},{viewport:a}=e;if(s&&s[n]){let{index:f,bounds:l,coordinateOrigin:c}=s[n],{coordinateSystem:u}=s[n];r.enabled=!0,r.channel=f,r.inverted=o,u===y.COORDINATE_SYSTEM.DEFAULT&&(u=a.isGeospatial?y.COORDINATE_SYSTEM.LNGLAT:y.COORDINATE_SYSTEM.CARTESIAN);let p={modelMatrix:null,fromCoordinateOrigin:c,fromCoordinateSystem:u},m=this.projectPosition([l[0],l[1],0],p),h=this.projectPosition([l[2],l[3],0],p);r.bounds=[m[0],m[1],h[0],h[1]]}else n&&y.log.warn(`Could not find a mask layer with id: ${n}`)(),r.enabled=!1;this.setShaderModuleProps({mask:r})}};q.defaultProps=zr;q.extensionName="MaskExtension";var Nt=q;var Wt=d(_(),1);var qt=d(_(),1);var Fe=d(_(),1),v={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},Vr=Object.keys(v).map(i=>`const float TERRAIN_MODE_${i} = ${v[i]}.0;`).join(`
3056
+ `),Dt=Vr+`
2181
3057
  layout(std140) uniform terrainUniforms {
2182
3058
  float mode;
2183
3059
  vec4 bounds;
2184
3060
  } terrain;
2185
3061
 
2186
3062
  uniform sampler2D terrain_map;
2187
- `,Y={name:"terrain",dependencies:[Fe.project],vs:`${Bt}
3063
+ `,W={name:"terrain",dependencies:[Fe.project],vs:`${Dt}
2188
3064
  out vec3 commonPos;
2189
3065
  // In globe mode, absolute Mercator position for terrain FBO UV lookups
2190
3066
  out vec2 terrainMercPos;
@@ -2197,7 +3073,7 @@ vec2 terrain_globe_to_mercator(vec3 globePosition) {
2197
3073
  float y = atanh(sinLat);
2198
3074
  return (vec2(x, y) + PI) * WORLD_SCALE;
2199
3075
  }
2200
- `,fs:`${Bt}in vec2 terrainMercPos;
3076
+ `,fs:`${Dt}in vec2 terrainMercPos;
2201
3077
  in float terrainHeight;`,inject:{"vs:#main-start":`
2202
3078
  if (terrain.mode == TERRAIN_MODE_SKIP) {
2203
3079
  gl_Position = vec4(0.0);
@@ -2254,6 +3130,6 @@ if ((terrain.mode == TERRAIN_MODE_USE_COVER) || (terrain.mode == TERRAIN_MODE_US
2254
3130
  }
2255
3131
  return;
2256
3132
  }
2257
- `},getUniforms:(i={})=>{if(!i.dummyHeightMap)return{};if("terrainSkipRender"in i||"drawToTerrainHeightMap"in i){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:r,dummyHeightMap:o,terrainCover:s,useTerrainHeightMap:n,terrainSkipRender:a}=i,l=Fe.project.getUniforms(i.project),{commonOrigin:f}=l,u=a?g.SKIP:g.NONE,c=o,p=null;if(e)u=g.WRITE_HEIGHT_MAP,p=r;else if(n&&t)u=g.USE_HEIGHT_MAP,c=t,p=r;else if(s){let h=(i.isPicking?s.getPickingFramebuffer():s.getRenderFramebuffer())?.colorAttachments[0].texture;i.isPicking&&(u=g.SKIP),h?(c=h,u=u===g.SKIP?g.USE_COVER_ONLY:g.USE_COVER,p=s.bounds):i.isPicking&&!a&&(u=g.NONE)}return{mode:u,terrain_map:c,bounds:p?[p[0]-f[0],p[1]-f[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return{mode:g.NONE,terrain_map:i.dummyHeightMap,bounds:[0,0,0,0]}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};var Dt=d(_(),1);function K(i,e){return i.createFramebuffer({id:e.id,colorAttachments:[i.createTexture({id:e.id,...e.float&&{format:"rgba32float",type:5126},dimension:"2d",width:1,height:1,sampler:e.interpolate===!1?{minFilter:"nearest",magFilter:"nearest"}:{minFilter:"linear",magFilter:"linear"}})]})}var ae=class{constructor(e){this.isDirty=!0,this.renderViewport=null,this.bounds=null,this.layers=[],this.targetBounds=null,this.targetBoundsCommon=null,this.targetLayer=e,this.tile=zt(e)}get id(){return this.targetLayer.id}get isActive(){return Boolean(this.targetLayer.getCurrentLayer())}shouldUpdate({targetLayer:e,viewport:t,layers:r,layerNeedsRedraw:o}){e&&(this.targetLayer=e);let s=t?this._updateViewport(t):!1,n=r?this._updateLayers(r):!1;if(o){for(let a of this.layers)if(o[a]){n=!0;break}}return n||s}_updateLayers(e){let t=!1;if(e=this.tile?Vr(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let r=0;r<e.length;r++)if(e[r].id!==this.layers[r]){t=!0;break}return t&&(this.layers=e.map(r=>r.id)),t}_updateViewport(e){let t=this.targetLayer,r=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){r=!0,this.targetBounds=this.tile.boundingBox;let s=H(this.targetBounds[0]),n=H(this.targetBounds[1]);this.targetBoundsCommon=[s[0],s[1],n[0],n[1]]}}else this.targetBounds!==t.getBounds()&&(r=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=T([t],ne(e)));if(!this.targetBoundsCommon)return!1;let o=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let s=this.renderViewport?.zoom;r=r||o!==s;let n=e instanceof Dt._GlobeViewport?this.targetBoundsCommon:L(this.targetBoundsCommon,e),a=this.bounds;r=r||!a||n.some((l,f)=>l!==a[f]),this.bounds=n}return r&&(this.renderViewport=O({bounds:this.bounds,zoom:o,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=K(this.targetLayer.context.device,{id:this.id})),this.fbo)}getPickingFramebuffer(){return!this.renderViewport||this.layers.length===0&&!this.targetLayer.props.pickable?null:(this.pickingFbo||(this.pickingFbo=K(this.targetLayer.context.device,{id:`${this.id}-picking`,interpolate:!1})),this.pickingFbo)}filterLayers(e){return e.filter(({id:t})=>this.layers.includes(t))}delete(){let{fbo:e,pickingFbo:t}=this;e&&(e.colorAttachments[0].destroy(),e.destroy()),t&&(t.colorAttachments[0].destroy(),t.destroy())}};function Vr(i,e){return e.filter(t=>{let r=zt(t);return r?jr(i.boundingBox,r.boundingBox):!0})}function zt(i){for(;i;){let{tile:e}=i.props;if(e)return e;i=i.parent}return null}function jr(i,e){return i&&e?i[0][0]<e[1][0]&&e[0][0]<i[1][0]&&i[0][1]<e[1][1]&&e[0][1]<i[1][1]:!1}var Vt=d(_(),1),Ur={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},le=class extends Vt._LayersPass{getRenderableLayers(e,t){let{layers:r}=t,o=[],s=this._getDrawLayerParams(e,t,!0);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&s[n].shouldDrawLayer&&o.push(a)}return o}renderHeightMap(e,t){let r=e.getRenderFramebuffer(),o=e.renderViewport;!r||!o||(r.resize(o),this.render({...t,target:r,pass:"terrain-height-map",layers:t.layers,viewports:[o],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let r=e.getRenderFramebuffer(),o=e.renderViewport;if(!r||!o)return;let s=e.filterLayers(t.layers);r.resize(o),this.render({...t,target:r,pass:`terrain-cover-${e.id}`,layers:s,viewports:[o],clearColor:[0,0,0,0]})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&Ur}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var jt=d(_(),1),fe=class extends jt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:r}=t,o=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let s=this._getDrawLayerParams(e,t);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&s[n].shouldDrawLayer&&(o.push(a),this.drawParameters[a.id]=s[n].layerParameters)}return o}renderTerrainCover(e,t){let r=e.getPickingFramebuffer(),o=e.renderViewport;if(!r||!o)return;let s=e.filterLayers(t.layers),n=e.targetLayer;n.props.pickable&&s.unshift(n),r.resize(o);let l=this.drawParameters[n.id]?.blendColor?.[3]??0;this.render({...t,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:s,viewports:[o],cullRect:void 0,deviceRect:o,pickZ:!1,clearColor:[0,0,0,l]})}getLayerParameters(e,t,r){let o;return this.drawParameters[e.id]?o=this.drawParameters[e.id]:(o=super.getLayerParameters(e,t,r),o.blend=!0),{...o,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,t,r){return{...super.getShaderModuleProps(e,t,r),terrain:{project:r.project}}}};var Gt=d(_(),1),Ut=2048,$=class{static isSupported(e){return e.isTextureFormatRenderable("rgba32float")}constructor(e){this.renderViewport=null,this.bounds=null,this.layers=[],this.layersBounds=[],this.layersBoundsCommon=null,this.lastViewport=null,this.device=e}getRenderFramebuffer(){return this.renderViewport?(this.fbo||(this.fbo=K(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let r=e.length!==this.layers.length||e.some((s,n)=>s!==this.layers[n]||s.props.transitions||s.getBounds()!==this.layersBounds[n]);r&&(this.layers=e,this.layersBounds=e.map(s=>s.getBounds()),this.layersBoundsCommon=T(e,ne(t)));let o=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||o){let s=t instanceof Gt._GlobeViewport?this.layersBoundsCommon:L(this.layersBoundsCommon,t);if(s[2]<=s[0]||s[3]<=s[1])return this.renderViewport=null,!1;this.bounds=s,this.lastViewport=t;let n=t.scale,a=(s[2]-s[0])*n,l=(s[3]-s[1])*n,f=t.isGeospatial?H([t.longitude??0,t.latitude??0]):[t.center[0],t.center[1]];return this.renderViewport=a>0||l>0?O({bounds:[f[0]-1,f[1]-1,f[0]+1,f[1]+1],zoom:t.zoom,width:Math.min(a,Ut),height:Math.min(l,Ut),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var ce=class{constructor(){this.id="terrain-effect",this.props=null,this.useInPicking=!0,this.isPicking=!1,this.isDrapingEnabled=!1,this.terrainCovers=new Map}setup({device:e,deck:t}){this.dummyHeightMap=e.createTexture({width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new le(e,{id:"terrain"}),this.terrainPickingPass=new fe(e,{id:"terrain-picking"}),$.isSupported(e)?this.heightMap=new $(e):Ht.log.warn("Terrain offset mode is not supported by this browser")(),t._addDefaultShaderModule(Y)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:t}=e,r=e.pass.startsWith("picking");this.isPicking=r,this.isDrapingEnabled=!0;let o=t[0],s=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(o,e),n=s.filter(f=>f.props.operation.includes("terrain"));if(n.length===0)return;r||s.filter(u=>u.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(n,o,e);let a=s.filter(f=>f.state.terrainDrawMode==="drape"),l=e.effects?.filter(f=>f!==this);this._updateTerrainCovers(n,a,o,{...e,effects:l})}getShaderModuleProps(e,t){if(e.props.operation.includes("mask"))return{terrain:{dummyHeightMap:this.dummyHeightMap}};let{terrainDrawMode:r}=e.state,o=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=Boolean(o?.getPickingFramebuffer())),{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:o,useTerrainHeightMap:r==="offset",terrainSkipRender:r==="drape"||!e.props.operation.includes("draw")}}}cleanup({deck:e}){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);for(let t of this.terrainCovers.values())t.delete();this.terrainCovers.clear(),e._removeDefaultShaderModule(Y)}_updateHeightMap(e,t,r){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...r,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,t,r,o){let s={};for(let n of t)n.state.terrainCoverNeedsRedraw&&(s[n.id]=!0,n.state.terrainCoverNeedsRedraw=!1);for(let n of this.terrainCovers.values())n.isDirty=n.isDirty||n.shouldUpdate({layerNeedsRedraw:s});for(let n of e)this._updateTerrainCover(n,t,r,o);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,r,o){let s=this.isPicking?this.terrainPickingPass:this.terrainPass,n=this.terrainCovers.get(e.id);n||(n=new ae(e),this.terrainCovers.set(e.id,n));try{let a=n.shouldUpdate({targetLayer:e,viewport:r,layers:t});(this.isPicking||n.isDirty||a)&&(s.renderTerrainCover(n,{...o,layers:t,shaderModuleProps:{terrain:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1},project:{devicePixelRatio:1}}}),this.isPicking||(n.isDirty=!1))}catch(a){e.raiseError(a,`Error rendering terrain cover ${n.id}`)}}_pruneTerrainCovers(){let e=[];for(let[t,r]of this.terrainCovers)r.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var Gr={terrainDrawMode:void 0},Z=class extends qt.LayerExtension{getShaders(){return{modules:[Y]}}initializeState(){this.context.deck?._addDefaultEffect(new ce)}updateState(e){let{props:t,oldProps:r}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===r.terrainDrawMode&&t.extruded===r.extruded)return;let{terrainDrawMode:o}=t;if(!o){let s=this.props.extruded,n=this.getAttributeManager()?.attributes,a=n&&"instancePositions"in n;o=s||a?"offset":"drape"}this.setState({terrainDrawMode:o})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};Z.defaultProps=Gr;Z.extensionName="TerrainExtension";var Wt=Z;return Xt(J);})();
3133
+ `},getUniforms:(i={})=>{if(!i.dummyHeightMap)return{};if("terrainSkipRender"in i||"drawToTerrainHeightMap"in i){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:r,dummyHeightMap:n,terrainCover:o,useTerrainHeightMap:s,terrainSkipRender:a}=i,f=Fe.project.getUniforms(i.project),{commonOrigin:l}=f,c=a?v.SKIP:v.NONE,u=n,p=null;if(e)c=v.WRITE_HEIGHT_MAP,p=r;else if(s&&t)c=v.USE_HEIGHT_MAP,u=t,p=r;else if(o){let h=(i.isPicking?o.getPickingFramebuffer():o.getRenderFramebuffer())?.colorAttachments[0].texture;i.isPicking&&(c=v.SKIP),h?(u=h,c=c===v.SKIP?v.USE_COVER_ONLY:v.USE_COVER,p=o.bounds):i.isPicking&&!a&&(c=v.NONE)}return{mode:c,terrain_map:u,bounds:p?[p[0]-l[0],p[1]-l[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return{mode:v.NONE,terrain_map:i.dummyHeightMap,bounds:[0,0,0,0]}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};var zt=d(_(),1);function Y(i,e){return i.createFramebuffer({id:e.id,colorAttachments:[i.createTexture({id:e.id,...e.float&&{format:"rgba32float",type:5126},dimension:"2d",width:1,height:1,sampler:e.interpolate===!1?{minFilter:"nearest",magFilter:"nearest"}:{minFilter:"linear",magFilter:"linear"}})]})}var ae=class{constructor(e){this.isDirty=!0,this.renderViewport=null,this.bounds=null,this.layers=[],this.targetBounds=null,this.targetBoundsCommon=null,this.targetLayer=e,this.tile=Vt(e)}get id(){return this.targetLayer.id}get isActive(){return!!this.targetLayer.getCurrentLayer()}shouldUpdate({targetLayer:e,viewport:t,layers:r,layerNeedsRedraw:n}){e&&(this.targetLayer=e);let o=t?this._updateViewport(t):!1,s=r?this._updateLayers(r):!1;if(n){for(let a of this.layers)if(n[a]){s=!0;break}}return s||o}_updateLayers(e){let t=!1;if(e=this.tile?Ur(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let r=0;r<e.length;r++)if(e[r].id!==this.layers[r]){t=!0;break}return t&&(this.layers=e.map(r=>r.id)),t}_updateViewport(e){let t=this.targetLayer,r=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){r=!0,this.targetBounds=this.tile.boundingBox;let o=G(this.targetBounds[0]),s=G(this.targetBounds[1]);this.targetBoundsCommon=[o[0],o[1],s[0],s[1]]}}else this.targetBounds!==t.getBounds()&&(r=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=A([t],se(e)));if(!this.targetBoundsCommon)return!1;let n=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let o=this.renderViewport?.zoom;r=r||n!==o;let s=e instanceof zt._GlobeViewport?this.targetBoundsCommon:T(this.targetBoundsCommon,e),a=this.bounds;r=r||!a||s.some((f,l)=>f!==a[l]),this.bounds=s}return r&&(this.renderViewport=S({bounds:this.bounds,zoom:n,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=Y(this.targetLayer.context.device,{id:this.id})),this.fbo)}getPickingFramebuffer(){return!this.renderViewport||this.layers.length===0&&!this.targetLayer.props.pickable?null:(this.pickingFbo||(this.pickingFbo=Y(this.targetLayer.context.device,{id:`${this.id}-picking`,interpolate:!1})),this.pickingFbo)}filterLayers(e){return e.filter(({id:t})=>this.layers.includes(t))}delete(){let{fbo:e,pickingFbo:t}=this;e&&(e.colorAttachments[0].destroy(),e.destroy()),t&&(t.colorAttachments[0].destroy(),t.destroy())}};function Ur(i,e){return e.filter(t=>{let r=Vt(t);return r?jr(i.boundingBox,r.boundingBox):!0})}function Vt(i){for(;i;){let{tile:e}=i.props;if(e)return e;i=i.parent}return null}function jr(i,e){return i&&e?i[0][0]<e[1][0]&&e[0][0]<i[1][0]&&i[0][1]<e[1][1]&&e[0][1]<i[1][1]:!1}var Ut=d(_(),1),Gr={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},fe=class extends Ut._LayersPass{getRenderableLayers(e,t){let{layers:r}=t,n=[],o=this._getDrawLayerParams(e,t,!0);for(let s=0;s<r.length;s++){let a=r[s];!a.isComposite&&o[s].shouldDrawLayer&&n.push(a)}return n}renderHeightMap(e,t){let r=e.getRenderFramebuffer(),n=e.renderViewport;!r||!n||(r.resize(n),this.render({...t,target:r,pass:"terrain-height-map",layers:t.layers,viewports:[n],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let r=e.getRenderFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(t.layers);r.resize(n),this.render({...t,target:r,pass:`terrain-cover-${e.id}`,layers:o,viewports:[n],clearColor:[0,0,0,0]})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&Gr}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var jt=d(_(),1),le=class extends jt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:r}=t,n=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let o=this._getDrawLayerParams(e,t);for(let s=0;s<r.length;s++){let a=r[s];!a.isComposite&&o[s].shouldDrawLayer&&(n.push(a),this.drawParameters[a.id]=o[s].layerParameters)}return n}renderTerrainCover(e,t){let r=e.getPickingFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(t.layers),s=e.targetLayer;s.props.pickable&&o.unshift(s),r.resize(n);let f=this.drawParameters[s.id]?.blendColor?.[3]??0;this.render({...t,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:o,viewports:[n],cullRect:void 0,deviceRect:n,pickZ:!1,clearColor:[0,0,0,f]})}getLayerParameters(e,t,r){let n;return this.drawParameters[e.id]?n=this.drawParameters[e.id]:(n=super.getLayerParameters(e,t,r),n.blend=!0),{...n,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,t,r){return{...super.getShaderModuleProps(e,t,r),terrain:{project:r.project}}}};var Ht=d(_(),1),Gt=2048,K=class{static isSupported(e){return e.isTextureFormatRenderable("rgba32float")}constructor(e){this.renderViewport=null,this.bounds=null,this.layers=[],this.layersBounds=[],this.layersBoundsCommon=null,this.lastViewport=null,this.device=e}getRenderFramebuffer(){return this.renderViewport?(this.fbo||(this.fbo=Y(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let r=e.length!==this.layers.length||e.some((o,s)=>o!==this.layers[s]||o.props.transitions||o.getBounds()!==this.layersBounds[s]);r&&(this.layers=e,this.layersBounds=e.map(o=>o.getBounds()),this.layersBoundsCommon=A(e,se(t)));let n=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||n){let o=t instanceof Ht._GlobeViewport?this.layersBoundsCommon:T(this.layersBoundsCommon,t);if(o[2]<=o[0]||o[3]<=o[1])return this.renderViewport=null,!1;this.bounds=o,this.lastViewport=t;let s=t.scale,a=(o[2]-o[0])*s,f=(o[3]-o[1])*s,l=t.isGeospatial?G([t.longitude??0,t.latitude??0]):[t.center[0],t.center[1]];return this.renderViewport=a>0||f>0?S({bounds:[l[0]-1,l[1]-1,l[0]+1,l[1]+1],zoom:t.zoom,width:Math.min(a,Gt),height:Math.min(f,Gt),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var ue=class{constructor(){this.id="terrain-effect",this.props=null,this.useInPicking=!0,this.isPicking=!1,this.isDrapingEnabled=!1,this.terrainCovers=new Map}setup({device:e,deck:t}){this.dummyHeightMap=e.createTexture({width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new fe(e,{id:"terrain"}),this.terrainPickingPass=new le(e,{id:"terrain-picking"}),K.isSupported(e)?this.heightMap=new K(e):qt.log.warn("Terrain offset mode is not supported by this browser")(),t._addDefaultShaderModule(W)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:t}=e,r=e.pass.startsWith("picking");this.isPicking=r,this.isDrapingEnabled=!0;let n=t[0],o=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(n,e),s=o.filter(l=>l.props.operation.includes("terrain"));if(s.length===0)return;r||o.filter(c=>c.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(s,n,e);let a=o.filter(l=>l.state.terrainDrawMode==="drape"),f=e.effects?.filter(l=>l!==this);this._updateTerrainCovers(s,a,n,{...e,effects:f})}getShaderModuleProps(e,t){if(e.props.operation.includes("mask"))return{terrain:{dummyHeightMap:this.dummyHeightMap}};let{terrainDrawMode:r}=e.state,n=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=!!n?.getPickingFramebuffer()),{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:n,useTerrainHeightMap:r==="offset",terrainSkipRender:r==="drape"||!e.props.operation.includes("draw")}}}cleanup({deck:e}){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);for(let t of this.terrainCovers.values())t.delete();this.terrainCovers.clear(),e._removeDefaultShaderModule(W)}_updateHeightMap(e,t,r){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...r,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,t,r,n){let o={};for(let s of t)s.state.terrainCoverNeedsRedraw&&(o[s.id]=!0,s.state.terrainCoverNeedsRedraw=!1);for(let s of this.terrainCovers.values())s.isDirty=s.isDirty||s.shouldUpdate({layerNeedsRedraw:o});for(let s of e)this._updateTerrainCover(s,t,r,n);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,r,n){let o=this.isPicking?this.terrainPickingPass:this.terrainPass,s=this.terrainCovers.get(e.id);s||(s=new ae(e),this.terrainCovers.set(e.id,s));try{let a=s.shouldUpdate({targetLayer:e,viewport:r,layers:t});(this.isPicking||s.isDirty||a)&&(o.renderTerrainCover(s,{...n,layers:t,shaderModuleProps:{terrain:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1},project:{devicePixelRatio:1}}}),this.isPicking||(s.isDirty=!1))}catch(a){e.raiseError(a,`Error rendering terrain cover ${s.id}`)}}_pruneTerrainCovers(){let e=[];for(let[t,r]of this.terrainCovers)r.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var Hr={terrainDrawMode:void 0},Z=class extends Wt.LayerExtension{getShaders(){return{modules:[W]}}initializeState(){this.context.deck?._addDefaultEffect(new ue)}updateState(e){let{props:t,oldProps:r}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===r.terrainDrawMode&&t.extruded===r.extruded)return;let{terrainDrawMode:n}=t;if(!n){let o=this.props.extruded,s=this.getAttributeManager()?.attributes,a=s&&"instancePositions"in s;n=o||a?"offset":"drape"}this.setState({terrainDrawMode:n})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};Z.defaultProps=Hr;Z.extensionName="TerrainExtension";var Yt=Z;return Xt($);})();
2258
3134
  return __exports__;
2259
3135
  });