@pirireis/webglobeplugins 0.9.11 → 0.9.12
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/Math/angle-calculation.js +8 -8
- package/Math/arc.js +18 -18
- package/Math/bounds/line-bbox.js +78 -80
- package/Math/constants.js +3 -3
- package/Math/juction/arc-plane.js +23 -23
- package/Math/juction/line-sphere.js +11 -11
- package/Math/juction/plane-plane.js +11 -11
- package/Math/line.js +14 -16
- package/Math/methods.js +65 -70
- package/Math/plane.js +16 -18
- package/Math/quaternion.js +45 -49
- package/Math/utils.js +2 -2
- package/Math/vec3.js +42 -45
- package/algorithms/search-binary.js +4 -4
- package/altitude-locator/draw-subset-obj.js +7 -8
- package/altitude-locator/plugin.js +98 -114
- package/arrowfield/adaptor.js +3 -4
- package/arrowfield/index.js +2 -2
- package/arrowfield/plugin.js +62 -65
- package/bearing-line/index.js +1 -1
- package/bearing-line/plugin.js +200 -226
- package/circle-line-chain/chain-list-map.js +82 -88
- package/circle-line-chain/plugin.js +134 -165
- package/circle-line-chain/util.js +1 -1
- package/compass-rose/compass-rose-padding-flat.js +108 -133
- package/compass-rose/compass-text-writer.js +62 -70
- package/compass-rose/index.js +2 -2
- package/compassrose/compassrose.js +46 -50
- package/compassrose/index.js +1 -1
- package/heatwave/index.js +2 -2
- package/heatwave/isobar/objectarraylabels.js +44 -48
- package/heatwave/isobar/plugin.js +104 -123
- package/heatwave/isobar/quadtreecontours.js +76 -92
- package/heatwave/plugins/heatwaveglobeshell.js +69 -87
- package/index.js +11 -11
- package/package.json +1 -1
- package/partialrings/buffer-manager.js +32 -64
- package/partialrings/index.js +1 -1
- package/partialrings/plugin.js +48 -84
- package/partialrings/program.js +136 -47
- package/pin/pin-object-array.js +83 -86
- package/pin/pin-point-totem.js +21 -22
- package/point-heat-map/adaptors/timetracksplugin-format-to-this.js +10 -10
- package/point-heat-map/plugin-webworker.js +40 -45
- package/point-heat-map/point-to-heat-map-flow.js +40 -42
- package/point-tracks/key-methods.js +1 -1
- package/point-tracks/plugin.js +137 -162
- package/programs/arrowfield/index.js +1 -1
- package/programs/arrowfield/logic.js +170 -62
- package/programs/arrowfield/object.js +33 -35
- package/programs/data2legend/density-to-legend.js +45 -21
- package/programs/data2legend/point-to-density-texture.js +52 -27
- package/programs/float2legendwithratio/index.js +1 -1
- package/programs/float2legendwithratio/logic.js +88 -42
- package/programs/float2legendwithratio/object.js +43 -46
- package/programs/globe-util/is-globe-moved.js +10 -11
- package/programs/globeshell/index.js +1 -1
- package/programs/globeshell/wiggle/index.js +1 -1
- package/programs/globeshell/wiggle/logic.js +191 -98
- package/programs/globeshell/wiggle/object.js +33 -35
- package/programs/helpers/blender/program.js +36 -19
- package/programs/helpers/fadeaway/index.js +1 -1
- package/programs/helpers/fadeaway/logic.js +35 -13
- package/programs/helpers/fadeaway/object.js +9 -10
- package/programs/helpers/index.js +1 -1
- package/programs/index.js +8 -8
- package/programs/line-on-globe/angled-line.js +91 -32
- package/programs/line-on-globe/circle-accurate-3d.js +82 -32
- package/programs/line-on-globe/circle-accurate-flat.js +108 -50
- package/programs/line-on-globe/circle-accurate.js +103 -33
- package/programs/line-on-globe/circle.js +97 -32
- package/programs/line-on-globe/degree-padding-around-circle-3d.js +83 -33
- package/programs/line-on-globe/lines-color-instanced-flat.js +79 -34
- package/programs/line-on-globe/linestrip.js +111 -45
- package/programs/line-on-globe/naive-accurate-flexible.js +120 -50
- package/programs/line-on-globe/to-the-surface.js +58 -29
- package/programs/line-on-globe/util.js +1 -1
- package/programs/picking/pickable-renderer.js +117 -33
- package/programs/point-on-globe/element-globe-surface-glow.js +78 -38
- package/programs/point-on-globe/element-point-glow.js +103 -35
- package/programs/point-on-globe/square-pixel-point.js +76 -27
- package/programs/programcache.js +13 -13
- package/programs/rings/distancering/circleflatprogram.js +63 -21
- package/programs/rings/distancering/circlepaddingfreeangleprogram.js +156 -145
- package/programs/rings/distancering/circlepaddysharedbuffer.js +121 -197
- package/programs/rings/distancering/index.js +4 -4
- package/programs/rings/distancering/paddyflatprogram.js +73 -20
- package/programs/rings/distancering/paddyflatprogram2d.js +75 -22
- package/programs/rings/distancering/paddyflatprogram3d.js +73 -20
- package/programs/rings/partial-ring/piece-of-pie.js +137 -35
- package/programs/totems/camerauniformblock.js +64 -51
- package/programs/totems/canvas-webglobe-info.js +48 -40
- package/programs/totems/gpu-selection-uniform-block.js +44 -40
- package/programs/totems/index.js +1 -1
- package/programs/two-d/pixel-padding-for-compass.js +90 -29
- package/programs/util.js +6 -7
- package/programs/vectorfields/index.js +1 -1
- package/programs/vectorfields/logics/drawrectangleparticles.js +70 -29
- package/programs/vectorfields/logics/index.js +3 -3
- package/programs/vectorfields/logics/pixelbased.js +91 -35
- package/programs/vectorfields/logics/ubo.js +31 -25
- package/programs/vectorfields/pingpongbuffermanager.js +30 -34
- package/rangerings/index.js +4 -4
- package/rangerings/plugin.js +202 -258
- package/rangerings/rangeringangletext.js +108 -120
- package/rangerings/ring-account.js +52 -69
- package/shaders/fragment-toy/firework.js +55 -1
- package/shaders/fragment-toy/singularity.js +55 -1
- package/timetracks/adaptors-line-strip.js +26 -37
- package/timetracks/adaptors.js +47 -61
- package/timetracks/index.js +4 -4
- package/timetracks/plugin-line-strip.js +63 -71
- package/timetracks/plugin.js +69 -77
- package/timetracks/program-line-strip.js +296 -103
- package/timetracks/program.js +419 -113
- package/timetracks/programpoint-line-strip.js +97 -44
- package/timetracks/programpoint.js +90 -44
- package/util/account/bufferoffsetmanager.js +72 -95
- package/util/account/index.js +1 -1
- package/util/account/single-attribute-buffer-management/buffer-manager.js +44 -44
- package/util/account/single-attribute-buffer-management/buffer-orchestrator.js +68 -94
- package/util/account/single-attribute-buffer-management/index.js +3 -3
- package/util/account/single-attribute-buffer-management/object-store.js +29 -30
- package/util/account/util.js +2 -4
- package/util/algorithms/search-binary.js +4 -4
- package/util/check/get.js +5 -5
- package/util/check/typecheck.js +13 -15
- package/util/geometry/index.js +9 -11
- package/util/gl-util/buffer/attribute-loader.js +8 -20
- package/util/gl-util/buffer/index.js +1 -1
- package/util/gl-util/draw-options/methods.js +8 -9
- package/util/gl-util/uniform-block/manager.js +67 -67
- package/util/heatwavedatamanager/datamanager.js +56 -116
- package/util/heatwavedatamanager/index.js +2 -2
- package/util/heatwavedatamanager/pointcoordinatesdatacalculator.js +37 -40
- package/util/heatwavedatamanager/pointcoordsmeta.js +9 -10
- package/util/index.js +6 -6
- package/util/interpolation/timetrack/index.js +1 -1
- package/util/interpolation/timetrack/timetrack-interpolator.js +27 -29
- package/util/interpolation/timetrack/web-worker-str.js +179 -1
- package/util/interpolation/timetrack/web-worker.js +4 -4
- package/util/jshelpers/data-filler.js +7 -7
- package/util/jshelpers/timefilters.js +7 -7
- package/util/picking/fence.js +7 -7
- package/util/picking/picker-displayer.js +46 -52
- package/util/programs/draw-texture-on-canvas.js +39 -21
- package/util/programs/shapesonglobe.js +104 -64
- package/util/programs/supersampletotextures.js +45 -39
- package/util/programs/texturetoglobe.js +98 -48
- package/util/shaderfunctions/geometrytransformations.js +322 -27
- package/util/shaderfunctions/nodata.js +7 -1
- package/util/shaderfunctions/noisefunctions.js +39 -9
- package/util/surface-line-data/arcs-to-cuts.js +20 -23
- package/util/webglobe/rasteroverlay.js +35 -37
- package/util/webglobjectbuilders.js +55 -60
- package/util/webglobjectbuilders1.js +48 -49
- package/waveparticles/adaptor.js +6 -7
- package/waveparticles/index.js +2 -2
- package/waveparticles/plugin.js +79 -84
- package/wind/imagetovectorfieldandmagnitude.js +15 -15
- package/wind/index.js +4 -4
- package/wind/plugin.js +453 -251
- package/wind/vectorfieldimage.js +5 -5
- package/write-text/attached-text-writer.js +46 -48
- package/write-text/context-text.js +51 -58
- package/write-text/context-text3.js +69 -74
|
@@ -25,18 +25,18 @@ exports.reloadCurrentGLProgram = reloadCurrentGLProgram;
|
|
|
25
25
|
* @throws An error if shader compilation fails.
|
|
26
26
|
*/
|
|
27
27
|
function createShader(gl, type, source) {
|
|
28
|
-
|
|
28
|
+
const shader = gl.createShader(type);
|
|
29
29
|
if (!shader) {
|
|
30
30
|
throw new Error("Failed to create WebGLShader.");
|
|
31
31
|
}
|
|
32
32
|
gl.shaderSource(shader, source);
|
|
33
33
|
gl.compileShader(shader);
|
|
34
34
|
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
const errorLog = gl.getShaderInfoLog(shader);
|
|
36
|
+
const shaderType = type === gl.VERTEX_SHADER ? 'VERTEX_SHADER' : 'FRAGMENT_SHADER';
|
|
37
|
+
const sourceWithLineNumbers = source.split('\n').map((line, i) => `${i + 1}: ${line}`).join('\n');
|
|
38
38
|
gl.deleteShader(shader); // Clean up the failed shader
|
|
39
|
-
throw new Error(
|
|
39
|
+
throw new Error(`Error compiling ${shaderType}:\n${errorLog}\nSource:\n${sourceWithLineNumbers}`);
|
|
40
40
|
}
|
|
41
41
|
return shader;
|
|
42
42
|
}
|
|
@@ -50,13 +50,13 @@ function createShader(gl, type, source) {
|
|
|
50
50
|
* @returns The linked WebGLProgram, or `undefined` if compilation or linking fails.
|
|
51
51
|
*/
|
|
52
52
|
function createProgram(gl, vertexSource, fragmentSource) {
|
|
53
|
-
|
|
53
|
+
const program = gl.createProgram();
|
|
54
54
|
if (!program) {
|
|
55
55
|
console.error("Failed to create WebGLProgram.");
|
|
56
56
|
return undefined;
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
let vertexShader;
|
|
59
|
+
let fragmentShader;
|
|
60
60
|
try {
|
|
61
61
|
vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
62
62
|
fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
@@ -93,21 +93,21 @@ function createProgram(gl, vertexSource, fragmentSource) {
|
|
|
93
93
|
* @throws An error if shader compilation or program linking fails.
|
|
94
94
|
*/
|
|
95
95
|
function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
96
|
-
|
|
96
|
+
const program = gl.createProgram();
|
|
97
97
|
if (!program) {
|
|
98
98
|
throw new Error("Failed to create WebGLProgram.");
|
|
99
99
|
}
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
101
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
102
102
|
gl.attachShader(program, vertexShader);
|
|
103
103
|
gl.attachShader(program, fragmentShader);
|
|
104
104
|
gl.linkProgram(program);
|
|
105
105
|
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
106
|
-
|
|
106
|
+
const errorLog = gl.getProgramInfoLog(program);
|
|
107
107
|
gl.deleteProgram(program);
|
|
108
108
|
gl.deleteShader(vertexShader);
|
|
109
109
|
gl.deleteShader(fragmentShader);
|
|
110
|
-
throw new Error(
|
|
110
|
+
throw new Error(`Error linking program:\n${errorLog}`);
|
|
111
111
|
}
|
|
112
112
|
// Detach and delete shaders after linking
|
|
113
113
|
gl.detachShader(program, vertexShader);
|
|
@@ -115,17 +115,17 @@ function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
|
115
115
|
gl.deleteShader(vertexShader);
|
|
116
116
|
gl.deleteShader(fragmentShader);
|
|
117
117
|
// Using an object literal for dynamic properties
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
for (
|
|
121
|
-
|
|
118
|
+
const wrapper = { program: program };
|
|
119
|
+
const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
|
|
120
|
+
for (let i = 0; i < numAttributes; i++) {
|
|
121
|
+
const attribute = gl.getActiveAttrib(program, i);
|
|
122
122
|
if (attribute) {
|
|
123
123
|
wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
|
|
127
|
-
for (
|
|
128
|
-
|
|
126
|
+
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
127
|
+
for (let i = 0; i < numUniforms; i++) {
|
|
128
|
+
const uniform = gl.getActiveUniform(program, i);
|
|
129
129
|
if (uniform) {
|
|
130
130
|
wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name);
|
|
131
131
|
}
|
|
@@ -143,7 +143,7 @@ function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
|
143
143
|
* @throws An error if texture creation fails.
|
|
144
144
|
*/
|
|
145
145
|
function createTexture(gl, filter, data, width, height) {
|
|
146
|
-
|
|
146
|
+
const texture = gl.createTexture();
|
|
147
147
|
if (!texture) {
|
|
148
148
|
throw new Error("Failed to create WebGLTexture.");
|
|
149
149
|
}
|
|
@@ -182,7 +182,7 @@ function bindTexture(gl, texture, unit) {
|
|
|
182
182
|
* @throws An error if buffer creation fails.
|
|
183
183
|
*/
|
|
184
184
|
function createBuffer(gl, data) {
|
|
185
|
-
|
|
185
|
+
const buffer = gl.createBuffer();
|
|
186
186
|
if (!buffer) {
|
|
187
187
|
throw new Error("Failed to create WebGLBuffer.");
|
|
188
188
|
}
|
|
@@ -220,10 +220,10 @@ function bindFramebuffer(gl, framebuffer, texture) {
|
|
|
220
220
|
* @returns A Uint8Array containing the decoded bytes.
|
|
221
221
|
*/
|
|
222
222
|
function decodeBase64(data) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
for (
|
|
223
|
+
const binary_string = atob(data);
|
|
224
|
+
const len = binary_string.length;
|
|
225
|
+
const bytes = new Uint8Array(len);
|
|
226
|
+
for (let i = 0; i < len; i++) {
|
|
227
227
|
bytes[i] = binary_string.charCodeAt(i);
|
|
228
228
|
}
|
|
229
229
|
return bytes;
|
|
@@ -234,14 +234,14 @@ function decodeBase64(data) {
|
|
|
234
234
|
* @returns An HTMLImageElement with the image data loaded.
|
|
235
235
|
*/
|
|
236
236
|
function createImageFromBase64(encodedData) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
237
|
+
const bytes = decodeBase64(encodedData);
|
|
238
|
+
const blob = new Blob([bytes.buffer], { type: "image/png" });
|
|
239
|
+
const urlCreator = window.URL || window.webkitURL;
|
|
240
|
+
const imageUrl = urlCreator.createObjectURL(blob);
|
|
241
|
+
const image = new Image();
|
|
242
242
|
image.src = imageUrl;
|
|
243
243
|
// Revoke the object URL after the image has loaded to free up memory
|
|
244
|
-
image.onload =
|
|
244
|
+
image.onload = () => urlCreator.revokeObjectURL(imageUrl);
|
|
245
245
|
return image;
|
|
246
246
|
}
|
|
247
247
|
/**
|
|
@@ -250,23 +250,23 @@ function createImageFromBase64(encodedData) {
|
|
|
250
250
|
* @returns A Uint8Array representing the RGBA pixel data of the 1x256 color ramp.
|
|
251
251
|
*/
|
|
252
252
|
function getColorRamp(colors) {
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
const canvas = document.createElement('canvas');
|
|
254
|
+
const ctx = canvas.getContext('2d');
|
|
255
255
|
if (!ctx) {
|
|
256
256
|
throw new Error("Failed to get 2D rendering context for canvas.");
|
|
257
257
|
}
|
|
258
258
|
canvas.width = 256;
|
|
259
259
|
canvas.height = 1;
|
|
260
|
-
|
|
261
|
-
for (
|
|
260
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
261
|
+
for (const stop in colors) {
|
|
262
262
|
// Ensure the stop is a valid number, although `addColorStop` can parse strings,
|
|
263
263
|
// explicit conversion is safer for object keys if they come from arbitrary sources.
|
|
264
|
-
|
|
264
|
+
const stopValue = parseFloat(stop);
|
|
265
265
|
if (isNaN(stopValue)) {
|
|
266
|
-
console.warn(
|
|
266
|
+
console.warn(`Invalid stop value for color ramp: ${stop}. Skipping.`);
|
|
267
267
|
continue;
|
|
268
268
|
}
|
|
269
|
-
gradient.addColorStop(stopValue, colors[
|
|
269
|
+
gradient.addColorStop(stopValue, colors[stop]);
|
|
270
270
|
}
|
|
271
271
|
ctx.fillStyle = gradient;
|
|
272
272
|
ctx.fillRect(0, 0, 256, 1);
|
|
@@ -280,16 +280,16 @@ function getColorRamp(colors) {
|
|
|
280
280
|
* @returns A Uint8Array representing the RGBA pixel data of the 1x256 discrete color ramp.
|
|
281
281
|
*/
|
|
282
282
|
function getColorRampDiscrate(values, thresholds) {
|
|
283
|
-
|
|
284
|
-
|
|
283
|
+
const canvas = document.createElement('canvas');
|
|
284
|
+
const ctx = canvas.getContext('2d');
|
|
285
285
|
if (!ctx) {
|
|
286
286
|
throw new Error("Failed to get 2D rendering context for canvas.");
|
|
287
287
|
}
|
|
288
288
|
canvas.width = 256;
|
|
289
289
|
canvas.height = 1;
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
for (
|
|
290
|
+
const gap = 1.0 / 256; // Represents one pixel width in normalized coordinates
|
|
291
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
292
|
+
for (let i = 0; i < thresholds.length - 1; i++) {
|
|
293
293
|
gradient.addColorStop(thresholds[i], values[i]);
|
|
294
294
|
// Create a sharp transition by setting the next stop just before the next threshold
|
|
295
295
|
gradient.addColorStop(Math.max(0, thresholds[i + 1] - gap), values[i]);
|
|
@@ -307,15 +307,15 @@ function getColorRampDiscrate(values, thresholds) {
|
|
|
307
307
|
* @returns A Uint8Array representing the RGBA pixel data of the 1x256 interpolated color ramp.
|
|
308
308
|
*/
|
|
309
309
|
function getColorRampInterpolated(values, thresholds) {
|
|
310
|
-
|
|
311
|
-
|
|
310
|
+
const canvas = document.createElement('canvas');
|
|
311
|
+
const ctx = canvas.getContext('2d');
|
|
312
312
|
if (!ctx) {
|
|
313
313
|
throw new Error("Failed to get 2D rendering context for canvas.");
|
|
314
314
|
}
|
|
315
315
|
canvas.width = 256;
|
|
316
316
|
canvas.height = 1;
|
|
317
|
-
|
|
318
|
-
for (
|
|
317
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
318
|
+
for (let i = 0; i < thresholds.length; i++) {
|
|
319
319
|
gradient.addColorStop(thresholds[i], values[i]);
|
|
320
320
|
}
|
|
321
321
|
ctx.fillStyle = gradient;
|
|
@@ -330,8 +330,7 @@ function getColorRampInterpolated(values, thresholds) {
|
|
|
330
330
|
* @returns A Uint8Array representing the RGBA pixel data of the 1x256 color ramp.
|
|
331
331
|
* @throws An error if an invalid mode is provided.
|
|
332
332
|
*/
|
|
333
|
-
function getColorRampModed(values, thresholds, mode) {
|
|
334
|
-
if (mode === void 0) { mode = "interpolated"; }
|
|
333
|
+
function getColorRampModed(values, thresholds, mode = "interpolated") {
|
|
335
334
|
if (mode === "discrete") {
|
|
336
335
|
return getColorRampDiscrate(values, thresholds);
|
|
337
336
|
}
|
|
@@ -347,7 +346,7 @@ function getColorRampModed(values, thresholds, mode) {
|
|
|
347
346
|
* @returns A Uint8Array representing the RGBA pixel data of the default 1x256 color ramp.
|
|
348
347
|
*/
|
|
349
348
|
function defaultColorRamp() {
|
|
350
|
-
|
|
349
|
+
const defaultRampColors = {
|
|
351
350
|
"0.0": '#5e4fa2',
|
|
352
351
|
"0.15": '#3288bd',
|
|
353
352
|
"0.20": '#66c2a5',
|
|
@@ -368,23 +367,19 @@ function defaultColorRamp() {
|
|
|
368
367
|
*/
|
|
369
368
|
function reloadCurrentGLProgram() {
|
|
370
369
|
return function (target, key, descriptor) {
|
|
371
|
-
|
|
370
|
+
const originalMethod = descriptor.value;
|
|
372
371
|
// Ensure the target has a 'gl' property of type WebGL2RenderingContext
|
|
373
372
|
if (!('gl' in target) || !(target.gl instanceof WebGL2RenderingContext)) {
|
|
374
|
-
console.warn(
|
|
373
|
+
console.warn(`Decorator 'reloadCurrentGLProgram' applied to a method where 'this.gl' is not a WebGL2RenderingContext. This may not function as expected.`);
|
|
375
374
|
// Optionally, throw an error here if strictness is desired
|
|
376
375
|
}
|
|
377
|
-
descriptor.value = function () {
|
|
378
|
-
|
|
379
|
-
for (var _i = 0; _i < arguments.length; _i++) {
|
|
380
|
-
args[_i] = arguments[_i];
|
|
381
|
-
}
|
|
382
|
-
var gl = this.gl;
|
|
376
|
+
descriptor.value = function (...args) {
|
|
377
|
+
const gl = this.gl;
|
|
383
378
|
if (!gl) {
|
|
384
379
|
console.error("reloadCurrentGLProgram decorator: 'gl' context not found on 'this'.");
|
|
385
380
|
return originalMethod.apply(this, args);
|
|
386
381
|
}
|
|
387
|
-
|
|
382
|
+
const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
388
383
|
originalMethod.apply(this, args);
|
|
389
384
|
gl.useProgram(currentProgram);
|
|
390
385
|
};
|
|
@@ -26,21 +26,21 @@ exports.reloadCurrentGLProgram = reloadCurrentGLProgram;
|
|
|
26
26
|
// return shader;
|
|
27
27
|
// }
|
|
28
28
|
function createShader(gl, type, source) {
|
|
29
|
-
|
|
29
|
+
const shader = gl.createShader(type);
|
|
30
30
|
gl.shaderSource(shader, source);
|
|
31
31
|
gl.compileShader(shader);
|
|
32
32
|
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
throw new Error(
|
|
33
|
+
const errorLog = gl.getShaderInfoLog(shader);
|
|
34
|
+
const shaderType = type === gl.VERTEX_SHADER ? 'VERTEX_SHADER' : 'FRAGMENT_SHADER';
|
|
35
|
+
const sourceWithLineNumbers = source.split('\n').map((line, i) => `${i + 1}: ${line}`).join('\n');
|
|
36
|
+
throw new Error(`Error compiling ${shaderType}:\n${errorLog}\nSource:\n${sourceWithLineNumbers}`);
|
|
37
37
|
}
|
|
38
38
|
return shader;
|
|
39
39
|
}
|
|
40
40
|
function createProgram(gl, vertexSource, fragmentSource) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
const program = gl.createProgram();
|
|
42
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
43
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
44
44
|
gl.compileShader(vertexShader);
|
|
45
45
|
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
|
46
46
|
console.error(gl.getShaderInfoLog(vertexShader));
|
|
@@ -61,9 +61,9 @@ function createProgram(gl, vertexSource, fragmentSource) {
|
|
|
61
61
|
return program;
|
|
62
62
|
}
|
|
63
63
|
function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
const program = gl.createProgram();
|
|
65
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
66
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
67
67
|
gl.attachShader(program, vertexShader);
|
|
68
68
|
gl.attachShader(program, fragmentShader);
|
|
69
69
|
gl.linkProgram(program);
|
|
@@ -71,21 +71,21 @@ function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
|
71
71
|
// console.log(gl.getProgramInfoLog(program));
|
|
72
72
|
throw new Error(gl.getProgramInfoLog(program));
|
|
73
73
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
for (
|
|
77
|
-
|
|
74
|
+
const wrapper = { program: program };
|
|
75
|
+
const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
|
|
76
|
+
for (let i = 0; i < numAttributes; i++) {
|
|
77
|
+
const attribute = gl.getActiveAttrib(program, i);
|
|
78
78
|
wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name);
|
|
79
79
|
}
|
|
80
|
-
|
|
81
|
-
for (
|
|
82
|
-
|
|
80
|
+
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
81
|
+
for (let i = 0; i < numUniforms; i++) {
|
|
82
|
+
const uniform = gl.getActiveUniform(program, i);
|
|
83
83
|
wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name);
|
|
84
84
|
}
|
|
85
85
|
return wrapper;
|
|
86
86
|
}
|
|
87
87
|
function createTexture(gl, filter, data, width, height) {
|
|
88
|
-
|
|
88
|
+
const texture = gl.createTexture();
|
|
89
89
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
90
90
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
91
91
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
@@ -105,7 +105,7 @@ function bindTexture(gl, texture, unit) {
|
|
|
105
105
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
106
106
|
}
|
|
107
107
|
function createBuffer(gl, data) {
|
|
108
|
-
|
|
108
|
+
const buffer = gl.createBuffer();
|
|
109
109
|
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
110
110
|
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
111
111
|
return buffer;
|
|
@@ -125,33 +125,33 @@ function bindFramebuffer(gl, framebuffer, texture) {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
function decodeBase64(data) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
for (
|
|
128
|
+
const binary_string = atob(data);
|
|
129
|
+
const len = binary_string.length;
|
|
130
|
+
const bytes = new Uint8Array(len);
|
|
131
|
+
for (let i = 0; i < len; i++) {
|
|
132
132
|
bytes[i] = binary_string.charCodeAt(i);
|
|
133
133
|
}
|
|
134
134
|
return bytes;
|
|
135
135
|
}
|
|
136
136
|
function createImageFromBase64(encodedData) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
const bytes = decodeBase64(encodedData);
|
|
138
|
+
const blob = new Blob([bytes.buffer], { type: "image/png" });
|
|
139
|
+
const urlCreator = window.URL || window.webkitURL;
|
|
140
|
+
const imageUrl = urlCreator.createObjectURL(blob);
|
|
141
|
+
const image = new Image();
|
|
142
142
|
image.src = imageUrl;
|
|
143
143
|
return image;
|
|
144
144
|
}
|
|
145
145
|
function getColorRamp(colors) {
|
|
146
146
|
// console.log("getColorRamp", colors)
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
const canvas = document.createElement('canvas');
|
|
148
|
+
const ctx = canvas.getContext('2d');
|
|
149
149
|
canvas.width = 256;
|
|
150
150
|
canvas.height = 1;
|
|
151
|
-
|
|
152
|
-
for (
|
|
151
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
152
|
+
for (const stop in colors) {
|
|
153
153
|
// console.log("stop", stop);
|
|
154
|
-
gradient.addColorStop(colors[
|
|
154
|
+
gradient.addColorStop(colors[stop][0], colors[stop][1]);
|
|
155
155
|
// Alttaki satir ile gradienti cevirip, shaderda ki `speed_t = 1.0 - speed_t`' kaldirdim.
|
|
156
156
|
// gradientin en dusuk olmasi gereken siyah - mavi aralikta, mor renk gozlemledim.
|
|
157
157
|
// gradient.addColorStop( 1.0 - colors[stop][0], colors[stop][1]);
|
|
@@ -161,13 +161,13 @@ function getColorRamp(colors) {
|
|
|
161
161
|
return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data);
|
|
162
162
|
}
|
|
163
163
|
function getColorRampDiscrate(values, thresholds) {
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
const canvas = document.createElement('canvas');
|
|
165
|
+
const ctx = canvas.getContext('2d');
|
|
166
166
|
canvas.width = 256;
|
|
167
167
|
canvas.height = 1;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
for (
|
|
168
|
+
const gap = 1.0 / 256;
|
|
169
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
170
|
+
for (let i = 0; i < thresholds.length - 1; i++) {
|
|
171
171
|
gradient.addColorStop(thresholds[i], values[i]);
|
|
172
172
|
gradient.addColorStop(thresholds[i + 1] - gap, values[i]);
|
|
173
173
|
}
|
|
@@ -177,15 +177,15 @@ function getColorRampDiscrate(values, thresholds) {
|
|
|
177
177
|
return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data);
|
|
178
178
|
}
|
|
179
179
|
function getColorRampInterpolated(values, thresholds) {
|
|
180
|
-
|
|
181
|
-
|
|
180
|
+
const canvas = document.createElement('canvas');
|
|
181
|
+
const ctx = canvas.getContext('2d');
|
|
182
182
|
canvas.width = 256;
|
|
183
183
|
canvas.height = 1;
|
|
184
|
-
|
|
184
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
185
185
|
// const gap = 1.0 / 256;
|
|
186
186
|
// gradient.addColorStop(thresholds[0], values[0]);
|
|
187
187
|
// gradient.addColorStop(thresholds[0] + gap, values[1]);
|
|
188
|
-
for (
|
|
188
|
+
for (let i = 0; i < thresholds.length; i++) {
|
|
189
189
|
gradient.addColorStop(thresholds[i], values[i]);
|
|
190
190
|
}
|
|
191
191
|
// gradient.addColorStop(thresholds[thresholds.length - 1] - gap, values[values.length - 1]);
|
|
@@ -198,8 +198,7 @@ function getColorRampInterpolated(values, thresholds) {
|
|
|
198
198
|
* thresholds: n number of thresholds. Ex: [0, 10, 20]
|
|
199
199
|
* mode: [discrete, interpolated,]
|
|
200
200
|
*/
|
|
201
|
-
function getColorRampModed(values, thresholds, mode) {
|
|
202
|
-
if (mode === void 0) { mode = "interpolated"; }
|
|
201
|
+
function getColorRampModed(values, thresholds, mode = "interpolated") {
|
|
203
202
|
if (mode === "discrete") {
|
|
204
203
|
return getColorRampDiscrate(values, thresholds);
|
|
205
204
|
}
|
|
@@ -211,7 +210,7 @@ function getColorRampModed(values, thresholds, mode) {
|
|
|
211
210
|
}
|
|
212
211
|
}
|
|
213
212
|
function defaultColorRamp() {
|
|
214
|
-
|
|
213
|
+
const defaultRampColors = [
|
|
215
214
|
[0.0, '#5e4fa2'],
|
|
216
215
|
[0.15, '#3288bd'],
|
|
217
216
|
[0.20, '#66c2a5'],
|
|
@@ -227,10 +226,10 @@ function defaultColorRamp() {
|
|
|
227
226
|
}
|
|
228
227
|
function reloadCurrentGLProgram() {
|
|
229
228
|
return function (target, key, descriptor) {
|
|
230
|
-
|
|
229
|
+
const originalMethod = descriptor.value;
|
|
231
230
|
descriptor.value = function () {
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
const gl = target.gl;
|
|
232
|
+
const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
234
233
|
originalMethod.apply(this, arguments);
|
|
235
234
|
gl.useProgram(currentProgram);
|
|
236
235
|
};
|
package/waveparticles/adaptor.js
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.centigradePlus90ToVectorArray = centigradePlus90ToVectorArray;
|
|
4
|
-
function centigradePlus90ToVectorArray(centigradeArray, noDataValue) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
for (var i = 0; i < centigradeArray.length; i++) {
|
|
4
|
+
function centigradePlus90ToVectorArray(centigradeArray, noDataValue = -9999) {
|
|
5
|
+
const vectorArray = new Float32Array(centigradeArray.length * 2);
|
|
6
|
+
for (let i = 0; i < centigradeArray.length; i++) {
|
|
8
7
|
if (centigradeArray[i] === noDataValue) {
|
|
9
8
|
vectorArray.set([0, 0], i * 2);
|
|
10
9
|
continue;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const rad = (centigradeArray[i] + 90.0) * Math.PI / 180;
|
|
12
|
+
const x = Math.cos(rad);
|
|
13
|
+
const y = Math.sin(rad);
|
|
15
14
|
vectorArray.set([x, y], i * 2);
|
|
16
15
|
}
|
|
17
16
|
return vectorArray;
|
package/waveparticles/index.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.VectorFieldWaveParticle = exports.centigradePlus90ToVectorArray = void 0;
|
|
7
|
-
|
|
7
|
+
const plugin_1 = __importDefault(require("./plugin"));
|
|
8
8
|
exports.VectorFieldWaveParticle = plugin_1.default;
|
|
9
|
-
|
|
9
|
+
const adaptor_1 = require("./adaptor");
|
|
10
10
|
Object.defineProperty(exports, "centigradePlus90ToVectorArray", { enumerable: true, get: function () { return adaptor_1.centigradePlus90ToVectorArray; } });
|