@deck.gl/extensions 9.3.0-alpha.3 → 9.3.0-alpha.6
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/brushing/shader-module.js +1 -1
- package/dist/clip/clip-extension.js +1 -1
- package/dist/collision-filter/shader-module.js +1 -1
- package/dist/data-filter/shader-module.d.ts +18 -4
- package/dist/data-filter/shader-module.d.ts.map +1 -1
- package/dist/data-filter/shader-module.js +132 -68
- package/dist/data-filter/shader-module.js.map +1 -1
- package/dist/dist.dev.js +402 -89
- package/dist/fill-style/shader-module.d.ts +2 -2
- package/dist/fill-style/shader-module.js +1 -1
- package/dist/fp64/project64.glsl.d.ts +1 -1
- package/dist/fp64/project64.glsl.js +1 -1
- package/dist/index.cjs +141 -76
- package/dist/index.cjs.map +3 -3
- package/dist/mask/shader-module.d.ts +2 -2
- package/dist/mask/shader-module.js +1 -1
- package/dist/path-style/shaders.glsl.js +1 -1
- package/dist/terrain/shader-module.js +1 -1
- package/dist/terrain/utils.js +1 -1
- package/dist/terrain/utils.js.map +1 -1
- package/dist.min.js +406 -91
- package/package.json +7 -7
- package/src/brushing/shader-module.ts +1 -1
- package/src/clip/clip-extension.ts +1 -1
- package/src/collision-filter/shader-module.ts +1 -1
- package/src/data-filter/shader-module.ts +155 -78
- package/src/fill-style/shader-module.ts +1 -1
- package/src/fp64/project64.glsl.ts +1 -1
- package/src/mask/shader-module.ts +1 -1
- package/src/path-style/shaders.glsl.ts +1 -1
- package/src/terrain/shader-module.ts +1 -1
- package/src/terrain/utils.ts +1 -1
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
|
|
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
|
-
`,
|
|
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
|
-
${
|
|
38
|
-
${qt}
|
|
39
|
-
`,Wt=`
|
|
40
|
-
in float brushing_isVisible;
|
|
41
|
-
`,Kt=`
|
|
42
|
-
${Se}
|
|
37
|
+
${Ce}
|
|
43
38
|
${Wt}
|
|
44
|
-
|
|
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
|
-
`},
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
`,
|
|
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(
|
|
121
|
-
step(
|
|
122
|
-
step(
|
|
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(
|
|
126
|
-
step(valueFromMax,
|
|
127
|
-
step(
|
|
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(
|
|
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
|
-
|
|
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 -
|
|
179
|
-
filterValues -
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
|
|
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
|
-
|
|
274
|
-
float a_lo = a * fp64.ONE - a_hi;
|
|
355
|
+
return value + fp64.ONE * 0.0;
|
|
275
356
|
#else
|
|
276
|
-
|
|
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
|
-
|
|
343
|
-
|
|
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=`
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
1243
|
-
${
|
|
1244
|
-
${
|
|
1245
|
-
`,
|
|
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
|
-
`,
|
|
1254
|
-
${
|
|
1255
|
-
${
|
|
1256
|
-
`,
|
|
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
|
|
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
|
-
`,
|
|
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
|
-
`},
|
|
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
|
-
`},
|
|
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
|
-
`,
|
|
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
|
-
`},
|
|
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
|
-
`,
|
|
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
|
-
`,
|
|
1381
|
-
${
|
|
1382
|
-
${
|
|
1383
|
-
`,
|
|
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
|
-
`,
|
|
1409
|
-
${
|
|
1410
|
-
${
|
|
1411
|
-
`,
|
|
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
|
-
`},
|
|
1434
|
-
`),
|
|
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
|
-
`,
|
|
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
|
});
|