@pirireis/webglobeplugins 0.10.2-alpha → 0.10.3-alpha
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/package.json +1 -1
- package/programs/line-on-globe/linestrip.js +0 -4
- package/programs/util.js +0 -1
- package/programs/vectorfields/logics/constants.js +4 -0
- package/programs/vectorfields/logics/drawrectangleparticles.js +26 -8
- package/programs/vectorfields/logics/pixelbased.js +33 -4
- package/programs/vectorfields/logics/ubo-new.js +25 -0
- package/programs/vectorfields/logics/ubo.js +11 -8
- package/util/gl-util/uniform-block/manager.js +29 -3
- package/util/heatwavedatamanager/pointcoordinatesdatacalculator1.js +1 -1
- package/waveparticles/adaptor.js +2 -1
- package/waveparticles/plugin.js +51 -10
- package/wind/plugin.js +8 -8
package/package.json
CHANGED
|
@@ -88,9 +88,6 @@ void main() {
|
|
|
88
88
|
outColor = vec4( v_color.rgb, v_color.a * opacity );
|
|
89
89
|
}
|
|
90
90
|
}`;
|
|
91
|
-
console.log("LineStripProgram");
|
|
92
|
-
console.log(vertexShaderSource);
|
|
93
|
-
console.log(fragmentShaderSource);
|
|
94
91
|
class Logic {
|
|
95
92
|
_vaosPublished = [];
|
|
96
93
|
_ubosPublished = [];
|
|
@@ -104,7 +101,6 @@ class Logic {
|
|
|
104
101
|
location: null
|
|
105
102
|
};
|
|
106
103
|
constructor(globe) {
|
|
107
|
-
console.log("LineStripProgram globe", globe);
|
|
108
104
|
this.gl = globe.gl;
|
|
109
105
|
this.globe = globe;
|
|
110
106
|
this.program = createProgram(this.gl, vertexShaderSource, fragmentShaderSource);
|
package/programs/util.js
CHANGED
|
@@ -9,7 +9,6 @@ function longlatbbox2normalbbox({ minLon = -180, maxLon = 180, minLat = -90, max
|
|
|
9
9
|
bboxOffsetRad: new Float32Array([horOffset, vertOffset]),
|
|
10
10
|
bboxSizeRad: new Float32Array([horSize, vertSize])
|
|
11
11
|
};
|
|
12
|
-
console.log("longlatbbox2normalbbox", result);
|
|
13
12
|
return result;
|
|
14
13
|
}
|
|
15
14
|
export { longlatbbox2normalbbox };
|
|
@@ -1,32 +1,49 @@
|
|
|
1
1
|
import { createProgram } from "../../../util";
|
|
2
2
|
import { UBO_BINDING_POINT, shaderUboSource } from "./ubo.js";
|
|
3
3
|
import { glProgramCache } from "../../programcache";
|
|
4
|
+
import { SeaWaveUbo } from "./ubo-new";
|
|
4
5
|
/**
|
|
5
6
|
* [+] ubo
|
|
6
7
|
*/
|
|
7
8
|
const vertexShaderSource = `#version 300 es
|
|
8
9
|
precision highp float;
|
|
9
|
-
` +
|
|
10
|
+
` + SeaWaveUbo.glslCode() + `
|
|
10
11
|
uniform sampler2D u_vector_field;
|
|
11
12
|
in vec2 in_position;
|
|
12
13
|
out vec3 base_color;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
vec2 read_value(const vec2 uv) {
|
|
17
|
+
vec2 value = texture(u_vector_field, uv).rg;
|
|
18
|
+
if ( value.x == escape_value || value.y == escape_value) {
|
|
19
|
+
return vec2(0.0);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
13
25
|
vec2 lookup_wind(const vec2 uv) { // gerek kalmayabilir. sampler linear methodu ayni isi yapiyor
|
|
14
26
|
// return texture(u_vector_field, uv).rg; // lower-res hardware filtering
|
|
15
27
|
vec2 res = vec2(textureSize(u_vector_field, 0));
|
|
16
28
|
vec2 px = 1.0 / res;
|
|
17
29
|
vec2 vc = (floor(uv * res)) * px;
|
|
18
30
|
vec2 f = fract(uv * res);
|
|
19
|
-
vec2 tl =
|
|
20
|
-
vec2 tr =
|
|
21
|
-
vec2 bl =
|
|
22
|
-
vec2 br =
|
|
31
|
+
vec2 tl = read_value(vc).rg;
|
|
32
|
+
vec2 tr = read_value(vc + vec2(px.x, 0)).rg;
|
|
33
|
+
vec2 bl = read_value(vc + vec2(0, px.y)).rg;
|
|
34
|
+
vec2 br = read_value(vc + px).rg;
|
|
35
|
+
if (tl.x == 0.0 && tl.y == 0.0){ return vec2(0.0);}
|
|
36
|
+
if (tr.x == 0.0 && tr.y == 0.0){ return vec2(0.0);}
|
|
37
|
+
if (bl.x == 0.0 && bl.y == 0.0){ return vec2(0.0);}
|
|
38
|
+
if (br.x == 0.0 && br.y == 0.0){ return vec2(0.0);}
|
|
23
39
|
return mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);
|
|
24
40
|
}
|
|
25
41
|
|
|
26
42
|
|
|
27
43
|
void main(){
|
|
28
44
|
vec2 direction_vector = lookup_wind(in_position);
|
|
29
|
-
if (direction_vector.r == 0.0 && direction_vector.g == 0.0)
|
|
45
|
+
if (direction_vector.r == 0.0 && direction_vector.g == 0.0) return;
|
|
46
|
+
|
|
30
47
|
|
|
31
48
|
vec2 limp;
|
|
32
49
|
if ( 0 == gl_VertexID) { limp = -tail_wing_base_limp; }
|
|
@@ -60,8 +77,9 @@ class Logic {
|
|
|
60
77
|
const gl = this.gl;
|
|
61
78
|
const program = createProgram(gl, vertexShaderSource, fragmentShaderSource);
|
|
62
79
|
// ubo point
|
|
63
|
-
const ubo_location = gl.getUniformBlockIndex(program, 'UBO');
|
|
64
|
-
gl.uniformBlockBinding(program, ubo_location, UBO_BINDING_POINT);
|
|
80
|
+
// const ubo_location = gl.getUniformBlockIndex(program, 'UBO');
|
|
81
|
+
// gl.uniformBlockBinding(program, ubo_location, UBO_BINDING_POINT);
|
|
82
|
+
SeaWaveUbo.assignBindingPoint(gl, program, 0);
|
|
65
83
|
return [program, gl.getUniformLocation(program, 'u_vector_field')];
|
|
66
84
|
}
|
|
67
85
|
/**
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createShader } from "../../../util";
|
|
2
2
|
import { UBO_SIZE, UBO_BINDING_POINT, shaderUboSource } from "./ubo.js";
|
|
3
3
|
import { glProgramCache } from "../../programcache";
|
|
4
|
+
import { SeaWaveUbo } from "./ubo-new";
|
|
4
5
|
// program output is buffer
|
|
5
6
|
// TODO: Mechanism for randomness
|
|
6
7
|
// drop out mechanism
|
|
7
8
|
// random particle position mechanism
|
|
8
9
|
const vertexShaderSource = `#version 300 es
|
|
9
|
-
` +
|
|
10
|
+
` + SeaWaveUbo.glslCode() + `
|
|
10
11
|
|
|
11
12
|
uniform sampler2D vector_field;
|
|
12
13
|
in vec2 in_position;
|
|
@@ -24,10 +25,37 @@ float random(const vec2 co) {
|
|
|
24
25
|
return fract(sin(t) * (rand_constants.z + t));
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
|
|
29
|
+
vec2 read_value(const vec2 uv) {
|
|
30
|
+
vec2 value = texture(vector_field, uv).rg;
|
|
31
|
+
if ( value.x == escape_value || value.y == escape_value) {
|
|
32
|
+
return vec2(0.0);
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
|
|
27
37
|
vec2 lookup_wind(const vec2 uv) { // gerek kalmayabilir. sampler linear methodu ayni isi yapiyor
|
|
28
38
|
// return texture(vector_field, uv).rg; // lower-res hardware filtering
|
|
29
39
|
vec2 res = vec2(textureSize(vector_field, 0));
|
|
30
|
-
|
|
40
|
+
vec2 px = 1.0 / res;
|
|
41
|
+
vec2 vc = (floor(uv * res)) * px;
|
|
42
|
+
vec2 f = fract(uv * res);
|
|
43
|
+
vec2 tl = texture(vector_field, vc).rg;
|
|
44
|
+
vec2 tr = texture(vector_field, vc + vec2(px.x, 0)).rg;
|
|
45
|
+
vec2 bl = texture(vector_field, vc + vec2(0, px.y)).rg;
|
|
46
|
+
vec2 br = texture(vector_field, vc + px).rg;
|
|
47
|
+
if (tl.x == 0.0 && tl.y == 0.0){ return vec2(0.0);}
|
|
48
|
+
if (tr.x == 0.0 && tr.y == 0.0){ return vec2(0.0);}
|
|
49
|
+
if (bl.x == 0.0 && bl.y == 0.0){ return vec2(0.0);}
|
|
50
|
+
if (br.x == 0.0 && br.y == 0.0){ return vec2(0.0);}
|
|
51
|
+
return mix(mix(tl, tr, f.x), mix(bl, br, f.x), f.y);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
vec2 lookup_wind2(const vec2 uv) { // gerek kalmayabilir. sampler linear methodu ayni isi yapiyor
|
|
56
|
+
// return texture(vector_field, uv).rg; // lower-res hardware filtering
|
|
57
|
+
vec2 res = vec2(textureSize(vector_field, 0));
|
|
58
|
+
if (res.x == escape_value || res.y == escape_value){ return vec2(0.0);}
|
|
31
59
|
vec2 px = 1.0 / res;
|
|
32
60
|
vec2 vc = (floor(uv * res)) * px;
|
|
33
61
|
vec2 f = fract(uv * res);
|
|
@@ -107,8 +135,9 @@ class Logic {
|
|
|
107
135
|
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
108
136
|
throw new Error(gl.getProgramParameter(program));
|
|
109
137
|
}
|
|
110
|
-
const ubo_location = gl.getUniformBlockIndex(program, 'UBO');
|
|
111
|
-
gl.uniformBlockBinding(program, ubo_location, UBO_BINDING_POINT);
|
|
138
|
+
// const ubo_location = gl.getUniformBlockIndex(program, 'UBO');
|
|
139
|
+
// gl.uniformBlockBinding(program, ubo_location, UBO_BINDING_POINT);
|
|
140
|
+
SeaWaveUbo.assignBindingPoint(gl, program, 0);
|
|
112
141
|
return [program, gl.getUniformLocation(program, 'vector_field')];
|
|
113
142
|
;
|
|
114
143
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { UBO_BINDING_POINTS } from "./constants";
|
|
2
|
+
import { UniformBlockManager } from "../../../util/gl-util/uniform-block/manager";
|
|
3
|
+
const INITIAL_UBO_DATA = /*@__PURE__*/ new Float32Array([93.17, 0.2, 1.0, 7.0, 1.0, 1.0, 1.0, 0.05, 2000, 2000, -9999]);
|
|
4
|
+
//0.7297389507293701, 0.20000000298023224, 1, 7, 1, 1, 1, 0, 0.05000000074505806, 0, 2200, 656, -9999,
|
|
5
|
+
// {float random_seed;float range;vec2 tail_wing_base_limp;vec3 color;float drop_rate;vec2 draw_texture_size;float escape_value; }
|
|
6
|
+
export const SeaWaveUbo = /*@__PURE__*/ new UniformBlockManager("Seawave_UBO", [
|
|
7
|
+
{ name: "tail_wing_base_limp", type: "vec2", value: INITIAL_UBO_DATA.slice(2, 4) },
|
|
8
|
+
{ name: "draw_texture_size", type: "vec2", value: INITIAL_UBO_DATA.slice(8, 10) },
|
|
9
|
+
{ name: "random_seed", type: "float", value: INITIAL_UBO_DATA.slice(0, 1) },
|
|
10
|
+
{ name: "range", type: "float", value: INITIAL_UBO_DATA.slice(1, 2) },
|
|
11
|
+
{ name: "escape_value", type: "float", value: INITIAL_UBO_DATA.slice(10, 11) },
|
|
12
|
+
{ name: "drop_rate", type: "float", value: INITIAL_UBO_DATA.slice(7, 8) },
|
|
13
|
+
{ name: "color", type: "vec3", value: INITIAL_UBO_DATA.slice(4, 7) },
|
|
14
|
+
], UBO_BINDING_POINTS.SEAWAVE);
|
|
15
|
+
window.SeaWaveUbo = SeaWaveUbo;
|
|
16
|
+
// const shaderUboSource = `
|
|
17
|
+
// layout(std140) uniform UBO {
|
|
18
|
+
// float random_seed;
|
|
19
|
+
// float range;
|
|
20
|
+
// vec2 tail_wing_base_limp;
|
|
21
|
+
// vec3 color;
|
|
22
|
+
// float drop_rate;
|
|
23
|
+
// vec2 draw_texture_size;
|
|
24
|
+
// float escape_value;
|
|
25
|
+
// };`;
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
const UBO_BINDING_POINT = 0;
|
|
2
|
-
const INITIAL_UBO_DATA = new Float32Array([93.17, 0.2, 1.0, 7.0, 1.0, 1.0, 1.0, 0.05, 2000, 2000]);
|
|
2
|
+
const INITIAL_UBO_DATA = new Float32Array([93.17, 0.2, 1.0, 7.0, 1.0, 1.0, 1.0, 0.05, 2000, 2000, -9999]);
|
|
3
3
|
const shaderUboSource = `
|
|
4
4
|
layout(std140) uniform UBO {
|
|
5
|
-
float random_seed;
|
|
5
|
+
float random_seed;
|
|
6
6
|
float range;
|
|
7
|
-
vec2 tail_wing_base_limp;
|
|
8
|
-
vec3 color;
|
|
9
|
-
float drop_rate;
|
|
10
|
-
vec2 draw_texture_size;
|
|
7
|
+
vec2 tail_wing_base_limp;
|
|
8
|
+
vec3 color;
|
|
9
|
+
float drop_rate;
|
|
10
|
+
vec2 draw_texture_size;
|
|
11
|
+
float escape_value;
|
|
11
12
|
};`;
|
|
12
|
-
const UBO_SIZE =
|
|
13
|
+
const UBO_SIZE = 44;
|
|
13
14
|
class WaveParticalUboManager {
|
|
14
15
|
constructor(gl) {
|
|
15
16
|
this.gl = gl;
|
|
16
17
|
this.ubo = this._createBuffer();
|
|
17
18
|
this._data = null;
|
|
18
19
|
}
|
|
19
|
-
update({ range, random_seed, tail_wing_base_limp, draw_texture_size, drop_rate, color }) {
|
|
20
|
+
update({ range, random_seed, tail_wing_base_limp, draw_texture_size, drop_rate, color, escape_value }) {
|
|
20
21
|
const { gl, ubo } = this;
|
|
21
22
|
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
|
|
22
23
|
if (random_seed !== undefined)
|
|
@@ -31,6 +32,8 @@ class WaveParticalUboManager {
|
|
|
31
32
|
gl.bufferSubData(gl.UNIFORM_BUFFER, 28, new Float32Array([drop_rate]));
|
|
32
33
|
if (draw_texture_size !== undefined)
|
|
33
34
|
gl.bufferSubData(gl.UNIFORM_BUFFER, 32, new Float32Array(draw_texture_size));
|
|
35
|
+
if (escape_value !== undefined)
|
|
36
|
+
gl.bufferSubData(gl.UNIFORM_BUFFER, 40, new Float32Array([escape_value]));
|
|
34
37
|
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
|
|
35
38
|
}
|
|
36
39
|
_createBuffer() {
|
|
@@ -41,7 +41,7 @@ const typeArrayConstructors = {
|
|
|
41
41
|
'ivec4': Int32Array,
|
|
42
42
|
'bool': Float32Array
|
|
43
43
|
};
|
|
44
|
-
class UniformBlockManager {
|
|
44
|
+
export class UniformBlockManager {
|
|
45
45
|
/**
|
|
46
46
|
*
|
|
47
47
|
* @param {UniformBlockName} blockName
|
|
@@ -93,11 +93,39 @@ class UniformBlockManager {
|
|
|
93
93
|
return {
|
|
94
94
|
ubo,
|
|
95
95
|
update: (nameValueMap) => this.updateUBO(gl, ubo, nameValueMap),
|
|
96
|
+
updateSingle: (key, value) => this.updateUboSingle(gl, ubo, key, value),
|
|
96
97
|
bind: () => this.bind(gl, ubo),
|
|
97
98
|
unbind: () => this.unbind(gl),
|
|
98
99
|
free: () => gl.deleteBuffer(ubo),
|
|
99
100
|
};
|
|
100
101
|
}
|
|
102
|
+
updateUboSingle(gl, ubo, key, value) {
|
|
103
|
+
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
|
|
104
|
+
const offset = this.offsetMap.get(key);
|
|
105
|
+
if (offset === undefined) {
|
|
106
|
+
throw new Error(`Uniform block member ${key} not found in offset map.`);
|
|
107
|
+
}
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
const type = this.blockMembers.find(member => member.name === key).type;
|
|
110
|
+
let data;
|
|
111
|
+
if (Array.isArray(value)) {
|
|
112
|
+
data = new typeArrayConstructors[type](value);
|
|
113
|
+
}
|
|
114
|
+
else if (typeof value === 'number') {
|
|
115
|
+
data = new typeArrayConstructors[type]([value]);
|
|
116
|
+
}
|
|
117
|
+
else if (value instanceof ArrayBuffer) {
|
|
118
|
+
data = new typeArrayConstructors[type](value);
|
|
119
|
+
}
|
|
120
|
+
else if (ArrayBuffer.isView(value) && !(value instanceof DataView)) {
|
|
121
|
+
data = (typeof value === 'number') ? new typeArrayConstructors[type]([value]) : new typeArrayConstructors[type](value);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
throw new Error(`Unsupported value type for ${key}: ${typeof value}`);
|
|
125
|
+
}
|
|
126
|
+
gl.bufferSubData(gl.UNIFORM_BUFFER, offset, data);
|
|
127
|
+
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
|
|
128
|
+
}
|
|
101
129
|
updateUBO(gl, ubo, nameValueMap) {
|
|
102
130
|
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
|
|
103
131
|
for (const [name, value] of nameValueMap.entries()) {
|
|
@@ -122,7 +150,6 @@ class UniformBlockManager {
|
|
|
122
150
|
else {
|
|
123
151
|
throw new Error(`Unsupported value type for ${name}: ${typeof value}`);
|
|
124
152
|
}
|
|
125
|
-
console.log("Data to be uploaded:", data);
|
|
126
153
|
gl.bufferSubData(gl.UNIFORM_BUFFER, offset, data);
|
|
127
154
|
}
|
|
128
155
|
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
|
|
@@ -162,4 +189,3 @@ class UniformBlockManager {
|
|
|
162
189
|
return lastOffset + lastItemAlignment;
|
|
163
190
|
}
|
|
164
191
|
}
|
|
165
|
-
export { UniformBlockManager };
|
|
@@ -98,7 +98,7 @@ export default class PointCoordinatesDataCalculator {
|
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
// function test() {
|
|
101
|
-
// const cp = window.plugin.
|
|
101
|
+
// const cp = window.plugin.getTexturePointSampler();
|
|
102
102
|
// const bbox = [-15, 25, 70, 60];
|
|
103
103
|
// cp.registerPoint("left up", -15, 60, (data0, data1, interpolated) => {
|
|
104
104
|
// console.log("left up", data0, data1, interpolated);
|
package/waveparticles/adaptor.js
CHANGED
|
@@ -2,7 +2,7 @@ function centigradePlus90ToVectorArray(centigradeArray, noDataValue = -9999) {
|
|
|
2
2
|
const vectorArray = new Float32Array(centigradeArray.length * 2);
|
|
3
3
|
for (let i = 0; i < centigradeArray.length; i++) {
|
|
4
4
|
if (centigradeArray[i] === noDataValue) {
|
|
5
|
-
vectorArray.set([
|
|
5
|
+
vectorArray.set([noDataValue, noDataValue], i * 2);
|
|
6
6
|
continue;
|
|
7
7
|
}
|
|
8
8
|
const rad = (centigradeArray[i] + 90.0) * Math.PI / 180;
|
|
@@ -10,6 +10,7 @@ function centigradePlus90ToVectorArray(centigradeArray, noDataValue = -9999) {
|
|
|
10
10
|
const y = Math.sin(rad);
|
|
11
11
|
vectorArray.set([x, y], i * 2);
|
|
12
12
|
}
|
|
13
|
+
console.log('centigradePlus90ToVectorArray', vectorArray);
|
|
13
14
|
return vectorArray;
|
|
14
15
|
}
|
|
15
16
|
export { centigradePlus90ToVectorArray };
|
package/waveparticles/plugin.js
CHANGED
|
@@ -4,6 +4,7 @@ import { vectorfield } from "../programs/index";
|
|
|
4
4
|
import { pixelBasedMoveProgramCache } from "../programs/vectorfields/logics/pixelbased";
|
|
5
5
|
import { drawRectangleParticlesProgramCache } from "../programs/vectorfields/logics/drawrectangleparticles";
|
|
6
6
|
import { FadeAway } from "../programs";
|
|
7
|
+
import { SeaWaveUbo } from "../programs/vectorfields/logics/ubo-new";
|
|
7
8
|
const { PingPongBufferManager, WaveParticalUboManager } = vectorfield;
|
|
8
9
|
/**
|
|
9
10
|
* STEPS:
|
|
@@ -15,7 +16,7 @@ const { PingPongBufferManager, WaveParticalUboManager } = vectorfield;
|
|
|
15
16
|
*/
|
|
16
17
|
const MAX_PIXELS_ON_DIMENSION = 2200;
|
|
17
18
|
export default class Plugin {
|
|
18
|
-
constructor(id, { dataWidth, dataHeight, fadeOpacity = 0.83, opacity = 0.75, minLon = -180, minLat = -90, maxLon = 180, maxLat = 90, patricleCount = 8000, flipY = true, drawTextureMaxPixelOnDimension = MAX_PIXELS_ON_DIMENSION } = {}) {
|
|
19
|
+
constructor(id, { dataWidth, dataHeight, fadeOpacity = 0.83, opacity = 0.75, minLon = -180, minLat = -90, maxLon = 180, maxLat = 90, escapeValue = -9999, patricleCount = 8000, flipY = true, drawTextureMaxPixelOnDimension = MAX_PIXELS_ON_DIMENSION } = {}) {
|
|
19
20
|
this.id = id;
|
|
20
21
|
this.globe = null;
|
|
21
22
|
this.gl = null;
|
|
@@ -33,6 +34,7 @@ export default class Plugin {
|
|
|
33
34
|
this._particleCount = patricleCount;
|
|
34
35
|
this._dataWidth = dataWidth;
|
|
35
36
|
this._dataHeight = dataHeight;
|
|
37
|
+
this._escapeValue = escapeValue;
|
|
36
38
|
this._drawTextureMaxPixelOnDimension = drawTextureMaxPixelOnDimension;
|
|
37
39
|
this._globeshellparameters = {
|
|
38
40
|
minLon,
|
|
@@ -54,11 +56,12 @@ export default class Plugin {
|
|
|
54
56
|
const inPositionLocation = this.moveParticle.getInPositionLocation();
|
|
55
57
|
this.bufferManager = new PingPongBufferManager(gl, this._particleCount, inPositionLocation);
|
|
56
58
|
this._rgVectorFieldTexture = this._createRGTexture();
|
|
57
|
-
this.waveUbo =
|
|
59
|
+
this.waveUbo = SeaWaveUbo.createUBO(gl);
|
|
58
60
|
this._drawTextures = [this._createDrawTexture(), this._createDrawTexture()];
|
|
59
61
|
this._frameBuffer = gl.createFramebuffer();
|
|
60
62
|
this.setBBox(this._globeshellparameters);
|
|
61
63
|
this.setOpacity(this._opacity);
|
|
64
|
+
this.setEscapeValue(this._escapeValue);
|
|
62
65
|
this.____drawIndex = 0;
|
|
63
66
|
}
|
|
64
67
|
_createDrawTexture() {
|
|
@@ -74,6 +77,16 @@ export default class Plugin {
|
|
|
74
77
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
75
78
|
return texture;
|
|
76
79
|
}
|
|
80
|
+
displayUBO() {
|
|
81
|
+
const { gl } = this;
|
|
82
|
+
//read this.waveUbo.ubo content and pring
|
|
83
|
+
const float32array = new Float32Array(SeaWaveUbo.size / Float32Array.BYTES_PER_ELEMENT);
|
|
84
|
+
console.log("WaveUbo initial data size:", SeaWaveUbo.size / Float32Array.BYTES_PER_ELEMENT);
|
|
85
|
+
gl.bindBuffer(gl.UNIFORM_BUFFER, this.waveUbo.ubo);
|
|
86
|
+
gl.getBufferSubData(gl.UNIFORM_BUFFER, 0, float32array);
|
|
87
|
+
gl.bindBuffer(gl.UNIFORM_BUFFER, null);
|
|
88
|
+
console.log("WaveUbo initial data:", float32array);
|
|
89
|
+
}
|
|
77
90
|
_step() {
|
|
78
91
|
this._stepIndex = (this._stepIndex + 1) % this._fullCycleStepCount;
|
|
79
92
|
}
|
|
@@ -83,7 +96,9 @@ export default class Plugin {
|
|
|
83
96
|
const { gl, moveParticle, drawParticle, bufferManager, globeShellWiggle, waveUbo, fadeAway, _rgVectorFieldTexture } = this;
|
|
84
97
|
gl.disable(gl.DEPTH_TEST);
|
|
85
98
|
if (this._stepIndex === 0) {
|
|
86
|
-
waveUbo.update({ random_seed: Math.random() });
|
|
99
|
+
// waveUbo.update({ random_seed: Math.random() });
|
|
100
|
+
this.waveUbo.updateSingle("random_seed", new Float32Array([Math.random()]));
|
|
101
|
+
;
|
|
87
102
|
moveParticle.move(bufferManager, _rgVectorFieldTexture, waveUbo);
|
|
88
103
|
// 1s swap buffer b1 <-> b2
|
|
89
104
|
bufferManager.swap();
|
|
@@ -188,7 +203,16 @@ export default class Plugin {
|
|
|
188
203
|
this.globeShellWiggle.setHeight(value);
|
|
189
204
|
}
|
|
190
205
|
setDropRate(value) {
|
|
191
|
-
this.waveUbo.
|
|
206
|
+
this.waveUbo.updateSingle("drop_rate", new Float32Array([value]));
|
|
207
|
+
;
|
|
208
|
+
}
|
|
209
|
+
setEscapeValue(value) {
|
|
210
|
+
if (typeof value !== 'number') {
|
|
211
|
+
console.error("escape value must be a number");
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
this._escapeValue = value;
|
|
215
|
+
this.waveUbo.updateSingle("escape_value", value);
|
|
192
216
|
}
|
|
193
217
|
__readAndWriteTextureData() {
|
|
194
218
|
const { gl, _rgVectorFieldTexture, _dataWidth, _dataHeight } = this;
|
|
@@ -231,24 +255,40 @@ export default class Plugin {
|
|
|
231
255
|
setDrawTextureMaxPixelOnDimension(value) {
|
|
232
256
|
this._drawTextureMaxPixelOnDimension = value;
|
|
233
257
|
this._drawTextureResolution = this._drawTextureSizeFromBbox(this._globeshellparameters);
|
|
234
|
-
this.waveUbo.
|
|
258
|
+
this.waveUbo.updateSingle("draw_texture_size", new Float32Array([this._drawTextureResolution.width, this._drawTextureResolution.height]));
|
|
235
259
|
this._drawTextures = [this._createDrawTexture(), this._createDrawTexture()];
|
|
236
260
|
}
|
|
237
261
|
setParticleSpeed(value) {
|
|
238
|
-
|
|
262
|
+
if (typeof value !== 'number' || value <= 0) {
|
|
263
|
+
console.error("Particle speed must be a positive number");
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (value > 100) {
|
|
267
|
+
console.warn("Particle speed is too high, it may cause performance issues");
|
|
268
|
+
}
|
|
269
|
+
this.waveUbo.updateSingle("range", new Float32Array([value]));
|
|
239
270
|
}
|
|
240
271
|
setFadeOpacity(value) {
|
|
272
|
+
if (typeof value !== 'number' || value < 0 || value > 1) {
|
|
273
|
+
console.error("Fade opacity must be a number between 0 and 1");
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
241
276
|
this._fadeOpacity = value;
|
|
242
277
|
}
|
|
243
278
|
setOpacity(value) {
|
|
279
|
+
if (typeof value !== 'number' || value < 0 || value > 1) {
|
|
280
|
+
console.error("Opacity must be a number between 0 and 1");
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
244
283
|
this.globeShellWiggle.setOpacity(value);
|
|
245
284
|
}
|
|
246
285
|
setParticleDimensions(tail, wing) {
|
|
247
286
|
if (0 < tail || 0 < wing) {
|
|
248
|
-
|
|
287
|
+
console.error("tail and wing must be greater than 0");
|
|
249
288
|
}
|
|
250
289
|
else {
|
|
251
|
-
|
|
290
|
+
this.waveUbo.updateSingle("tail_wing_base_limp", new Float32Array([tail, wing]));
|
|
291
|
+
;
|
|
252
292
|
}
|
|
253
293
|
}
|
|
254
294
|
setParticleColor(color) {
|
|
@@ -256,13 +296,14 @@ export default class Plugin {
|
|
|
256
296
|
console.error("color must be an array of rgb elements");
|
|
257
297
|
return;
|
|
258
298
|
}
|
|
259
|
-
this.waveUbo.
|
|
299
|
+
this.waveUbo.updateSingle("color", new Float32Array(color));
|
|
300
|
+
;
|
|
260
301
|
}
|
|
261
302
|
setBBox({ minLon, minLat, maxLon, maxLat }) {
|
|
262
303
|
this._globeshellparameters = { minLon, minLat, maxLon, maxLat };
|
|
263
304
|
this.globeShellWiggle.setBBox({ minLon, minLat, maxLon, maxLat });
|
|
264
305
|
this._drawTextureResolution = this._drawTextureSizeFromBbox({ minLon, minLat, maxLon, maxLat });
|
|
265
|
-
this.waveUbo.
|
|
306
|
+
this.waveUbo.updateSingle("draw_texture_size", new Float32Array([this._drawTextureResolution.width, this._drawTextureResolution.height]));
|
|
266
307
|
this._drawTextures = [this._createDrawTexture(), this._createDrawTexture()];
|
|
267
308
|
}
|
|
268
309
|
}
|
package/wind/plugin.js
CHANGED
|
@@ -531,22 +531,22 @@ export default class WindPlugin {
|
|
|
531
531
|
this.setWind(windData);
|
|
532
532
|
};
|
|
533
533
|
}
|
|
534
|
-
|
|
535
|
-
if (!this.
|
|
536
|
-
this.
|
|
537
|
-
return this.
|
|
534
|
+
getTexturePointSampler() {
|
|
535
|
+
if (!this.texturePointSampler)
|
|
536
|
+
this._createTexturePointSampler();
|
|
537
|
+
return this.texturePointSampler;
|
|
538
538
|
}
|
|
539
|
-
|
|
539
|
+
_createTexturePointSampler() {
|
|
540
540
|
const { bbox, width, height } = this._windDataMeta;
|
|
541
|
-
this.
|
|
541
|
+
this.texturePointSampler = new TexturePointSampler(bbox, width, height);
|
|
542
542
|
this._setCoorcinatesDataCalculatorData();
|
|
543
543
|
}
|
|
544
544
|
_setCoorcinatesDataCalculatorData() {
|
|
545
|
-
if (!this.windData || !this.
|
|
545
|
+
if (!this.windData || !this.texturePointSampler) {
|
|
546
546
|
return;
|
|
547
547
|
}
|
|
548
548
|
const magnitude = imageToMagnitude(this.windData);
|
|
549
|
-
this.
|
|
549
|
+
this.texturePointSampler.updateTextureData(0, magnitude, magnitude);
|
|
550
550
|
}
|
|
551
551
|
// -----------------------------------------------
|
|
552
552
|
// --- inner methods ---
|