@deck.gl/extensions 9.0.40 → 9.1.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.
Files changed (160) hide show
  1. package/dist/brushing/brushing-extension.d.ts +1 -0
  2. package/dist/brushing/brushing-extension.d.ts.map +1 -1
  3. package/dist/brushing/brushing-extension.js +16 -19
  4. package/dist/brushing/brushing-extension.js.map +1 -0
  5. package/dist/brushing/shader-module.d.ts +8 -2
  6. package/dist/brushing/shader-module.d.ts.map +1 -1
  7. package/dist/brushing/shader-module.js +75 -50
  8. package/dist/brushing/shader-module.js.map +1 -0
  9. package/dist/clip/clip-extension.d.ts +5 -2
  10. package/dist/clip/clip-extension.d.ts.map +1 -1
  11. package/dist/clip/clip-extension.js +37 -42
  12. package/dist/clip/clip-extension.js.map +1 -0
  13. package/dist/collision-filter/collision-filter-effect.d.ts +4 -4
  14. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
  15. package/dist/collision-filter/collision-filter-effect.js +28 -13
  16. package/dist/collision-filter/collision-filter-effect.js.map +1 -0
  17. package/dist/collision-filter/collision-filter-extension.d.ts +1 -1
  18. package/dist/collision-filter/collision-filter-extension.d.ts.map +1 -1
  19. package/dist/collision-filter/collision-filter-extension.js +6 -6
  20. package/dist/collision-filter/collision-filter-extension.js.map +1 -0
  21. package/dist/collision-filter/collision-filter-pass.d.ts +9 -5
  22. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
  23. package/dist/collision-filter/collision-filter-pass.js +15 -4
  24. package/dist/collision-filter/collision-filter-pass.js.map +1 -0
  25. package/dist/collision-filter/shader-module.d.ts +3 -2
  26. package/dist/collision-filter/shader-module.d.ts.map +1 -1
  27. package/dist/collision-filter/shader-module.js +75 -52
  28. package/dist/collision-filter/shader-module.js.map +1 -0
  29. package/dist/data-filter/aggregator.d.ts +4 -10
  30. package/dist/data-filter/aggregator.d.ts.map +1 -1
  31. package/dist/data-filter/aggregator.js +15 -8
  32. package/dist/data-filter/aggregator.js.map +1 -0
  33. package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
  34. package/dist/data-filter/data-filter-extension.js +49 -39
  35. package/dist/data-filter/data-filter-extension.js.map +1 -0
  36. package/dist/data-filter/shader-module.d.ts +12 -5
  37. package/dist/data-filter/shader-module.d.ts.map +1 -1
  38. package/dist/data-filter/shader-module.js +190 -131
  39. package/dist/data-filter/shader-module.js.map +1 -0
  40. package/dist/dist.dev.js +2720 -2037
  41. package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
  42. package/dist/fill-style/fill-style-extension.js +12 -4
  43. package/dist/fill-style/fill-style-extension.js.map +1 -0
  44. package/dist/fill-style/shader-module.d.ts +64 -6
  45. package/dist/fill-style/shader-module.d.ts.map +1 -1
  46. package/dist/fill-style/shader-module.js +74 -51
  47. package/dist/fill-style/shader-module.js.map +1 -0
  48. package/dist/fp64/fp64-extension.d.ts +1 -0
  49. package/dist/fp64/fp64-extension.d.ts.map +1 -1
  50. package/dist/fp64/fp64-extension.js +8 -19
  51. package/dist/fp64/fp64-extension.js.map +1 -0
  52. package/dist/fp64/project64.d.ts +2 -2
  53. package/dist/fp64/project64.d.ts.map +1 -1
  54. package/dist/fp64/project64.glsl.d.ts +1 -1
  55. package/dist/fp64/project64.glsl.d.ts.map +1 -1
  56. package/dist/fp64/project64.glsl.js +19 -21
  57. package/dist/fp64/project64.glsl.js.map +1 -0
  58. package/dist/fp64/project64.js +25 -24
  59. package/dist/fp64/project64.js.map +1 -0
  60. package/dist/index.cjs +1034 -528
  61. package/dist/index.cjs.map +4 -4
  62. package/dist/index.d.ts +1 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +4 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/mask/mask-effect.d.ts +5 -3
  67. package/dist/mask/mask-effect.d.ts.map +1 -1
  68. package/dist/mask/mask-effect.js +13 -5
  69. package/dist/mask/mask-effect.js.map +1 -0
  70. package/dist/mask/mask-extension.d.ts +1 -1
  71. package/dist/mask/mask-extension.d.ts.map +1 -1
  72. package/dist/mask/mask-extension.js +14 -8
  73. package/dist/mask/mask-extension.js.map +1 -0
  74. package/dist/mask/mask-pass.d.ts +2 -43
  75. package/dist/mask/mask-pass.d.ts.map +1 -1
  76. package/dist/mask/mask-pass.js +5 -1
  77. package/dist/mask/mask-pass.js.map +1 -0
  78. package/dist/mask/shader-module.d.ts +60 -3
  79. package/dist/mask/shader-module.d.ts.map +1 -1
  80. package/dist/mask/shader-module.js +74 -46
  81. package/dist/mask/shader-module.js.map +1 -0
  82. package/dist/path-style/path-style-extension.d.ts.map +1 -1
  83. package/dist/path-style/path-style-extension.js +21 -24
  84. package/dist/path-style/path-style-extension.js.map +1 -0
  85. package/dist/path-style/shaders.glsl.d.ts.map +1 -1
  86. package/dist/path-style/shaders.glsl.js +12 -7
  87. package/dist/path-style/shaders.glsl.js.map +1 -0
  88. package/dist/terrain/height-map-builder.d.ts.map +1 -1
  89. package/dist/terrain/height-map-builder.js +4 -0
  90. package/dist/terrain/height-map-builder.js.map +1 -0
  91. package/dist/terrain/shader-module.d.ts +60 -6
  92. package/dist/terrain/shader-module.d.ts.map +1 -1
  93. package/dist/terrain/shader-module.js +70 -61
  94. package/dist/terrain/shader-module.js.map +1 -0
  95. package/dist/terrain/terrain-cover.d.ts.map +1 -1
  96. package/dist/terrain/terrain-cover.js +4 -0
  97. package/dist/terrain/terrain-cover.js.map +1 -0
  98. package/dist/terrain/terrain-effect.d.ts +4 -2
  99. package/dist/terrain/terrain-effect.d.ts.map +1 -1
  100. package/dist/terrain/terrain-effect.js +32 -18
  101. package/dist/terrain/terrain-effect.js.map +1 -0
  102. package/dist/terrain/terrain-extension.d.ts.map +1 -1
  103. package/dist/terrain/terrain-extension.js +4 -0
  104. package/dist/terrain/terrain-extension.js.map +1 -0
  105. package/dist/terrain/terrain-pass.d.ts +6 -41
  106. package/dist/terrain/terrain-pass.d.ts.map +1 -1
  107. package/dist/terrain/terrain-pass.js +12 -1
  108. package/dist/terrain/terrain-pass.js.map +1 -0
  109. package/dist/terrain/terrain-picking-pass.d.ts +7 -1
  110. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
  111. package/dist/terrain/terrain-picking-pass.js +12 -1
  112. package/dist/terrain/terrain-picking-pass.js.map +1 -0
  113. package/dist/terrain/utils.d.ts.map +1 -1
  114. package/dist/terrain/utils.js +4 -0
  115. package/dist/terrain/utils.js.map +1 -0
  116. package/dist/utils/debug.d.ts +2 -2
  117. package/dist/utils/debug.d.ts.map +1 -1
  118. package/dist/utils/debug.js +4 -1
  119. package/dist/utils/debug.js.map +1 -0
  120. package/dist/utils/projection-utils.d.ts.map +1 -1
  121. package/dist/utils/projection-utils.js +4 -0
  122. package/dist/utils/projection-utils.js.map +1 -0
  123. package/dist.min.js +1102 -817
  124. package/package.json +8 -8
  125. package/src/brushing/brushing-extension.ts +17 -20
  126. package/src/brushing/shader-module.ts +58 -47
  127. package/src/clip/clip-extension.ts +38 -40
  128. package/src/collision-filter/collision-filter-effect.ts +31 -20
  129. package/src/collision-filter/collision-filter-extension.ts +6 -7
  130. package/src/collision-filter/collision-filter-pass.ts +17 -6
  131. package/src/collision-filter/shader-module.ts +40 -22
  132. package/src/data-filter/aggregator.ts +23 -11
  133. package/src/data-filter/data-filter-extension.ts +76 -49
  134. package/src/data-filter/shader-module.ts +150 -90
  135. package/src/fill-style/fill-style-extension.ts +13 -5
  136. package/src/fill-style/shader-module.ts +84 -52
  137. package/src/fp64/fp64-extension.ts +8 -19
  138. package/src/fp64/project64.glsl.ts +18 -21
  139. package/src/fp64/project64.ts +27 -28
  140. package/src/index.ts +5 -0
  141. package/src/mask/mask-effect.ts +17 -7
  142. package/src/mask/mask-extension.ts +16 -9
  143. package/src/mask/mask-pass.ts +17 -3
  144. package/src/mask/shader-module.ts +63 -27
  145. package/src/path-style/path-style-extension.ts +27 -28
  146. package/src/path-style/shaders.glsl.ts +13 -7
  147. package/src/terrain/height-map-builder.ts +4 -0
  148. package/src/terrain/shader-module.ts +62 -44
  149. package/src/terrain/terrain-cover.ts +4 -0
  150. package/src/terrain/terrain-effect.ts +36 -19
  151. package/src/terrain/terrain-extension.ts +4 -0
  152. package/src/terrain/terrain-pass.ts +19 -3
  153. package/src/terrain/terrain-picking-pass.ts +15 -2
  154. package/src/terrain/utils.ts +4 -0
  155. package/src/utils/debug.ts +4 -0
  156. package/src/utils/projection-utils.ts +4 -0
  157. package/dist/utils/syntax-tags.d.ts +0 -6
  158. package/dist/utils/syntax-tags.d.ts.map +0 -1
  159. package/dist/utils/syntax-tags.js +0 -5
  160. package/src/utils/syntax-tags.ts +0 -5
package/dist.min.js CHANGED
@@ -4,166 +4,203 @@
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 It=Object.create;var X=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var kt=Object.getOwnPropertyNames;var Rt=Object.getPrototypeOf,Nt=Object.prototype.hasOwnProperty;var ge=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),xe=(r,e)=>{for(var t in e)X(r,t,{get:e[t],enumerable:!0})},$=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of kt(e))!Nt.call(r,i)&&i!==t&&X(r,i,{get:()=>e[i],enumerable:!(o=St(e,i))||o.enumerable});return r},P=(r,e,t)=>($(r,e,"default"),t&&$(t,e,"default")),_=(r,e,t)=>(t=r!=null?It(Rt(r)):{},$(e||!r||!r.__esModule?X(t,"default",{value:r,enumerable:!0}):t,r)),wt=r=>$(X({},"__esModule",{value:!0}),r);var d=ge((Po,Pe)=>{Pe.exports=globalThis.deck});var ke=ge((Ao,Se)=>{Se.exports=globalThis.luma});var K={};xe(K,{BrushingExtension:()=>Te,ClipExtension:()=>lt,CollisionFilterExtension:()=>dt,DataFilterExtension:()=>je,FillStyleExtension:()=>st,Fp64Extension:()=>Je,MaskExtension:()=>gt,PathStyleExtension:()=>rt,_TerrainExtension:()=>Ft,project64:()=>re});var v={},ye=_(d(),1);P(v,_(d(),1));if(!ye.Layer)throw new Error("@deck.gl/core is not found");P(K,v);var Me=_(d(),1);var be=_(d(),1);var Bt=`
8
- uniform bool brushing_enabled;
9
- uniform int brushing_target;
10
- uniform vec2 brushing_mousePos;
11
- uniform float brushing_radius;
12
- in vec2 brushingTargets;
13
- out float brushing_isVisible;
14
- bool brushing_isPointInRange(vec2 position) {
15
- if (!brushing_enabled) {
16
- return true;
17
- }
18
- vec2 source_commonspace = project_position(position);
19
- vec2 target_commonspace = project_position(brushing_mousePos);
20
- float distance = length((target_commonspace - source_commonspace) / project_uCommonUnitsPerMeter.xy);
21
- return distance <= brushing_radius;
22
- }
23
- bool brushing_arePointsInRange(vec2 sourcePos, vec2 targetPos) {
24
- return brushing_isPointInRange(sourcePos) || brushing_isPointInRange(targetPos);
25
- }
26
- void brushing_setVisible(bool visible) {
27
- brushing_isVisible = float(visible);
28
- }
29
- `,Dt=`
30
- uniform bool brushing_enabled;
31
- in float brushing_isVisible;
32
- `,Vt={source:0,target:1,custom:2,source_target:3},jt={"vs:DECKGL_FILTER_GL_POSITION":`
33
- vec2 brushingTarget;
34
- vec2 brushingSource;
35
- if (brushing_target == 3) {
36
- brushingTarget = geometry.worldPositionAlt.xy;
37
- brushingSource = geometry.worldPosition.xy;
38
- } else if (brushing_target == 0) {
39
- brushingTarget = geometry.worldPosition.xy;
40
- } else if (brushing_target == 1) {
41
- brushingTarget = geometry.worldPositionAlt.xy;
42
- } else {
43
- brushingTarget = brushingTargets;
44
- }
45
- bool visible;
46
- if (brushing_target == 3) {
47
- visible = brushing_arePointsInRange(brushingSource, brushingTarget);
48
- } else {
49
- visible = brushing_isPointInRange(brushingTarget);
50
- }
51
- brushing_setVisible(visible);
52
- `,"fs:DECKGL_FILTER_COLOR":`
53
- if (brushing_enabled && brushing_isVisible < 0.5) {
7
+ "use strict";var __exports__=(()=>{var jt=Object.create;var Q=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var zt=Object.getOwnPropertyNames;var Ut=Object.getPrototypeOf,Gt=Object.prototype.hasOwnProperty;var Te=(o,e)=>()=>(e||o((e={exports:{}}).exports,e),e.exports),Ae=(o,e)=>{for(var t in e)Q(o,t,{get:e[t],enumerable:!0})},X=(o,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of zt(e))!Gt.call(o,s)&&s!==t&&Q(o,s,{get:()=>e[s],enumerable:!(r=Vt(e,s))||r.enumerable});return o},y=(o,e,t)=>(X(o,e,"default"),t&&X(t,e,"default")),d=(o,e,t)=>(t=o!=null?jt(Ut(o)):{},X(e||!o||!o.__esModule?Q(t,"default",{value:o,enumerable:!0}):t,o)),qt=o=>X(Q({},"__esModule",{value:!0}),o);var _=Te((Dr,Oe)=>{Oe.exports=globalThis.deck});var qe=Te((qr,Ge)=>{Ge.exports=globalThis.luma});var Z={};Ae(Z,{BrushingExtension:()=>Re,ClipExtension:()=>xt,CollisionFilterExtension:()=>Ft,DataFilterExtension:()=>Ze,FillStyleExtension:()=>ht,Fp64Extension:()=>ct,MaskExtension:()=>Ct,PathStyleExtension:()=>pt,_TerrainExtension:()=>Dt,project64:()=>re});var g={},Le=d(_(),1);y(g,d(_(),1));if(!Le.Layer)throw new Error("@deck.gl/core is not found");y(Z,g);var ke=d(_(),1);var Ce=d(_(),1),Se=`uniform brushingUniforms {
8
+ bool enabled;
9
+ highp int target;
10
+ vec2 mousePos;
11
+ float radius;
12
+ } brushing;
13
+ `,Ht=`
14
+ in vec2 brushingTargets;
15
+
16
+ out float brushing_isVisible;
17
+
18
+ bool brushing_isPointInRange(vec2 position) {
19
+ if (!brushing.enabled) {
20
+ return true;
21
+ }
22
+ vec2 source_commonspace = project_position(position);
23
+ vec2 target_commonspace = project_position(brushing.mousePos);
24
+ float distance = length((target_commonspace - source_commonspace) / project.commonUnitsPerMeter.xy);
25
+
26
+ return distance <= brushing.radius;
27
+ }
28
+
29
+ bool brushing_arePointsInRange(vec2 sourcePos, vec2 targetPos) {
30
+ return brushing_isPointInRange(sourcePos) || brushing_isPointInRange(targetPos);
31
+ }
32
+
33
+ void brushing_setVisible(bool visible) {
34
+ brushing_isVisible = float(visible);
35
+ }
36
+ `,Yt=`
37
+ ${Se}
38
+ ${Ht}
39
+ `,Wt=`
40
+ in float brushing_isVisible;
41
+ `,Kt=`
42
+ ${Se}
43
+ ${Wt}
44
+ `,$t={source:0,target:1,custom:2,source_target:3},Zt={"vs:DECKGL_FILTER_GL_POSITION":`
45
+ vec2 brushingTarget;
46
+ vec2 brushingSource;
47
+ if (brushing.target == 3) {
48
+ brushingTarget = geometry.worldPositionAlt.xy;
49
+ brushingSource = geometry.worldPosition.xy;
50
+ } else if (brushing.target == 0) {
51
+ brushingTarget = geometry.worldPosition.xy;
52
+ } else if (brushing.target == 1) {
53
+ brushingTarget = geometry.worldPositionAlt.xy;
54
+ } else {
55
+ brushingTarget = brushingTargets;
56
+ }
57
+ bool visible;
58
+ if (brushing.target == 3) {
59
+ visible = brushing_arePointsInRange(brushingSource, brushingTarget);
60
+ } else {
61
+ visible = brushing_isPointInRange(brushingTarget);
62
+ }
63
+ brushing_setVisible(visible);
64
+ `,"fs:DECKGL_FILTER_COLOR":`
65
+ if (brushing.enabled && brushing_isVisible < 0.5) {
54
66
  discard;
55
67
  }
56
- `},Ee={name:"brushing",dependencies:[be.project],vs:Bt,fs:Dt,inject:jt,getUniforms:r=>{if(!r||!("viewport"in r))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:o="source",mousePosition:i,viewport:s}=r;return{brushing_enabled:Boolean(e&&i&&s.containsPixel(i)),brushing_radius:t,brushing_target:Vt[o]||0,brushing_mousePos:i?s.unproject([i.x-s.x,i.y-s.y]):[0,0]}}};var zt={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},F=class extends Me.LayerExtension{getShaders(){return{modules:[Ee]}}initializeState(e,t){let o=this.getAttributeManager();o&&o.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let i=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=i,e.deck&&e.deck.eventManager.on({pointermove:i,pointerleave:i})}finalizeState(e,t){if(e.deck){let o=this.state.onMouseMove;e.deck.eventManager.off({pointermove:o,pointerleave:o})}}};F.defaultProps=zt;F.extensionName="BrushingExtension";var Te=F;var b=_(d(),1);var Ae=`
57
- uniform bool filter_useSoftMargin;
58
- uniform bool filter_enabled;
59
- uniform bool filter_transformSize;
60
- uniform ivec4 filter_categoryBitMask;
68
+ `},Ie={name:"brushing",dependencies:[Ce.project],vs:Yt,fs:Kt,inject:Zt,getUniforms:o=>{if(!o||!("viewport"in o))return{};let{brushingEnabled:e=!0,brushingRadius:t=1e4,brushingTarget:r="source",mousePosition:s,viewport:i}=o;return{enabled:Boolean(e&&s&&i.containsPixel(s)),radius:t,target:$t[r]||0,mousePos:s?i.unproject([s.x-i.x,s.y-i.y]):[0,0]}},uniformTypes:{enabled:"i32",target:"i32",mousePos:"vec2<f32>",radius:"f32"}};var Xt={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},C=class extends ke.LayerExtension{getShaders(){return{modules:[Ie]}}initializeState(e,t){let r=this.getAttributeManager();r&&r.add({brushingTargets:{size:2,stepMode:"dynamic",accessor:"getBrushingTarget"}});let s=()=>{this.getCurrentLayer()?.setNeedsRedraw()};this.state.onMouseMove=s,e.deck&&e.deck.eventManager.on({pointermove:s,pointerleave:s})}finalizeState(e,t){if(e.deck){let r=this.state.onMouseMove;e.deck.eventManager.off({pointermove:r,pointerleave:r})}}draw(e,t){let{viewport:r,mousePosition:s}=e.context,{brushingEnabled:i,brushingRadius:n,brushingTarget:a}=this.props,l={viewport:r,mousePosition:s,brushingEnabled:i,brushingRadius:n,brushingTarget:a};this.setShaderModuleProps({brushing:l})}};C.defaultProps=Xt;C.extensionName="BrushingExtension";var Re=C;var E=d(_(),1);var we=`uniform dataFilterUniforms {
69
+ bool useSoftMargin;
70
+ bool enabled;
71
+ bool transformSize;
72
+ bool transformColor;
73
+ #ifdef DATAFILTER_TYPE
74
+ DATAFILTER_TYPE min;
75
+ DATAFILTER_TYPE softMin;
76
+ DATAFILTER_TYPE softMax;
77
+ DATAFILTER_TYPE max;
78
+ #ifdef DATAFILTER_DOUBLE
79
+ DATAFILTER_TYPE min64High;
80
+ DATAFILTER_TYPE max64High;
81
+ #endif
82
+ #endif
83
+ #ifdef DATACATEGORY_TYPE
84
+ highp uvec4 categoryBitMask;
85
+ #endif
86
+ } dataFilter;
87
+ `,Qt=`
61
88
  #ifdef DATAFILTER_TYPE
62
- uniform DATAFILTER_TYPE filter_min;
63
- uniform DATAFILTER_TYPE filter_softMin;
64
- uniform DATAFILTER_TYPE filter_softMax;
65
- uniform DATAFILTER_TYPE filter_max;
66
- in DATAFILTER_TYPE filterValues;
89
+ in DATAFILTER_TYPE filterValues;
67
90
  #ifdef DATAFILTER_DOUBLE
68
- in DATAFILTER_TYPE filterValues64Low;
69
- uniform DATAFILTER_TYPE filter_min64High;
70
- uniform DATAFILTER_TYPE filter_max64High;
91
+ in DATAFILTER_TYPE filterValues64Low;
71
92
  #endif
72
93
  #endif
94
+
73
95
  #ifdef DATACATEGORY_TYPE
74
- in DATACATEGORY_TYPE filterCategoryValues;
96
+ in DATACATEGORY_TYPE filterCategoryValues;
75
97
  #endif
98
+
76
99
  out float dataFilter_value;
100
+
77
101
  float dataFilter_reduceValue(float value) {
78
- return value;
102
+ return value;
79
103
  }
80
104
  float dataFilter_reduceValue(vec2 value) {
81
- return min(value.x, value.y);
105
+ return min(value.x, value.y);
82
106
  }
83
107
  float dataFilter_reduceValue(vec3 value) {
84
- return min(min(value.x, value.y), value.z);
108
+ return min(min(value.x, value.y), value.z);
85
109
  }
86
110
  float dataFilter_reduceValue(vec4 value) {
87
- return min(min(value.x, value.y), min(value.z, value.w));
111
+ return min(min(value.x, value.y), min(value.z, value.w));
88
112
  }
113
+
89
114
  #ifdef DATAFILTER_TYPE
90
- void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
91
- if (filter_useSoftMargin) {
92
- DATAFILTER_TYPE leftInRange = mix(
93
- smoothstep(filter_min, filter_softMin, valueFromMin),
94
- step(filter_min, valueFromMin),
95
- step(filter_softMin, filter_min)
96
- );
97
- DATAFILTER_TYPE rightInRange = mix(
98
- 1.0 - smoothstep(filter_softMax, filter_max, valueFromMax),
99
- step(valueFromMax, filter_max),
100
- step(filter_max, filter_softMax)
101
- );
102
- dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
103
- } else {
104
- dataFilter_value = dataFilter_reduceValue(
105
- step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
106
- );
107
- }
108
- }
115
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
116
+ if (dataFilter.useSoftMargin) {
117
+ // smoothstep results are undefined if edge0 \u2265 edge1
118
+ // Fallback to ignore filterSoftRange if it is truncated by filterRange
119
+ DATAFILTER_TYPE leftInRange = mix(
120
+ smoothstep(dataFilter.min, dataFilter.softMin, valueFromMin),
121
+ step(dataFilter.min, valueFromMin),
122
+ step(dataFilter.softMin, dataFilter.min)
123
+ );
124
+ DATAFILTER_TYPE rightInRange = mix(
125
+ 1.0 - smoothstep(dataFilter.softMax, dataFilter.max, valueFromMax),
126
+ step(valueFromMax, dataFilter.max),
127
+ step(dataFilter.max, dataFilter.softMax)
128
+ );
129
+ dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
130
+ } else {
131
+ dataFilter_value = dataFilter_reduceValue(
132
+ step(dataFilter.min, valueFromMin) * step(valueFromMax, dataFilter.max)
133
+ );
134
+ }
135
+ }
109
136
  #endif
137
+
110
138
  #ifdef DATACATEGORY_TYPE
111
- void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
112
- #if DATACATEGORY_CHANNELS == 1
113
- int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
114
- #elif DATACATEGORY_CHANNELS == 2
115
- ivec2 dataFilter_masks = ivec2(
116
- filter_categoryBitMask[int(category.x / 32.0)],
117
- filter_categoryBitMask[int(category.y / 32.0) + 2]
118
- );
119
- #elif DATACATEGORY_CHANNELS == 3
120
- ivec3 dataFilter_masks = filter_categoryBitMask.xyz;
121
- #else
122
- ivec4 dataFilter_masks = filter_categoryBitMask;
123
- #endif
124
- DATACATEGORY_TYPE dataFilter_bits = DATACATEGORY_TYPE(dataFilter_masks) / pow(DATACATEGORY_TYPE(2.0), mod(category, 32.0));
125
- dataFilter_bits = mod(floor(dataFilter_bits), 2.0);
126
- #if DATACATEGORY_CHANNELS == 1
127
- if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
128
- #else
129
- if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
130
- #endif
131
- }
139
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
140
+ #if DATACATEGORY_CHANNELS == 1 // One 128-bit mask
141
+ uint dataFilter_masks = dataFilter.categoryBitMask[category / 32u];
142
+ #elif DATACATEGORY_CHANNELS == 2 // Two 64-bit masks
143
+ uvec2 dataFilter_masks = uvec2(
144
+ dataFilter.categoryBitMask[category.x / 32u],
145
+ dataFilter.categoryBitMask[category.y / 32u + 2u]
146
+ );
147
+ #elif DATACATEGORY_CHANNELS == 3 // Three 32-bit masks
148
+ uvec3 dataFilter_masks = dataFilter.categoryBitMask.xyz;
149
+ #else // Four 32-bit masks
150
+ uvec4 dataFilter_masks = dataFilter.categoryBitMask;
151
+ #endif
152
+
153
+ // Shift mask and extract relevant bits
154
+ DATACATEGORY_TYPE dataFilter_bits = DATACATEGORY_TYPE(dataFilter_masks) >> (category & 31u);
155
+ dataFilter_bits &= 1u;
156
+
157
+ #if DATACATEGORY_CHANNELS == 1
158
+ if(dataFilter_bits == 0u) dataFilter_value = 0.0;
159
+ #else
160
+ if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0u)))) dataFilter_value = 0.0;
161
+ #endif
162
+ }
132
163
  #endif
133
- `,Fe=`
134
- uniform bool filter_transformColor;
164
+ `,Ne=`
165
+ ${we}
166
+ ${Qt}
167
+ `,Jt=`
135
168
  in float dataFilter_value;
136
- `;function Oe(r){if(!r||!("extensions"in r))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:o=!0,filterTransformColor:i=!0}=r,s=r.filterSoftRange||e;return{...Number.isFinite(e[0])?{filter_min:e[0],filter_softMin:s[0],filter_softMax:s[1],filter_max:e[1]}:{filter_min:e.map(n=>n[0]),filter_softMin:s.map(n=>n[0]),filter_softMax:s.map(n=>n[1]),filter_max:e.map(n=>n[1])},filter_enabled:t,filter_useSoftMargin:Boolean(r.filterSoftRange),filter_transformSize:t&&o,filter_transformColor:t&&i}}function Gt(r){if(!r||!("extensions"in r))return{};let e=Oe(r);if(Number.isFinite(e.filter_min)){let t=Math.fround(e.filter_min);e.filter_min-=t,e.filter_softMin-=t,e.filter_min64High=t;let o=Math.fround(e.filter_max);e.filter_max-=o,e.filter_softMax-=o,e.filter_max64High=o}else{let t=e.filter_min.map(Math.fround);e.filter_min=e.filter_min.map((i,s)=>i-t[s]),e.filter_softMin=e.filter_softMin.map((i,s)=>i-t[s]),e.filter_min64High=t;let o=e.filter_max.map(Math.fround);e.filter_max=e.filter_max.map((i,s)=>i-o[s]),e.filter_softMax=e.filter_softMax.map((i,s)=>i-o[s]),e.filter_max64High=o}return e}var Le={"vs:#main-start":`
137
- dataFilter_value = 1.0;
138
- if (filter_enabled) {
139
- #ifdef DATAFILTER_TYPE
140
- #ifdef DATAFILTER_DOUBLE
141
- dataFilter_setValue(
142
- filterValues - filter_min64High + filterValues64Low,
143
- filterValues - filter_max64High + filterValues64Low
144
- );
145
- #else
146
- dataFilter_setValue(filterValues, filterValues);
147
- #endif
148
- #endif
149
- #ifdef DATACATEGORY_TYPE
150
- dataFilter_setCategoryValue(filterCategoryValues);
151
- #endif
152
- }
153
- `,"vs:#main-end":`
154
- if (dataFilter_value == 0.0) {
155
- gl_Position = vec4(0.);
156
- }
157
- `,"vs:DECKGL_FILTER_SIZE":`
158
- if (filter_transformSize) {
159
- size = size * dataFilter_value;
160
- }
161
- `,"fs:DECKGL_FILTER_COLOR":`
162
- if (dataFilter_value == 0.0) discard;
163
- if (filter_transformColor) {
164
- color.a *= dataFilter_value;
165
- }
166
- `},Ce={name:"data-filter",vs:Ae,fs:Fe,inject:Le,getUniforms:Oe},Ie={name:"data-filter-fp64",vs:Ae,fs:Fe,inject:Le,getUniforms:Gt};var Re=_(ke(),1);var Ut=`#version 300 es
169
+ `,Be=`
170
+ ${we}
171
+ ${Jt}
172
+ `;function De(o){if(!o||!("extensions"in o))return{};let{filterRange:e=[-1,1],filterEnabled:t=!0,filterTransformSize:r=!0,filterTransformColor:s=!0,categoryBitMask:i=[0,0,0,0]}=o,n=o.filterSoftRange||e;return{...Number.isFinite(e[0])?{min:e[0],softMin:n[0],softMax:n[1],max:e[1]}:{min:e.map(a=>a[0]),softMin:n.map(a=>a[0]),softMax:n.map(a=>a[1]),max:e.map(a=>a[1])},enabled:t,useSoftMargin:Boolean(o.filterSoftRange),transformSize:t&&r,transformColor:t&&s,categoryBitMask:i}}function eo(o){if(!o||!("extensions"in o))return{};let e=De(o);if(Number.isFinite(e.min)){let t=Math.fround(e.min);e.min-=t,e.softMin-=t,e.min64High=t;let r=Math.fround(e.max);e.max-=r,e.softMax-=r,e.max64High=r}else{let t=e.min.map(Math.fround);e.min=e.min.map((s,i)=>s-t[i]),e.softMin=e.softMin.map((s,i)=>s-t[i]),e.min64High=t;let r=e.max.map(Math.fround);e.max=e.max.map((s,i)=>s-r[i]),e.softMax=e.softMax.map((s,i)=>s-r[i]),e.max64High=r}return e}var je={"vs:#main-start":`
173
+ dataFilter_value = 1.0;
174
+ if (dataFilter.enabled) {
175
+ #ifdef DATAFILTER_TYPE
176
+ #ifdef DATAFILTER_DOUBLE
177
+ dataFilter_setValue(
178
+ filterValues - dataFilter.min64High + filterValues64Low,
179
+ filterValues - dataFilter.max64High + filterValues64Low
180
+ );
181
+ #else
182
+ dataFilter_setValue(filterValues, filterValues);
183
+ #endif
184
+ #endif
185
+
186
+ #ifdef DATACATEGORY_TYPE
187
+ dataFilter_setCategoryValue(filterCategoryValues);
188
+ #endif
189
+ }
190
+ `,"vs:#main-end":`
191
+ if (dataFilter_value == 0.0) {
192
+ gl_Position = vec4(0.);
193
+ }
194
+ `,"vs:DECKGL_FILTER_SIZE":`
195
+ if (dataFilter.transformSize) {
196
+ size = size * dataFilter_value;
197
+ }
198
+ `,"fs:DECKGL_FILTER_COLOR":`
199
+ if (dataFilter_value == 0.0) discard;
200
+ if (dataFilter.transformColor) {
201
+ color.a *= dataFilter_value;
202
+ }
203
+ `};function Ve(o){let{categorySize:e,filterSize:t,fp64:r}=o,s={useSoftMargin:"i32",enabled:"i32",transformSize:"i32",transformColor:"i32"};if(t){let i=t===1?"f32":`vec${t}<f32>`;s.min=i,s.softMin=i,s.softMax=i,s.max=i,r&&(s.min64High=i,s.max64High=i)}return e&&(s.categoryBitMask="vec4<i32>"),s}var ze={name:"dataFilter",vs:Ne,fs:Be,inject:je,getUniforms:De,uniformTypesFromOptions:Ve},Ue={name:"dataFilter",vs:Ne,fs:Be,inject:je,getUniforms:eo,uniformTypesFromOptions:Ve};var He=d(qe(),1),to=`#version 300 es
167
204
  #define SHADER_NAME data-filter-vertex-shader
168
205
 
169
206
  #ifdef FLOAT_TARGET
@@ -194,7 +231,7 @@ void main() {
194
231
  #endif
195
232
  gl_PointSize = 1.0;
196
233
  }
197
- `,qt=`#version 300 es
234
+ `,oo=`#version 300 es
198
235
  #define SHADER_NAME data-filter-fragment-shader
199
236
  precision highp float;
200
237
 
@@ -208,139 +245,175 @@ void main() {
208
245
  }
209
246
  fragColor = vColor;
210
247
  }
211
- `,Ht=["float32-renderable-webgl","texture-blend-float-webgl"];function Ne(r){return Ht.every(e=>r.features.has(e))}function we(r,e){return e?r.createFramebuffer({width:1,height:1,colorAttachments:[r.createTexture({format:"rgba32float",type:5126,mipmaps:!1})]}):r.createFramebuffer({width:256,height:64,colorAttachments:[r.createTexture({format:"rgba8unorm",type:5126,mipmaps:!1})]})}function Be(r,e,t){return e.defines.NON_INSTANCED_MODEL=1,t&&(e.defines.FLOAT_TARGET=1),new Re.Model(r,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,drawMode:0,vs:Ut,fs:qt,...e})}var De={blend:!0,blendFunc:[1,1,1,1],blendEquation:[32774,32774],depthTest:!1};var Wt={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},Kt={categorySize:0,filterSize:1,fp64:!1,countItems:!1},Ve={1:"float",2:"vec2",3:"vec3",4:"vec4"},O=class extends b.LayerExtension{constructor(e={}){super({...Kt,...e})}getShaders(e){let{categorySize:t,filterSize:o,fp64:i}=e.opts,s={};return t&&(s.DATACATEGORY_TYPE=Ve[t],s.DATACATEGORY_CHANNELS=t),o&&(s.DATAFILTER_TYPE=Ve[o],s.DATAFILTER_DOUBLE=Boolean(i)),{modules:[i?Ie:Ce],defines:s}}initializeState(e,t){let o=this.getAttributeManager(),{categorySize:i,filterSize:s,fp64:n}=t.opts;o&&(s&&o.add({filterValues:{size:s,type:n?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),i&&o.add({filterCategoryValues:{size:i,stepMode:"dynamic",accessor:"getFilterCategory",transform:i===1?l=>t._getCategoryKey.call(this,l,0):l=>l.map((f,c)=>t._getCategoryKey.call(this,f,c))}}));let{device:a}=this.context;if(o&&t.opts.countItems){let l=Ne(a);o.add({filterIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:p})=>{let m=u&&u.__source?u.__source.index:p;return l?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let f=we(a,l),c=Be(a,t.getShaders.call(this,t),l);this.setState({filterFBO:f,filterModel:c})}}updateState({props:e,oldProps:t,changeFlags:o},i){let s=this.getAttributeManager(),{categorySize:n}=i.opts;if(this.state.filterModel){let a=s.attributes.filterValues?.needsUpdate()||s.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}s?.attributes.filterCategoryValues&&((s.attributes.filterCategoryValues.needsUpdate()||!(0,b._deepEqual)(e.filterCategories,t.filterCategories,2))&&this.setState({categoryBitMask:null}),o.dataChanged&&(this.setState({categoryMap:Array(n).fill(0).map(()=>({}))}),s.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let o=this.state.filterFBO,i=this.state.filterModel,s=this.state.filterNeedsUpdate,{onFilteredItemsChange:n}=this.props;if(this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t),e.uniforms.filter_categoryBitMask=this.state.categoryBitMask,s&&n&&i){let{attributes:{filterValues:a,filterCategoryValues:l,filterIndices:f}}=this.getAttributeManager();i.setVertexCount(this.getNumInstances()),this.context.device.clearWebGL({framebuffer:o,color:[0,0,0,0]}),i.updateModuleSettings(e.moduleParameters),i.setAttributes({...a?.getValue(),...l?.getValue(),...f?.getValue()}),i.setUniforms(e.uniforms),i.device.withParametersWebGL({framebuffer:o,...De,viewport:[0,0,o.width,o.height]},()=>{i.draw(this.context.renderPass)});let c=i.device.readPixelsToArrayWebGL(o),u=0;for(let p=0;p<c.length;p++)u+=c[p];n({id:this.id,count:u}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:o}=t.opts;if(!o)return;let{filterCategories:i}=this.props,s=new Uint32Array([0,0,0,0]),n=o===1?[i]:i,a=o===1?128:o===2?64:32;for(let l=0;l<n.length;l++){let f=n[l];for(let c of f){let u=t._getCategoryKey.call(this,c,l);if(u<a){let p=l*(a/32)+Math.floor(u/32);s[p]+=Math.pow(2,u%32)}else b.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=s}_getCategoryKey(e,t){let o=this.state.categoryMap[t];return e in o||(o[e]=Object.keys(o).length),o[e]}};O.defaultProps=Wt;O.extensionName="DataFilterExtension";var je=O;var S=_(d(),1);function Q(r,e=[],t=0){let o=Math.fround(r),i=r-o;return e[t]=o,e[t+1]=i,e}function ce(r){return r-Math.fround(r)}function ue(r){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let o=0;o<4;++o){let i=t*4+o;Q(r[o*4+t],e,i*2)}return e}var ze=`uniform float ONE;
248
+ `,ro=["float32-renderable-webgl","texture-blend-float-webgl"];function Ye(o){return ro.every(e=>o.features.has(e))}function We(o,e){return e?o.createFramebuffer({width:1,height:1,colorAttachments:[o.createTexture({format:"rgba32float",mipmaps:!1})]}):o.createFramebuffer({width:256,height:64,colorAttachments:[o.createTexture({format:"rgba8unorm",mipmaps:!1})]})}function Ke(o,e,t,r){return t.defines.NON_INSTANCED_MODEL=1,r&&(t.defines.FLOAT_TARGET=1),new He.Model(o,{id:"data-filter-aggregation-model",vertexCount:1,isInstanced:!1,topology:"point-list",vs:to,fs:oo,bufferLayout:e,...t})}var $e={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var io={getFilterValue:{type:"accessor",value:0},getFilterCategory:{type:"accessor",value:0},onFilteredItemsChange:{type:"function",value:null,optional:!0},filterEnabled:!0,filterRange:[-1,1],filterSoftRange:null,filterCategories:[0],filterTransformSize:!0,filterTransformColor:!0},no={categorySize:0,filterSize:1,fp64:!1,countItems:!1},ao={1:"uint",2:"uvec2",3:"uvec3",4:"uvec4"},lo={1:"float",2:"vec2",3:"vec3",4:"vec4"},S=class extends E.LayerExtension{constructor(e={}){super({...no,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:s}=e.opts,i={};t&&(i.DATACATEGORY_TYPE=ao[t],i.DATACATEGORY_CHANNELS=t),r&&(i.DATAFILTER_TYPE=lo[r],i.DATAFILTER_DOUBLE=Boolean(s));let n=s?Ue:ze;return n.uniformTypes=n.uniformTypesFromOptions(e.opts),{modules:[n],defines:i}}initializeState(e,t){let r=this.getAttributeManager(),{categorySize:s,filterSize:i,fp64:n}=t.opts;r&&(i&&r.add({filterValues:{size:i,type:n?"float64":"float32",stepMode:"dynamic",accessor:"getFilterValue"}}),s&&r.add({filterCategoryValues:{size:s,stepMode:"dynamic",accessor:"getFilterCategory",type:"uint32",transform:s===1?l=>t._getCategoryKey.call(this,l,0):l=>l.map((c,f)=>t._getCategoryKey.call(this,c,f))}}));let{device:a}=this.context;if(r&&t.opts.countItems){let l=Ye(a);r.add({filterVertexIndices:{size:l?1:2,vertexOffset:1,type:"unorm8",accessor:(u,{index:p})=>{let m=u&&u.__source?u.__source.index:p;return l?(m+1)%255:[(m+1)%255,Math.floor(m/255)%255]},shaderAttributes:{filterPrevIndices:{vertexOffset:0},filterIndices:{vertexOffset:1}}}});let c=We(a,l),f=Ke(a,r.getBufferLayouts({isInstanced:!1}),t.getShaders.call(this,t),l);this.setState({filterFBO:c,filterModel:f})}}updateState({props:e,oldProps:t,changeFlags:r},s){let i=this.getAttributeManager(),{categorySize:n}=s.opts;if(this.state.filterModel){let a=i.attributes.filterValues?.needsUpdate()||i.attributes.filterCategoryValues?.needsUpdate()||e.filterEnabled!==t.filterEnabled||e.filterRange!==t.filterRange||e.filterSoftRange!==t.filterSoftRange||e.filterCategories!==t.filterCategories;a&&this.setState({filterNeedsUpdate:a})}i?.attributes.filterCategoryValues&&((i.attributes.filterCategoryValues.needsUpdate()||!(0,E._deepEqual)(e.filterCategories,t.filterCategories,2))&&this.setState({categoryBitMask:null}),r.dataChanged&&(this.setState({categoryMap:Array(n).fill(0).map(()=>({}))}),i.attributes.filterCategoryValues.setNeedsUpdate("categoryMap")))}draw(e,t){let r=this.state.filterFBO,s=this.state.filterModel,i=this.state.filterNeedsUpdate;this.state.categoryBitMask||t._updateCategoryBitMask.call(this,e,t);let{onFilteredItemsChange:n,extensions:a,filterEnabled:l,filterRange:c,filterSoftRange:f,filterTransformSize:u,filterTransformColor:p,filterCategories:m}=this.props,v={extensions:a,filterEnabled:l,filterRange:c,filterSoftRange:f,filterTransformSize:u,filterTransformColor:p,filterCategories:m};if(this.state.categoryBitMask&&(v.categoryBitMask=this.state.categoryBitMask),this.setShaderModuleProps({dataFilter:v}),i&&n&&s){let b=this.getAttributeManager(),{attributes:{filterValues:h,filterCategoryValues:L,filterVertexIndices:fe}}=b;s.setVertexCount(this.getNumInstances());let ue={...h?.getValue(),...L?.getValue(),...fe?.getValue()};s.setAttributes(ue),s.shaderInputs.setProps({dataFilter:v});let pe=[0,0,r.width,r.height],Ee=s.device.beginRenderPass({id:"data-filter-aggregation",framebuffer:r,parameters:{viewport:pe},clearColor:[0,0,0,0]});s.setParameters($e),s.draw(Ee),Ee.end();let Me=s.device.readPixelsToArrayWebGL(r),Fe=0;for(let de=0;de<Me.length;de++)Fe+=Me[de];n({id:this.id,count:Fe}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:r}=t.opts;if(!r)return;let{filterCategories:s}=this.props,i=new Uint32Array([0,0,0,0]),n=r===1?[s]:s,a=r===1?128:r===2?64:32;for(let l=0;l<n.length;l++){let c=n[l];for(let f of c){let u=t._getCategoryKey.call(this,f,l);if(u<a){let p=l*(a/32)+Math.floor(u/32);i[p]+=Math.pow(2,u%32)}else E.log.warn(`Exceeded maximum number of categories (${a})`)()}}this.state.categoryBitMask=i}_getCategoryKey(e,t){let r=this.state.categoryMap[t];return e in r||(r[e]=Object.keys(r).length),r[e]}};S.defaultProps=io;S.extensionName="DataFilterExtension";var Ze=S;var w=d(_(),1);var Wr=1/Math.PI*180,Kr=1/180*Math.PI,co={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...co}};var I=globalThis.mathgl.config;function _e(o){return Array.isArray(o)||ArrayBuffer.isView(o)&&!(o instanceof DataView)}function M(o,e,t){let r=I.EPSILON;t&&(I.EPSILON=t);try{if(o===e)return!0;if(_e(o)&&_e(e)){if(o.length!==e.length)return!1;for(let s=0;s<o.length;++s)if(!M(o[s],e[s]))return!1;return!0}return o&&o.equals?o.equals(e):e&&e.equals?e.equals(o):typeof o=="number"&&typeof e=="number"?Math.abs(o-e)<=I.EPSILON*Math.max(1,Math.abs(o),Math.abs(e)):!1}finally{I.EPSILON=r}}var k=typeof Float32Array<"u"?Float32Array:Array,me=Math.random;function J(o){return o>=0?Math.round(o):o%.5===0?Math.floor(o):Math.round(o)}var Zr=Math.PI/180;var R={};Ae(R,{add:()=>ho,angle:()=>jo,bezier:()=>So,ceil:()=>vo,clone:()=>uo,copy:()=>_o,create:()=>Xe,cross:()=>Ao,dist:()=>Wo,distance:()=>ot,div:()=>Yo,divide:()=>tt,dot:()=>ve,equals:()=>Go,exactEquals:()=>Uo,floor:()=>go,forEach:()=>Xo,fromValues:()=>po,hermite:()=>Co,inverse:()=>Fo,len:()=>$o,length:()=>Qe,lerp:()=>Oo,max:()=>yo,min:()=>xo,mul:()=>Ho,multiply:()=>et,negate:()=>Mo,normalize:()=>To,random:()=>Io,rotateX:()=>No,rotateY:()=>Bo,rotateZ:()=>Do,round:()=>Po,scale:()=>bo,scaleAndAdd:()=>Eo,set:()=>mo,slerp:()=>Lo,sqrDist:()=>Ko,sqrLen:()=>Zo,squaredDistance:()=>rt,squaredLength:()=>st,str:()=>zo,sub:()=>qo,subtract:()=>Je,transformMat3:()=>Ro,transformMat4:()=>ko,transformQuat:()=>wo,zero:()=>Vo});function Xe(){let o=new k(3);return k!=Float32Array&&(o[0]=0,o[1]=0,o[2]=0),o}function uo(o){let e=new k(3);return e[0]=o[0],e[1]=o[1],e[2]=o[2],e}function Qe(o){let e=o[0],t=o[1],r=o[2];return Math.sqrt(e*e+t*t+r*r)}function po(o,e,t){let r=new k(3);return r[0]=o,r[1]=e,r[2]=t,r}function _o(o,e){return o[0]=e[0],o[1]=e[1],o[2]=e[2],o}function mo(o,e,t,r){return o[0]=e,o[1]=t,o[2]=r,o}function ho(o,e,t){return o[0]=e[0]+t[0],o[1]=e[1]+t[1],o[2]=e[2]+t[2],o}function Je(o,e,t){return o[0]=e[0]-t[0],o[1]=e[1]-t[1],o[2]=e[2]-t[2],o}function et(o,e,t){return o[0]=e[0]*t[0],o[1]=e[1]*t[1],o[2]=e[2]*t[2],o}function tt(o,e,t){return o[0]=e[0]/t[0],o[1]=e[1]/t[1],o[2]=e[2]/t[2],o}function vo(o,e){return o[0]=Math.ceil(e[0]),o[1]=Math.ceil(e[1]),o[2]=Math.ceil(e[2]),o}function go(o,e){return o[0]=Math.floor(e[0]),o[1]=Math.floor(e[1]),o[2]=Math.floor(e[2]),o}function xo(o,e,t){return o[0]=Math.min(e[0],t[0]),o[1]=Math.min(e[1],t[1]),o[2]=Math.min(e[2],t[2]),o}function yo(o,e,t){return o[0]=Math.max(e[0],t[0]),o[1]=Math.max(e[1],t[1]),o[2]=Math.max(e[2],t[2]),o}function Po(o,e){return o[0]=J(e[0]),o[1]=J(e[1]),o[2]=J(e[2]),o}function bo(o,e,t){return o[0]=e[0]*t,o[1]=e[1]*t,o[2]=e[2]*t,o}function Eo(o,e,t,r){return o[0]=e[0]+t[0]*r,o[1]=e[1]+t[1]*r,o[2]=e[2]+t[2]*r,o}function ot(o,e){let t=e[0]-o[0],r=e[1]-o[1],s=e[2]-o[2];return Math.sqrt(t*t+r*r+s*s)}function rt(o,e){let t=e[0]-o[0],r=e[1]-o[1],s=e[2]-o[2];return t*t+r*r+s*s}function st(o){let e=o[0],t=o[1],r=o[2];return e*e+t*t+r*r}function Mo(o,e){return o[0]=-e[0],o[1]=-e[1],o[2]=-e[2],o}function Fo(o,e){return o[0]=1/e[0],o[1]=1/e[1],o[2]=1/e[2],o}function To(o,e){let t=e[0],r=e[1],s=e[2],i=t*t+r*r+s*s;return i>0&&(i=1/Math.sqrt(i)),o[0]=e[0]*i,o[1]=e[1]*i,o[2]=e[2]*i,o}function ve(o,e){return o[0]*e[0]+o[1]*e[1]+o[2]*e[2]}function Ao(o,e,t){let r=e[0],s=e[1],i=e[2],n=t[0],a=t[1],l=t[2];return o[0]=s*l-i*a,o[1]=i*n-r*l,o[2]=r*a-s*n,o}function Oo(o,e,t,r){let s=e[0],i=e[1],n=e[2];return o[0]=s+r*(t[0]-s),o[1]=i+r*(t[1]-i),o[2]=n+r*(t[2]-n),o}function Lo(o,e,t,r){let s=Math.acos(Math.min(Math.max(ve(e,t),-1),1)),i=Math.sin(s),n=Math.sin((1-r)*s)/i,a=Math.sin(r*s)/i;return o[0]=n*e[0]+a*t[0],o[1]=n*e[1]+a*t[1],o[2]=n*e[2]+a*t[2],o}function Co(o,e,t,r,s,i){let n=i*i,a=n*(2*i-3)+1,l=n*(i-2)+i,c=n*(i-1),f=n*(3-2*i);return o[0]=e[0]*a+t[0]*l+r[0]*c+s[0]*f,o[1]=e[1]*a+t[1]*l+r[1]*c+s[1]*f,o[2]=e[2]*a+t[2]*l+r[2]*c+s[2]*f,o}function So(o,e,t,r,s,i){let n=1-i,a=n*n,l=i*i,c=a*n,f=3*i*a,u=3*l*n,p=l*i;return o[0]=e[0]*c+t[0]*f+r[0]*u+s[0]*p,o[1]=e[1]*c+t[1]*f+r[1]*u+s[1]*p,o[2]=e[2]*c+t[2]*f+r[2]*u+s[2]*p,o}function Io(o,e){e=e===void 0?1:e;let t=me()*2*Math.PI,r=me()*2-1,s=Math.sqrt(1-r*r)*e;return o[0]=Math.cos(t)*s,o[1]=Math.sin(t)*s,o[2]=r*e,o}function ko(o,e,t){let r=e[0],s=e[1],i=e[2],n=t[3]*r+t[7]*s+t[11]*i+t[15];return n=n||1,o[0]=(t[0]*r+t[4]*s+t[8]*i+t[12])/n,o[1]=(t[1]*r+t[5]*s+t[9]*i+t[13])/n,o[2]=(t[2]*r+t[6]*s+t[10]*i+t[14])/n,o}function Ro(o,e,t){let r=e[0],s=e[1],i=e[2];return o[0]=r*t[0]+s*t[3]+i*t[6],o[1]=r*t[1]+s*t[4]+i*t[7],o[2]=r*t[2]+s*t[5]+i*t[8],o}function wo(o,e,t){let r=t[0],s=t[1],i=t[2],n=t[3],a=e[0],l=e[1],c=e[2],f=s*c-i*l,u=i*a-r*c,p=r*l-s*a,m=s*p-i*u,v=i*f-r*p,b=r*u-s*f,h=n*2;return f*=h,u*=h,p*=h,m*=2,v*=2,b*=2,o[0]=a+f+m,o[1]=l+u+v,o[2]=c+p+b,o}function No(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[0],i[1]=s[1]*Math.cos(r)-s[2]*Math.sin(r),i[2]=s[1]*Math.sin(r)+s[2]*Math.cos(r),o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function Bo(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[2]*Math.sin(r)+s[0]*Math.cos(r),i[1]=s[1],i[2]=s[2]*Math.cos(r)-s[0]*Math.sin(r),o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function Do(o,e,t,r){let s=[],i=[];return s[0]=e[0]-t[0],s[1]=e[1]-t[1],s[2]=e[2]-t[2],i[0]=s[0]*Math.cos(r)-s[1]*Math.sin(r),i[1]=s[0]*Math.sin(r)+s[1]*Math.cos(r),i[2]=s[2],o[0]=i[0]+t[0],o[1]=i[1]+t[1],o[2]=i[2]+t[2],o}function jo(o,e){let t=o[0],r=o[1],s=o[2],i=e[0],n=e[1],a=e[2],l=Math.sqrt((t*t+r*r+s*s)*(i*i+n*n+a*a)),c=l&&ve(o,e)/l;return Math.acos(Math.min(Math.max(c,-1),1))}function Vo(o){return o[0]=0,o[1]=0,o[2]=0,o}function zo(o){return`vec3(${o[0]}, ${o[1]}, ${o[2]})`}function Uo(o,e){return o[0]===e[0]&&o[1]===e[1]&&o[2]===e[2]}function Go(o,e){let t=o[0],r=o[1],s=o[2],i=e[0],n=e[1],a=e[2];return Math.abs(t-i)<=1e-6*Math.max(1,Math.abs(t),Math.abs(i))&&Math.abs(r-n)<=1e-6*Math.max(1,Math.abs(r),Math.abs(n))&&Math.abs(s-a)<=1e-6*Math.max(1,Math.abs(s),Math.abs(a))}var qo=Je,Ho=et,Yo=tt,Wo=ot,Ko=rt,$o=Qe,Zo=st,Xo=function(){let o=Xe();return function(e,t,r,s,i,n){let a,l;for(t||(t=3),r||(r=0),s?l=Math.min(s*t+r,e.length):l=e.length,a=r;a<l;a+=t)o[0]=e[a],o[1]=e[a+1],o[2]=e[a+2],i(o,o,n),e[a]=o[0],e[a+1]=o[1],e[a+2]=o[2];return e}}();function ee(o,e=[],t=0){let r=Math.fround(o),s=o-r;return e[t]=r,e[t+1]=s,e}function ge(o){return o-Math.fround(o)}function xe(o){let e=new Float32Array(32);for(let t=0;t<4;++t)for(let r=0;r<4;++r){let s=t*4+r;ee(o[r*4+t],e,s*2)}return e}var it=`
249
+ uniform fp64arithmeticUniforms {
250
+ uniform float ONE;
251
+ } fp64;
252
+
253
+ /*
254
+ About LUMA_FP64_CODE_ELIMINATION_WORKAROUND
255
+
256
+ The purpose of this workaround is to prevent shader compilers from
257
+ optimizing away necessary arithmetic operations by swapping their sequences
258
+ or transform the equation to some 'equivalent' form.
259
+
260
+ The method is to multiply an artifical variable, ONE, which will be known to
261
+ the compiler to be 1 only at runtime. The whole expression is then represented
262
+ as a polynomial with respective to ONE. In the coefficients of all terms, only one a
263
+ and one b should appear
264
+
265
+ err = (a + b) * ONE^6 - a * ONE^5 - (a + b) * ONE^4 + a * ONE^3 - b - (a + b) * ONE^2 + a * ONE
266
+ */
267
+
268
+ // Divide float number to high and low floats to extend fraction bits
212
269
  vec2 split(float a) {
213
- const float SPLIT = 4097.0;
214
- float t = a * SPLIT;
270
+ const float SPLIT = 4097.0;
271
+ float t = a * SPLIT;
215
272
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
216
- float a_hi = t * ONE - (t - a);
217
- float a_lo = a * ONE - a_hi;
273
+ float a_hi = t * fp64.ONE - (t - a);
274
+ float a_lo = a * fp64.ONE - a_hi;
218
275
  #else
219
- float a_hi = t - (t - a);
220
- float a_lo = a - a_hi;
276
+ float a_hi = t - (t - a);
277
+ float a_lo = a - a_hi;
221
278
  #endif
222
- return vec2(a_hi, a_lo);
279
+ return vec2(a_hi, a_lo);
223
280
  }
281
+
282
+ // Divide float number again when high float uses too many fraction bits
224
283
  vec2 split2(vec2 a) {
225
- vec2 b = split(a.x);
226
- b.y += a.y;
227
- return b;
284
+ vec2 b = split(a.x);
285
+ b.y += a.y;
286
+ return b;
228
287
  }
288
+
289
+ // Special sum operation when a > b
229
290
  vec2 quickTwoSum(float a, float b) {
230
291
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
231
- float sum = (a + b) * ONE;
232
- float err = b - (sum - a) * ONE;
292
+ float sum = (a + b) * fp64.ONE;
293
+ float err = b - (sum - a) * fp64.ONE;
233
294
  #else
234
- float sum = a + b;
235
- float err = b - (sum - a);
295
+ float sum = a + b;
296
+ float err = b - (sum - a);
236
297
  #endif
237
- return vec2(sum, err);
298
+ return vec2(sum, err);
238
299
  }
300
+
301
+ // General sum operation
239
302
  vec2 twoSum(float a, float b) {
240
- float s = (a + b);
303
+ float s = (a + b);
241
304
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
242
- float v = (s * ONE - a) * ONE;
243
- float err = (a - (s - v) * ONE) * ONE * ONE * ONE + (b - v);
305
+ float v = (s * fp64.ONE - a) * fp64.ONE;
306
+ float err = (a - (s - v) * fp64.ONE) * fp64.ONE * fp64.ONE * fp64.ONE + (b - v);
244
307
  #else
245
- float v = s - a;
246
- float err = (a - (s - v)) + (b - v);
308
+ float v = s - a;
309
+ float err = (a - (s - v)) + (b - v);
247
310
  #endif
248
- return vec2(s, err);
311
+ return vec2(s, err);
249
312
  }
313
+
250
314
  vec2 twoSub(float a, float b) {
251
- float s = (a - b);
315
+ float s = (a - b);
252
316
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
253
- float v = (s * ONE - a) * ONE;
254
- float err = (a - (s - v) * ONE) * ONE * ONE * ONE - (b + v);
317
+ float v = (s * fp64.ONE - a) * fp64.ONE;
318
+ float err = (a - (s - v) * fp64.ONE) * fp64.ONE * fp64.ONE * fp64.ONE - (b + v);
255
319
  #else
256
- float v = s - a;
257
- float err = (a - (s - v)) - (b + v);
320
+ float v = s - a;
321
+ float err = (a - (s - v)) - (b + v);
258
322
  #endif
259
- return vec2(s, err);
323
+ return vec2(s, err);
260
324
  }
325
+
261
326
  vec2 twoSqr(float a) {
262
- float prod = a * a;
263
- vec2 a_fp64 = split(a);
327
+ float prod = a * a;
328
+ vec2 a_fp64 = split(a);
264
329
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
265
- float err = ((a_fp64.x * a_fp64.x - prod) * ONE + 2.0 * a_fp64.x *
266
- a_fp64.y * ONE * ONE) + a_fp64.y * a_fp64.y * ONE * ONE * ONE;
330
+ float err = ((a_fp64.x * a_fp64.x - prod) * fp64.ONE + 2.0 * a_fp64.x *
331
+ a_fp64.y * fp64.ONE * fp64.ONE) + a_fp64.y * a_fp64.y * fp64.ONE * fp64.ONE * fp64.ONE;
267
332
  #else
268
- float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;
333
+ float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;
269
334
  #endif
270
- return vec2(prod, err);
335
+ return vec2(prod, err);
271
336
  }
337
+
272
338
  vec2 twoProd(float a, float b) {
273
- float prod = a * b;
274
- vec2 a_fp64 = split(a);
275
- vec2 b_fp64 = split(b);
276
- float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +
277
- a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;
278
- return vec2(prod, err);
339
+ float prod = a * b;
340
+ vec2 a_fp64 = split(a);
341
+ vec2 b_fp64 = split(b);
342
+ float err = ((a_fp64.x * b_fp64.x - prod) + a_fp64.x * b_fp64.y +
343
+ a_fp64.y * b_fp64.x) + a_fp64.y * b_fp64.y;
344
+ return vec2(prod, err);
279
345
  }
346
+
280
347
  vec2 sum_fp64(vec2 a, vec2 b) {
281
- vec2 s, t;
282
- s = twoSum(a.x, b.x);
283
- t = twoSum(a.y, b.y);
284
- s.y += t.x;
285
- s = quickTwoSum(s.x, s.y);
286
- s.y += t.y;
287
- s = quickTwoSum(s.x, s.y);
288
- return s;
348
+ vec2 s, t;
349
+ s = twoSum(a.x, b.x);
350
+ t = twoSum(a.y, b.y);
351
+ s.y += t.x;
352
+ s = quickTwoSum(s.x, s.y);
353
+ s.y += t.y;
354
+ s = quickTwoSum(s.x, s.y);
355
+ return s;
289
356
  }
357
+
290
358
  vec2 sub_fp64(vec2 a, vec2 b) {
291
- vec2 s, t;
292
- s = twoSub(a.x, b.x);
293
- t = twoSub(a.y, b.y);
294
- s.y += t.x;
295
- s = quickTwoSum(s.x, s.y);
296
- s.y += t.y;
297
- s = quickTwoSum(s.x, s.y);
298
- return s;
359
+ vec2 s, t;
360
+ s = twoSub(a.x, b.x);
361
+ t = twoSub(a.y, b.y);
362
+ s.y += t.x;
363
+ s = quickTwoSum(s.x, s.y);
364
+ s.y += t.y;
365
+ s = quickTwoSum(s.x, s.y);
366
+ return s;
299
367
  }
368
+
300
369
  vec2 mul_fp64(vec2 a, vec2 b) {
301
- vec2 prod = twoProd(a.x, b.x);
302
- prod.y += a.x * b.y;
370
+ vec2 prod = twoProd(a.x, b.x);
371
+ // y component is for the error
372
+ prod.y += a.x * b.y;
303
373
  #if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
304
- prod = split2(prod);
374
+ prod = split2(prod);
305
375
  #endif
306
- prod = quickTwoSum(prod.x, prod.y);
307
- prod.y += a.y * b.x;
376
+ prod = quickTwoSum(prod.x, prod.y);
377
+ prod.y += a.y * b.x;
308
378
  #if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
309
- prod = split2(prod);
379
+ prod = split2(prod);
310
380
  #endif
311
- prod = quickTwoSum(prod.x, prod.y);
312
- return prod;
381
+ prod = quickTwoSum(prod.x, prod.y);
382
+ return prod;
313
383
  }
384
+
314
385
  vec2 div_fp64(vec2 a, vec2 b) {
315
- float xn = 1.0 / b.x;
386
+ float xn = 1.0 / b.x;
316
387
  #if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
317
- vec2 yn = mul_fp64(a, vec2(xn, 0));
388
+ vec2 yn = mul_fp64(a, vec2(xn, 0));
318
389
  #else
319
- vec2 yn = a * xn;
390
+ vec2 yn = a * xn;
320
391
  #endif
321
- float diff = (sub_fp64(a, mul_fp64(b, yn))).x;
322
- vec2 prod = twoProd(xn, diff);
323
- return sum_fp64(yn, prod);
392
+ float diff = (sub_fp64(a, mul_fp64(b, yn))).x;
393
+ vec2 prod = twoProd(xn, diff);
394
+ return sum_fp64(yn, prod);
324
395
  }
396
+
325
397
  vec2 sqrt_fp64(vec2 a) {
326
- if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);
327
- if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
328
- float x = 1.0 / sqrt(a.x);
329
- float yn = a.x * x;
398
+ if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);
399
+ if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
400
+
401
+ float x = 1.0 / sqrt(a.x);
402
+ float yn = a.x * x;
330
403
  #if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)
331
- vec2 yn_sqr = twoSqr(yn) * ONE;
404
+ vec2 yn_sqr = twoSqr(yn) * fp64.ONE;
332
405
  #else
333
- vec2 yn_sqr = twoSqr(yn);
406
+ vec2 yn_sqr = twoSqr(yn);
334
407
  #endif
335
- float diff = sub_fp64(a, yn_sqr).x;
336
- vec2 prod = twoProd(x * 0.5, diff);
408
+ float diff = sub_fp64(a, yn_sqr).x;
409
+ vec2 prod = twoProd(x * 0.5, diff);
337
410
  #if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)
338
- return sum_fp64(split(yn), prod);
411
+ return sum_fp64(split(yn), prod);
339
412
  #else
340
- return sum_fp64(vec2(yn, 0.0), prod);
413
+ return sum_fp64(vec2(yn, 0.0), prod);
341
414
  #endif
342
415
  }
343
- `;var Ge=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
416
+ `;var nt=`const vec2 E_FP64 = vec2(2.7182817459106445e+00, 8.254840366817007e-08);
344
417
  const vec2 LOG2_FP64 = vec2(0.6931471824645996e+00, -1.9046542121259336e-09);
345
418
  const vec2 PI_FP64 = vec2(3.1415927410125732, -8.742278012618954e-8);
346
419
  const vec2 TWO_PI_FP64 = vec2(6.2831854820251465, -1.7484556025237907e-7);
@@ -350,511 +423,671 @@ const vec2 PI_16_FP64 = vec2(0.19634954631328583, -5.463923757886846e-9);
350
423
  const vec2 PI_16_2_FP64 = vec2(0.39269909262657166, -1.0927847515773692e-8);
351
424
  const vec2 PI_16_3_FP64 = vec2(0.5890486240386963, -1.4906100798128818e-9);
352
425
  const vec2 PI_180_FP64 = vec2(0.01745329238474369, 1.3519960498364902e-10);
426
+
353
427
  const vec2 SIN_TABLE_0_FP64 = vec2(0.19509032368659973, -1.6704714833615242e-9);
354
428
  const vec2 SIN_TABLE_1_FP64 = vec2(0.3826834261417389, 6.22335089017767e-9);
355
429
  const vec2 SIN_TABLE_2_FP64 = vec2(0.5555702447891235, -1.1769521357507529e-8);
356
430
  const vec2 SIN_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617041793133e-8);
431
+
357
432
  const vec2 COS_TABLE_0_FP64 = vec2(0.9807852506637573, 2.9739473106360492e-8);
358
433
  const vec2 COS_TABLE_1_FP64 = vec2(0.9238795042037964, 2.8307490351764386e-8);
359
434
  const vec2 COS_TABLE_2_FP64 = vec2(0.8314695954322815, 1.6870263741530778e-8);
360
435
  const vec2 COS_TABLE_3_FP64 = vec2(0.7071067690849304, 1.2101617152815436e-8);
361
- const vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09);
362
- const vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09);
363
- const vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10);
364
- const vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11);
365
- const vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04, -2.725596874933456e-12);
366
- const vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13);
367
- const vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14);
368
- const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15);
436
+
437
+ const vec2 INVERSE_FACTORIAL_3_FP64 = vec2(1.666666716337204e-01, -4.967053879312289e-09); // 1/3!
438
+ const vec2 INVERSE_FACTORIAL_4_FP64 = vec2(4.16666679084301e-02, -1.2417634698280722e-09); // 1/4!
439
+ const vec2 INVERSE_FACTORIAL_5_FP64 = vec2(8.333333767950535e-03, -4.34617203337595e-10); // 1/5!
440
+ const vec2 INVERSE_FACTORIAL_6_FP64 = vec2(1.3888889225199819e-03, -3.3631094437103215e-11); // 1/6!
441
+ const vec2 INVERSE_FACTORIAL_7_FP64 = vec2(1.9841270113829523e-04, -2.725596874933456e-12); // 1/7!
442
+ const vec2 INVERSE_FACTORIAL_8_FP64 = vec2(2.4801587642286904e-05, -3.406996025904184e-13); // 1/8!
443
+ const vec2 INVERSE_FACTORIAL_9_FP64 = vec2(2.75573188446287533e-06, 3.7935713937038186e-14); // 1/9!
444
+ const vec2 INVERSE_FACTORIAL_10_FP64 = vec2(2.755731998149713e-07, -7.575112367869873e-15); // 1/10!
445
+
369
446
  float nint(float d) {
370
- if (d == floor(d)) return d;
371
- return floor(d + 0.5);
447
+ if (d == floor(d)) return d;
448
+ return floor(d + 0.5);
372
449
  }
450
+
373
451
  vec2 nint_fp64(vec2 a) {
374
- float hi = nint(a.x);
375
- float lo;
376
- vec2 tmp;
377
- if (hi == a.x) {
378
- lo = nint(a.y);
379
- tmp = quickTwoSum(hi, lo);
380
- } else {
381
- lo = 0.0;
382
- if (abs(hi - a.x) == 0.5 && a.y < 0.0) {
383
- hi -= 1.0;
384
- }
385
- tmp = vec2(hi, lo);
386
- }
387
- return tmp;
452
+ float hi = nint(a.x);
453
+ float lo;
454
+ vec2 tmp;
455
+ if (hi == a.x) {
456
+ lo = nint(a.y);
457
+ tmp = quickTwoSum(hi, lo);
458
+ } else {
459
+ lo = 0.0;
460
+ if (abs(hi - a.x) == 0.5 && a.y < 0.0) {
461
+ hi -= 1.0;
462
+ }
463
+ tmp = vec2(hi, lo);
464
+ }
465
+ return tmp;
388
466
  }
467
+
468
+ /* k_power controls how much range reduction we would like to have
469
+ Range reduction uses the following method:
470
+ assume a = k_power * r + m * log(2), k and m being integers.
471
+ Set k_power = 4 (we can choose other k to trade accuracy with performance.
472
+ we only need to calculate exp(r) and using exp(a) = 2^m * exp(r)^k_power;
473
+ */
474
+
389
475
  vec2 exp_fp64(vec2 a) {
390
- const int k_power = 4;
391
- const float k = 16.0;
392
- const float inv_k = 1.0 / k;
393
- if (a.x <= -88.0) return vec2(0.0, 0.0);
394
- if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);
395
- if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);
396
- if (a.x == 1.0 && a.y == 0.0) return E_FP64;
397
- float m = floor(a.x / LOG2_FP64.x + 0.5);
398
- vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;
399
- vec2 s, t, p;
400
- p = mul_fp64(r, r);
401
- s = sum_fp64(r, p * 0.5);
402
- p = mul_fp64(p, r);
403
- t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);
404
- s = sum_fp64(s, t);
405
- p = mul_fp64(p, r);
406
- t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);
407
- s = sum_fp64(s, t);
408
- p = mul_fp64(p, r);
409
- t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
410
- s = sum_fp64(s, t);
411
- for (int i = 0; i < k_power; i++) {
412
- s = sum_fp64(s * 2.0, mul_fp64(s, s));
413
- }
476
+ // We need to make sure these two numbers match
477
+ // as bit-wise shift is not available in GLSL 1.0
478
+ const int k_power = 4;
479
+ const float k = 16.0;
480
+
481
+ const float inv_k = 1.0 / k;
482
+
483
+ if (a.x <= -88.0) return vec2(0.0, 0.0);
484
+ if (a.x >= 88.0) return vec2(1.0 / 0.0, 1.0 / 0.0);
485
+ if (a.x == 0.0 && a.y == 0.0) return vec2(1.0, 0.0);
486
+ if (a.x == 1.0 && a.y == 0.0) return E_FP64;
487
+
488
+ float m = floor(a.x / LOG2_FP64.x + 0.5);
489
+ vec2 r = sub_fp64(a, mul_fp64(LOG2_FP64, vec2(m, 0.0))) * inv_k;
490
+ vec2 s, t, p;
491
+
492
+ p = mul_fp64(r, r);
493
+ s = sum_fp64(r, p * 0.5);
494
+ p = mul_fp64(p, r);
495
+ t = mul_fp64(p, INVERSE_FACTORIAL_3_FP64);
496
+
497
+ s = sum_fp64(s, t);
498
+ p = mul_fp64(p, r);
499
+ t = mul_fp64(p, INVERSE_FACTORIAL_4_FP64);
500
+
501
+ s = sum_fp64(s, t);
502
+ p = mul_fp64(p, r);
503
+ t = mul_fp64(p, INVERSE_FACTORIAL_5_FP64);
504
+
505
+ // s = sum_fp64(s, t);
506
+ // p = mul_fp64(p, r);
507
+ // t = mul_fp64(p, INVERSE_FACTORIAL_6_FP64);
508
+
509
+ // s = sum_fp64(s, t);
510
+ // p = mul_fp64(p, r);
511
+ // t = mul_fp64(p, INVERSE_FACTORIAL_7_FP64);
512
+
513
+ s = sum_fp64(s, t);
514
+
515
+
516
+ // At this point, s = exp(r) - 1; but after following 4 recursions, we will get exp(r) ^ 512 - 1.
517
+ for (int i = 0; i < k_power; i++) {
518
+ s = sum_fp64(s * 2.0, mul_fp64(s, s));
519
+ }
520
+
414
521
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
415
- s = sum_fp64(s, vec2(ONE, 0.0));
522
+ s = sum_fp64(s, vec2(fp64.ONE, 0.0));
416
523
  #else
417
- s = sum_fp64(s, vec2(1.0, 0.0));
524
+ s = sum_fp64(s, vec2(1.0, 0.0));
418
525
  #endif
419
- return s * pow(2.0, m);
526
+
527
+ return s * pow(2.0, m);
528
+ // return r;
420
529
  }
530
+
421
531
  vec2 log_fp64(vec2 a)
422
532
  {
423
- if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);
424
- if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
425
- vec2 x = vec2(log(a.x), 0.0);
426
- vec2 s;
533
+ if (a.x == 1.0 && a.y == 0.0) return vec2(0.0, 0.0);
534
+ if (a.x <= 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);
535
+ vec2 x = vec2(log(a.x), 0.0);
536
+ vec2 s;
427
537
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
428
- s = vec2(ONE, 0.0);
538
+ s = vec2(fp64.ONE, 0.0);
429
539
  #else
430
- s = vec2(1.0, 0.0);
540
+ s = vec2(1.0, 0.0);
431
541
  #endif
432
- x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);
433
- return x;
542
+
543
+ x = sub_fp64(sum_fp64(x, mul_fp64(a, exp_fp64(-x))), s);
544
+ return x;
434
545
  }
546
+
435
547
  vec2 sin_taylor_fp64(vec2 a) {
436
- vec2 r, s, t, x;
437
- if (a.x == 0.0 && a.y == 0.0) {
438
- return vec2(0.0, 0.0);
439
- }
440
- x = -mul_fp64(a, a);
441
- s = a;
442
- r = a;
443
- r = mul_fp64(r, x);
444
- t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);
445
- s = sum_fp64(s, t);
446
- r = mul_fp64(r, x);
447
- t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
448
- s = sum_fp64(s, t);
449
- return s;
548
+ vec2 r, s, t, x;
549
+
550
+ if (a.x == 0.0 && a.y == 0.0) {
551
+ return vec2(0.0, 0.0);
552
+ }
553
+
554
+ x = -mul_fp64(a, a);
555
+ s = a;
556
+ r = a;
557
+
558
+ r = mul_fp64(r, x);
559
+ t = mul_fp64(r, INVERSE_FACTORIAL_3_FP64);
560
+ s = sum_fp64(s, t);
561
+
562
+ r = mul_fp64(r, x);
563
+ t = mul_fp64(r, INVERSE_FACTORIAL_5_FP64);
564
+ s = sum_fp64(s, t);
565
+
566
+ /* keep the following commented code in case we need them
567
+ for extra accuracy from the Taylor expansion*/
568
+
569
+ // r = mul_fp64(r, x);
570
+ // t = mul_fp64(r, INVERSE_FACTORIAL_7_FP64);
571
+ // s = sum_fp64(s, t);
572
+
573
+ // r = mul_fp64(r, x);
574
+ // t = mul_fp64(r, INVERSE_FACTORIAL_9_FP64);
575
+ // s = sum_fp64(s, t);
576
+
577
+ return s;
450
578
  }
579
+
451
580
  vec2 cos_taylor_fp64(vec2 a) {
452
- vec2 r, s, t, x;
453
- if (a.x == 0.0 && a.y == 0.0) {
454
- return vec2(1.0, 0.0);
455
- }
456
- x = -mul_fp64(a, a);
457
- r = x;
458
- s = sum_fp64(vec2(1.0, 0.0), r * 0.5);
459
- r = mul_fp64(r, x);
460
- t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);
461
- s = sum_fp64(s, t);
462
- r = mul_fp64(r, x);
463
- t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
464
- s = sum_fp64(s, t);
465
- return s;
581
+ vec2 r, s, t, x;
582
+
583
+ if (a.x == 0.0 && a.y == 0.0) {
584
+ return vec2(1.0, 0.0);
585
+ }
586
+
587
+ x = -mul_fp64(a, a);
588
+ r = x;
589
+ s = sum_fp64(vec2(1.0, 0.0), r * 0.5);
590
+
591
+ r = mul_fp64(r, x);
592
+ t = mul_fp64(r, INVERSE_FACTORIAL_4_FP64);
593
+ s = sum_fp64(s, t);
594
+
595
+ r = mul_fp64(r, x);
596
+ t = mul_fp64(r, INVERSE_FACTORIAL_6_FP64);
597
+ s = sum_fp64(s, t);
598
+
599
+ /* keep the following commented code in case we need them
600
+ for extra accuracy from the Taylor expansion*/
601
+
602
+ // r = mul_fp64(r, x);
603
+ // t = mul_fp64(r, INVERSE_FACTORIAL_8_FP64);
604
+ // s = sum_fp64(s, t);
605
+
606
+ // r = mul_fp64(r, x);
607
+ // t = mul_fp64(r, INVERSE_FACTORIAL_10_FP64);
608
+ // s = sum_fp64(s, t);
609
+
610
+ return s;
466
611
  }
612
+
467
613
  void sincos_taylor_fp64(vec2 a, out vec2 sin_t, out vec2 cos_t) {
468
- if (a.x == 0.0 && a.y == 0.0) {
469
- sin_t = vec2(0.0, 0.0);
470
- cos_t = vec2(1.0, 0.0);
471
- }
472
- sin_t = sin_taylor_fp64(a);
473
- cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
614
+ if (a.x == 0.0 && a.y == 0.0) {
615
+ sin_t = vec2(0.0, 0.0);
616
+ cos_t = vec2(1.0, 0.0);
617
+ }
618
+
619
+ sin_t = sin_taylor_fp64(a);
620
+ cos_t = sqrt_fp64(sub_fp64(vec2(1.0, 0.0), mul_fp64(sin_t, sin_t)));
474
621
  }
622
+
475
623
  vec2 sin_fp64(vec2 a) {
476
- if (a.x == 0.0 && a.y == 0.0) {
477
- return vec2(0.0, 0.0);
478
- }
479
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
480
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
481
- vec2 t;
482
- float q = floor(r.x / PI_2_FP64.x + 0.5);
483
- int j = int(q);
484
- if (j < -2 || j > 2) {
485
- return vec2(0.0 / 0.0, 0.0 / 0.0);
486
- }
487
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
488
- q = floor(t.x / PI_16_FP64.x + 0.5);
489
- int k = int(q);
490
- if (k == 0) {
491
- if (j == 0) {
492
- return sin_taylor_fp64(t);
493
- } else if (j == 1) {
494
- return cos_taylor_fp64(t);
495
- } else if (j == -1) {
496
- return -cos_taylor_fp64(t);
497
- } else {
498
- return -sin_taylor_fp64(t);
499
- }
500
- }
501
- int abs_k = int(abs(float(k)));
502
- if (abs_k > 4) {
503
- return vec2(0.0 / 0.0, 0.0 / 0.0);
504
- } else {
505
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
506
- }
507
- vec2 u = vec2(0.0, 0.0);
508
- vec2 v = vec2(0.0, 0.0);
624
+ if (a.x == 0.0 && a.y == 0.0) {
625
+ return vec2(0.0, 0.0);
626
+ }
627
+
628
+ // 2pi range reduction
629
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
630
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
631
+
632
+ vec2 t;
633
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
634
+ int j = int(q);
635
+
636
+ if (j < -2 || j > 2) {
637
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
638
+ }
639
+
640
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
641
+
642
+ q = floor(t.x / PI_16_FP64.x + 0.5);
643
+ int k = int(q);
644
+
645
+ if (k == 0) {
646
+ if (j == 0) {
647
+ return sin_taylor_fp64(t);
648
+ } else if (j == 1) {
649
+ return cos_taylor_fp64(t);
650
+ } else if (j == -1) {
651
+ return -cos_taylor_fp64(t);
652
+ } else {
653
+ return -sin_taylor_fp64(t);
654
+ }
655
+ }
656
+
657
+ int abs_k = int(abs(float(k)));
658
+
659
+ if (abs_k > 4) {
660
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
661
+ } else {
662
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
663
+ }
664
+
665
+ vec2 u = vec2(0.0, 0.0);
666
+ vec2 v = vec2(0.0, 0.0);
667
+
509
668
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
510
- if (abs(float(abs_k) - 1.0) < 0.5) {
511
- u = COS_TABLE_0_FP64;
512
- v = SIN_TABLE_0_FP64;
513
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
514
- u = COS_TABLE_1_FP64;
515
- v = SIN_TABLE_1_FP64;
516
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
517
- u = COS_TABLE_2_FP64;
518
- v = SIN_TABLE_2_FP64;
519
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
520
- u = COS_TABLE_3_FP64;
521
- v = SIN_TABLE_3_FP64;
522
- }
669
+ if (abs(float(abs_k) - 1.0) < 0.5) {
670
+ u = COS_TABLE_0_FP64;
671
+ v = SIN_TABLE_0_FP64;
672
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
673
+ u = COS_TABLE_1_FP64;
674
+ v = SIN_TABLE_1_FP64;
675
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
676
+ u = COS_TABLE_2_FP64;
677
+ v = SIN_TABLE_2_FP64;
678
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
679
+ u = COS_TABLE_3_FP64;
680
+ v = SIN_TABLE_3_FP64;
681
+ }
523
682
  #else
524
- if (abs_k == 1) {
525
- u = COS_TABLE_0_FP64;
526
- v = SIN_TABLE_0_FP64;
527
- } else if (abs_k == 2) {
528
- u = COS_TABLE_1_FP64;
529
- v = SIN_TABLE_1_FP64;
530
- } else if (abs_k == 3) {
531
- u = COS_TABLE_2_FP64;
532
- v = SIN_TABLE_2_FP64;
533
- } else if (abs_k == 4) {
534
- u = COS_TABLE_3_FP64;
535
- v = SIN_TABLE_3_FP64;
536
- }
683
+ if (abs_k == 1) {
684
+ u = COS_TABLE_0_FP64;
685
+ v = SIN_TABLE_0_FP64;
686
+ } else if (abs_k == 2) {
687
+ u = COS_TABLE_1_FP64;
688
+ v = SIN_TABLE_1_FP64;
689
+ } else if (abs_k == 3) {
690
+ u = COS_TABLE_2_FP64;
691
+ v = SIN_TABLE_2_FP64;
692
+ } else if (abs_k == 4) {
693
+ u = COS_TABLE_3_FP64;
694
+ v = SIN_TABLE_3_FP64;
695
+ }
537
696
  #endif
538
- vec2 sin_t, cos_t;
539
- sincos_taylor_fp64(t, sin_t, cos_t);
540
- vec2 result = vec2(0.0, 0.0);
541
- if (j == 0) {
542
- if (k > 0) {
543
- result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
544
- } else {
545
- result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
546
- }
547
- } else if (j == 1) {
548
- if (k > 0) {
549
- result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
550
- } else {
551
- result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
552
- }
553
- } else if (j == -1) {
554
- if (k > 0) {
555
- result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
556
- } else {
557
- result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
558
- }
559
- } else {
560
- if (k > 0) {
561
- result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
562
- } else {
563
- result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
564
- }
565
- }
566
- return result;
697
+
698
+ vec2 sin_t, cos_t;
699
+ sincos_taylor_fp64(t, sin_t, cos_t);
700
+
701
+
702
+
703
+ vec2 result = vec2(0.0, 0.0);
704
+ if (j == 0) {
705
+ if (k > 0) {
706
+ result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
707
+ } else {
708
+ result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
709
+ }
710
+ } else if (j == 1) {
711
+ if (k > 0) {
712
+ result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
713
+ } else {
714
+ result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
715
+ }
716
+ } else if (j == -1) {
717
+ if (k > 0) {
718
+ result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
719
+ } else {
720
+ result = -sum_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
721
+ }
722
+ } else {
723
+ if (k > 0) {
724
+ result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
725
+ } else {
726
+ result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
727
+ }
728
+ }
729
+
730
+ return result;
567
731
  }
732
+
568
733
  vec2 cos_fp64(vec2 a) {
569
- if (a.x == 0.0 && a.y == 0.0) {
570
- return vec2(1.0, 0.0);
571
- }
572
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
573
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
574
- vec2 t;
575
- float q = floor(r.x / PI_2_FP64.x + 0.5);
576
- int j = int(q);
577
- if (j < -2 || j > 2) {
578
- return vec2(0.0 / 0.0, 0.0 / 0.0);
579
- }
580
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
581
- q = floor(t.x / PI_16_FP64.x + 0.5);
582
- int k = int(q);
583
- if (k == 0) {
584
- if (j == 0) {
585
- return cos_taylor_fp64(t);
586
- } else if (j == 1) {
587
- return -sin_taylor_fp64(t);
588
- } else if (j == -1) {
589
- return sin_taylor_fp64(t);
590
- } else {
591
- return -cos_taylor_fp64(t);
592
- }
593
- }
594
- int abs_k = int(abs(float(k)));
595
- if (abs_k > 4) {
596
- return vec2(0.0 / 0.0, 0.0 / 0.0);
597
- } else {
598
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
599
- }
600
- vec2 u = vec2(0.0, 0.0);
601
- vec2 v = vec2(0.0, 0.0);
734
+ if (a.x == 0.0 && a.y == 0.0) {
735
+ return vec2(1.0, 0.0);
736
+ }
737
+
738
+ // 2pi range reduction
739
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
740
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
741
+
742
+ vec2 t;
743
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
744
+ int j = int(q);
745
+
746
+ if (j < -2 || j > 2) {
747
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
748
+ }
749
+
750
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
751
+
752
+ q = floor(t.x / PI_16_FP64.x + 0.5);
753
+ int k = int(q);
754
+
755
+ if (k == 0) {
756
+ if (j == 0) {
757
+ return cos_taylor_fp64(t);
758
+ } else if (j == 1) {
759
+ return -sin_taylor_fp64(t);
760
+ } else if (j == -1) {
761
+ return sin_taylor_fp64(t);
762
+ } else {
763
+ return -cos_taylor_fp64(t);
764
+ }
765
+ }
766
+
767
+ int abs_k = int(abs(float(k)));
768
+
769
+ if (abs_k > 4) {
770
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
771
+ } else {
772
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
773
+ }
774
+
775
+ vec2 u = vec2(0.0, 0.0);
776
+ vec2 v = vec2(0.0, 0.0);
777
+
602
778
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
603
- if (abs(float(abs_k) - 1.0) < 0.5) {
604
- u = COS_TABLE_0_FP64;
605
- v = SIN_TABLE_0_FP64;
606
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
607
- u = COS_TABLE_1_FP64;
608
- v = SIN_TABLE_1_FP64;
609
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
610
- u = COS_TABLE_2_FP64;
611
- v = SIN_TABLE_2_FP64;
612
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
613
- u = COS_TABLE_3_FP64;
614
- v = SIN_TABLE_3_FP64;
615
- }
779
+ if (abs(float(abs_k) - 1.0) < 0.5) {
780
+ u = COS_TABLE_0_FP64;
781
+ v = SIN_TABLE_0_FP64;
782
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
783
+ u = COS_TABLE_1_FP64;
784
+ v = SIN_TABLE_1_FP64;
785
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
786
+ u = COS_TABLE_2_FP64;
787
+ v = SIN_TABLE_2_FP64;
788
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
789
+ u = COS_TABLE_3_FP64;
790
+ v = SIN_TABLE_3_FP64;
791
+ }
616
792
  #else
617
- if (abs_k == 1) {
618
- u = COS_TABLE_0_FP64;
619
- v = SIN_TABLE_0_FP64;
620
- } else if (abs_k == 2) {
621
- u = COS_TABLE_1_FP64;
622
- v = SIN_TABLE_1_FP64;
623
- } else if (abs_k == 3) {
624
- u = COS_TABLE_2_FP64;
625
- v = SIN_TABLE_2_FP64;
626
- } else if (abs_k == 4) {
627
- u = COS_TABLE_3_FP64;
628
- v = SIN_TABLE_3_FP64;
629
- }
793
+ if (abs_k == 1) {
794
+ u = COS_TABLE_0_FP64;
795
+ v = SIN_TABLE_0_FP64;
796
+ } else if (abs_k == 2) {
797
+ u = COS_TABLE_1_FP64;
798
+ v = SIN_TABLE_1_FP64;
799
+ } else if (abs_k == 3) {
800
+ u = COS_TABLE_2_FP64;
801
+ v = SIN_TABLE_2_FP64;
802
+ } else if (abs_k == 4) {
803
+ u = COS_TABLE_3_FP64;
804
+ v = SIN_TABLE_3_FP64;
805
+ }
630
806
  #endif
631
- vec2 sin_t, cos_t;
632
- sincos_taylor_fp64(t, sin_t, cos_t);
633
- vec2 result = vec2(0.0, 0.0);
634
- if (j == 0) {
635
- if (k > 0) {
636
- result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
637
- } else {
638
- result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
639
- }
640
- } else if (j == 1) {
641
- if (k > 0) {
642
- result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
643
- } else {
644
- result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
645
- }
646
- } else if (j == -1) {
647
- if (k > 0) {
648
- result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
649
- } else {
650
- result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
651
- }
652
- } else {
653
- if (k > 0) {
654
- result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
655
- } else {
656
- result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
657
- }
658
- }
659
- return result;
807
+
808
+ vec2 sin_t, cos_t;
809
+ sincos_taylor_fp64(t, sin_t, cos_t);
810
+
811
+ vec2 result = vec2(0.0, 0.0);
812
+ if (j == 0) {
813
+ if (k > 0) {
814
+ result = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
815
+ } else {
816
+ result = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
817
+ }
818
+ } else if (j == 1) {
819
+ if (k > 0) {
820
+ result = -sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
821
+ } else {
822
+ result = sub_fp64(mul_fp64(v, cos_t), mul_fp64(u, sin_t));
823
+ }
824
+ } else if (j == -1) {
825
+ if (k > 0) {
826
+ result = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
827
+ } else {
828
+ result = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
829
+ }
830
+ } else {
831
+ if (k > 0) {
832
+ result = sub_fp64(mul_fp64(v, sin_t), mul_fp64(u, cos_t));
833
+ } else {
834
+ result = -sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
835
+ }
836
+ }
837
+
838
+ return result;
660
839
  }
840
+
661
841
  vec2 tan_fp64(vec2 a) {
662
- vec2 sin_a;
663
- vec2 cos_a;
664
- if (a.x == 0.0 && a.y == 0.0) {
665
- return vec2(0.0, 0.0);
666
- }
667
- vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
668
- vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
669
- vec2 t;
670
- float q = floor(r.x / PI_2_FP64.x + 0.5);
671
- int j = int(q);
672
- if (j < -2 || j > 2) {
673
- return vec2(0.0 / 0.0, 0.0 / 0.0);
674
- }
675
- t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
676
- q = floor(t.x / PI_16_FP64.x + 0.5);
677
- int k = int(q);
678
- int abs_k = int(abs(float(k)));
679
- if (abs_k > 4) {
680
- return vec2(0.0 / 0.0, 0.0 / 0.0);
681
- } else {
682
- t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
683
- }
684
- vec2 u = vec2(0.0, 0.0);
685
- vec2 v = vec2(0.0, 0.0);
686
- vec2 sin_t, cos_t;
687
- vec2 s, c;
688
- sincos_taylor_fp64(t, sin_t, cos_t);
689
- if (k == 0) {
690
- s = sin_t;
691
- c = cos_t;
692
- } else {
842
+ vec2 sin_a;
843
+ vec2 cos_a;
844
+
845
+ if (a.x == 0.0 && a.y == 0.0) {
846
+ return vec2(0.0, 0.0);
847
+ }
848
+
849
+ // 2pi range reduction
850
+ vec2 z = nint_fp64(div_fp64(a, TWO_PI_FP64));
851
+ vec2 r = sub_fp64(a, mul_fp64(TWO_PI_FP64, z));
852
+
853
+ vec2 t;
854
+ float q = floor(r.x / PI_2_FP64.x + 0.5);
855
+ int j = int(q);
856
+
857
+
858
+ if (j < -2 || j > 2) {
859
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
860
+ }
861
+
862
+ t = sub_fp64(r, mul_fp64(PI_2_FP64, vec2(q, 0.0)));
863
+
864
+ q = floor(t.x / PI_16_FP64.x + 0.5);
865
+ int k = int(q);
866
+ int abs_k = int(abs(float(k)));
867
+
868
+ // We just can't get PI/16 * 3.0 very accurately.
869
+ // so let's just store it
870
+ if (abs_k > 4) {
871
+ return vec2(0.0 / 0.0, 0.0 / 0.0);
872
+ } else {
873
+ t = sub_fp64(t, mul_fp64(PI_16_FP64, vec2(q, 0.0)));
874
+ }
875
+
876
+
877
+ vec2 u = vec2(0.0, 0.0);
878
+ vec2 v = vec2(0.0, 0.0);
879
+
880
+ vec2 sin_t, cos_t;
881
+ vec2 s, c;
882
+ sincos_taylor_fp64(t, sin_t, cos_t);
883
+
884
+ if (k == 0) {
885
+ s = sin_t;
886
+ c = cos_t;
887
+ } else {
693
888
  #if defined(NVIDIA_FP64_WORKAROUND) || defined(INTEL_FP64_WORKAROUND)
694
- if (abs(float(abs_k) - 1.0) < 0.5) {
695
- u = COS_TABLE_0_FP64;
696
- v = SIN_TABLE_0_FP64;
697
- } else if (abs(float(abs_k) - 2.0) < 0.5) {
698
- u = COS_TABLE_1_FP64;
699
- v = SIN_TABLE_1_FP64;
700
- } else if (abs(float(abs_k) - 3.0) < 0.5) {
701
- u = COS_TABLE_2_FP64;
702
- v = SIN_TABLE_2_FP64;
703
- } else if (abs(float(abs_k) - 4.0) < 0.5) {
704
- u = COS_TABLE_3_FP64;
705
- v = SIN_TABLE_3_FP64;
706
- }
889
+ if (abs(float(abs_k) - 1.0) < 0.5) {
890
+ u = COS_TABLE_0_FP64;
891
+ v = SIN_TABLE_0_FP64;
892
+ } else if (abs(float(abs_k) - 2.0) < 0.5) {
893
+ u = COS_TABLE_1_FP64;
894
+ v = SIN_TABLE_1_FP64;
895
+ } else if (abs(float(abs_k) - 3.0) < 0.5) {
896
+ u = COS_TABLE_2_FP64;
897
+ v = SIN_TABLE_2_FP64;
898
+ } else if (abs(float(abs_k) - 4.0) < 0.5) {
899
+ u = COS_TABLE_3_FP64;
900
+ v = SIN_TABLE_3_FP64;
901
+ }
707
902
  #else
708
- if (abs_k == 1) {
709
- u = COS_TABLE_0_FP64;
710
- v = SIN_TABLE_0_FP64;
711
- } else if (abs_k == 2) {
712
- u = COS_TABLE_1_FP64;
713
- v = SIN_TABLE_1_FP64;
714
- } else if (abs_k == 3) {
715
- u = COS_TABLE_2_FP64;
716
- v = SIN_TABLE_2_FP64;
717
- } else if (abs_k == 4) {
718
- u = COS_TABLE_3_FP64;
719
- v = SIN_TABLE_3_FP64;
720
- }
903
+ if (abs_k == 1) {
904
+ u = COS_TABLE_0_FP64;
905
+ v = SIN_TABLE_0_FP64;
906
+ } else if (abs_k == 2) {
907
+ u = COS_TABLE_1_FP64;
908
+ v = SIN_TABLE_1_FP64;
909
+ } else if (abs_k == 3) {
910
+ u = COS_TABLE_2_FP64;
911
+ v = SIN_TABLE_2_FP64;
912
+ } else if (abs_k == 4) {
913
+ u = COS_TABLE_3_FP64;
914
+ v = SIN_TABLE_3_FP64;
915
+ }
721
916
  #endif
722
- if (k > 0) {
723
- s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
724
- c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
725
- } else {
726
- s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
727
- c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
728
- }
729
- }
730
- if (j == 0) {
731
- sin_a = s;
732
- cos_a = c;
733
- } else if (j == 1) {
734
- sin_a = c;
735
- cos_a = -s;
736
- } else if (j == -1) {
737
- sin_a = -c;
738
- cos_a = s;
739
- } else {
740
- sin_a = -s;
741
- cos_a = -c;
742
- }
743
- return div_fp64(sin_a, cos_a);
917
+ if (k > 0) {
918
+ s = sum_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
919
+ c = sub_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
920
+ } else {
921
+ s = sub_fp64(mul_fp64(u, sin_t), mul_fp64(v, cos_t));
922
+ c = sum_fp64(mul_fp64(u, cos_t), mul_fp64(v, sin_t));
923
+ }
924
+ }
925
+
926
+ if (j == 0) {
927
+ sin_a = s;
928
+ cos_a = c;
929
+ } else if (j == 1) {
930
+ sin_a = c;
931
+ cos_a = -s;
932
+ } else if (j == -1) {
933
+ sin_a = -c;
934
+ cos_a = s;
935
+ } else {
936
+ sin_a = -s;
937
+ cos_a = -c;
938
+ }
939
+ return div_fp64(sin_a, cos_a);
744
940
  }
941
+
745
942
  vec2 radians_fp64(vec2 degree) {
746
- return mul_fp64(degree, PI_180_FP64);
943
+ return mul_fp64(degree, PI_180_FP64);
747
944
  }
945
+
748
946
  vec2 mix_fp64(vec2 a, vec2 b, float x) {
749
- vec2 range = sub_fp64(b, a);
750
- return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));
947
+ vec2 range = sub_fp64(b, a);
948
+ return sum_fp64(a, mul_fp64(range, vec2(x, 0.0)));
751
949
  }
950
+
951
+ // Vector functions
952
+ // vec2 functions
752
953
  void vec2_sum_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
753
- out_val[0] = sum_fp64(a[0], b[0]);
754
- out_val[1] = sum_fp64(a[1], b[1]);
954
+ out_val[0] = sum_fp64(a[0], b[0]);
955
+ out_val[1] = sum_fp64(a[1], b[1]);
755
956
  }
957
+
756
958
  void vec2_sub_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
757
- out_val[0] = sub_fp64(a[0], b[0]);
758
- out_val[1] = sub_fp64(a[1], b[1]);
959
+ out_val[0] = sub_fp64(a[0], b[0]);
960
+ out_val[1] = sub_fp64(a[1], b[1]);
759
961
  }
962
+
760
963
  void vec2_mul_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
761
- out_val[0] = mul_fp64(a[0], b[0]);
762
- out_val[1] = mul_fp64(a[1], b[1]);
964
+ out_val[0] = mul_fp64(a[0], b[0]);
965
+ out_val[1] = mul_fp64(a[1], b[1]);
763
966
  }
967
+
764
968
  void vec2_div_fp64(vec2 a[2], vec2 b[2], out vec2 out_val[2]) {
765
- out_val[0] = div_fp64(a[0], b[0]);
766
- out_val[1] = div_fp64(a[1], b[1]);
969
+ out_val[0] = div_fp64(a[0], b[0]);
970
+ out_val[1] = div_fp64(a[1], b[1]);
767
971
  }
972
+
768
973
  void vec2_mix_fp64(vec2 x[2], vec2 y[2], float a, out vec2 out_val[2]) {
769
- vec2 range[2];
770
- vec2_sub_fp64(y, x, range);
771
- vec2 portion[2];
772
- portion[0] = range[0] * a;
773
- portion[1] = range[1] * a;
774
- vec2_sum_fp64(x, portion, out_val);
974
+ vec2 range[2];
975
+ vec2_sub_fp64(y, x, range);
976
+ vec2 portion[2];
977
+ portion[0] = range[0] * a;
978
+ portion[1] = range[1] * a;
979
+ vec2_sum_fp64(x, portion, out_val);
775
980
  }
981
+
776
982
  vec2 vec2_length_fp64(vec2 x[2]) {
777
- return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));
983
+ return sqrt_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])));
778
984
  }
985
+
779
986
  void vec2_normalize_fp64(vec2 x[2], out vec2 out_val[2]) {
780
- vec2 length = vec2_length_fp64(x);
781
- vec2 length_vec2[2];
782
- length_vec2[0] = length;
783
- length_vec2[1] = length;
784
- vec2_div_fp64(x, length_vec2, out_val);
987
+ vec2 length = vec2_length_fp64(x);
988
+ vec2 length_vec2[2];
989
+ length_vec2[0] = length;
990
+ length_vec2[1] = length;
991
+
992
+ vec2_div_fp64(x, length_vec2, out_val);
785
993
  }
994
+
786
995
  vec2 vec2_distance_fp64(vec2 x[2], vec2 y[2]) {
787
- vec2 diff[2];
788
- vec2_sub_fp64(x, y, diff);
789
- return vec2_length_fp64(diff);
996
+ vec2 diff[2];
997
+ vec2_sub_fp64(x, y, diff);
998
+ return vec2_length_fp64(diff);
790
999
  }
1000
+
791
1001
  vec2 vec2_dot_fp64(vec2 a[2], vec2 b[2]) {
792
- vec2 v[2];
793
- v[0] = mul_fp64(a[0], b[0]);
794
- v[1] = mul_fp64(a[1], b[1]);
795
- return sum_fp64(v[0], v[1]);
1002
+ vec2 v[2];
1003
+
1004
+ v[0] = mul_fp64(a[0], b[0]);
1005
+ v[1] = mul_fp64(a[1], b[1]);
1006
+
1007
+ return sum_fp64(v[0], v[1]);
796
1008
  }
1009
+
1010
+ // vec3 functions
797
1011
  void vec3_sub_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
798
- for (int i = 0; i < 3; i++) {
799
- out_val[i] = sum_fp64(a[i], b[i]);
800
- }
1012
+ for (int i = 0; i < 3; i++) {
1013
+ out_val[i] = sum_fp64(a[i], b[i]);
1014
+ }
801
1015
  }
1016
+
802
1017
  void vec3_sum_fp64(vec2 a[3], vec2 b[3], out vec2 out_val[3]) {
803
- for (int i = 0; i < 3; i++) {
804
- out_val[i] = sum_fp64(a[i], b[i]);
805
- }
1018
+ for (int i = 0; i < 3; i++) {
1019
+ out_val[i] = sum_fp64(a[i], b[i]);
1020
+ }
806
1021
  }
1022
+
807
1023
  vec2 vec3_length_fp64(vec2 x[3]) {
808
- return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),
809
- mul_fp64(x[2], x[2])));
1024
+ return sqrt_fp64(sum_fp64(sum_fp64(mul_fp64(x[0], x[0]), mul_fp64(x[1], x[1])),
1025
+ mul_fp64(x[2], x[2])));
810
1026
  }
1027
+
811
1028
  vec2 vec3_distance_fp64(vec2 x[3], vec2 y[3]) {
812
- vec2 diff[3];
813
- vec3_sub_fp64(x, y, diff);
814
- return vec3_length_fp64(diff);
1029
+ vec2 diff[3];
1030
+ vec3_sub_fp64(x, y, diff);
1031
+ return vec3_length_fp64(diff);
815
1032
  }
1033
+
1034
+ // vec4 functions
816
1035
  void vec4_fp64(vec4 a, out vec2 out_val[4]) {
817
- out_val[0].x = a[0];
818
- out_val[0].y = 0.0;
819
- out_val[1].x = a[1];
820
- out_val[1].y = 0.0;
821
- out_val[2].x = a[2];
822
- out_val[2].y = 0.0;
823
- out_val[3].x = a[3];
824
- out_val[3].y = 0.0;
1036
+ out_val[0].x = a[0];
1037
+ out_val[0].y = 0.0;
1038
+
1039
+ out_val[1].x = a[1];
1040
+ out_val[1].y = 0.0;
1041
+
1042
+ out_val[2].x = a[2];
1043
+ out_val[2].y = 0.0;
1044
+
1045
+ out_val[3].x = a[3];
1046
+ out_val[3].y = 0.0;
825
1047
  }
1048
+
826
1049
  void vec4_scalar_mul_fp64(vec2 a[4], vec2 b, out vec2 out_val[4]) {
827
- out_val[0] = mul_fp64(a[0], b);
828
- out_val[1] = mul_fp64(a[1], b);
829
- out_val[2] = mul_fp64(a[2], b);
830
- out_val[3] = mul_fp64(a[3], b);
1050
+ out_val[0] = mul_fp64(a[0], b);
1051
+ out_val[1] = mul_fp64(a[1], b);
1052
+ out_val[2] = mul_fp64(a[2], b);
1053
+ out_val[3] = mul_fp64(a[3], b);
831
1054
  }
1055
+
832
1056
  void vec4_sum_fp64(vec2 a[4], vec2 b[4], out vec2 out_val[4]) {
833
- for (int i = 0; i < 4; i++) {
834
- out_val[i] = sum_fp64(a[i], b[i]);
835
- }
1057
+ for (int i = 0; i < 4; i++) {
1058
+ out_val[i] = sum_fp64(a[i], b[i]);
1059
+ }
836
1060
  }
1061
+
837
1062
  void vec4_dot_fp64(vec2 a[4], vec2 b[4], out vec2 out_val) {
838
- vec2 v[4];
839
- v[0] = mul_fp64(a[0], b[0]);
840
- v[1] = mul_fp64(a[1], b[1]);
841
- v[2] = mul_fp64(a[2], b[2]);
842
- v[3] = mul_fp64(a[3], b[3]);
843
- out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
1063
+ vec2 v[4];
1064
+
1065
+ v[0] = mul_fp64(a[0], b[0]);
1066
+ v[1] = mul_fp64(a[1], b[1]);
1067
+ v[2] = mul_fp64(a[2], b[2]);
1068
+ v[3] = mul_fp64(a[3], b[3]);
1069
+
1070
+ out_val = sum_fp64(sum_fp64(v[0], v[1]), sum_fp64(v[2], v[3]));
844
1071
  }
1072
+
845
1073
  void mat4_vec4_mul_fp64(vec2 b[16], vec2 a[4], out vec2 out_val[4]) {
846
- vec2 tmp[4];
847
- for (int i = 0; i < 4; i++)
848
- {
849
- for (int j = 0; j < 4; j++)
850
- {
851
- tmp[j] = b[j + i * 4];
852
- }
853
- vec4_dot_fp64(a, tmp, out_val[i]);
854
- }
1074
+ vec2 tmp[4];
1075
+
1076
+ for (int i = 0; i < 4; i++)
1077
+ {
1078
+ for (int j = 0; j < 4; j++)
1079
+ {
1080
+ tmp[j] = b[j + i * 4];
1081
+ }
1082
+ vec4_dot_fp64(a, tmp, out_val[i]);
1083
+ }
855
1084
  }
856
- `;var Zt={ONE:1};function $t(){return Zt}var Ue={name:"fp64-arithmetic",vs:ze,getUniforms:$t,fp64ify:Q,fp64LowPart:ce,fp64ifyMatrix4:ue},J={name:"fp64",vs:Ge,dependencies:[Ue],fp64ify:Q,fp64LowPart:ce,fp64ifyMatrix4:ue};var wo=1/Math.PI*180,Bo=1/180*Math.PI,Xt={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...Xt}};var L=globalThis.mathgl.config;function pe(r){return Array.isArray(r)||ArrayBuffer.isView(r)&&!(r instanceof DataView)}function E(r,e,t){let o=L.EPSILON;t&&(L.EPSILON=t);try{if(r===e)return!0;if(pe(r)&&pe(e)){if(r.length!==e.length)return!1;for(let i=0;i<r.length;++i)if(!E(r[i],e[i]))return!1;return!0}return r&&r.equals?r.equals(e):e&&e.equals?e.equals(r):typeof r=="number"&&typeof e=="number"?Math.abs(r-e)<=L.EPSILON*Math.max(1,Math.abs(r),Math.abs(e)):!1}finally{L.EPSILON=o}}var C=typeof Float32Array<"u"?Float32Array:Array,_e=Math.random;function ee(r){return r>=0?Math.round(r):r%.5===0?Math.floor(r):Math.round(r)}var Vo=Math.PI/180;var I={};xe(I,{add:()=>or,angle:()=>Ar,bezier:()=>gr,ceil:()=>ir,clone:()=>Jt,copy:()=>tr,create:()=>qe,cross:()=>dr,dist:()=>Rr,distance:()=>Ze,div:()=>kr,divide:()=>Ke,dot:()=>me,equals:()=>Cr,exactEquals:()=>Lr,floor:()=>sr,forEach:()=>Dr,fromValues:()=>er,hermite:()=>vr,inverse:()=>pr,len:()=>wr,length:()=>He,lerp:()=>mr,max:()=>ar,min:()=>nr,mul:()=>Sr,multiply:()=>We,negate:()=>ur,normalize:()=>_r,random:()=>xr,rotateX:()=>Er,rotateY:()=>Mr,rotateZ:()=>Tr,round:()=>lr,scale:()=>fr,scaleAndAdd:()=>cr,set:()=>rr,slerp:()=>hr,sqrDist:()=>Nr,sqrLen:()=>Br,squaredDistance:()=>$e,squaredLength:()=>Xe,str:()=>Or,sub:()=>Ir,subtract:()=>Ye,transformMat3:()=>yr,transformMat4:()=>Pr,transformQuat:()=>br,zero:()=>Fr});function qe(){let r=new C(3);return C!=Float32Array&&(r[0]=0,r[1]=0,r[2]=0),r}function Jt(r){let e=new C(3);return e[0]=r[0],e[1]=r[1],e[2]=r[2],e}function He(r){let e=r[0],t=r[1],o=r[2];return Math.sqrt(e*e+t*t+o*o)}function er(r,e,t){let o=new C(3);return o[0]=r,o[1]=e,o[2]=t,o}function tr(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r}function rr(r,e,t,o){return r[0]=e,r[1]=t,r[2]=o,r}function or(r,e,t){return r[0]=e[0]+t[0],r[1]=e[1]+t[1],r[2]=e[2]+t[2],r}function Ye(r,e,t){return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r[2]=e[2]-t[2],r}function We(r,e,t){return r[0]=e[0]*t[0],r[1]=e[1]*t[1],r[2]=e[2]*t[2],r}function Ke(r,e,t){return r[0]=e[0]/t[0],r[1]=e[1]/t[1],r[2]=e[2]/t[2],r}function ir(r,e){return r[0]=Math.ceil(e[0]),r[1]=Math.ceil(e[1]),r[2]=Math.ceil(e[2]),r}function sr(r,e){return r[0]=Math.floor(e[0]),r[1]=Math.floor(e[1]),r[2]=Math.floor(e[2]),r}function nr(r,e,t){return r[0]=Math.min(e[0],t[0]),r[1]=Math.min(e[1],t[1]),r[2]=Math.min(e[2],t[2]),r}function ar(r,e,t){return r[0]=Math.max(e[0],t[0]),r[1]=Math.max(e[1],t[1]),r[2]=Math.max(e[2],t[2]),r}function lr(r,e){return r[0]=ee(e[0]),r[1]=ee(e[1]),r[2]=ee(e[2]),r}function fr(r,e,t){return r[0]=e[0]*t,r[1]=e[1]*t,r[2]=e[2]*t,r}function cr(r,e,t,o){return r[0]=e[0]+t[0]*o,r[1]=e[1]+t[1]*o,r[2]=e[2]+t[2]*o,r}function Ze(r,e){let t=e[0]-r[0],o=e[1]-r[1],i=e[2]-r[2];return Math.sqrt(t*t+o*o+i*i)}function $e(r,e){let t=e[0]-r[0],o=e[1]-r[1],i=e[2]-r[2];return t*t+o*o+i*i}function Xe(r){let e=r[0],t=r[1],o=r[2];return e*e+t*t+o*o}function ur(r,e){return r[0]=-e[0],r[1]=-e[1],r[2]=-e[2],r}function pr(r,e){return r[0]=1/e[0],r[1]=1/e[1],r[2]=1/e[2],r}function _r(r,e){let t=e[0],o=e[1],i=e[2],s=t*t+o*o+i*i;return s>0&&(s=1/Math.sqrt(s)),r[0]=e[0]*s,r[1]=e[1]*s,r[2]=e[2]*s,r}function me(r,e){return r[0]*e[0]+r[1]*e[1]+r[2]*e[2]}function dr(r,e,t){let o=e[0],i=e[1],s=e[2],n=t[0],a=t[1],l=t[2];return r[0]=i*l-s*a,r[1]=s*n-o*l,r[2]=o*a-i*n,r}function mr(r,e,t,o){let i=e[0],s=e[1],n=e[2];return r[0]=i+o*(t[0]-i),r[1]=s+o*(t[1]-s),r[2]=n+o*(t[2]-n),r}function hr(r,e,t,o){let i=Math.acos(Math.min(Math.max(me(e,t),-1),1)),s=Math.sin(i),n=Math.sin((1-o)*i)/s,a=Math.sin(o*i)/s;return r[0]=n*e[0]+a*t[0],r[1]=n*e[1]+a*t[1],r[2]=n*e[2]+a*t[2],r}function vr(r,e,t,o,i,s){let n=s*s,a=n*(2*s-3)+1,l=n*(s-2)+s,f=n*(s-1),c=n*(3-2*s);return r[0]=e[0]*a+t[0]*l+o[0]*f+i[0]*c,r[1]=e[1]*a+t[1]*l+o[1]*f+i[1]*c,r[2]=e[2]*a+t[2]*l+o[2]*f+i[2]*c,r}function gr(r,e,t,o,i,s){let n=1-s,a=n*n,l=s*s,f=a*n,c=3*s*a,u=3*l*n,p=l*s;return r[0]=e[0]*f+t[0]*c+o[0]*u+i[0]*p,r[1]=e[1]*f+t[1]*c+o[1]*u+i[1]*p,r[2]=e[2]*f+t[2]*c+o[2]*u+i[2]*p,r}function xr(r,e){e=e===void 0?1:e;let t=_e()*2*Math.PI,o=_e()*2-1,i=Math.sqrt(1-o*o)*e;return r[0]=Math.cos(t)*i,r[1]=Math.sin(t)*i,r[2]=o*e,r}function Pr(r,e,t){let o=e[0],i=e[1],s=e[2],n=t[3]*o+t[7]*i+t[11]*s+t[15];return n=n||1,r[0]=(t[0]*o+t[4]*i+t[8]*s+t[12])/n,r[1]=(t[1]*o+t[5]*i+t[9]*s+t[13])/n,r[2]=(t[2]*o+t[6]*i+t[10]*s+t[14])/n,r}function yr(r,e,t){let o=e[0],i=e[1],s=e[2];return r[0]=o*t[0]+i*t[3]+s*t[6],r[1]=o*t[1]+i*t[4]+s*t[7],r[2]=o*t[2]+i*t[5]+s*t[8],r}function br(r,e,t){let o=t[0],i=t[1],s=t[2],n=t[3],a=e[0],l=e[1],f=e[2],c=i*f-s*l,u=s*a-o*f,p=o*l-i*a,m=i*p-s*u,x=s*c-o*p,Z=o*u-i*c,h=n*2;return c*=h,u*=h,p*=h,m*=2,x*=2,Z*=2,r[0]=a+c+m,r[1]=l+u+x,r[2]=f+p+Z,r}function Er(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[0],s[1]=i[1]*Math.cos(o)-i[2]*Math.sin(o),s[2]=i[1]*Math.sin(o)+i[2]*Math.cos(o),r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function Mr(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[2]*Math.sin(o)+i[0]*Math.cos(o),s[1]=i[1],s[2]=i[2]*Math.cos(o)-i[0]*Math.sin(o),r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function Tr(r,e,t,o){let i=[],s=[];return i[0]=e[0]-t[0],i[1]=e[1]-t[1],i[2]=e[2]-t[2],s[0]=i[0]*Math.cos(o)-i[1]*Math.sin(o),s[1]=i[0]*Math.sin(o)+i[1]*Math.cos(o),s[2]=i[2],r[0]=s[0]+t[0],r[1]=s[1]+t[1],r[2]=s[2]+t[2],r}function Ar(r,e){let t=r[0],o=r[1],i=r[2],s=e[0],n=e[1],a=e[2],l=Math.sqrt((t*t+o*o+i*i)*(s*s+n*n+a*a)),f=l&&me(r,e)/l;return Math.acos(Math.min(Math.max(f,-1),1))}function Fr(r){return r[0]=0,r[1]=0,r[2]=0,r}function Or(r){return`vec3(${r[0]}, ${r[1]}, ${r[2]})`}function Lr(r,e){return r[0]===e[0]&&r[1]===e[1]&&r[2]===e[2]}function Cr(r,e){let t=r[0],o=r[1],i=r[2],s=e[0],n=e[1],a=e[2];return Math.abs(t-s)<=1e-6*Math.max(1,Math.abs(t),Math.abs(s))&&Math.abs(o-n)<=1e-6*Math.max(1,Math.abs(o),Math.abs(n))&&Math.abs(i-a)<=1e-6*Math.max(1,Math.abs(i),Math.abs(a))}var Ir=Ye,Sr=We,kr=Ke,Rr=Ze,Nr=$e,wr=He,Br=Xe,Dr=function(){let r=qe();return function(e,t,o,i,s,n){let a,l;for(t||(t=3),o||(o=0),i?l=Math.min(i*t+o,e.length):l=e.length,a=o;a<l;a+=t)r[0]=e[a],r[1]=e[a+1],r[2]=e[a+2],s(r,r,n),e[a]=r[0],e[a+1]=r[1],e[a+2]=r[2];return e}}();var te=_(d(),1);var Qe=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
857
- uniform vec2 project_uViewProjectionMatrixFP64[16];
1085
+ `;var Qo={ONE:1},at={name:"fp64arithmetic",vs:it,defaultUniforms:Qo,uniformTypes:{ONE:"f32"},fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe},te={name:"fp64",vs:nt,dependencies:[at],fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe};var oe=d(_(),1);var lt=`const vec2 WORLD_SCALE_FP64 = vec2(81.4873275756836, 0.0000032873668232014097);
1086
+ uniform project64Uniforms {
1087
+ vec2 scale;
1088
+ mat4 viewProjectionMatrix;
1089
+ mat4 viewProjectionMatrix64Low;
1090
+ } project64;
858
1091
  void mercatorProject_fp64(vec4 lnglat_fp64, out vec2 out_val[2]) {
859
1092
  #if defined(NVIDIA_FP64_WORKAROUND)
860
1093
  out_val[0] = sum_fp64(radians_fp64(lnglat_fp64.xy), PI_FP64 * ONE);
@@ -880,7 +1113,16 @@ project_position_fp64(position64xy, out_val);
880
1113
  }
881
1114
  vec4 project_common_position_to_clipspace_fp64(vec2 vertex_pos_modelspace[4]) {
882
1115
  vec2 vertex_pos_clipspace[4];
883
- mat4_vec4_mul_fp64(project_uViewProjectionMatrixFP64, vertex_pos_modelspace,
1116
+ vec2 viewProjectionMatrixFP64[16];
1117
+ for (int i = 0; i < 4; i++) {
1118
+ for (int j = 0; j < 4; j++) {
1119
+ viewProjectionMatrixFP64[4 * i + j] = vec2(
1120
+ project64.viewProjectionMatrix[j][i],
1121
+ project64.viewProjectionMatrix64Low[j][i]
1122
+ );
1123
+ }
1124
+ }
1125
+ mat4_vec4_mul_fp64(viewProjectionMatrixFP64, vertex_pos_modelspace,
884
1126
  vertex_pos_clipspace);
885
1127
  return vec4(
886
1128
  vertex_pos_clipspace[0].x,
@@ -913,7 +1155,7 @@ return project_position_to_clipspace(
913
1155
  position, position64xyLow, offset, commonPosition
914
1156
  );
915
1157
  }
916
- `;var{fp64ify:Vr,fp64ifyMatrix4:jr}=J,re={name:"project64",dependencies:[te.project,J],vs:Qe,getUniforms:Gr},zr=(0,te._memoize)(Ur);function Gr(r){if(r&&"viewport"in r){let{viewProjectionMatrix:e,scale:t}=r.viewport;return zr({viewProjectionMatrix:e,scale:t})}return{}}function Ur({viewProjectionMatrix:r,scale:e}){let t=jr(r),o=Vr(e);return{project_uViewProjectionMatrixFP64:t,project64_uViewProjectionMatrix:t,project64_uScale:o}}var oe=class extends S.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!==S.COORDINATE_SYSTEM.LNGLAT&&e!==S.COORDINATE_SYSTEM.DEFAULT)throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[re]}}};oe.extensionName="Fp64Extension";var Je=oe;var k=_(d(),1);var et={inject:{"vs:#decl":`
1158
+ `;var{fp64ify:Jo,fp64ifyMatrix4:er}=te,re={name:"project64",dependencies:[oe.project,te],vs:lt,getUniforms:or,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},tr=(0,oe._memoize)(rr);function or(o){if(o&&"viewport"in o){let{viewProjectionMatrix:e,scale:t}=o.viewport;return tr({viewProjectionMatrix:e,scale:t})}return{}}function rr({viewProjectionMatrix:o,scale:e}){let t=er(o),r=new Float32Array(16),s=new Float32Array(16);for(let i=0;i<4;i++)for(let n=0;n<4;n++){let a=4*i+n,l=4*n+i;r[l]=t[2*a],s[l]=t[2*a+1]}return{scale:Jo(e),viewProjectionMatrix:[...r],viewProjectionMatrix64Low:[...s]}}var se=class extends w.LayerExtension{getShaders(){let{coordinateSystem:e}=this.props;if(e!==w.COORDINATE_SYSTEM.LNGLAT&&e!==w.COORDINATE_SYSTEM.DEFAULT)throw new Error("fp64: coordinateSystem must be LNGLAT");return{modules:[re]}}draw(e,t){let{viewport:r}=e.context;this.setShaderModuleProps({project64:{viewport:r}})}};se.extensionName="Fp64Extension";var ct=se;var N=d(_(),1);var ft={inject:{"vs:#decl":`
917
1159
  in vec2 instanceDashArrays;
918
1160
  in float instanceDashOffsets;
919
1161
  out vec2 vDashArray;
@@ -922,9 +1164,10 @@ out float vDashOffset;
922
1164
  vDashArray = instanceDashArrays;
923
1165
  vDashOffset = instanceDashOffsets / width.x;
924
1166
  `,"fs:#decl":`
925
- uniform float dashAlignMode;
926
- uniform float capType;
927
- uniform bool dashGapPickable;
1167
+ uniform pathStyleUniforms {
1168
+ float dashAlignMode;
1169
+ bool dashGapPickable;
1170
+ } pathStyle;
928
1171
  in vec2 vDashArray;
929
1172
  in float vDashOffset;
930
1173
  `,"fs:#main-start":`
@@ -933,7 +1176,7 @@ float gapLength = vDashArray.y;
933
1176
  float unitLength = solidLength + gapLength;
934
1177
  float offset;
935
1178
  if (unitLength > 0.0) {
936
- if (dashAlignMode == 0.0) {
1179
+ if (pathStyle.dashAlignMode == 0.0) {
937
1180
  offset = vDashOffset;
938
1181
  } else {
939
1182
  unitLength = vPathLength / round(vPathLength / unitLength);
@@ -941,8 +1184,8 @@ offset = solidLength / 2.0;
941
1184
  }
942
1185
  float unitOffset = mod(vPathPosition.y + offset, unitLength);
943
1186
  if (gapLength > 0.0 && unitOffset > solidLength) {
944
- if (capType <= 0.5) {
945
- if (!(dashGapPickable && bool(picking.isActive))) {
1187
+ if (path.capType <= 0.5) {
1188
+ if (!(pathStyle.dashGapPickable && bool(picking.isActive))) {
946
1189
  discard;
947
1190
  }
948
1191
  } else {
@@ -951,14 +1194,14 @@ min(unitOffset - solidLength, unitLength - unitOffset),
951
1194
  vPathPosition.x
952
1195
  ));
953
1196
  if (distToEnd > 1.0) {
954
- if (!(dashGapPickable && bool(picking.isActive))) {
1197
+ if (!(pathStyle.dashGapPickable && bool(picking.isActive))) {
955
1198
  discard;
956
1199
  }
957
1200
  }
958
1201
  }
959
1202
  }
960
1203
  }
961
- `}},tt={inject:{"vs:#decl":`
1204
+ `}},ut={inject:{"vs:#decl":`
962
1205
  in float instanceOffsets;
963
1206
  `,"vs:DECKGL_FILTER_SIZE":`
964
1207
  float offsetWidth = abs(instanceOffsets * 2.0) + 1.0;
@@ -975,218 +1218,260 @@ isInside = step(-1.0, vPathPosition.x) * step(vPathPosition.x, 1.0);
975
1218
  if (isInside == 0.0) {
976
1219
  discard;
977
1220
  }
978
- `}};var qr={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},R=class extends k.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:o=!1}={}){super({dash:e||o,offset:t,highPrecisionDash:o})}isEnabled(e){return"pathTesselator"in e.state}getShaders(e){if(!e.isEnabled(this))return null;let t={};return e.opts.dash&&(t=(0,k._mergeShaders)(t,et)),e.opts.offset&&(t=(0,k._mergeShaders)(t,tt)),t}initializeState(e,t){let o=this.getAttributeManager();!o||!t.isEnabled(this)||(t.opts.dash&&o.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},instanceDashOffsets:t.opts.highPrecisionDash?{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}:{size:1,update:i=>{i.constant=!0,i.value=[0]}}}),t.opts.offset&&o.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(!t.isEnabled(this))return;let o={};t.opts.dash&&(o.dashAlignMode=this.props.dashJustified?1:0,o.dashGapPickable=Boolean(this.props.dashGapPickable)),this.state.model?.setUniforms(o)}getDashOffsets(e){let t=[0],o=this.props.positionFormat==="XY"?2:3,i=Array.isArray(e[0]),s=i?e.length:e.length/o,n,a;for(let l=0;l<s-1;l++)n=i?e[l]:e.slice(l*o,l*o+o),n=this.projectPosition(n),l>0&&(t[l]=t[l-1]+I.dist(a,n)),a=n;return t[s-1]=0,t}};R.defaultProps=qr;R.extensionName="PathStyleExtension";var rt=R;var it=_(d(),1);var N=_(d(),1);var Hr=`
1221
+ `}};var sr={getDashArray:{type:"accessor",value:[0,0]},getOffset:{type:"accessor",value:0},dashJustified:!1,dashGapPickable:!1},B=class extends N.LayerExtension{constructor({dash:e=!1,offset:t=!1,highPrecisionDash:r=!1}={}){super({dash:e||r,offset:t,highPrecisionDash:r})}isEnabled(e){return"pathTesselator"in e.state}getShaders(e){if(!e.isEnabled(this))return null;let t={};e.opts.dash&&(t=(0,N._mergeShaders)(t,ft)),e.opts.offset&&(t=(0,N._mergeShaders)(t,ut));let{inject:r}=t;return{modules:[{name:"pathStyle",inject:r,uniformTypes:{dashAlignMode:"f32",dashGapPickable:"i32"}}]}}initializeState(e,t){let r=this.getAttributeManager();!r||!t.isEnabled(this)||(t.opts.dash&&r.addInstanced({instanceDashArrays:{size:2,accessor:"getDashArray"},instanceDashOffsets:t.opts.highPrecisionDash?{size:1,accessor:"getPath",transform:t.getDashOffsets.bind(this)}:{size:1,update:s=>{s.constant=!0,s.value=[0]}}}),t.opts.offset&&r.addInstanced({instanceOffsets:{size:1,accessor:"getOffset"}}))}updateState(e,t){if(t.isEnabled(this)&&t.opts.dash){let r={dashAlignMode:this.props.dashJustified?1:0,dashGapPickable:Boolean(this.props.dashGapPickable)};this.setShaderModuleProps({pathStyle:r})}}getDashOffsets(e){let t=[0],r=this.props.positionFormat==="XY"?2:3,s=Array.isArray(e[0]),i=s?e.length:e.length/r,n,a;for(let l=0;l<i-1;l++)n=s?e[l]:e.slice(l*r,l*r+r),n=this.projectPosition(n),l>0&&(t[l]=t[l-1]+R.dist(a,n)),a=n;return t[i-1]=0,t}};B.defaultProps=sr;B.extensionName="PathStyleExtension";var pt=B;var mt=d(_(),1);var F=d(_(),1),dt=`uniform fillUniforms {
1222
+ vec2 patternTextureSize;
1223
+ bool patternEnabled;
1224
+ bool patternMask;
1225
+ vec2 uvCoordinateOrigin;
1226
+ vec2 uvCoordinateOrigin64Low;
1227
+ } fill;
1228
+ `,ir=`
979
1229
  in vec4 fillPatternFrames;
980
1230
  in float fillPatternScales;
981
1231
  in vec2 fillPatternOffsets;
982
- uniform bool fill_patternEnabled;
983
- uniform vec2 fill_patternTextureSize;
1232
+
984
1233
  out vec2 fill_uv;
985
1234
  out vec4 fill_patternBounds;
986
1235
  out vec4 fill_patternPlacement;
987
- `,Yr=`
988
- uniform bool fill_patternEnabled;
989
- uniform bool fill_patternMask;
1236
+ `,nr=`
1237
+ ${dt}
1238
+ ${ir}
1239
+ `,ar=`
990
1240
  uniform sampler2D fill_patternTexture;
991
- uniform vec2 fill_uvCoordinateOrigin;
992
- uniform vec2 fill_uvCoordinateOrigin64Low;
1241
+
993
1242
  in vec4 fill_patternBounds;
994
1243
  in vec4 fill_patternPlacement;
995
1244
  in vec2 fill_uv;
1245
+
996
1246
  const float FILL_UV_SCALE = 512.0 / 40000000.0;
997
- `,Wr={"vs:DECKGL_FILTER_GL_POSITION":`
998
- fill_uv = geometry.position.xy;
999
- `,"vs:DECKGL_FILTER_COLOR":`
1000
- if (fill_patternEnabled) {
1001
- fill_patternBounds = fillPatternFrames / vec4(fill_patternTextureSize, fill_patternTextureSize);
1002
- fill_patternPlacement.xy = fillPatternOffsets;
1003
- fill_patternPlacement.zw = fillPatternScales * fillPatternFrames.zw;
1004
- }
1005
- `,"fs:DECKGL_FILTER_COLOR":`
1006
- if (fill_patternEnabled) {
1007
- vec2 scale = FILL_UV_SCALE * fill_patternPlacement.zw;
1008
- vec2 patternUV = mod(mod(fill_uvCoordinateOrigin, scale) + fill_uvCoordinateOrigin64Low + fill_uv, scale) / scale;
1009
- patternUV = mod(fill_patternPlacement.xy + patternUV, 1.0);
1010
- vec2 texCoords = fill_patternBounds.xy + fill_patternBounds.zw * patternUV;
1011
- vec4 patternColor = texture(fill_patternTexture, texCoords);
1012
- color.a *= patternColor.a;
1013
- if (!fill_patternMask) {
1014
- color.rgb = patternColor.rgb;
1015
- }
1016
- }
1017
- `};function Kr(r,e){if(!r)return{};if("fillPatternTexture"in r){let{fillPatternTexture:t}=r;return{fill_patternTexture:t,fill_patternTextureSize:[t.width,t.height]}}if("viewport"in r){let{fillPatternMask:t=!0,fillPatternEnabled:o=!0}=r,{project_uCommonOrigin:i}=e,s=[(0,N.fp64LowPart)(i[0]),(0,N.fp64LowPart)(i[1])];return{fill_uvCoordinateOrigin:i.slice(0,2),fill_uvCoordinateOrigin64Low:s,fill_patternMask:t,fill_patternEnabled:o}}return{}}var ot={name:"fill-pattern",vs:Hr,fs:Yr,inject:Wr,dependencies:[N.project],getUniforms:Kr};var Zr={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:r=>r.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},w=class extends it.LayerExtension{constructor({pattern:e=!1}={}){super({pattern:e})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&ot].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let o=this.getAttributeManager();t.opts.pattern&&o.add({fillPatternFrames:{size:4,stepMode:"dynamic",accessor:"getFillPattern",transform:t.getPatternFrame.bind(this)},fillPatternScales:{size:1,stepMode:"dynamic",accessor:"getFillPatternScale",defaultValue:1},fillPatternOffsets:{size:2,stepMode:"dynamic",accessor:"getFillPatternOffset"}}),this.setState({emptyTexture:this.context.device.createTexture({data:new Uint8Array(4),width:1,height:1})})}updateState({props:e,oldProps:t},o){o.isEnabled(this)&&e.fillPatternMapping&&e.fillPatternMapping!==t.fillPatternMapping&&this.getAttributeManager().invalidate("getFillPattern")}draw(e,t){if(!t.isEnabled(this))return;let{fillPatternAtlas:o}=this.props;this.setModuleParameters({fillPatternTexture:o||this.state.emptyTexture})}finalizeState(){this.state.emptyTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:t}=this.getCurrentLayer().props,o=t&&t[e];return o?[o.x,o.y,o.width,o.height]:[0,0,0,0]}};w.defaultProps=Zr;w.extensionName="FillStyleExtension";var st=w;var nt=_(d(),1);var $r={clipBounds:[0,0,1,1],clipByInstance:void 0},at=`
1018
- uniform vec4 clip_bounds;
1247
+ `,lr=`
1248
+ ${dt}
1249
+ ${ar}
1250
+ `,cr={"vs:DECKGL_FILTER_GL_POSITION":`
1251
+ fill_uv = geometry.position.xy;
1252
+ `,"vs:DECKGL_FILTER_COLOR":`
1253
+ if (fill.patternEnabled) {
1254
+ fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize);
1255
+ fill_patternPlacement.xy = fillPatternOffsets;
1256
+ fill_patternPlacement.zw = fillPatternScales * fillPatternFrames.zw;
1257
+ }
1258
+ `,"fs:DECKGL_FILTER_COLOR":`
1259
+ if (fill.patternEnabled) {
1260
+ vec2 scale = FILL_UV_SCALE * fill_patternPlacement.zw;
1261
+ vec2 patternUV = mod(mod(fill.uvCoordinateOrigin, scale) + fill.uvCoordinateOrigin64Low + fill_uv, scale) / scale;
1262
+ patternUV = mod(fill_patternPlacement.xy + patternUV, 1.0);
1263
+
1264
+ vec2 texCoords = fill_patternBounds.xy + fill_patternBounds.zw * patternUV;
1265
+
1266
+ vec4 patternColor = texture(fill_patternTexture, texCoords);
1267
+ color.a *= patternColor.a;
1268
+ if (!fill.patternMask) {
1269
+ color.rgb = patternColor.rgb;
1270
+ }
1271
+ }
1272
+ `};function fr(o){if(!o)return{};let e={};if("fillPatternTexture"in o){let{fillPatternTexture:t}=o;e.fill_patternTexture=t,e.patternTextureSize=[t.width,t.height]}if("project"in o){let{fillPatternMask:t=!0,fillPatternEnabled:r=!0}=o,s=F.project.getUniforms(o.project),{commonOrigin:i}=s,n=[(0,F.fp64LowPart)(i[0]),(0,F.fp64LowPart)(i[1])];e.uvCoordinateOrigin=i.slice(0,2),e.uvCoordinateOrigin64Low=n,e.patternMask=t,e.patternEnabled=r}return e}var _t={name:"fill",vs:nr,fs:lr,inject:cr,dependencies:[F.project],getUniforms:fr,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var ur={fillPatternEnabled:!0,fillPatternAtlas:{type:"image",value:null,async:!0,parameters:{lodMaxClamp:0}},fillPatternMapping:{type:"object",value:{},async:!0},fillPatternMask:!0,getFillPattern:{type:"accessor",value:o=>o.pattern},getFillPatternScale:{type:"accessor",value:1},getFillPatternOffset:{type:"accessor",value:[0,0]}},D=class extends mt.LayerExtension{constructor({pattern:e=!1}={}){super({pattern:e})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&_t].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let r=this.getAttributeManager();t.opts.pattern&&r.add({fillPatternFrames:{size:4,stepMode:"dynamic",accessor:"getFillPattern",transform:t.getPatternFrame.bind(this)},fillPatternScales:{size:1,stepMode:"dynamic",accessor:"getFillPatternScale",defaultValue:1},fillPatternOffsets:{size:2,stepMode:"dynamic",accessor:"getFillPatternOffset"}}),this.setState({emptyTexture:this.context.device.createTexture({data:new Uint8Array(4),width:1,height:1})})}updateState({props:e,oldProps:t},r){r.isEnabled(this)&&e.fillPatternMapping&&e.fillPatternMapping!==t.fillPatternMapping&&this.getAttributeManager().invalidate("getFillPattern")}draw(e,t){if(!t.isEnabled(this))return;let{fillPatternAtlas:r,fillPatternEnabled:s,fillPatternMask:i}=this.props,n={project:e.shaderModuleProps.project,fillPatternEnabled:s,fillPatternMask:i,fillPatternTexture:r||this.state.emptyTexture};this.setShaderModuleProps({fill:n})}finalizeState(){this.state.emptyTexture?.delete()}getPatternFrame(e){let{fillPatternMapping:t}=this.getCurrentLayer().props,r=t&&t[e];return r?[r.x,r.y,r.width,r.height]:[0,0,0,0]}};D.defaultProps=ur;D.extensionName="FillStyleExtension";var ht=D;var vt=d(_(),1),pr={clipBounds:[0,0,1,1],clipByInstance:void 0},gt=`
1273
+ uniform clipUniforms {
1274
+ vec4 bounds;
1275
+ } clip;
1276
+
1019
1277
  bool clip_isInBounds(vec2 position) {
1020
- return position.x >= clip_bounds[0] && position.y >= clip_bounds[1] && position.x < clip_bounds[2] && position.y < clip_bounds[3];
1278
+ return position.x >= clip.bounds[0] && position.y >= clip.bounds[1] && position.x < clip.bounds[2] && position.y < clip.bounds[3];
1021
1279
  }
1022
- `,Xr={name:"clip-vs",vs:at},Qr={"vs:#decl":`
1280
+ `,dr={name:"clip",vs:gt,uniformTypes:{bounds:"vec4<f32>"}},_r={"vs:#decl":`
1023
1281
  out float clip_isVisible;
1024
1282
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1025
- clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
1283
+ clip_isVisible = float(clip_isInBounds(geometry.worldPosition.xy));
1026
1284
  `,"fs:#decl":`
1027
1285
  in float clip_isVisible;
1028
1286
  `,"fs:DECKGL_FILTER_COLOR":`
1029
- if (clip_isVisible < 0.5) discard;
1030
- `},Jr={name:"clip-fs",fs:at},eo={"vs:#decl":`
1287
+ if (clip_isVisible < 0.5) discard;
1288
+ `},mr={name:"clip",fs:gt,uniformTypes:{bounds:"vec4<f32>"}},hr={"vs:#decl":`
1031
1289
  out vec2 clip_commonPosition;
1032
1290
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1033
- clip_commonPosition = geometry.position.xy;
1291
+ clip_commonPosition = geometry.position.xy;
1034
1292
  `,"fs:#decl":`
1035
1293
  in vec2 clip_commonPosition;
1036
1294
  `,"fs:DECKGL_FILTER_COLOR":`
1037
- if (!clip_isInBounds(clip_commonPosition)) discard;
1038
- `},B=class extends nt.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=Boolean(this.props.clipByInstance)),this.state.clipByInstance=e,e?{modules:[Xr],inject:Qr}:{modules:[Jr],inject:eo}}draw({uniforms:e}){let{clipBounds:t}=this.props;if(this.state.clipByInstance)e.clip_bounds=t;else{let o=this.projectPosition([t[0],t[1],0]),i=this.projectPosition([t[2],t[3],0]);e.clip_bounds=[Math.min(o[0],i[0]),Math.min(o[1],i[1]),Math.max(o[0],i[0]),Math.max(o[1],i[1])]}}};B.defaultProps=$r;B.extensionName="ClipExtension";var lt=B;var _t=_(d(),1);var ft=_(d(),1);var to=`
1295
+ if (!clip_isInBounds(clip_commonPosition)) discard;
1296
+ `},j=class extends vt.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=Boolean(this.props.clipByInstance)),this.state.clipByInstance=e,e?{modules:[dr],inject:_r}:{modules:[mr],inject:hr}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),s=this.projectPosition([e[2],e[3],0]);t.bounds=[Math.min(r[0],s[0]),Math.min(r[1],s[1]),Math.max(r[0],s[0]),Math.max(r[1],s[1])]}this.setShaderModuleProps({clip:t})}};j.defaultProps=pr;j.extensionName="ClipExtension";var xt=j;var Mt=d(_(),1);var yt=d(_(),1),vr=`
1039
1297
  in float collisionPriorities;
1298
+
1040
1299
  uniform sampler2D collision_texture;
1041
- uniform bool collision_sort;
1042
- uniform bool collision_enabled;
1300
+
1301
+ uniform collisionUniforms {
1302
+ bool sort;
1303
+ bool enabled;
1304
+ } collision;
1305
+
1043
1306
  vec2 collision_getCoords(vec4 position) {
1044
- vec4 collision_clipspace = project_common_position_to_clipspace(position);
1045
- return (1.0 + collision_clipspace.xy / collision_clipspace.w) / 2.0;
1307
+ vec4 collision_clipspace = project_common_position_to_clipspace(position);
1308
+ return (1.0 + collision_clipspace.xy / collision_clipspace.w) / 2.0;
1046
1309
  }
1310
+
1047
1311
  float collision_match(vec2 tex, vec3 pickingColor) {
1048
- vec4 collision_pickingColor = texture(collision_texture, tex);
1049
- float delta = dot(abs(collision_pickingColor.rgb - pickingColor), vec3(1.0));
1050
- float e = 0.001;
1051
- return step(delta, e);
1312
+ vec4 collision_pickingColor = texture(collision_texture, tex);
1313
+ float delta = dot(abs(collision_pickingColor.rgb - pickingColor), vec3(1.0));
1314
+ float e = 0.001;
1315
+ return step(delta, e);
1052
1316
  }
1317
+
1053
1318
  float collision_isVisible(vec2 texCoords, vec3 pickingColor) {
1054
- if (!collision_enabled) {
1055
- return 1.0;
1056
- }
1057
- const int N = 2;
1058
- float accumulator = 0.0;
1059
- vec2 step = vec2(1.0 / project_uViewportSize);
1060
- const float floatN = float(N);
1061
- vec2 delta = -floatN * step;
1062
- for(int i = -N; i <= N; i++) {
1063
- delta.x = -step.x * floatN;
1064
- for(int j = -N; j <= N; j++) {
1065
- accumulator += collision_match(texCoords + delta, pickingColor);
1066
- delta.x += step.x;
1067
- }
1068
- delta.y += step.y;
1069
- }
1070
- float W = 2.0 * floatN + 1.0;
1071
- return pow(accumulator / (W * W), 2.2);
1072
- }
1073
- `,ro={"vs:#decl":`
1074
- float collision_fade = 1.0;
1319
+ if (!collision.enabled) {
1320
+ return 1.0;
1321
+ }
1322
+
1323
+ // Visibility test, sample area of 5x5 pixels in order to fade in/out.
1324
+ // Due to the locality, the lookups will be cached
1325
+ // This reduces the flicker present when objects are shown/hidden
1326
+ const int N = 2;
1327
+ float accumulator = 0.0;
1328
+ vec2 step = vec2(1.0 / project.viewportSize);
1329
+
1330
+ const float floatN = float(N);
1331
+ vec2 delta = -floatN * step;
1332
+ for(int i = -N; i <= N; i++) {
1333
+ delta.x = -step.x * floatN;
1334
+ for(int j = -N; j <= N; j++) {
1335
+ accumulator += collision_match(texCoords + delta, pickingColor);
1336
+ delta.x += step.x;
1337
+ }
1338
+ delta.y += step.y;
1339
+ }
1340
+
1341
+ float W = 2.0 * floatN + 1.0;
1342
+ return pow(accumulator / (W * W), 2.2);
1343
+ }
1344
+ `,gr={"vs:#decl":`
1345
+ float collision_fade = 1.0;
1075
1346
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1076
- if (collision_sort) {
1077
- float collisionPriority = collisionPriorities;
1078
- position.z = -0.001 * collisionPriority * position.w;
1079
- }
1080
- if (collision_enabled) {
1081
- vec4 collision_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1082
- vec2 collision_texCoords = collision_getCoords(collision_common_position);
1083
- collision_fade = collision_isVisible(collision_texCoords, geometry.pickingColor / 255.0);
1084
- if (collision_fade < 0.0001) {
1085
- position = vec4(0.0, 0.0, 2.0, 1.0);
1086
- }
1087
- }
1088
- `,"vs:DECKGL_FILTER_COLOR":`
1089
- color.a *= collision_fade;
1090
- `},oo=(r,e)=>{if(!r||!("dummyCollisionMap"in r))return{};let{collisionFBO:t,drawToCollisionMap:o,dummyCollisionMap:i}=r;return{collision_sort:Boolean(o),collision_texture:!o&&t?t.colorAttachments[0]:i}},ct={name:"collision",dependencies:[ft.project],vs:to,inject:ro,getUniforms:oo};var pt=_(d(),1);var ut=_(d(),1),D=class extends ut._LayersPass{renderCollisionMap(e,t){let i=[0,0,0,0],s=[1,1,e.width-2*1,e.height-2*1];this.render({...t,clearColor:i,scissorRect:s,target:e,pass:"collision"})}getLayerParameters(e,t,o){return{...e.props.parameters,blend:!1,depthRange:[0,1],depthTest:!0}}getModuleParameters(){return{drawToCollisionMap:!0,picking:{isActive:1,isAttribute:!1},lightSources:{}}}};var he=2,V=class{constructor(){this.id="collision-filter-effect",this.props=null,this.useInPicking=!0,this.order=1,this.channels={},this.collisionFBOs={}}setup(e){this.context=e;let{device:t}=e;this.dummyCollisionMap=t.createTexture({width:1,height:1}),this.collisionFilterPass=new D(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:o,viewports:i,onViewportActive:s,views:n,isPicking:a,preRenderStats:l={}}){let{device:f}=this.context;if(a)return;let c=t.filter(({props:{visible:h,collisionEnabled:fe}})=>h&&fe);if(c.length===0){this.channels={};return}let u=e?.filter(h=>h.useInPicking&&l[h.id]),p=l["mask-effect"]?.didRender,m=this._groupByCollisionGroup(f,c),x=i[0],Z=!this.lastViewport||!this.lastViewport.equals(x)||p;for(let h in m){let fe=this.collisionFBOs[h],Ot=m[h],[Lt,Ct]=f.canvasContext.getPixelSize();fe.resize({width:Lt/he,height:Ct/he}),this._render(Ot,{effects:u,layerFilter:o,onViewportActive:s,views:n,viewport:x,viewportChanged:Z})}}_render(e,{effects:t,layerFilter:o,onViewportActive:i,views:s,viewport:n,viewportChanged:a}){let{collisionGroup:l}=e,f=this.channels[l];if(!f)return;let c=a||e===f||!(0,pt._deepEqual)(f.layers,e.layers,1)||e.layerBounds.some((u,p)=>!E(u,f.layerBounds[p]))||e.allLayersLoaded!==f.allLayersLoaded||e.layers.some(u=>u.props.transitions);if(this.channels[l]=e,c){this.lastViewport=n;let u=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(u,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:o,viewports:n?[n]:[],onViewportActive:i,views:s,moduleParameters:{dummyCollisionMap:this.dummyCollisionMap,devicePixelRatio:u.device.canvasContext.getDevicePixelRatio()/he}})}}_groupByCollisionGroup(e,t){let o={};for(let i of t){let{collisionGroup:s}=i.props,n=o[s];n||(n={collisionGroup:s,layers:[],layerBounds:[],allLayersLoaded:!0},o[s]=n),n.layers.push(i),n.layerBounds.push(i.getBounds()),i.isLoaded||(n.allLayersLoaded=!1)}for(let i of Object.keys(o))this.collisionFBOs[i]||this.createFBO(e,i),this.channels[i]||(this.channels[i]=o[i]);for(let i of Object.keys(this.collisionFBOs))o[i]||this.destroyFBO(i);return o}getModuleParameters(e){let{collisionGroup:t}=e.props,{collisionFBOs:o,dummyCollisionMap:i}=this;return{collisionFBO:o[t],dummyCollisionMap:i}}cleanup(){this.dummyCollisionMap&&(this.dummyCollisionMap.delete(),this.dummyCollisionMap=void 0),this.channels={};for(let e of Object.keys(this.collisionFBOs))this.destroyFBO(e);this.collisionFBOs={},this.lastViewport=void 0}createFBO(e,t){let{width:o,height:i}=e.gl.canvas,s=e.createTexture({format:"rgba8unorm",width:o,height:i,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),n=e.createTexture({format:"depth16unorm",width:o,height:i,mipmaps:!1,dataFormat:6402,type:5125});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:o,height:i,colorAttachments:[s],depthStencilAttachment:n})}destroyFBO(e){let t=this.collisionFBOs[e];t.colorAttachments[0]?.destroy(),t.depthStencilAttachment?.destroy(),t.destroy(),delete this.collisionFBOs[e]}};var io={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},j=class extends _t.LayerExtension{getShaders(){return{modules:[ct]}}draw({uniforms:e,context:t,moduleParameters:o}){let{collisionEnabled:i}=this.props,{collisionFBO:s,drawToCollisionMap:n}=o,a=i&&Boolean(s);e.collision_enabled=a,n&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,t){if(this.getAttributeManager()===null)return;this.context.deck?._addDefaultEffect(new V),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};j.defaultProps=io;j.extensionName="CollisionFilterExtension";var dt=j;var y=_(d(),1);var mt=_(d(),1);var so=`
1091
- uniform vec4 mask_bounds;
1092
- uniform bool mask_maskByInstance;
1347
+ if (collision.sort) {
1348
+ float collisionPriority = collisionPriorities;
1349
+ position.z = -0.001 * collisionPriority * position.w; // Support range -1000 -> 1000
1350
+ }
1351
+
1352
+ if (collision.enabled) {
1353
+ vec4 collision_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1354
+ vec2 collision_texCoords = collision_getCoords(collision_common_position);
1355
+ collision_fade = collision_isVisible(collision_texCoords, geometry.pickingColor / 255.0);
1356
+ if (collision_fade < 0.0001) {
1357
+ // Position outside clip space bounds to discard
1358
+ position = vec4(0.0, 0.0, 2.0, 1.0);
1359
+ }
1360
+ }
1361
+ `,"vs:DECKGL_FILTER_COLOR":`
1362
+ color.a *= collision_fade;
1363
+ `},xr=o=>{if(!o||!("dummyCollisionMap"in o))return{};let{enabled:e,collisionFBO:t,drawToCollisionMap:r,dummyCollisionMap:s}=o;return{enabled:e&&!r,sort:Boolean(r),collision_texture:!r&&t?t.colorAttachments[0]:s}},Pt={name:"collision",dependencies:[yt.project],vs:vr,inject:gr,getUniforms:xr,uniformTypes:{sort:"i32",enabled:"i32"}};var Et=d(_(),1);var bt=d(_(),1),V=class extends bt._LayersPass{renderCollisionMap(e,t){let s=[0,0,0,0],i=[1,1,e.width-2*1,e.height-2*1];this.render({...t,clearColor:s,scissorRect:i,target:e,pass:"collision"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!1,depthWriteEnabled:!0,depthCompare:"less-equal"}}getShaderModuleProps(){return{collision:{drawToCollisionMap:!0},picking:{isActive:1,isAttribute:!1},lighting:{enabled:!1}}}};var ye=2,z=class{constructor(){this.id="collision-filter-effect",this.props=null,this.useInPicking=!0,this.order=1,this.channels={},this.collisionFBOs={}}setup(e){this.context=e;let{device:t}=e;this.dummyCollisionMap=t.createTexture({width:1,height:1}),this.collisionFilterPass=new V(t,{id:"default-collision-filter"})}preRender({effects:e,layers:t,layerFilter:r,viewports:s,onViewportActive:i,views:n,isPicking:a,preRenderStats:l={}}){let{device:c}=this.context;if(a)return;let f=t.filter(({props:{visible:h,collisionEnabled:L}})=>h&&L);if(f.length===0){this.channels={};return}let u=e?.filter(h=>h.useInPicking&&l[h.id]),p=l["mask-effect"]?.didRender,m=this._groupByCollisionGroup(c,f),v=s[0],b=!this.lastViewport||!this.lastViewport.equals(v)||p;for(let h in m){let L=this.collisionFBOs[h],fe=m[h],[ue,pe]=c.canvasContext.getPixelSize();L.resize({width:ue/ye,height:pe/ye}),this._render(fe,{effects:u,layerFilter:r,onViewportActive:i,views:n,viewport:v,viewportChanged:b})}}_render(e,{effects:t,layerFilter:r,onViewportActive:s,views:i,viewport:n,viewportChanged:a}){let{collisionGroup:l}=e,c=this.channels[l];if(!c)return;let f=a||e===c||!(0,Et._deepEqual)(c.layers,e.layers,1)||e.layerBounds.some((u,p)=>!M(u,c.layerBounds[p]))||e.allLayersLoaded!==c.allLayersLoaded||e.layers.some(u=>u.props.transitions);if(this.channels[l]=e,f){this.lastViewport=n;let u=this.collisionFBOs[l];this.collisionFilterPass.renderCollisionMap(u,{pass:"collision-filter",isPicking:!0,layers:e.layers,effects:t,layerFilter:r,viewports:n?[n]:[],onViewportActive:s,views:i,shaderModuleProps:{collision:{enabled:!0,dummyCollisionMap:this.dummyCollisionMap},project:{devicePixelRatio:u.device.canvasContext.getDevicePixelRatio()/ye}}})}}_groupByCollisionGroup(e,t){let r={};for(let s of t){let i=s.props.collisionGroup,n=r[i];n||(n={collisionGroup:i,layers:[],layerBounds:[],allLayersLoaded:!0},r[i]=n),n.layers.push(s),n.layerBounds.push(s.getBounds()),s.isLoaded||(n.allLayersLoaded=!1)}for(let s of Object.keys(r))this.collisionFBOs[s]||this.createFBO(e,s),this.channels[s]||(this.channels[s]=r[s]);for(let s of Object.keys(this.collisionFBOs))r[s]||this.destroyFBO(s);return r}getShaderModuleProps(e){let{collisionGroup:t,collisionEnabled:r}=e.props,{collisionFBOs:s,dummyCollisionMap:i}=this,n=s[t];return{collision:{enabled:r&&Boolean(n),collisionFBO:n,dummyCollisionMap:i}}}cleanup(){this.dummyCollisionMap&&(this.dummyCollisionMap.delete(),this.dummyCollisionMap=void 0),this.channels={};for(let e of Object.keys(this.collisionFBOs))this.destroyFBO(e);this.collisionFBOs={},this.lastViewport=void 0}createFBO(e,t){let{width:r,height:s}=e.gl.canvas,i=e.createTexture({format:"rgba8unorm",width:r,height:s,sampler:{minFilter:"nearest",magFilter:"nearest",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),n=e.createTexture({format:"depth16unorm",width:r,height:s,mipmaps:!1});this.collisionFBOs[t]=e.createFramebuffer({id:`collision-${t}`,width:r,height:s,colorAttachments:[i],depthStencilAttachment:n})}destroyFBO(e){let t=this.collisionFBOs[e];t.colorAttachments[0]?.destroy(),t.depthStencilAttachment?.destroy(),t.destroy(),delete this.collisionFBOs[e]}};var yr={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},U=class extends Mt.LayerExtension{getShaders(){return{modules:[Pt]}}draw({shaderModuleProps:e}){e.collision?.drawToCollisionMap&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,t){if(this.getAttributeManager()===null)return;this.context.deck?._addDefaultEffect(new z),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};U.defaultProps=yr;U.extensionName="CollisionFilterExtension";var Ft=U;var P=d(_(),1);var Tt=d(_(),1),At=`uniform maskUniforms {
1364
+ vec4 bounds;
1365
+ highp int channel;
1366
+ bool enabled;
1367
+ bool inverted;
1368
+ bool maskByInstance;
1369
+ } mask;
1370
+ `,Pr=`
1093
1371
  vec2 mask_getCoords(vec4 position) {
1094
- return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1372
+ return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy);
1095
1373
  }
1096
- `,no=`
1374
+ `,br=`
1375
+ ${At}
1376
+ ${Pr}
1377
+ `,Er=`
1097
1378
  uniform sampler2D mask_texture;
1098
- uniform int mask_channel;
1099
- uniform bool mask_enabled;
1100
- uniform bool mask_inverted;
1379
+
1101
1380
  bool mask_isInBounds(vec2 texCoords) {
1102
- if (!mask_enabled) {
1103
- return true;
1104
- }
1105
- vec4 maskColor = texture(mask_texture, texCoords);
1106
- float maskValue = 1.0;
1107
- if (mask_channel == 0) {
1108
- maskValue = maskColor.r;
1109
- } else if (mask_channel == 1) {
1110
- maskValue = maskColor.g;
1111
- } else if (mask_channel == 2) {
1112
- maskValue = maskColor.b;
1113
- } else if (mask_channel == 3) {
1114
- maskValue = maskColor.a;
1115
- }
1116
- if (mask_inverted) {
1117
- return maskValue >= 0.5;
1118
- } else {
1119
- return maskValue < 0.5;
1120
- }
1381
+ if (!mask.enabled) {
1382
+ return true;
1383
+ }
1384
+ vec4 maskColor = texture(mask_texture, texCoords);
1385
+ float maskValue = 1.0;
1386
+ if (mask.channel == 0) {
1387
+ maskValue = maskColor.r;
1388
+ } else if (mask.channel == 1) {
1389
+ maskValue = maskColor.g;
1390
+ } else if (mask.channel == 2) {
1391
+ maskValue = maskColor.b;
1392
+ } else if (mask.channel == 3) {
1393
+ maskValue = maskColor.a;
1394
+ }
1395
+
1396
+ if (mask.inverted) {
1397
+ return maskValue >= 0.5;
1398
+ } else {
1399
+ return maskValue < 0.5;
1400
+ }
1121
1401
  }
1122
- `,ao={"vs:#decl":`
1402
+ `,Mr=`
1403
+ ${At}
1404
+ ${Er}
1405
+ `,Fr={"vs:#decl":`
1123
1406
  out vec2 mask_texCoords;
1124
1407
  `,"vs:#main-end":`
1125
- vec4 mask_common_position;
1126
- if (mask_maskByInstance) {
1127
- mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1128
- } else {
1129
- mask_common_position = geometry.position;
1130
- }
1131
- mask_texCoords = mask_getCoords(mask_common_position);
1408
+ vec4 mask_common_position;
1409
+ if (mask.maskByInstance) {
1410
+ mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1411
+ } else {
1412
+ mask_common_position = geometry.position;
1413
+ }
1414
+ mask_texCoords = mask_getCoords(mask_common_position);
1132
1415
  `,"fs:#decl":`
1133
1416
  in vec2 mask_texCoords;
1134
1417
  `,"fs:#main-start":`
1135
- if (mask_enabled) {
1136
- bool mask = mask_isInBounds(mask_texCoords);
1137
- fragColor = texture(mask_texture, mask_texCoords);
1138
- if (!mask) discard;
1139
- }
1140
- `},lo=r=>r&&"maskMap"in r?{mask_texture:r.maskMap}:{},ht={name:"mask",dependencies:[mt.project],vs:so,fs:no,inject:ao,getUniforms:lo};var ve=_(d(),1);var vt=_(d(),1),fo={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},z=class extends vt._LayersPass{constructor(e,t){super(e,t);let{mapSize:o=2048}=t;this.maskMap=e.createTexture({format:"rgba8unorm",width:o,height:o,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:o,height:o,colorAttachments:[this.maskMap]})}render(e){let t=2**e.channel,o=[255,255,255,255];super.render({...e,clearColor:o,colorMask:t,target:this.fbo,pass:"mask"})}getLayerParameters(e,t,o){return{...e.props.parameters,blend:!0,depthTest:!1,...fo}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var ie=_(d(),1);function M(r,e){let t=[1/0,1/0,-1/0,-1/0];for(let o of r){let i=o.getBounds();if(i){let s=o.projectPosition(i[0],{viewport:e,autoOffset:!1}),n=o.projectPosition(i[1],{viewport:e,autoOffset:!1});t[0]=Math.min(t[0],s[0]),t[1]=Math.min(t[1],s[1]),t[2]=Math.max(t[2],n[0]),t[3]=Math.max(t[3],n[1])}}return Number.isFinite(t[0])?t:null}var co=2048;function T(r){let{bounds:e,viewport:t,border:o=0}=r,{isGeospatial:i}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let s=t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:n,height:a,zoom:l}=r;if(l===void 0){n=n-o*2,a=a-o*2;let f=Math.min(n/(e[2]-e[0]),a/(e[3]-e[1]));l=Math.min(Math.log2(f),20)}else if(!n||!a){let f=2**l;n=Math.round(Math.abs(e[2]-e[0])*f),a=Math.round(Math.abs(e[3]-e[1])*f);let c=co-o*2;if(n>c||a>c){let u=c/Math.max(n,a);n=Math.round(n*u),a=Math.round(a*u),l+=Math.log2(u)}}return i?new ie.WebMercatorViewport({id:t.id,x:o,y:o,width:n,height:a,longitude:s[0],latitude:s[1],zoom:l,orthographic:!0}):new ie.OrthographicViewport({id:t.id,x:o,y:o,width:n,height:a,target:s,zoom:l,flipY:!1})}function uo(r,e){let t;if(e&&e.length===2){let[s,n]=e,a=r.getBounds({z:s}),l=r.getBounds({z:n});t=[Math.min(a[0],l[0]),Math.min(a[1],l[1]),Math.max(a[2],l[2]),Math.max(a[3],l[3])]}else t=r.getBounds();let o=r.projectPosition(t.slice(0,2)),i=r.projectPosition(t.slice(2,4));return[o[0],o[1],i[0],i[1]]}function A(r,e,t){if(!r)return[0,0,1,1];let o=uo(e,t),i=po(o);return r[2]-r[0]<=i[2]-i[0]&&r[3]-r[1]<=i[3]-i[1]?r:[Math.max(r[0],i[0]),Math.max(r[1],i[1]),Math.min(r[2],i[2]),Math.min(r[3],i[3])]}function po(r){let e=r[2]-r[0],t=r[3]-r[1],o=(r[0]+r[2])/2,i=(r[1]+r[3])/2;return[o-e,i-t,o+e,i+t]}var G=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 z(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:o,onViewportActive:i,views:s,isPicking:n}){let a=!1;if(n)return{didRender:a};let l=e.filter(p=>p.props.visible&&p.props.operation.includes("mask"));if(l.length===0)return this.masks=null,this.channels.length=0,{didRender:a};this.masks={};let f=this._sortMaskChannels(l),c=o[0],u=!this.lastViewport||!this.lastViewport.equals(c);if(c.resolution!==void 0)return ve.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:a};for(let p in f){let m=this._renderChannel(f[p],{layerFilter:t,onViewportActive:i,views:s,viewport:c,viewportChanged:u});a||(a=m)}return{didRender:a}}_renderChannel(e,{layerFilter:t,onViewportActive:o,views:i,viewport:s,viewportChanged:n}){let a=!1,l=this.channels[e.index];if(!l)return a;let f=e===l||e.layers.length!==l.layers.length||e.layers.some((c,u)=>c!==l.layers[u]||c.props.transitions)||e.layerBounds.some((c,u)=>c!==l.layerBounds[u]);if(e.bounds=l.bounds,e.maskBounds=l.maskBounds,this.channels[e.index]=e,f||n){this.lastViewport=s;let c=M(e.layers,s);if(e.bounds=c&&A(c,s),f||!E(e.bounds,l.bounds)){let{maskPass:u,maskMap:p}=this,m=c&&T({bounds:e.bounds,viewport:s,width:p.width,height:p.height,border:1});e.maskBounds=m?m.getBounds():[0,0,1,1],u.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:m?[m]:[],onViewportActive:o,views:i,moduleParameters:{devicePixelRatio:1}}),a=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},a}_sortMaskChannels(e){let t={},o=0;for(let i of e){let{id:s}=i.root,n=t[s];if(!n){if(++o>4){ve.log.warn("Too many mask layers. The max supported is 4")();continue}n={id:s,index:this.channels.findIndex(a=>a?.id===s),layers:[],layerBounds:[],coordinateOrigin:i.root.props.coordinateOrigin,coordinateSystem:i.root.props.coordinateSystem},t[s]=n}n.layers.push(i),n.layerBounds.push(i.getBounds())}for(let i=0;i<4;i++){let s=this.channels[i];(!s||!(s.id in t))&&(this.channels[i]=null)}for(let i in t){let s=t[i];s.index<0&&(s.index=this.channels.findIndex(n=>!n),this.channels[s.index]=s)}return t}getModuleParameters(){return{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 _o={maskId:"",maskByInstance:void 0,maskInverted:!1},U=class extends y.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new G)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=Boolean(this.props.maskByInstance)),this.state.maskByInstance=e,{modules:[ht]}}draw({uniforms:e,context:t,moduleParameters:o}){e.mask_maskByInstance=this.state.maskByInstance;let{maskId:i,maskInverted:s}=this.props,{maskChannels:n}=o,{viewport:a}=t;if(n&&n[i]){let{index:l,bounds:f,coordinateOrigin:c}=n[i],{coordinateSystem:u}=n[i];e.mask_enabled=!0,e.mask_channel=l,e.mask_inverted=s,u===y.COORDINATE_SYSTEM.DEFAULT&&(u=a.isGeospatial?y.COORDINATE_SYSTEM.LNGLAT:y.COORDINATE_SYSTEM.CARTESIAN);let p={modelMatrix:null,fromCoordinateOrigin:c,fromCoordinateSystem:u},m=this.projectPosition([f[0],f[1],0],p),x=this.projectPosition([f[2],f[3],0],p);e.mask_bounds=[m[0],m[1],x[0],x[1]]}else i&&y.log.warn(`Could not find a mask layer with id: ${i}`)(),e.mask_enabled=!1}};U.defaultProps=_o;U.extensionName="MaskExtension";var gt=U;var At=_(d(),1);var Tt=_(d(),1);var Pt=_(d(),1);var g={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},xt=Object.keys(g).map(r=>`const float TERRAIN_MODE_${r} = ${g[r]}.0;`).join(`
1141
- `),q={name:"terrain",dependencies:[Pt.project],inject:{"vs:#decl":`
1142
- uniform float terrain_mode;
1418
+ if (mask.enabled) {
1419
+ bool mask = mask_isInBounds(mask_texCoords);
1420
+
1421
+ // Debug: show extent of render target
1422
+ // fragColor = vec4(mask_texCoords, 0.0, 1.0);
1423
+ // fragColor = texture(mask_texture, mask_texCoords);
1424
+
1425
+ if (!mask) discard;
1426
+ }
1427
+ `},Tr=o=>o&&"maskMap"in o?{mask_texture:o.maskMap}:o||{},Ot={name:"mask",dependencies:[Tt.project],vs:br,fs:Mr,inject:Fr,getUniforms:Tr,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var Pe=d(_(),1);var Lt=d(_(),1),Ar={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},G=class extends Lt._LayersPass{constructor(e,t){super(e,t);let{mapSize:r=2048}=t;this.maskMap=e.createTexture({format:"rgba8unorm",width:r,height:r,sampler:{minFilter:"linear",magFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}}),this.fbo=e.createFramebuffer({id:"maskmap",width:r,height:r,colorAttachments:[this.maskMap]})}render(e){let t=2**e.channel,r=[255,255,255,255];super.render({...e,clearColor:r,colorMask:t,target:this.fbo,pass:"mask"})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...Ar}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var ie=d(_(),1);function T(o,e){let t=[1/0,1/0,-1/0,-1/0];for(let r of o){let s=r.getBounds();if(s){let i=r.projectPosition(s[0],{viewport:e,autoOffset:!1}),n=r.projectPosition(s[1],{viewport:e,autoOffset:!1});t[0]=Math.min(t[0],i[0]),t[1]=Math.min(t[1],i[1]),t[2]=Math.max(t[2],n[0]),t[3]=Math.max(t[3],n[1])}}return Number.isFinite(t[0])?t:null}var Or=2048;function A(o){let{bounds:e,viewport:t,border:r=0}=o,{isGeospatial:s}=t;if(e[2]<=e[0]||e[3]<=e[1])return null;let i=t.unprojectPosition([(e[0]+e[2])/2,(e[1]+e[3])/2,0]),{width:n,height:a,zoom:l}=o;if(l===void 0){n=n-r*2,a=a-r*2;let c=Math.min(n/(e[2]-e[0]),a/(e[3]-e[1]));l=Math.min(Math.log2(c),20)}else if(!n||!a){let c=2**l;n=Math.round(Math.abs(e[2]-e[0])*c),a=Math.round(Math.abs(e[3]-e[1])*c);let f=Or-r*2;if(n>f||a>f){let u=f/Math.max(n,a);n=Math.round(n*u),a=Math.round(a*u),l+=Math.log2(u)}}return s?new ie.WebMercatorViewport({id:t.id,x:r,y:r,width:n,height:a,longitude:i[0],latitude:i[1],zoom:l,orthographic:!0}):new ie.OrthographicViewport({id:t.id,x:r,y:r,width:n,height:a,target:i,zoom:l,flipY:!1})}function Lr(o,e){let t;if(e&&e.length===2){let[i,n]=e,a=o.getBounds({z:i}),l=o.getBounds({z:n});t=[Math.min(a[0],l[0]),Math.min(a[1],l[1]),Math.max(a[2],l[2]),Math.max(a[3],l[3])]}else t=o.getBounds();let r=o.projectPosition(t.slice(0,2)),s=o.projectPosition(t.slice(2,4));return[r[0],r[1],s[0],s[1]]}function O(o,e,t){if(!o)return[0,0,1,1];let r=Lr(e,t),s=Cr(r);return o[2]-o[0]<=s[2]-s[0]&&o[3]-o[1]<=s[3]-s[1]?o:[Math.max(o[0],s[0]),Math.max(o[1],s[1]),Math.min(o[2],s[2]),Math.min(o[3],s[3])]}function Cr(o){let e=o[2]-o[0],t=o[3]-o[1],r=(o[0]+o[2])/2,s=(o[1]+o[3])/2;return[r-e,s-t,r+e,s+t]}var q=class{constructor(){this.id="mask-effect",this.props=null,this.useInPicking=!0,this.order=0,this.channels=[],this.masks=null}setup({device:e}){this.dummyMaskMap=e.createTexture({width:1,height:1}),this.maskPass=new G(e,{id:"default-mask"}),this.maskMap=this.maskPass.maskMap}preRender({layers:e,layerFilter:t,viewports:r,onViewportActive:s,views:i,isPicking:n}){let a=!1;if(n)return{didRender:a};let l=e.filter(p=>p.props.visible&&p.props.operation.includes("mask"));if(l.length===0)return this.masks=null,this.channels.length=0,{didRender:a};this.masks={};let c=this._sortMaskChannels(l),f=r[0],u=!this.lastViewport||!this.lastViewport.equals(f);if(f.resolution!==void 0)return Pe.log.warn("MaskExtension is not supported in GlobeView")(),{didRender:a};for(let p in c){let m=this._renderChannel(c[p],{layerFilter:t,onViewportActive:s,views:i,viewport:f,viewportChanged:u});a||(a=m)}return{didRender:a}}_renderChannel(e,{layerFilter:t,onViewportActive:r,views:s,viewport:i,viewportChanged:n}){let a=!1,l=this.channels[e.index];if(!l)return a;let c=e===l||e.layers.length!==l.layers.length||e.layers.some((f,u)=>f!==l.layers[u]||f.props.transitions)||e.layerBounds.some((f,u)=>f!==l.layerBounds[u]);if(e.bounds=l.bounds,e.maskBounds=l.maskBounds,this.channels[e.index]=e,c||n){this.lastViewport=i;let f=T(e.layers,i);if(e.bounds=f&&O(f,i),c||!M(e.bounds,l.bounds)){let{maskPass:u,maskMap:p}=this,m=f&&A({bounds:e.bounds,viewport:i,width:p.width,height:p.height,border:1});e.maskBounds=m?m.getBounds():[0,0,1,1],u.render({pass:"mask",channel:e.index,layers:e.layers,layerFilter:t,viewports:m?[m]:[],onViewportActive:r,views:s,shaderModuleProps:{project:{devicePixelRatio:1}}}),a=!0}}return this.masks[e.id]={index:e.index,bounds:e.maskBounds,coordinateOrigin:e.coordinateOrigin,coordinateSystem:e.coordinateSystem},a}_sortMaskChannels(e){let t={},r=0;for(let s of e){let{id:i}=s.root,n=t[i];if(!n){if(++r>4){Pe.log.warn("Too many mask layers. The max supported is 4")();continue}n={id:i,index:this.channels.findIndex(a=>a?.id===i),layers:[],layerBounds:[],coordinateOrigin:s.root.props.coordinateOrigin,coordinateSystem:s.root.props.coordinateSystem},t[i]=n}n.layers.push(s),n.layerBounds.push(s.getBounds())}for(let s=0;s<4;s++){let i=this.channels[s];(!i||!(i.id in t))&&(this.channels[s]=null)}for(let s in t){let i=t[s];i.index<0&&(i.index=this.channels.findIndex(n=>!n),this.channels[i.index]=i)}return t}getShaderModuleProps(){return{mask:{maskMap:this.masks?this.maskMap:this.dummyMaskMap,maskChannels:this.masks}}}cleanup(){this.dummyMaskMap&&(this.dummyMaskMap.delete(),this.dummyMaskMap=void 0),this.maskPass&&(this.maskPass.delete(),this.maskPass=void 0,this.maskMap=void 0),this.lastViewport=void 0,this.masks=null,this.channels.length=0}};var Sr={maskId:"",maskByInstance:void 0,maskInverted:!1},H=class extends P.LayerExtension{initializeState(){this.context.deck?._addDefaultEffect(new q)}getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.maskByInstance!==void 0&&(e=Boolean(this.props.maskByInstance)),this.state.maskByInstance=e,{modules:[Ot]}}draw({context:e,shaderModuleProps:t}){let r={};r.maskByInstance=Boolean(this.state.maskByInstance);let{maskId:s,maskInverted:i}=this.props,{maskChannels:n}=t.mask||{},{viewport:a}=e;if(n&&n[s]){let{index:l,bounds:c,coordinateOrigin:f}=n[s],{coordinateSystem:u}=n[s];r.enabled=!0,r.channel=l,r.inverted=i,u===P.COORDINATE_SYSTEM.DEFAULT&&(u=a.isGeospatial?P.COORDINATE_SYSTEM.LNGLAT:P.COORDINATE_SYSTEM.CARTESIAN);let p={modelMatrix:null,fromCoordinateOrigin:f,fromCoordinateSystem:u},m=this.projectPosition([c[0],c[1],0],p),v=this.projectPosition([c[2],c[3],0],p);r.bounds=[m[0],m[1],v[0],v[1]]}else s&&P.log.warn(`Could not find a mask layer with id: ${s}`)(),r.enabled=!1;this.setShaderModuleProps({mask:r})}};H.defaultProps=Sr;H.extensionName="MaskExtension";var Ct=H;var Bt=d(_(),1);var Nt=d(_(),1);var be=d(_(),1),x={NONE:0,WRITE_HEIGHT_MAP:1,USE_HEIGHT_MAP:2,USE_COVER:3,USE_COVER_ONLY:4,SKIP:5},Ir=Object.keys(x).map(o=>`const float TERRAIN_MODE_${o} = ${x[o]}.0;`).join(`
1428
+ `),St=Ir+`
1429
+ uniform terrainUniforms {
1430
+ float mode;
1431
+ vec4 bounds;
1432
+ } terrain;
1433
+
1143
1434
  uniform sampler2D terrain_map;
1144
- uniform vec4 terrain_bounds;
1145
- out vec3 commonPos;
1146
- `+xt,"vs:#main-start":`
1147
- if (terrain_mode == TERRAIN_MODE_SKIP) {
1148
- gl_Position = vec4(0.0);
1149
- return;
1435
+ `,Y={name:"terrain",dependencies:[be.project],vs:St+"out vec3 commonPos;",fs:St+"in vec3 commonPos;",inject:{"vs:#main-start":`
1436
+ if (terrain.mode == TERRAIN_MODE_SKIP) {
1437
+ gl_Position = vec4(0.0);
1438
+ return;
1150
1439
  }
1151
1440
  `,"vs:DECKGL_FILTER_GL_POSITION":`
1152
1441
  commonPos = geometry.position.xyz;
1153
- if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
1154
- vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
1155
- position = vec4(texCoords * 2.0 - 1.0, 0.0, 1.0);
1156
- commonPos.z += project_uCommonOrigin.z;
1157
- }
1158
- if (terrain_mode == TERRAIN_MODE_USE_HEIGHT_MAP) {
1159
- vec3 anchor = geometry.worldPosition;
1160
- anchor.z = 0.0;
1161
- vec3 anchorCommon = project_position(anchor);
1162
- vec2 texCoords = (anchorCommon.xy - terrain_bounds.xy) / terrain_bounds.zw;
1163
- if (texCoords.x >= 0.0 && texCoords.y >= 0.0 && texCoords.x <= 1.0 && texCoords.y <= 1.0) {
1164
- float terrainZ = texture(terrain_map, texCoords).r;
1165
- geometry.position.z += terrainZ;
1166
- position = project_common_position_to_clipspace(geometry.position);
1167
- }
1168
- }
1169
- `,"fs:#decl":`
1170
- uniform float terrain_mode;
1171
- uniform sampler2D terrain_map;
1172
- uniform vec4 terrain_bounds;
1173
- in vec3 commonPos;
1174
- `+xt,"fs:#main-start":`
1175
- if (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
1176
- fragColor = vec4(commonPos.z, 0.0, 0.0, 1.0);
1177
- return;
1178
- }
1179
- `,"fs:DECKGL_FILTER_COLOR":`
1180
- if ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY)) {
1181
- vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;
1182
- vec4 pixel = texture(terrain_map, texCoords);
1183
- if (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY) {
1184
- color = pixel;
1185
- } else {
1186
- color = pixel + color * (1.0 - pixel.a);
1442
+ if (terrain.mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
1443
+ vec2 texCoords = (commonPos.xy - terrain.bounds.xy) / terrain.bounds.zw;
1444
+ position = vec4(texCoords * 2.0 - 1.0, 0.0, 1.0);
1445
+ commonPos.z += project.commonOrigin.z;
1446
+ }
1447
+ if (terrain.mode == TERRAIN_MODE_USE_HEIGHT_MAP) {
1448
+ vec3 anchor = geometry.worldPosition;
1449
+ anchor.z = 0.0;
1450
+ vec3 anchorCommon = project_position(anchor);
1451
+ vec2 texCoords = (anchorCommon.xy - terrain.bounds.xy) / terrain.bounds.zw;
1452
+ if (texCoords.x >= 0.0 && texCoords.y >= 0.0 && texCoords.x <= 1.0 && texCoords.y <= 1.0) {
1453
+ float terrainZ = texture(terrain_map, texCoords).r;
1454
+ geometry.position.z += terrainZ;
1455
+ position = project_common_position_to_clipspace(geometry.position);
1456
+ }
1187
1457
  }
1188
- return;
1458
+ `,"fs:#main-start":`
1459
+ if (terrain.mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {
1460
+ fragColor = vec4(commonPos.z, 0.0, 0.0, 1.0);
1461
+ return;
1462
+ }
1463
+ `,"fs:DECKGL_FILTER_COLOR":`
1464
+ if ((terrain.mode == TERRAIN_MODE_USE_COVER) || (terrain.mode == TERRAIN_MODE_USE_COVER_ONLY)) {
1465
+ vec2 texCoords = (commonPos.xy - terrain.bounds.xy) / terrain.bounds.zw;
1466
+ vec4 pixel = texture(terrain_map, texCoords);
1467
+ if (terrain.mode == TERRAIN_MODE_USE_COVER_ONLY) {
1468
+ color = pixel;
1469
+ } else {
1470
+ // pixel is premultiplied
1471
+ color = pixel + color * (1.0 - pixel.a);
1472
+ }
1473
+ return;
1189
1474
  }
1190
- `},getUniforms:(r={},e)=>{if("dummyHeightMap"in r){let{drawToTerrainHeightMap:t,heightMap:o,heightMapBounds:i,dummyHeightMap:s,terrainCover:n,useTerrainHeightMap:a,terrainSkipRender:l}=r,{project_uCommonOrigin:f}=e,c=l?g.SKIP:g.NONE,u=s,p=null;if(t)c=g.WRITE_HEIGHT_MAP,p=i;else if(a&&o)c=g.USE_HEIGHT_MAP,u=o,p=i;else if(n){let m=r.picking?.isActive;u=(m?n.getPickingFramebuffer():n.getRenderFramebuffer())?.colorAttachments[0].texture,m&&(c=g.SKIP),u?(c=c===g.SKIP?g.USE_COVER_ONLY:g.USE_COVER,p=n.bounds):u=s}return{terrain_mode:c,terrain_map:u,terrain_bounds:p?[p[0]-f[0],p[1]-f[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return null}};function H(r,e){return r.createFramebuffer({id:e.id,colorAttachments:[r.createTexture({id:e.id,...e.float&&{format:"rgba32float",type:5126},mipmaps:!1,sampler:e.interpolate===!1?{minFilter:"nearest",magFilter:"nearest"}:{minFilter:"linear",magFilter:"linear"}})]})}var se=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=yt(e)}get id(){return this.targetLayer.id}get isActive(){return Boolean(this.targetLayer.getCurrentLayer())}shouldUpdate({targetLayer:e,viewport:t,layers:o,layerNeedsRedraw:i}){e&&(this.targetLayer=e);let s=t?this._updateViewport(t):!1,n=o?this._updateLayers(o):!1;if(i){for(let a of this.layers)if(i[a]){n=!0;break}}return n||s}_updateLayers(e){let t=!1;if(e=this.tile?mo(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let o=0;o<e.length;o++)if(e[o].id!==this.layers[o]){t=!0;break}return t&&(this.layers=e.map(o=>o.id)),t}_updateViewport(e){let t=this.targetLayer,o=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){o=!0,this.targetBounds=this.tile.boundingBox;let s=e.projectPosition(this.targetBounds[0]),n=e.projectPosition(this.targetBounds[1]);this.targetBoundsCommon=[s[0],s[1],n[0],n[1]]}}else this.targetBounds!==t.getBounds()&&(o=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=M([t],e));if(!this.targetBoundsCommon)return!1;let i=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let s=this.renderViewport?.zoom;o=o||i!==s;let n=A(this.targetBoundsCommon,e),a=this.bounds;o=o||!a||n.some((l,f)=>l!==a[f]),this.bounds=n}return o&&(this.renderViewport=T({bounds:this.bounds,zoom:i,viewport:e})),o}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=H(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=H(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 mo(r,e){return e.filter(t=>{let o=yt(t);return o?ho(r.boundingBox,o.boundingBox):!0})}function yt(r){for(;r;){let{tile:e}=r.props;if(e)return e;r=r.parent}return null}function ho(r,e){return r&&e?r[0][0]<e[1][0]&&e[0][0]<r[1][0]&&r[0][1]<e[1][1]&&e[0][1]<r[1][1]:!1}var bt=_(d(),1),vo={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},ne=class extends bt._LayersPass{getRenderableLayers(e,t){let{layers:o}=t,i=[],s=this._getDrawLayerParams(e,t,!0);for(let n=0;n<o.length;n++){let a=o[n];!a.isComposite&&s[n].shouldDrawLayer&&i.push(a)}return i}renderHeightMap(e,t){let o=e.getRenderFramebuffer(),i=e.renderViewport;!o||!i||(o.resize(i),this.render({...t,target:o,pass:"terrain-height-map",layers:t.layers,viewports:[i],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let o=e.getRenderFramebuffer(),i=e.renderViewport;if(!o||!i)return;let s=e.filterLayers(t.layers);o.resize(i),this.render({...t,target:o,pass:`terrain-cover-${e.id}`,layers:s,effects:[],viewports:[i],clearColor:[0,0,0,0]})}getLayerParameters(e,t,o){return{...e.props.parameters,blend:!0,depthTest:!1,...e.props.operation.includes("terrain")&&vo}}};var Et=_(d(),1),ae=class extends Et._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:o}=t,i=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let s=this._getDrawLayerParams(e,t);for(let n=0;n<o.length;n++){let a=o[n];!a.isComposite&&s[n].shouldDrawLayer&&(i.push(a),this.drawParameters[a.id]=s[n].layerParameters)}return i}renderTerrainCover(e,t){let o=e.getPickingFramebuffer(),i=e.renderViewport;if(!o||!i)return;let s=e.filterLayers(t.layers),n=e.targetLayer;n.props.pickable&&s.unshift(n),o.resize(i),this.render({...t,pickingFBO:o,pass:`terrain-cover-picking-${e.id}`,layers:s,effects:[],viewports:[i],cullRect:void 0,deviceRect:i,pickZ:!1})}getLayerParameters(e,t,o){let i;return this.drawParameters[e.id]?i=this.drawParameters[e.id]:(i=super.getLayerParameters(e,t,o),i.blend=!0),{...i,depthTest:!1}}};var Mt=2048,Y=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=H(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let o=e.length!==this.layers.length||e.some((s,n)=>s!==this.layers[n]||s.props.transitions||s.getBounds()!==this.layersBounds[n]);o&&(this.layers=e,this.layersBounds=e.map(s=>s.getBounds()),this.layersBoundsCommon=M(e,t));let i=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(o||i){let s=A(this.layersBoundsCommon,t);if(s[2]<=s[0]||s[3]<=s[1])return this.renderViewport=null,!1;this.bounds=s,this.lastViewport=t;let n=t.scale,a=(s[2]-s[0])*n,l=(s[3]-s[1])*n;return this.renderViewport=a>0||l>0?T({bounds:[t.center[0]-1,t.center[1]-1,t.center[0]+1,t.center[1]+1],zoom:t.zoom,width:Math.min(a,Mt),height:Math.min(l,Mt),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var le=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 ne(e,{id:"terrain"}),this.terrainPickingPass=new ae(e,{id:"terrain-picking"}),Y.isSupported(e)?this.heightMap=new Y(e):Tt.log.warn("Terrain offset mode is not supported by this browser")(),t._addDefaultShaderModule(q)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:t}=e,o=e.pass.startsWith("picking");this.isPicking=o,this.isDrapingEnabled=!0;let i=t[0],s=(o?this.terrainPickingPass:this.terrainPass).getRenderableLayers(i,e),n=s.filter(l=>l.props.operation.includes("terrain"));if(n.length===0)return;o||s.filter(f=>f.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(n,i,e);let a=s.filter(l=>l.state.terrainDrawMode==="drape");this._updateTerrainCovers(n,a,i,e)}getModuleParameters(e){let{terrainDrawMode:t}=e.state;return{heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:this.isDrapingEnabled?this.terrainCovers.get(e.id):null,useTerrainHeightMap:t==="offset",terrainSkipRender:t==="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(q)}_updateHeightMap(e,t,o){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...o,layers:e,moduleParameters:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,devicePixelRatio:1,drawToTerrainHeightMap:!0}})}_updateTerrainCovers(e,t,o,i){let s={};for(let n of t)n.state.terrainCoverNeedsRedraw&&(s[n.id]=!0,n.state.terrainCoverNeedsRedraw=!1);for(let n of this.terrainCovers.values())n.isDirty=n.isDirty||n.shouldUpdate({layerNeedsRedraw:s});for(let n of e)this._updateTerrainCover(n,t,o,i);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,o,i){let s=this.isPicking?this.terrainPickingPass:this.terrainPass,n=this.terrainCovers.get(e.id);n||(n=new se(e),this.terrainCovers.set(e.id,n));try{let a=n.shouldUpdate({targetLayer:e,viewport:o,layers:t});(this.isPicking||n.isDirty||a)&&(s.renderTerrainCover(n,{...i,layers:t,moduleParameters:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1,devicePixelRatio:1}}),this.isPicking||(n.isDirty=!1))}catch(a){e.raiseError(a,`Error rendering terrain cover ${n.id}`)}}_pruneTerrainCovers(){let e=[];for(let[t,o]of this.terrainCovers)o.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var go={terrainDrawMode:void 0},W=class extends At.LayerExtension{getShaders(){return{modules:[q]}}initializeState(){this.context.deck?._addDefaultEffect(new le)}updateState(e){let{props:t,oldProps:o}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===o.terrainDrawMode&&t.extruded===o.extruded)return;let{terrainDrawMode:i}=t;if(!i){let s=this.props.extruded,n=this.getAttributeManager()?.attributes,a=n&&"instancePositions"in n;i=s||a?"offset":"drape"}this.setState({terrainDrawMode:i})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};W.defaultProps=go;W.extensionName="TerrainExtension";var Ft=W;return wt(K);})();
1475
+ `},getUniforms:(o={})=>{if("dummyHeightMap"in o){let{drawToTerrainHeightMap:e,heightMap:t,heightMapBounds:r,dummyHeightMap:s,terrainCover:i,useTerrainHeightMap:n,terrainSkipRender:a}=o,l=be.project.getUniforms(o.project),{commonOrigin:c}=l,f=a?x.SKIP:x.NONE,u=s,p=null;return e?(f=x.WRITE_HEIGHT_MAP,p=r):n&&t?(f=x.USE_HEIGHT_MAP,u=t,p=r):i&&(u=(o.isPicking?i.getPickingFramebuffer():i.getRenderFramebuffer())?.colorAttachments[0].texture,o.isPicking&&(f=x.SKIP),u?(f=f===x.SKIP?x.USE_COVER_ONLY:x.USE_COVER,p=i.bounds):u=s),{mode:f,terrain_map:u,bounds:p?[p[0]-c[0],p[1]-c[1],p[2]-p[0],p[3]-p[1]]:[0,0,0,0]}}return{}},uniformTypes:{mode:"f32",bounds:"vec4<f32>"}};function W(o,e){return o.createFramebuffer({id:e.id,colorAttachments:[o.createTexture({id:e.id,...e.float&&{format:"rgba32float",type:5126},mipmaps:!1,sampler:e.interpolate===!1?{minFilter:"nearest",magFilter:"nearest"}:{minFilter:"linear",magFilter:"linear"}})]})}var ne=class{constructor(e){this.isDirty=!0,this.renderViewport=null,this.bounds=null,this.layers=[],this.targetBounds=null,this.targetBoundsCommon=null,this.targetLayer=e,this.tile=It(e)}get id(){return this.targetLayer.id}get isActive(){return Boolean(this.targetLayer.getCurrentLayer())}shouldUpdate({targetLayer:e,viewport:t,layers:r,layerNeedsRedraw:s}){e&&(this.targetLayer=e);let i=t?this._updateViewport(t):!1,n=r?this._updateLayers(r):!1;if(s){for(let a of this.layers)if(s[a]){n=!0;break}}return n||i}_updateLayers(e){let t=!1;if(e=this.tile?kr(this.tile,e):e,e.length!==this.layers.length)t=!0;else for(let r=0;r<e.length;r++)if(e[r].id!==this.layers[r]){t=!0;break}return t&&(this.layers=e.map(r=>r.id)),t}_updateViewport(e){let t=this.targetLayer,r=!1;if(this.tile&&"boundingBox"in this.tile){if(!this.targetBounds){r=!0,this.targetBounds=this.tile.boundingBox;let i=e.projectPosition(this.targetBounds[0]),n=e.projectPosition(this.targetBounds[1]);this.targetBoundsCommon=[i[0],i[1],n[0],n[1]]}}else this.targetBounds!==t.getBounds()&&(r=!0,this.targetBounds=t.getBounds(),this.targetBoundsCommon=T([t],e));if(!this.targetBoundsCommon)return!1;let s=Math.ceil(e.zoom+.5);if(this.tile)this.bounds=this.targetBoundsCommon;else{let i=this.renderViewport?.zoom;r=r||s!==i;let n=O(this.targetBoundsCommon,e),a=this.bounds;r=r||!a||n.some((l,c)=>l!==a[c]),this.bounds=n}return r&&(this.renderViewport=A({bounds:this.bounds,zoom:s,viewport:e})),r}getRenderFramebuffer(){return!this.renderViewport||this.layers.length===0?null:(this.fbo||(this.fbo=W(this.targetLayer.context.device,{id:this.id})),this.fbo)}getPickingFramebuffer(){return!this.renderViewport||this.layers.length===0&&!this.targetLayer.props.pickable?null:(this.pickingFbo||(this.pickingFbo=W(this.targetLayer.context.device,{id:`${this.id}-picking`,interpolate:!1})),this.pickingFbo)}filterLayers(e){return e.filter(({id:t})=>this.layers.includes(t))}delete(){let{fbo:e,pickingFbo:t}=this;e&&(e.colorAttachments[0].destroy(),e.destroy()),t&&(t.colorAttachments[0].destroy(),t.destroy())}};function kr(o,e){return e.filter(t=>{let r=It(t);return r?Rr(o.boundingBox,r.boundingBox):!0})}function It(o){for(;o;){let{tile:e}=o.props;if(e)return e;o=o.parent}return null}function Rr(o,e){return o&&e?o[0][0]<e[1][0]&&e[0][0]<o[1][0]&&o[0][1]<e[1][1]&&e[0][1]<o[1][1]:!1}var kt=d(_(),1),wr={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},ae=class extends kt._LayersPass{getRenderableLayers(e,t){let{layers:r}=t,s=[],i=this._getDrawLayerParams(e,t,!0);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&i[n].shouldDrawLayer&&s.push(a)}return s}renderHeightMap(e,t){let r=e.getRenderFramebuffer(),s=e.renderViewport;!r||!s||(r.resize(s),this.render({...t,target:r,pass:"terrain-height-map",layers:t.layers,viewports:[s],effects:[],clearColor:[0,0,0,0]}))}renderTerrainCover(e,t){let r=e.getRenderFramebuffer(),s=e.renderViewport;if(!r||!s)return;let i=e.filterLayers(t.layers);r.resize(s),this.render({...t,target:r,pass:`terrain-cover-${e.id}`,layers:i,effects:[],viewports:[s],clearColor:[0,0,0,0]})}getLayerParameters(e,t,r){return{...e.props.parameters,blend:!0,depthCompare:"always",...e.props.operation.includes("terrain")&&wr}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var Rt=d(_(),1),le=class extends Rt._PickLayersPass{constructor(){super(...arguments),this.drawParameters={}}getRenderableLayers(e,t){let{layers:r}=t,s=[];this.drawParameters={},this._resetColorEncoder(t.pickZ);let i=this._getDrawLayerParams(e,t);for(let n=0;n<r.length;n++){let a=r[n];!a.isComposite&&i[n].shouldDrawLayer&&(s.push(a),this.drawParameters[a.id]=i[n].layerParameters)}return s}renderTerrainCover(e,t){let r=e.getPickingFramebuffer(),s=e.renderViewport;if(!r||!s)return;let i=e.filterLayers(t.layers),n=e.targetLayer;n.props.pickable&&i.unshift(n),r.resize(s),this.render({...t,pickingFBO:r,pass:`terrain-cover-picking-${e.id}`,layers:i,effects:[],viewports:[s],cullRect:void 0,deviceRect:s,pickZ:!1})}getLayerParameters(e,t,r){let s;return this.drawParameters[e.id]?s=this.drawParameters[e.id]:(s=super.getLayerParameters(e,t,r),s.blend=!0),{...s,depthCompare:"always"}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var wt=2048,K=class{static isSupported(e){return e.isTextureFormatRenderable("rgba32float")}constructor(e){this.renderViewport=null,this.bounds=null,this.layers=[],this.layersBounds=[],this.layersBoundsCommon=null,this.lastViewport=null,this.device=e}getRenderFramebuffer(){return this.renderViewport?(this.fbo||(this.fbo=W(this.device,{id:"height-map",float:!0})),this.fbo):null}shouldUpdate({layers:e,viewport:t}){let r=e.length!==this.layers.length||e.some((i,n)=>i!==this.layers[n]||i.props.transitions||i.getBounds()!==this.layersBounds[n]);r&&(this.layers=e,this.layersBounds=e.map(i=>i.getBounds()),this.layersBoundsCommon=T(e,t));let s=!this.lastViewport||!t.equals(this.lastViewport);if(!this.layersBoundsCommon)this.renderViewport=null;else if(r||s){let i=O(this.layersBoundsCommon,t);if(i[2]<=i[0]||i[3]<=i[1])return this.renderViewport=null,!1;this.bounds=i,this.lastViewport=t;let n=t.scale,a=(i[2]-i[0])*n,l=(i[3]-i[1])*n;return this.renderViewport=a>0||l>0?A({bounds:[t.center[0]-1,t.center[1]-1,t.center[0]+1,t.center[1]+1],zoom:t.zoom,width:Math.min(a,wt),height:Math.min(l,wt),viewport:t}):null,!0}return!1}delete(){this.fbo&&(this.fbo.colorAttachments[0].delete(),this.fbo.delete())}};var ce=class{constructor(){this.id="terrain-effect",this.props=null,this.useInPicking=!0,this.isPicking=!1,this.isDrapingEnabled=!1,this.terrainCovers=new Map}setup({device:e,deck:t}){this.dummyHeightMap=e.createTexture({width:1,height:1,data:new Uint8Array([0,0,0,0])}),this.terrainPass=new ae(e,{id:"terrain"}),this.terrainPickingPass=new le(e,{id:"terrain-picking"}),K.isSupported(e)?this.heightMap=new K(e):Nt.log.warn("Terrain offset mode is not supported by this browser")(),t._addDefaultShaderModule(Y)}preRender(e){if(e.pickZ){this.isDrapingEnabled=!1;return}let{viewports:t}=e,r=e.pass.startsWith("picking");this.isPicking=r,this.isDrapingEnabled=!0;let s=t[0],i=(r?this.terrainPickingPass:this.terrainPass).getRenderableLayers(s,e),n=i.filter(l=>l.props.operation.includes("terrain"));if(n.length===0)return;r||i.filter(c=>c.state.terrainDrawMode==="offset").length>0&&this._updateHeightMap(n,s,e);let a=i.filter(l=>l.state.terrainDrawMode==="drape");this._updateTerrainCovers(n,a,s,e)}getShaderModuleProps(e,t){let{terrainDrawMode:r}=e.state;return{terrain:{project:t.project,isPicking:this.isPicking,heightMap:this.heightMap?.getRenderFramebuffer()?.colorAttachments[0].texture||null,heightMapBounds:this.heightMap?.bounds,dummyHeightMap:this.dummyHeightMap,terrainCover:this.isDrapingEnabled?this.terrainCovers.get(e.id):null,useTerrainHeightMap:r==="offset",terrainSkipRender:r==="drape"||!e.props.operation.includes("draw")}}}cleanup({deck:e}){this.dummyHeightMap&&(this.dummyHeightMap.delete(),this.dummyHeightMap=void 0),this.heightMap&&(this.heightMap.delete(),this.heightMap=void 0);for(let t of this.terrainCovers.values())t.delete();this.terrainCovers.clear(),e._removeDefaultShaderModule(Y)}_updateHeightMap(e,t,r){!this.heightMap||!this.heightMap.shouldUpdate({layers:e,viewport:t})||this.terrainPass.renderHeightMap(this.heightMap,{...r,layers:e,shaderModuleProps:{terrain:{heightMapBounds:this.heightMap.bounds,dummyHeightMap:this.dummyHeightMap,drawToTerrainHeightMap:!0},project:{devicePixelRatio:1}}})}_updateTerrainCovers(e,t,r,s){let i={};for(let n of t)n.state.terrainCoverNeedsRedraw&&(i[n.id]=!0,n.state.terrainCoverNeedsRedraw=!1);for(let n of this.terrainCovers.values())n.isDirty=n.isDirty||n.shouldUpdate({layerNeedsRedraw:i});for(let n of e)this._updateTerrainCover(n,t,r,s);this.isPicking||this._pruneTerrainCovers()}_updateTerrainCover(e,t,r,s){let i=this.isPicking?this.terrainPickingPass:this.terrainPass,n=this.terrainCovers.get(e.id);n||(n=new ne(e),this.terrainCovers.set(e.id,n));try{let a=n.shouldUpdate({targetLayer:e,viewport:r,layers:t});(this.isPicking||n.isDirty||a)&&(i.renderTerrainCover(n,{...s,layers:t,shaderModuleProps:{terrain:{dummyHeightMap:this.dummyHeightMap,terrainSkipRender:!1},project:{devicePixelRatio:1}}}),this.isPicking||(n.isDirty=!1))}catch(a){e.raiseError(a,`Error rendering terrain cover ${n.id}`)}}_pruneTerrainCovers(){let e=[];for(let[t,r]of this.terrainCovers)r.isActive||e.push(t);for(let t of e)this.terrainCovers.delete(t)}};var Nr={terrainDrawMode:void 0},$=class extends Bt.LayerExtension{getShaders(){return{modules:[Y]}}initializeState(){this.context.deck?._addDefaultEffect(new ce)}updateState(e){let{props:t,oldProps:r}=e;if(this.state.terrainDrawMode&&t.terrainDrawMode===r.terrainDrawMode&&t.extruded===r.extruded)return;let{terrainDrawMode:s}=t;if(!s){let i=this.props.extruded,n=this.getAttributeManager()?.attributes,a=n&&"instancePositions"in n;s=i||a?"offset":"drape"}this.setState({terrainDrawMode:s})}onNeedsRedraw(){let e=this.state;e.terrainDrawMode==="drape"&&(e.terrainCoverNeedsRedraw=!0)}};$.defaultProps=Nr;$.extensionName="TerrainExtension";var Dt=$;return qt(Z);})();
1191
1476
  return __exports__;
1192
1477
  });