@deck.gl/extensions 9.3.0-alpha.3 → 9.3.0-alpha.5

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 jt=Object.create;var Q=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var zt=Object.getOwnPropertyNames;var Ut=Object.getPrototypeOf,Gt=Object.prototype.hasOwnProperty;var Te=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports),Ae=(o,e)=>{for(var t in e)Q(o,t,{get:e[t],enumerable:!0})},X=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of zt(e))!Gt.call(o,s)&&s!==t&&Q(o,s,{get:()=>e[s],enumerable:!(r=Vt(e,s))||r.enumerable});return o},P=(o,e,t)=>(X(o,e,"default"),t&&X(t,e,"default")),d=(o,e,t)=>(t=o!=null?jt(Ut(o)):{},X(e||!o||!o.__esModule?Q(t,"default",{value:o,enumerable:!0}):t,o)),Ht=o=>X(Q({},"__esModule",{value:!0}),o);var _=Te((Dr,Oe)=>{Oe.exports=globalThis.deck});var He=Te((Hr,Ge)=>{Ge.exports=globalThis.luma});var Z={};Ae(Z,{BrushingExtension:()=>Re,ClipExtension:()=>xt,CollisionFilterExtension:()=>Ft,DataFilterExtension:()=>Ze,FillStyleExtension:()=>ht,Fp64Extension:()=>ct,MaskExtension:()=>Ct,PathStyleExtension:()=>pt,_TerrainExtension:()=>Dt,project64:()=>re});var x={},Le=d(_(),1);P(x,d(_(),1));if(!Le.Layer)throw new Error("@deck.gl/core is not found");P(Z,x);var ke=d(_(),1);var Ce=d(_(),1),Se=`uniform brushingUniforms {
7
+ "use strict";var __exports__=(()=>{var Vt=Object.create;var Q=Object.defineProperty;var jt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var Ae=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Te=(r,e)=>{for(var t in e)Q(r,t,{get:e[t],enumerable:!0})},X=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ut(e))!Ht.call(r,i)&&i!==t&&Q(r,i,{get:()=>e[i],enumerable:!(o=jt(e,i))||o.enumerable});return r},y=(r,e,t)=>(X(r,e,"default"),t&&X(t,e,"default")),d=(r,e,t)=>(t=r!=null?Vt(Gt(r)):{},X(e||!r||!r.__esModule?Q(t,"default",{value:r,enumerable:!0}):t,r)),qt=r=>X(Q({},"__esModule",{value:!0}),r);var _=Ae((zo,Se)=>{Se.exports=globalThis.deck});var qe=Ae((qo,He)=>{He.exports=globalThis.luma});var Z={};Te(Z,{BrushingExtension:()=>Ne,ClipExtension:()=>yt,CollisionFilterExtension:()=>Ot,DataFilterExtension:()=>Xe,FillStyleExtension:()=>vt,Fp64Extension:()=>ct,MaskExtension:()=>It,PathStyleExtension:()=>dt,_TerrainExtension:()=>zt,project64:()=>oe});var x={},Le=d(_(),1);y(x,d(_(),1));if(!Le.Layer)throw new Error("@deck.gl/core is not found");y(Z,x);var Re=d(_(),1);var Ie=d(_(),1),Ce=`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
+ `,Wt=`
14
14
  in vec2 brushingTargets;
15
15
 
16
16
  out float brushing_isVisible;
@@ -34,14 +34,14 @@
34
34
  brushing_isVisible = float(visible);
35
35
  }
36
36
  `,Yt=`
37
- ${Se}
38
- ${qt}
39
- `,Wt=`
40
- in float brushing_isVisible;
41
- `,Kt=`
42
- ${Se}
37
+ ${Ce}
43
38
  ${Wt}
44
- `,$t={source:0,target:1,custom:2,source_target:3},Zt={"vs:DECKGL_FILTER_GL_POSITION":`
39
+ `,Kt=`
40
+ in float brushing_isVisible;
41
+ `,$t=`
42
+ ${Ce}
43
+ ${Kt}
44
+ `,Zt={source:0,target:1,custom:2,source_target:3},Xt={"vs:DECKGL_FILTER_GL_POSITION":`
45
45
  vec2 brushingTarget;
46
46
  vec2 brushingSource;
47
47
  if (brushing.target == 3) {
@@ -65,26 +65,20 @@ ${Wt}
65
65
  if (brushing.enabled && brushing_isVisible < 0.5) {
66
66
  discard;
67
67
  }
68
- `},Ie={name:"brushing",dependencies:[Ce.project],vs:Yt,fs:Kt,inject:Zt,getUniforms:o=>{if(!o||!("viewport"in o))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:r="source",mousePosition:s,viewport:i}=o;return{enabled:Boolean(e&&s&&i.containsPixel(s)),radius:t,target:$t[r]||0,mousePos:s?i.unproject([s.x-i.x,s.y-i.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var Xt={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},C=class extends ke.LayerExtension{getShaders(){return{modules:[Ie]}}initializeState(e,t){let r=this.getAttributeManager();r&&r.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let s=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=s,e.deck&&e.deck.eventManager.on({pointermove:s,pointerleave:s})}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:s}=e.context,{brushingEnabled:i,brushingRadius:n,brushingTarget:a}=this.props,l={viewport:r,mousePosition:s,brushingEnabled:i,brushingRadius:n,brushingTarget:a};this.setShaderModuleProps({brushing:l})}};C.defaultProps=Xt;C.extensionName="BrushingExtension";var Re=C;var E=d(_(),1);var we=`uniform dataFilterUniforms {
68
+ `},ke={name:"brushing",dependencies:[Ie.project],vs:Yt,fs:$t,inject:Xt,getUniforms:r=>{if(!r||!("viewport"in r))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:o="source",mousePosition:i,viewport:s}=r;return{enabled:Boolean(e&&i&&s.containsPixel(i)),radius:t,target:Zt[o]||0,mousePos:i?s.unproject([i.x-s.x,i.y-s.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var Qt={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},L=class extends Re.LayerExtension{getShaders(){return{modules:[ke]}}initializeState(e,t){let o=this.getAttributeManager();o&&o.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let i=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=i,e.deck&&e.deck.eventManager.on({pointermove:i,pointerleave:i})}finalizeState(e,t){if(e.deck){let o=this.state.onMouseMove;e.deck.eventManager.off({pointermove:o,pointerleave:o})}}draw(e,t){let{viewport:o,mousePosition:i}=e.context,{brushingEnabled:s,brushingRadius:n,brushingTarget:a}=this.props,l={viewport:o,mousePosition:i,brushingEnabled:s,brushingRadius:n,brushingTarget:a};this.setShaderModuleProps({brushing:l})}};L.defaultProps=Qt;L.extensionName="BrushingExtension";var Ne=L;var E=d(_(),1);var we=`layout(std140) uniform dataFilterUniforms {
69
69
  bool useSoftMargin;
70
70
  bool enabled;
71
71
  bool transformSize;
72
72
  bool transformColor;
73
- #ifdef DATAFILTER_TYPE
74
- DATAFILTER_TYPE min;
75
- DATAFILTER_TYPE softMin;
76
- DATAFILTER_TYPE softMax;
77
- DATAFILTER_TYPE max;
78
- #ifdef DATAFILTER_DOUBLE
79
- DATAFILTER_TYPE min64High;
80
- DATAFILTER_TYPE max64High;
81
- #endif
82
- #endif
83
- #ifdef DATACATEGORY_TYPE
73
+ vec4 min;
74
+ vec4 softMin;
75
+ vec4 softMax;
76
+ vec4 max;
77
+ vec4 min64High;
78
+ vec4 max64High;
84
79
  highp uvec4 categoryBitMask;
85
- #endif
86
80
  } dataFilter;
87
- `,Qt=`
81
+ `,Jt=`
88
82
  #ifdef DATAFILTER_TYPE
89
83
  in DATAFILTER_TYPE filterValues;
90
84
  #ifdef DATAFILTER_DOUBLE
@@ -98,6 +92,86 @@ ${Wt}
98
92
 
99
93
  out float dataFilter_value;
100
94
 
95
+ #ifdef DATAFILTER_TYPE
96
+ float dataFilter_getMin(float _) {
97
+ return dataFilter.min.x;
98
+ }
99
+ vec2 dataFilter_getMin(vec2 _) {
100
+ return dataFilter.min.xy;
101
+ }
102
+ vec3 dataFilter_getMin(vec3 _) {
103
+ return dataFilter.min.xyz;
104
+ }
105
+ vec4 dataFilter_getMin(vec4 _) {
106
+ return dataFilter.min;
107
+ }
108
+
109
+ float dataFilter_getSoftMin(float _) {
110
+ return dataFilter.softMin.x;
111
+ }
112
+ vec2 dataFilter_getSoftMin(vec2 _) {
113
+ return dataFilter.softMin.xy;
114
+ }
115
+ vec3 dataFilter_getSoftMin(vec3 _) {
116
+ return dataFilter.softMin.xyz;
117
+ }
118
+ vec4 dataFilter_getSoftMin(vec4 _) {
119
+ return dataFilter.softMin;
120
+ }
121
+
122
+ float dataFilter_getSoftMax(float _) {
123
+ return dataFilter.softMax.x;
124
+ }
125
+ vec2 dataFilter_getSoftMax(vec2 _) {
126
+ return dataFilter.softMax.xy;
127
+ }
128
+ vec3 dataFilter_getSoftMax(vec3 _) {
129
+ return dataFilter.softMax.xyz;
130
+ }
131
+ vec4 dataFilter_getSoftMax(vec4 _) {
132
+ return dataFilter.softMax;
133
+ }
134
+
135
+ float dataFilter_getMax(float _) {
136
+ return dataFilter.max.x;
137
+ }
138
+ vec2 dataFilter_getMax(vec2 _) {
139
+ return dataFilter.max.xy;
140
+ }
141
+ vec3 dataFilter_getMax(vec3 _) {
142
+ return dataFilter.max.xyz;
143
+ }
144
+ vec4 dataFilter_getMax(vec4 _) {
145
+ return dataFilter.max;
146
+ }
147
+
148
+ float dataFilter_getMin64High(float _) {
149
+ return dataFilter.min64High.x;
150
+ }
151
+ vec2 dataFilter_getMin64High(vec2 _) {
152
+ return dataFilter.min64High.xy;
153
+ }
154
+ vec3 dataFilter_getMin64High(vec3 _) {
155
+ return dataFilter.min64High.xyz;
156
+ }
157
+ vec4 dataFilter_getMin64High(vec4 _) {
158
+ return dataFilter.min64High;
159
+ }
160
+
161
+ float dataFilter_getMax64High(float _) {
162
+ return dataFilter.max64High.x;
163
+ }
164
+ vec2 dataFilter_getMax64High(vec2 _) {
165
+ return dataFilter.max64High.xy;
166
+ }
167
+ vec3 dataFilter_getMax64High(vec3 _) {
168
+ return dataFilter.max64High.xyz;
169
+ }
170
+ vec4 dataFilter_getMax64High(vec4 _) {
171
+ return dataFilter.max64High;
172
+ }
173
+ #endif
174
+
101
175
  float dataFilter_reduceValue(float value) {
102
176
  return value;
103
177
  }
@@ -113,23 +187,27 @@ float dataFilter_reduceValue(vec4 value) {
113
187
 
114
188
  #ifdef DATAFILTER_TYPE
115
189
  void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
190
+ DATAFILTER_TYPE dataFilter_min = dataFilter_getMin(valueFromMin);
191
+ DATAFILTER_TYPE dataFilter_softMin = dataFilter_getSoftMin(valueFromMin);
192
+ DATAFILTER_TYPE dataFilter_softMax = dataFilter_getSoftMax(valueFromMin);
193
+ DATAFILTER_TYPE dataFilter_max = dataFilter_getMax(valueFromMin);
116
194
  if (dataFilter.useSoftMargin) {
117
195
  // smoothstep results are undefined if edge0 \u2265 edge1
118
196
  // Fallback to ignore filterSoftRange if it is truncated by filterRange
119
197
  DATAFILTER_TYPE leftInRange = mix(
120
- smoothstep(dataFilter.min, dataFilter.softMin, valueFromMin),
121
- step(dataFilter.min, valueFromMin),
122
- step(dataFilter.softMin, dataFilter.min)
198
+ smoothstep(dataFilter_min, dataFilter_softMin, valueFromMin),
199
+ step(dataFilter_min, valueFromMin),
200
+ step(dataFilter_softMin, dataFilter_min)
123
201
  );
124
202
  DATAFILTER_TYPE rightInRange = mix(
125
- 1.0 - smoothstep(dataFilter.softMax, dataFilter.max, valueFromMax),
126
- step(valueFromMax, dataFilter.max),
127
- step(dataFilter.max, dataFilter.softMax)
203
+ 1.0 - smoothstep(dataFilter_softMax, dataFilter_max, valueFromMax),
204
+ step(valueFromMax, dataFilter_max),
205
+ step(dataFilter_max, dataFilter_softMax)
128
206
  );
129
207
  dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
130
208
  } else {
131
209
  dataFilter_value = dataFilter_reduceValue(
132
- step(dataFilter.min, valueFromMin) * step(valueFromMax, dataFilter.max)
210
+ step(dataFilter_min, valueFromMin) * step(valueFromMax, dataFilter_max)
133
211
  );
134
212
  }
135
213
  }
@@ -155,28 +233,28 @@ float dataFilter_reduceValue(vec4 value) {
155
233
  dataFilter_bits &= 1u;
156
234
 
157
235
  #if DATACATEGORY_CHANNELS == 1
158
- if(dataFilter_bits == 0u) dataFilter_value = 0.0;
236
+ if (dataFilter_bits == 0u) dataFilter_value = 0.0;
159
237
  #else
160
- if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0u)))) dataFilter_value = 0.0;
238
+ if (any(equal(dataFilter_bits, DATACATEGORY_TYPE(0u)))) dataFilter_value = 0.0;
161
239
  #endif
162
240
  }
163
241
  #endif
164
- `,Ne=`
165
- ${we}
166
- ${Qt}
167
- `,Jt=`
168
- in float dataFilter_value;
169
242
  `,Be=`
170
243
  ${we}
171
244
  ${Jt}
172
- `;function De(o){if(!o||!("extensions"in o))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:r=!0,filterTransformColor:s=!0,categoryBitMask:i}=o,n=o.filterSoftRange||e;return{...Number.isFinite(e[0])?{min:e[0],softMin:n[0],softMax:n[1],max:e[1]}:{min:e.map(a=>a[0]),softMin:n.map(a=>a[0]),softMax:n.map(a=>a[1]),max:e.map(a=>a[1])},enabled:t,useSoftMargin:Boolean(o.filterSoftRange),transformSize:t&&r,transformColor:t&&s,...i&&{categoryBitMask:i}}}function eo(o){if(!o||!("extensions"in o))return{};let e=De(o);if(Number.isFinite(e.min)){let t=Math.fround(e.min);e.min-=t,e.softMin-=t,e.min64High=t;let r=Math.fround(e.max);e.max-=r,e.softMax-=r,e.max64High=r}else{let t=e.min.map(Math.fround);e.min=e.min.map((s,i)=>s-t[i]),e.softMin=e.softMin.map((s,i)=>s-t[i]),e.min64High=t;let r=e.max.map(Math.fround);e.max=e.max.map((s,i)=>s-r[i]),e.softMax=e.softMax.map((s,i)=>s-r[i]),e.max64High=r}return e}var je={"vs:#main-start":`
245
+ `,er=`
246
+ in float dataFilter_value;
247
+ `,De=`
248
+ ${we}
249
+ ${er}
250
+ `;function ze(r){if(!r||!("extensions"in r))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:o=!0,filterTransformColor:i=!0,categoryBitMask:s}=r,n=r.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(r.filterSoftRange),transformSize:t&&o,transformColor:t&&i,...s&&{categoryBitMask:s}}}function tr(r){if(!r||!("extensions"in r))return{};let e=ze(r),t=e.min.map(Math.fround);e.min=e.min.map((i,s)=>i-t[s]),e.softMin=e.softMin.map((i,s)=>i-t[s]),e.min64High=t;let o=e.max.map(Math.fround);return e.max=e.max.map((i,s)=>i-o[s]),e.softMax=e.softMax.map((i,s)=>i-o[s]),e.max64High=o,e}var Ve={"vs:#main-start":`
173
251
  dataFilter_value = 1.0;
174
252
  if (dataFilter.enabled) {
175
253
  #ifdef DATAFILTER_TYPE
176
254
  #ifdef DATAFILTER_DOUBLE
177
255
  dataFilter_setValue(
178
- filterValues - dataFilter.min64High + filterValues64Low,
179
- filterValues - dataFilter.max64High + filterValues64Low
256
+ filterValues - dataFilter_getMin64High(filterValues) + filterValues64Low,
257
+ filterValues - dataFilter_getMax64High(filterValues) + filterValues64Low
180
258
  );
181
259
  #else
182
260
  dataFilter_setValue(filterValues, filterValues);
@@ -200,7 +278,7 @@ ${Jt}
200
278
  if (dataFilter.transformColor) {
201
279
  color.a *= dataFilter_value;
202
280
  }
203
- `};function Ve(o){let{categorySize:e,filterSize:t,fp64:r}=o,s={useSoftMargin:"i32",enabled:"i32",transformSize:"i32",transformColor:"i32"};if(t){let i=t===1?"f32":`vec${t}<f32>`;s.min=i,s.softMin=i,s.softMax=i,s.max=i,r&&(s.min64High=i,s.max64High=i)}return e&&(s.categoryBitMask="vec4<i32>"),s}var ze={name:"dataFilter",vs:Ne,fs:Be,inject:je,getUniforms:De,uniformTypesFromOptions:Ve},Ue={name:"dataFilter",vs:Ne,fs:Be,inject:je,getUniforms:eo,uniformTypesFromOptions:Ve};var qe=d(He(),1),to=`#version 300 es
281
+ `};function je(r){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 Ue={name:"dataFilter",vs:Be,fs:De,inject:Ve,getUniforms:ze,uniformTypesFromOptions:je},Ge={name:"dataFilter",vs:Be,fs:De,inject:Ve,getUniforms:tr,uniformTypesFromOptions:je};var We=d(qe(),1),rr=`#version 300 es
204
282
  #define SHADER_NAME data-filter-vertex-shader
205
283
 
206
284
  #ifdef FLOAT_TARGET
@@ -231,7 +309,7 @@ void main() {
231
309
  #endif
232
310
  gl_PointSize = 1.0;
233
311
  }
234
- `,oo=`#version 300 es
312
+ `,or=`#version 300 es
235
313
  #define SHADER_NAME data-filter-fragment-shader
236
314
  precision highp float;
237
315
 
@@ -245,9 +323,10 @@ void main() {
245
323
  }
246
324
  fragColor = vColor;
247
325
  }
248
- `,ro=["float32-renderable-webgl","texture-blend-float-webgl"];function Ye(o){return ro.every(e=>o.features.has(e))}function We(o,e){return e?o.createFramebuffer({width:1,height:1,colorAttachments:[o.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):o.createFramebuffer({width:256,height:64,colorAttachments:[o.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function Ke(o,e,t,r){return t.defines.NON_INSTANCED_MODEL=1,r&&(t.defines.FLOAT_TARGET=1),new qe.Model(o,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:to,fs:oo,bufferLayout:e,...t})}var $e={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var io={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},no={categorySize:0,filterSize:1,fp64:!1,countItems:!1},ao={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},lo={1:"float",2:"vec2",3:"vec3",4:"vec4"},S=class extends E.LayerExtension{constructor(e={}){super({...no,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:s}=e.opts,i={};t&&(i.DATACATEGORY_TYPE=ao[t],i.DATACATEGORY_CHANNELS=t),r&&(i.DATAFILTER_TYPE=lo[r],i.DATAFILTER_DOUBLE=Boolean(s));let n=s?Ue:ze;return n.uniformTypes=n.uniformTypesFromOptions(e.opts),{modules:[n],defines:i}}initializeState(e,t){let r=this.getAttributeManager(),{categorySize:s,filterSize:i,fp64:n}=t.opts;r&&(i&&r.add({filterValues:{size:i,type:n?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),s&&r.add({filterCategoryValues:{size:s,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:s===1?l=>t._getCategoryKey.call(this,l,0):l=>l.map((c,f)=>t._getCategoryKey.call(this,c,f))}}));let{device:a}=this.context;if(r&&t.opts.countItems){let l=Ye(a);r.add({filterVertexIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:p})=>{let m=u&&u.__source?u.__source.index:p;return l?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let c=We(a,l),f=Ke(a,r.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),l);this.setState({filterFBO:c,filterModel:f})}}updateState({props:e,oldProps:t,changeFlags:r},s){let i=this.getAttributeManager(),{categorySize:n}=s.opts;if(this.state.filterModel){let a=i.attributes.filterValues?.needsUpdate()||i.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}i?.attributes.filterCategoryValues&&((i.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(()=>({}))}),i.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let r=this.state.filterFBO,s=this.state.filterModel,i=this.state.filterNeedsUpdate;this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t);let{onFilteredItemsChange:n,extensions:a,filterEnabled:l,filterRange:c,filterSoftRange:f,filterTransformSize:u,filterTransformColor:p,filterCategories:m}=this.props,v={extensions:a,filterEnabled:l,filterRange:c,filterSoftRange:f,filterTransformSize:u,filterTransformColor:p,filterCategories:m};if(this.state.categoryBitMask&&(v.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:v}),i&&n&&s){let b=this.getAttributeManager(),{attributes:{filterValues:h,filterCategoryValues:L,filterVertexIndices:fe}}=b;s.setVertexCount(this.getNumInstances());let ue={...h?.getValue(),...L?.getValue(),...fe?.getValue()};s.setAttributes(ue),s.shaderInputs.setProps({dataFilter:v});let pe=[0,0,r.width,r.height],Ee=s.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:pe},clearColor:[0,0,0,0]});s.setParameters($e),s.draw(Ee),Ee.end();let Me=s.device.readPixelsToArrayWebGL(r),Fe=0;for(let de=0;de<Me.length;de++)Fe+=Me[de];n({id:this.id,count:Fe}),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:s}=this.props,i=new Uint32Array([0,0,0,0]),n=r===1?[s]:s,a=r===1?128:r===2?64:32;for(let l=0;l<n.length;l++){let c=n[l];for(let f of c){let u=t._getCategoryKey.call(this,f,l);if(u<a){let p=l*(a/32)+Math.floor(u/32);i[p]+=Math.pow(2,u%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=i}_getCategoryKey(e,t){let r=this.state.categoryMap[t];return e in r||(r[e]=Object.keys(r).length),r[e]}};S.defaultProps=io;S.extensionName="DataFilterExtension";var Ze=S;var w=d(_(),1);var Wr=1/Math.PI*180,Kr=1/180*Math.PI,co={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...co}};var I=globalThis.mathgl.config;function _e(o){return Array.isArray(o)||ArrayBuffer.isView(o)&&!(o instanceof DataView)}function M(o,e,t){let r=I.EPSILON;t&&(I.EPSILON=t);try{if(o===e)return!0;if(_e(o)&&_e(e)){if(o.length!==e.length)return!1;for(let s=0;s<o.length;++s)if(!M(o[s],e[s]))return!1;return!0}return o&&o.equals?o.equals(e):e&&e.equals?e.equals(o):typeof o=="number"&&typeof e=="number"?Math.abs(o-e)<=I.EPSILON*Math.max(1,Math.abs(o),Math.abs(e)):!1}finally{I.EPSILON=r}}var k=typeof Float32Array<"u"?Float32Array:Array,me=Math.random;function J(o){return o>=0?Math.round(o):o%.5===0?Math.floor(o):Math.round(o)}var Zr=Math.PI/180;var R={};Ae(R,{add:()=>ho,angle:()=>jo,bezier:()=>So,ceil:()=>vo,clone:()=>uo,copy:()=>_o,create:()=>Xe,cross:()=>Ao,dist:()=>Wo,distance:()=>ot,div:()=>Yo,divide:()=>tt,dot:()=>ve,equals:()=>Go,exactEquals:()=>Uo,floor:()=>go,forEach:()=>Xo,fromValues:()=>po,hermite:()=>Co,inverse:()=>Fo,len:()=>$o,length:()=>Qe,lerp:()=>Oo,max:()=>Po,min:()=>xo,mul:()=>qo,multiply:()=>et,negate:()=>Mo,normalize:()=>To,random:()=>Io,rotateX:()=>No,rotateY:()=>Bo,rotateZ:()=>Do,round:()=>yo,scale:()=>bo,scaleAndAdd:()=>Eo,set:()=>mo,slerp:()=>Lo,sqrDist:()=>Ko,sqrLen:()=>Zo,squaredDistance:()=>rt,squaredLength:()=>st,str:()=>zo,sub:()=>Ho,subtract:()=>Je,transformMat3:()=>Ro,transformMat4:()=>ko,transformQuat:()=>wo,zero:()=>Vo});function Xe(){let o=new k(3);return k!=Float32Array&&(o[0]=0,o[1]=0,o[2]=0),o}function uo(o){let e=new k(3);return e[0]=o[0],e[1]=o[1],e[2]=o[2],e}function Qe(o){let e=o[0],t=o[1],r=o[2];return Math.sqrt(e*e+t*t+r*r)}function po(o,e,t){let r=new k(3);return r[0]=o,r[1]=e,r[2]=t,r}function _o(o,e){return o[0]=e[0],o[1]=e[1],o[2]=e[2],o}function mo(o,e,t,r){return o[0]=e,o[1]=t,o[2]=r,o}function ho(o,e,t){return o[0]=e[0]+t[0],o[1]=e[1]+t[1],o[2]=e[2]+t[2],o}function Je(o,e,t){return o[0]=e[0]-t[0],o[1]=e[1]-t[1],o[2]=e[2]-t[2],o}function et(o,e,t){return o[0]=e[0]*t[0],o[1]=e[1]*t[1],o[2]=e[2]*t[2],o}function tt(o,e,t){return o[0]=e[0]/t[0],o[1]=e[1]/t[1],o[2]=e[2]/t[2],o}function vo(o,e){return o[0]=Math.ceil(e[0]),o[1]=Math.ceil(e[1]),o[2]=Math.ceil(e[2]),o}function go(o,e){return o[0]=Math.floor(e[0]),o[1]=Math.floor(e[1]),o[2]=Math.floor(e[2]),o}function xo(o,e,t){return o[0]=Math.min(e[0],t[0]),o[1]=Math.min(e[1],t[1]),o[2]=Math.min(e[2],t[2]),o}function Po(o,e,t){return o[0]=Math.max(e[0],t[0]),o[1]=Math.max(e[1],t[1]),o[2]=Math.max(e[2],t[2]),o}function yo(o,e){return o[0]=J(e[0]),o[1]=J(e[1]),o[2]=J(e[2]),o}function bo(o,e,t){return o[0]=e[0]*t,o[1]=e[1]*t,o[2]=e[2]*t,o}function Eo(o,e,t,r){return o[0]=e[0]+t[0]*r,o[1]=e[1]+t[1]*r,o[2]=e[2]+t[2]*r,o}function ot(o,e){let t=e[0]-o[0],r=e[1]-o[1],s=e[2]-o[2];return Math.sqrt(t*t+r*r+s*s)}function rt(o,e){let t=e[0]-o[0],r=e[1]-o[1],s=e[2]-o[2];return t*t+r*r+s*s}function st(o){let e=o[0],t=o[1],r=o[2];return e*e+t*t+r*r}function Mo(o,e){return o[0]=-e[0],o[1]=-e[1],o[2]=-e[2],o}function Fo(o,e){return o[0]=1/e[0],o[1]=1/e[1],o[2]=1/e[2],o}function To(o,e){let t=e[0],r=e[1],s=e[2],i=t*t+r*r+s*s;return i>0&&(i=1/Math.sqrt(i)),o[0]=e[0]*i,o[1]=e[1]*i,o[2]=e[2]*i,o}function ve(o,e){return o[0]*e[0]+o[1]*e[1]+o[2]*e[2]}function Ao(o,e,t){let r=e[0],s=e[1],i=e[2],n=t[0],a=t[1],l=t[2];return o[0]=s*l-i*a,o[1]=i*n-r*l,o[2]=r*a-s*n,o}function Oo(o,e,t,r){let s=e[0],i=e[1],n=e[2];return o[0]=s+r*(t[0]-s),o[1]=i+r*(t[1]-i),o[2]=n+r*(t[2]-n),o}function Lo(o,e,t,r){let s=Math.acos(Math.min(Math.max(ve(e,t),-1),1)),i=Math.sin(s),n=Math.sin((1-r)*s)/i,a=Math.sin(r*s)/i;return o[0]=n*e[0]+a*t[0],o[1]=n*e[1]+a*t[1],o[2]=n*e[2]+a*t[2],o}function Co(o,e,t,r,s,i){let n=i*i,a=n*(2*i-3)+1,l=n*(i-2)+i,c=n*(i-1),f=n*(3-2*i);return o[0]=e[0]*a+t[0]*l+r[0]*c+s[0]*f,o[1]=e[1]*a+t[1]*l+r[1]*c+s[1]*f,o[2]=e[2]*a+t[2]*l+r[2]*c+s[2]*f,o}function So(o,e,t,r,s,i){let n=1-i,a=n*n,l=i*i,c=a*n,f=3*i*a,u=3*l*n,p=l*i;return o[0]=e[0]*c+t[0]*f+r[0]*u+s[0]*p,o[1]=e[1]*c+t[1]*f+r[1]*u+s[1]*p,o[2]=e[2]*c+t[2]*f+r[2]*u+s[2]*p,o}function Io(o,e){e=e===void 0?1:e;let t=me()*2*Math.PI,r=me()*2-1,s=Math.sqrt(1-r*r)*e;return o[0]=Math.cos(t)*s,o[1]=Math.sin(t)*s,o[2]=r*e,o}function ko(o,e,t){let r=e[0],s=e[1],i=e[2],n=t[3]*r+t[7]*s+t[11]*i+t[15];return n=n||1,o[0]=(t[0]*r+t[4]*s+t[8]*i+t[12])/n,o[1]=(t[1]*r+t[5]*s+t[9]*i+t[13])/n,o[2]=(t[2]*r+t[6]*s+t[10]*i+t[14])/n,o}function Ro(o,e,t){let r=e[0],s=e[1],i=e[2];return o[0]=r*t[0]+s*t[3]+i*t[6],o[1]=r*t[1]+s*t[4]+i*t[7],o[2]=r*t[2]+s*t[5]+i*t[8],o}function wo(o,e,t){let r=t[0],s=t[1],i=t[2],n=t[3],a=e[0],l=e[1],c=e[2],f=s*c-i*l,u=i*a-r*c,p=r*l-s*a,m=s*p-i*u,v=i*f-r*p,b=r*u-s*f,h=n*2;return f*=h,u*=h,p*=h,m*=2,v*=2,b*=2,o[0]=a+f+m,o[1]=l+u+v,o[2]=c+p+b,o}function No(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[0],i[1]=s[1]*Math.cos(r)-s[2]*Math.sin(r),i[2]=s[1]*Math.sin(r)+s[2]*Math.cos(r),o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function Bo(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[2]*Math.sin(r)+s[0]*Math.cos(r),i[1]=s[1],i[2]=s[2]*Math.cos(r)-s[0]*Math.sin(r),o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function Do(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[0]*Math.cos(r)-s[1]*Math.sin(r),i[1]=s[0]*Math.sin(r)+s[1]*Math.cos(r),i[2]=s[2],o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function jo(o,e){let t=o[0],r=o[1],s=o[2],i=e[0],n=e[1],a=e[2],l=Math.sqrt((t*t+r*r+s*s)*(i*i+n*n+a*a)),c=l&&ve(o,e)/l;return Math.acos(Math.min(Math.max(c,-1),1))}function Vo(o){return o[0]=0,o[1]=0,o[2]=0,o}function zo(o){return`vec3(${o[0]}, ${o[1]}, ${o[2]})`}function Uo(o,e){return o[0]===e[0]&&o[1]===e[1]&&o[2]===e[2]}function Go(o,e){let t=o[0],r=o[1],s=o[2],i=e[0],n=e[1],a=e[2];return Math.abs(t-i)<=1e-6*Math.max(1,Math.abs(t),Math.abs(i))&&Math.abs(r-n)<=1e-6*Math.max(1,Math.abs(r),Math.abs(n))&&Math.abs(s-a)<=1e-6*Math.max(1,Math.abs(s),Math.abs(a))}var Ho=Je,qo=et,Yo=tt,Wo=ot,Ko=rt,$o=Qe,Zo=st,Xo=function(){let o=Xe();return function(e,t,r,s,i,n){let a,l;for(t||(t=3),r||(r=0),s?l=Math.min(s*t+r,e.length):l=e.length,a=r;a<l;a+=t)o[0]=e[a],o[1]=e[a+1],o[2]=e[a+2],i(o,o,n),e[a]=o[0],e[a+1]=o[1],e[a+2]=o[2];return e}}();function ee(o,e=[],t=0){let r=Math.fround(o),s=o-r;return e[t]=r,e[t+1]=s,e}function ge(o){return o-Math.fround(o)}function xe(o){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let r=0;r<4;++r){let s=t*4+r;ee(o[r*4+t],e,s*2)}return e}var it=`
249
- uniform fp64arithmeticUniforms {
326
+ `,ir=["float32-renderable-webgl","texture-blend-float-webgl"];function Ye(r){return ir.every(e=>r.features.has(e))}function Ke(r,e){return e?r.createFramebuffer({width:1,height:1,colorAttachments:[r.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):r.createFramebuffer({width:256,height:64,colorAttachments:[r.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function $e(r,e,t,o){return t.defines.NON_INSTANCED_MODEL=1,o&&(t.defines.FLOAT_TARGET=1),new We.Model(r,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:rr,fs:or,bufferLayout:e,...t})}var Ze={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var nr={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},ar={categorySize:0,filterSize:1,fp64:!1,countItems:!1},lr={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},fr={1:"float",2:"vec2",3:"vec3",4:"vec4"},I=class extends E.LayerExtension{constructor(e={}){super({...ar,...e})}getShaders(e){let{categorySize:t,filterSize:o,fp64:i}=e.opts,s={};t&&(s.DATACATEGORY_TYPE=lr[t],s.DATACATEGORY_CHANNELS=t),o&&(s.DATAFILTER_TYPE=fr[o],s.DATAFILTER_DOUBLE=Boolean(i));let n=i?Ge:Ue;return n.uniformTypes=n.uniformTypesFromOptions(e.opts),{modules:[n],defines:s}}initializeState(e,t){let o=this.getAttributeManager(),{categorySize:i,filterSize:s,fp64:n}=t.opts;o&&(s&&o.add({filterValues:{size:s,type:n?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),i&&o.add({filterCategoryValues:{size:i,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:i===1?l=>t._getCategoryKey.call(this,l,0):l=>l.map((f,c)=>t._getCategoryKey.call(this,f,c))}}));let{device:a}=this.context;if(o&&t.opts.countItems){let l=Ye(a);o.add({filterVertexIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(p,{index:u})=>{let m=p&&p.__source?p.__source.index:u;return l?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let f=Ke(a,l),c=$e(a,o.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),l);this.setState({filterFBO:f,filterModel:c})}}updateState({props:e,oldProps:t,changeFlags:o},i){let s=this.getAttributeManager(),{categorySize:n}=i.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}),o.dataChanged&&(this.setState({categoryMap:Array(n).fill(0).map(()=>({}))}),s.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let o=this.state.filterFBO,i=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:c,filterTransformSize:p,filterTransformColor:u,filterCategories:m}=this.props,v={extensions:a,filterEnabled:l,filterRange:f,filterSoftRange:c,filterTransformSize:p,filterTransformColor:u,filterCategories:m};if(this.state.categoryBitMask&&(v.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:v}),s&&n&&i){let b=this.getAttributeManager(),{attributes:{filterValues:h,filterCategoryValues:S,filterVertexIndices:ce}}=b;i.setVertexCount(this.getNumInstances());let pe={...h?.getValue(),...S?.getValue(),...ce?.getValue()};i.setAttributes(pe),i.shaderInputs.setProps({dataFilter:v});let ue=[0,0,o.width,o.height],Me=i.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:o,parameters:{viewport:ue},clearColor:[0,0,0,0]});i.setParameters(Ze),i.draw(Me),Me.end();let Fe=i.device.readPixelsToArrayWebGL(o),Oe=0;for(let de=0;de<Fe.length;de++)Oe+=Fe[de];n({id:this.id,count:Oe}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:o}=t.opts;if(!o)return;let{filterCategories:i}=this.props,s=new Uint32Array([0,0,0,0]),n=o===1?[i]:i,a=o===1?128:o===2?64:32;for(let l=0;l<n.length;l++){let f=n[l];for(let c of f){let p=t._getCategoryKey.call(this,c,l);if(p<a){let u=l*(a/32)+Math.floor(p/32);s[u]+=Math.pow(2,p%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=s}_getCategoryKey(e,t){let o=this.state.categoryMap[t];return e in o||(o[e]=Object.keys(o).length),o[e]}};I.defaultProps=nr;I.extensionName="DataFilterExtension";var Xe=I;var N=d(_(),1);var Ko=1/Math.PI*180,$o=1/180*Math.PI,cr={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...cr}};var C=globalThis.mathgl.config;function _e(r){return Array.isArray(r)||ArrayBuffer.isView(r)&&!(r instanceof DataView)}function M(r,e,t){let o=C.EPSILON;t&&(C.EPSILON=t);try{if(r===e)return!0;if(_e(r)&&_e(e)){if(r.length!==e.length)return!1;for(let i=0;i<r.length;++i)if(!M(r[i],e[i]))return!1;return!0}return r&&r.equals?r.equals(e):e&&e.equals?e.equals(r):typeof r=="number"&&typeof e=="number"?Math.abs(r-e)<=C.EPSILON*Math.max(1,Math.abs(r),Math.abs(e)):!1}finally{C.EPSILON=o}}var k=typeof Float32Array<"u"?Float32Array:Array,me=Math.random;function J(r){return r>=0?Math.round(r):r%.5===0?Math.floor(r):Math.round(r)}var Xo=Math.PI/180;var R={};Te(R,{add:()=>hr,angle:()=>zr,bezier:()=>Ir,ceil:()=>vr,clone:()=>ur,copy:()=>_r,create:()=>Qe,cross:()=>Ar,dist:()=>Yr,distance:()=>ot,div:()=>Wr,divide:()=>rt,dot:()=>ve,equals:()=>Gr,exactEquals:()=>Ur,floor:()=>gr,forEach:()=>Xr,fromValues:()=>dr,hermite:()=>Lr,inverse:()=>Fr,len:()=>$r,length:()=>Je,lerp:()=>Tr,max:()=>yr,min:()=>xr,mul:()=>qr,multiply:()=>tt,negate:()=>Mr,normalize:()=>Or,random:()=>Cr,rotateX:()=>wr,rotateY:()=>Br,rotateZ:()=>Dr,round:()=>Pr,scale:()=>br,scaleAndAdd:()=>Er,set:()=>mr,slerp:()=>Sr,sqrDist:()=>Kr,sqrLen:()=>Zr,squaredDistance:()=>it,squaredLength:()=>st,str:()=>jr,sub:()=>Hr,subtract:()=>et,transformMat3:()=>Rr,transformMat4:()=>kr,transformQuat:()=>Nr,zero:()=>Vr});function Qe(){let r=new k(3);return k!=Float32Array&&(r[0]=0,r[1]=0,r[2]=0),r}function ur(r){let e=new k(3);return e[0]=r[0],e[1]=r[1],e[2]=r[2],e}function Je(r){let e=r[0],t=r[1],o=r[2];return Math.sqrt(e*e+t*t+o*o)}function dr(r,e,t){let o=new k(3);return o[0]=r,o[1]=e,o[2]=t,o}function _r(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r}function mr(r,e,t,o){return r[0]=e,r[1]=t,r[2]=o,r}function hr(r,e,t){return r[0]=e[0]+t[0],r[1]=e[1]+t[1],r[2]=e[2]+t[2],r}function et(r,e,t){return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],r}function tt(r,e,t){return r[0]=e[0]*t[0],r[1]=e[1]*t[1],r[2]=e[2]*t[2],r}function rt(r,e,t){return r[0]=e[0]/t[0],r[1]=e[1]/t[1],r[2]=e[2]/t[2],r}function vr(r,e){return r[0]=Math.ceil(e[0]),r[1]=Math.ceil(e[1]),r[2]=Math.ceil(e[2]),r}function gr(r,e){return r[0]=Math.floor(e[0]),r[1]=Math.floor(e[1]),r[2]=Math.floor(e[2]),r}function xr(r,e,t){return r[0]=Math.min(e[0],t[0]),r[1]=Math.min(e[1],t[1]),r[2]=Math.min(e[2],t[2]),r}function yr(r,e,t){return r[0]=Math.max(e[0],t[0]),r[1]=Math.max(e[1],t[1]),r[2]=Math.max(e[2],t[2]),r}function Pr(r,e){return r[0]=J(e[0]),r[1]=J(e[1]),r[2]=J(e[2]),r}function br(r,e,t){return r[0]=e[0]*t,r[1]=e[1]*t,r[2]=e[2]*t,r}function Er(r,e,t,o){return r[0]=e[0]+t[0]*o,r[1]=e[1]+t[1]*o,r[2]=e[2]+t[2]*o,r}function ot(r,e){let t=e[0]-r[0],o=e[1]-r[1],i=e[2]-r[2];return Math.sqrt(t*t+o*o+i*i)}function it(r,e){let t=e[0]-r[0],o=e[1]-r[1],i=e[2]-r[2];return t*t+o*o+i*i}function st(r){let e=r[0],t=r[1],o=r[2];return e*e+t*t+o*o}function Mr(r,e){return r[0]=-e[0],r[1]=-e[1],r[2]=-e[2],r}function Fr(r,e){return r[0]=1/e[0],r[1]=1/e[1],r[2]=1/e[2],r}function Or(r,e){let t=e[0],o=e[1],i=e[2],s=t*t+o*o+i*i;return s>0&&(s=1/Math.sqrt(s)),r[0]=e[0]*s,r[1]=e[1]*s,r[2]=e[2]*s,r}function ve(r,e){return r[0]*e[0]+r[1]*e[1]+r[2]*e[2]}function Ar(r,e,t){let o=e[0],i=e[1],s=e[2],n=t[0],a=t[1],l=t[2];return r[0]=i*l-s*a,r[1]=s*n-o*l,r[2]=o*a-i*n,r}function Tr(r,e,t,o){let i=e[0],s=e[1],n=e[2];return r[0]=i+o*(t[0]-i),r[1]=s+o*(t[1]-s),r[2]=n+o*(t[2]-n),r}function Sr(r,e,t,o){let i=Math.acos(Math.min(Math.max(ve(e,t),-1),1)),s=Math.sin(i),n=Math.sin((1-o)*i)/s,a=Math.sin(o*i)/s;return r[0]=n*e[0]+a*t[0],r[1]=n*e[1]+a*t[1],r[2]=n*e[2]+a*t[2],r}function Lr(r,e,t,o,i,s){let n=s*s,a=n*(2*s-3)+1,l=n*(s-2)+s,f=n*(s-1),c=n*(3-2*s);return r[0]=e[0]*a+t[0]*l+o[0]*f+i[0]*c,r[1]=e[1]*a+t[1]*l+o[1]*f+i[1]*c,r[2]=e[2]*a+t[2]*l+o[2]*f+i[2]*c,r}function Ir(r,e,t,o,i,s){let n=1-s,a=n*n,l=s*s,f=a*n,c=3*s*a,p=3*l*n,u=l*s;return r[0]=e[0]*f+t[0]*c+o[0]*p+i[0]*u,r[1]=e[1]*f+t[1]*c+o[1]*p+i[1]*u,r[2]=e[2]*f+t[2]*c+o[2]*p+i[2]*u,r}function Cr(r,e){e=e===void 0?1:e;let t=me()*2*Math.PI,o=me()*2-1,i=Math.sqrt(1-o*o)*e;return r[0]=Math.cos(t)*i,r[1]=Math.sin(t)*i,r[2]=o*e,r}function kr(r,e,t){let o=e[0],i=e[1],s=e[2],n=t[3]*o+t[7]*i+t[11]*s+t[15];return n=n||1,r[0]=(t[0]*o+t[4]*i+t[8]*s+t[12])/n,r[1]=(t[1]*o+t[5]*i+t[9]*s+t[13])/n,r[2]=(t[2]*o+t[6]*i+t[10]*s+t[14])/n,r}function Rr(r,e,t){let o=e[0],i=e[1],s=e[2];return r[0]=o*t[0]+i*t[3]+s*t[6],r[1]=o*t[1]+i*t[4]+s*t[7],r[2]=o*t[2]+i*t[5]+s*t[8],r}function Nr(r,e,t){let o=t[0],i=t[1],s=t[2],n=t[3],a=e[0],l=e[1],f=e[2],c=i*f-s*l,p=s*a-o*f,u=o*l-i*a,m=i*u-s*p,v=s*c-o*u,b=o*p-i*c,h=n*2;return c*=h,p*=h,u*=h,m*=2,v*=2,b*=2,r[0]=a+c+m,r[1]=l+p+v,r[2]=f+u+b,r}function wr(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[0],s[1]=i[1]*Math.cos(o)-i[2]*Math.sin(o),s[2]=i[1]*Math.sin(o)+i[2]*Math.cos(o),r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function Br(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[2]*Math.sin(o)+i[0]*Math.cos(o),s[1]=i[1],s[2]=i[2]*Math.cos(o)-i[0]*Math.sin(o),r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function Dr(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[0]*Math.cos(o)-i[1]*Math.sin(o),s[1]=i[0]*Math.sin(o)+i[1]*Math.cos(o),s[2]=i[2],r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function zr(r,e){let t=r[0],o=r[1],i=r[2],s=e[0],n=e[1],a=e[2],l=Math.sqrt((t*t+o*o+i*i)*(s*s+n*n+a*a)),f=l&&ve(r,e)/l;return Math.acos(Math.min(Math.max(f,-1),1))}function Vr(r){return r[0]=0,r[1]=0,r[2]=0,r}function jr(r){return`vec3(${r[0]}, ${r[1]}, ${r[2]})`}function Ur(r,e){return r[0]===e[0]&&r[1]===e[1]&&r[2]===e[2]}function Gr(r,e){let t=r[0],o=r[1],i=r[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(o-n)<=1e-6*Math.max(1,Math.abs(o),Math.abs(n))&&Math.abs(i-a)<=1e-6*Math.max(1,Math.abs(i),Math.abs(a))}var Hr=et,qr=tt,Wr=rt,Yr=ot,Kr=it,$r=Je,Zr=st,Xr=function(){let r=Qe();return function(e,t,o,i,s,n){let a,l;for(t||(t=3),o||(o=0),i?l=Math.min(i*t+o,e.length):l=e.length,a=o;a<l;a+=t)r[0]=e[a],r[1]=e[a+1],r[2]=e[a+2],s(r,r,n),e[a]=r[0],e[a+1]=r[1],e[a+2]=r[2];return e}}();function ee(r,e=[],t=0){let o=Math.fround(r),i=r-o;return e[t]=o,e[t+1]=i,e}function ge(r){return r-Math.fround(r)}function xe(r){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let o=0;o<4;++o){let i=t*4+o;ee(r[o*4+t],e,i*2)}return e}var ye=`
327
+ layout(std140) uniform fp64arithmeticUniforms {
250
328
  uniform float ONE;
329
+ uniform float SPLIT;
251
330
  } fp64;
252
331
 
253
332
  /*
@@ -257,6 +336,12 @@ The purpose of this workaround is to prevent shader compilers from
257
336
  optimizing away necessary arithmetic operations by swapping their sequences
258
337
  or transform the equation to some 'equivalent' form.
259
338
 
339
+ These helpers implement Dekker/Veltkamp-style error tracking. If the compiler
340
+ folds constants or reassociates the arithmetic, the high/low split can stop
341
+ tracking the rounding error correctly. That failure mode tends to look fine in
342
+ simple coordinate setup, but then breaks down inside iterative arithmetic such
343
+ as fp64 Mandelbrot loops.
344
+
260
345
  The method is to multiply an artifical variable, ONE, which will be known to
261
346
  the compiler to be 1 only at runtime. The whole expression is then represented
262
347
  as a polynomial with respective to ONE. In the coefficients of all terms, only one a
@@ -265,17 +350,23 @@ and one b should appear
265
350
  err = (a + b) * ONE^6 - a * ONE^5 - (a + b) * ONE^4 + a * ONE^3 - b - (a + b) * ONE^2 + a * ONE
266
351
  */
267
352
 
268
- // Divide float number to high and low floats to extend fraction bits
269
- vec2 split(float a) {
270
- const float SPLIT = 4097.0;
271
- float t = a * SPLIT;
353
+ float prevent_fp64_optimization(float value) {
272
354
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
273
- float a_hi = t * fp64.ONE - (t - a);
274
- float a_lo = a * fp64.ONE - a_hi;
355
+ return value + fp64.ONE * 0.0;
275
356
  #else
276
- float a_hi = t - (t - a);
277
- float a_lo = a - a_hi;
357
+ return value;
278
358
  #endif
359
+ }
360
+
361
+ // Divide float number to high and low floats to extend fraction bits
362
+ vec2 split(float a) {
363
+ // Keep SPLIT as a runtime uniform so the compiler cannot fold the Dekker
364
+ // split into a constant expression and reassociate the recovery steps.
365
+ float split = prevent_fp64_optimization(fp64.SPLIT);
366
+ float t = prevent_fp64_optimization(a * split);
367
+ float temp = t - a;
368
+ float a_hi = t - temp;
369
+ float a_lo = a - a_hi;
279
370
  return vec2(a_hi, a_lo);
280
371
  }
281
372
 
@@ -339,8 +430,26 @@ vec2 twoProd(float a, float b) {
339
430
  float prod = a * b;
340
431
  vec2 a_fp64 = split(a);
341
432
  vec2 b_fp64 = split(b);
342
- float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +
343
- a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;
433
+ // twoProd is especially sensitive because mul_fp64 and div_fp64 both depend
434
+ // on the split terms and cross terms staying in the original evaluation
435
+ // order. If the compiler folds or reassociates them, the low part tends to
436
+ // collapse to zero or NaN on some drivers.
437
+ float highProduct = prevent_fp64_optimization(a_fp64.x * b_fp64.x);
438
+ float crossProduct1 = prevent_fp64_optimization(a_fp64.x * b_fp64.y);
439
+ float crossProduct2 = prevent_fp64_optimization(a_fp64.y * b_fp64.x);
440
+ float lowProduct = prevent_fp64_optimization(a_fp64.y * b_fp64.y);
441
+ #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
442
+ float err1 = (highProduct - prod) * fp64.ONE;
443
+ float err2 = crossProduct1 * fp64.ONE * fp64.ONE;
444
+ float err3 = crossProduct2 * fp64.ONE * fp64.ONE * fp64.ONE;
445
+ float err4 = lowProduct * fp64.ONE * fp64.ONE * fp64.ONE * fp64.ONE;
446
+ #else
447
+ float err1 = highProduct - prod;
448
+ float err2 = crossProduct1;
449
+ float err3 = crossProduct2;
450
+ float err4 = lowProduct;
451
+ #endif
452
+ float err = ((err1 + err2) + err3) + err4;
344
453
  return vec2(prod, err);
345
454
  }
346
455
 
@@ -413,7 +522,213 @@ vec2 sqrt_fp64(vec2 a) {
413
522
  return sum_fp64(vec2(yn, 0.0), prod);
414
523
  #endif
415
524
  }
416
- `;var nt=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
525
+ `;var nt=`struct Fp64ArithmeticUniforms {
526
+ ONE: f32,
527
+ SPLIT: f32,
528
+ };
529
+
530
+ @group(0) @binding(auto) var<uniform> fp64arithmetic : Fp64ArithmeticUniforms;
531
+
532
+ fn fp64_nan(seed: f32) -> f32 {
533
+ let nanBits = 0x7fc00000u | select(0u, 1u, seed < 0.0);
534
+ return bitcast<f32>(nanBits);
535
+ }
536
+
537
+ fn fp64_runtime_zero() -> f32 {
538
+ return fp64arithmetic.ONE * 0.0;
539
+ }
540
+
541
+ fn prevent_fp64_optimization(value: f32) -> f32 {
542
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
543
+ return value + fp64_runtime_zero();
544
+ #else
545
+ return value;
546
+ #endif
547
+ }
548
+
549
+ fn split(a: f32) -> vec2f {
550
+ let splitValue = prevent_fp64_optimization(fp64arithmetic.SPLIT + fp64_runtime_zero());
551
+ let t = prevent_fp64_optimization(a * splitValue);
552
+ let temp = prevent_fp64_optimization(t - a);
553
+ let aHi = prevent_fp64_optimization(t - temp);
554
+ let aLo = prevent_fp64_optimization(a - aHi);
555
+ return vec2f(aHi, aLo);
556
+ }
557
+
558
+ fn split2(a: vec2f) -> vec2f {
559
+ var b = split(a.x);
560
+ b.y = b.y + a.y;
561
+ return b;
562
+ }
563
+
564
+ fn quickTwoSum(a: f32, b: f32) -> vec2f {
565
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
566
+ let sum = prevent_fp64_optimization((a + b) * fp64arithmetic.ONE);
567
+ let err = prevent_fp64_optimization(b - (sum - a) * fp64arithmetic.ONE);
568
+ #else
569
+ let sum = prevent_fp64_optimization(a + b);
570
+ let err = prevent_fp64_optimization(b - (sum - a));
571
+ #endif
572
+ return vec2f(sum, err);
573
+ }
574
+
575
+ fn twoSum(a: f32, b: f32) -> vec2f {
576
+ let s = prevent_fp64_optimization(a + b);
577
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
578
+ let v = prevent_fp64_optimization((s * fp64arithmetic.ONE - a) * fp64arithmetic.ONE);
579
+ let err =
580
+ prevent_fp64_optimization((a - (s - v) * fp64arithmetic.ONE) *
581
+ fp64arithmetic.ONE *
582
+ fp64arithmetic.ONE *
583
+ fp64arithmetic.ONE) +
584
+ prevent_fp64_optimization(b - v);
585
+ #else
586
+ let v = prevent_fp64_optimization(s - a);
587
+ let err = prevent_fp64_optimization(a - (s - v)) + prevent_fp64_optimization(b - v);
588
+ #endif
589
+ return vec2f(s, err);
590
+ }
591
+
592
+ fn twoSub(a: f32, b: f32) -> vec2f {
593
+ let s = prevent_fp64_optimization(a - b);
594
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
595
+ let v = prevent_fp64_optimization((s * fp64arithmetic.ONE - a) * fp64arithmetic.ONE);
596
+ let err =
597
+ prevent_fp64_optimization((a - (s - v) * fp64arithmetic.ONE) *
598
+ fp64arithmetic.ONE *
599
+ fp64arithmetic.ONE *
600
+ fp64arithmetic.ONE) -
601
+ prevent_fp64_optimization(b + v);
602
+ #else
603
+ let v = prevent_fp64_optimization(s - a);
604
+ let err = prevent_fp64_optimization(a - (s - v)) - prevent_fp64_optimization(b + v);
605
+ #endif
606
+ return vec2f(s, err);
607
+ }
608
+
609
+ fn twoSqr(a: f32) -> vec2f {
610
+ let prod = prevent_fp64_optimization(a * a);
611
+ let aFp64 = split(a);
612
+ let highProduct = prevent_fp64_optimization(aFp64.x * aFp64.x);
613
+ let crossProduct = prevent_fp64_optimization(2.0 * aFp64.x * aFp64.y);
614
+ let lowProduct = prevent_fp64_optimization(aFp64.y * aFp64.y);
615
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
616
+ let err =
617
+ (prevent_fp64_optimization(highProduct - prod) * fp64arithmetic.ONE +
618
+ crossProduct * fp64arithmetic.ONE * fp64arithmetic.ONE) +
619
+ lowProduct * fp64arithmetic.ONE * fp64arithmetic.ONE * fp64arithmetic.ONE;
620
+ #else
621
+ let err = ((prevent_fp64_optimization(highProduct - prod) + crossProduct) + lowProduct);
622
+ #endif
623
+ return vec2f(prod, err);
624
+ }
625
+
626
+ fn twoProd(a: f32, b: f32) -> vec2f {
627
+ let prod = prevent_fp64_optimization(a * b);
628
+ let aFp64 = split(a);
629
+ let bFp64 = split(b);
630
+ let highProduct = prevent_fp64_optimization(aFp64.x * bFp64.x);
631
+ let crossProduct1 = prevent_fp64_optimization(aFp64.x * bFp64.y);
632
+ let crossProduct2 = prevent_fp64_optimization(aFp64.y * bFp64.x);
633
+ let lowProduct = prevent_fp64_optimization(aFp64.y * bFp64.y);
634
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
635
+ let err1 = (highProduct - prod) * fp64arithmetic.ONE;
636
+ let err2 = crossProduct1 * fp64arithmetic.ONE * fp64arithmetic.ONE;
637
+ let err3 = crossProduct2 * fp64arithmetic.ONE * fp64arithmetic.ONE * fp64arithmetic.ONE;
638
+ let err4 =
639
+ lowProduct *
640
+ fp64arithmetic.ONE *
641
+ fp64arithmetic.ONE *
642
+ fp64arithmetic.ONE *
643
+ fp64arithmetic.ONE;
644
+ #else
645
+ let err1 = highProduct - prod;
646
+ let err2 = crossProduct1;
647
+ let err3 = crossProduct2;
648
+ let err4 = lowProduct;
649
+ #endif
650
+ let err12InputA = prevent_fp64_optimization(err1);
651
+ let err12InputB = prevent_fp64_optimization(err2);
652
+ let err12 = prevent_fp64_optimization(err12InputA + err12InputB);
653
+ let err123InputA = prevent_fp64_optimization(err12);
654
+ let err123InputB = prevent_fp64_optimization(err3);
655
+ let err123 = prevent_fp64_optimization(err123InputA + err123InputB);
656
+ let err1234InputA = prevent_fp64_optimization(err123);
657
+ let err1234InputB = prevent_fp64_optimization(err4);
658
+ let err = prevent_fp64_optimization(err1234InputA + err1234InputB);
659
+ return vec2f(prod, err);
660
+ }
661
+
662
+ fn sum_fp64(a: vec2f, b: vec2f) -> vec2f {
663
+ var s = twoSum(a.x, b.x);
664
+ let t = twoSum(a.y, b.y);
665
+ s.y = prevent_fp64_optimization(s.y + t.x);
666
+ s = quickTwoSum(s.x, s.y);
667
+ s.y = prevent_fp64_optimization(s.y + t.y);
668
+ s = quickTwoSum(s.x, s.y);
669
+ return s;
670
+ }
671
+
672
+ fn sub_fp64(a: vec2f, b: vec2f) -> vec2f {
673
+ var s = twoSub(a.x, b.x);
674
+ let t = twoSub(a.y, b.y);
675
+ s.y = prevent_fp64_optimization(s.y + t.x);
676
+ s = quickTwoSum(s.x, s.y);
677
+ s.y = prevent_fp64_optimization(s.y + t.y);
678
+ s = quickTwoSum(s.x, s.y);
679
+ return s;
680
+ }
681
+
682
+ fn mul_fp64(a: vec2f, b: vec2f) -> vec2f {
683
+ var prod = twoProd(a.x, b.x);
684
+ let crossProduct1 = prevent_fp64_optimization(a.x * b.y);
685
+ prod.y = prevent_fp64_optimization(prod.y + crossProduct1);
686
+ #ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND
687
+ prod = split2(prod);
688
+ #endif
689
+ prod = quickTwoSum(prod.x, prod.y);
690
+ let crossProduct2 = prevent_fp64_optimization(a.y * b.x);
691
+ prod.y = prevent_fp64_optimization(prod.y + crossProduct2);
692
+ #ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND
693
+ prod = split2(prod);
694
+ #endif
695
+ prod = quickTwoSum(prod.x, prod.y);
696
+ return prod;
697
+ }
698
+
699
+ fn div_fp64(a: vec2f, b: vec2f) -> vec2f {
700
+ let xn = prevent_fp64_optimization(1.0 / b.x);
701
+ let yn = mul_fp64(a, vec2f(xn, fp64_runtime_zero()));
702
+ let diff = prevent_fp64_optimization(sub_fp64(a, mul_fp64(b, yn)).x);
703
+ let prod = twoProd(xn, diff);
704
+ return sum_fp64(yn, prod);
705
+ }
706
+
707
+ fn sqrt_fp64(a: vec2f) -> vec2f {
708
+ if (a.x == 0.0 && a.y == 0.0) {
709
+ return vec2f(0.0, 0.0);
710
+ }
711
+ if (a.x < 0.0) {
712
+ let nanValue = fp64_nan(a.x);
713
+ return vec2f(nanValue, nanValue);
714
+ }
715
+
716
+ let x = prevent_fp64_optimization(1.0 / sqrt(a.x));
717
+ let yn = prevent_fp64_optimization(a.x * x);
718
+ #ifdef LUMA_FP64_CODE_ELIMINATION_WORKAROUND
719
+ let ynSqr = twoSqr(yn) * fp64arithmetic.ONE;
720
+ #else
721
+ let ynSqr = twoSqr(yn);
722
+ #endif
723
+ let diff = prevent_fp64_optimization(sub_fp64(a, ynSqr).x);
724
+ let prod = twoProd(prevent_fp64_optimization(x * 0.5), diff);
725
+ #ifdef LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND
726
+ return sum_fp64(split(yn), prod);
727
+ #else
728
+ return sum_fp64(vec2f(yn, 0.0), prod);
729
+ #endif
730
+ }
731
+ `;var at=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
417
732
  const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
418
733
  const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
419
734
  const vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);
@@ -1082,8 +1397,8 @@ void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
1082
1397
  vec4_dot_fp64(a, tmp, out_val[i]);
1083
1398
  }
1084
1399
  }
1085
- `;var Qo={ONE:1},at={name:"fp64arithmetic",vs:it,defaultUniforms:Qo,uniformTypes:{ONE:"f32"},fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe},te={name:"fp64",vs:nt,dependencies:[at],fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe};var oe=d(_(),1);var lt=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
1086
- uniform project64Uniforms {
1400
+ `;var Qr={ONE:1,SPLIT:4097},lt={name:"fp64arithmetic",source:nt,fs:ye,vs:ye,defaultUniforms:Qr,uniformTypes:{ONE:"f32",SPLIT:"f32"},fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe},te={name:"fp64",vs:at,dependencies:[lt],fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe};var re=d(_(),1);var ft=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
1401
+ layout(std140) uniform project64Uniforms {
1087
1402
  vec2 scale;
1088
1403
  mat4 viewProjectionMatrix;
1089
1404
  mat4 viewProjectionMatrix64Low;
@@ -1155,7 +1470,7 @@ return project_position_to_clipspace(
1155
1470
  position, position64xyLow, offset, commonPosition
1156
1471
  );
1157
1472
  }
1158
- `;var{fp64ify:Jo,fp64ifyMatrix4:er}=te,re={name:"project64",dependencies:[oe.project,te],vs:lt,getUniforms:or,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},tr=(0,oe._memoize)(rr);function or(o){if(o&&"viewport"in o){let{viewProjectionMatrix:e,scale:t}=o.viewport;return tr({viewProjectionMatrix:e,scale:t})}return{}}function rr({viewProjectionMatrix:o,scale:e}){let t=er(o),r=new Float32Array(16),s=new Float32Array(16);for(let i=0;i<4;i++)for(let n=0;n<4;n++){let a=4*i+n,l=4*n+i;r[l]=t[2*a],s[l]=t[2*a+1]}return{scale:Jo(e),viewProjectionMatrix:[...r],viewProjectionMatrix64Low:[...s]}}var se=class extends w.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!==w.COORDINATE_SYSTEM.LNGLAT&&e!==w.COORDINATE_SYSTEM.DEFAULT)throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[re]}}draw(e,t){let{viewport:r}=e.context;this.setShaderModuleProps({project64:{viewport:r}})}};se.extensionName="Fp64Extension";var ct=se;var N=d(_(),1);var ft={inject:{"vs:#decl":`
1473
+ `;var{fp64ify:Jr,fp64ifyMatrix4:eo}=te,oe={name:"project64",dependencies:[re.project,te],vs:ft,getUniforms:ro,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},to=(0,re._memoize)(oo);function ro(r){if(r&&"viewport"in r){let{viewProjectionMatrix:e,scale:t}=r.viewport;return to({viewProjectionMatrix:e,scale:t})}return{}}function oo({viewProjectionMatrix:r,scale:e}){let t=eo(r),o=new Float32Array(16),i=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;o[l]=t[2*a],i[l]=t[2*a+1]}return{scale:Jr(e),viewProjectionMatrix:[...o],viewProjectionMatrix64Low:[...i]}}var ie=class extends N.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!==N.COORDINATE_SYSTEM.LNGLAT&&e!==N.COORDINATE_SYSTEM.DEFAULT)throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[oe]}}draw(e,t){let{viewport:o}=e.context;this.setShaderModuleProps({project64:{viewport:o}})}};ie.extensionName="Fp64Extension";var ct=ie;var w=d(_(),1);var pt={inject:{"vs:#decl":`
1159
1474
  in vec2 instanceDashArrays;
1160
1475
  #ifdef HIGH_PRECISION_DASH
1161
1476
  in float instanceDashOffsets;
@@ -1170,7 +1485,7 @@ vDashOffset = instanceDashOffsets / width.x;
1170
1485
  vDashOffset = 0.0;
1171
1486
  #endif
1172
1487
  `,"fs:#decl":`
1173
- uniform pathStyleUniforms {
1488
+ layout(std140) uniform pathStyleUniforms {
1174
1489
  float dashAlignMode;
1175
1490
  bool dashGapPickable;
1176
1491
  } pathStyle;
@@ -1224,14 +1539,14 @@ isInside = step(-1.0, vPathPosition.x) * step(vPathPosition.x, 1.0);
1224
1539
  if (isInside == 0.0) {
1225
1540
  discard;
1226
1541
  }
1227
- `}};var sr={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},B=class extends N.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:r=!1}={}){super({dash:e||r,offset:t,highPrecisionDash:r})}isEnabled(e){return"pathTesselator"in e.state}getShaders(e){if(!e.isEnabled(this))return null;let t={},r={};e.opts.dash&&(t=(0,N._mergeShaders)(t,ft),e.opts.highPrecisionDash&&(r.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(t=(0,N._mergeShaders)(t,ut));let{inject:s}=t;return{modules:[{name:"pathStyle",inject:s,uniformTypes:{dashAlignMode:"f32",dashGapPickable:"i32"}}],defines:r}}initializeState(e,t){let r=this.getAttributeManager();!r||!t.isEnabled(this)||(t.opts.dash&&r.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},...t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}}:{}}),t.opts.offset&&r.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let r={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:Boolean(this.props.dashGapPickable)};this.setShaderModuleProps({pathStyle:r})}}getDashOffsets(e){let t=[0],r=this.props.positionFormat==="XY"?2:3,s=Array.isArray(e[0]),i=s?e.length:e.length/r,n,a;for(let l=0;l<i-1;l++)n=s?e[l]:e.slice(l*r,l*r+r),n=this.projectPosition(n),l>0&&(t[l]=t[l-1]+R.dist(a,n)),a=n;return t[i-1]=0,t}};B.defaultProps=sr;B.extensionName="PathStyleExtension";var pt=B;var mt=d(_(),1);var F=d(_(),1),dt=`uniform fillUniforms {
1542
+ `}};var io={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},B=class extends w.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:o=!1}={}){super({dash:e||o,offset:t,highPrecisionDash:o})}isEnabled(e){return"pathTesselator"in e.state}getShaders(e){if(!e.isEnabled(this))return null;let t={},o={};e.opts.dash&&(t=(0,w._mergeShaders)(t,pt),e.opts.highPrecisionDash&&(o.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(t=(0,w._mergeShaders)(t,ut));let{inject:i}=t;return{modules:[{name:"pathStyle",inject:i,uniformTypes:{dashAlignMode:"f32",dashGapPickable:"i32"}}],defines:o}}initializeState(e,t){let o=this.getAttributeManager();!o||!t.isEnabled(this)||(t.opts.dash&&o.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},...t.opts.highPrecisionDash?{instanceDashOffsets:{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}}:{}}),t.opts.offset&&o.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let o={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:Boolean(this.props.dashGapPickable)};this.setShaderModuleProps({pathStyle:o})}}getDashOffsets(e){let t=[0],o=this.props.positionFormat==="XY"?2:3,i=Array.isArray(e[0]),s=i?e.length:e.length/o,n,a;for(let l=0;l<s-1;l++)n=i?e[l]:e.slice(l*o,l*o+o),n=this.projectPosition(n),l>0&&(t[l]=t[l-1]+R.dist(a,n)),a=n;return t[s-1]=0,t}};B.defaultProps=io;B.extensionName="PathStyleExtension";var dt=B;var ht=d(_(),1);var F=d(_(),1),_t=`layout(std140) uniform fillUniforms {
1228
1543
  vec2 patternTextureSize;
1229
1544
  bool patternEnabled;
1230
1545
  bool patternMask;
1231
1546
  vec2 uvCoordinateOrigin;
1232
1547
  vec2 uvCoordinateOrigin64Low;
1233
1548
  } fill;
1234
- `,ir=`
1549
+ `,so=`
1235
1550
  in vec4 fillPatternFrames;
1236
1551
  in float fillPatternScales;
1237
1552
  in vec2 fillPatternOffsets;
@@ -1239,10 +1554,10 @@ in vec2 fillPatternOffsets;
1239
1554
  out vec2 fill_uv;
1240
1555
  out vec4 fill_patternBounds;
1241
1556
  out vec4 fill_patternPlacement;
1242
- `,nr=`
1243
- ${dt}
1244
- ${ir}
1245
- `,ar=`
1557
+ `,no=`
1558
+ ${_t}
1559
+ ${so}
1560
+ `,ao=`
1246
1561
  uniform sampler2D fill_patternTexture;
1247
1562
 
1248
1563
  in vec4 fill_patternBounds;
@@ -1250,10 +1565,10 @@ in vec4 fill_patternPlacement;
1250
1565
  in vec2 fill_uv;
1251
1566
 
1252
1567
  const float FILL_UV_SCALE = 512.0 / 40000000.0;
1253
- `,lr=`
1254
- ${dt}
1255
- ${ar}
1256
- `,cr={"vs:DECKGL_FILTER_GL_POSITION":`
1568
+ `,lo=`
1569
+ ${_t}
1570
+ ${ao}
1571
+ `,fo={"vs:DECKGL_FILTER_GL_POSITION":`
1257
1572
  fill_uv = geometry.position.xy;
1258
1573
  `,"vs:DECKGL_FILTER_COLOR":`
1259
1574
  if (fill.patternEnabled) {
@@ -1275,15 +1590,15 @@ ${ar}
1275
1590
  color.rgb = patternColor.rgb;
1276
1591
  }
1277
1592
  }
1278
- `};function fr(o){if(!o)return{};let e={};if("fillPatternTexture"in o){let{fillPatternTexture:t}=o;e.fill_patternTexture=t,e.patternTextureSize=[t.width,t.height]}if("project"in o){let{fillPatternMask:t=!0,fillPatternEnabled:r=!0}=o,s=F.project.getUniforms(o.project),{commonOrigin:i}=s,n=[(0,F.fp64LowPart)(i[0]),(0,F.fp64LowPart)(i[1])];e.uvCoordinateOrigin=i.slice(0,2),e.uvCoordinateOrigin64Low=n,e.patternMask=t,e.patternEnabled=r}return e}var _t={name:"fill",vs:nr,fs:lr,inject:cr,dependencies:[F.project],getUniforms:fr,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var ur={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:o=>o.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},D=class extends mt.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&&_t].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:s,fillPatternMask:i}=this.props,n={project:e.shaderModuleProps.project,fillPatternEnabled:s,fillPatternMask:i,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]}};D.defaultProps=ur;D.extensionName="FillStyleExtension";var ht=D;var vt=d(_(),1),pr={clipBounds:[0,0,1,1],clipByInstance:void 0},gt=`
1279
- uniform clipUniforms {
1593
+ `};function co(r){if(!r)return{};let e={};if("fillPatternTexture"in r){let{fillPatternTexture:t}=r;e.fill_patternTexture=t,e.patternTextureSize=[t.width,t.height]}if("project"in r){let{fillPatternMask:t=!0,fillPatternEnabled:o=!0}=r,i=F.project.getUniforms(r.project),{commonOrigin:s}=i,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=o}return e}var mt={name:"fill",vs:no,fs:lo,inject:fo,dependencies:[F.project],getUniforms:co,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var po={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:r=>r.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},D=class extends ht.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&&mt].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let o=this.getAttributeManager();t.opts.pattern&&o.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},o){o.isEnabled(this)&&e.fillPatternMapping&&e.fillPatternMapping!==t.fillPatternMapping&&this.getAttributeManager().invalidate("getFillPattern")}draw(e,t){if(!t.isEnabled(this))return;let{fillPatternAtlas:o,fillPatternEnabled:i,fillPatternMask:s}=this.props,n={project:e.shaderModuleProps.project,fillPatternEnabled:i,fillPatternMask:s,fillPatternTexture:o||this.state.emptyTexture};this.setShaderModuleProps({fill:n})}finalizeState(){this.state.emptyTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:t}=this.getCurrentLayer().props,o=t&&t[e];return o?[o.x,o.y,o.width,o.height]:[0,0,0,0]}};D.defaultProps=po;D.extensionName="FillStyleExtension";var vt=D;var gt=d(_(),1),uo={clipBounds:[0,0,1,1],clipByInstance:void 0},xt=`
1594
+ layout(std140) uniform clipUniforms {
1280
1595
  vec4 bounds;
1281
1596
  } clip;
1282
1597
 
1283
1598
  bool clip_isInBounds(vec2 position) {
1284
1599
  return position.x >= clip.bounds[0] && position.y >= clip.bounds[1] && position.x < clip.bounds[2] && position.y < clip.bounds[3];
1285
1600
  }
1286
- `,dr={name:"clip",vs:gt,uniformTypes:{bounds:"vec4<f32>"}},_r={"vs:#decl":`
1601
+ `,_o={name:"clip",vs:xt,uniformTypes:{bounds:"vec4<f32>"}},mo={"vs:#decl":`
1287
1602
  out float clip_isVisible;
1288
1603
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1289
1604
  clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
@@ -1291,7 +1606,7 @@ out float clip_isVisible;
1291
1606
  in float clip_isVisible;
1292
1607
  `,"fs:DECKGL_FILTER_COLOR":`
1293
1608
  if (clip_isVisible < 0.5) discard;
1294
- `},mr={name:"clip",fs:gt,uniformTypes:{bounds:"vec4<f32>"}},hr={"vs:#decl":`
1609
+ `},ho={name:"clip",fs:xt,uniformTypes:{bounds:"vec4<f32>"}},vo={"vs:#decl":`
1295
1610
  out vec2 clip_commonPosition;
1296
1611
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1297
1612
  clip_commonPosition = geometry.position.xy;
@@ -1299,12 +1614,12 @@ out vec2 clip_commonPosition;
1299
1614
  in vec2 clip_commonPosition;
1300
1615
  `,"fs:DECKGL_FILTER_COLOR":`
1301
1616
  if (!clip_isInBounds(clip_commonPosition)) discard;
1302
- `},j=class extends vt.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:[dr],inject:_r}:{modules:[mr],inject:hr}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),s=this.projectPosition([e[2],e[3],0]);t.bounds=[Math.min(r[0],s[0]),Math.min(r[1],s[1]),Math.max(r[0],s[0]),Math.max(r[1],s[1])]}this.setShaderModuleProps({clip:t})}};j.defaultProps=pr;j.extensionName="ClipExtension";var xt=j;var Mt=d(_(),1);var Pt=d(_(),1),vr=`
1617
+ `},z=class extends gt.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:[_o],inject:mo}:{modules:[ho],inject:vo}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let o=this.projectPosition([e[0],e[1],0]),i=this.projectPosition([e[2],e[3],0]);t.bounds=[Math.min(o[0],i[0]),Math.min(o[1],i[1]),Math.max(o[0],i[0]),Math.max(o[1],i[1])]}this.setShaderModuleProps({clip:t})}};z.defaultProps=uo;z.extensionName="ClipExtension";var yt=z;var Ft=d(_(),1);var Pt=d(_(),1),go=`
1303
1618
  in float collisionPriorities;
1304
1619
 
1305
1620
  uniform sampler2D collision_texture;
1306
1621
 
1307
- uniform collisionUniforms {
1622
+ layout(std140) uniform collisionUniforms {
1308
1623
  bool sort;
1309
1624
  bool enabled;
1310
1625
  } collision;
@@ -1347,7 +1662,7 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
1347
1662
  float W = 2.0 * floatN + 1.0;
1348
1663
  return pow(accumulator / (W * W), 2.2);
1349
1664
  }
1350
- `,gr={"vs:#decl":`
1665
+ `,xo={"vs:#decl":`
1351
1666
  float collision_fade = 1.0;
1352
1667
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1353
1668
  if (collision.sort) {
@@ -1366,21 +1681,21 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
1366
1681
  }
1367
1682
  `,"vs:DECKGL_FILTER_COLOR":`
1368
1683
  color.a *= collision_fade;
1369
- `},xr=o=>{if(!o||!("dummyCollisionMap"in o))return{};let{enabled:e,collisionFBO:t,drawToCollisionMap:r,dummyCollisionMap:s}=o;return{enabled:e&&!r,sort:Boolean(r),collision_texture:!r&&t?t.colorAttachments[0]:s}},yt={name:"collision",dependencies:[Pt.project],vs:vr,inject:gr,getUniforms:xr,uniformTypes:{sort:"i32",enabled:"i32"}};var Et=d(_(),1);var bt=d(_(),1),V=class extends bt._LayersPass{renderCollisionMap(e,t){let s=[0,0,0,0],i=[1,1,e.width-2*1,e.height-2*1];this.render({...t,clearColor:s,scissorRect:i,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 V(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:r,viewports:s,onViewportActive:i,views:n,isPicking:a,preRenderStats:l={}}){let{device:c}=this.context;if(a)return;let f=t.filter(({props:{visible:h,collisionEnabled:L}})=>h&&L);if(f.length===0){this.channels={};return}let u=e?.filter(h=>h.useInPicking&&l[h.id]),p=l["mask-effect"]?.didRender,m=this._groupByCollisionGroup(c,f),v=s[0],b=!this.lastViewport||!this.lastViewport.equals(v)||p;for(let h in m){let L=this.collisionFBOs[h],fe=m[h],[ue,pe]=c.canvasContext.getPixelSize();L.resize({width:ue/Pe,height:pe/Pe}),this._render(fe,{effects:u,layerFilter:r,onViewportActive:i,views:n,viewport:v,viewportChanged:b})}}_render(e,{effects:t,layerFilter:r,onViewportActive:s,views:i,viewport:n,viewportChanged:a}){let{collisionGroup:l}=e,c=this.channels[l];if(!c)return;let f=a||e===c||!(0,Et._deepEqual)(c.layers,e.layers,1)||e.layerBounds.some((u,p)=>!M(u,c.layerBounds[p]))||e.allLayersLoaded!==c.allLayersLoaded||e.layers.some(u=>u.props.transitions);if(this.channels[l]=e,f){this.lastViewport=n;let u=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(u,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:r,viewports:n?[n]:[],onViewportActive:s,views:i,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:u.device.canvasContext.getDevicePixelRatio()/Pe}}})}}_groupByCollisionGroup(e,t){let r={};for(let s of t){let i=s.props.collisionGroup,n=r[i];n||(n={collisionGroup:i,layers:[],layerBounds:[],allLayersLoaded:!0},r[i]=n),n.layers.push(s),n.layerBounds.push(s.getBounds()),s.isLoaded||(n.allLayersLoaded=!1)}for(let s of Object.keys(r))this.collisionFBOs[s]||this.createFBO(e,s),this.channels[s]||(this.channels[s]=r[s]);for(let s of Object.keys(this.collisionFBOs))r[s]||this.destroyFBO(s);return r}getShaderModuleProps(e){let{collisionGroup:t,collisionEnabled:r}=e.props,{collisionFBOs:s,dummyCollisionMap:i}=this,n=s[t];return{collision:{enabled:r&&Boolean(n),collisionFBO:n,dummyCollisionMap:i}}}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:s}=e.getDefaultCanvasContext().canvas,i=e.createTexture({format:"rgba8unorm",width:r,height:s,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),n=e.createTexture({format:"depth16unorm",width:r,height:s});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:r,height:s,colorAttachments:[i],depthStencilAttachment:n})}destroyFBO(e){let t=this.collisionFBOs[e];t.colorAttachments[0]?.destroy(),t.depthStencilAttachment?.destroy(),t.destroy(),delete this.collisionFBOs[e]}};var Pr={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},U=class extends Mt.LayerExtension{getShaders(){return{modules:[yt]}}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}};U.defaultProps=Pr;U.extensionName="CollisionFilterExtension";var Ft=U;var y=d(_(),1);var Tt=d(_(),1),At=`uniform maskUniforms {
1684
+ `},yo=r=>{if(!r||!("dummyCollisionMap"in r))return{};let{enabled:e,collisionFBO:t,drawToCollisionMap:o,dummyCollisionMap:i}=r;return{enabled:e&&!o,sort:Boolean(o),collision_texture:!o&&t?t.colorAttachments[0]:i}},bt={name:"collision",dependencies:[Pt.project],vs:go,inject:xo,getUniforms:yo,uniformTypes:{sort:"i32",enabled:"i32"}};var Mt=d(_(),1);var Et=d(_(),1),V=class extends Et._LayersPass{renderCollisionMap(e,t){let i=[0,0,0,0],s=[1,1,e.width-2*1,e.height-2*1];this.render({...t,clearColor:i,scissorRect:s,target:e,pass:"collision"})}getLayerParameters(e,t,o){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,j=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 V(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:o,viewports:i,onViewportActive:s,views:n,isPicking:a,preRenderStats:l={}}){let{device:f}=this.context;if(a)return;let c=t.filter(({props:{visible:h,collisionEnabled:S}})=>h&&S);if(c.length===0){this.channels={};return}let p=e?.filter(h=>h.useInPicking&&l[h.id]),u=l["mask-effect"]?.didRender,m=this._groupByCollisionGroup(f,c),v=i[0],b=!this.lastViewport||!this.lastViewport.equals(v)||u;for(let h in m){let S=this.collisionFBOs[h],ce=m[h],[pe,ue]=f.canvasContext.getPixelSize();S.resize({width:pe/Pe,height:ue/Pe}),this._render(ce,{effects:p,layerFilter:o,onViewportActive:s,views:n,viewport:v,viewportChanged:b})}}_render(e,{effects:t,layerFilter:o,onViewportActive:i,views:s,viewport:n,viewportChanged:a}){let{collisionGroup:l}=e,f=this.channels[l];if(!f)return;let c=a||e===f||!(0,Mt._deepEqual)(f.layers,e.layers,1)||e.layerBounds.some((p,u)=>!M(p,f.layerBounds[u]))||e.allLayersLoaded!==f.allLayersLoaded||e.layers.some(p=>p.props.transitions);if(this.channels[l]=e,c){this.lastViewport=n;let p=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(p,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:o,viewports:n?[n]:[],onViewportActive:i,views:s,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:p.device.canvasContext.getDevicePixelRatio()/Pe}}})}}_groupByCollisionGroup(e,t){let o={};for(let i of t){let s=i.props.collisionGroup,n=o[s];n||(n={collisionGroup:s,layers:[],layerBounds:[],allLayersLoaded:!0},o[s]=n),n.layers.push(i),n.layerBounds.push(i.getBounds()),i.isLoaded||(n.allLayersLoaded=!1)}for(let i of Object.keys(o))this.collisionFBOs[i]||this.createFBO(e,i),this.channels[i]||(this.channels[i]=o[i]);for(let i of Object.keys(this.collisionFBOs))o[i]||this.destroyFBO(i);return o}getShaderModuleProps(e){let{collisionGroup:t,collisionEnabled:o}=e.props,{collisionFBOs:i,dummyCollisionMap:s}=this,n=i[t];return{collision:{enabled:o&&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:o,height:i}=e.getDefaultCanvasContext().canvas,s=e.createTexture({format:"rgba8unorm",width:o,height:i,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),n=e.createTexture({format:"depth16unorm",width:o,height:i});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:o,height:i,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 Po={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},U=class extends Ft.LayerExtension{getShaders(){return{modules:[bt]}}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 j),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};U.defaultProps=Po;U.extensionName="CollisionFilterExtension";var Ot=U;var P=d(_(),1);var At=d(_(),1),Tt=`layout(std140) uniform maskUniforms {
1370
1685
  vec4 bounds;
1371
1686
  highp int channel;
1372
1687
  bool enabled;
1373
1688
  bool inverted;
1374
1689
  bool maskByInstance;
1375
1690
  } mask;
1376
- `,yr=`
1691
+ `,bo=`
1377
1692
  vec2 mask_getCoords(vec4 position) {
1378
1693
  return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy);
1379
1694
  }
1380
- `,br=`
1381
- ${At}
1382
- ${yr}
1383
- `,Er=`
1695
+ `,Eo=`
1696
+ ${Tt}
1697
+ ${bo}
1698
+ `,Mo=`
1384
1699
  uniform sampler2D mask_texture;
1385
1700
 
1386
1701
  bool mask_isInBounds(vec2 texCoords) {
@@ -1405,10 +1720,10 @@ bool mask_isInBounds(vec2 texCoords) {
1405
1720
  return maskValue < 0.5;
1406
1721
  }
1407
1722
  }
1408
- `,Mr=`
1409
- ${At}
1410
- ${Er}
1411
- `,Fr={"vs:#decl":`
1723
+ `,Fo=`
1724
+ ${Tt}
1725
+ ${Mo}
1726
+ `,Oo={"vs:#decl":`
1412
1727
  out vec2 mask_texCoords;
1413
1728
  `,"vs:#main-end":`
1414
1729
  vec4 mask_common_position;
@@ -1430,15 +1745,15 @@ in vec2 mask_texCoords;
1430
1745
 
1431
1746
  if (!mask) discard;
1432
1747
  }
1433
- `},Tr=o=>o&&"maskMap"in o?{mask_texture:o.maskMap}:o||{},Ot={name:"mask",dependencies:[Tt.project],vs:br,fs:Mr,inject:Fr,getUniforms:Tr,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var ye=d(_(),1);var Lt=d(_(),1),Ar={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},G=class extends Lt._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",...Ar}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var ie=d(_(),1);function T(o,e){let t=[1/0,1/0,-1/0,-1/0];for(let r of o){let s=r.getBounds();if(s){let i=r.projectPosition(s[0],{viewport:e,autoOffset:!1}),n=r.projectPosition(s[1],{viewport:e,autoOffset:!1});t[0]=Math.min(t[0],i[0]),t[1]=Math.min(t[1],i[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 Or=2048;function A(o){let{bounds:e,viewport:t,border:r=0}=o,{isGeospatial:s}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let i=t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:n,height:a,zoom:l}=o;if(l===void 0){n=n-r*2,a=a-r*2;let c=Math.min(n/(e[2]-e[0]),a/(e[3]-e[1]));l=Math.min(Math.log2(c),20)}else if(!n||!a){let c=2**l;n=Math.round(Math.abs(e[2]-e[0])*c),a=Math.round(Math.abs(e[3]-e[1])*c);let f=Or-r*2;if(n>f||a>f){let u=f/Math.max(n,a);n=Math.round(n*u),a=Math.round(a*u),l+=Math.log2(u)}}return s?new ie.WebMercatorViewport({id:t.id,x:r,y:r,width:n,height:a,longitude:i[0],latitude:i[1],zoom:l,orthographic:!0}):new ie.OrthographicViewport({id:t.id,x:r,y:r,width:n,height:a,target:i,zoom:l,flipY:!1})}function Lr(o,e){let t;if(e&&e.length===2){let[i,n]=e,a=o.getBounds({z:i}),l=o.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=o.getBounds();let r=o.projectPosition(t.slice(0,2)),s=o.projectPosition(t.slice(2,4));return[r[0],r[1],s[0],s[1]]}function O(o,e,t){if(!o)return[0,0,1,1];let r=Lr(e,t),s=Cr(r);return o[2]-o[0]<=s[2]-s[0]&&o[3]-o[1]<=s[3]-s[1]?o:[Math.max(o[0],s[0]),Math.max(o[1],s[1]),Math.min(o[2],s[2]),Math.min(o[3],s[3])]}function Cr(o){let e=o[2]-o[0],t=o[3]-o[1],r=(o[0]+o[2])/2,s=(o[1]+o[3])/2;return[r-e,s-t,r+e,s+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 G(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:r,onViewportActive:s,views:i,isPicking:n}){let a=!1;if(n)return{didRender:a};let l=e.filter(p=>p.props.visible&&p.props.operation.includes("mask"));if(l.length===0)return this.masks=null,this.channels.length=0,{didRender:a};this.masks={};let c=this._sortMaskChannels(l),f=r[0],u=!this.lastViewport||!this.lastViewport.equals(f);if(f.resolution!==void 0)return ye.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:a};for(let p in c){let m=this._renderChannel(c[p],{layerFilter:t,onViewportActive:s,views:i,viewport:f,viewportChanged:u});a||(a=m)}return{didRender:a}}_renderChannel(e,{layerFilter:t,onViewportActive:r,views:s,viewport:i,viewportChanged:n}){let a=!1,l=this.channels[e.index];if(!l)return a;let c=e===l||e.layers.length!==l.layers.length||e.layers.some((f,u)=>f!==l.layers[u]||f.props.transitions)||e.layerBounds.some((f,u)=>f!==l.layerBounds[u]);if(e.bounds=l.bounds,e.maskBounds=l.maskBounds,this.channels[e.index]=e,c||n){this.lastViewport=i;let f=T(e.layers,i);if(e.bounds=f&&O(f,i),c||!M(e.bounds,l.bounds)){let{maskPass:u,maskMap:p}=this,m=f&&A({bounds:e.bounds,viewport:i,width:p.width,height:p.height,border:1});e.maskBounds=m?m.getBounds():[0,0,1,1],u.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:m?[m]:[],onViewportActive:r,views:s,shaderModuleProps:{project:{devicePixelRatio:1}}}),a=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},a}_sortMaskChannels(e){let t={},r=0;for(let s of e){let{id:i}=s.root,n=t[i];if(!n){if(++r>4){ye.log.warn("Too many mask layers. The max supported is 4")();continue}n={id:i,index:this.channels.findIndex(a=>a?.id===i),layers:[],layerBounds:[],coordinateOrigin:s.root.props.coordinateOrigin,coordinateSystem:s.root.props.coordinateSystem},t[i]=n}n.layers.push(s),n.layerBounds.push(s.getBounds())}for(let s=0;s<4;s++){let i=this.channels[s];(!i||!(i.id in t))&&(this.channels[s]=null)}for(let s in t){let i=t[s];i.index<0&&(i.index=this.channels.findIndex(n=>!n),this.channels[i.index]=i)}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 Sr={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=Boolean(this.props.maskByInstance)),this.state.maskByInstance=e,{modules:[Ot]}}draw({context:e,shaderModuleProps:t}){let r={};r.maskByInstance=Boolean(this.state.maskByInstance);let{maskId:s,maskInverted:i}=this.props,{maskChannels:n}=t.mask||{},{viewport:a}=e;if(n&&n[s]){let{index:l,bounds:c,coordinateOrigin:f}=n[s],{coordinateSystem:u}=n[s];r.enabled=!0,r.channel=l,r.inverted=i,u===y.COORDINATE_SYSTEM.DEFAULT&&(u=a.isGeospatial?y.COORDINATE_SYSTEM.LNGLAT:y.COORDINATE_SYSTEM.CARTESIAN);let p={modelMatrix:null,fromCoordinateOrigin:f,fromCoordinateSystem:u},m=this.projectPosition([c[0],c[1],0],p),v=this.projectPosition([c[2],c[3],0],p);r.bounds=[m[0],m[1],v[0],v[1]]}else s&&y.log.warn(`Could not find a mask layer with id: ${s}`)(),r.enabled=!1;this.setShaderModuleProps({mask:r})}};q.defaultProps=Sr;q.extensionName="MaskExtension";var Ct=q;var Bt=d(_(),1);var Nt=d(_(),1);var be=d(_(),1),g={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},Ir=Object.keys(g).map(o=>`const float TERRAIN_MODE_${o} = ${g[o]}.0;`).join(`
1434
- `),St=Ir+`
1435
- uniform terrainUniforms {
1748
+ `},Ao=r=>r&&"maskMap"in r?{mask_texture:r.maskMap}:r||{},St={name:"mask",dependencies:[At.project],vs:Eo,fs:Fo,inject:Oo,getUniforms:Ao,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var be=d(_(),1);var Lt=d(_(),1),To={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},G=class extends Lt._LayersPass{constructor(e,t){super(e,t);let{mapSize:o=2048}=t;this.maskMap=e.createTexture({format:"rgba8unorm",width:o,height:o,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:o,height:o,colorAttachments:[this.maskMap]})}render(e){let t=2**e.channel,o=[255,255,255,255];super.render({...e,clearColor:o,colorMask:t,target:this.fbo,pass:"mask"})}getLayerParameters(e,t,o){return{...e.props.parameters,blend:!0,depthCompare:"always",...To}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var se=d(_(),1);function O(r,e){let t=[1/0,1/0,-1/0,-1/0];for(let o of r){let i=o.getBounds();if(i){let s=o.projectPosition(i[0],{viewport:e,autoOffset:!1}),n=o.projectPosition(i[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 So=2048;function A(r){let{bounds:e,viewport:t,border:o=0}=r,{isGeospatial:i}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let s=t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:n,height:a,zoom:l}=r;if(l===void 0){n=n-o*2,a=a-o*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 c=So-o*2;if(n>c||a>c){let p=c/Math.max(n,a);n=Math.round(n*p),a=Math.round(a*p),l+=Math.log2(p)}}return i?new se.WebMercatorViewport({id:t.id,x:o,y:o,width:n,height:a,longitude:s[0],latitude:s[1],zoom:l,orthographic:!0}):new se.OrthographicViewport({id:t.id,x:o,y:o,width:n,height:a,target:s,zoom:l,flipY:!1})}function Lo(r,e){let t;if(e&&e.length===2){let[s,n]=e,a=r.getBounds({z:s}),l=r.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=r.getBounds();let o=r.projectPosition(t.slice(0,2)),i=r.projectPosition(t.slice(2,4));return[o[0],o[1],i[0],i[1]]}function T(r,e,t){if(!r)return[0,0,1,1];let o=Lo(e,t),i=Io(o);return r[2]-r[0]<=i[2]-i[0]&&r[3]-r[1]<=i[3]-i[1]?r:[Math.max(r[0],i[0]),Math.max(r[1],i[1]),Math.min(r[2],i[2]),Math.min(r[3],i[3])]}function Io(r){let e=r[2]-r[0],t=r[3]-r[1],o=(r[0]+r[2])/2,i=(r[1]+r[3])/2;return[o-e,i-t,o+e,i+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 G(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:o,onViewportActive:i,views:s,isPicking:n}){let a=!1;if(n)return{didRender:a};let l=e.filter(u=>u.props.visible&&u.props.operation.includes("mask"));if(l.length===0)return this.masks=null,this.channels.length=0,{didRender:a};this.masks={};let f=this._sortMaskChannels(l),c=o[0],p=!this.lastViewport||!this.lastViewport.equals(c);if(c.resolution!==void 0)return be.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:a};for(let u in f){let m=this._renderChannel(f[u],{layerFilter:t,onViewportActive:i,views:s,viewport:c,viewportChanged:p});a||(a=m)}return{didRender:a}}_renderChannel(e,{layerFilter:t,onViewportActive:o,views:i,viewport:s,viewportChanged:n}){let a=!1,l=this.channels[e.index];if(!l)return a;let f=e===l||e.layers.length!==l.layers.length||e.layers.some((c,p)=>c!==l.layers[p]||c.props.transitions)||e.layerBounds.some((c,p)=>c!==l.layerBounds[p]);if(e.bounds=l.bounds,e.maskBounds=l.maskBounds,this.channels[e.index]=e,f||n){this.lastViewport=s;let c=O(e.layers,s);if(e.bounds=c&&T(c,s),f||!M(e.bounds,l.bounds)){let{maskPass:p,maskMap:u}=this,m=c&&A({bounds:e.bounds,viewport:s,width:u.width,height:u.height,border:1});e.maskBounds=m?m.getBounds():[0,0,1,1],p.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:m?[m]:[],onViewportActive:o,views:i,shaderModuleProps:{project:{devicePixelRatio:1}}}),a=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},a}_sortMaskChannels(e){let t={},o=0;for(let i of e){let{id:s}=i.root,n=t[s];if(!n){if(++o>4){be.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:i.root.props.coordinateOrigin,coordinateSystem:i.root.props.coordinateSystem},t[s]=n}n.layers.push(i),n.layerBounds.push(i.getBounds())}for(let i=0;i<4;i++){let s=this.channels[i];(!s||!(s.id in t))&&(this.channels[i]=null)}for(let i in t){let s=t[i];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 Co={maskId:"",maskByInstance:void 0,maskInverted:!1},q=class extends P.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new H)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=Boolean(this.props.maskByInstance)),this.state.maskByInstance=e,{modules:[St]}}draw({context:e,shaderModuleProps:t}){let o={};o.maskByInstance=Boolean(this.state.maskByInstance);let{maskId:i,maskInverted:s}=this.props,{maskChannels:n}=t.mask||{},{viewport:a}=e;if(n&&n[i]){let{index:l,bounds:f,coordinateOrigin:c}=n[i],{coordinateSystem:p}=n[i];o.enabled=!0,o.channel=l,o.inverted=s,p===P.COORDINATE_SYSTEM.DEFAULT&&(p=a.isGeospatial?P.COORDINATE_SYSTEM.LNGLAT:P.COORDINATE_SYSTEM.CARTESIAN);let u={modelMatrix:null,fromCoordinateOrigin:c,fromCoordinateSystem:p},m=this.projectPosition([f[0],f[1],0],u),v=this.projectPosition([f[2],f[3],0],u);o.bounds=[m[0],m[1],v[0],v[1]]}else i&&P.log.warn(`Could not find a mask layer with id: ${i}`)(),o.enabled=!1;this.setShaderModuleProps({mask:o})}};q.defaultProps=Co;q.extensionName="MaskExtension";var It=q;var Dt=d(_(),1);var Bt=d(_(),1);var Ee=d(_(),1),g={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},ko=Object.keys(g).map(r=>`const float TERRAIN_MODE_${r} = ${g[r]}.0;`).join(`
1749
+ `),Ct=ko+`
1750
+ layout(std140) uniform terrainUniforms {
1436
1751
  float mode;
1437
1752
  vec4 bounds;
1438
1753
  } terrain;
1439
1754
 
1440
1755
  uniform sampler2D terrain_map;
1441
- `,Y={name:"terrain",dependencies:[be.project],vs:St+"out vec3 commonPos;",fs:St+"in vec3 commonPos;",inject:{"vs:#main-start":`
1756
+ `,W={name:"terrain",dependencies:[Ee.project],vs:Ct+"out vec3 commonPos;",fs:Ct+"in vec3 commonPos;",inject:{"vs:#main-start":`
1442
1757
  if (terrain.mode == TERRAIN_MODE_SKIP) {
1443
1758
  gl_Position = vec4(0.0);
1444
1759
  return;
@@ -1478,6 +1793,6 @@ if ((terrain.mode == TERRAIN_MODE_USE_COVER) || (terrain.mode == TERRAIN_MODE_US
1478
1793
  }
1479
1794
  return;
1480
1795
  }
1481
- `},getUniforms:(o={})=>{if("dummyHeightMap"in o){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:r,dummyHeightMap:s,terrainCover:i,useTerrainHeightMap:n,terrainSkipRender:a}=o,l=be.project.getUniforms(o.project),{commonOrigin:c}=l,f=a?g.SKIP:g.NONE,u=s,p=null;return e?(f=g.WRITE_HEIGHT_MAP,p=r):n&&t?(f=g.USE_HEIGHT_MAP,u=t,p=r):i&&(u=(o.isPicking?i.getPickingFramebuffer():i.getRenderFramebuffer())?.colorAttachments[0].texture,o.isPicking&&(f=g.SKIP),u?(f=f===g.SKIP?g.USE_COVER_ONLY:g.USE_COVER,p=i.bounds):(u=s,o.isPicking&&!a&&(f=g.NONE))),{mode:f,terrain_map:u,bounds:p?[p[0]-c[0],p[1]-c[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return{}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};function W(o,e){return o.createFramebuffer({id:e.id,colorAttachments:[o.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 ne=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=It(e)}get id(){return this.targetLayer.id}get isActive(){return Boolean(this.targetLayer.getCurrentLayer())}shouldUpdate({targetLayer:e,viewport:t,layers:r,layerNeedsRedraw:s}){e&&(this.targetLayer=e);let i=t?this._updateViewport(t):!1,n=r?this._updateLayers(r):!1;if(s){for(let a of this.layers)if(s[a]){n=!0;break}}return n||i}_updateLayers(e){let t=!1;if(e=this.tile?kr(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 i=e.projectPosition(this.targetBounds[0]),n=e.projectPosition(this.targetBounds[1]);this.targetBoundsCommon=[i[0],i[1],n[0],n[1]]}}else this.targetBounds!==t.getBounds()&&(r=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=T([t],e));if(!this.targetBoundsCommon)return!1;let s=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let i=this.renderViewport?.zoom;r=r||s!==i;let n=O(this.targetBoundsCommon,e),a=this.bounds;r=r||!a||n.some((l,c)=>l!==a[c]),this.bounds=n}return r&&(this.renderViewport=A({bounds:this.bounds,zoom:s,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=W(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=W(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 kr(o,e){return e.filter(t=>{let r=It(t);return r?Rr(o.boundingBox,r.boundingBox):!0})}function It(o){for(;o;){let{tile:e}=o.props;if(e)return e;o=o.parent}return null}function Rr(o,e){return o&&e?o[0][0]<e[1][0]&&e[0][0]<o[1][0]&&o[0][1]<e[1][1]&&e[0][1]<o[1][1]:!1}var kt=d(_(),1),wr={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},ae=class extends kt._LayersPass{getRenderableLayers(e,t){let{layers:r}=t,s=[],i=this._getDrawLayerParams(e,t,!0);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&i[n].shouldDrawLayer&&s.push(a)}return s}renderHeightMap(e,t){let r=e.getRenderFramebuffer(),s=e.renderViewport;!r||!s||(r.resize(s),this.render({...t,target:r,pass:"terrain-height-map",layers:t.layers,viewports:[s],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let r=e.getRenderFramebuffer(),s=e.renderViewport;if(!r||!s)return;let i=e.filterLayers(t.layers);r.resize(s),this.render({...t,target:r,pass:`terrain-cover-${e.id}`,layers:i,effects:[],viewports:[s],clearColor:[0,0,0,0]})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&wr}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var Rt=d(_(),1),le=class extends Rt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:r}=t,s=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let i=this._getDrawLayerParams(e,t);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&i[n].shouldDrawLayer&&(s.push(a),this.drawParameters[a.id]=i[n].layerParameters)}return s}renderTerrainCover(e,t){let r=e.getPickingFramebuffer(),s=e.renderViewport;if(!r||!s)return;let i=e.filterLayers(t.layers),n=e.targetLayer;n.props.pickable&&i.unshift(n),r.resize(s);let l=this.drawParameters[n.id]?.blendColor?.[3]??0;this.render({...t,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:i,effects:[],viewports:[s],cullRect:void 0,deviceRect:s,pickZ:!1,clearColor:[0,0,0,l]})}getLayerParameters(e,t,r){let s;return this.drawParameters[e.id]?s=this.drawParameters[e.id]:(s=super.getLayerParameters(e,t,r),s.blend=!0),{...s,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,t,r){return{...super.getShaderModuleProps(e,t,r),terrain:{project:r.project}}}};var wt=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=W(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let r=e.length!==this.layers.length||e.some((i,n)=>i!==this.layers[n]||i.props.transitions||i.getBounds()!==this.layersBounds[n]);r&&(this.layers=e,this.layersBounds=e.map(i=>i.getBounds()),this.layersBoundsCommon=T(e,t));let s=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||s){let i=O(this.layersBoundsCommon,t);if(i[2]<=i[0]||i[3]<=i[1])return this.renderViewport=null,!1;this.bounds=i,this.lastViewport=t;let n=t.scale,a=(i[2]-i[0])*n,l=(i[3]-i[1])*n;return this.renderViewport=a>0||l>0?A({bounds:[t.center[0]-1,t.center[1]-1,t.center[0]+1,t.center[1]+1],zoom:t.zoom,width:Math.min(a,wt),height:Math.min(l,wt),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 ae(e,{id:"terrain"}),this.terrainPickingPass=new le(e,{id:"terrain-picking"}),K.isSupported(e)?this.heightMap=new K(e):Nt.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 s=t[0],i=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(s,e),n=i.filter(l=>l.props.operation.includes("terrain"));if(n.length===0)return;r||i.filter(c=>c.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(n,s,e);let a=i.filter(l=>l.state.terrainDrawMode==="drape");this._updateTerrainCovers(n,a,s,e)}getShaderModuleProps(e,t){let{terrainDrawMode:r}=e.state,s=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=Boolean(s?.getPickingFramebuffer())),{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:s,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,s){let i={};for(let n of t)n.state.terrainCoverNeedsRedraw&&(i[n.id]=!0,n.state.terrainCoverNeedsRedraw=!1);for(let n of this.terrainCovers.values())n.isDirty=n.isDirty||n.shouldUpdate({layerNeedsRedraw:i});for(let n of e)this._updateTerrainCover(n,t,r,s);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,r,s){let i=this.isPicking?this.terrainPickingPass:this.terrainPass,n=this.terrainCovers.get(e.id);n||(n=new ne(e),this.terrainCovers.set(e.id,n));try{let a=n.shouldUpdate({targetLayer:e,viewport:r,layers:t});(this.isPicking||n.isDirty||a)&&(i.renderTerrainCover(n,{...s,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 Nr={terrainDrawMode:void 0},$=class extends Bt.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:s}=t;if(!s){let i=this.props.extruded,n=this.getAttributeManager()?.attributes,a=n&&"instancePositions"in n;s=i||a?"offset":"drape"}this.setState({terrainDrawMode:s})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};$.defaultProps=Nr;$.extensionName="TerrainExtension";var Dt=$;return Ht(Z);})();
1796
+ `},getUniforms:(r={})=>{if("dummyHeightMap"in r){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:o,dummyHeightMap:i,terrainCover:s,useTerrainHeightMap:n,terrainSkipRender:a}=r,l=Ee.project.getUniforms(r.project),{commonOrigin:f}=l,c=a?g.SKIP:g.NONE,p=i,u=null;return e?(c=g.WRITE_HEIGHT_MAP,u=o):n&&t?(c=g.USE_HEIGHT_MAP,p=t,u=o):s&&(p=(r.isPicking?s.getPickingFramebuffer():s.getRenderFramebuffer())?.colorAttachments[0].texture,r.isPicking&&(c=g.SKIP),p?(c=c===g.SKIP?g.USE_COVER_ONLY:g.USE_COVER,u=s.bounds):(p=i,r.isPicking&&!a&&(c=g.NONE))),{mode:c,terrain_map:p,bounds:u?[u[0]-f[0],u[1]-f[1],u[2]-u[0],u[3]-u[1]]:[0,0,0,0]}}return{}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};function Y(r,e){return r.createFramebuffer({id:e.id,colorAttachments:[r.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 ne=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=kt(e)}get id(){return this.targetLayer.id}get isActive(){return Boolean(this.targetLayer.getCurrentLayer())}shouldUpdate({targetLayer:e,viewport:t,layers:o,layerNeedsRedraw:i}){e&&(this.targetLayer=e);let s=t?this._updateViewport(t):!1,n=o?this._updateLayers(o):!1;if(i){for(let a of this.layers)if(i[a]){n=!0;break}}return n||s}_updateLayers(e){let t=!1;if(e=this.tile?Ro(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let o=0;o<e.length;o++)if(e[o].id!==this.layers[o]){t=!0;break}return t&&(this.layers=e.map(o=>o.id)),t}_updateViewport(e){let t=this.targetLayer,o=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){o=!0,this.targetBounds=this.tile.boundingBox;let s=e.projectPosition(this.targetBounds[0]),n=e.projectPosition(this.targetBounds[1]);this.targetBoundsCommon=[s[0],s[1],n[0],n[1]]}}else this.targetBounds!==t.getBounds()&&(o=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=O([t],e));if(!this.targetBoundsCommon)return!1;let i=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let s=this.renderViewport?.zoom;o=o||i!==s;let n=T(this.targetBoundsCommon,e),a=this.bounds;o=o||!a||n.some((l,f)=>l!==a[f]),this.bounds=n}return o&&(this.renderViewport=A({bounds:this.bounds,zoom:i,viewport:e})),o}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 Ro(r,e){return e.filter(t=>{let o=kt(t);return o?No(r.boundingBox,o.boundingBox):!0})}function kt(r){for(;r;){let{tile:e}=r.props;if(e)return e;r=r.parent}return null}function No(r,e){return r&&e?r[0][0]<e[1][0]&&e[0][0]<r[1][0]&&r[0][1]<e[1][1]&&e[0][1]<r[1][1]:!1}var Rt=d(_(),1),wo={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},ae=class extends Rt._LayersPass{getRenderableLayers(e,t){let{layers:o}=t,i=[],s=this._getDrawLayerParams(e,t,!0);for(let n=0;n<o.length;n++){let a=o[n];!a.isComposite&&s[n].shouldDrawLayer&&i.push(a)}return i}renderHeightMap(e,t){let o=e.getRenderFramebuffer(),i=e.renderViewport;!o||!i||(o.resize(i),this.render({...t,target:o,pass:"terrain-height-map",layers:t.layers,viewports:[i],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let o=e.getRenderFramebuffer(),i=e.renderViewport;if(!o||!i)return;let s=e.filterLayers(t.layers);o.resize(i),this.render({...t,target:o,pass:`terrain-cover-${e.id}`,layers:s,effects:[],viewports:[i],clearColor:[0,0,0,0]})}getLayerParameters(e,t,o){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&wo}}getShaderModuleProps(e,t,o){return{terrain:{project:o.project}}}};var Nt=d(_(),1),le=class extends Nt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:o}=t,i=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let s=this._getDrawLayerParams(e,t);for(let n=0;n<o.length;n++){let a=o[n];!a.isComposite&&s[n].shouldDrawLayer&&(i.push(a),this.drawParameters[a.id]=s[n].layerParameters)}return i}renderTerrainCover(e,t){let o=e.getPickingFramebuffer(),i=e.renderViewport;if(!o||!i)return;let s=e.filterLayers(t.layers),n=e.targetLayer;n.props.pickable&&s.unshift(n),o.resize(i);let l=this.drawParameters[n.id]?.blendColor?.[3]??0;this.render({...t,pickingFBO:o,pass:`terrain-cover-picking-${e.id}`,layers:s,effects:[],viewports:[i],cullRect:void 0,deviceRect:i,pickZ:!1,clearColor:[0,0,0,l]})}getLayerParameters(e,t,o){let i;return this.drawParameters[e.id]?i=this.drawParameters[e.id]:(i=super.getLayerParameters(e,t,o),i.blend=!0),{...i,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,t,o){return{...super.getShaderModuleProps(e,t,o),terrain:{project:o.project}}}};var wt=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 o=e.length!==this.layers.length||e.some((s,n)=>s!==this.layers[n]||s.props.transitions||s.getBounds()!==this.layersBounds[n]);o&&(this.layers=e,this.layersBounds=e.map(s=>s.getBounds()),this.layersBoundsCommon=O(e,t));let i=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(o||i){let s=T(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;return this.renderViewport=a>0||l>0?A({bounds:[t.center[0]-1,t.center[1]-1,t.center[0]+1,t.center[1]+1],zoom:t.zoom,width:Math.min(a,wt),height:Math.min(l,wt),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var fe=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 ae(e,{id:"terrain"}),this.terrainPickingPass=new le(e,{id:"terrain-picking"}),K.isSupported(e)?this.heightMap=new K(e):Bt.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,o=e.pass.startsWith("picking");this.isPicking=o,this.isDrapingEnabled=!0;let i=t[0],s=(o?this.terrainPickingPass:this.terrainPass).getRenderableLayers(i,e),n=s.filter(l=>l.props.operation.includes("terrain"));if(n.length===0)return;o||s.filter(f=>f.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(n,i,e);let a=s.filter(l=>l.state.terrainDrawMode==="drape");this._updateTerrainCovers(n,a,i,e)}getShaderModuleProps(e,t){let{terrainDrawMode:o}=e.state,i=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=Boolean(i?.getPickingFramebuffer())),{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:i,useTerrainHeightMap:o==="offset",terrainSkipRender:o==="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,o){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...o,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,t,o,i){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,o,i);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,o,i){let s=this.isPicking?this.terrainPickingPass:this.terrainPass,n=this.terrainCovers.get(e.id);n||(n=new ne(e),this.terrainCovers.set(e.id,n));try{let a=n.shouldUpdate({targetLayer:e,viewport:o,layers:t});(this.isPicking||n.isDirty||a)&&(s.renderTerrainCover(n,{...i,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,o]of this.terrainCovers)o.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var Bo={terrainDrawMode:void 0},$=class extends Dt.LayerExtension{getShaders(){return{modules:[W]}}initializeState(){this.context.deck?._addDefaultEffect(new fe)}updateState(e){let{props:t,oldProps:o}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===o.terrainDrawMode&&t.extruded===o.extruded)return;let{terrainDrawMode:i}=t;if(!i){let s=this.props.extruded,n=this.getAttributeManager()?.attributes,a=n&&"instancePositions"in n;i=s||a?"offset":"drape"}this.setState({terrainDrawMode:i})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};$.defaultProps=Bo;$.extensionName="TerrainExtension";var zt=$;return qt(Z);})();
1482
1797
  return __exports__;
1483
1798
  });