@deck.gl/extensions 9.0.35 → 9.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brushing/brushing-extension.d.ts +1 -0
- package/dist/brushing/brushing-extension.d.ts.map +1 -1
- package/dist/brushing/brushing-extension.js +15 -19
- package/dist/brushing/shader-module.d.ts +8 -2
- package/dist/brushing/shader-module.d.ts.map +1 -1
- package/dist/brushing/shader-module.js +74 -50
- package/dist/clip/clip-extension.d.ts +5 -2
- package/dist/clip/clip-extension.d.ts.map +1 -1
- package/dist/clip/clip-extension.js +36 -42
- package/dist/collision-filter/collision-filter-effect.d.ts +4 -4
- package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-effect.js +27 -13
- package/dist/collision-filter/collision-filter-extension.d.ts +1 -1
- package/dist/collision-filter/collision-filter-extension.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-extension.js +5 -6
- package/dist/collision-filter/collision-filter-pass.d.ts +7 -3
- package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-pass.js +8 -3
- package/dist/collision-filter/shader-module.d.ts +3 -2
- package/dist/collision-filter/shader-module.d.ts.map +1 -1
- package/dist/collision-filter/shader-module.js +74 -52
- package/dist/data-filter/aggregator.d.ts +4 -10
- package/dist/data-filter/aggregator.d.ts.map +1 -1
- package/dist/data-filter/aggregator.js +14 -8
- package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
- package/dist/data-filter/data-filter-extension.js +40 -38
- package/dist/data-filter/shader-module.d.ts +11 -4
- package/dist/data-filter/shader-module.d.ts.map +1 -1
- package/dist/data-filter/shader-module.js +189 -131
- package/dist/dist.dev.js +2699 -2028
- package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
- package/dist/fill-style/fill-style-extension.js +11 -4
- package/dist/fill-style/shader-module.d.ts +64 -6
- package/dist/fill-style/shader-module.d.ts.map +1 -1
- package/dist/fill-style/shader-module.js +73 -51
- package/dist/fp64/fp64-extension.d.ts +1 -0
- package/dist/fp64/fp64-extension.d.ts.map +1 -1
- package/dist/fp64/fp64-extension.js +7 -19
- package/dist/fp64/project64.d.ts +2 -2
- package/dist/fp64/project64.d.ts.map +1 -1
- package/dist/fp64/project64.glsl.d.ts +1 -1
- package/dist/fp64/project64.glsl.d.ts.map +1 -1
- package/dist/fp64/project64.glsl.js +18 -21
- package/dist/fp64/project64.js +24 -24
- package/dist/index.cjs +1017 -523
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/mask/mask-effect.d.ts +5 -3
- package/dist/mask/mask-effect.d.ts.map +1 -1
- package/dist/mask/mask-effect.js +12 -5
- package/dist/mask/mask-extension.d.ts +1 -1
- package/dist/mask/mask-extension.d.ts.map +1 -1
- package/dist/mask/mask-extension.js +13 -8
- package/dist/mask/mask-pass.d.ts +38 -38
- package/dist/mask/mask-pass.d.ts.map +1 -1
- package/dist/mask/mask-pass.js +3 -0
- package/dist/mask/shader-module.d.ts +60 -3
- package/dist/mask/shader-module.d.ts.map +1 -1
- package/dist/mask/shader-module.js +73 -46
- package/dist/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +20 -24
- package/dist/path-style/shaders.glsl.d.ts.map +1 -1
- package/dist/path-style/shaders.glsl.js +11 -7
- package/dist/terrain/height-map-builder.d.ts.map +1 -1
- package/dist/terrain/height-map-builder.js +3 -0
- package/dist/terrain/shader-module.d.ts +60 -6
- package/dist/terrain/shader-module.d.ts.map +1 -1
- package/dist/terrain/shader-module.js +69 -61
- package/dist/terrain/terrain-cover.d.ts.map +1 -1
- package/dist/terrain/terrain-cover.js +3 -0
- package/dist/terrain/terrain-effect.d.ts +4 -2
- package/dist/terrain/terrain-effect.d.ts.map +1 -1
- package/dist/terrain/terrain-effect.js +31 -18
- package/dist/terrain/terrain-extension.d.ts.map +1 -1
- package/dist/terrain/terrain-extension.js +3 -0
- package/dist/terrain/terrain-pass.d.ts +43 -38
- package/dist/terrain/terrain-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-pass.js +10 -0
- package/dist/terrain/terrain-picking-pass.d.ts +5 -0
- package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-picking-pass.js +10 -0
- package/dist/terrain/utils.d.ts.map +1 -1
- package/dist/terrain/utils.js +3 -0
- package/dist/utils/debug.d.ts +2 -2
- package/dist/utils/debug.d.ts.map +1 -1
- package/dist/utils/debug.js +3 -1
- package/dist/utils/projection-utils.d.ts.map +1 -1
- package/dist/utils/projection-utils.js +3 -0
- package/dist.min.js +1102 -817
- package/package.json +8 -8
- package/src/brushing/brushing-extension.ts +17 -20
- package/src/brushing/shader-module.ts +58 -47
- package/src/clip/clip-extension.ts +38 -40
- package/src/collision-filter/collision-filter-effect.ts +31 -20
- package/src/collision-filter/collision-filter-extension.ts +6 -7
- package/src/collision-filter/collision-filter-pass.ts +9 -3
- package/src/collision-filter/shader-module.ts +40 -22
- package/src/data-filter/aggregator.ts +23 -11
- package/src/data-filter/data-filter-extension.ts +68 -48
- package/src/data-filter/shader-module.ts +144 -84
- package/src/fill-style/fill-style-extension.ts +13 -5
- package/src/fill-style/shader-module.ts +84 -52
- package/src/fp64/fp64-extension.ts +8 -19
- package/src/fp64/project64.glsl.ts +18 -21
- package/src/fp64/project64.ts +27 -28
- package/src/index.ts +5 -0
- package/src/mask/mask-effect.ts +17 -7
- package/src/mask/mask-extension.ts +16 -9
- package/src/mask/mask-pass.ts +4 -0
- package/src/mask/shader-module.ts +63 -27
- package/src/path-style/path-style-extension.ts +27 -28
- package/src/path-style/shaders.glsl.ts +13 -7
- package/src/terrain/height-map-builder.ts +4 -0
- package/src/terrain/shader-module.ts +62 -44
- package/src/terrain/terrain-cover.ts +4 -0
- package/src/terrain/terrain-effect.ts +36 -19
- package/src/terrain/terrain-extension.ts +4 -0
- package/src/terrain/terrain-pass.ts +12 -0
- package/src/terrain/terrain-picking-pass.ts +12 -0
- package/src/terrain/utils.ts +4 -0
- package/src/utils/debug.ts +4 -0
- package/src/utils/projection-utils.ts +4 -0
- package/dist/utils/syntax-tags.d.ts +0 -6
- package/dist/utils/syntax-tags.d.ts.map +0 -1
- package/dist/utils/syntax-tags.js +0 -5
- 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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
vec2
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
7
|
+
"use strict";var __exports__=(()=>{var Vt=Object.create;var Q=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,qt=Object.prototype.hasOwnProperty;var Fe=(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 Ut(e))!qt.call(o,s)&&s!==t&&Q(o,s,{get:()=>e[s],enumerable:!(r=zt(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?Vt(Gt(o)):{},X(e||!o||!o.__esModule?Q(t,"default",{value:o,enumerable:!0}):t,o)),Ht=o=>X(Q({},"__esModule",{value:!0}),o);var _=Fe((Br,Oe)=>{Oe.exports=globalThis.deck});var qe=Fe((Gr,Ge)=>{Ge.exports=globalThis.luma});var Z={};Ae(Z,{BrushingExtension:()=>Re,ClipExtension:()=>yt,CollisionFilterExtension:()=>Ft,DataFilterExtension:()=>Xe,FillStyleExtension:()=>vt,Fp64Extension:()=>ft,MaskExtension:()=>Ct,PathStyleExtension:()=>dt,_TerrainExtension:()=>jt,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 Se=d(_(),1),Ce=`uniform brushingUniforms {
|
|
8
|
+
bool enabled;
|
|
9
|
+
highp int target;
|
|
10
|
+
vec2 mousePos;
|
|
11
|
+
float radius;
|
|
12
|
+
} brushing;
|
|
13
|
+
`,Yt=`
|
|
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
|
+
`,Wt=`
|
|
37
|
+
${Ce}
|
|
38
|
+
${Yt}
|
|
39
|
+
`,Kt=`
|
|
40
|
+
in float brushing_isVisible;
|
|
41
|
+
`,$t=`
|
|
42
|
+
${Ce}
|
|
43
|
+
${Kt}
|
|
44
|
+
`,Zt={source:0,target:1,custom:2,source_target:3},Xt={"vs:DECKGL_FILTER_GL_POSITION":`
|
|
45
|
+
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
|
-
`},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
68
|
+
`},Ie={name:"brushing",dependencies:[Se.project],vs:Wt,fs:$t,inject:Xt,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:Zt[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 Qt={getBrushingTarget:{type:"accessor",value:[0,0]},brushingTarget:"source",brushingEnabled:!0,brushingRadius:1e4},S=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})}};S.defaultProps=Qt;S.extensionName="BrushingExtension";var Re=S;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 ivec4 categoryBitMask;
|
|
85
|
+
#endif
|
|
86
|
+
} dataFilter;
|
|
87
|
+
`,Jt=`
|
|
61
88
|
#ifdef DATAFILTER_TYPE
|
|
62
|
-
|
|
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 (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
dataFilter_value = dataFilter_reduceValue(
|
|
105
|
-
|
|
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 =
|
|
114
|
-
#elif DATACATEGORY_CHANNELS == 2
|
|
115
|
-
ivec2 dataFilter_masks = ivec2(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
);
|
|
119
|
-
#elif DATACATEGORY_CHANNELS == 3
|
|
120
|
-
ivec3 dataFilter_masks =
|
|
121
|
-
#else
|
|
122
|
-
ivec4 dataFilter_masks =
|
|
123
|
-
#endif
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if
|
|
130
|
-
|
|
131
|
-
|
|
139
|
+
void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
|
|
140
|
+
#if DATACATEGORY_CHANNELS == 1 // One 128-bit mask
|
|
141
|
+
int dataFilter_masks = dataFilter.categoryBitMask[int(category / 32.0)];
|
|
142
|
+
#elif DATACATEGORY_CHANNELS == 2 // Two 64-bit masks
|
|
143
|
+
ivec2 dataFilter_masks = ivec2(
|
|
144
|
+
dataFilter.categoryBitMask[int(category.x / 32.0)],
|
|
145
|
+
dataFilter.categoryBitMask[int(category.y / 32.0) + 2]
|
|
146
|
+
);
|
|
147
|
+
#elif DATACATEGORY_CHANNELS == 3 // Three 32-bit masks
|
|
148
|
+
ivec3 dataFilter_masks = dataFilter.categoryBitMask.xyz;
|
|
149
|
+
#else // Four 32-bit masks
|
|
150
|
+
ivec4 dataFilter_masks = dataFilter.categoryBitMask;
|
|
151
|
+
#endif
|
|
152
|
+
|
|
153
|
+
// Shift mask and extract relevant bits
|
|
154
|
+
DATACATEGORY_TYPE dataFilter_bits = DATACATEGORY_TYPE(dataFilter_masks) / pow(DATACATEGORY_TYPE(2.0), mod(category, 32.0));
|
|
155
|
+
dataFilter_bits = mod(floor(dataFilter_bits), 2.0);
|
|
156
|
+
|
|
157
|
+
#if DATACATEGORY_CHANNELS == 1
|
|
158
|
+
if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
|
|
159
|
+
#else
|
|
160
|
+
if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
|
|
161
|
+
#endif
|
|
162
|
+
}
|
|
132
163
|
#endif
|
|
133
|
-
`,
|
|
134
|
-
|
|
164
|
+
`,Ne=`
|
|
165
|
+
${we}
|
|
166
|
+
${Jt}
|
|
167
|
+
`,eo=`
|
|
135
168
|
in float dataFilter_value;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
#
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
#endif
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
`,"vs
|
|
158
|
-
if (
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
`,"
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
169
|
+
`,Be=`
|
|
170
|
+
${we}
|
|
171
|
+
${eo}
|
|
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 to(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:to,uniformTypesFromOptions:Ve};var He=d(qe(),1),oo=`#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
|
-
`,
|
|
234
|
+
`,ro=`#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
|
+
`,so=["float32-renderable-webgl","texture-blend-float-webgl"];function Ye(o){return so.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:oo,fs:ro,bufferLayout:e,...t})}var $e={blend:!0,blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one",blendColorOperation:"add",blendAlphaOperation:"add",depthCompare:"never"};var no={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},ao={categorySize:0,filterSize:1,fp64:!1,countItems:!1},Ze={1:"float",2:"vec2",3:"vec3",4:"vec4"},C=class extends E.LayerExtension{constructor(e={}){super({...ao,...e})}getShaders(e){let{categorySize:t,filterSize:r,fp64:s}=e.opts,i={};t&&(i.DATACATEGORY_TYPE=Ze[t],i.DATACATEGORY_CHANNELS=t),r&&(i.DATAFILTER_TYPE=Ze[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",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),Te=0;for(let de=0;de<Me.length;de++)Te+=Me[de];n({id:this.id,count:Te}),this.state.filterNeedsUpdate=!1}}finalizeState(){let e=this.state.filterFBO,t=this.state.filterModel;e?.destroy(),t?.destroy()}_updateCategoryBitMask(e,t){let{categorySize:r}=t.opts;if(!r)return;let{filterCategories: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]}};C.defaultProps=no;C.extensionName="DataFilterExtension";var Xe=C;var w=d(_(),1);var Yr=1/Math.PI*180,Wr=1/180*Math.PI,lo={EPSILON:1e-12,debug:!1,precision:4,printTypes:!1,printDegrees:!1,printRowMajor:!0,_cartographicRadians:!1};globalThis.mathgl=globalThis.mathgl||{config:{...lo}};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 $r=Math.PI/180;var R={};Ae(R,{add:()=>mo,angle:()=>Do,bezier:()=>So,ceil:()=>ho,clone:()=>fo,copy:()=>po,create:()=>Qe,cross:()=>Fo,dist:()=>Yo,distance:()=>rt,div:()=>Ho,divide:()=>ot,dot:()=>ve,equals:()=>Uo,exactEquals:()=>zo,floor:()=>vo,forEach:()=>Zo,fromValues:()=>uo,hermite:()=>Lo,inverse:()=>Mo,len:()=>Ko,length:()=>Je,lerp:()=>Ao,max:()=>xo,min:()=>go,mul:()=>qo,multiply:()=>tt,negate:()=>Eo,normalize:()=>To,random:()=>Co,rotateX:()=>wo,rotateY:()=>No,rotateZ:()=>Bo,round:()=>yo,scale:()=>Po,scaleAndAdd:()=>bo,set:()=>_o,slerp:()=>Oo,sqrDist:()=>Wo,sqrLen:()=>$o,squaredDistance:()=>st,squaredLength:()=>it,str:()=>Vo,sub:()=>Go,subtract:()=>et,transformMat3:()=>ko,transformMat4:()=>Io,transformQuat:()=>Ro,zero:()=>jo});function Qe(){let o=new k(3);return k!=Float32Array&&(o[0]=0,o[1]=0,o[2]=0),o}function fo(o){let e=new k(3);return e[0]=o[0],e[1]=o[1],e[2]=o[2],e}function Je(o){let e=o[0],t=o[1],r=o[2];return Math.sqrt(e*e+t*t+r*r)}function uo(o,e,t){let r=new k(3);return r[0]=o,r[1]=e,r[2]=t,r}function po(o,e){return o[0]=e[0],o[1]=e[1],o[2]=e[2],o}function _o(o,e,t,r){return o[0]=e,o[1]=t,o[2]=r,o}function mo(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 ot(o,e,t){return o[0]=e[0]/t[0],o[1]=e[1]/t[1],o[2]=e[2]/t[2],o}function ho(o,e){return o[0]=Math.ceil(e[0]),o[1]=Math.ceil(e[1]),o[2]=Math.ceil(e[2]),o}function vo(o,e){return o[0]=Math.floor(e[0]),o[1]=Math.floor(e[1]),o[2]=Math.floor(e[2]),o}function go(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 xo(o,e,t){return o[0]=Math.max(e[0],t[0]),o[1]=Math.max(e[1],t[1]),o[2]=Math.max(e[2],t[2]),o}function yo(o,e){return o[0]=J(e[0]),o[1]=J(e[1]),o[2]=J(e[2]),o}function Po(o,e,t){return o[0]=e[0]*t,o[1]=e[1]*t,o[2]=e[2]*t,o}function bo(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 rt(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 st(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 it(o){let e=o[0],t=o[1],r=o[2];return e*e+t*t+r*r}function Eo(o,e){return o[0]=-e[0],o[1]=-e[1],o[2]=-e[2],o}function Mo(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 Fo(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 Ao(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 Oo(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 Lo(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 Co(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 Io(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 ko(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 Ro(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 wo(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 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[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 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[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 Do(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 jo(o){return o[0]=0,o[1]=0,o[2]=0,o}function Vo(o){return`vec3(${o[0]}, ${o[1]}, ${o[2]})`}function zo(o,e){return o[0]===e[0]&&o[1]===e[1]&&o[2]===e[2]}function Uo(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 Go=et,qo=tt,Ho=ot,Yo=rt,Wo=st,Ko=Je,$o=it,Zo=function(){let o=Qe();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 nt=`
|
|
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
|
-
|
|
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
|
-
|
|
329
|
-
float
|
|
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
|
|
416
|
+
`;var at=`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
|
-
|
|
362
|
-
const vec2
|
|
363
|
-
const vec2
|
|
364
|
-
const vec2
|
|
365
|
-
const vec2
|
|
366
|
-
const vec2
|
|
367
|
-
const vec2
|
|
368
|
-
const vec2
|
|
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
|
-
|
|
391
|
-
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
s = sum_fp64(
|
|
408
|
-
p = mul_fp64(p, r);
|
|
409
|
-
t = mul_fp64(p,
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
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
|
-
|
|
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
|
-
|
|
433
|
-
|
|
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
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
r = mul_fp64(r, x);
|
|
447
|
-
t = mul_fp64(r,
|
|
448
|
-
s = sum_fp64(s, t);
|
|
449
|
-
|
|
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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
r =
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
r = mul_fp64(r, x);
|
|
463
|
-
t = mul_fp64(r,
|
|
464
|
-
s = sum_fp64(s, t);
|
|
465
|
-
|
|
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
|
-
|
|
473
|
-
|
|
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
|
-
|
|
480
|
-
|
|
481
|
-
vec2
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
}
|
|
501
|
-
|
|
502
|
-
if (
|
|
503
|
-
return
|
|
504
|
-
} else {
|
|
505
|
-
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
|
|
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
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
result = sub_fp64(mul_fp64(u,
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
result =
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
result = -sum_fp64(mul_fp64(
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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
|
-
|
|
573
|
-
|
|
574
|
-
vec2
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
if (
|
|
596
|
-
return
|
|
597
|
-
} else {
|
|
598
|
-
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
|
|
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
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
result =
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
result =
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
result =
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
result =
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
|
|
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
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
t = sub_fp64(
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
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
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
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
|
-
|
|
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
|
-
|
|
794
|
-
v[
|
|
795
|
-
|
|
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
|
-
|
|
820
|
-
out_val[1].
|
|
821
|
-
out_val[
|
|
822
|
-
|
|
823
|
-
out_val[
|
|
824
|
-
out_val[
|
|
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
|
-
|
|
840
|
-
v[
|
|
841
|
-
v[
|
|
842
|
-
v[
|
|
843
|
-
|
|
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
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
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
|
|
857
|
-
uniform
|
|
1085
|
+
`;var Xo={ONE:1},lt={name:"fp64arithmetic",vs:nt,defaultUniforms:Xo,uniformTypes:{ONE:"f32"},fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe},te={name:"fp64",vs:at,dependencies:[lt],fp64ify:ee,fp64LowPart:ge,fp64ifyMatrix4:xe};var oe=d(_(),1);var ct=`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
|
-
|
|
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:
|
|
1158
|
+
`;var{fp64ify:Qo,fp64ifyMatrix4:Jo}=te,re={name:"project64",dependencies:[oe.project,te],vs:ct,getUniforms:tr,uniformTypes:{scale:"vec2<f32>",viewProjectionMatrix:"mat4x4<f32>",viewProjectionMatrix64Low:"mat4x4<f32>"}},er=(0,oe._memoize)(or);function tr(o){if(o&&"viewport"in o){let{viewProjectionMatrix:e,scale:t}=o.viewport;return er({viewProjectionMatrix:e,scale:t})}return{}}function or({viewProjectionMatrix:o,scale:e}){let t=Jo(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:Qo(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 ft=se;var N=d(_(),1);var ut={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
|
|
926
|
-
|
|
927
|
-
|
|
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
|
-
`}},
|
|
1204
|
+
`}},pt={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
|
|
1221
|
+
`}};var rr={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,ut)),e.opts.offset&&(t=(0,N._mergeShaders)(t,pt));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=rr;B.extensionName="PathStyleExtension";var dt=B;var ht=d(_(),1);var T=d(_(),1),_t=`uniform fillUniforms {
|
|
1222
|
+
vec2 patternTextureSize;
|
|
1223
|
+
bool patternEnabled;
|
|
1224
|
+
bool patternMask;
|
|
1225
|
+
vec2 uvCoordinateOrigin;
|
|
1226
|
+
vec2 uvCoordinateOrigin64Low;
|
|
1227
|
+
} fill;
|
|
1228
|
+
`,sr=`
|
|
979
1229
|
in vec4 fillPatternFrames;
|
|
980
1230
|
in float fillPatternScales;
|
|
981
1231
|
in vec2 fillPatternOffsets;
|
|
982
|
-
|
|
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
|
-
`,
|
|
988
|
-
|
|
989
|
-
|
|
1236
|
+
`,ir=`
|
|
1237
|
+
${_t}
|
|
1238
|
+
${sr}
|
|
1239
|
+
`,nr=`
|
|
990
1240
|
uniform sampler2D fill_patternTexture;
|
|
991
|
-
|
|
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
|
-
`,
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
vec2
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1247
|
+
`,ar=`
|
|
1248
|
+
${_t}
|
|
1249
|
+
${nr}
|
|
1250
|
+
`,lr={"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 cr(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=T.project.getUniforms(o.project),{commonOrigin:i}=s,n=[(0,T.fp64LowPart)(i[0]),(0,T.fp64LowPart)(i[1])];e.uvCoordinateOrigin=i.slice(0,2),e.uvCoordinateOrigin64Low=n,e.patternMask=t,e.patternEnabled=r}return e}var mt={name:"fill",vs:ir,fs:ar,inject:lr,dependencies:[T.project],getUniforms:cr,uniformTypes:{patternTextureSize:"vec2<f32>",patternEnabled:"i32",patternMask:"i32",uvCoordinateOrigin:"vec2<f32>",uvCoordinateOrigin64Low:"vec2<f32>"}};var fr={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 ht.LayerExtension{constructor({pattern:e=!1}={}){super({pattern:e})}isEnabled(e){return e.getAttributeManager()!==null&&!("pathTesselator"in e.state)}getShaders(e){return e.isEnabled(this)?{modules:[e.opts.pattern&&mt].filter(Boolean)}:null}initializeState(e,t){if(!t.isEnabled(this))return;let 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=fr;D.extensionName="FillStyleExtension";var vt=D;var gt=d(_(),1),ur={clipBounds:[0,0,1,1],clipByInstance:void 0},xt=`
|
|
1273
|
+
uniform clipUniforms {
|
|
1274
|
+
vec4 bounds;
|
|
1275
|
+
} clip;
|
|
1276
|
+
|
|
1019
1277
|
bool clip_isInBounds(vec2 position) {
|
|
1020
|
-
return position.x >=
|
|
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
|
-
`,
|
|
1280
|
+
`,pr={name:"clip",vs:xt,uniformTypes:{bounds:"vec4<f32>"}},dr={"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
|
-
`},
|
|
1287
|
+
if (clip_isVisible < 0.5) discard;
|
|
1288
|
+
`},_r={name:"clip",fs:xt,uniformTypes:{bounds:"vec4<f32>"}},mr={"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
|
-
`},
|
|
1295
|
+
if (!clip_isInBounds(clip_commonPosition)) discard;
|
|
1296
|
+
`},j=class extends gt.LayerExtension{getShaders(){let e="instancePositions"in this.getAttributeManager().attributes;return this.props.clipByInstance!==void 0&&(e=Boolean(this.props.clipByInstance)),this.state.clipByInstance=e,e?{modules:[pr],inject:dr}:{modules:[_r],inject:mr}}draw(){let{clipBounds:e}=this.props,t={};if(this.state.clipByInstance)t.bounds=e;else{let r=this.projectPosition([e[0],e[1],0]),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=ur;j.extensionName="ClipExtension";var yt=j;var Tt=d(_(),1);var Pt=d(_(),1),hr=`
|
|
1039
1297
|
in float collisionPriorities;
|
|
1298
|
+
|
|
1040
1299
|
uniform sampler2D collision_texture;
|
|
1041
|
-
|
|
1042
|
-
uniform
|
|
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 (!
|
|
1055
|
-
return 1.0;
|
|
1056
|
-
}
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
delta
|
|
1067
|
-
|
|
1068
|
-
delta.
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
}
|
|
1073
|
-
|
|
1074
|
-
|
|
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
|
+
`,vr={"vs:#decl":`
|
|
1345
|
+
float collision_fade = 1.0;
|
|
1075
1346
|
`,"vs:DECKGL_FILTER_GL_POSITION":`
|
|
1076
|
-
if (
|
|
1077
|
-
float collisionPriority = collisionPriorities;
|
|
1078
|
-
position.z = -0.001 * collisionPriority * position.w;
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
uniform
|
|
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
|
+
`},gr=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}},bt={name:"collision",dependencies:[Pt.project],vs:hr,inject:vr,getUniforms:gr,uniformTypes:{sort:"i32",enabled:"i32"}};var Mt=d(_(),1);var Et=d(_(),1),V=class extends Et._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,depthRange:[0,1],depthTest:!0}}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,Mt._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 xr={getCollisionPriority:{type:"accessor",value:0},collisionEnabled:!0,collisionGroup:{type:"string",value:"default"},collisionTestProps:{}},U=class extends Tt.LayerExtension{getShaders(){return{modules:[bt]}}draw({shaderModuleProps:e}){e.collision?.drawToCollisionMap&&(this.props=this.clone(this.props.collisionTestProps).props)}initializeState(e,t){if(this.getAttributeManager()===null)return;this.context.deck?._addDefaultEffect(new z),this.getAttributeManager().add({collisionPriorities:{size:1,stepMode:"dynamic",accessor:"getCollisionPriority"}})}getNeedsPickingBuffer(){return this.props.collisionEnabled}};U.defaultProps=xr;U.extensionName="CollisionFilterExtension";var Ft=U;var P=d(_(),1);var At=d(_(),1),Ot=`uniform maskUniforms {
|
|
1364
|
+
vec4 bounds;
|
|
1365
|
+
highp int channel;
|
|
1366
|
+
bool enabled;
|
|
1367
|
+
bool inverted;
|
|
1368
|
+
bool maskByInstance;
|
|
1369
|
+
} mask;
|
|
1370
|
+
`,yr=`
|
|
1093
1371
|
vec2 mask_getCoords(vec4 position) {
|
|
1094
|
-
return (position.xy -
|
|
1372
|
+
return (position.xy - mask.bounds.xy) / (mask.bounds.zw - mask.bounds.xy);
|
|
1095
1373
|
}
|
|
1096
|
-
`,
|
|
1374
|
+
`,Pr=`
|
|
1375
|
+
${Ot}
|
|
1376
|
+
${yr}
|
|
1377
|
+
`,br=`
|
|
1097
1378
|
uniform sampler2D mask_texture;
|
|
1098
|
-
|
|
1099
|
-
uniform bool mask_enabled;
|
|
1100
|
-
uniform bool mask_inverted;
|
|
1379
|
+
|
|
1101
1380
|
bool mask_isInBounds(vec2 texCoords) {
|
|
1102
|
-
if (!
|
|
1103
|
-
return true;
|
|
1104
|
-
}
|
|
1105
|
-
vec4 maskColor = texture(mask_texture, texCoords);
|
|
1106
|
-
float maskValue = 1.0;
|
|
1107
|
-
if (
|
|
1108
|
-
maskValue = maskColor.r;
|
|
1109
|
-
} else if (
|
|
1110
|
-
maskValue = maskColor.g;
|
|
1111
|
-
} else if (
|
|
1112
|
-
maskValue = maskColor.b;
|
|
1113
|
-
} else if (
|
|
1114
|
-
maskValue = maskColor.a;
|
|
1115
|
-
}
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
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
|
-
`,
|
|
1402
|
+
`,Er=`
|
|
1403
|
+
${Ot}
|
|
1404
|
+
${br}
|
|
1405
|
+
`,Mr={"vs:#decl":`
|
|
1123
1406
|
out vec2 mask_texCoords;
|
|
1124
1407
|
`,"vs:#main-end":`
|
|
1125
|
-
vec4 mask_common_position;
|
|
1126
|
-
if (
|
|
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 (
|
|
1136
|
-
bool mask = mask_isInBounds(mask_texCoords);
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
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||{},Lt={name:"mask",dependencies:[At.project],vs:Pr,fs:Er,inject:Mr,getUniforms:Tr,uniformTypes:{bounds:"vec4<f32>",channel:"i32",enabled:"i32",inverted:"i32",maskByInstance:"i32"}};var Pe=d(_(),1);var St=d(_(),1),Fr={blendColorOperation:"subtract",blendColorSrcFactor:"zero",blendColorDstFactor:"one",blendAlphaOperation:"subtract",blendAlphaSrcFactor:"zero",blendAlphaDstFactor:"one"},G=class extends St._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,depthTest:!1,...Fr}}shouldDrawLayer(e){return e.props.operation.includes("mask")}delete(){this.fbo.delete(),this.maskMap.delete()}};var ie=d(_(),1);function F(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 Ar=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=Ar-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 Or(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=Or(e,t),s=Lr(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 Lr(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=F(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:[Lt]}}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 Dt=d(_(),1);var Bt=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},Cr=Object.keys(x).map(o=>`const float TERRAIN_MODE_${o} = ${x[o]}.0;`).join(`
|
|
1428
|
+
`),It=Cr+`
|
|
1429
|
+
uniform terrainUniforms {
|
|
1430
|
+
float mode;
|
|
1431
|
+
vec4 bounds;
|
|
1432
|
+
} terrain;
|
|
1433
|
+
|
|
1143
1434
|
uniform sampler2D terrain_map;
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
gl_Position = vec4(0.0);
|
|
1149
|
-
return;
|
|
1435
|
+
`,Y={name:"terrain",dependencies:[be.project],vs:It+"out vec3 commonPos;",fs:It+"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 (
|
|
1154
|
-
vec2 texCoords = (commonPos.xy -
|
|
1155
|
-
position = vec4(texCoords * 2.0 - 1.0, 0.0, 1.0);
|
|
1156
|
-
commonPos.z +=
|
|
1157
|
-
}
|
|
1158
|
-
if (
|
|
1159
|
-
vec3 anchor = geometry.worldPosition;
|
|
1160
|
-
anchor.z = 0.0;
|
|
1161
|
-
vec3 anchorCommon = project_position(anchor);
|
|
1162
|
-
vec2 texCoords = (anchorCommon.xy -
|
|
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
|
-
|
|
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=kt(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?Ir(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=F([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 Ir(o,e){return e.filter(t=>{let r=kt(t);return r?kr(o.boundingBox,r.boundingBox):!0})}function kt(o){for(;o;){let{tile:e}=o.props;if(e)return e;o=o.parent}return null}function kr(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 Rt=d(_(),1),Rr={blendColorOperation:"max",blendColorSrcFactor:"one",blendColorDstFactor:"one",blendAlphaOperation:"max",blendAlphaSrcFactor:"one",blendAlphaDstFactor:"one"},ae=class extends Rt._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,depthTest:!1,...e.props.operation.includes("terrain")&&Rr}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var wt=d(_(),1),le=class extends wt._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,depthTest:!1}}getShaderModuleProps(e,t,r){return{terrain:{project:r.project}}}};var Nt=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=F(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,Nt),height:Math.min(l,Nt),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):Bt.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 wr={terrainDrawMode:void 0},$=class extends Dt.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=wr;$.extensionName="TerrainExtension";var jt=$;return Ht(Z);})();
|
|
1191
1476
|
return __exports__;
|
|
1192
1477
|
});
|