@pirireis/webglobeplugins 0.0.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/arrowfield/adaptor.js +11 -0
- package/arrowfield/index.js +4 -0
- package/arrowfield/plugin.js +128 -0
- package/compassrose/compassrose.js +394 -0
- package/compassrose/index.js +2 -0
- package/heatwavemaps/index.js +4 -0
- package/heatwavemaps/isobar/objectarraylabels.js +247 -0
- package/heatwavemaps/isobar/plugin.js +337 -0
- package/heatwavemaps/isobar/quadtreecontours.js +338 -0
- package/heatwavemaps/plugins/heatwaveglobeshell.js +257 -0
- package/index.js +8 -0
- package/package.json +7 -0
- package/programs/arrowfield/index.js +2 -0
- package/programs/arrowfield/logic.js +284 -0
- package/programs/arrowfield/object.js +89 -0
- package/programs/float2legendwithratio/index.js +3 -0
- package/programs/float2legendwithratio/logic.js +189 -0
- package/programs/float2legendwithratio/object.js +132 -0
- package/programs/globeshell/index.js +2 -0
- package/programs/globeshell/noise/noises.js +0 -0
- package/programs/globeshell/wiggle/index.js +6 -0
- package/programs/globeshell/wiggle/logic.js +374 -0
- package/programs/globeshell/wiggle/object.js +94 -0
- package/programs/helpers/blender/index.js +0 -0
- package/programs/helpers/blender/program.js +91 -0
- package/programs/helpers/fadeaway/index.js +3 -0
- package/programs/helpers/fadeaway/logic.js +76 -0
- package/programs/helpers/fadeaway/object.js +20 -0
- package/programs/helpers/index.js +2 -0
- package/programs/index.js +21 -0
- package/programs/programcache.js +119 -0
- package/programs/rings/distancering/circleflatprogram.js +135 -0
- package/programs/rings/distancering/circlepaddysharedbuffer.js +502 -0
- package/programs/rings/distancering/index.js +5 -0
- package/programs/rings/distancering/paddyflatprogram.js +131 -0
- package/programs/rings/distancering/shader.js +0 -0
- package/programs/rings/index.js +9 -0
- package/programs/totems/camerauniformblock.js +129 -0
- package/programs/totems/index.js +2 -0
- package/programs/util.js +17 -0
- package/programs/vectorfields/index.js +3 -0
- package/programs/vectorfields/logics/drawrectangleparticles.js +125 -0
- package/programs/vectorfields/logics/index.js +5 -0
- package/programs/vectorfields/logics/pixelbased.js +161 -0
- package/programs/vectorfields/logics/ubo.js +64 -0
- package/programs/vectorfields/pingpongbuffermanager.js +80 -0
- package/rangerings/index.js +3 -0
- package/rangerings/rangerings.js +88 -0
- package/timetracks/adaptors.js +133 -0
- package/timetracks/index.js +3 -0
- package/timetracks/plugin.js +304 -0
- package/timetracks/program.js +850 -0
- package/timetracks/programpoint.js +168 -0
- package/util/datamanager/datamanager.js +168 -0
- package/util/datamanager/index.js +3 -0
- package/util/datamanager/pointcoordinatesdatacalculator.js +133 -0
- package/util/datamanager/pointcoordsmeta.js +22 -0
- package/util/geometry/geodatafromtexture.js +52 -0
- package/util/geometry/index.js +44 -0
- package/util/index.js +13 -0
- package/util/jshelpers/index.js +1 -0
- package/util/jshelpers/timefilters.js +32 -0
- package/util/jshelpers/timemethods.js +19 -0
- package/util/programs/index.js +2 -0
- package/util/programs/shapesonglobe.js +248 -0
- package/util/programs/supersampletotextures.js +142 -0
- package/util/programs/texturetoglobe.js +203 -0
- package/util/shaderfunctions/geometrytransformations.js +129 -0
- package/util/shaderfunctions/index.js +2 -0
- package/util/shaderfunctions/nodata.js +10 -0
- package/util/shaderfunctions/noisefunctions.js +44 -0
- package/util/webglobe/gldefaultstates.js +4 -0
- package/util/webglobe/index.js +2 -0
- package/util/webglobe/rasteroverlay.js +96 -0
- package/util/webglobjectbuilders.js +256 -0
- package/waveparticles/adaptor.js +16 -0
- package/waveparticles/index.js +4 -0
- package/waveparticles/plugin.js +281 -0
- package/wind/imagetovectorfieldandmagnitude.js +39 -0
- package/wind/index.js +7 -0
- package/wind/plugin.js +1032 -0
- package/wind/vectorfieldimage.js +27 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// Z in kolometers
|
|
2
|
+
//
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
export const POLE = `
|
|
7
|
+
#ifndef POLE
|
|
8
|
+
#define POLE 20037508.34
|
|
9
|
+
#endif
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
export const R = `
|
|
13
|
+
#ifndef R
|
|
14
|
+
#define R 6378136.99911
|
|
15
|
+
#endif
|
|
16
|
+
`;
|
|
17
|
+
|
|
18
|
+
export const PI = `
|
|
19
|
+
#ifndef PI
|
|
20
|
+
#define PI 3.1415926535897932384626433832795
|
|
21
|
+
#endif
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
export const POLE_BY_PI = `
|
|
25
|
+
#ifndef POLE_BY_PI
|
|
26
|
+
#define POLE_BY_PI 6378136.99911
|
|
27
|
+
#endif
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
export const R_3D = `
|
|
31
|
+
#ifndef R_3D
|
|
32
|
+
#define R_3D 6378.137
|
|
33
|
+
#endif
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
export const pixelXYToCartesian3DPoint = R_3D + PI + `
|
|
37
|
+
vec3 pixelXYToCartesian3DPoint( vec3 position) {
|
|
38
|
+
float longRad = PI * (2.0 * position.x - 1.0);
|
|
39
|
+
float latRad = PI * position.y;
|
|
40
|
+
float radius = R_3D + position.z;
|
|
41
|
+
float x = radius * sin(latRad) * cos(longRad);
|
|
42
|
+
float y = radius * sin(latRad) * sin(longRad);
|
|
43
|
+
float z = radius * cos(latRad);
|
|
44
|
+
return vec3(x, y, z);
|
|
45
|
+
}
|
|
46
|
+
`;
|
|
47
|
+
|
|
48
|
+
export const pixelXYToCartesian2DPoint = PI + POLE + POLE_BY_PI + `
|
|
49
|
+
vec2 pixelXYToCartesian2DPoint( vec2 position, vec2 translate, vec2 mapWH, vec2 screenWH) {
|
|
50
|
+
float x = (2.0 * position.x - 1.0) * POLE;
|
|
51
|
+
x = ((x - translate.x) / mapWH.x) * screenWH.x;
|
|
52
|
+
float y = log( tan( ( 1.0 - position.y ) * PI / 2.0 ) ) * POLE_BY_PI;
|
|
53
|
+
y = (1.0 - (y - translate.y) / mapWH.y) * screenWH.y;
|
|
54
|
+
return vec2(x, y);
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
export const mercatorXYTo2DPoint = `
|
|
60
|
+
vec4 mercatorXYTo2DPoint( vec2 position) { // projection, translate, mapWH, screenWH comes from camera uniform block
|
|
61
|
+
float x = (( position.x - translate.x ) / mapWH.x) * screenWH.x;
|
|
62
|
+
float y = (1.0 - (position.y - translate.y) / mapWH.y) * screenWH.y;
|
|
63
|
+
return projection * vec4(x, y, 0.0, 1.0);
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
// pi / pole = 2 / R
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
export const longLatRadToMercator = R + PI + `
|
|
75
|
+
vec2 longLatRadToMercator( vec2 longLatRad) {
|
|
76
|
+
float x = R * longLatRad.x;
|
|
77
|
+
float y = R * log( tan( PI / 4.0 + longLatRad.y / 2.0 ) );
|
|
78
|
+
return vec2(x, y);
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export const longLatRadToCartesian3D = R_3D + `
|
|
84
|
+
vec3 longLatRadToCartesian3D( vec2 longLat) {
|
|
85
|
+
float x = R_3D * cos(longLat.y) * cos(longLat.x);
|
|
86
|
+
float y = R_3D * cos(longLat.y) * sin(longLat.x);
|
|
87
|
+
float z = R_3D * sin(longLat.y);
|
|
88
|
+
return vec3(x, y, z);
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
export const circleLimpFromLongLatRadCenterCartesian3D = R + `
|
|
95
|
+
vec3 circleLimpFromLongLatRadCenterCartesian3D( vec2 center, float radius, float angle) {
|
|
96
|
+
vec3 geoW = longLatRadToCartesian3D(center);
|
|
97
|
+
vec3 normal = normalize(geoW);
|
|
98
|
+
vec3 tangent1 = cross(normal, vec3(0.0, 0.0, 1.0));
|
|
99
|
+
if ( length(tangent1) < 0.1 ){ tangent1 = cross(normal, vec3(0.0, 1.0, 0.0)); }
|
|
100
|
+
tangent1 = normalize(tangent1);
|
|
101
|
+
// rotate tangent with given angle
|
|
102
|
+
tangent1 = cos(angle) * tangent1 + sin(angle) * cross(normal, tangent1);
|
|
103
|
+
return (geoW * cos(radius/R))+ tangent1 * radius / 1000.0;
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
export const circleLimpFromLongLatRadCenterMercatorRealDistance = `
|
|
109
|
+
vec2 circleLimpFromLongLatRadCenterMercatorRealDistance(vec2 center, float radius, float angle){
|
|
110
|
+
|
|
111
|
+
float radius_radian = radius / R;
|
|
112
|
+
float lat = center.y + radius_radian * sin(angle);
|
|
113
|
+
float scale = 1.0/abs( cos( lat ) );
|
|
114
|
+
vec2 center_ = longLatRadToMercator(center);
|
|
115
|
+
|
|
116
|
+
float x = center_.x + scale * radius * cos(angle);
|
|
117
|
+
float y = center_.y + scale * radius * sin(angle);
|
|
118
|
+
return vec2(x, y);
|
|
119
|
+
}
|
|
120
|
+
`;
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
export const circleLimpFromLongLatRadCenterMercatorCompass = `
|
|
124
|
+
vec2 circleLimpFromLongLatRadCenterMercatorCompass(vec2 center, float radius, float angle){
|
|
125
|
+
vec2 center_ = longLatRadToMercator(center);
|
|
126
|
+
float y = sin(angle) * radius + center_.y;
|
|
127
|
+
float x = cos(angle) * radius + center_.x;
|
|
128
|
+
return vec2(x, y);
|
|
129
|
+
}`;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const vertexIDtoTextureCoordinate = `
|
|
2
|
+
vec2 vertexIDtoTextureCoordinate(float id, vec2 textureDimentions) {
|
|
3
|
+
float x = mod(id, textureDimentions.x);
|
|
4
|
+
float y = floor(id / textureDimentions.x);
|
|
5
|
+
return vec2( x / textureDimentions.x, y / textureDimentions.y);
|
|
6
|
+
}
|
|
7
|
+
`;
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export {vertexIDtoTextureCoordinate};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const permute34 = ```vec3 permute34(vec3 x) {
|
|
2
|
+
x = ((x * 34.0) + 1.0) * x;
|
|
3
|
+
return x - floor(x * (1.0 / 289.0)) * 289.0;
|
|
4
|
+
}```;
|
|
5
|
+
|
|
6
|
+
const waveNoice = ```float waveNoice(vec2 v)
|
|
7
|
+
{
|
|
8
|
+
const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
|
|
9
|
+
|
|
10
|
+
vec2 i = floor(v + dot(v, C.yy));
|
|
11
|
+
vec2 x0 = v - i + dot(i, C.xx);
|
|
12
|
+
|
|
13
|
+
vec2 i1;
|
|
14
|
+
i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
|
|
15
|
+
|
|
16
|
+
vec4 x12 = x0.xyxy + C.xxzz;
|
|
17
|
+
x12.xy -= i1;
|
|
18
|
+
|
|
19
|
+
i = i - floor(i * (1.0 / 289.0)) * 289.0;
|
|
20
|
+
|
|
21
|
+
vec3 p = permute(permute(i.y + vec3(0.0, i1.y, 1.0))
|
|
22
|
+
+ i.x + vec3(0.0, i1.x, 1.0));
|
|
23
|
+
|
|
24
|
+
vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0);
|
|
25
|
+
m = m * m;
|
|
26
|
+
m = m * m;
|
|
27
|
+
|
|
28
|
+
vec3 x = 2.0 * fract(p * C.www) - 1.0;
|
|
29
|
+
vec3 h = abs(x) - 0.5;
|
|
30
|
+
vec3 ox = floor(x + 0.5);
|
|
31
|
+
vec3 a0 = x - ox;
|
|
32
|
+
|
|
33
|
+
m *= inversesqrt(a0 * a0 + h * h);
|
|
34
|
+
|
|
35
|
+
vec3 g;
|
|
36
|
+
g.x = a0.x * x0.x + h.x * x0.y;
|
|
37
|
+
g.yz = a0.yz * x12.xz + h.yz * x12.yw;
|
|
38
|
+
return 130.0 * dot(m, g);
|
|
39
|
+
}```;
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
export default {
|
|
43
|
+
permute34, waveNoice
|
|
44
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Iceride bir canvas uretir ve degisiklikler bu kanvasta yapilir
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// this class loads texture to raster overlay
|
|
6
|
+
class RasterOverlayLoader {
|
|
7
|
+
constructor(id, globe, { opacity = 1.0, minLon = -180, minLat = -90, maxLon = 180, maxLat = 90, beforeObject = null, canvas = null, callBack = null } = {}) {
|
|
8
|
+
|
|
9
|
+
this.canvas = canvas || document.createElement('canvas');
|
|
10
|
+
this.gl = this.canvas.getContext('webgl2');
|
|
11
|
+
this.globe = globe;
|
|
12
|
+
this.id = id;
|
|
13
|
+
this._opacity = opacity;
|
|
14
|
+
this.bbox = { ll: { x: minLon, y: minLat }, ur: { x: maxLon, y: maxLat } };
|
|
15
|
+
|
|
16
|
+
this._beforeObject = beforeObject;
|
|
17
|
+
|
|
18
|
+
this._isProcessing = false;
|
|
19
|
+
this._callBack = callBack;
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
getGL() {
|
|
24
|
+
return this.gl;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
getCanvasURL() {
|
|
28
|
+
return this.canvas.toDataURL();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
setBBox(minLon, minLat, maxLon, maxLat) {
|
|
32
|
+
this.bbox = { ll: { x: minLon, y: minLat }, ur: { x: maxLon, y: maxLat } };
|
|
33
|
+
this.draw();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
setCanvasWidthHeight(width, height) {
|
|
37
|
+
this.canvas.width = width;
|
|
38
|
+
this.canvas.height = height;
|
|
39
|
+
this.gl.viewport(0, 0, width, height);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
draw() {
|
|
44
|
+
if (!this._isProcessing) {
|
|
45
|
+
requestAnimationFrame(this._draw.bind(this));
|
|
46
|
+
this._isProcessing = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
_draw() {
|
|
52
|
+
this.globe.api_DeleteImageOverlay(this.id);
|
|
53
|
+
const id = this.id;
|
|
54
|
+
const imgUrl = this.getCanvasURL()
|
|
55
|
+
const bbox = this.bbox
|
|
56
|
+
const opacity = this._opacity
|
|
57
|
+
const rotDeg = 0
|
|
58
|
+
const color = null
|
|
59
|
+
const beforeObject = this._beforeObject
|
|
60
|
+
const callback = this._callBack || function () { };
|
|
61
|
+
this.globe.api_AddImageOverlay(id, imgUrl, bbox, color, opacity, rotDeg, beforeObject, callback);
|
|
62
|
+
this._isProcessing = false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
setBeforeObject(beforeObject) {
|
|
66
|
+
this._beforeObject = beforeObject;
|
|
67
|
+
this.draw();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
setCallback(callback) {
|
|
71
|
+
this._callBack = callback;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
setOpacity(opacity) {
|
|
75
|
+
if (opacity < 0 || opacity > 1) { return; }
|
|
76
|
+
this._opacity = opacity;
|
|
77
|
+
this.globe.api_SetImageOverlayColor(this.id, null, opacity)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
free() {
|
|
82
|
+
this.globe.api_DeleteImageOverlay(this.id);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
on() {
|
|
87
|
+
this.draw();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
off() {
|
|
91
|
+
this.globe.api_DeleteImageOverlay(this.id);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export { RasterOverlayLoader };
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
|
|
2
|
+
export function createShader(gl, type, source) {
|
|
3
|
+
const shader = gl.createShader(type);
|
|
4
|
+
gl.shaderSource(shader, source);
|
|
5
|
+
|
|
6
|
+
gl.compileShader(shader);
|
|
7
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
8
|
+
throw new Error(gl.getShaderInfoLog(shader));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return shader;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function createProgram(gl, vertexSource, fragmentSource) {
|
|
15
|
+
const program = gl.createProgram();
|
|
16
|
+
|
|
17
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
18
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
19
|
+
|
|
20
|
+
gl.compileShader(vertexShader);
|
|
21
|
+
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
|
|
22
|
+
console.error(gl.getShaderInfoLog(vertexShader));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
gl.compileShader(fragmentShader);
|
|
27
|
+
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
|
|
28
|
+
console.error(gl.getShaderInfoLog(fragmentShader));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
gl.attachShader(program, vertexShader);
|
|
33
|
+
gl.attachShader(program, fragmentShader);
|
|
34
|
+
gl.linkProgram(program);
|
|
35
|
+
|
|
36
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
37
|
+
console.error(gl.getProgramInfoLog(program));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
return program;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function createProgramWrapper(gl, vertexSource, fragmentSource) {
|
|
44
|
+
const program = gl.createProgram();
|
|
45
|
+
|
|
46
|
+
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
47
|
+
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
48
|
+
|
|
49
|
+
gl.attachShader(program, vertexShader);
|
|
50
|
+
gl.attachShader(program, fragmentShader);
|
|
51
|
+
|
|
52
|
+
gl.linkProgram(program);
|
|
53
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
54
|
+
console.log(gl.getProgramInfoLog(program));
|
|
55
|
+
throw new Error(gl.getProgramInfoLog(program));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const wrapper = { program: program };
|
|
59
|
+
|
|
60
|
+
const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
|
|
61
|
+
for (let i = 0; i < numAttributes; i++) {
|
|
62
|
+
const attribute = gl.getActiveAttrib(program, i);
|
|
63
|
+
wrapper[attribute.name] = gl.getAttribLocation(program, attribute.name);
|
|
64
|
+
}
|
|
65
|
+
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
|
|
66
|
+
for (let i = 0; i < numUniforms; i++) {
|
|
67
|
+
const uniform = gl.getActiveUniform(program, i);
|
|
68
|
+
wrapper[uniform.name] = gl.getUniformLocation(program, uniform.name);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return wrapper;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function createTexture(gl, filter, data, width, height) {
|
|
75
|
+
const texture = gl.createTexture();
|
|
76
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
77
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
78
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
79
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
|
|
80
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
|
|
81
|
+
if (data instanceof Uint8Array) {
|
|
82
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
83
|
+
} else {
|
|
84
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
85
|
+
}
|
|
86
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
87
|
+
return texture;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function bindTexture(gl, texture, unit) {
|
|
91
|
+
gl.activeTexture(gl.TEXTURE0 + unit);
|
|
92
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function createBuffer(gl, data) {
|
|
96
|
+
const buffer = gl.createBuffer();
|
|
97
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
98
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
99
|
+
return buffer;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function bindAttribute(gl, buffer, attribute, numComponents) {
|
|
103
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
104
|
+
gl.enableVertexAttribArray(attribute);
|
|
105
|
+
gl.vertexAttribPointer(attribute, numComponents, gl.FLOAT, false, 0, 0);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function bindFramebuffer(gl, framebuffer, texture) {
|
|
109
|
+
if (texture) {
|
|
110
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
|
|
111
|
+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
|
|
112
|
+
} else {
|
|
113
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
export function decodeBase64(data) {
|
|
119
|
+
const binary_string = atob(data);
|
|
120
|
+
const len = binary_string.length;
|
|
121
|
+
const bytes = new Uint8Array(len);
|
|
122
|
+
for (let i = 0; i < len; i++) {
|
|
123
|
+
bytes[i] = binary_string.charCodeAt(i);
|
|
124
|
+
}
|
|
125
|
+
return bytes;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
export function createImageFromBase64(encodedData) {
|
|
130
|
+
const bytes = decodeBase64(encodedData);
|
|
131
|
+
const blob = new Blob([bytes.buffer], { type: "image/png" });
|
|
132
|
+
const urlCreator = window.URL || window.webkitURL;
|
|
133
|
+
const imageUrl = urlCreator.createObjectURL(blob);
|
|
134
|
+
const image = new Image();
|
|
135
|
+
image.src = imageUrl;
|
|
136
|
+
return image;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
export function getColorRamp(colors) {
|
|
141
|
+
// console.log("getColorRamp", colors)
|
|
142
|
+
const canvas = document.createElement('canvas');
|
|
143
|
+
const ctx = canvas.getContext('2d');
|
|
144
|
+
|
|
145
|
+
canvas.width = 256;
|
|
146
|
+
canvas.height = 1;
|
|
147
|
+
|
|
148
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
149
|
+
|
|
150
|
+
for (const stop in colors) {
|
|
151
|
+
// console.log("stop", stop);
|
|
152
|
+
gradient.addColorStop(colors[stop][0], colors[stop][1]);
|
|
153
|
+
// Alttaki satir ile gradienti cevirip, shaderda ki `speed_t = 1.0 - speed_t`' kaldirdim.
|
|
154
|
+
// gradientin en dusuk olmasi gereken siyah - mavi aralikta, mor renk gozlemledim.
|
|
155
|
+
// gradient.addColorStop( 1.0 - colors[stop][0], colors[stop][1]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
ctx.fillStyle = gradient;
|
|
159
|
+
ctx.fillRect(0, 0, 256, 1);
|
|
160
|
+
|
|
161
|
+
return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
export function getColorRampDiscrate(values, thresholds) {
|
|
166
|
+
|
|
167
|
+
const canvas = document.createElement('canvas');
|
|
168
|
+
const ctx = canvas.getContext('2d');
|
|
169
|
+
|
|
170
|
+
canvas.width = 256;
|
|
171
|
+
canvas.height = 1;
|
|
172
|
+
|
|
173
|
+
const gap = 1.0 / 256;
|
|
174
|
+
|
|
175
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
176
|
+
|
|
177
|
+
for (let i = 0; i < thresholds.length - 1; i++) {
|
|
178
|
+
gradient.addColorStop(thresholds[i], values[i]);
|
|
179
|
+
gradient.addColorStop(thresholds[i + 1] - gap
|
|
180
|
+
, values[i]);
|
|
181
|
+
}
|
|
182
|
+
gradient.addColorStop(thresholds[thresholds.length - 1], values[values.length - 1]);
|
|
183
|
+
ctx.fillStyle = gradient;
|
|
184
|
+
ctx.fillRect(0, 0, 256, 1);
|
|
185
|
+
|
|
186
|
+
return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function getColorRampInterpolated(values, thresholds) {
|
|
190
|
+
|
|
191
|
+
const canvas = document.createElement('canvas');
|
|
192
|
+
const ctx = canvas.getContext('2d');
|
|
193
|
+
|
|
194
|
+
canvas.width = 256;
|
|
195
|
+
canvas.height = 1;
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
const gradient = ctx.createLinearGradient(0, 0, 256, 0);
|
|
199
|
+
|
|
200
|
+
// const gap = 1.0 / 256;
|
|
201
|
+
// gradient.addColorStop(thresholds[0], values[0]);
|
|
202
|
+
// gradient.addColorStop(thresholds[0] + gap, values[1]);
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
for (let i = 0; i < thresholds.length; i++) {
|
|
206
|
+
gradient.addColorStop(thresholds[i], values[i]);
|
|
207
|
+
}
|
|
208
|
+
// gradient.addColorStop(thresholds[thresholds.length - 1] - gap, values[values.length - 1]);
|
|
209
|
+
ctx.fillStyle = gradient;
|
|
210
|
+
ctx.fillRect(0, 0, 256, 1);
|
|
211
|
+
|
|
212
|
+
return new Uint8Array(ctx.getImageData(0, 0, 256, 1).data);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* values: n + 1 number of color hex values without alpha channel. Ex: ["#ff0000", "#00ff00", "#0000ff"]
|
|
217
|
+
* thresholds: n number of thresholds. Ex: [0, 10, 20]
|
|
218
|
+
* mode: [discrete, interpolated,]
|
|
219
|
+
*/
|
|
220
|
+
export function getColorRampModed(values, thresholds, mode = "interpolated") {
|
|
221
|
+
|
|
222
|
+
if (mode === "discrete") {
|
|
223
|
+
return getColorRampDiscrate(values, thresholds);
|
|
224
|
+
} else if (mode === "interpolated") {
|
|
225
|
+
return getColorRampInterpolated(values, thresholds);
|
|
226
|
+
} else {
|
|
227
|
+
throw new Error("mode is not valid");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export function defaultColorRamp() {
|
|
231
|
+
const defaultRampColors = [
|
|
232
|
+
[0.0, '#5e4fa2'],
|
|
233
|
+
[0.15, '#3288bd'],
|
|
234
|
+
[0.20, '#66c2a5'],
|
|
235
|
+
[0.25, '#66c2a5'],
|
|
236
|
+
[0.3, '#abdda4'],
|
|
237
|
+
[0.4, '#e6f598'],
|
|
238
|
+
[0.5, '#fee08b'],
|
|
239
|
+
[0.6, '#fdae61'],
|
|
240
|
+
[0.7, '#f46d43'],
|
|
241
|
+
[1.0, '#ff1e13']
|
|
242
|
+
];
|
|
243
|
+
return getColorRamp(defaultRampColors);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export function reloadCurrentGLProgram() {
|
|
247
|
+
return function (target, key, descriptor) {
|
|
248
|
+
const originalMethod = descriptor.value;
|
|
249
|
+
descriptor.value = function () {
|
|
250
|
+
const gl = target.gl;
|
|
251
|
+
const currentProgram = gl.getParameter(gl.CURRENT_PROGRAM);
|
|
252
|
+
originalMethod.apply(this, arguments);
|
|
253
|
+
gl.useProgram(currentProgram);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function centigradePlus90ToVectorArray(centigradeArray, noDataValue = -9999) {
|
|
2
|
+
const vectorArray = new Float32Array(centigradeArray.length * 2);
|
|
3
|
+
for (let i = 0; i < centigradeArray.length; i++) {
|
|
4
|
+
if (centigradeArray[i] === noDataValue) {
|
|
5
|
+
vectorArray.set([0, 0], i * 2);
|
|
6
|
+
continue;
|
|
7
|
+
}
|
|
8
|
+
const rad = (centigradeArray[i] + 90.0) * Math.PI / 180;
|
|
9
|
+
const x = Math.cos(rad);
|
|
10
|
+
const y = Math.sin(rad);
|
|
11
|
+
vectorArray.set([x, y], i * 2);
|
|
12
|
+
}
|
|
13
|
+
return vectorArray;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { centigradePlus90ToVectorArray }
|