@openglobus/og 0.12.4 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +0 -2
  2. package/dist/@openglobus/og.esm.js +2 -2
  3. package/dist/@openglobus/og.esm.js.map +1 -1
  4. package/dist/@openglobus/og.umd.js +2 -2
  5. package/dist/@openglobus/og.umd.js.map +1 -1
  6. package/package.json +7 -7
  7. package/src/og/Extent.js +3 -3
  8. package/src/og/Globe.js +277 -275
  9. package/src/og/ImageCanvas.js +3 -3
  10. package/src/og/LonLat.js +9 -9
  11. package/src/og/QueueArray.js +2 -2
  12. package/src/og/Rectangle.js +5 -5
  13. package/src/og/bv/Box.js +1 -1
  14. package/src/og/bv/Sphere.js +2 -2
  15. package/src/og/camera/Camera.js +1 -1
  16. package/src/og/camera/PlanetCamera.js +649 -646
  17. package/src/og/control/LayerSwitcher.js +1 -1
  18. package/src/og/control/MouseNavigation.js +22 -13
  19. package/src/og/control/MouseWheelZoomControl.js +2 -2
  20. package/src/og/control/ScaleControl.js +1 -1
  21. package/src/og/control/TouchNavigation.js +319 -319
  22. package/src/og/control/ZoomControl.js +132 -132
  23. package/src/og/control/visibleExtent/Segment.js +12 -12
  24. package/src/og/ellipsoid/Ellipsoid.js +577 -567
  25. package/src/og/entity/BillboardHandler.js +878 -1051
  26. package/src/og/entity/Entity.js +1 -1
  27. package/src/og/entity/EntityCollection.js +847 -857
  28. package/src/og/entity/GeoObjectHandler.js +2 -2
  29. package/src/og/entity/LabelHandler.js +887 -1040
  30. package/src/og/entity/LabelWorker.js +0 -6
  31. package/src/og/entity/PointCloud.js +495 -495
  32. package/src/og/entity/Polyline.js +2218 -2222
  33. package/src/og/entity/RayHandler.js +1 -1
  34. package/src/og/layer/CanvasTiles.js +6 -3
  35. package/src/og/layer/GeoImage.js +1 -1
  36. package/src/og/layer/KML.js +5 -5
  37. package/src/og/layer/Layer.js +800 -752
  38. package/src/og/layer/Vector.js +997 -1010
  39. package/src/og/layer/XYZ.js +359 -357
  40. package/src/og/math/Line2.js +4 -4
  41. package/src/og/math/Quat.js +2 -2
  42. package/src/og/math/Ray.js +2 -2
  43. package/src/og/math/Vec2.js +524 -524
  44. package/src/og/math/Vec3.js +900 -900
  45. package/src/og/math/Vec4.js +261 -261
  46. package/src/og/math.js +397 -398
  47. package/src/og/quadTree/EntityCollectionNode.js +389 -387
  48. package/src/og/renderer/Renderer.js +14 -20
  49. package/src/og/renderer/RendererEvents.js +1034 -1045
  50. package/src/og/scene/Planet.js +12 -9
  51. package/src/og/scene/RenderNode.js +347 -354
  52. package/src/og/segment/Segment.js +3 -1
  53. package/src/og/segment/SegmentLonLat.js +1 -4
  54. package/src/og/shaders/billboard.js +220 -204
  55. package/src/og/shaders/drawnode.js +607 -603
  56. package/src/og/shaders/label.js +576 -456
  57. package/src/og/shaders/polyline.js +365 -361
  58. package/src/og/terrain/MapboxTerrain.js +1 -1
  59. package/src/og/utils/FontAtlas.js +209 -200
  60. package/src/og/utils/GeoImageCreator.js +4 -5
  61. package/src/og/utils/TextureAtlas.js +4 -4
  62. package/src/og/utils/VectorTileCreator.js +414 -414
  63. package/src/og/utils/shared.js +1 -1
  64. package/src/og/webgl/Handler.js +28 -60
  65. package/src/og/webgl/Multisample.js +260 -260
  66. package/src/og/webgl/Program.js +411 -396
  67. package/types/bv/Box.d.ts +1 -1
  68. package/types/bv/Sphere.d.ts +1 -1
  69. package/types/camera/PlanetCamera.d.ts +3 -3
  70. package/types/control/LayerSwitcher.d.ts +1 -1
  71. package/types/ellipsoid/Ellipsoid.d.ts +9 -2
  72. package/types/entity/BillboardHandler.d.ts +0 -4
  73. package/types/entity/EntityCollection.d.ts +0 -8
  74. package/types/entity/LabelHandler.d.ts +0 -2
  75. package/types/entity/Polyline.d.ts +1 -1
  76. package/types/layer/KML.d.ts +11 -11
  77. package/types/layer/Layer.d.ts +4 -0
  78. package/types/layer/Vector.d.ts +1 -8
  79. package/types/math/Line2.d.ts +4 -4
  80. package/types/math/Ray.d.ts +2 -2
  81. package/types/math/Vec2.d.ts +1 -1
  82. package/types/math/Vec3.d.ts +1 -1
  83. package/types/math/Vec4.d.ts +2 -2
  84. package/types/math.d.ts +1 -1
  85. package/types/renderer/Renderer.d.ts +1 -1
  86. package/types/renderer/RendererEvents.d.ts +1 -1
  87. package/types/shaders/label.d.ts +1 -1
  88. package/types/utils/FontAtlas.d.ts +3 -2
  89. package/types/utils/TextureAtlas.d.ts +3 -3
  90. package/types/utils/VectorTileCreator.d.ts +4 -4
  91. package/types/utils/shared.d.ts +1 -1
  92. package/types/webgl/Handler.d.ts +6 -31
  93. package/types/webgl/Program.d.ts +2 -0
@@ -1,362 +1,366 @@
1
- /**
2
- * @module og/shaders/polyline
3
- */
4
-
5
- 'use strict';
6
-
7
- import { Program } from '../webgl/Program.js';
8
-
9
- export function polyline_screen() {
10
- return new Program("polyline_screen", {
11
- uniforms: {
12
- viewport: "vec2",
13
- proj: "mat4",
14
- view: "mat4",
15
- eyePositionHigh: "vec3",
16
- eyePositionLow: "vec3",
17
- uFloatParams: "vec2",
18
- thickness: "float",
19
- opacity: "float"
20
- },
21
- attributes: {
22
- prevHigh: "vec3",
23
- currentHigh: "vec3",
24
- nextHigh: "vec3",
25
-
26
- prevLow: "vec3",
27
- currentLow: "vec3",
28
- nextLow: "vec3",
29
-
30
- order: "float",
31
-
32
- color: "vec4"
33
- },
34
-
35
- vertexShader:
36
- `precision highp float;
37
-
38
- attribute vec3 prevHigh;
39
- attribute vec3 currentHigh;
40
- attribute vec3 nextHigh;
41
-
42
- attribute vec3 prevLow;
43
- attribute vec3 currentLow;
44
- attribute vec3 nextLow;
45
-
46
- attribute float order;
47
-
48
- attribute vec4 color;
49
-
50
- uniform float thickness;
51
- uniform mat4 proj;
52
- uniform mat4 view;
53
- uniform vec2 viewport;
54
- uniform vec3 eyePositionHigh;
55
- uniform vec3 eyePositionLow;
56
- uniform float opacity;
57
-
58
- varying vec4 vColor;
59
- varying vec3 vPos;
60
- varying vec3 uCamPos;
61
-
62
- const float NEAR = -1.0;
63
-
64
- vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){
65
- vec2 dir = end2 - start2;
66
- vec2 perp = vec2(-dir.y, dir.x);
67
- float d2 = dot(perp, start2);
68
- float seg = dot(perp, start1) - d2;
69
- float prl = seg - dot(perp, end1) + d2;
70
- if(prl > -1.0 && prl < 1.0){
71
- return start1;
72
- }
73
- float u = seg / prl;
74
- return start1 + u * (end1 - start1);
75
- }
76
-
77
- vec2 project(vec4 p){
78
- return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
79
- }
80
-
81
- void main(){
82
-
83
- uCamPos = eyePositionHigh + eyePositionLow;
84
-
85
- vColor = vec4(color.rgb, color.a * opacity);
86
-
87
- vec3 current = currentHigh + currentLow;
88
-
89
- vPos = current;
90
-
91
- mat4 viewMatrixRTE = view;
92
- viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
93
-
94
- vec3 highDiff, lowDiff;
95
-
96
- highDiff = currentHigh - eyePositionHigh;
97
- lowDiff = currentLow - eyePositionLow;
98
- vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
99
-
100
- highDiff = prevHigh - eyePositionHigh;
101
- lowDiff = prevLow - eyePositionLow;
102
- vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
103
-
104
- highDiff = nextHigh - eyePositionHigh;
105
- lowDiff = nextLow - eyePositionLow;
106
- vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
107
-
108
- /*Clip near plane, the point behind view plane*/
109
- if(vCurrent.z > NEAR) {
110
- if(vPrev.z < NEAR && abs(order) == 1.0){
111
- vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);
112
- } else if(vNext.z < NEAR && abs(order) == 2.0){
113
- vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);
114
- }
115
- }
116
-
117
- vec4 dCurrent = proj * vCurrent;
118
- vec2 _next = project(proj * vNext);
119
- vec2 _prev = project(proj * vPrev);
120
- vec2 _current = project(dCurrent);
121
-
122
- if(_prev == _current){
123
- if(_next == _current){
124
- _next = _current + vec2(1.0, 0.0);
125
- _prev = _current - _next;
126
- }else{
127
- _prev = _current + normalize(_current - _next);
128
- }
129
- }
130
-
131
- if(_next == _current){
132
- _next = _current + normalize(_current - _prev);
133
- }
134
-
135
- vec2 sNext = _next,
136
- sCurrent = _current,
137
- sPrev = _prev;
138
-
139
- vec2 dirNext = normalize(sNext - sCurrent);
140
- vec2 dirPrev = normalize(sPrev - sCurrent);
141
- float dotNP = dot(dirNext, dirPrev);
142
-
143
- vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
144
- vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
145
-
146
- float d = thickness * sign(order);
147
-
148
- vec2 m;
149
- if(dotNP >= 0.99991){
150
- m = sCurrent - normalPrev * d;
151
- }else{
152
- m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,
153
- sCurrent + normalNext * d, sNext + normalNext * d );
154
-
155
- if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
156
- float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
157
- if(occw == -1.0){
158
- m = sCurrent + normalPrev * d;
159
- }else if(occw == 1.0){
160
- m = sCurrent + normalNext * d;
161
- }else if(occw == -2.0){
162
- m = sCurrent + normalNext * d;
163
- }else if(occw == 2.0){
164
- m = sCurrent + normalPrev * d;
165
- }
166
- }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
167
- m = sCurrent + normalNext * d;
168
- }
169
- }
170
-
171
- gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z, dCurrent.w);
172
- }`,
173
-
174
- fragmentShader:
175
- `precision highp float;
176
- uniform vec2 uFloatParams;
177
- varying vec3 uCamPos;
178
- varying vec4 vColor;
179
- varying vec3 vPos;
180
- void main() {
181
- vec3 look = vPos - uCamPos;
182
- float lookLength = length(look);
183
- float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
184
- gl_FragColor = vec4(vColor.rgb, a);
185
- }`
186
- });
187
- }
188
-
189
- export function polyline_picking() {
190
- return new Program("polyline_picking", {
191
- uniforms: {
192
- viewport: "vec2",
193
- proj: "mat4",
194
- view: "mat4",
195
- eyePositionHigh: "vec3",
196
- eyePositionLow: "vec3",
197
- uFloatParams: "vec2",
198
- color: "vec4",
199
- thickness: "float"
200
- },
201
- attributes: {
202
- prevHigh: "vec3",
203
- currentHigh: "vec3",
204
- nextHigh: "vec3",
205
-
206
- prevLow: "vec3",
207
- currentLow: "vec3",
208
- nextLow: "vec3",
209
-
210
- order: "float"
211
- },
212
-
213
- vertexShader:
214
- `precision highp float;
215
-
216
- attribute vec3 prevHigh;
217
- attribute vec3 currentHigh;
218
- attribute vec3 nextHigh;
219
-
220
- attribute vec3 prevLow;
221
- attribute vec3 currentLow;
222
- attribute vec3 nextLow;
223
-
224
- attribute float order;
225
-
226
- uniform float thickness;
227
- uniform vec4 color;
228
- uniform mat4 proj;
229
- uniform mat4 view;
230
- uniform vec2 viewport;
231
- uniform vec3 eyePositionHigh;
232
- uniform vec3 eyePositionLow;
233
-
234
- varying vec4 vColor;
235
- varying vec3 vPos;
236
- varying vec3 uCamPos;
237
-
238
-
239
- const float NEAR = -1.0;
240
-
241
- vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){
242
- vec2 dir = end2 - start2;
243
- vec2 perp = vec2(-dir.y, dir.x);
244
- float d2 = dot(perp, start2);
245
- float seg = dot(perp, start1) - d2;
246
- float prl = seg - dot(perp, end1) + d2;
247
- if(prl > -1.0 && prl < 1.0){
248
- return start1;
249
- }
250
- float u = seg / prl;
251
- return start1 + u * (end1 - start1);
252
- }
253
-
254
- vec2 project(vec4 p){
255
- return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
256
- }
257
-
258
- void main(){
259
-
260
- uCamPos = eyePositionHigh + eyePositionLow;
261
-
262
- vColor = color;
263
-
264
- vec3 current = currentHigh + currentLow;
265
-
266
- vPos = current;
267
-
268
- vec3 highDiff, lowDiff;
269
-
270
- mat4 viewMatrixRTE = view;
271
- viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
272
-
273
- highDiff = currentHigh - eyePositionHigh;
274
- lowDiff = currentLow - eyePositionLow;
275
- vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
276
-
277
- highDiff = prevHigh - eyePositionHigh;
278
- lowDiff = prevLow - eyePositionLow;
279
- vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
280
-
281
- highDiff = nextHigh - eyePositionHigh;
282
- lowDiff = nextLow - eyePositionLow;
283
- vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
284
-
285
- /*Clip near plane*/
286
- if(vCurrent.z > NEAR) {
287
- if(vPrev.z < NEAR && abs(order) == 1.0){
288
- vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);
289
- } else if(vNext.z < NEAR && abs(order) == 2.0){
290
- vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);
291
- }
292
- }
293
-
294
- vec4 dCurrent = proj * vCurrent;
295
- vec2 _next = project(proj * vNext);
296
- vec2 _prev = project(proj * vPrev);
297
- vec2 _current = project(dCurrent);
298
- if(_prev == _current){
299
- if(_next == _current){
300
- _next = _current + vec2(1.0, 0.0);
301
- _prev = _current - _next;
302
- }else{
303
- _prev = _current + normalize(_current - _next);
304
- }
305
- }
306
- if(_next == _current){
307
- _next = _current + normalize(_current - _prev);
308
- }
309
-
310
- vec2 sNext = _next,
311
- sCurrent = _current,
312
- sPrev = _prev;
313
-
314
- vec2 dirNext = normalize(sNext - sCurrent);
315
- vec2 dirPrev = normalize(sPrev - sCurrent);
316
- float dotNP = dot(dirNext, dirPrev);
317
-
318
- vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
319
- vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
320
-
321
- float d = thickness * sign(order);
322
-
323
- vec2 m;
324
- if(dotNP >= 0.99991){
325
- m = sCurrent - normalPrev * d;
326
- }else{
327
- m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,
328
- sCurrent + normalNext * d, sNext + normalNext * d );
329
-
330
- if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
331
- float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
332
- if(occw == -1.0){
333
- m = sCurrent + normalPrev * d;
334
- }else if(occw == 1.0){
335
- m = sCurrent + normalNext * d;
336
- }else if(occw == -2.0){
337
- m = sCurrent + normalNext * d;
338
- }else if(occw == 2.0){
339
- m = sCurrent + normalPrev * d;
340
- }
341
- }
342
- else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
343
- m = sCurrent + normalNext * d;
344
- }
345
- }
346
- gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z, dCurrent.w);
347
- }`,
348
-
349
- fragmentShader:
350
- `precision highp float;
351
- uniform vec2 uFloatParams;
352
- varying vec3 uCamPos;
353
- varying vec4 vColor;
354
- varying vec3 vPos;
355
- void main() {
356
- vec3 look = vPos - uCamPos;
357
- float lookLength = length(look);
358
- float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
359
- gl_FragColor = vec4(vColor.rgb, a);
360
- }`
361
- });
1
+ /**
2
+ * @module og/shaders/polyline
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ import { Program } from '../webgl/Program.js';
8
+
9
+ export function polyline_screen() {
10
+ return new Program("polyline_screen", {
11
+ uniforms: {
12
+ viewport: "vec2",
13
+ proj: "mat4",
14
+ view: "mat4",
15
+ eyePositionHigh: "vec3",
16
+ eyePositionLow: "vec3",
17
+ uFloatParams: "vec2",
18
+ thickness: "float",
19
+ opacity: "float",
20
+ depthOffset: "float"
21
+ },
22
+ attributes: {
23
+ prevHigh: "vec3",
24
+ currentHigh: "vec3",
25
+ nextHigh: "vec3",
26
+
27
+ prevLow: "vec3",
28
+ currentLow: "vec3",
29
+ nextLow: "vec3",
30
+
31
+ order: "float",
32
+
33
+ color: "vec4"
34
+ },
35
+
36
+ vertexShader:
37
+ `precision highp float;
38
+
39
+ attribute vec3 prevHigh;
40
+ attribute vec3 currentHigh;
41
+ attribute vec3 nextHigh;
42
+
43
+ attribute vec3 prevLow;
44
+ attribute vec3 currentLow;
45
+ attribute vec3 nextLow;
46
+
47
+ attribute float order;
48
+
49
+ attribute vec4 color;
50
+
51
+ uniform float thickness;
52
+ uniform mat4 proj;
53
+ uniform mat4 view;
54
+ uniform vec2 viewport;
55
+ uniform vec3 eyePositionHigh;
56
+ uniform vec3 eyePositionLow;
57
+ uniform float opacity;
58
+ uniform float depthOffset;
59
+
60
+ varying vec4 vColor;
61
+ varying vec3 vPos;
62
+ varying vec3 uCamPos;
63
+
64
+ const float NEAR = -1.0;
65
+
66
+ vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){
67
+ vec2 dir = end2 - start2;
68
+ vec2 perp = vec2(-dir.y, dir.x);
69
+ float d2 = dot(perp, start2);
70
+ float seg = dot(perp, start1) - d2;
71
+ float prl = seg - dot(perp, end1) + d2;
72
+ if(prl > -1.0 && prl < 1.0){
73
+ return start1;
74
+ }
75
+ float u = seg / prl;
76
+ return start1 + u * (end1 - start1);
77
+ }
78
+
79
+ vec2 project(vec4 p){
80
+ return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
81
+ }
82
+
83
+ void main(){
84
+
85
+ uCamPos = eyePositionHigh + eyePositionLow;
86
+
87
+ vColor = vec4(color.rgb, color.a * opacity);
88
+
89
+ vec3 current = currentHigh + currentLow;
90
+
91
+ vPos = current;
92
+
93
+ mat4 viewMatrixRTE = view;
94
+ viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
95
+
96
+ vec3 highDiff, lowDiff;
97
+
98
+ highDiff = currentHigh - eyePositionHigh;
99
+ lowDiff = currentLow - eyePositionLow;
100
+ vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
101
+
102
+ highDiff = prevHigh - eyePositionHigh;
103
+ lowDiff = prevLow - eyePositionLow;
104
+ vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
105
+
106
+ highDiff = nextHigh - eyePositionHigh;
107
+ lowDiff = nextLow - eyePositionLow;
108
+ vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
109
+
110
+ /*Clip near plane, the point behind view plane*/
111
+ if(vCurrent.z > NEAR) {
112
+ if(vPrev.z < NEAR && abs(order) == 1.0){
113
+ vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);
114
+ } else if(vNext.z < NEAR && abs(order) == 2.0){
115
+ vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);
116
+ }
117
+ }
118
+
119
+ vec4 dCurrent = proj * vCurrent;
120
+ vec2 _next = project(proj * vNext);
121
+ vec2 _prev = project(proj * vPrev);
122
+ vec2 _current = project(dCurrent);
123
+
124
+ if(_prev == _current){
125
+ if(_next == _current){
126
+ _next = _current + vec2(1.0, 0.0);
127
+ _prev = _current - _next;
128
+ }else{
129
+ _prev = _current + normalize(_current - _next);
130
+ }
131
+ }
132
+
133
+ if(_next == _current){
134
+ _next = _current + normalize(_current - _prev);
135
+ }
136
+
137
+ vec2 sNext = _next,
138
+ sCurrent = _current,
139
+ sPrev = _prev;
140
+
141
+ vec2 dirNext = normalize(sNext - sCurrent);
142
+ vec2 dirPrev = normalize(sPrev - sCurrent);
143
+ float dotNP = dot(dirNext, dirPrev);
144
+
145
+ vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
146
+ vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
147
+
148
+ float d = thickness * sign(order);
149
+
150
+ vec2 m;
151
+ if(dotNP >= 0.99991){
152
+ m = sCurrent - normalPrev * d;
153
+ }else{
154
+ m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,
155
+ sCurrent + normalNext * d, sNext + normalNext * d );
156
+
157
+ if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
158
+ float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
159
+ if(occw == -1.0){
160
+ m = sCurrent + normalPrev * d;
161
+ }else if(occw == 1.0){
162
+ m = sCurrent + normalNext * d;
163
+ }else if(occw == -2.0){
164
+ m = sCurrent + normalNext * d;
165
+ }else if(occw == 2.0){
166
+ m = sCurrent + normalPrev * d;
167
+ }
168
+ }else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
169
+ m = sCurrent + normalNext * d;
170
+ }
171
+ }
172
+
173
+ gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z + depthOffset, dCurrent.w);
174
+ }`,
175
+
176
+ fragmentShader:
177
+ `precision highp float;
178
+ uniform vec2 uFloatParams;
179
+ varying vec3 uCamPos;
180
+ varying vec4 vColor;
181
+ varying vec3 vPos;
182
+ void main() {
183
+ vec3 look = vPos - uCamPos;
184
+ float lookLength = length(look);
185
+ float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
186
+ gl_FragColor = vec4(vColor.rgb, a);
187
+ }`
188
+ });
189
+ }
190
+
191
+ export function polyline_picking() {
192
+ return new Program("polyline_picking", {
193
+ uniforms: {
194
+ viewport: "vec2",
195
+ proj: "mat4",
196
+ view: "mat4",
197
+ eyePositionHigh: "vec3",
198
+ eyePositionLow: "vec3",
199
+ uFloatParams: "vec2",
200
+ color: "vec4",
201
+ thickness: "float",
202
+ depthOffset: "float"
203
+ },
204
+ attributes: {
205
+ prevHigh: "vec3",
206
+ currentHigh: "vec3",
207
+ nextHigh: "vec3",
208
+
209
+ prevLow: "vec3",
210
+ currentLow: "vec3",
211
+ nextLow: "vec3",
212
+
213
+ order: "float"
214
+ },
215
+
216
+ vertexShader:
217
+ `precision highp float;
218
+
219
+ attribute vec3 prevHigh;
220
+ attribute vec3 currentHigh;
221
+ attribute vec3 nextHigh;
222
+
223
+ attribute vec3 prevLow;
224
+ attribute vec3 currentLow;
225
+ attribute vec3 nextLow;
226
+
227
+ attribute float order;
228
+
229
+ uniform float thickness;
230
+ uniform vec4 color;
231
+ uniform mat4 proj;
232
+ uniform mat4 view;
233
+ uniform vec2 viewport;
234
+ uniform vec3 eyePositionHigh;
235
+ uniform vec3 eyePositionLow;
236
+ uniform float depthOffset;
237
+
238
+ varying vec4 vColor;
239
+ varying vec3 vPos;
240
+ varying vec3 uCamPos;
241
+
242
+
243
+ const float NEAR = -1.0;
244
+
245
+ vec2 getIntersection(vec2 start1, vec2 end1, vec2 start2, vec2 end2){
246
+ vec2 dir = end2 - start2;
247
+ vec2 perp = vec2(-dir.y, dir.x);
248
+ float d2 = dot(perp, start2);
249
+ float seg = dot(perp, start1) - d2;
250
+ float prl = seg - dot(perp, end1) + d2;
251
+ if(prl > -1.0 && prl < 1.0){
252
+ return start1;
253
+ }
254
+ float u = seg / prl;
255
+ return start1 + u * (end1 - start1);
256
+ }
257
+
258
+ vec2 project(vec4 p){
259
+ return (0.5 * p.xyz / p.w + 0.5).xy * viewport;
260
+ }
261
+
262
+ void main(){
263
+
264
+ uCamPos = eyePositionHigh + eyePositionLow;
265
+
266
+ vColor = color;
267
+
268
+ vec3 current = currentHigh + currentLow;
269
+
270
+ vPos = current;
271
+
272
+ vec3 highDiff, lowDiff;
273
+
274
+ mat4 viewMatrixRTE = view;
275
+ viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
276
+
277
+ highDiff = currentHigh - eyePositionHigh;
278
+ lowDiff = currentLow - eyePositionLow;
279
+ vec4 vCurrent = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
280
+
281
+ highDiff = prevHigh - eyePositionHigh;
282
+ lowDiff = prevLow - eyePositionLow;
283
+ vec4 vPrev = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
284
+
285
+ highDiff = nextHigh - eyePositionHigh;
286
+ lowDiff = nextLow - eyePositionLow;
287
+ vec4 vNext = viewMatrixRTE * vec4(highDiff + lowDiff, 1.0);
288
+
289
+ /*Clip near plane*/
290
+ if(vCurrent.z > NEAR) {
291
+ if(vPrev.z < NEAR && abs(order) == 1.0){
292
+ vCurrent = vPrev + (vCurrent - vPrev) * (NEAR - vPrev.z) / (vCurrent.z - vPrev.z);
293
+ } else if(vNext.z < NEAR && abs(order) == 2.0){
294
+ vCurrent = vNext + (vCurrent - vNext) * (NEAR - vNext.z) / (vCurrent.z - vNext.z);
295
+ }
296
+ }
297
+
298
+ vec4 dCurrent = proj * vCurrent;
299
+ vec2 _next = project(proj * vNext);
300
+ vec2 _prev = project(proj * vPrev);
301
+ vec2 _current = project(dCurrent);
302
+ if(_prev == _current){
303
+ if(_next == _current){
304
+ _next = _current + vec2(1.0, 0.0);
305
+ _prev = _current - _next;
306
+ }else{
307
+ _prev = _current + normalize(_current - _next);
308
+ }
309
+ }
310
+ if(_next == _current){
311
+ _next = _current + normalize(_current - _prev);
312
+ }
313
+
314
+ vec2 sNext = _next,
315
+ sCurrent = _current,
316
+ sPrev = _prev;
317
+
318
+ vec2 dirNext = normalize(sNext - sCurrent);
319
+ vec2 dirPrev = normalize(sPrev - sCurrent);
320
+ float dotNP = dot(dirNext, dirPrev);
321
+
322
+ vec2 normalNext = normalize(vec2(-dirNext.y, dirNext.x));
323
+ vec2 normalPrev = normalize(vec2(dirPrev.y, -dirPrev.x));
324
+
325
+ float d = thickness * sign(order);
326
+
327
+ vec2 m;
328
+ if(dotNP >= 0.99991){
329
+ m = sCurrent - normalPrev * d;
330
+ }else{
331
+ m = getIntersection( sCurrent + normalPrev * d, sPrev + normalPrev * d,
332
+ sCurrent + normalNext * d, sNext + normalNext * d );
333
+
334
+ if( dotNP > 0.5 && dot(dirNext + dirPrev, m - sCurrent) < 0.0 ){
335
+ float occw = order * sign(dirNext.x * dirPrev.y - dirNext.y * dirPrev.x);
336
+ if(occw == -1.0){
337
+ m = sCurrent + normalPrev * d;
338
+ }else if(occw == 1.0){
339
+ m = sCurrent + normalNext * d;
340
+ }else if(occw == -2.0){
341
+ m = sCurrent + normalNext * d;
342
+ }else if(occw == 2.0){
343
+ m = sCurrent + normalPrev * d;
344
+ }
345
+ }
346
+ else if(distance(sCurrent, m) > min(distance(sCurrent, sNext), distance(sCurrent, sPrev))){
347
+ m = sCurrent + normalNext * d;
348
+ }
349
+ }
350
+ gl_Position = vec4((2.0 * m / viewport - 1.0) * dCurrent.w, dCurrent.z + depthOffset, dCurrent.w);
351
+ }`,
352
+
353
+ fragmentShader:
354
+ `precision highp float;
355
+ uniform vec2 uFloatParams;
356
+ varying vec3 uCamPos;
357
+ varying vec4 vColor;
358
+ varying vec3 vPos;
359
+ void main() {
360
+ vec3 look = vPos - uCamPos;
361
+ float lookLength = length(look);
362
+ float a = vColor.a * step(lookLength, sqrt(dot(uCamPos,uCamPos) - uFloatParams[0]) + sqrt(dot(vPos,vPos) - uFloatParams[0]));
363
+ gl_FragColor = vec4(vColor.rgb, a);
364
+ }`
365
+ });
362
366
  }