@deck.gl/extensions 9.4.0-beta.1 → 9.4.0-beta.3
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/dist.dev.js +1281 -120
- package/dist/fill-style/fill-style-extension.d.ts +38 -6
- package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
- package/dist/fill-style/fill-style-extension.js +88 -10
- package/dist/fill-style/fill-style-extension.js.map +1 -1
- package/dist/fill-style/procedural-pattern.d.ts +65 -0
- package/dist/fill-style/procedural-pattern.d.ts.map +1 -0
- package/dist/fill-style/procedural-pattern.js +135 -0
- package/dist/fill-style/procedural-pattern.js.map +1 -0
- package/dist/fill-style/shader-module.d.ts +13 -4
- package/dist/fill-style/shader-module.d.ts.map +1 -1
- package/dist/fill-style/shader-module.js +212 -21
- package/dist/fill-style/shader-module.js.map +1 -1
- package/dist/index.cjs +946 -172
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/mask/shader-module.d.ts +1 -0
- package/dist/mask/shader-module.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.d.ts +49 -6
- package/dist/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +237 -37
- package/dist/path-style/path-style-extension.js.map +1 -1
- package/dist/path-style/shaders.glsl.d.ts +30 -1
- package/dist/path-style/shaders.glsl.d.ts.map +1 -1
- package/dist/path-style/shaders.glsl.js +136 -21
- package/dist/path-style/shaders.glsl.js.map +1 -1
- package/dist/terrain/shader-module.d.ts +1 -0
- package/dist/terrain/shader-module.d.ts.map +1 -1
- package/dist.min.js +377 -98
- package/package.json +6 -6
- package/src/fill-style/fill-style-extension.ts +135 -13
- package/src/fill-style/procedural-pattern.ts +203 -0
- package/src/fill-style/shader-module.ts +233 -23
- package/src/index.ts +10 -1
- package/src/path-style/path-style-extension.ts +350 -44
- package/src/path-style/shaders.glsl.ts +268 -27
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 Ai=Object.create;var de=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Si=Object.getOwnPropertyNames;var Li=Object.getPrototypeOf,Fi=Object.prototype.hasOwnProperty;var Ge=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(i){throw e=0,i}},Le=(t,e)=>{for(var i in e)de(t,i,{get:e[i],enumerable:!0})},ue=(t,e,i,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Si(e))!Fi.call(t,n)&&n!==i&&de(t,n,{get:()=>e[n],enumerable:!(r=Ti(e,n))||r.enumerable});return t},B=(t,e,i)=>(ue(t,e,"default"),i&&ue(i,e,"default")),_=(t,e,i)=>(i=t!=null?Ai(Li(t)):{},ue(e||!t||!t.__esModule?de(i,"default",{value:t,enumerable:!0}):i,t)),Oi=t=>ue(de({},"__esModule",{value:!0}),t);var h=Ge((po,qe)=>{qe.exports=globalThis.deck});var st=Ge((xo,at)=>{at.exports=globalThis.luma});var ce={};Le(ce,{BrushingExtension:()=>Xe,ClipExtension:()=>ei,CollisionFilterExtension:()=>ai,DataFilterExtension:()=>pt,FillStyleExtension:()=>Xt,Fp64Extension:()=>Nt,MaskExtension:()=>ui,PathStyleExtension:()=>Ht,_TerrainExtension:()=>yi,project64:()=>ge});var E={},We=_(h(),1);B(E,_(h(),1));if(!We.Layer)throw new Error("@deck.gl/core is not found");B(ce,E);var $e=_(h(),1);var Ye=_(h(),1),Ke=`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
|
+
`,Bi=`
|
|
14
14
|
in vec2 brushingTargets;
|
|
15
15
|
|
|
16
16
|
out float brushing_isVisible;
|
|
@@ -33,15 +33,15 @@
|
|
|
33
33
|
void brushing_setVisible(bool visible) {
|
|
34
34
|
brushing_isVisible = float(visible);
|
|
35
35
|
}
|
|
36
|
-
`,
|
|
37
|
-
${
|
|
38
|
-
${
|
|
39
|
-
`,
|
|
36
|
+
`,wi=`
|
|
37
|
+
${Ke}
|
|
38
|
+
${Bi}
|
|
39
|
+
`,Ii=`
|
|
40
40
|
in float brushing_isVisible;
|
|
41
|
-
`,
|
|
42
|
-
${
|
|
43
|
-
${
|
|
44
|
-
`,
|
|
41
|
+
`,Ci=`
|
|
42
|
+
${Ke}
|
|
43
|
+
${Ii}
|
|
44
|
+
`,Ri={source:0,target:1,custom:2,source_target:3},ki={"vs:DECKGL_FILTER_GL_POSITION":`
|
|
45
45
|
vec2 brushingTarget;
|
|
46
46
|
vec2 brushingSource;
|
|
47
47
|
if (brushing.target == 3) {
|
|
@@ -65,7 +65,7 @@ ${ii}
|
|
|
65
65
|
if (brushing.enabled && brushing_isVisible < 0.5) {
|
|
66
66
|
discard;
|
|
67
67
|
}
|
|
68
|
-
`},
|
|
68
|
+
`},Ze={name:"brushing",dependencies:[Ye.project],vs:wi,fs:Ci,inject:ki,getUniforms:t=>{if(!t||!("viewport"in t))return{};let{brushingEnabled:e=!0,brushingRadius:i=1e4,brushingTarget:r="source",mousePosition:n,viewport:o}=t;return{enabled:!!(e&&n&&o.containsPixel(n)),radius:i,target:Ri[r]||0,mousePos:n?o.unproject([n.x-o.x,n.y-o.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var Ni={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},q=class extends $e.LayerExtension{getShaders(){return{modules:[Ze]}}initializeState(e,i){let r=this.getAttributeManager();r&&r.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let n=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=n,e.deck&&e.deck.eventManager.on({pointermove:n,pointerleave:n})}finalizeState(e,i){if(e.deck){let r=this.state.onMouseMove;e.deck.eventManager.off({pointermove:r,pointerleave:r})}}draw(e,i){let{viewport:r,mousePosition:n}=e.context,{brushingEnabled:o,brushingRadius:a,brushingTarget:s}=this.props,l={viewport:r,mousePosition:n,brushingEnabled:o,brushingRadius:a,brushingTarget:s};this.setShaderModuleProps({brushing:l})}};q.defaultProps=Ni;q.extensionName="BrushingExtension";var Xe=q;var D=_(h(),1);var Qe=`layout(std140) uniform dataFilterUniforms {
|
|
69
69
|
bool useSoftMargin;
|
|
70
70
|
bool enabled;
|
|
71
71
|
bool transformSize;
|
|
@@ -78,7 +78,7 @@ ${ii}
|
|
|
78
78
|
vec4 max64High;
|
|
79
79
|
highp uvec4 categoryBitMask;
|
|
80
80
|
} dataFilter;
|
|
81
|
-
`,
|
|
81
|
+
`,Di=`
|
|
82
82
|
#ifdef DATAFILTER_TYPE
|
|
83
83
|
in DATAFILTER_TYPE filterValues;
|
|
84
84
|
#ifdef DATAFILTER_DOUBLE
|
|
@@ -239,15 +239,15 @@ float dataFilter_reduceValue(vec4 value) {
|
|
|
239
239
|
#endif
|
|
240
240
|
}
|
|
241
241
|
#endif
|
|
242
|
-
`,
|
|
243
|
-
${
|
|
244
|
-
${
|
|
245
|
-
`,
|
|
242
|
+
`,Je=`
|
|
243
|
+
${Qe}
|
|
244
|
+
${Di}
|
|
245
|
+
`,zi=`
|
|
246
246
|
in float dataFilter_value;
|
|
247
|
-
`,
|
|
248
|
-
${
|
|
249
|
-
${
|
|
250
|
-
`;function
|
|
247
|
+
`,et=`
|
|
248
|
+
${Qe}
|
|
249
|
+
${zi}
|
|
250
|
+
`;function tt(t){if(!t||!("extensions"in t))return{};let{filterRange:e=[-1,1],filterEnabled:i=!0,filterTransformSize:r=!0,filterTransformColor:n=!0,categoryBitMask:o}=t,a=t.filterSoftRange||e,s=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:s(e[0]),softMin:s(a[0]),softMax:s(a[1]),max:s(e[1])}:{min:s(e.map(l=>l[0])),softMin:s(a.map(l=>l[0])),softMax:s(a.map(l=>l[1])),max:s(e.map(l=>l[1]))},enabled:i,useSoftMargin:!!t.filterSoftRange,transformSize:i&&r,transformColor:i&&n,...o&&{categoryBitMask:o}}}function Ui(t){if(!t||!("extensions"in t))return{};let e=tt(t),i=e.min.map(Math.fround);e.min=e.min.map((n,o)=>n-i[o]),e.softMin=e.softMin.map((n,o)=>n-i[o]),e.min64High=i;let r=e.max.map(Math.fround);return e.max=e.max.map((n,o)=>n-r[o]),e.softMax=e.softMax.map((n,o)=>n-r[o]),e.max64High=r,e}var it={"vs:#main-start":`
|
|
251
251
|
dataFilter_value = 1.0;
|
|
252
252
|
if (dataFilter.enabled) {
|
|
253
253
|
#ifdef DATAFILTER_TYPE
|
|
@@ -278,7 +278,7 @@ ${fi}
|
|
|
278
278
|
if (dataFilter.transformColor) {
|
|
279
279
|
color.a *= dataFilter_value;
|
|
280
280
|
}
|
|
281
|
-
`};function
|
|
281
|
+
`};function rt(t){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 nt={name:"dataFilter",vs:Je,fs:et,inject:it,getUniforms:tt,uniformTypesFromOptions:rt},ot={name:"dataFilter",vs:Je,fs:et,inject:it,getUniforms:Ui,uniformTypesFromOptions:rt};var lt=_(st(),1),Vi=`#version 300 es
|
|
282
282
|
#define SHADER_NAME data-filter-vertex-shader
|
|
283
283
|
|
|
284
284
|
#ifdef FLOAT_TARGET
|
|
@@ -309,7 +309,7 @@ void main() {
|
|
|
309
309
|
#endif
|
|
310
310
|
gl_PointSize = 1.0;
|
|
311
311
|
}
|
|
312
|
-
`,
|
|
312
|
+
`,ji=`#version 300 es
|
|
313
313
|
#define SHADER_NAME data-filter-fragment-shader
|
|
314
314
|
precision highp float;
|
|
315
315
|
|
|
@@ -323,7 +323,7 @@ void main() {
|
|
|
323
323
|
}
|
|
324
324
|
fragColor = vColor;
|
|
325
325
|
}
|
|
326
|
-
`,pi=["float32-renderable-webgl","texture-blend-float-webgl"];function Ze(i){return pi.every(e=>i.features.has(e))}function $e(i,e){return e?i.createFramebuffer({width:1,height:1,colorAttachments:[i.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):i.createFramebuffer({width:256,height:64,colorAttachments:[i.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function Qe(i,e,t,r){return t.defines.NON_INSTANCED_MODEL=1,r&&(t.defines.FLOAT_TARGET=1),new Ke.Model(i,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:ui,fs:ci,bufferLayout:e,...t})}var Je={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var _i={getFilterValue:{type:"accessor",value:0},getFilterCategory:{type:"accessor",value:0},onFilteredItemsChange:{type:"function",value:null,optional:!0},filterEnabled:!0,filterRange:[-1,1],filterSoftRange:null,filterCategories:[0],filterTransformSize:!0,filterTransformColor:!0},mi={categorySize:0,filterSize:1,fp64:!1,countItems:!1},hi={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},gi={1:"float",2:"vec2",3:"vec3",4:"vec4"},O=class extends E.LayerExtension{constructor(e={}){super({...mi,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:n}=e.opts,o={};t&&(o.DATACATEGORY_TYPE=hi[t],o.DATACATEGORY_CHANNELS=t),r&&(o.DATAFILTER_TYPE=gi[r],o.DATAFILTER_DOUBLE=!!n);let s=n?qe:He;return s.uniformTypes=s.uniformTypesFromOptions(e.opts),{modules:[s],defines:o}}initializeState(e,t){let r=this.getAttributeManager(),{categorySize:n,filterSize:o,fp64:s}=t.opts;r&&(o&&r.add({filterValues:{size:o,type:s?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),n&&r.add({filterCategoryValues:{size:n,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:n===1?f=>t._getCategoryKey.call(this,f,0):f=>f.map((l,c)=>t._getCategoryKey.call(this,l,c))}}));let{device:a}=this.context;if(r&&t.opts.countItems){let f=Ze(a);r.add({filterVertexIndices:{size:f?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:p})=>{let m=u&&u.__source?u.__source.index:p;return f?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let l=$e(a,f),c=Qe(a,r.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),f);this.setState({filterFBO:l,filterModel:c})}}updateState({props:e,oldProps:t,changeFlags:r},n){let o=this.getAttributeManager(),{categorySize:s}=n.opts;if(this.state.filterModel){let a=o.attributes.filterValues?.needsUpdate()||o.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}o?.attributes.filterCategoryValues&&((o.attributes.filterCategoryValues.needsUpdate()||!(0,E._deepEqual)(e.filterCategories,t.filterCategories,2))&&this.setState({categoryBitMask:null}),r.dataChanged&&(this.setState({categoryMap:Array(s).fill(0).map(()=>({}))}),o.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let r=this.state.filterFBO,n=this.state.filterModel,o=this.state.filterNeedsUpdate;this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t);let{onFilteredItemsChange:s,extensions:a,filterEnabled:f,filterRange:l,filterSoftRange:c,filterTransformSize:u,filterTransformColor:p,filterCategories:m}=this.props,h={extensions:a,filterEnabled:f,filterRange:l,filterSoftRange:c,filterTransformSize:u,filterTransformColor:p,filterCategories:m};if(this.state.categoryBitMask&&(h.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:h}),o&&s&&n){let P=this.getAttributeManager(),{attributes:{filterValues:g,filterCategoryValues:B,filterVertexIndices:ce}}=P;n.setVertexCount(this.getNumInstances());let pe={...g?.getValue(),...B?.getValue(),...ce?.getValue()};n.setAttributes(pe),n.shaderInputs.setProps({dataFilter:h});let de=[0,0,r.width,r.height],Ae=n.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:de},clearColor:[0,0,0,0]});n.setParameters(Je),n.draw(Ae),Ae.end();let Se=n.device.readPixelsToArrayWebGL(r),Te=0;for(let _e=0;_e<Se.length;_e++)Te+=Se[_e];s({id:this.id,count:Te}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:r}=t.opts;if(!r)return;let{filterCategories:n}=this.props,o=new Uint32Array([0,0,0,0]),s=r===1?[n]:n,a=r===1?128:r===2?64:32;for(let f=0;f<s.length;f++){let l=s[f];for(let c of l){let u=t._getCategoryKey.call(this,c,f);if(u<a){let p=f*(a/32)+Math.floor(u/32);o[p]+=Math.pow(2,u%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=o}_getCategoryKey(e,t){let r=this.state.categoryMap[t];return e in r||(r[e]=Object.keys(r).length),r[e]}};O.defaultProps=_i;O.extensionName="DataFilterExtension";var Xe=O;var dt=d(_(),1);var tn=1/Math.PI*180,rn=1/180*Math.PI,vi={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...vi}};var w=globalThis.mathgl.config;function me(i){return Array.isArray(i)||ArrayBuffer.isView(i)&&!(i instanceof DataView)}function M(i,e,t){let r=w.EPSILON;t&&(w.EPSILON=t);try{if(i===e)return!0;if(me(i)&&me(e)){if(i.length!==e.length)return!1;for(let n=0;n<i.length;++n)if(!M(i[n],e[n]))return!1;return!0}return i&&i.equals?i.equals(e):e&&e.equals?e.equals(i):typeof i=="number"&&typeof e=="number"?Math.abs(i-e)<=w.EPSILON*Math.max(1,Math.abs(i),Math.abs(e)):!1}finally{w.EPSILON=r}}var I=typeof Float32Array<"u"?Float32Array:Array,he=Math.random;function X(i){return i>=0?Math.round(i):i%.5===0?Math.floor(i):Math.round(i)}var on=Math.PI/180;var ee={};Le(ee,{add:()=>Mi,angle:()=>Yi,bezier:()=>zi,ceil:()=>Fi,clone:()=>bi,copy:()=>Pi,create:()=>et,cross:()=>Ci,dist:()=>tr,distance:()=>ot,div:()=>er,divide:()=>nt,dot:()=>ve,equals:()=>Qi,exactEquals:()=>$i,floor:()=>Ai,forEach:()=>or,fromValues:()=>yi,hermite:()=>Di,inverse:()=>Ii,len:()=>rr,length:()=>tt,lerp:()=>ki,max:()=>Ti,min:()=>Si,mul:()=>Xi,multiply:()=>rt,negate:()=>wi,normalize:()=>Ri,random:()=>Vi,rotateX:()=>Hi,rotateY:()=>qi,rotateZ:()=>Wi,round:()=>Bi,scale:()=>Li,scaleAndAdd:()=>Oi,set:()=>Ei,slerp:()=>Ni,sqrDist:()=>ir,sqrLen:()=>nr,squaredDistance:()=>st,squaredLength:()=>at,str:()=>Zi,sub:()=>Ji,subtract:()=>it,transformMat3:()=>ji,transformMat4:()=>Ui,transformQuat:()=>Gi,zero:()=>Ki});function et(){let i=new I(3);return I!=Float32Array&&(i[0]=0,i[1]=0,i[2]=0),i}function bi(i){let e=new I(3);return e[0]=i[0],e[1]=i[1],e[2]=i[2],e}function tt(i){let e=i[0],t=i[1],r=i[2];return Math.sqrt(e*e+t*t+r*r)}function yi(i,e,t){let r=new I(3);return r[0]=i,r[1]=e,r[2]=t,r}function Pi(i,e){return i[0]=e[0],i[1]=e[1],i[2]=e[2],i}function Ei(i,e,t,r){return i[0]=e,i[1]=t,i[2]=r,i}function Mi(i,e,t){return i[0]=e[0]+t[0],i[1]=e[1]+t[1],i[2]=e[2]+t[2],i}function it(i,e,t){return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],i}function rt(i,e,t){return i[0]=e[0]*t[0],i[1]=e[1]*t[1],i[2]=e[2]*t[2],i}function nt(i,e,t){return i[0]=e[0]/t[0],i[1]=e[1]/t[1],i[2]=e[2]/t[2],i}function Fi(i,e){return i[0]=Math.ceil(e[0]),i[1]=Math.ceil(e[1]),i[2]=Math.ceil(e[2]),i}function Ai(i,e){return i[0]=Math.floor(e[0]),i[1]=Math.floor(e[1]),i[2]=Math.floor(e[2]),i}function Si(i,e,t){return i[0]=Math.min(e[0],t[0]),i[1]=Math.min(e[1],t[1]),i[2]=Math.min(e[2],t[2]),i}function Ti(i,e,t){return i[0]=Math.max(e[0],t[0]),i[1]=Math.max(e[1],t[1]),i[2]=Math.max(e[2],t[2]),i}function Bi(i,e){return i[0]=X(e[0]),i[1]=X(e[1]),i[2]=X(e[2]),i}function Li(i,e,t){return i[0]=e[0]*t,i[1]=e[1]*t,i[2]=e[2]*t,i}function Oi(i,e,t,r){return i[0]=e[0]+t[0]*r,i[1]=e[1]+t[1]*r,i[2]=e[2]+t[2]*r,i}function ot(i,e){let t=e[0]-i[0],r=e[1]-i[1],n=e[2]-i[2];return Math.sqrt(t*t+r*r+n*n)}function st(i,e){let t=e[0]-i[0],r=e[1]-i[1],n=e[2]-i[2];return t*t+r*r+n*n}function at(i){let e=i[0],t=i[1],r=i[2];return e*e+t*t+r*r}function wi(i,e){return i[0]=-e[0],i[1]=-e[1],i[2]=-e[2],i}function Ii(i,e){return i[0]=1/e[0],i[1]=1/e[1],i[2]=1/e[2],i}function Ri(i,e){let t=e[0],r=e[1],n=e[2],o=t*t+r*r+n*n;return o>0&&(o=1/Math.sqrt(o)),i[0]=e[0]*o,i[1]=e[1]*o,i[2]=e[2]*o,i}function ve(i,e){return i[0]*e[0]+i[1]*e[1]+i[2]*e[2]}function Ci(i,e,t){let r=e[0],n=e[1],o=e[2],s=t[0],a=t[1],f=t[2];return i[0]=n*f-o*a,i[1]=o*s-r*f,i[2]=r*a-n*s,i}function ki(i,e,t,r){let n=e[0],o=e[1],s=e[2];return i[0]=n+r*(t[0]-n),i[1]=o+r*(t[1]-o),i[2]=s+r*(t[2]-s),i}function Ni(i,e,t,r){let n=Math.acos(Math.min(Math.max(ve(e,t),-1),1)),o=Math.sin(n),s=Math.sin((1-r)*n)/o,a=Math.sin(r*n)/o;return i[0]=s*e[0]+a*t[0],i[1]=s*e[1]+a*t[1],i[2]=s*e[2]+a*t[2],i}function Di(i,e,t,r,n,o){let s=o*o,a=s*(2*o-3)+1,f=s*(o-2)+o,l=s*(o-1),c=s*(3-2*o);return i[0]=e[0]*a+t[0]*f+r[0]*l+n[0]*c,i[1]=e[1]*a+t[1]*f+r[1]*l+n[1]*c,i[2]=e[2]*a+t[2]*f+r[2]*l+n[2]*c,i}function zi(i,e,t,r,n,o){let s=1-o,a=s*s,f=o*o,l=a*s,c=3*o*a,u=3*f*s,p=f*o;return i[0]=e[0]*l+t[0]*c+r[0]*u+n[0]*p,i[1]=e[1]*l+t[1]*c+r[1]*u+n[1]*p,i[2]=e[2]*l+t[2]*c+r[2]*u+n[2]*p,i}function Vi(i,e){e=e===void 0?1:e;let t=he()*2*Math.PI,r=he()*2-1,n=Math.sqrt(1-r*r)*e;return i[0]=Math.cos(t)*n,i[1]=Math.sin(t)*n,i[2]=r*e,i}function Ui(i,e,t){let r=e[0],n=e[1],o=e[2],s=t[3]*r+t[7]*n+t[11]*o+t[15];return s=s||1,i[0]=(t[0]*r+t[4]*n+t[8]*o+t[12])/s,i[1]=(t[1]*r+t[5]*n+t[9]*o+t[13])/s,i[2]=(t[2]*r+t[6]*n+t[10]*o+t[14])/s,i}function ji(i,e,t){let r=e[0],n=e[1],o=e[2];return i[0]=r*t[0]+n*t[3]+o*t[6],i[1]=r*t[1]+n*t[4]+o*t[7],i[2]=r*t[2]+n*t[5]+o*t[8],i}function Gi(i,e,t){let r=t[0],n=t[1],o=t[2],s=t[3],a=e[0],f=e[1],l=e[2],c=n*l-o*f,u=o*a-r*l,p=r*f-n*a,m=n*p-o*u,h=o*c-r*p,P=r*u-n*c,g=s*2;return c*=g,u*=g,p*=g,m*=2,h*=2,P*=2,i[0]=a+c+m,i[1]=f+u+h,i[2]=l+p+P,i}function Hi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[0],o[1]=n[1]*Math.cos(r)-n[2]*Math.sin(r),o[2]=n[1]*Math.sin(r)+n[2]*Math.cos(r),i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function qi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[2]*Math.sin(r)+n[0]*Math.cos(r),o[1]=n[1],o[2]=n[2]*Math.cos(r)-n[0]*Math.sin(r),i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function Wi(i,e,t,r){let n=[],o=[];return n[0]=e[0]-t[0],n[1]=e[1]-t[1],n[2]=e[2]-t[2],o[0]=n[0]*Math.cos(r)-n[1]*Math.sin(r),o[1]=n[0]*Math.sin(r)+n[1]*Math.cos(r),o[2]=n[2],i[0]=o[0]+t[0],i[1]=o[1]+t[1],i[2]=o[2]+t[2],i}function Yi(i,e){let t=i[0],r=i[1],n=i[2],o=e[0],s=e[1],a=e[2],f=Math.sqrt((t*t+r*r+n*n)*(o*o+s*s+a*a)),l=f&&ve(i,e)/f;return Math.acos(Math.min(Math.max(l,-1),1))}function Ki(i){return i[0]=0,i[1]=0,i[2]=0,i}function Zi(i){return`vec3(${i[0]}, ${i[1]}, ${i[2]})`}function $i(i,e){return i[0]===e[0]&&i[1]===e[1]&&i[2]===e[2]}function Qi(i,e){let t=i[0],r=i[1],n=i[2],o=e[0],s=e[1],a=e[2];return Math.abs(t-o)<=1e-6*Math.max(1,Math.abs(t),Math.abs(o))&&Math.abs(r-s)<=1e-6*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(n-a)<=1e-6*Math.max(1,Math.abs(n),Math.abs(a))}var Ji=it,Xi=rt,er=nt,tr=ot,ir=st,rr=tt,nr=at,or=(function(){let i=et();return function(e,t,r,n,o,s){let a,f;for(t||(t=3),r||(r=0),n?f=Math.min(n*t+r,e.length):f=e.length,a=r;a<f;a+=t)i[0]=e[a],i[1]=e[a+1],i[2]=e[a+2],o(i,i,s),e[a]=i[0],e[a+1]=i[1],e[a+2]=i[2];return e}})();function te(i,e=[],t=0){let r=Math.fround(i),n=i-r;return e[t]=r,e[t+1]=n,e}function xe(i){return i-Math.fround(i)}function be(i){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let r=0;r<4;++r){let n=t*4+r;te(i[r*4+t],e,n*2)}return e}var ye=`
|
|
326
|
+
`,Hi=["float32-renderable-webgl","texture-blend-float-webgl"];function ft(t){return Hi.every(e=>t.features.has(e))}function ct(t,e){return e?t.createFramebuffer({width:1,height:1,colorAttachments:[t.createTexture({format:"rgba32float",dimension:"2d",width:1,height:1})]}):t.createFramebuffer({width:256,height:64,colorAttachments:[t.createTexture({format:"rgba8unorm",dimension:"2d",width:256,height:64})]})}function ut(t,e,i,r){return i.defines.NON_INSTANCED_MODEL=1,r&&(i.defines.FLOAT_TARGET=1),new lt.Model(t,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",disableWarnings:!0,vs:Vi,fs:ji,bufferLayout:e,...i})}var dt={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var qi={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},Wi={categorySize:0,filterSize:1,fp64:!1,countItems:!1},Yi={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},Ki={1:"float",2:"vec2",3:"vec3",4:"vec4"},W=class extends D.LayerExtension{constructor(e={}){super({...Wi,...e})}getShaders(e){let{categorySize:i,filterSize:r,fp64:n}=e.opts,o={};i&&(o.DATACATEGORY_TYPE=Yi[i],o.DATACATEGORY_CHANNELS=i),r&&(o.DATAFILTER_TYPE=Ki[r],o.DATAFILTER_DOUBLE=!!n);let a=n?ot:nt;return a.uniformTypes=a.uniformTypesFromOptions(e.opts),{modules:[a],defines:o}}initializeState(e,i){let r=this.getAttributeManager(),{categorySize:n,filterSize:o,fp64:a}=i.opts;r&&(o&&r.add({filterValues:{size:o,type:a?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),n&&r.add({filterCategoryValues:{size:n,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:n===1?l=>i._getCategoryKey.call(this,l,0):l=>l.map((f,c)=>i._getCategoryKey.call(this,f,c))}}));let{device:s}=this.context;if(r&&i.opts.countItems){let l=ft(s);r.add({filterVertexIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:d})=>{let p=u&&u.__source?u.__source.index:d;return l?(p+1)%255:[(p+1)%255,Math.floor(p/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let f=ct(s,l),c=ut(s,r.getBufferLayouts({isInstanced:!1}),i.getShaders.call(this,i),l);this.setState({filterFBO:f,filterModel:c})}}updateState({props:e,oldProps:i,changeFlags:r},n){let o=this.getAttributeManager(),{categorySize:a}=n.opts;if(this.state.filterModel){let s=o.attributes.filterValues?.needsUpdate()||o.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==i.filterEnabled||e.filterRange!==i.filterRange||e.filterSoftRange!==i.filterSoftRange||e.filterCategories!==i.filterCategories;s&&this.setState({filterNeedsUpdate:s})}o?.attributes.filterCategoryValues&&((o.attributes.filterCategoryValues.needsUpdate()||!(0,D._deepEqual)(e.filterCategories,i.filterCategories,2))&&this.setState({categoryBitMask:null}),r.dataChanged&&(this.setState({categoryMap:Array(a).fill(0).map(()=>({}))}),o.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,i){let r=this.state.filterFBO,n=this.state.filterModel,o=this.state.filterNeedsUpdate;this.state.categoryBitMask||i._updateCategoryBitMask.call(this,e,i);let{onFilteredItemsChange:a,extensions:s,filterEnabled:l,filterRange:f,filterSoftRange:c,filterTransformSize:u,filterTransformColor:d,filterCategories:p}=this.props,m={extensions:s,filterEnabled:l,filterRange:f,filterSoftRange:c,filterTransformSize:u,filterTransformColor:d,filterCategories:p};if(this.state.categoryBitMask&&(m.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:m}),o&&a&&n){let F=this.getAttributeManager(),{attributes:{filterValues:v,filterCategoryValues:O,filterVertexIndices:R}}=F;n.setVertexCount(this.getNumInstances());let P={...v?.getValue(),...O?.getValue(),...R?.getValue()};n.setAttributes(P),n.shaderInputs.setProps({dataFilter:m});let k=[0,0,r.width,r.height],G=n.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:k},clearColor:[0,0,0,0]});n.setParameters(dt),n.draw(G),G.end();let x=n.device.readPixelsToArrayWebGL(r),A=0;for(let N=0;N<x.length;N++)A+=x[N];a({id:this.id,count:A}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,i=this.state.filterModel;e?.destroy(),i?.destroy()}_updateCategoryBitMask(e,i){let{categorySize:r}=i.opts;if(!r)return;let{filterCategories:n}=this.props,o=new Uint32Array([0,0,0,0]),a=r===1?[n]:n,s=r===1?128:r===2?64:32;for(let l=0;l<a.length;l++){let f=a[l];for(let c of f){let u=i._getCategoryKey.call(this,c,l);if(u<s){let d=l*(s/32)+Math.floor(u/32);o[d]+=Math.pow(2,u%32)}else D.log.warn(`Exceeded maximum number of categories (${s})`)()}}this.state.categoryBitMask=o}_getCategoryKey(e,i){let r=this.state.categoryMap[i];return e in r||(r[e]=Object.keys(r).length),r[e]}};W.defaultProps=qi;W.extensionName="DataFilterExtension";var pt=W;var kt=_(h(),1);var Po=1/Math.PI*180,Eo=1/180*Math.PI,Zi={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Zi}};var Y=globalThis.mathgl.config;function Fe(t){return Array.isArray(t)||ArrayBuffer.isView(t)&&!(t instanceof DataView)}function z(t,e,i){let r=Y.EPSILON;i&&(Y.EPSILON=i);try{if(t===e)return!0;if(Fe(t)&&Fe(e)){if(t.length!==e.length)return!1;for(let n=0;n<t.length;++n)if(!z(t[n],e[n]))return!1;return!0}return t&&t.equals?t.equals(e):e&&e.equals?e.equals(t):typeof t=="number"&&typeof e=="number"?Math.abs(t-e)<=Y.EPSILON*Math.max(1,Math.abs(t),Math.abs(e)):!1}finally{Y.EPSILON=r}}var M=typeof Float32Array<"u"?Float32Array:Array,w=Math.random;function S(t){return t>=0?Math.round(t):t%.5===0?Math.floor(t):Math.round(t)}var Ao=Math.PI/180;var L={};Le(L,{add:()=>er,angle:()=>Er,bezier:()=>hr,ceil:()=>tr,clone:()=>$i,copy:()=>Qi,create:()=>ht,cross:()=>ur,dist:()=>Br,distance:()=>bt,div:()=>Or,divide:()=>xt,dot:()=>Oe,equals:()=>Sr,exactEquals:()=>Tr,floor:()=>ir,forEach:()=>Rr,fromValues:()=>Xi,hermite:()=>_r,inverse:()=>fr,len:()=>Ir,length:()=>mt,lerp:()=>dr,max:()=>nr,min:()=>rr,mul:()=>Fr,multiply:()=>vt,negate:()=>lr,normalize:()=>cr,random:()=>mr,rotateX:()=>br,rotateY:()=>yr,rotateZ:()=>Pr,round:()=>or,scale:()=>ar,scaleAndAdd:()=>sr,set:()=>Ji,slerp:()=>pr,sqrDist:()=>wr,sqrLen:()=>Cr,squaredDistance:()=>yt,squaredLength:()=>Pt,str:()=>Ar,sub:()=>Lr,subtract:()=>gt,transformMat3:()=>vr,transformMat4:()=>gr,transformQuat:()=>xr,zero:()=>Mr});function ht(){let t=new M(3);return M!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function $i(t){let e=new M(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}function mt(t){let e=t[0],i=t[1],r=t[2];return Math.sqrt(e*e+i*i+r*r)}function Xi(t,e,i){let r=new M(3);return r[0]=t,r[1]=e,r[2]=i,r}function Qi(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function Ji(t,e,i,r){return t[0]=e,t[1]=i,t[2]=r,t}function er(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2],t}function gt(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t[2]=e[2]-i[2],t}function vt(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t[2]=e[2]*i[2],t}function xt(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t[2]=e[2]/i[2],t}function tr(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t}function ir(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t}function rr(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t[2]=Math.min(e[2],i[2]),t}function nr(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t[2]=Math.max(e[2],i[2]),t}function or(t,e){return t[0]=S(e[0]),t[1]=S(e[1]),t[2]=S(e[2]),t}function ar(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i,t}function sr(t,e,i,r){return t[0]=e[0]+i[0]*r,t[1]=e[1]+i[1]*r,t[2]=e[2]+i[2]*r,t}function bt(t,e){let i=e[0]-t[0],r=e[1]-t[1],n=e[2]-t[2];return Math.sqrt(i*i+r*r+n*n)}function yt(t,e){let i=e[0]-t[0],r=e[1]-t[1],n=e[2]-t[2];return i*i+r*r+n*n}function Pt(t){let e=t[0],i=t[1],r=t[2];return e*e+i*i+r*r}function lr(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t}function fr(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t}function cr(t,e){let i=e[0],r=e[1],n=e[2],o=i*i+r*r+n*n;return o>0&&(o=1/Math.sqrt(o)),t[0]=e[0]*o,t[1]=e[1]*o,t[2]=e[2]*o,t}function Oe(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function ur(t,e,i){let r=e[0],n=e[1],o=e[2],a=i[0],s=i[1],l=i[2];return t[0]=n*l-o*s,t[1]=o*a-r*l,t[2]=r*s-n*a,t}function dr(t,e,i,r){let n=e[0],o=e[1],a=e[2];return t[0]=n+r*(i[0]-n),t[1]=o+r*(i[1]-o),t[2]=a+r*(i[2]-a),t}function pr(t,e,i,r){let n=Math.acos(Math.min(Math.max(Oe(e,i),-1),1)),o=Math.sin(n),a=Math.sin((1-r)*n)/o,s=Math.sin(r*n)/o;return t[0]=a*e[0]+s*i[0],t[1]=a*e[1]+s*i[1],t[2]=a*e[2]+s*i[2],t}function _r(t,e,i,r,n,o){let a=o*o,s=a*(2*o-3)+1,l=a*(o-2)+o,f=a*(o-1),c=a*(3-2*o);return t[0]=e[0]*s+i[0]*l+r[0]*f+n[0]*c,t[1]=e[1]*s+i[1]*l+r[1]*f+n[1]*c,t[2]=e[2]*s+i[2]*l+r[2]*f+n[2]*c,t}function hr(t,e,i,r,n,o){let a=1-o,s=a*a,l=o*o,f=s*a,c=3*o*s,u=3*l*a,d=l*o;return t[0]=e[0]*f+i[0]*c+r[0]*u+n[0]*d,t[1]=e[1]*f+i[1]*c+r[1]*u+n[1]*d,t[2]=e[2]*f+i[2]*c+r[2]*u+n[2]*d,t}function mr(t,e){e=e===void 0?1:e;let i=w()*2*Math.PI,r=w()*2-1,n=Math.sqrt(1-r*r)*e;return t[0]=Math.cos(i)*n,t[1]=Math.sin(i)*n,t[2]=r*e,t}function gr(t,e,i){let r=e[0],n=e[1],o=e[2],a=i[3]*r+i[7]*n+i[11]*o+i[15];return a=a||1,t[0]=(i[0]*r+i[4]*n+i[8]*o+i[12])/a,t[1]=(i[1]*r+i[5]*n+i[9]*o+i[13])/a,t[2]=(i[2]*r+i[6]*n+i[10]*o+i[14])/a,t}function vr(t,e,i){let r=e[0],n=e[1],o=e[2];return t[0]=r*i[0]+n*i[3]+o*i[6],t[1]=r*i[1]+n*i[4]+o*i[7],t[2]=r*i[2]+n*i[5]+o*i[8],t}function xr(t,e,i){let r=i[0],n=i[1],o=i[2],a=i[3],s=e[0],l=e[1],f=e[2],c=n*f-o*l,u=o*s-r*f,d=r*l-n*s,p=n*d-o*u,m=o*c-r*d,F=r*u-n*c,v=a*2;return c*=v,u*=v,d*=v,p*=2,m*=2,F*=2,t[0]=s+c+p,t[1]=l+u+m,t[2]=f+d+F,t}function br(t,e,i,r){let n=[],o=[];return n[0]=e[0]-i[0],n[1]=e[1]-i[1],n[2]=e[2]-i[2],o[0]=n[0],o[1]=n[1]*Math.cos(r)-n[2]*Math.sin(r),o[2]=n[1]*Math.sin(r)+n[2]*Math.cos(r),t[0]=o[0]+i[0],t[1]=o[1]+i[1],t[2]=o[2]+i[2],t}function yr(t,e,i,r){let n=[],o=[];return n[0]=e[0]-i[0],n[1]=e[1]-i[1],n[2]=e[2]-i[2],o[0]=n[2]*Math.sin(r)+n[0]*Math.cos(r),o[1]=n[1],o[2]=n[2]*Math.cos(r)-n[0]*Math.sin(r),t[0]=o[0]+i[0],t[1]=o[1]+i[1],t[2]=o[2]+i[2],t}function Pr(t,e,i,r){let n=[],o=[];return n[0]=e[0]-i[0],n[1]=e[1]-i[1],n[2]=e[2]-i[2],o[0]=n[0]*Math.cos(r)-n[1]*Math.sin(r),o[1]=n[0]*Math.sin(r)+n[1]*Math.cos(r),o[2]=n[2],t[0]=o[0]+i[0],t[1]=o[1]+i[1],t[2]=o[2]+i[2],t}function Er(t,e){let i=t[0],r=t[1],n=t[2],o=e[0],a=e[1],s=e[2],l=Math.sqrt((i*i+r*r+n*n)*(o*o+a*a+s*s)),f=l&&Oe(t,e)/l;return Math.acos(Math.min(Math.max(f,-1),1))}function Mr(t){return t[0]=0,t[1]=0,t[2]=0,t}function Ar(t){return`vec3(${t[0]}, ${t[1]}, ${t[2]})`}function Tr(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]}function Sr(t,e){let i=t[0],r=t[1],n=t[2],o=e[0],a=e[1],s=e[2];return Math.abs(i-o)<=1e-6*Math.max(1,Math.abs(i),Math.abs(o))&&Math.abs(r-a)<=1e-6*Math.max(1,Math.abs(r),Math.abs(a))&&Math.abs(n-s)<=1e-6*Math.max(1,Math.abs(n),Math.abs(s))}var Lr=gt,Fr=vt,Or=xt,Br=bt,wr=yt,Ir=mt,Cr=Pt,Rr=(function(){let t=ht();return function(e,i,r,n,o,a){let s,l;for(i||(i=3),r||(r=0),n?l=Math.min(n*i+r,e.length):l=e.length,s=r;s<l;s+=i)t[0]=e[s],t[1]=e[s+1],t[2]=e[s+2],o(t,t,a),e[s]=t[0],e[s+1]=t[1],e[s+2]=t[2];return e}})();var pe={};Le(pe,{add:()=>Ur,ceil:()=>Vr,clone:()=>kr,copy:()=>Dr,create:()=>Et,cross:()=>Qr,dist:()=>un,distance:()=>St,div:()=>cn,divide:()=>Tt,dot:()=>Xr,equals:()=>sn,exactEquals:()=>an,floor:()=>jr,forEach:()=>hn,fromValues:()=>Nr,inverse:()=>Zr,len:()=>pn,length:()=>Ft,lerp:()=>Jr,max:()=>Gr,min:()=>Hr,mul:()=>fn,multiply:()=>At,negate:()=>Kr,normalize:()=>$r,random:()=>en,round:()=>qr,scale:()=>Wr,scaleAndAdd:()=>Yr,set:()=>zr,sqrDist:()=>dn,sqrLen:()=>_n,squaredDistance:()=>Lt,squaredLength:()=>Ot,str:()=>on,sub:()=>ln,subtract:()=>Mt,transformMat4:()=>tn,transformQuat:()=>rn,zero:()=>nn});function Et(){let t=new M(4);return M!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function kr(t){let e=new M(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}function Nr(t,e,i,r){let n=new M(4);return n[0]=t,n[1]=e,n[2]=i,n[3]=r,n}function Dr(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function zr(t,e,i,r,n){return t[0]=e,t[1]=i,t[2]=r,t[3]=n,t}function Ur(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2],t[3]=e[3]+i[3],t}function Mt(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t[2]=e[2]-i[2],t[3]=e[3]-i[3],t}function At(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t[2]=e[2]*i[2],t[3]=e[3]*i[3],t}function Tt(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t[2]=e[2]/i[2],t[3]=e[3]/i[3],t}function Vr(t,e){return t[0]=Math.ceil(e[0]),t[1]=Math.ceil(e[1]),t[2]=Math.ceil(e[2]),t[3]=Math.ceil(e[3]),t}function jr(t,e){return t[0]=Math.floor(e[0]),t[1]=Math.floor(e[1]),t[2]=Math.floor(e[2]),t[3]=Math.floor(e[3]),t}function Hr(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t[2]=Math.min(e[2],i[2]),t[3]=Math.min(e[3],i[3]),t}function Gr(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t[2]=Math.max(e[2],i[2]),t[3]=Math.max(e[3],i[3]),t}function qr(t,e){return t[0]=S(e[0]),t[1]=S(e[1]),t[2]=S(e[2]),t[3]=S(e[3]),t}function Wr(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t[2]=e[2]*i,t[3]=e[3]*i,t}function Yr(t,e,i,r){return t[0]=e[0]+i[0]*r,t[1]=e[1]+i[1]*r,t[2]=e[2]+i[2]*r,t[3]=e[3]+i[3]*r,t}function St(t,e){let i=e[0]-t[0],r=e[1]-t[1],n=e[2]-t[2],o=e[3]-t[3];return Math.sqrt(i*i+r*r+n*n+o*o)}function Lt(t,e){let i=e[0]-t[0],r=e[1]-t[1],n=e[2]-t[2],o=e[3]-t[3];return i*i+r*r+n*n+o*o}function Ft(t){let e=t[0],i=t[1],r=t[2],n=t[3];return Math.sqrt(e*e+i*i+r*r+n*n)}function Ot(t){let e=t[0],i=t[1],r=t[2],n=t[3];return e*e+i*i+r*r+n*n}function Kr(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}function Zr(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}function $r(t,e){let i=e[0],r=e[1],n=e[2],o=e[3],a=i*i+r*r+n*n+o*o;return a>0&&(a=1/Math.sqrt(a)),t[0]=i*a,t[1]=r*a,t[2]=n*a,t[3]=o*a,t}function Xr(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}function Qr(t,e,i,r){let n=i[0]*r[1]-i[1]*r[0],o=i[0]*r[2]-i[2]*r[0],a=i[0]*r[3]-i[3]*r[0],s=i[1]*r[2]-i[2]*r[1],l=i[1]*r[3]-i[3]*r[1],f=i[2]*r[3]-i[3]*r[2],c=e[0],u=e[1],d=e[2],p=e[3];return t[0]=u*f-d*l+p*s,t[1]=-(c*f)+d*a-p*o,t[2]=c*l-u*a+p*n,t[3]=-(c*s)+u*o-d*n,t}function Jr(t,e,i,r){let n=e[0],o=e[1],a=e[2],s=e[3];return t[0]=n+r*(i[0]-n),t[1]=o+r*(i[1]-o),t[2]=a+r*(i[2]-a),t[3]=s+r*(i[3]-s),t}function en(t,e){e=e===void 0?1:e;let i,r,n,o,a,s;do i=w()*2-1,r=w()*2-1,a=i*i+r*r;while(a>=1);do n=w()*2-1,o=w()*2-1,s=n*n+o*o;while(s>=1);let l=Math.sqrt((1-a)/s);return t[0]=e*i,t[1]=e*r,t[2]=e*n*l,t[3]=e*o*l,t}function tn(t,e,i){let r=e[0],n=e[1],o=e[2],a=e[3];return t[0]=i[0]*r+i[4]*n+i[8]*o+i[12]*a,t[1]=i[1]*r+i[5]*n+i[9]*o+i[13]*a,t[2]=i[2]*r+i[6]*n+i[10]*o+i[14]*a,t[3]=i[3]*r+i[7]*n+i[11]*o+i[15]*a,t}function rn(t,e,i){let r=e[0],n=e[1],o=e[2],a=i[0],s=i[1],l=i[2],f=i[3],c=f*r+s*o-l*n,u=f*n+l*r-a*o,d=f*o+a*n-s*r,p=-a*r-s*n-l*o;return t[0]=c*f+p*-a+u*-l-d*-s,t[1]=u*f+p*-s+d*-a-c*-l,t[2]=d*f+p*-l+c*-s-u*-a,t[3]=e[3],t}function nn(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}function on(t){return`vec4(${t[0]}, ${t[1]}, ${t[2]}, ${t[3]})`}function an(t,e){return t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]}function sn(t,e){let i=t[0],r=t[1],n=t[2],o=t[3],a=e[0],s=e[1],l=e[2],f=e[3];return Math.abs(i-a)<=1e-6*Math.max(1,Math.abs(i),Math.abs(a))&&Math.abs(r-s)<=1e-6*Math.max(1,Math.abs(r),Math.abs(s))&&Math.abs(n-l)<=1e-6*Math.max(1,Math.abs(n),Math.abs(l))&&Math.abs(o-f)<=1e-6*Math.max(1,Math.abs(o),Math.abs(f))}var ln=Mt,fn=At,cn=Tt,un=St,dn=Lt,pn=Ft,_n=Ot,hn=(function(){let t=Et();return function(e,i,r,n,o,a){let s,l;for(i||(i=4),r||(r=0),n?l=Math.min(n*i+r,e.length):l=e.length,s=r;s<l;s+=i)t[0]=e[s],t[1]=e[s+1],t[2]=e[s+2],t[3]=e[s+3],o(t,t,a),e[s]=t[0],e[s+1]=t[1],e[s+2]=t[2],e[s+3]=t[3];return e}})();function _e(t,e=[],i=0){let r=Math.fround(t),n=t-r;return e[i]=r,e[i+1]=n,e}function Be(t){return t-Math.fround(t)}function we(t){let e=new Float32Array(32);for(let i=0;i<4;++i)for(let r=0;r<4;++r){let n=i*4+r;_e(t[r*4+i],e,n*2)}return e}var Ie=`
|
|
327
327
|
layout(std140) uniform fp64arithmeticUniforms {
|
|
328
328
|
uniform float ONE;
|
|
329
329
|
uniform float SPLIT;
|
|
@@ -522,7 +522,7 @@ vec2 sqrt_fp64(vec2 a) {
|
|
|
522
522
|
return sum_fp64(vec2(yn, 0.0), prod);
|
|
523
523
|
#endif
|
|
524
524
|
}
|
|
525
|
-
`;var
|
|
525
|
+
`;var Bt=`struct Fp64F32Bits {
|
|
526
526
|
sign: u32,
|
|
527
527
|
baseExponent: i32,
|
|
528
528
|
significand: u32,
|
|
@@ -972,7 +972,7 @@ fn sqrt_fp64(a: vec2f) -> vec2f {
|
|
|
972
972
|
return fp64_scale_fp64_integer(normalizedRoot, evenExponent / 2);
|
|
973
973
|
}
|
|
974
974
|
#endif
|
|
975
|
-
`;var
|
|
975
|
+
`;var wt=`struct Fp64ArithmeticUniforms {
|
|
976
976
|
ONE: f32,
|
|
977
977
|
SPLIT: f32,
|
|
978
978
|
};
|
|
@@ -1595,7 +1595,7 @@ fn prevent_fp64_optimization(value: f32) -> f32 {
|
|
|
1595
1595
|
#endif
|
|
1596
1596
|
|
|
1597
1597
|
#ifdef LUMA_FP64_INTEGER_ARITHMETIC
|
|
1598
|
-
${
|
|
1598
|
+
${Bt}
|
|
1599
1599
|
#else
|
|
1600
1600
|
fn split(a: f32) -> vec2f {
|
|
1601
1601
|
let splitValue = prevent_fp64_optimization(fp64arithmetic.SPLIT + fp64_runtime_zero());
|
|
@@ -1871,7 +1871,7 @@ fn compare_fp64(a: vec2f, b: vec2f) -> i32 {
|
|
|
1871
1871
|
return fp64_compare_f32_bits(aLowBits, bLowBits);
|
|
1872
1872
|
}
|
|
1873
1873
|
#endif
|
|
1874
|
-
`;var
|
|
1874
|
+
`;var It=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
|
|
1875
1875
|
const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
|
|
1876
1876
|
const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
|
|
1877
1877
|
const vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);
|
|
@@ -2540,7 +2540,7 @@ void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
|
|
|
2540
2540
|
vec4_dot_fp64(a, tmp, out_val[i]);
|
|
2541
2541
|
}
|
|
2542
2542
|
}
|
|
2543
|
-
`;var
|
|
2543
|
+
`;var mn={ONE:1,SPLIT:4097},Ct={name:"fp64arithmetic",source:wt,fs:Ie,vs:Ie,defaultUniforms:mn,uniformTypes:{ONE:"f32",SPLIT:"f32"},fp64ify:_e,fp64LowPart:Be,fp64ifyMatrix4:we},he={name:"fp64",vs:It,dependencies:[Ct],fp64ify:_e,fp64LowPart:Be,fp64ifyMatrix4:we};var me=_(h(),1);var Rt=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
|
|
2544
2544
|
layout(std140) uniform project64Uniforms {
|
|
2545
2545
|
vec2 scale;
|
|
2546
2546
|
mat4 viewProjectionMatrix;
|
|
@@ -2613,59 +2613,154 @@ return project_position_to_clipspace(
|
|
|
2613
2613
|
position, position64xyLow, offset, commonPosition
|
|
2614
2614
|
);
|
|
2615
2615
|
}
|
|
2616
|
-
`;var{fp64ify:
|
|
2616
|
+
`;var{fp64ify:gn,fp64ifyMatrix4:vn}=he,ge={name:"project64",dependencies:[me.project,he],vs:Rt,getUniforms:bn,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},xn=(0,me._memoize)(yn);function bn(t){if(t&&"viewport"in t){let{viewProjectionMatrix:e,scale:i}=t.viewport;return xn({viewProjectionMatrix:e,scale:i})}return{}}function yn({viewProjectionMatrix:t,scale:e}){let i=vn(t),r=new Float32Array(16),n=new Float32Array(16);for(let o=0;o<4;o++)for(let a=0;a<4;a++){let s=4*o+a,l=4*a+o;r[l]=i[2*s],n[l]=i[2*s+1]}return{scale:gn(e),viewProjectionMatrix:[...r],viewProjectionMatrix64Low:[...n]}}var ve=class extends kt.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!=="lnglat"&&e!=="default")throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[ge]}}draw(e,i){let{viewport:r}=e.context;this.setShaderModuleProps({project64:{viewport:r}})}};ve.extensionName="Fp64Extension";var Nt=ve;var b=_(h(),1);var Dt={inject:{"vs:#decl":`
|
|
2617
2617
|
in vec2 instanceDashArrays;
|
|
2618
2618
|
#ifdef HIGH_PRECISION_DASH
|
|
2619
|
-
in
|
|
2619
|
+
in vec2 instanceDashOffsets;
|
|
2620
2620
|
#endif
|
|
2621
2621
|
out vec2 vDashArray;
|
|
2622
2622
|
out float vDashOffset;
|
|
2623
|
+
out float vDashPathLength;
|
|
2624
|
+
layout(std140) uniform pathStyleUniforms {
|
|
2625
|
+
float dashAlignMode;
|
|
2626
|
+
bool dashGapPickable;
|
|
2627
|
+
highp int dashUnits;
|
|
2628
|
+
} pathStyle;
|
|
2623
2629
|
`,"vs:#main-end":`
|
|
2624
|
-
|
|
2630
|
+
float dashWidthPixels = path.billboard
|
|
2631
|
+
? width.x * project.focalDistance
|
|
2632
|
+
: width.x * project.scale;
|
|
2633
|
+
float strokeHalfWidthPixels = path.billboard ? width.x : width.x * project.scale;
|
|
2634
|
+
float dashUnitPixels = strokeHalfWidthPixels;
|
|
2635
|
+
if (pathStyle.dashUnits == 1) {
|
|
2636
|
+
dashUnitPixels = 1.0;
|
|
2637
|
+
} else if (pathStyle.dashUnits == 2) {
|
|
2638
|
+
dashUnitPixels = project_size_to_pixel(1.0);
|
|
2639
|
+
} else if (pathStyle.dashUnits == 3) {
|
|
2640
|
+
dashUnitPixels = project.scale;
|
|
2641
|
+
}
|
|
2642
|
+
vDashArray = instanceDashArrays * (dashUnitPixels / dashWidthPixels);
|
|
2625
2643
|
#ifdef HIGH_PRECISION_DASH
|
|
2626
|
-
|
|
2644
|
+
vec2 dashOffsetAndLength = (instanceDashOffsets * project.scale) / dashWidthPixels;
|
|
2645
|
+
vDashPathLength = dashOffsetAndLength.y;
|
|
2646
|
+
float dashUnitLength = vDashArray.x + vDashArray.y;
|
|
2647
|
+
float dashPeriod = pathStyle.dashAlignMode == 0.0
|
|
2648
|
+
? dashUnitLength
|
|
2649
|
+
: vDashPathLength / max(round(vDashPathLength / max(dashUnitLength, 0.0001)), 1.0);
|
|
2650
|
+
vDashOffset = dashPeriod > 0.0 ? mod(dashOffsetAndLength.x, dashPeriod) : 0.0;
|
|
2627
2651
|
#else
|
|
2628
2652
|
vDashOffset = 0.0;
|
|
2653
|
+
vDashPathLength = 0.0;
|
|
2629
2654
|
#endif
|
|
2630
2655
|
`,"fs:#decl":`
|
|
2631
2656
|
layout(std140) uniform pathStyleUniforms {
|
|
2632
2657
|
float dashAlignMode;
|
|
2633
2658
|
bool dashGapPickable;
|
|
2659
|
+
highp int dashUnits;
|
|
2634
2660
|
} pathStyle;
|
|
2635
2661
|
in vec2 vDashArray;
|
|
2636
2662
|
in float vDashOffset;
|
|
2663
|
+
in float vDashPathLength;
|
|
2664
|
+
float dashPatternIntegral(float position, float solidLength, float unitLength) {
|
|
2665
|
+
return floor(position / unitLength) * solidLength +
|
|
2666
|
+
min(mod(position, unitLength), solidLength);
|
|
2667
|
+
}
|
|
2668
|
+
float dashPatternCoverage(
|
|
2669
|
+
float position,
|
|
2670
|
+
float solidLength,
|
|
2671
|
+
float unitLength,
|
|
2672
|
+
float filterWidth
|
|
2673
|
+
) {
|
|
2674
|
+
float halfFilter = 0.5 * filterWidth;
|
|
2675
|
+
float reducedPosition = mod(position, unitLength);
|
|
2676
|
+
return (dashPatternIntegral(reducedPosition + halfFilter, solidLength, unitLength) -
|
|
2677
|
+
dashPatternIntegral(reducedPosition - halfFilter, solidLength, unitLength)) / filterWidth;
|
|
2678
|
+
}
|
|
2637
2679
|
`,"fs:#main-start":`
|
|
2680
|
+
float dashCoverage = 1.0;
|
|
2681
|
+
bool shouldDiscardDash = false;
|
|
2682
|
+
bool inRoundedDashGap = false;
|
|
2683
|
+
float roundedDashResolvedCoverage = 1.0;
|
|
2684
|
+
float roundedDashSubPixelBlend = 0.0;
|
|
2685
|
+
float roundedDashDutyCycle = 1.0;
|
|
2638
2686
|
float solidLength = vDashArray.x;
|
|
2639
2687
|
float gapLength = vDashArray.y;
|
|
2640
2688
|
float unitLength = solidLength + gapLength;
|
|
2689
|
+
if (unitLength > 0.0 && gapLength > 0.0) {
|
|
2641
2690
|
float offset;
|
|
2642
|
-
if (unitLength > 0.0) {
|
|
2643
2691
|
if (pathStyle.dashAlignMode == 0.0) {
|
|
2644
2692
|
offset = vDashOffset;
|
|
2645
2693
|
} else {
|
|
2646
|
-
|
|
2694
|
+
#ifdef HIGH_PRECISION_DASH
|
|
2695
|
+
unitLength = vDashPathLength / max(round(vDashPathLength / unitLength), 1.0);
|
|
2696
|
+
#else
|
|
2697
|
+
unitLength = vPathLength / max(round(vPathLength / unitLength), 1.0);
|
|
2698
|
+
#endif
|
|
2699
|
+
solidLength = min(solidLength, unitLength);
|
|
2647
2700
|
offset = solidLength / 2.0;
|
|
2701
|
+
#ifdef HIGH_PRECISION_DASH
|
|
2702
|
+
offset += vDashOffset;
|
|
2703
|
+
#endif
|
|
2648
2704
|
}
|
|
2649
|
-
float
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
if (
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
float distToEnd = length(vec2(
|
|
2705
|
+
float alongPath = vPathPosition.y + offset;
|
|
2706
|
+
float unitOffset = mod(alongPath, unitLength);
|
|
2707
|
+
float filterWidth = max(fwidth(alongPath), 0.0001);
|
|
2708
|
+
if (bool(picking.isActive)) {
|
|
2709
|
+
bool inGap = unitOffset > solidLength;
|
|
2710
|
+
if (inGap && path.capType > 0.5) {
|
|
2711
|
+
inGap = length(vec2(
|
|
2657
2712
|
min(unitOffset - solidLength, unitLength - unitOffset),
|
|
2658
2713
|
vPathPosition.x
|
|
2659
|
-
));
|
|
2660
|
-
if (distToEnd > 1.0) {
|
|
2661
|
-
if (!(pathStyle.dashGapPickable && bool(picking.isActive))) {
|
|
2662
|
-
discard;
|
|
2714
|
+
)) > 1.0;
|
|
2663
2715
|
}
|
|
2716
|
+
if (inGap && !pathStyle.dashGapPickable) {
|
|
2717
|
+
shouldDiscardDash = true;
|
|
2664
2718
|
}
|
|
2719
|
+
} else if (path.capType <= 0.5) {
|
|
2720
|
+
dashCoverage = dashPatternCoverage(alongPath, solidLength, unitLength, filterWidth);
|
|
2721
|
+
} else {
|
|
2722
|
+
float distanceAlongGap = min(unitOffset - solidLength, unitLength - unitOffset);
|
|
2723
|
+
float distanceToEnd = length(vec2(max(distanceAlongGap, 0.0), vPathPosition.x));
|
|
2724
|
+
float capEdgePixels = (1.0 - distanceToEnd) / max(fwidth(distanceToEnd), 1e-6);
|
|
2725
|
+
if (distanceAlongGap > 0.0) {
|
|
2726
|
+
inRoundedDashGap = true;
|
|
2727
|
+
roundedDashResolvedCoverage = smoothedge(0.0, capEdgePixels);
|
|
2728
|
+
dashCoverage = roundedDashResolvedCoverage;
|
|
2729
|
+
}
|
|
2730
|
+
float subPixelBlend = smoothstep(unitLength, 2.0 * unitLength, filterWidth);
|
|
2731
|
+
roundedDashSubPixelBlend = subPixelBlend;
|
|
2732
|
+
float boundedSolidLength = min(solidLength, unitLength);
|
|
2733
|
+
float effectiveGap = max(unitLength - boundedSolidLength, 0.0);
|
|
2734
|
+
float capSpan = 2.0 * sqrt(max(1.0 - vPathPosition.x * vPathPosition.x, 0.0));
|
|
2735
|
+
float roundedDutyCycle = clamp(
|
|
2736
|
+
(boundedSolidLength + min(effectiveGap, capSpan)) / unitLength,
|
|
2737
|
+
0.0,
|
|
2738
|
+
1.0
|
|
2739
|
+
);
|
|
2740
|
+
roundedDashDutyCycle = roundedDutyCycle;
|
|
2741
|
+
dashCoverage = mix(dashCoverage, roundedDutyCycle, subPixelBlend);
|
|
2665
2742
|
}
|
|
2743
|
+
dashCoverage = clamp(dashCoverage, 0.0, 1.0);
|
|
2744
|
+
shouldDiscardDash = shouldDiscardDash || dashCoverage <= 0.0;
|
|
2666
2745
|
}
|
|
2746
|
+
`,"fs:#main-end":`
|
|
2747
|
+
#ifdef ANTIALIASING
|
|
2748
|
+
if (inRoundedDashGap) {
|
|
2749
|
+
float pathCoverage = smoothedge(0.0, edgePixels);
|
|
2750
|
+
float resolvedCapMultiplier =
|
|
2751
|
+
min(pathCoverage, roundedDashResolvedCoverage) / max(pathCoverage, 1e-6);
|
|
2752
|
+
dashCoverage = mix(
|
|
2753
|
+
resolvedCapMultiplier,
|
|
2754
|
+
roundedDashDutyCycle,
|
|
2755
|
+
roundedDashSubPixelBlend
|
|
2756
|
+
);
|
|
2757
|
+
}
|
|
2758
|
+
#endif
|
|
2759
|
+
if (shouldDiscardDash) {
|
|
2760
|
+
discard;
|
|
2667
2761
|
}
|
|
2668
|
-
|
|
2762
|
+
fragColor.a *= dashCoverage;
|
|
2763
|
+
`}},zt={inject:{"vs:#decl":`
|
|
2669
2764
|
in vec2 instanceDashArrays;
|
|
2670
2765
|
out vec2 vDashArray;
|
|
2671
2766
|
`,"vs:#main-end":`
|
|
@@ -2707,7 +2802,7 @@ fragColor = vec4(vFillColor.rgb, vFillColor.a * alphaFactor);
|
|
|
2707
2802
|
fragColor = picking_filterPickingColor(fragColor);
|
|
2708
2803
|
fragColor = picking_filterHighlightColor(fragColor);
|
|
2709
2804
|
}
|
|
2710
|
-
`}},
|
|
2805
|
+
`}},Ut={inject:{"vs:#decl":`
|
|
2711
2806
|
in vec2 instanceDashArrays;
|
|
2712
2807
|
out vec2 vDashArray;
|
|
2713
2808
|
`,"vs:#main-end":`
|
|
@@ -2829,7 +2924,7 @@ fragColor = vec4(vFillColor.rgb, vFillColor.a * alphaFactor);
|
|
|
2829
2924
|
fragColor = picking_filterPickingColor(fragColor);
|
|
2830
2925
|
fragColor = picking_filterHighlightColor(fragColor);
|
|
2831
2926
|
}
|
|
2832
|
-
`}},
|
|
2927
|
+
`}},Vt={inject:{"vs:#decl":`
|
|
2833
2928
|
in float instanceOffsets;
|
|
2834
2929
|
`,"vs:DECKGL_FILTER_SIZE":`
|
|
2835
2930
|
float offsetWidth = abs(instanceOffsets * 2.0) + 1.0;
|
|
@@ -2840,64 +2935,248 @@ float offsetDir = sign(instanceOffsets);
|
|
|
2840
2935
|
vPathPosition.x = (vPathPosition.x + offsetDir) * offsetWidth - offsetDir;
|
|
2841
2936
|
vPathPosition.y *= offsetWidth;
|
|
2842
2937
|
vPathLength *= offsetWidth;
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2938
|
+
#ifdef DASH_ENABLED
|
|
2939
|
+
if (pathStyle.dashUnits != 0) {
|
|
2940
|
+
vDashArray *= offsetWidth;
|
|
2941
|
+
}
|
|
2942
|
+
vPathBounds *= offsetWidth;
|
|
2943
|
+
#ifdef HIGH_PRECISION_DASH
|
|
2944
|
+
vDashPathLength *= offsetWidth;
|
|
2945
|
+
float restoredDashUnitLength = vDashArray.x + vDashArray.y;
|
|
2946
|
+
float restoredDashPeriod = pathStyle.dashAlignMode == 0.0
|
|
2947
|
+
? restoredDashUnitLength
|
|
2948
|
+
: vDashPathLength /
|
|
2949
|
+
max(round(vDashPathLength / max(restoredDashUnitLength, 0.0001)), 1.0);
|
|
2950
|
+
vDashOffset = restoredDashPeriod > 0.0
|
|
2951
|
+
? mod(dashOffsetAndLength.x * offsetWidth, restoredDashPeriod)
|
|
2952
|
+
: 0.0;
|
|
2953
|
+
#else
|
|
2954
|
+
vDashOffset *= offsetWidth;
|
|
2955
|
+
#endif
|
|
2956
|
+
#endif
|
|
2957
|
+
`,"fs:#main-end":`
|
|
2958
|
+
#ifndef ANTIALIASING
|
|
2959
|
+
if (abs(vPathPosition.x) > 1.0) {
|
|
2847
2960
|
discard;
|
|
2848
2961
|
}
|
|
2849
|
-
|
|
2962
|
+
#endif
|
|
2963
|
+
`}};var Pn={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1,dashUnits:"widths"},En={widths:0,pixels:1,meters:2,common:3},Mn=["instanceDashArrays","instanceDashOffsets","instanceOffsets"];function An({props:t,oldProps:e}){return!(0,b._deepEqual)(t.modelMatrix,e.modelMatrix,2)||t.coordinateSystem!==e.coordinateSystem||!(0,b._deepEqual)(t.coordinateOrigin,e.coordinateOrigin,1)}function jt(t,e,i){let r=t.context.viewport;if(!(r instanceof b.WebMercatorViewport)||r.zoom<12)return t.projectPosition(e,{autoOffset:!1});let n=pe.transformMat4([],[e[0],e[1],e[2]||0,1],i.modelMatrix),o=t.props.coordinateSystem==="default"?"lnglat":t.props.coordinateSystem;if(o==="lnglat"){if(Math.abs(n[1]-i.coordinateOrigin[1])>.25){let l=n[0];i.wrapLongitude&&(l=((l+180)%360+360)%360-180);let f=r.projectPosition([l,n[1],0]);return[f[0]-i.commonOrigin[0],f[1]-i.commonOrigin[1],n[2]*i.commonUnitsPerMeter[2]]}L.sub(n,n,i.coordinateOrigin)}else o==="cartesian"&&L.sub(n,n,i.coordinateOrigin);let a=n[1],s=L.scaleAndAdd([],i.commonUnitsPerWorldUnit,i.commonUnitsPerWorldUnit2,a);return L.multiply([],n,s)}var K=class extends b.LayerExtension{constructor({dash:e=!1,offset:i=!1,dashMode:r,highPrecisionDash:n=!1}={}){let o=r??(n?"path":"segment");super({dash:e||n||r!==void 0,offset:i,dashMode:o,highPrecisionDash:o==="path"})}getLayerType(e){if("pathTesselator"in e.state)return"path";let i=e.constructor.layerName;return i==="ScatterplotLayer"?"scatterplot":i==="TextBackgroundLayer"?"textBackground":null}synchronizeAttributes(e){let i=e.getAttributeManager(),r=this.getLayerType(e);if(!i||!r)return!1;let n=i.getAttributes(),o=new Set;this.opts.dash&&o.add("instanceDashArrays"),r==="path"&&this.opts.dash&&this.opts.dashMode==="path"&&o.add("instanceDashOffsets"),r==="path"&&this.opts.offset&&o.add("instanceOffsets");let a=!1;for(let s of Mn)n[s]&&!o.has(s)&&(i.remove([s]),a=!0);return o.has("instanceDashArrays")&&!n.instanceDashArrays&&(i.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"}}),a=!0),o.has("instanceDashOffsets")&&!n.instanceDashOffsets&&(i.addInstanced({instanceDashOffsets:{size:2,accessor:["getPath"],update:this.calculateDashMetrics}}),a=!0),o.has("instanceOffsets")&&!n.instanceOffsets&&(i.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}),a=!0),a}isEnabled(e){return this.getLayerType(e)!==null}getShaders(e){let i=e.getLayerType(this);if(!i)return null;if(i==="scatterplot"||i==="textBackground")return e.opts.dash?{modules:[{name:"pathStyle",inject:i==="scatterplot"?zt.inject:Ut.inject,uniformTypes:{dashGapPickable:"i32"}}]}:null;let r={},n={};e.opts.dash&&(r=(0,b._mergeShaders)(r,Dt),n.DASH_ENABLED=!0,e.opts.dashMode==="path"&&(n.HIGH_PRECISION_DASH=!0)),e.opts.offset&&(r=(0,b._mergeShaders)(r,Vt),n.PATH_STYLE_OFFSET=!0);let{inject:o}=r,a={name:"pathStyle",inject:o};return e.opts.dash&&(a.uniformTypes={dashAlignMode:"f32",dashGapPickable:"i32",dashUnits:"i32"}),{modules:[a],defines:n}}initializeState(e,i){i.synchronizeAttributes(this)}updateState(e,i){if(i.isEnabled(this)){if(e.changeFlags.extensionsChanged){let r=i.synchronizeAttributes(this),n=this.getAttributeManager();if(n&&r){n.invalidateAll();for(let o of this.getModels())o.setBufferLayout(n.getBufferLayouts(o))}}if(i.opts.dash){let r=i.getLayerType(this);if(r==="path"&&i.opts.dashMode==="path"&&An(e)&&this.getAttributeManager()?.invalidate("instanceDashOffsets"),r==="scatterplot"||r==="textBackground"){let n={dashGapPickable:!!this.props.dashGapPickable};this.setShaderModuleProps({pathStyle:n})}else{let n={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:!!this.props.dashGapPickable,dashUnits:En[this.props.dashUnits??"widths"]};this.setShaderModuleProps({pathStyle:n})}}}}calculateDashMetrics(e,{startRow:i,endRow:r}){let n=this.state.pathTesselator,o=n?.vertexStarts,a=n?.instanceCount,s=n?.get("positions");if(!o||a===void 0||typeof n?.getPathSegmentIndices!="function")throw new Error("PathStyleExtension requires PathLayer tessellation data for path dashes.");let l=this.props.data?.attributes?.getPath,f=ArrayBuffer.isView(l)?l:l?.value,c=ArrayBuffer.isView(f),u=s&&(!l||n.normalize||n.opts?.isWebGPU);if(l&&!c||!u&&!c)throw new Error("PathStyleExtension cannot calculate whole-path dash metrics from GPU-only getPath data; supply data.attributes.instanceDashOffsets.");let d=e.value,p=e.size,m=Math.max(0,i),F=Math.min(r,o.length-1),v=3,O=3,R=0;if(!u){let x=f.BYTES_PER_ELEMENT;v=l?.size||(this.props.positionFormat==="XY"?2:3),O=l?.stride?l.stride/x:v,R=l?.offset?l.offset/x:0}let P=new Array(3),k=b.project.getUniforms({viewport:this.context.viewport,modelMatrix:this.props.modelMatrix,coordinateSystem:this.props.coordinateSystem,coordinateOrigin:this.props.coordinateOrigin,autoWrapLongitude:this.wrapLongitude}),G=x=>{if(u)P[0]=s[x*3],P[1]=s[x*3+1],P[2]=s[x*3+2];else{let A=R+x*O;P[0]=f[A],P[1]=f[A+1],P[2]=v===3?f[A+2]:0}return P};e.startIndices=o;for(let x=m;x<F;x++){let A=o[x],N=Math.min(o[x+1]??a,a);d.fill(0,A*p,N*p);let Pi=n.getPathSegmentIndices(x),Te=0,je=-2,Se=null;for(let T of Pi){let Ei=T*p;d[Ei]=Te;let Mi=T===je+1&&Se?Se:jt(this,G(T),k),He=jt(this,G(T+1),k);Te+=L.dist(Mi,He),je=T,Se=He}if(p>1)for(let T=A;T<N;T++)d[T*p+1]=Te}}getDashOffsets(e){let i=[0],r=this.props.positionFormat==="XY"?2:3,n=Array.isArray(e[0]),o=n?e.length:e.length/r,a,s;for(let l=0;l<o-1;l++)a=n?e[l]:e.slice(l*r,l*r+r),a=this.projectPosition(a,{autoOffset:!1}),l>0&&(i[l]=i[l-1]+L.dist(s,a)),s=a;return i[o-1]=0,i}};K.defaultProps=Pn;K.extensionName="PathStyleExtension";var Ht=K;var $t=_(h(),1);var U=_(h(),1),Tn=512/4e7;function Sn(t,e){switch(t){case"pixels":return 2**-Math.round(e.zoom);case"common":return 1;default:return Tn}}var Gt=`layout(std140) uniform fillUniforms {
|
|
2850
2964
|
vec2 patternTextureSize;
|
|
2965
|
+
float patternUnitScale;
|
|
2851
2966
|
bool patternEnabled;
|
|
2852
2967
|
bool patternMask;
|
|
2968
|
+
bool procedural;
|
|
2969
|
+
bool flipY;
|
|
2853
2970
|
vec2 uvCoordinateOrigin;
|
|
2854
2971
|
vec2 uvCoordinateOrigin64Low;
|
|
2855
2972
|
} fill;
|
|
2856
|
-
`,
|
|
2973
|
+
`,Ln=`
|
|
2974
|
+
uniform sampler2D fill_patternTexture;
|
|
2975
|
+
|
|
2857
2976
|
in vec4 fillPatternFrames;
|
|
2858
2977
|
in float fillPatternScales;
|
|
2859
2978
|
in vec2 fillPatternOffsets;
|
|
2979
|
+
in vec4 fillPatternBackgroundColors;
|
|
2860
2980
|
|
|
2861
2981
|
out vec2 fill_uv;
|
|
2862
2982
|
out vec4 fill_patternBounds;
|
|
2863
2983
|
out vec4 fill_patternPlacement;
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2984
|
+
out vec4 fill_backgroundColor;
|
|
2985
|
+
out float fill_patternCoordinateScale;
|
|
2986
|
+
flat out vec4 fill_patternParams0;
|
|
2987
|
+
flat out vec4 fill_patternParams1;
|
|
2988
|
+
`,Fn=`
|
|
2989
|
+
${Gt}
|
|
2990
|
+
${Ln}
|
|
2991
|
+
`,On=`
|
|
2868
2992
|
uniform sampler2D fill_patternTexture;
|
|
2869
2993
|
|
|
2870
2994
|
in vec4 fill_patternBounds;
|
|
2871
2995
|
in vec4 fill_patternPlacement;
|
|
2996
|
+
in vec4 fill_backgroundColor;
|
|
2872
2997
|
in vec2 fill_uv;
|
|
2998
|
+
in float fill_patternCoordinateScale;
|
|
2999
|
+
flat in vec4 fill_patternParams0;
|
|
3000
|
+
flat in vec4 fill_patternParams1;
|
|
3001
|
+
|
|
3002
|
+
const float FILL_PATTERN_HATCH = 1.0;
|
|
3003
|
+
const float FILL_PATTERN_CROSS_HATCH = 2.0;
|
|
3004
|
+
const float FILL_PATTERN_DOTS = 3.0;
|
|
3005
|
+
|
|
3006
|
+
float fill_getPatternCoordinate(vec2 axis, float period, float offset) {
|
|
3007
|
+
float coordinateScale = max(abs(fill_patternCoordinateScale), 1.0e-20);
|
|
3008
|
+
vec2 coordinateOrigin = fill.uvCoordinateOrigin;
|
|
3009
|
+
vec2 coordinateOffset = fill.uvCoordinateOrigin64Low + fill_uv;
|
|
3010
|
+
float yDirection = fill.flipY ? 1.0 : -1.0;
|
|
3011
|
+
coordinateOrigin.y *= yDirection;
|
|
3012
|
+
coordinateOffset.y *= yDirection;
|
|
3013
|
+
|
|
3014
|
+
// Reduce the high part before adding the local offset to retain precision in large coordinates.
|
|
3015
|
+
float highPart = mod(dot(coordinateOrigin, axis) / coordinateScale, period);
|
|
3016
|
+
float lowPart = dot(coordinateOffset, axis) / coordinateScale;
|
|
3017
|
+
return mod(highPart + lowPart + offset * period, period);
|
|
3018
|
+
}
|
|
3019
|
+
|
|
3020
|
+
vec2 fill_getPatternCoords(
|
|
3021
|
+
vec2 axis0,
|
|
3022
|
+
vec2 axis1,
|
|
3023
|
+
vec2 period,
|
|
3024
|
+
vec2 offset
|
|
3025
|
+
) {
|
|
3026
|
+
return vec2(
|
|
3027
|
+
fill_getPatternCoordinate(axis0, period.x, offset.x),
|
|
3028
|
+
fill_getPatternCoordinate(axis1, period.y, offset.y)
|
|
3029
|
+
);
|
|
3030
|
+
}
|
|
2873
3031
|
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
3032
|
+
float fill_getScreenSpaceAlpha(float signedDistance) {
|
|
3033
|
+
float distanceDerivative = fwidth(signedDistance);
|
|
3034
|
+
if (distanceDerivative == 0.0) {
|
|
3035
|
+
return signedDistance <= 0.0 ? 1.0 : 0.0;
|
|
3036
|
+
}
|
|
3037
|
+
// Normalize the SDF to screen pixels so the coverage ramp is independent of pattern units.
|
|
3038
|
+
float distanceInPixels = signedDistance / distanceDerivative;
|
|
3039
|
+
return 1.0 - smoothstep(-0.5, 0.5, distanceInPixels);
|
|
3040
|
+
}
|
|
3041
|
+
|
|
3042
|
+
float fill_getLineAlpha(float position, float center, float period, float strokeWidth) {
|
|
3043
|
+
float distanceToLine = abs(mod(position - center + period * 0.5, period) - period * 0.5);
|
|
3044
|
+
return fill_getScreenSpaceAlpha(distanceToLine - strokeWidth * 0.5);
|
|
3045
|
+
}
|
|
3046
|
+
|
|
3047
|
+
float fill_getHatchAlpha(float angle, float strokeWidth, vec2 gaps, bool alternating) {
|
|
3048
|
+
vec2 lineDirection = vec2(cos(angle), sin(angle));
|
|
3049
|
+
vec2 lineNormal = vec2(-lineDirection.y, lineDirection.x);
|
|
3050
|
+
float period = alternating
|
|
3051
|
+
? strokeWidth * 2.0 + gaps.x + gaps.y
|
|
3052
|
+
: strokeWidth + gaps.x;
|
|
3053
|
+
float offset = dot(fill_patternPlacement.xy, lineNormal);
|
|
3054
|
+
float position = fill_getPatternCoordinate(lineNormal, period, offset);
|
|
3055
|
+
float alpha = fill_getLineAlpha(position, 0.0, period, strokeWidth);
|
|
3056
|
+
if (alternating) {
|
|
3057
|
+
alpha = max(
|
|
3058
|
+
alpha,
|
|
3059
|
+
fill_getLineAlpha(position, strokeWidth + gaps.x, period, strokeWidth)
|
|
3060
|
+
);
|
|
3061
|
+
}
|
|
3062
|
+
return alpha;
|
|
3063
|
+
}
|
|
3064
|
+
|
|
3065
|
+
float fill_getDotAlpha(float angle, float skew, float radius, float gap) {
|
|
3066
|
+
vec2 axis0 = vec2(cos(angle), sin(angle));
|
|
3067
|
+
float axis1Angle = angle + 1.5707963267948966 - skew;
|
|
3068
|
+
vec2 axis1 = vec2(cos(axis1Angle), sin(axis1Angle));
|
|
3069
|
+
float determinant = axis0.x * axis1.y - axis0.y * axis1.x;
|
|
3070
|
+
|
|
3071
|
+
// The reciprocal basis maps common coordinates into the skewed dot lattice.
|
|
3072
|
+
vec2 reciprocal0 = vec2(axis1.y, -axis1.x) / determinant;
|
|
3073
|
+
vec2 reciprocal1 = vec2(-axis0.y, axis0.x) / determinant;
|
|
3074
|
+
float period = radius * 2.0 + gap;
|
|
3075
|
+
vec2 latticeCoords = fill_getPatternCoords(
|
|
3076
|
+
reciprocal0,
|
|
3077
|
+
reciprocal1,
|
|
3078
|
+
vec2(period),
|
|
3079
|
+
fill_patternPlacement.xy
|
|
3080
|
+
);
|
|
3081
|
+
vec2 cellOffset = mod(latticeCoords + period * 0.5, period) - period * 0.5;
|
|
3082
|
+
float distanceToDotSquared = 1.0e20;
|
|
3083
|
+
// In a skewed lattice the closest dot is not necessarily in the independently wrapped cell.
|
|
3084
|
+
// Include adjacent cells to keep the repeated distance field continuous at cell boundaries.
|
|
3085
|
+
for (int x = -1; x <= 1; x++) {
|
|
3086
|
+
for (int y = -1; y <= 1; y++) {
|
|
3087
|
+
vec2 neighborOffset = cellOffset + vec2(float(x), float(y)) * period;
|
|
3088
|
+
vec2 dotOffset = axis0 * neighborOffset.x + axis1 * neighborOffset.y;
|
|
3089
|
+
distanceToDotSquared = min(distanceToDotSquared, dot(dotOffset, dotOffset));
|
|
3090
|
+
}
|
|
3091
|
+
}
|
|
3092
|
+
float distanceToDot = sqrt(distanceToDotSquared);
|
|
3093
|
+
return fill_getScreenSpaceAlpha(distanceToDot - radius);
|
|
3094
|
+
}
|
|
3095
|
+
|
|
3096
|
+
float fill_getProceduralPatternAlpha() {
|
|
3097
|
+
float patternType = fill_patternParams0.x;
|
|
3098
|
+
float size = fill_patternParams0.y;
|
|
3099
|
+
vec2 gaps = fill_patternParams0.zw;
|
|
3100
|
+
vec2 angles = fill_patternParams1.xy;
|
|
3101
|
+
float elementCount = fill_patternParams1.z;
|
|
3102
|
+
|
|
3103
|
+
if (patternType == FILL_PATTERN_HATCH) {
|
|
3104
|
+
return fill_getHatchAlpha(angles.x, size, gaps, elementCount == 2.0);
|
|
3105
|
+
}
|
|
3106
|
+
if (patternType == FILL_PATTERN_CROSS_HATCH) {
|
|
3107
|
+
return max(
|
|
3108
|
+
fill_getHatchAlpha(angles.x, size, gaps, false),
|
|
3109
|
+
fill_getHatchAlpha(angles.y, size, gaps, false)
|
|
3110
|
+
);
|
|
3111
|
+
}
|
|
3112
|
+
if (patternType == FILL_PATTERN_DOTS) {
|
|
3113
|
+
return fill_getDotAlpha(angles.x, angles.y, size, gaps.x);
|
|
3114
|
+
}
|
|
3115
|
+
return 1.0;
|
|
3116
|
+
}
|
|
3117
|
+
|
|
3118
|
+
// Draw the pattern over the background fill (Porter-Duff source-over)
|
|
3119
|
+
vec4 fill_blendOverBackground(vec4 pattern, vec4 background) {
|
|
3120
|
+
if (background.a == 0.0 || layer.opacity == 0.0) return pattern;
|
|
3121
|
+
float patternAlpha = pattern.a / layer.opacity;
|
|
3122
|
+
float blendedAlpha = patternAlpha + background.a * (1.0 - patternAlpha);
|
|
3123
|
+
vec3 blendedRGB = mix(background.rgb, pattern.rgb, patternAlpha / blendedAlpha);
|
|
3124
|
+
return vec4(blendedRGB, blendedAlpha * layer.opacity);
|
|
3125
|
+
}
|
|
3126
|
+
`,Bn=`
|
|
3127
|
+
${Gt}
|
|
3128
|
+
${On}
|
|
3129
|
+
`,wn={"vs:DECKGL_FILTER_GL_POSITION":`
|
|
2881
3130
|
if (fill.patternEnabled) {
|
|
2882
|
-
fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize);
|
|
2883
3131
|
fill_patternPlacement.xy = fillPatternOffsets;
|
|
2884
|
-
|
|
3132
|
+
fill_backgroundColor = fillPatternBackgroundColors;
|
|
3133
|
+
if (fill.procedural) {
|
|
3134
|
+
fill_uv = geometry.position.xy;
|
|
3135
|
+
fill_patternCoordinateScale = fill.patternUnitScale * fillPatternScales;
|
|
3136
|
+
int texelIndex = int(fillPatternFrames.x) * 4;
|
|
3137
|
+
fill_patternParams0 = vec4(
|
|
3138
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex, 0), 0).rg,
|
|
3139
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 1, 0), 0).rg
|
|
3140
|
+
);
|
|
3141
|
+
fill_patternParams1 = vec4(
|
|
3142
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 2, 0), 0).rg,
|
|
3143
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 3, 0), 0).rg
|
|
3144
|
+
);
|
|
3145
|
+
} else {
|
|
3146
|
+
fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize);
|
|
3147
|
+
vec2 patternFrameCommon = fill.patternUnitScale * fillPatternScales * fillPatternFrames.zw;
|
|
3148
|
+
// Reduce the coordinate origin to within one tile before adding the vertex position. The
|
|
3149
|
+
// origin is large in common space, and fp32 cannot carry the sum at full precision.
|
|
3150
|
+
vec2 origin = mod(fill.uvCoordinateOrigin, patternFrameCommon) + fill.uvCoordinateOrigin64Low;
|
|
3151
|
+
fill_uv = (origin + geometry.position.xy) / patternFrameCommon;
|
|
3152
|
+
// Pattern atlases use top-left coordinates, so reverse common-space Y in bottom-left views.
|
|
3153
|
+
fill_uv.y *= fill.flipY ? 1.0 : -1.0;
|
|
3154
|
+
fill_uv += fillPatternOffsets;
|
|
3155
|
+
}
|
|
2885
3156
|
}
|
|
2886
3157
|
`,"fs:DECKGL_FILTER_COLOR":`
|
|
2887
3158
|
if (fill.patternEnabled) {
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
3159
|
+
if (fill.procedural) {
|
|
3160
|
+
color.a *= fill_getProceduralPatternAlpha();
|
|
3161
|
+
} else {
|
|
3162
|
+
vec2 patternUV = fract(fill_uv);
|
|
3163
|
+
vec2 texCoords = fill_patternBounds.xy + fill_patternBounds.zw * patternUV;
|
|
3164
|
+
|
|
3165
|
+
// Tiling is emulated by wrapping the coordinate, so texCoords jumps from the end of the
|
|
3166
|
+
// frame back to its start once per tile, leading to the wrong mip level being selected,
|
|
3167
|
+
// which leads to artifacts at pattern edges. fill_uv is continuous across the primitive,
|
|
3168
|
+
// meaning that the correct mip level is always selected
|
|
3169
|
+
vec4 grad = fill_patternBounds.zwzw * vec4(dFdx(fill_uv), dFdy(fill_uv));
|
|
3170
|
+
vec4 patternColor = textureGrad(fill_patternTexture, texCoords, grad.xy, grad.zw);
|
|
3171
|
+
|
|
3172
|
+
color.a *= patternColor.a;
|
|
3173
|
+
if (!fill.patternMask) {
|
|
3174
|
+
color.rgb = patternColor.rgb;
|
|
3175
|
+
}
|
|
2898
3176
|
}
|
|
3177
|
+
color = fill_blendOverBackground(color, fill_backgroundColor);
|
|
2899
3178
|
}
|
|
2900
|
-
`};function
|
|
3179
|
+
`};function In(t){if(!t)return{};let e={};if("fillPatternTexture"in t){let{fillPatternTexture:i}=t;e.fill_patternTexture=i,e.patternTextureSize=[i.width,i.height]}if("project"in t){let{fillPatternMask:i=!0,fillPatternEnabled:r=!0,fillPatternSizeUnits:n="meters",fillPatternCommonFrame:o=null,procedural:a=!1}=t,s=U.project.getUniforms(t.project),{commonOrigin:l}=s,f=Sn(n,t.project.viewport),c=[l[0],l[1]];o&&(c[0]%=f*o[0],c[1]%=f*o[1]),e.uvCoordinateOrigin=c,e.uvCoordinateOrigin64Low=[(0,U.fp64LowPart)(c[0]),(0,U.fp64LowPart)(c[1])],e.patternUnitScale=f,e.patternMask=i,e.patternEnabled=r,e.procedural=a,e.flipY=t.project.viewport?.flipY??!1}return e}var qt={name:"fill",vs:Fn,fs:Bn,inject:wn,dependencies:[U.project],getUniforms:In,uniformTypes:{patternTextureSize:"vec2<f32>",patternUnitScale:"f32",patternEnabled:"i32",patternMask:"i32",procedural:"i32",flipY:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var Yt="rg32float";var Ce={none:0,hatch:1,crossHatch:2,dots:3},g={type:0,size:1,gap0:2,gap1:3,angle0:4,angle1:5,elementCount:6},Wt=8,Z=Math.PI/180,Re=1,ke=1,Cn=0,Rn=[45,135],kn=0,Nn=0;function Kt(t){let e=Object.entries(t),i=new Float32Array((e.length+1)*Wt),r=new Map;return e.forEach(([n,o],a)=>{let s=a+1,l=s*Wt;switch(r.set(n,s),o.type){case"hatch":{let f=o.gap===void 0?ke:o.gap,c=o.strokeWidth===void 0?Re:o.strokeWidth,u=o.angle===void 0?Cn:o.angle;if(Array.isArray(f)&&f.length!==2)throw new Error(`${n}.gap must be a number or a two-element array`);let d=Array.isArray(f)?f:[f,f];Ne(c,`${n}.strokeWidth`),xe(d[0],`${n}.gap[0]`),xe(d[1],`${n}.gap[1]`),be(u,`${n}.angle`),i[l+g.type]=Ce.hatch,i[l+g.size]=c,i[l+g.gap0]=d[0],i[l+g.gap1]=d[1],i[l+g.angle0]=u*Z,i[l+g.elementCount]=Array.isArray(f)?2:1;break}case"cross-hatch":{let f=o.angles===void 0?Rn:o.angles,c=o.strokeWidth===void 0?Re:o.strokeWidth,u=o.gap===void 0?ke:o.gap;if(!Array.isArray(f)||f.length!==2)throw new Error(`${n}.angles must be a two-element array`);Ne(c,`${n}.strokeWidth`),xe(u,`${n}.gap`),be(f[0],`${n}.angles[0]`),be(f[1],`${n}.angles[1]`),i[l+g.type]=Ce.crossHatch,i[l+g.size]=c,i[l+g.gap0]=u,i[l+g.gap1]=u,i[l+g.angle0]=f[0]*Z,i[l+g.angle1]=f[1]*Z,i[l+g.elementCount]=2;break}case"dots":{let f=o.radius===void 0?Re:o.radius,c=o.gap===void 0?ke:o.gap,u=o.angle===void 0?kn:o.angle,d=o.skew===void 0?Nn:o.skew;Ne(f,`${n}.radius`),xe(c,`${n}.gap`),be(u,`${n}.angle`),Dn(d,`${n}.skew`),i[l+g.type]=Ce.dots,i[l+g.size]=f,i[l+g.gap0]=c,i[l+g.gap1]=c,i[l+g.angle0]=u*Z,i[l+g.angle1]=d*Z,i[l+g.elementCount]=2;break}default:throw new Error(`${n}.type is not a supported procedural pattern type`)}}),{data:i,width:i.length/2,height:1,patternIndices:r}}function Ne(t,e){if(!Number.isFinite(t)||t<=0)throw new Error(`${e} must be a finite number greater than 0`)}function xe(t,e){if(!Number.isFinite(t)||t<0)throw new Error(`${e} must be a finite number greater than or equal to 0`)}function be(t,e){if(!Number.isFinite(t))throw new Error(`${e} must be a finite number`)}function Dn(t,e){if(!Number.isFinite(t)||t<=-90||t>=90)throw new Error(`${e} must be a finite number greater than -90 and less than 90`)}function Zt(t,e){if(!Number.isInteger(e)||e<=0)return 0;if(t===0)return e;let[i,r]=[t,e];for(;r>0;)[i,r]=[r,i%r];return t/i*e}var zn={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,fillPatternSizeUnits:"meters",getFillPattern:{type:"accessor",value:t=>t.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]},getFillPatternBackgroundColor:{type:"accessor",value:[0,0,0,0]}},$=class extends $t.LayerExtension{constructor({pattern:e=!1,proceduralPattern:i=!1}={}){super({pattern:e||i,proceduralPattern:i})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&qt].filter(Boolean)}:null}initializeState(e,i){if(!i.isEnabled(this))return;let r=this.getAttributeManager();i.opts.pattern&&r.add({fillPatternFrames:{size:4,stepMode:"dynamic",accessor:"getFillPattern",transform:i.opts.proceduralPattern?i.getProceduralPatternIndex.bind(this):i.getPatternFrame.bind(this)},fillPatternScales:{size:1,stepMode:"dynamic",accessor:"getFillPatternScale",defaultValue:1},fillPatternOffsets:{size:2,stepMode:"dynamic",accessor:"getFillPatternOffset"},fillPatternBackgroundColors:{size:4,type:"unorm8",stepMode:"dynamic",accessor:"getFillPatternBackgroundColor",defaultValue:[0,0,0,255]}}),this.setState({emptyTexture:this.context.device.createTexture({data:new Uint8Array(4),width:1,height:1}),...i.opts.proceduralPattern&&i.createProceduralPatternTexture.call(this,{})})}updateState({props:e,oldProps:i},r){if(r.isEnabled(this)){if(e.fillPatternMapping&&e.fillPatternMapping!==i.fillPatternMapping){if(r.opts.proceduralPattern&&typeof e.fillPatternMapping!="string"){let n=this.state.proceduralPatternTexture;this.setState(r.createProceduralPatternTexture.call(this,e.fillPatternMapping)),n?.delete()}this.getAttributeManager().invalidate("getFillPattern")}(e.fillPatternMapping!==i.fillPatternMapping||e.getFillPatternScale!==i.getFillPatternScale)&&this.setState({commonFrame:r.getCommonFrame(e)})}}draw(e,i){if(!i.isEnabled(this))return;let{fillPatternAtlas:r,fillPatternEnabled:n,fillPatternMask:o,fillPatternSizeUnits:a}=this.props,s={project:e.shaderModuleProps.project,fillPatternEnabled:n,fillPatternMask:o,fillPatternSizeUnits:a,procedural:i.opts.proceduralPattern,fillPatternTexture:i.opts.proceduralPattern?this.state.proceduralPatternTexture||this.state.emptyTexture:r||this.state.emptyTexture,fillPatternCommonFrame:this.state.commonFrame};this.setShaderModuleProps({fill:s})}finalizeState(){this.state.emptyTexture?.delete(),this.state.proceduralPatternTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:i}=this.getCurrentLayer().props,r=i&&i[e];return r&&"x"in r?[r.x,r.y,r.width,r.height]:[0,0,0,0]}getCommonFrame(e){let{fillPatternMapping:i,getFillPatternScale:r}=e;if(typeof r!="number"||!(r>0)||typeof i!="object")return null;let n=0,o=0;for(let a in i){let s=i[a];if(!("width"in s)||(n=Zt(n,s.width),o=Zt(o,s.height),!n||!o))return null}return n?[r*n,r*o]:null}getProceduralPatternIndex(e){return[this.state.proceduralPatternIndices?.get(e)??0,0,0,0]}createProceduralPatternTexture(e){let i=Kt(e);return{proceduralPatternIndices:i.patternIndices,proceduralPatternTexture:this.context.device.createTexture({data:i.data,width:i.width,height:i.height,format:Yt,sampler:{minFilter:"nearest",magFilter:"nearest"}})}}};$.defaultProps=zn;$.extensionName="FillStyleExtension";var Xt=$;var Qt=_(h(),1),Un={clipBounds:[0,0,1,1],clipByInstance:void 0},Jt=`
|
|
2901
3180
|
layout(std140) uniform clipUniforms {
|
|
2902
3181
|
vec4 bounds;
|
|
2903
3182
|
} clip;
|
|
@@ -2905,7 +3184,7 @@ layout(std140) uniform clipUniforms {
|
|
|
2905
3184
|
bool clip_isInBounds(vec2 position) {
|
|
2906
3185
|
return position.x >= clip.bounds[0] && position.y >= clip.bounds[1] && position.x < clip.bounds[2] && position.y < clip.bounds[3];
|
|
2907
3186
|
}
|
|
2908
|
-
`,
|
|
3187
|
+
`,Vn={name:"clip",vs:Jt,uniformTypes:{bounds:"vec4<f32>"}},jn={"vs:#decl":`
|
|
2909
3188
|
out float clip_isVisible;
|
|
2910
3189
|
`,"vs:DECKGL_FILTER_GL_POSITION":`
|
|
2911
3190
|
clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
|
|
@@ -2913,7 +3192,7 @@ out float clip_isVisible;
|
|
|
2913
3192
|
in float clip_isVisible;
|
|
2914
3193
|
`,"fs:DECKGL_FILTER_COLOR":`
|
|
2915
3194
|
if (clip_isVisible < 0.5) discard;
|
|
2916
|
-
`},
|
|
3195
|
+
`},Hn={name:"clip",fs:Jt,uniformTypes:{bounds:"vec4<f32>"}},Gn={"vs:#decl":`
|
|
2917
3196
|
out vec2 clip_commonPosition;
|
|
2918
3197
|
`,"vs:DECKGL_FILTER_GL_POSITION":`
|
|
2919
3198
|
clip_commonPosition = geometry.position.xy;
|
|
@@ -2921,7 +3200,7 @@ out vec2 clip_commonPosition;
|
|
|
2921
3200
|
in vec2 clip_commonPosition;
|
|
2922
3201
|
`,"fs:DECKGL_FILTER_COLOR":`
|
|
2923
3202
|
if (!clip_isInBounds(clip_commonPosition)) discard;
|
|
2924
|
-
`},
|
|
3203
|
+
`},X=class extends Qt.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=!!this.props.clipByInstance),this.state.clipByInstance=e,this.context.device.type==="webgpu"?{}:e?{modules:[Vn],inject:jn}:{modules:[Hn],inject:Gn}}draw(){let{clipBounds:e}=this.props,i={};if(this.state.clipByInstance)i.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),n=this.projectPosition([e[2],e[3],0]);i.bounds=[Math.min(r[0],n[0]),Math.min(r[1],n[1]),Math.max(r[0],n[0]),Math.max(r[1],n[1])]}this.context.device.type==="webgpu"&&(i.enabled=!0,i.mode=this.state.clipByInstance?"instance":"geometry"),this.setShaderModuleProps({clip:i})}};X.defaultProps=Un;X.extensionName="ClipExtension";var ei=X;var oi=_(h(),1);var ti=_(h(),1),qn=`
|
|
2925
3204
|
in float collisionPriorities;
|
|
2926
3205
|
|
|
2927
3206
|
uniform sampler2D collision_texture;
|
|
@@ -2969,7 +3248,7 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2969
3248
|
float W = 2.0 * floatN + 1.0;
|
|
2970
3249
|
return pow(accumulator / (W * W), 2.2);
|
|
2971
3250
|
}
|
|
2972
|
-
`,
|
|
3251
|
+
`,Wn={"vs:#decl":`
|
|
2973
3252
|
float collision_fade = 1.0;
|
|
2974
3253
|
`,"vs:DECKGL_FILTER_GL_POSITION":`
|
|
2975
3254
|
if (collision.sort) {
|
|
@@ -2988,21 +3267,21 @@ float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
|
|
|
2988
3267
|
}
|
|
2989
3268
|
`,"vs:DECKGL_FILTER_COLOR":`
|
|
2990
3269
|
color.a *= collision_fade;
|
|
2991
|
-
`},
|
|
3270
|
+
`},Yn=t=>{if(!t||!("dummyCollisionMap"in t))return{};let{enabled:e,collisionFBO:i,drawToCollisionMap:r,dummyCollisionMap:n}=t;return{enabled:e&&!r,sort:!!r,collision_texture:!r&&i?i.colorAttachments[0]:n}},ii={name:"collision",dependencies:[ti.project],vs:qn,inject:Wn,getUniforms:Yn,uniformTypes:{sort:"i32",enabled:"i32"}};var ni=_(h(),1);var ri=_(h(),1),Q=class extends ri._LayersPass{renderCollisionMap(e,i){let n=[0,0,0,0],o=[1,1,e.width-2,e.height-2];this.render({...i,clearColor:n,scissorRect:o,target:e,pass:"collision"})}getLayerParameters(e,i,r){return{...e.props.parameters,blend:!1,depthWriteEnabled:!0,depthCompare:"less-equal"}}getShaderModuleProps(){return{collision:{drawToCollisionMap:!0},picking:{isActive:1,isAttribute:!1},lighting:{enabled:!1}}}};var De=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:i}=e;this.dummyCollisionMap=i.createTexture({width:1,height:1}),this.collisionFilterPass=new Q(i,{id:"default-collision-filter"})}preRender({effects:e,layers:i,layerFilter:r,viewports:n,onViewportActive:o,views:a,isPicking:s,preRenderStats:l={}}){let{device:f}=this.context;if(s)return;let c=i.filter(({props:{visible:v,collisionEnabled:O}})=>v&&O);if(c.length===0){this.channels={};return}let u=e?.filter(v=>v.useInPicking&&l[v.id]),d=l["mask-effect"]?.didRender,p=this._groupByCollisionGroup(f,c),m=n[0],F=!this.lastViewport||!this.lastViewport.equals(m)||d;for(let v in p){let O=this.collisionFBOs[v],R=p[v],[P,k]=f.canvasContext.getPixelSize();O.resize({width:P/De,height:k/De}),this._render(R,{effects:u,layerFilter:r,onViewportActive:o,views:a,viewport:m,viewportChanged:F})}}_render(e,{effects:i,layerFilter:r,onViewportActive:n,views:o,viewport:a,viewportChanged:s}){let{collisionGroup:l}=e,f=this.channels[l];if(!f)return;let c=s||e===f||!(0,ni._deepEqual)(f.layers,e.layers,1)||e.layerBounds.some((u,d)=>!z(u,f.layerBounds[d]))||e.allLayersLoaded!==f.allLayersLoaded||e.layers.some(u=>u.props.transitions);if(this.channels[l]=e,c){this.lastViewport=a;let u=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(u,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:i,layerFilter:r,viewports:a?[a]:[],onViewportActive:n,views:o,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:u.device.canvasContext.getDevicePixelRatio()/De}}})}}_groupByCollisionGroup(e,i){let r={};for(let n of i){let o=n.props.collisionGroup,a=r[o];a||(a={collisionGroup:o,layers:[],layerBounds:[],allLayersLoaded:!0},r[o]=a),a.layers.push(n),a.layerBounds.push(n.getBounds()),n.isLoaded||(a.allLayersLoaded=!1)}for(let n of Object.keys(r))this.collisionFBOs[n]||this.createFBO(e,n),this.channels[n]||(this.channels[n]=r[n]);for(let n of Object.keys(this.collisionFBOs))r[n]||this.destroyFBO(n);return r}getShaderModuleProps(e){let{collisionGroup:i,collisionEnabled:r}=e.props,{collisionFBOs:n,dummyCollisionMap:o}=this,a=n[i];return{collision:{enabled:r&&!!a,collisionFBO:a,dummyCollisionMap:o}}}cleanup(){this.dummyCollisionMap&&(this.dummyCollisionMap.delete(),this.dummyCollisionMap=void 0),this.channels={};for(let e of Object.keys(this.collisionFBOs))this.destroyFBO(e);this.collisionFBOs={},this.lastViewport=void 0}createFBO(e,i){let{width:r,height:n}=e.getDefaultCanvasContext().canvas,o=e.createTexture({format:"rgba8unorm",width:r,height:n,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),a=e.createTexture({format:"depth16unorm",width:r,height:n});this.collisionFBOs[i]=e.createFramebuffer({id:`collision-${i}`,width:r,height:n,colorAttachments:[o],depthStencilAttachment:a})}destroyFBO(e){let i=this.collisionFBOs[e];i.colorAttachments[0]?.destroy(),i.depthStencilAttachment?.destroy(),i.destroy(),delete this.collisionFBOs[e]}};var Kn={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},ee=class extends oi.LayerExtension{getShaders(){return{modules:[ii]}}draw({shaderModuleProps:e}){e.collision?.drawToCollisionMap&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,i){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}};ee.defaultProps=Kn;ee.extensionName="CollisionFilterExtension";var ai=ee;var C=_(h(),1);var si=_(h(),1),li=`layout(std140) uniform maskUniforms {
|
|
2992
3271
|
vec4 bounds;
|
|
2993
3272
|
highp int channel;
|
|
2994
3273
|
bool enabled;
|
|
2995
3274
|
bool inverted;
|
|
2996
3275
|
bool maskByInstance;
|
|
2997
3276
|
} mask;
|
|
2998
|
-
`,
|
|
3277
|
+
`,Zn=`
|
|
2999
3278
|
vec2 mask_getCoords(vec4 position) {
|
|
3000
3279
|
return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy);
|
|
3001
3280
|
}
|
|
3002
|
-
|
|
3003
|
-
${
|
|
3004
|
-
${
|
|
3005
|
-
`,
|
|
3281
|
+
`,$n=`
|
|
3282
|
+
${li}
|
|
3283
|
+
${Zn}
|
|
3284
|
+
`,Xn=`
|
|
3006
3285
|
uniform sampler2D mask_texture;
|
|
3007
3286
|
|
|
3008
3287
|
bool mask_isInBounds(vec2 texCoords) {
|
|
@@ -3027,10 +3306,10 @@ bool mask_isInBounds(vec2 texCoords) {
|
|
|
3027
3306
|
return maskValue < 0.5;
|
|
3028
3307
|
}
|
|
3029
3308
|
}
|
|
3030
|
-
`,
|
|
3031
|
-
${
|
|
3032
|
-
${
|
|
3033
|
-
`,
|
|
3309
|
+
`,Qn=`
|
|
3310
|
+
${li}
|
|
3311
|
+
${Xn}
|
|
3312
|
+
`,Jn={"vs:#decl":`
|
|
3034
3313
|
out vec2 mask_texCoords;
|
|
3035
3314
|
`,"vs:#main-end":`
|
|
3036
3315
|
vec4 mask_common_position;
|
|
@@ -3052,15 +3331,15 @@ in vec2 mask_texCoords;
|
|
|
3052
3331
|
|
|
3053
3332
|
if (!mask) discard;
|
|
3054
3333
|
}
|
|
3055
|
-
`},
|
|
3056
|
-
`),
|
|
3334
|
+
`},eo=t=>t&&"maskMap"in t?{mask_texture:t.maskMap}:t||{},fi={name:"mask",dependencies:[si.project],vs:$n,fs:Qn,inject:Jn,getUniforms:eo,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var Ue=_(h(),1);var ci=_(h(),1),to={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},te=class extends ci._LayersPass{constructor(e,i){super(e,i);let{mapSize:r=2048}=i;this.maskMap=e.createTexture({format:"rgba8unorm",width:r,height:r,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:r,height:r,colorAttachments:[this.maskMap]})}render(e){let i=2**e.channel,r=[255,255,255,255];super.render({...e,clearColor:r,colorMask:i,target:this.fbo,pass:"mask"})}getLayerParameters(e,i,r){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 ie=_(h(),1),ze=new ie.WebMercatorViewport({width:1,height:1,longitude:0,latitude:0,zoom:0});function re(t){let[e,i]=ze.projectPosition(t);return[e,i]}function ye(t){return t.isGeospatial?ze:t}function V(t,e){let i=[1/0,1/0,-1/0,-1/0];for(let r of t){let n=r.getBounds();if(n){let o=r.projectPosition(n[0],{viewport:e,autoOffset:!1}),a=r.projectPosition(n[1],{viewport:e,autoOffset:!1});i[0]=Math.min(i[0],o[0]),i[1]=Math.min(i[1],o[1]),i[2]=Math.max(i[2],a[0]),i[3]=Math.max(i[3],a[1])}}return Number.isFinite(i[0])?i:null}var io=2048;function j(t){let{bounds:e,viewport:i,border:r=0}=t,{isGeospatial:n}=i;if(e[2]<=e[0]||e[3]<=e[1])return null;let o=n?ze.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]):i.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:a,height:s,zoom:l}=t;if(l===void 0){a=a-r*2,s=s-r*2;let f=Math.min(a/(e[2]-e[0]),s/(e[3]-e[1]));l=Math.min(Math.log2(f),20)}else if(!a||!s){let f=2**l;a=Math.round(Math.abs(e[2]-e[0])*f),s=Math.round(Math.abs(e[3]-e[1])*f);let c=io-r*2;if(a>c||s>c){let u=c/Math.max(a,s);a=Math.round(a*u),s=Math.round(s*u),l+=Math.log2(u)}}return n?new ie.WebMercatorViewport({id:i.id,x:r,y:r,width:a,height:s,longitude:o[0],latitude:o[1],zoom:l,orthographic:!0}):new ie.OrthographicViewport({id:i.id,x:r,y:r,width:a,height:s,target:o,zoom:l,flipY:!1})}function ro(t,e){let i;if(e&&e.length===2){let[o,a]=e,s=t.getBounds({z:o}),l=t.getBounds({z:a});i=[Math.min(s[0],l[0]),Math.min(s[1],l[1]),Math.max(s[2],l[2]),Math.max(s[3],l[3])]}else i=t.getBounds();let r=t.projectPosition(i.slice(0,2)),n=t.projectPosition(i.slice(2,4));return[r[0],r[1],n[0],n[1]]}function H(t,e,i){if(!t)return[0,0,1,1];let r=ro(e,i),n=no(r);return t[2]-t[0]<=n[2]-n[0]&&t[3]-t[1]<=n[3]-n[1]?t:[Math.max(t[0],n[0]),Math.max(t[1],n[1]),Math.min(t[2],n[2]),Math.min(t[3],n[3])]}function no(t){let e=t[2]-t[0],i=t[3]-t[1],r=(t[0]+t[2])/2,n=(t[1]+t[3])/2;return[r-e,n-i,r+e,n+i]}var ne=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 te(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:i,viewports:r,onViewportActive:n,views:o,effects:a,isPicking:s}){let l=!1;if(s)return{didRender:l};let f=e.filter(p=>p.props.visible&&p.props.operation.includes("mask"));if(f.length===0)return this.masks=null,this.channels.length=0,{didRender:l};this.masks={};let c=this._sortMaskChannels(f),u=r[0],d=!this.lastViewport||!this.lastViewport.equals(u);if(u.resolution!==void 0)return Ue.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:l};for(let p in c){let m=this._renderChannel(c[p],{layerFilter:i,onViewportActive:n,views:o,effects:a,viewport:u,viewportChanged:d});l||(l=m)}return{didRender:l}}_renderChannel(e,{layerFilter:i,onViewportActive:r,views:n,effects:o,viewport:a,viewportChanged:s}){let l=!1,f=this.channels[e.index];if(!f)return l;let c=e===f||e.layers.length!==f.layers.length||e.layers.some((u,d)=>u!==f.layers[d]||u.props.transitions)||e.layerBounds.some((u,d)=>u!==f.layerBounds[d]);if(e.bounds=f.bounds,e.maskBounds=f.maskBounds,this.channels[e.index]=e,c||s){this.lastViewport=a;let u=V(e.layers,a);if(e.bounds=u&&H(u,a),c||!z(e.bounds,f.bounds)){let{maskPass:d,maskMap:p}=this,m=u&&j({bounds:e.bounds,viewport:a,width:p.width,height:p.height,border:1});e.maskBounds=m?m.getBounds():[0,0,1,1],d.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:i,viewports:m?[m]:[],onViewportActive:r,views:n,effects:o,shaderModuleProps:{project:{devicePixelRatio:1}}}),l=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},l}_sortMaskChannels(e){let i={},r=0;for(let n of e){let{id:o}=n.root,a=i[o];if(!a){if(++r>4){Ue.log.warn("Too many mask layers. The max supported is 4")();continue}a={id:o,index:this.channels.findIndex(s=>s?.id===o),layers:[],layerBounds:[],coordinateOrigin:n.root.props.coordinateOrigin,coordinateSystem:n.root.props.coordinateSystem},i[o]=a}a.layers.push(n),a.layerBounds.push(n.getBounds())}for(let n=0;n<4;n++){let o=this.channels[n];(!o||!(o.id in i))&&(this.channels[n]=null)}for(let n in i){let o=i[n];o.index<0&&(o.index=this.channels.findIndex(a=>!a),this.channels[o.index]=o)}return i}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 oo={maskId:"",maskByInstance:void 0,maskInverted:!1},oe=class extends C.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new ne)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=!!this.props.maskByInstance),this.state.maskByInstance=e,{modules:[fi]}}draw({context:e,shaderModuleProps:i}){let r={};r.maskByInstance=!!this.state.maskByInstance;let{maskId:n,maskInverted:o}=this.props,{maskChannels:a}=i.mask||{},{viewport:s}=e;if(a&&a[n]){let{index:l,bounds:f,coordinateOrigin:c}=a[n],{coordinateSystem:u}=a[n];r.enabled=!0,r.channel=l,r.inverted=o,u===C.COORDINATE_SYSTEM.DEFAULT&&(u=s.isGeospatial?C.COORDINATE_SYSTEM.LNGLAT:C.COORDINATE_SYSTEM.CARTESIAN);let d={modelMatrix:null,fromCoordinateOrigin:c,fromCoordinateSystem:u},p=this.projectPosition([f[0],f[1],0],d),m=this.projectPosition([f[2],f[3],0],d);r.bounds=[p[0],p[1],m[0],m[1]]}else n&&C.log.warn(`Could not find a mask layer with id: ${n}`)(),r.enabled=!1;this.setShaderModuleProps({mask:r})}};oe.defaultProps=oo;oe.extensionName="MaskExtension";var ui=oe;var bi=_(h(),1);var xi=_(h(),1);var Ve=_(h(),1),y={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},ao=Object.keys(y).map(t=>`const float TERRAIN_MODE_${t} = ${y[t]}.0;`).join(`
|
|
3335
|
+
`),di=ao+`
|
|
3057
3336
|
layout(std140) uniform terrainUniforms {
|
|
3058
3337
|
float mode;
|
|
3059
3338
|
vec4 bounds;
|
|
3060
3339
|
} terrain;
|
|
3061
3340
|
|
|
3062
3341
|
uniform sampler2D terrain_map;
|
|
3063
|
-
`,
|
|
3342
|
+
`,ae={name:"terrain",dependencies:[Ve.project],vs:`${di}
|
|
3064
3343
|
out vec3 commonPos;
|
|
3065
3344
|
// In globe mode, absolute Mercator position for terrain FBO UV lookups
|
|
3066
3345
|
out vec2 terrainMercPos;
|
|
@@ -3073,7 +3352,7 @@ vec2 terrain_globe_to_mercator(vec3 globePosition) {
|
|
|
3073
3352
|
float y = atanh(sinLat);
|
|
3074
3353
|
return (vec2(x, y) + PI) * WORLD_SCALE;
|
|
3075
3354
|
}
|
|
3076
|
-
`,fs:`${
|
|
3355
|
+
`,fs:`${di}in vec2 terrainMercPos;
|
|
3077
3356
|
in float terrainHeight;`,inject:{"vs:#main-start":`
|
|
3078
3357
|
if (terrain.mode == TERRAIN_MODE_SKIP) {
|
|
3079
3358
|
gl_Position = vec4(0.0);
|
|
@@ -3130,6 +3409,6 @@ if ((terrain.mode == TERRAIN_MODE_USE_COVER) || (terrain.mode == TERRAIN_MODE_US
|
|
|
3130
3409
|
}
|
|
3131
3410
|
return;
|
|
3132
3411
|
}
|
|
3133
|
-
`},getUniforms:(i={})=>{if(!i.dummyHeightMap)return{};if("terrainSkipRender"in i||"drawToTerrainHeightMap"in i){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:r,dummyHeightMap:n,terrainCover:o,useTerrainHeightMap:s,terrainSkipRender:a}=i,f=Fe.project.getUniforms(i.project),{commonOrigin:l}=f,c=a?v.SKIP:v.NONE,u=n,p=null;if(e)c=v.WRITE_HEIGHT_MAP,p=r;else if(s&&t)c=v.USE_HEIGHT_MAP,u=t,p=r;else if(o){let h=(i.isPicking?o.getPickingFramebuffer():o.getRenderFramebuffer())?.colorAttachments[0].texture;i.isPicking&&(c=v.SKIP),h?(u=h,c=c===v.SKIP?v.USE_COVER_ONLY:v.USE_COVER,p=o.bounds):i.isPicking&&!a&&(c=v.NONE)}return{mode:c,terrain_map:u,bounds:p?[p[0]-l[0],p[1]-l[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return{mode:v.NONE,terrain_map:i.dummyHeightMap,bounds:[0,0,0,0]}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};var zt=d(_(),1);function Y(i,e){return i.createFramebuffer({id:e.id,colorAttachments:[i.createTexture({id:e.id,...e.float&&{format:"rgba32float",type:5126},dimension:"2d",width:1,height:1,sampler:e.interpolate===!1?{minFilter:"nearest",magFilter:"nearest"}:{minFilter:"linear",magFilter:"linear"}})]})}var ae=class{constructor(e){this.isDirty=!0,this.renderViewport=null,this.bounds=null,this.layers=[],this.targetBounds=null,this.targetBoundsCommon=null,this.targetLayer=e,this.tile=Vt(e)}get id(){return this.targetLayer.id}get isActive(){return!!this.targetLayer.getCurrentLayer()}shouldUpdate({targetLayer:e,viewport:t,layers:r,layerNeedsRedraw:n}){e&&(this.targetLayer=e);let o=t?this._updateViewport(t):!1,s=r?this._updateLayers(r):!1;if(n){for(let a of this.layers)if(n[a]){s=!0;break}}return s||o}_updateLayers(e){let t=!1;if(e=this.tile?Ur(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let r=0;r<e.length;r++)if(e[r].id!==this.layers[r]){t=!0;break}return t&&(this.layers=e.map(r=>r.id)),t}_updateViewport(e){let t=this.targetLayer,r=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){r=!0,this.targetBounds=this.tile.boundingBox;let o=G(this.targetBounds[0]),s=G(this.targetBounds[1]);this.targetBoundsCommon=[o[0],o[1],s[0],s[1]]}}else this.targetBounds!==t.getBounds()&&(r=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=A([t],se(e)));if(!this.targetBoundsCommon)return!1;let n=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let o=this.renderViewport?.zoom;r=r||n!==o;let s=e instanceof zt._GlobeViewport?this.targetBoundsCommon:T(this.targetBoundsCommon,e),a=this.bounds;r=r||!a||s.some((f,l)=>f!==a[l]),this.bounds=s}return r&&(this.renderViewport=S({bounds:this.bounds,zoom:n,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=Y(this.targetLayer.context.device,{id:this.id})),this.fbo)}getPickingFramebuffer(){return!this.renderViewport||this.layers.length===0&&!this.targetLayer.props.pickable?null:(this.pickingFbo||(this.pickingFbo=Y(this.targetLayer.context.device,{id:`${this.id}-picking`,interpolate:!1})),this.pickingFbo)}filterLayers(e){return e.filter(({id:t})=>this.layers.includes(t))}delete(){let{fbo:e,pickingFbo:t}=this;e&&(e.colorAttachments[0].destroy(),e.destroy()),t&&(t.colorAttachments[0].destroy(),t.destroy())}};function Ur(i,e){return e.filter(t=>{let r=Vt(t);return r?jr(i.boundingBox,r.boundingBox):!0})}function Vt(i){for(;i;){let{tile:e}=i.props;if(e)return e;i=i.parent}return null}function jr(i,e){return i&&e?i[0][0]<e[1][0]&&e[0][0]<i[1][0]&&i[0][1]<e[1][1]&&e[0][1]<i[1][1]:!1}var Ut=d(_(),1),Gr={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},fe=class extends Ut._LayersPass{getRenderableLayers(e,t){let{layers:r}=t,n=[],o=this._getDrawLayerParams(e,t,!0);for(let s=0;s<r.length;s++){let a=r[s];!a.isComposite&&o[s].shouldDrawLayer&&n.push(a)}return n}renderHeightMap(e,t){let r=e.getRenderFramebuffer(),n=e.renderViewport;!r||!n||(r.resize(n),this.render({...t,target:r,pass:"terrain-height-map",layers:t.layers,viewports:[n],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let r=e.getRenderFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(t.layers);r.resize(n),this.render({...t,target:r,pass:`terrain-cover-${e.id}`,layers:o,viewports:[n],clearColor:[0,0,0,0]})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&Gr}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var jt=d(_(),1),le=class extends jt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:r}=t,n=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let o=this._getDrawLayerParams(e,t);for(let s=0;s<r.length;s++){let a=r[s];!a.isComposite&&o[s].shouldDrawLayer&&(n.push(a),this.drawParameters[a.id]=o[s].layerParameters)}return n}renderTerrainCover(e,t){let r=e.getPickingFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(t.layers),s=e.targetLayer;s.props.pickable&&o.unshift(s),r.resize(n);let f=this.drawParameters[s.id]?.blendColor?.[3]??0;this.render({...t,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:o,viewports:[n],cullRect:void 0,deviceRect:n,pickZ:!1,clearColor:[0,0,0,f]})}getLayerParameters(e,t,r){let n;return this.drawParameters[e.id]?n=this.drawParameters[e.id]:(n=super.getLayerParameters(e,t,r),n.blend=!0),{...n,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,t,r){return{...super.getShaderModuleProps(e,t,r),terrain:{project:r.project}}}};var Ht=d(_(),1),Gt=2048,K=class{static isSupported(e){return e.isTextureFormatRenderable("rgba32float")}constructor(e){this.renderViewport=null,this.bounds=null,this.layers=[],this.layersBounds=[],this.layersBoundsCommon=null,this.lastViewport=null,this.device=e}getRenderFramebuffer(){return this.renderViewport?(this.fbo||(this.fbo=Y(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let r=e.length!==this.layers.length||e.some((o,s)=>o!==this.layers[s]||o.props.transitions||o.getBounds()!==this.layersBounds[s]);r&&(this.layers=e,this.layersBounds=e.map(o=>o.getBounds()),this.layersBoundsCommon=A(e,se(t)));let n=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||n){let o=t instanceof Ht._GlobeViewport?this.layersBoundsCommon:T(this.layersBoundsCommon,t);if(o[2]<=o[0]||o[3]<=o[1])return this.renderViewport=null,!1;this.bounds=o,this.lastViewport=t;let s=t.scale,a=(o[2]-o[0])*s,f=(o[3]-o[1])*s,l=t.isGeospatial?G([t.longitude??0,t.latitude??0]):[t.center[0],t.center[1]];return this.renderViewport=a>0||f>0?S({bounds:[l[0]-1,l[1]-1,l[0]+1,l[1]+1],zoom:t.zoom,width:Math.min(a,Gt),height:Math.min(f,Gt),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var ue=class{constructor(){this.id="terrain-effect",this.props=null,this.useInPicking=!0,this.isPicking=!1,this.isDrapingEnabled=!1,this.terrainCovers=new Map}setup({device:e,deck:t}){this.dummyHeightMap=e.createTexture({width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new fe(e,{id:"terrain"}),this.terrainPickingPass=new le(e,{id:"terrain-picking"}),K.isSupported(e)?this.heightMap=new K(e):qt.log.warn("Terrain offset mode is not supported by this browser")(),t._addDefaultShaderModule(W)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:t}=e,r=e.pass.startsWith("picking");this.isPicking=r,this.isDrapingEnabled=!0;let n=t[0],o=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(n,e),s=o.filter(l=>l.props.operation.includes("terrain"));if(s.length===0)return;r||o.filter(c=>c.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(s,n,e);let a=o.filter(l=>l.state.terrainDrawMode==="drape"),f=e.effects?.filter(l=>l!==this);this._updateTerrainCovers(s,a,n,{...e,effects:f})}getShaderModuleProps(e,t){if(e.props.operation.includes("mask"))return{terrain:{dummyHeightMap:this.dummyHeightMap}};let{terrainDrawMode:r}=e.state,n=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=!!n?.getPickingFramebuffer()),{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:n,useTerrainHeightMap:r==="offset",terrainSkipRender:r==="drape"||!e.props.operation.includes("draw")}}}cleanup({deck:e}){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);for(let t of this.terrainCovers.values())t.delete();this.terrainCovers.clear(),e._removeDefaultShaderModule(W)}_updateHeightMap(e,t,r){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...r,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,t,r,n){let o={};for(let s of t)s.state.terrainCoverNeedsRedraw&&(o[s.id]=!0,s.state.terrainCoverNeedsRedraw=!1);for(let s of this.terrainCovers.values())s.isDirty=s.isDirty||s.shouldUpdate({layerNeedsRedraw:o});for(let s of e)this._updateTerrainCover(s,t,r,n);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,r,n){let o=this.isPicking?this.terrainPickingPass:this.terrainPass,s=this.terrainCovers.get(e.id);s||(s=new ae(e),this.terrainCovers.set(e.id,s));try{let a=s.shouldUpdate({targetLayer:e,viewport:r,layers:t});(this.isPicking||s.isDirty||a)&&(o.renderTerrainCover(s,{...n,layers:t,shaderModuleProps:{terrain:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1},project:{devicePixelRatio:1}}}),this.isPicking||(s.isDirty=!1))}catch(a){e.raiseError(a,`Error rendering terrain cover ${s.id}`)}}_pruneTerrainCovers(){let e=[];for(let[t,r]of this.terrainCovers)r.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var Hr={terrainDrawMode:void 0},Z=class extends Wt.LayerExtension{getShaders(){return{modules:[W]}}initializeState(){this.context.deck?._addDefaultEffect(new ue)}updateState(e){let{props:t,oldProps:r}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===r.terrainDrawMode&&t.extruded===r.extruded)return;let{terrainDrawMode:n}=t;if(!n){let o=this.props.extruded,s=this.getAttributeManager()?.attributes,a=s&&"instancePositions"in s;n=o||a?"offset":"drape"}this.setState({terrainDrawMode:n})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};Z.defaultProps=Hr;Z.extensionName="TerrainExtension";var Yt=Z;return Xt($);})();
|
|
3412
|
+
`},getUniforms:(t={})=>{if(!t.dummyHeightMap)return{};if("terrainSkipRender"in t||"drawToTerrainHeightMap"in t){let{drawToTerrainHeightMap:e,heightMap:i,heightMapBounds:r,dummyHeightMap:n,terrainCover:o,useTerrainHeightMap:a,terrainSkipRender:s}=t,l=Ve.project.getUniforms(t.project),{commonOrigin:f}=l,c=s?y.SKIP:y.NONE,u=n,d=null;if(e)c=y.WRITE_HEIGHT_MAP,d=r;else if(a&&i)c=y.USE_HEIGHT_MAP,u=i,d=r;else if(o){let m=(t.isPicking?o.getPickingFramebuffer():o.getRenderFramebuffer())?.colorAttachments[0].texture;t.isPicking&&(c=y.SKIP),m?(u=m,c=c===y.SKIP?y.USE_COVER_ONLY:y.USE_COVER,d=o.bounds):t.isPicking&&!s&&(c=y.NONE)}return{mode:c,terrain_map:u,bounds:d?[d[0]-f[0],d[1]-f[1],d[2]-d[0],d[3]-d[1]]:[0,0,0,0]}}return{mode:y.NONE,terrain_map:t.dummyHeightMap,bounds:[0,0,0,0]}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};var pi=_(h(),1);function se(t,e){return t.createFramebuffer({id:e.id,colorAttachments:[t.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 Pe=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=_i(e)}get id(){return this.targetLayer.id}get isActive(){return!!this.targetLayer.getCurrentLayer()}shouldUpdate({targetLayer:e,viewport:i,layers:r,layerNeedsRedraw:n}){e&&(this.targetLayer=e);let o=i?this._updateViewport(i):!1,a=r?this._updateLayers(r):!1;if(n){for(let s of this.layers)if(n[s]){a=!0;break}}return a||o}_updateLayers(e){let i=!1;if(e=this.tile?so(this.tile,e):e,e.length!==this.layers.length)i=!0;else for(let r=0;r<e.length;r++)if(e[r].id!==this.layers[r]){i=!0;break}return i&&(this.layers=e.map(r=>r.id)),i}_updateViewport(e){let i=this.targetLayer,r=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){r=!0,this.targetBounds=this.tile.boundingBox;let o=re(this.targetBounds[0]),a=re(this.targetBounds[1]);this.targetBoundsCommon=[o[0],o[1],a[0],a[1]]}}else this.targetBounds!==i.getBounds()&&(r=!0,this.targetBounds=i.getBounds(),this.targetBoundsCommon=V([i],ye(e)));if(!this.targetBoundsCommon)return!1;let n=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let o=this.renderViewport?.zoom;r=r||n!==o;let a=e instanceof pi._GlobeViewport?this.targetBoundsCommon:H(this.targetBoundsCommon,e),s=this.bounds;r=r||!s||a.some((l,f)=>l!==s[f]),this.bounds=a}return r&&(this.renderViewport=j({bounds:this.bounds,zoom:n,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=se(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=se(this.targetLayer.context.device,{id:`${this.id}-picking`,interpolate:!1})),this.pickingFbo)}filterLayers(e){return e.filter(({id:i})=>this.layers.includes(i))}delete(){let{fbo:e,pickingFbo:i}=this;e&&(e.colorAttachments[0].destroy(),e.destroy()),i&&(i.colorAttachments[0].destroy(),i.destroy())}};function so(t,e){return e.filter(i=>{let r=_i(i);return r?lo(t.boundingBox,r.boundingBox):!0})}function _i(t){for(;t;){let{tile:e}=t.props;if(e)return e;t=t.parent}return null}function lo(t,e){return t&&e?t[0][0]<e[1][0]&&e[0][0]<t[1][0]&&t[0][1]<e[1][1]&&e[0][1]<t[1][1]:!1}var hi=_(h(),1),fo={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},Ee=class extends hi._LayersPass{getRenderableLayers(e,i){let{layers:r}=i,n=[],o=this._getDrawLayerParams(e,i,!0);for(let a=0;a<r.length;a++){let s=r[a];!s.isComposite&&o[a].shouldDrawLayer&&n.push(s)}return n}renderHeightMap(e,i){let r=e.getRenderFramebuffer(),n=e.renderViewport;!r||!n||(r.resize(n),this.render({...i,target:r,pass:"terrain-height-map",layers:i.layers,viewports:[n],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,i){let r=e.getRenderFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(i.layers);r.resize(n),this.render({...i,target:r,pass:`terrain-cover-${e.id}`,layers:o,viewports:[n],clearColor:[0,0,0,0]})}getLayerParameters(e,i,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&fo}}getShaderModuleProps(e,i,r){return{terrain:{project:r.project}}}};var mi=_(h(),1),Me=class extends mi._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,i){let{layers:r}=i,n=[];this.drawParameters={},this._resetColorEncoder(i.pickZ);let o=this._getDrawLayerParams(e,i);for(let a=0;a<r.length;a++){let s=r[a];!s.isComposite&&o[a].shouldDrawLayer&&(n.push(s),this.drawParameters[s.id]=o[a].layerParameters)}return n}renderTerrainCover(e,i){let r=e.getPickingFramebuffer(),n=e.renderViewport;if(!r||!n)return;let o=e.filterLayers(i.layers),a=e.targetLayer;a.props.pickable&&o.unshift(a),r.resize(n);let l=this.drawParameters[a.id]?.blendColor?.[3]??0;this.render({...i,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:o,viewports:[n],cullRect:void 0,deviceRect:n,pickZ:!1,clearColor:[0,0,0,l]})}getLayerParameters(e,i,r){let n;return this.drawParameters[e.id]?n=this.drawParameters[e.id]:(n=super.getLayerParameters(e,i,r),n.blend=!0),{...n,depthCompare:"always",blendAlphaSrcFactor:"constant"}}getShaderModuleProps(e,i,r){return{...super.getShaderModuleProps(e,i,r),terrain:{project:r.project}}}};var vi=_(h(),1),gi=2048,le=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=se(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:i}){let r=e.length!==this.layers.length||e.some((o,a)=>o!==this.layers[a]||o.props.transitions||o.getBounds()!==this.layersBounds[a]);r&&(this.layers=e,this.layersBounds=e.map(o=>o.getBounds()),this.layersBoundsCommon=V(e,ye(i)));let n=!this.lastViewport||!i.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||n){let o=i instanceof vi._GlobeViewport?this.layersBoundsCommon:H(this.layersBoundsCommon,i);if(o[2]<=o[0]||o[3]<=o[1])return this.renderViewport=null,!1;this.bounds=o,this.lastViewport=i;let a=i.scale,s=(o[2]-o[0])*a,l=(o[3]-o[1])*a,f=i.isGeospatial?re([i.longitude??0,i.latitude??0]):[i.center[0],i.center[1]];return this.renderViewport=s>0||l>0?j({bounds:[f[0]-1,f[1]-1,f[0]+1,f[1]+1],zoom:i.zoom,width:Math.min(s,gi),height:Math.min(l,gi),viewport:i}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var Ae=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:i}){this.dummyHeightMap=e.createTexture({width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new Ee(e,{id:"terrain"}),this.terrainPickingPass=new Me(e,{id:"terrain-picking"}),le.isSupported(e)?this.heightMap=new le(e):xi.log.warn("Terrain offset mode is not supported by this browser")(),i._addDefaultShaderModule(ae)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:i}=e,r=e.pass.startsWith("picking");this.isPicking=r,this.isDrapingEnabled=!0;let n=i[0],o=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(n,e),a=o.filter(f=>f.props.operation.includes("terrain"));if(a.length===0)return;r||o.filter(c=>c.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(a,n,e);let s=o.filter(f=>f.state.terrainDrawMode==="drape"),l=e.effects?.filter(f=>f!==this);this._updateTerrainCovers(a,s,n,{...e,effects:l})}getShaderModuleProps(e,i){if(e.props.operation.includes("mask"))return{terrain:{dummyHeightMap:this.dummyHeightMap}};let{terrainDrawMode:r}=e.state,n=this.isDrapingEnabled?this.terrainCovers.get(e.id)??null:null;return this.isPicking&&e.props.operation.includes("terrain")&&(e.state._hasPickingCover=!!n?.getPickingFramebuffer()),{terrain:{project:i.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:n,useTerrainHeightMap:r==="offset",terrainSkipRender:r==="drape"||!e.props.operation.includes("draw")}}}cleanup({deck:e}){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);for(let i of this.terrainCovers.values())i.delete();this.terrainCovers.clear(),e._removeDefaultShaderModule(ae)}_updateHeightMap(e,i,r){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:i})||this.terrainPass.renderHeightMap(this.heightMap,{...r,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,i,r,n){let o={};for(let a of i)a.state.terrainCoverNeedsRedraw&&(o[a.id]=!0,a.state.terrainCoverNeedsRedraw=!1);for(let a of this.terrainCovers.values())a.isDirty=a.isDirty||a.shouldUpdate({layerNeedsRedraw:o});for(let a of e)this._updateTerrainCover(a,i,r,n);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,i,r,n){let o=this.isPicking?this.terrainPickingPass:this.terrainPass,a=this.terrainCovers.get(e.id);a||(a=new Pe(e),this.terrainCovers.set(e.id,a));try{let s=a.shouldUpdate({targetLayer:e,viewport:r,layers:i});(this.isPicking||a.isDirty||s)&&(o.renderTerrainCover(a,{...n,layers:i,shaderModuleProps:{terrain:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1},project:{devicePixelRatio:1}}}),this.isPicking||(a.isDirty=!1))}catch(s){e.raiseError(s,`Error rendering terrain cover ${a.id}`)}}_pruneTerrainCovers(){let e=[];for(let[i,r]of this.terrainCovers)r.isActive||e.push(i);for(let i of e)this.terrainCovers.delete(i)}};var co={terrainDrawMode:void 0},fe=class extends bi.LayerExtension{getShaders(){return{modules:[ae]}}initializeState(){this.context.deck?._addDefaultEffect(new Ae)}updateState(e){let{props:i,oldProps:r}=e;if(this.state.terrainDrawMode&&i.terrainDrawMode===r.terrainDrawMode&&i.extruded===r.extruded)return;let{terrainDrawMode:n}=i;if(!n){let o=this.props.extruded,a=this.getAttributeManager()?.attributes,s=a&&"instancePositions"in a;n=o||s?"offset":"drape"}this.setState({terrainDrawMode:n})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};fe.defaultProps=co;fe.extensionName="TerrainExtension";var yi=fe;return Oi(ce);})();
|
|
3134
3413
|
return __exports__;
|
|
3135
3414
|
});
|