@pirireis/webglobeplugins 0.9.9 → 0.9.10

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 (211) hide show
  1. package/Math/angle-calculation.js +15 -0
  2. package/Math/arc.js +65 -0
  3. package/Math/bounds/line-bbox.js +188 -0
  4. package/Math/constants.js +9 -0
  5. package/Math/frustum/camera.js +24 -0
  6. package/Math/frustum/from-globeinfo.js +48 -0
  7. package/Math/frustum/types.js +2 -0
  8. package/Math/globe-util/horizon-plane.js +112 -0
  9. package/Math/index.js +1 -0
  10. package/Math/juction/arc-plane.js +83 -0
  11. package/Math/juction/line-sphere.js +25 -0
  12. package/Math/juction/plane-plane.js +58 -0
  13. package/Math/line.js +56 -0
  14. package/Math/matrix4.js +1 -0
  15. package/Math/methods.js +201 -0
  16. package/Math/plane.js +60 -0
  17. package/Math/quaternion.js +104 -0
  18. package/Math/types.js +2 -0
  19. package/Math/utils.js +4 -0
  20. package/Math/vec3.js +126 -0
  21. package/algorithms/search-binary.js +19 -0
  22. package/altitude-locator/adaptors.js +1 -0
  23. package/altitude-locator/draw-subset-obj.js +18 -0
  24. package/altitude-locator/keymethod.js +1 -0
  25. package/altitude-locator/plugin.js +341 -0
  26. package/altitude-locator/types.js +23 -0
  27. package/arrowfield/adaptor.js +14 -0
  28. package/arrowfield/index.js +10 -0
  29. package/arrowfield/plugin.js +86 -0
  30. package/bearing-line/index.js +8 -0
  31. package/bearing-line/plugin.js +449 -0
  32. package/circle-line-chain/chain-list-map.js +205 -0
  33. package/circle-line-chain/init.js +1 -0
  34. package/circle-line-chain/plugin.js +424 -0
  35. package/circle-line-chain/util.js +5 -0
  36. package/compass-rose/compass-rose-padding-flat.js +225 -0
  37. package/compass-rose/compass-text-writer.js +153 -0
  38. package/compass-rose/index.js +7 -0
  39. package/compassrose/compassrose.js +296 -0
  40. package/compassrose/index.js +8 -0
  41. package/globe-types.js +1 -0
  42. package/heatwave/index.js +10 -0
  43. package/heatwave/isobar/objectarraylabels.js +202 -0
  44. package/heatwave/isobar/plugin.js +343 -0
  45. package/heatwave/isobar/quadtreecontours.js +300 -0
  46. package/heatwave/plugins/heatwaveglobeshell.js +206 -0
  47. package/jest.config.js +7 -0
  48. package/package.json +4 -4
  49. package/partialrings/buffer-manager.js +81 -0
  50. package/partialrings/index.js +41 -0
  51. package/partialrings/plugin.js +135 -0
  52. package/partialrings/program.js +286 -0
  53. package/pin/pin-object-array.js +305 -0
  54. package/pin/pin-point-totem.js +60 -0
  55. package/point-heat-map/adaptors/timetracksplugin-format-to-this.js +66 -0
  56. package/point-heat-map/index.js +1 -0
  57. package/point-heat-map/plugin-webworker.js +126 -0
  58. package/point-heat-map/point-to-heat-map-flow.js +127 -0
  59. package/point-tracks/key-methods.js +5 -0
  60. package/point-tracks/plugin.js +338 -0
  61. package/programs/arrowfield/index.js +7 -0
  62. package/programs/arrowfield/logic.js +257 -0
  63. package/programs/arrowfield/object.js +66 -0
  64. package/programs/data2legend/density-to-legend.js +101 -0
  65. package/programs/data2legend/point-to-density-texture.js +100 -0
  66. package/programs/float2legendwithratio/index.js +8 -0
  67. package/programs/float2legendwithratio/logic.js +171 -0
  68. package/programs/float2legendwithratio/object.js +110 -0
  69. package/programs/globe-util/is-globe-moved.js +21 -0
  70. package/programs/globeshell/index.js +8 -0
  71. package/programs/globeshell/noise/noises.js +1 -0
  72. package/programs/globeshell/wiggle/index.js +8 -0
  73. package/programs/globeshell/wiggle/logic.js +345 -0
  74. package/programs/globeshell/wiggle/object.js +72 -0
  75. package/programs/helpers/blender/index.js +1 -0
  76. package/programs/helpers/blender/program.js +79 -0
  77. package/programs/helpers/fadeaway/index.js +7 -0
  78. package/programs/helpers/fadeaway/logic.js +72 -0
  79. package/programs/helpers/fadeaway/object.js +20 -0
  80. package/programs/helpers/index.js +8 -0
  81. package/programs/index.js +58 -0
  82. package/programs/interface.js +1 -0
  83. package/programs/line-on-globe/angled-line.js +176 -0
  84. package/programs/line-on-globe/circle-accurate-3d.js +141 -0
  85. package/programs/line-on-globe/circle-accurate-flat.js +216 -0
  86. package/programs/line-on-globe/circle-accurate.js +178 -0
  87. package/programs/line-on-globe/circle.js +167 -0
  88. package/programs/line-on-globe/degree-padding-around-circle-3d.js +159 -0
  89. package/programs/line-on-globe/index.js +1 -0
  90. package/programs/line-on-globe/lines-color-instanced-flat.js +136 -0
  91. package/programs/line-on-globe/linestrip.js +171 -0
  92. package/programs/line-on-globe/naive-accurate-flexible.js +195 -0
  93. package/programs/line-on-globe/to-the-surface.js +111 -0
  94. package/programs/line-on-globe/util.js +8 -0
  95. package/programs/picking/pickable-renderer.js +188 -0
  96. package/programs/point-on-globe/element-globe-surface-glow.js +142 -0
  97. package/programs/point-on-globe/element-point-glow.js +153 -0
  98. package/programs/point-on-globe/square-pixel-point.js +174 -0
  99. package/programs/programcache.js +131 -0
  100. package/programs/rings/distancering/circleflatprogram.js +156 -0
  101. package/programs/rings/distancering/circlepaddingfreeangleprogram.js +369 -0
  102. package/programs/rings/distancering/circlepaddysharedbuffer.js +357 -0
  103. package/programs/rings/distancering/index.js +14 -0
  104. package/programs/rings/distancering/paddyflatprogram.js +172 -0
  105. package/programs/rings/distancering/paddyflatprogram2d.js +174 -0
  106. package/programs/rings/distancering/paddyflatprogram3d.js +172 -0
  107. package/programs/rings/distancering/shader.js +1 -0
  108. package/programs/rings/index.js +17 -0
  109. package/programs/rings/partial-ring/piece-of-pie.js +275 -0
  110. package/programs/totems/camerauniformblock.js +160 -0
  111. package/programs/totems/canvas-webglobe-info.js +110 -0
  112. package/programs/totems/gpu-selection-uniform-block.js +108 -0
  113. package/programs/totems/index.js +40 -0
  114. package/programs/two-d/pixel-circle.js +1 -0
  115. package/programs/two-d/pixel-padding-for-compass.js +162 -0
  116. package/programs/util.js +17 -0
  117. package/programs/vectorfields/index.js +23 -0
  118. package/programs/vectorfields/logics/drawrectangleparticles.js +107 -0
  119. package/programs/vectorfields/logics/index.js +12 -0
  120. package/programs/vectorfields/logics/pixelbased.js +142 -0
  121. package/programs/vectorfields/logics/ubo.js +63 -0
  122. package/programs/vectorfields/pingpongbuffermanager.js +76 -0
  123. package/rangerings/enum.js +5 -0
  124. package/rangerings/index.js +15 -0
  125. package/rangerings/plugin.js +560 -0
  126. package/rangerings/rangeringangletext.js +329 -0
  127. package/rangerings/ring-account.js +117 -0
  128. package/shaders/fragment-toy/firework.js +58 -0
  129. package/shaders/fragment-toy/singularity.js +59 -0
  130. package/shape-on-terrain/arc/naive/plugin.js +252 -0
  131. package/timetracks/adaptors-line-strip.js +71 -0
  132. package/timetracks/adaptors.js +122 -0
  133. package/timetracks/index.js +19 -0
  134. package/timetracks/plugin-line-strip.js +250 -0
  135. package/timetracks/plugin.js +258 -0
  136. package/timetracks/program-line-strip.js +611 -0
  137. package/timetracks/program.js +772 -0
  138. package/timetracks/programpoint-line-strip.js +154 -0
  139. package/timetracks/programpoint.js +147 -0
  140. package/types.js +15 -0
  141. package/util/account/bufferoffsetmanager.js +179 -0
  142. package/util/account/index.js +23 -0
  143. package/util/account/single-attribute-buffer-management/buffer-manager.js +108 -0
  144. package/util/account/single-attribute-buffer-management/buffer-orchestrator.js +150 -0
  145. package/util/account/single-attribute-buffer-management/index.js +9 -0
  146. package/util/account/single-attribute-buffer-management/object-store.js +51 -0
  147. package/util/account/single-attribute-buffer-management/types.js +2 -0
  148. package/util/account/util.js +22 -0
  149. package/util/algorithms/index.js +1 -0
  150. package/util/algorithms/search-binary.js +28 -0
  151. package/util/check/get.js +18 -0
  152. package/util/check/index.js +1 -0
  153. package/util/check/typecheck.js +49 -0
  154. package/util/geometry/index.js +51 -0
  155. package/util/gl-util/buffer/attribute-loader.js +69 -0
  156. package/util/gl-util/buffer/index.js +6 -0
  157. package/util/gl-util/buffer/types.js +1 -0
  158. package/util/gl-util/draw-options/methods.js +38 -0
  159. package/util/gl-util/draw-options/types.js +15 -0
  160. package/util/gl-util/uniform-block/manager.js +156 -0
  161. package/util/gl-util/uniform-block/shader.js +1 -0
  162. package/util/gl-util/uniform-block/types.js +8 -0
  163. package/util/heatwavedatamanager/datamanager.js +152 -0
  164. package/util/heatwavedatamanager/index.js +10 -0
  165. package/util/heatwavedatamanager/pointcoordinatesdatacalculator.js +122 -0
  166. package/util/heatwavedatamanager/pointcoordsmeta.js +20 -0
  167. package/util/index.js +57 -0
  168. package/util/interpolation/index.js +1 -0
  169. package/util/interpolation/timetrack/index.js +5 -0
  170. package/util/interpolation/timetrack/timetrack-interpolator.js +79 -0
  171. package/util/interpolation/timetrack/web-worker-str.js +183 -0
  172. package/util/interpolation/timetrack/web-worker.js +48 -0
  173. package/util/jshelpers/data-filler.js +20 -0
  174. package/util/jshelpers/equality.js +20 -0
  175. package/util/jshelpers/index.js +37 -0
  176. package/util/jshelpers/timefilters.js +32 -0
  177. package/util/picking/fence.js +46 -0
  178. package/util/picking/picker-displayer.js +139 -0
  179. package/util/programs/draw-texture-on-canvas.js +89 -0
  180. package/util/programs/index.js +17 -0
  181. package/util/programs/shapesonglobe.js +214 -0
  182. package/util/programs/supersampletotextures.js +113 -0
  183. package/util/programs/texturetoglobe.js +182 -0
  184. package/util/shaderfunctions/geometrytransformations.js +340 -0
  185. package/util/shaderfunctions/index.js +18 -0
  186. package/util/shaderfunctions/nodata.js +11 -0
  187. package/util/shaderfunctions/noisefunctions.js +43 -0
  188. package/util/surface-line-data/arc-bboxes.js +25 -0
  189. package/util/surface-line-data/arcs-to-cuts.js +50 -0
  190. package/util/surface-line-data/cut-arc.js +1 -0
  191. package/util/surface-line-data/flow.js +28 -0
  192. package/util/surface-line-data/rbush-manager.js +1 -0
  193. package/util/surface-line-data/types.js +1 -0
  194. package/util/surface-line-data/web-worker.js +1 -0
  195. package/util/webglobe/gldefaultstates.js +7 -0
  196. package/util/webglobe/index.js +18 -0
  197. package/util/webglobe/rasteroverlay.js +78 -0
  198. package/util/webglobjectbuilders.js +388 -0
  199. package/util/webglobjectbuilders1.js +237 -0
  200. package/waveparticles/adaptor.js +17 -0
  201. package/waveparticles/index.js +10 -0
  202. package/waveparticles/plugin.js +266 -0
  203. package/wind/imagetovectorfieldandmagnitude.js +35 -0
  204. package/wind/index.js +14 -0
  205. package/wind/plugin.js +926 -0
  206. package/wind/vectorfieldimage.js +25 -0
  207. package/write-text/attached-text-writer.js +91 -0
  208. package/write-text/context-text.js +98 -0
  209. package/write-text/context-text3.js +155 -0
  210. package/write-text/index.js +5 -0
  211. package/write-text/writer-plugin.js +8 -0
@@ -0,0 +1,611 @@
1
+ "use strict";
2
+ /**
3
+ * Author: Toprak Nihat Deniz Ozturk
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const util_1 = require("../util");
7
+ class TrackGlowLineProgram {
8
+ /**
9
+ * @param {WebGL2RenderingContext} gl
10
+ * @param {number} width
11
+ * @param {number} height
12
+ * @param {Object} options
13
+ * @param {number} options.headPercentage 0 ~ 1
14
+ * @param {number} options.routeAlpha 0 ~ 1
15
+ * @param {Array.<Number>} options.weights [w1, w2, w3, w4, w5]
16
+ * @param {number} options.alphaThreshold 0 ~ 1
17
+ * @param {number} options.exposure 0 ~ inf
18
+ * @param {number} options.gamma 0 ~ inf
19
+ * @param {number} options.finalAlphaRatio 0 ~ 1
20
+ * @param {+int} options.blurRepetition 1 ~ inf default 2
21
+ */
22
+ constructor(gl, attrBuffer, width, height, options = {}) {
23
+ this.gl = gl;
24
+ this.program = null;
25
+ // this._inBuffer = gl.createBuffer();
26
+ this._inBuffer = attrBuffer;
27
+ this._frameBuffer = gl.createFramebuffer();
28
+ this._lineProgram = this._createLineProgram();
29
+ this._blurProgram = this._createBlurProgram();
30
+ this._combineProgram = this._createCombineProgram();
31
+ this.resize(width, height);
32
+ this._middleTexture = null;
33
+ this._blurTextures = null;
34
+ this._createInnerTextures();
35
+ this._blurFrameBuffers = [gl.createFramebuffer(), gl.createFramebuffer()];
36
+ this._blurRepetition = options.blurRepetition || 1;
37
+ this._totalLength = 0;
38
+ this._initUniforms(options);
39
+ }
40
+ _createInnerTextures() {
41
+ this._middleTexture = this._createTextures();
42
+ this._blurTextures = [this._createTextures(), this._createTextures()];
43
+ }
44
+ _initUniforms(options = {}) {
45
+ const { gl, _lineProgram, _blurProgram, _combineProgram } = this;
46
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
47
+ gl.useProgram(_lineProgram.program);
48
+ gl.uniform1f(_lineProgram.u_head_percentage, options.headPercentage || 1.0 / 30.0);
49
+ gl.uniform1f(_lineProgram.u_route_alpha, options.routeAlpha || 0.025);
50
+ gl.useProgram(_blurProgram.program);
51
+ gl.uniform1fv(_blurProgram.u_weight, options.weights || [0.55, 0.45045946, 0.3216216, 0.254054, 0.056216]);
52
+ gl.useProgram(_combineProgram.program);
53
+ gl.uniform1f(_combineProgram.u_exposure, options.exposure || 1.0);
54
+ gl.uniform1f(_combineProgram.u_gamma, options.gamma || 1.0);
55
+ gl.uniform1f(_combineProgram.u_final_alpha_ratio, options.finalAlphaRatio || 1.0);
56
+ gl.useProgram(currentProgram);
57
+ }
58
+ /**
59
+ * @param {number} gamma 0 ~ inf
60
+ */
61
+ setGamma(gamma) {
62
+ if (gamma < 0) {
63
+ console.warn("gamma should be equal or greater than 0, but got", gamma);
64
+ return;
65
+ }
66
+ const { gl, _combineProgram } = this;
67
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
68
+ gl.useProgram(_combineProgram.program);
69
+ gl.uniform1f(_combineProgram.u_gamma, gamma);
70
+ gl.useProgram(currentProgram);
71
+ }
72
+ /**
73
+ *
74
+ * @param {number} exposure 0 ~ inf
75
+ * @returns
76
+ */
77
+ setExposure(exposure) {
78
+ if (exposure < 0) {
79
+ console.warn("exposure should be equal or greater than 0, but got", exposure);
80
+ return;
81
+ }
82
+ const { gl, _combineProgram } = this;
83
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
84
+ gl.useProgram(_combineProgram.program);
85
+ gl.uniform1f(_combineProgram.u_exposure, exposure);
86
+ gl.useProgram(currentProgram);
87
+ }
88
+ /**
89
+ *
90
+ * @param {number} ratio 0 ~ 1
91
+ * @returns
92
+ */
93
+ setFinalAlphaRatio(ratio) {
94
+ if (ratio < 0 || ratio > 1) {
95
+ console.warn("ratio should be between 0 and 1, but got", ratio);
96
+ return;
97
+ }
98
+ const { gl, _combineProgram } = this;
99
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
100
+ gl.useProgram(_combineProgram.program);
101
+ gl.uniform1f(_combineProgram.u_final_alpha_ratio, ratio);
102
+ gl.useProgram(currentProgram);
103
+ }
104
+ /**
105
+ * @param {Array.<Number>} weight [w1, w2, w3, w4, w5]
106
+ */
107
+ setBlurWeights(weights) {
108
+ if (weights.length !== 5) {
109
+ console.warn("weights should be an array of 5 numbers, but got", weights);
110
+ return;
111
+ }
112
+ const { gl, _blurProgram } = this;
113
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
114
+ gl.useProgram(_blurProgram.program);
115
+ gl.uniform1fv(_blurProgram.u_weight, weights);
116
+ gl.useProgram(currentProgram);
117
+ }
118
+ /**
119
+ * @param {number} routeAlpha 0 ~ 1
120
+ */
121
+ setRouteAlpha(routeAlpha) {
122
+ if (routeAlpha < 0 || routeAlpha > 1) {
123
+ console.warn("routeAlpha should be between 0 and 1, but got", routeAlpha);
124
+ return;
125
+ }
126
+ const { gl, _lineProgram } = this;
127
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
128
+ gl.useProgram(_lineProgram.program);
129
+ gl.uniform1f(_lineProgram.u_route_alpha, routeAlpha);
130
+ gl.useProgram(currentProgram);
131
+ }
132
+ /**
133
+ * blur uses pingpong effect. This number decides how many times the blur will be applied.
134
+ * @param {+int} repetition
135
+ * @returns
136
+ */
137
+ setBlurRepetition(repetition) {
138
+ if (repetition < 0 && repetition % 1 !== 0) {
139
+ console.warn("repetition should be an integer greater than 0, but got", repetition);
140
+ return;
141
+ }
142
+ this._blurRepetition = repetition;
143
+ }
144
+ /**
145
+ * Head Is colored as white. This number decides proportion of the head according to the total length of the line.
146
+ * @param {Number} percentage 0 ~ 1
147
+ */
148
+ setHeadPercentage(percentage) {
149
+ if (percentage < 0 || 1 < percentage) {
150
+ console.warn("percentage should be between 0 and 1, but got", percentage);
151
+ return;
152
+ }
153
+ ;
154
+ const { gl, _lineProgram } = this;
155
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
156
+ gl.useProgram(_lineProgram.program);
157
+ gl.uniform1f(_lineProgram.u_head_percentage, percentage);
158
+ gl.useProgram(currentProgram);
159
+ }
160
+ _createDrawTextureProgram() {
161
+ const gl = this.gl;
162
+ const vertexShader = `#version 300 es
163
+ precision highp float;
164
+
165
+ in vec2 a_position;
166
+
167
+ out vec2 v_texcoord;
168
+
169
+ void main() {
170
+ gl_Position = vec4(a_position, 0.0, 1.0);
171
+ v_texcoord = a_position.xy * 0.5 + 0.5;
172
+ }
173
+ `;
174
+ const fragmentShader = `#version 300 es
175
+ precision highp float;
176
+
177
+ in vec2 v_texcoord;
178
+
179
+ uniform sampler2D u_main_texture;
180
+
181
+
182
+ uniform float u_final_alpha_ratio;
183
+
184
+ out vec4 outColor;
185
+
186
+ void main() {
187
+
188
+ vec4 hdrColor = texture(u_main_texture, v_texcoord);
189
+ outColor = hdrColor;
190
+ outColor.a *= u_final_alpha_ratio;
191
+ }
192
+ `;
193
+ const program = (0, util_1.createProgram)(this.gl, vertexShader, fragmentShader);
194
+ const buffer = gl.createBuffer();
195
+ const a_position = gl.getAttribLocation(program, "a_position");
196
+ const vao = gl.createVertexArray();
197
+ gl.bindVertexArray(vao);
198
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
199
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
200
+ -1, -1,
201
+ 1, -1,
202
+ 1, 1,
203
+ -1, -1,
204
+ 1, 1,
205
+ -1, 1,
206
+ ]), gl.STATIC_DRAW);
207
+ gl.enableVertexAttribArray(a_position);
208
+ gl.vertexAttribPointer(a_position, 2, gl.FLOAT, false, 0, 0);
209
+ gl.bindVertexArray(null);
210
+ return {
211
+ program: program,
212
+ vao: vao,
213
+ u_main_texture: gl.getUniformLocation(program, "u_main_texture"),
214
+ u_final_alpha_ratio: gl.getUniformLocation(program, "u_final_alpha_ratio"),
215
+ };
216
+ }
217
+ _createCombineProgram() {
218
+ const gl = this.gl;
219
+ const vertexShader = `#version 300 es
220
+ precision highp float;
221
+
222
+ in vec2 a_position;
223
+
224
+ out vec2 v_texcoord;
225
+
226
+ void main() {
227
+ gl_Position = vec4(a_position, 0.0, 1.0);
228
+ v_texcoord = a_position.xy * 0.5 + 0.5;
229
+ }
230
+ `;
231
+ const fragmentShader = `#version 300 es
232
+ precision highp float;
233
+
234
+ in vec2 v_texcoord;
235
+
236
+ uniform sampler2D u_main_texture;
237
+ uniform sampler2D u_bloom_texture;
238
+
239
+ uniform float u_exposure;
240
+ uniform float u_gamma;
241
+ uniform float u_final_alpha_ratio;
242
+
243
+ out vec4 outColor;
244
+
245
+ void main() {
246
+
247
+ vec4 hdrColor = texture(u_main_texture, v_texcoord);
248
+ vec4 bloomColor = texture(u_bloom_texture, v_texcoord);
249
+ vec4 result = hdrColor + bloomColor * u_exposure;
250
+ result = pow(result, vec4(1.0 / u_gamma));
251
+ result.a *= u_final_alpha_ratio;
252
+ outColor = result;
253
+ }
254
+ `;
255
+ const program = (0, util_1.createProgram)(this.gl, vertexShader, fragmentShader);
256
+ const buffer = gl.createBuffer();
257
+ const a_position = gl.getAttribLocation(program, "a_position");
258
+ const vao = gl.createVertexArray();
259
+ gl.bindVertexArray(vao);
260
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
261
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
262
+ -1, -1,
263
+ 1, -1,
264
+ 1, 1,
265
+ -1, -1,
266
+ 1, 1,
267
+ -1, 1,
268
+ ]), gl.STATIC_DRAW);
269
+ gl.enableVertexAttribArray(a_position);
270
+ gl.vertexAttribPointer(a_position, 2, gl.FLOAT, false, 0, 0);
271
+ gl.bindVertexArray(null);
272
+ return {
273
+ program: program,
274
+ vao: vao,
275
+ u_main_texture: gl.getUniformLocation(program, "u_main_texture"),
276
+ u_bloom_texture: gl.getUniformLocation(program, "u_bloom_texture"),
277
+ u_exposure: gl.getUniformLocation(program, "u_exposure"),
278
+ u_gamma: gl.getUniformLocation(program, "u_gamma"),
279
+ u_final_alpha_ratio: gl.getUniformLocation(program, "u_final_alpha_ratio"),
280
+ };
281
+ }
282
+ _createBlurProgram() {
283
+ const gl = this.gl;
284
+ const vertexShader = `#version 300 es
285
+ precision highp float;
286
+
287
+ in vec2 a_position;
288
+ out vec2 v_texcoord;
289
+
290
+ void main() {
291
+ gl_Position = vec4(a_position, 0.0, 1.0);
292
+ v_texcoord = a_position.xy * 0.5 + 0.5;
293
+ }`;
294
+ const fragmentShader = `#version 300 es
295
+ precision highp float;
296
+
297
+ in vec2 v_texcoord;
298
+
299
+ uniform sampler2D u_texture;
300
+ uniform bool u_horizontal;
301
+ uniform float u_weight[5];
302
+ out vec4 outColor;
303
+
304
+ void main()
305
+ {
306
+ vec2 tex_offset = vec2(
307
+ 1.0 / float(textureSize(u_texture, 0).x),
308
+ 1.0 / float(textureSize(u_texture, 0).y) ); // gets size of single texel
309
+ vec3 color = vec3(0.0);
310
+ float total_alpha = texture(u_texture, v_texcoord).a * u_weight[0];
311
+ if (total_alpha > 0.0){
312
+ color = texture(u_texture, v_texcoord).rgb;
313
+ }
314
+ vec2 offset = vec2(0.0);
315
+ float alpha;
316
+
317
+ if(u_horizontal){
318
+ for(int i = 1; i < 5; ++i){
319
+ offset = vec2(tex_offset.x * float(i), 0.0);
320
+ alpha = texture(u_texture, v_texcoord + offset).a * u_weight[i];
321
+ color = mix( color, texture(u_texture, v_texcoord + offset).rgb, alpha);
322
+ total_alpha += alpha;
323
+ alpha = texture(u_texture, v_texcoord - offset).a * u_weight[i];
324
+ color = mix( color, texture(u_texture, v_texcoord - offset).rgb, alpha);
325
+ total_alpha += alpha;
326
+ }
327
+ }
328
+ else
329
+ {
330
+ for(int i = 1; i < 5; ++i)
331
+ {
332
+ offset = vec2(0.0, tex_offset.y * float(i));
333
+ alpha = texture(u_texture, v_texcoord + offset).a * u_weight[i];
334
+ color = mix( color, texture(u_texture, v_texcoord + offset).rgb, alpha);
335
+ total_alpha += alpha;
336
+ alpha = texture(u_texture, v_texcoord - offset).a * u_weight[i];
337
+ color = mix( color, texture(u_texture, v_texcoord - offset).rgb, alpha);
338
+ total_alpha += alpha;
339
+ }
340
+ }
341
+ outColor = vec4(color, total_alpha);
342
+ }
343
+ `;
344
+ const program = (0, util_1.createProgram)(this.gl, vertexShader, fragmentShader);
345
+ const buffer = gl.createBuffer();
346
+ const a_position = gl.getAttribLocation(program, "a_position");
347
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
348
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
349
+ -1, -1,
350
+ 1, -1,
351
+ 1, 1,
352
+ -1, -1,
353
+ 1, 1,
354
+ -1, 1,
355
+ ]), gl.STATIC_DRAW);
356
+ const vao = gl.createVertexArray();
357
+ gl.bindVertexArray(vao);
358
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
359
+ gl.enableVertexAttribArray(a_position);
360
+ gl.vertexAttribPointer(a_position, 2, gl.FLOAT, false, 0, 0);
361
+ gl.bindVertexArray(null);
362
+ return {
363
+ program: program,
364
+ vao: vao,
365
+ u_texture: gl.getUniformLocation(program, "u_texture"),
366
+ u_horizontal: gl.getUniformLocation(program, "u_horizontal"),
367
+ u_weight: gl.getUniformLocation(program, "u_weight"),
368
+ };
369
+ }
370
+ resize(width, height) {
371
+ const { gl, _lineProgram } = this;
372
+ this._width = width;
373
+ this._height = height;
374
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
375
+ this._createInnerTextures();
376
+ gl.useProgram(_lineProgram.program);
377
+ gl.uniform2fv(_lineProgram.u_scrWH, [width, height]);
378
+ gl.useProgram(currentProgram);
379
+ }
380
+ _createLineProgram() {
381
+ const gl = this.gl;
382
+ const vertexShader = `#version 300 es
383
+ precision highp float;
384
+
385
+ in vec3 a_position;
386
+ in float a_time;
387
+ in vec3 a_color;
388
+ in float a_track_start_time;
389
+ in float a_track_end_time;
390
+
391
+ uniform mat4 uModelViewMatrix;
392
+ uniform mat4 uProjectionMatrix;
393
+ uniform vec3 uTranslate;
394
+
395
+ uniform bool u_is_3d;
396
+ uniform vec2 u_mapWH;
397
+ uniform vec2 u_scrWH;
398
+
399
+ out float v_time;
400
+ out vec3 v_color;
401
+ out float v_track_start_time;
402
+ out float v_track_end_time;
403
+ ${util_1.shaderfunctions.pixelXYToCartesian3DPoint}
404
+ ${util_1.shaderfunctions.pixelXYToCartesian2DPoint}
405
+
406
+ void main() {
407
+
408
+ v_time = a_time;
409
+ v_color = a_color;
410
+ v_track_start_time = a_track_start_time;
411
+ v_track_end_time = a_track_end_time;
412
+ if (u_is_3d){
413
+ vec3 pos = pixelXYToCartesian3DPoint(a_position);
414
+ gl_Position = uProjectionMatrix * uModelViewMatrix * vec4(pos - uTranslate, 1.0);
415
+ } else {
416
+ vec2 xy = pixelXYToCartesian2DPoint(a_position.xy, uTranslate.xy, u_mapWH, u_scrWH);
417
+ gl_Position = uProjectionMatrix * vec4(xy.x, xy.y, 0.0, 1.0);
418
+ }
419
+ }
420
+ `;
421
+ const fragmentShader = `#version 300 es
422
+ precision lowp float;
423
+
424
+ in float v_time;
425
+ in vec3 v_color;
426
+ in float v_track_start_time;
427
+ in float v_track_end_time;
428
+ uniform float u_head_time;
429
+ uniform float u_tail_time;
430
+
431
+ uniform float u_head_percentage;
432
+ uniform float u_route_alpha;
433
+
434
+ layout(location = 0) out vec4 outColor0;
435
+ layout(location = 1) out vec4 outColor1;
436
+
437
+
438
+ void main() {
439
+ if ( u_tail_time > v_track_end_time || u_head_time < v_track_start_time) discard;
440
+ float gap = u_head_time - u_tail_time;
441
+ float head = gap * u_head_percentage;
442
+ float dist = u_head_time - v_time;
443
+
444
+ if ((v_time > u_head_time ) || (v_time < u_tail_time) ){
445
+ outColor0 = vec4(v_color , u_route_alpha);
446
+ return;
447
+ } else if (dist < head) {
448
+ // white head
449
+ outColor1 = vec4(1.0, 1.0, 1.0, 1.0);
450
+ //
451
+ } else {
452
+ // colored body of lines
453
+ float alpha = ((gap - dist) / gap) * 0.4 + 0.6;
454
+ // outColor0 = vec4(v_color , alpha );
455
+ outColor1 = vec4(v_color , alpha );
456
+ }
457
+ outColor0 = vec4(v_color , 1.0);
458
+ }
459
+ `;
460
+ const program = (0, util_1.createProgram)(this.gl, vertexShader, fragmentShader);
461
+ const a_position = gl.getAttribLocation(program, "a_position");
462
+ const a_time = gl.getAttribLocation(program, "a_time");
463
+ const a_track_start_time = gl.getAttribLocation(program, "a_track_start_time");
464
+ const a_track_end_time = gl.getAttribLocation(program, "a_track_end_time");
465
+ const a_color = gl.getAttribLocation(program, "a_color");
466
+ const vao = gl.createVertexArray();
467
+ gl.bindVertexArray(vao);
468
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._inBuffer);
469
+ gl.enableVertexAttribArray(a_position);
470
+ gl.vertexAttribPointer(a_position, 3, gl.FLOAT, false, 36, 0);
471
+ gl.enableVertexAttribArray(a_time);
472
+ gl.vertexAttribPointer(a_time, 1, gl.FLOAT, false, 36, 12);
473
+ gl.enableVertexAttribArray(a_color);
474
+ gl.vertexAttribPointer(a_color, 3, gl.FLOAT, false, 36, 16);
475
+ gl.enableVertexAttribArray(a_track_start_time);
476
+ gl.vertexAttribPointer(a_track_start_time, 1, gl.FLOAT, false, 36, 28);
477
+ gl.enableVertexAttribArray(a_track_end_time);
478
+ gl.vertexAttribPointer(a_track_end_time, 1, gl.FLOAT, false, 36, 32);
479
+ gl.bindVertexArray(null);
480
+ return {
481
+ program: program,
482
+ vao: vao,
483
+ u_head_time: gl.getUniformLocation(program, "u_head_time"),
484
+ u_tail_time: gl.getUniformLocation(program, "u_tail_time"),
485
+ uTranslate: gl.getUniformLocation(program, "uTranslate"),
486
+ uModelViewMatrix: gl.getUniformLocation(program, "uModelViewMatrix"),
487
+ uProjectionMatrix: gl.getUniformLocation(program, "uProjectionMatrix"),
488
+ u_is_3d: gl.getUniformLocation(program, "u_is_3d"),
489
+ u_mapWH: gl.getUniformLocation(program, "u_mapWH"),
490
+ u_scrWH: gl.getUniformLocation(program, "u_scrWH"),
491
+ u_head_percentage: gl.getUniformLocation(program, "u_head_percentage"),
492
+ u_route_alpha: gl.getUniformLocation(program, "u_route_alpha"),
493
+ };
494
+ }
495
+ /**
496
+ * @param { Float32Array} data // [x, y, z, time, x, y, z, time, ...]
497
+ */
498
+ // setInBuffer(data) {
499
+ // const gl = this.gl;
500
+ // gl.bindBuffer(gl.ARRAY_BUFFER, this._inBuffer);
501
+ // gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
502
+ // }
503
+ setIs3D(is3d) {
504
+ const { gl, _lineProgram } = this;
505
+ const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
506
+ gl.useProgram(_lineProgram.program);
507
+ gl.uniform1i(_lineProgram.u_is_3d, is3d);
508
+ gl.useProgram(currentProgram);
509
+ }
510
+ setTotalLength(totalLength) {
511
+ this._totalLength = totalLength;
512
+ }
513
+ _createTextures() {
514
+ const { gl, _width, _height } = this;
515
+ const texture = gl.createTexture();
516
+ gl.bindTexture(gl.TEXTURE_2D, texture);
517
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, _width, _height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // UNSIGNED_BYTE
518
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
519
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
520
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
521
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
522
+ gl.bindTexture(gl.TEXTURE_2D, null);
523
+ return texture;
524
+ }
525
+ _resetTexture() {
526
+ const { gl, _width, _height } = this;
527
+ gl.bindTexture(gl.TEXTURE_2D, this._middleTexture); // UNSIGNED_BYTE
528
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, _width, _height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
529
+ gl.bindTexture(gl.TEXTURE_2D, this._blurTextures[0]);
530
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, _width, _height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
531
+ gl.bindTexture(gl.TEXTURE_2D, this._blurTextures[1]);
532
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, _width, _height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
533
+ gl.bindTexture(gl.TEXTURE_2D, null);
534
+ }
535
+ draw(u_head_time, u_tail_time, uProjectionMatrix, uModelViewMatrix, uTranslate, u_mapWH = null) {
536
+ const { gl, _lineProgram, _blurProgram, _blurRepetition } = this;
537
+ this._resetTexture();
538
+ gl.enable(gl.BLEND);
539
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
540
+ { // draw lines
541
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._frameBuffer);
542
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this._middleTexture, 0);
543
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT1, gl.TEXTURE_2D, this._blurTextures[0], 0);
544
+ gl.drawBuffers([
545
+ gl.COLOR_ATTACHMENT0,
546
+ gl.COLOR_ATTACHMENT1,
547
+ ]);
548
+ gl.useProgram(_lineProgram.program);
549
+ gl.uniform1f(_lineProgram.u_head_time, u_head_time);
550
+ gl.uniform1f(_lineProgram.u_tail_time, u_tail_time);
551
+ gl.uniformMatrix4fv(_lineProgram.uProjectionMatrix, false, uProjectionMatrix);
552
+ if (u_mapWH) {
553
+ gl.uniform2fv(_lineProgram.u_mapWH, u_mapWH);
554
+ }
555
+ else {
556
+ gl.uniformMatrix4fv(_lineProgram.uModelViewMatrix, false, uModelViewMatrix);
557
+ }
558
+ gl.uniform3fv(_lineProgram.uTranslate, uTranslate);
559
+ gl.bindVertexArray(_lineProgram.vao);
560
+ gl.drawArrays(gl.LINE_STRIP, 0, this._totalLength);
561
+ gl.drawBuffers([
562
+ gl.COLOR_ATTACHMENT0,
563
+ gl.NONE
564
+ ]);
565
+ }
566
+ { // blur ping pong
567
+ gl.useProgram(_blurProgram.program);
568
+ gl.bindVertexArray(_blurProgram.vao);
569
+ for (let i = 0; i < _blurRepetition * 2; i++) {
570
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._blurFrameBuffers[i % 2]);
571
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this._blurTextures[(i + 1) % 2], 0);
572
+ gl.bindTexture(gl.TEXTURE_2D, this._blurTextures[i % 2]);
573
+ gl.uniform1i(_blurProgram.u_texture, 0);
574
+ gl.uniform1f(_blurProgram.u_horizontal, i % 2 == 0);
575
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
576
+ }
577
+ }
578
+ { // combine
579
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
580
+ gl.useProgram(this._combineProgram.program);
581
+ gl.bindVertexArray(this._combineProgram.vao);
582
+ gl.activeTexture(gl.TEXTURE1);
583
+ gl.bindTexture(gl.TEXTURE_2D, this._blurTextures[1]);
584
+ gl.uniform1i(this._combineProgram.u_bloom_texture, 1);
585
+ gl.activeTexture(gl.TEXTURE0);
586
+ gl.bindTexture(gl.TEXTURE_2D, this._middleTexture);
587
+ gl.uniform1i(this._combineProgram.u_main_texture, 0);
588
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
589
+ }
590
+ gl.bindVertexArray(null);
591
+ (0, util_1.defaultblendfunction)(gl);
592
+ }
593
+ free() {
594
+ const { gl, _lineProgram, _blurProgram, _combineProgram } = this;
595
+ gl.deleteBuffer(this._inBuffer);
596
+ gl.deleteFramebuffer(this._frameBuffer);
597
+ gl.deleteFramebuffer(this._blurFrameBuffers[0]);
598
+ gl.deleteFramebuffer(this._blurFrameBuffers[1]);
599
+ // gl.deleteBuffer(this._middleTexture);
600
+ gl.deleteTexture(this._middleTexture);
601
+ gl.deleteTexture(this._blurTextures[0]);
602
+ gl.deleteTexture(this._blurTextures[1]);
603
+ gl.deleteVertexArray(_lineProgram.vao);
604
+ gl.deleteVertexArray(_blurProgram.vao);
605
+ gl.deleteVertexArray(_combineProgram.vao);
606
+ gl.deleteProgram(_lineProgram.program);
607
+ gl.deleteProgram(_blurProgram.program);
608
+ gl.deleteProgram(_combineProgram.program);
609
+ }
610
+ }
611
+ exports.default = TrackGlowLineProgram;