@openglobus/og 0.13.8 → 0.13.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 (85) hide show
  1. package/README.md +1 -1
  2. package/css/og.css +388 -129
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +20 -19
  9. package/src/og/Globe.js +15 -16
  10. package/src/og/Object3d.js +33 -0
  11. package/src/og/control/GeoImageDragControl.js +102 -75
  12. package/src/og/control/LayerAnimation.js +306 -38
  13. package/src/og/control/LayerSwitcher.js +506 -159
  14. package/src/og/control/Lighting.js +27 -27
  15. package/src/og/control/RulerSwitcher.js +69 -0
  16. package/src/og/control/UIhelpers.js +146 -0
  17. package/src/og/control/index.js +3 -1
  18. package/src/og/control/ruler/RulerScene.js +6 -2
  19. package/src/og/control/visibleExtent/Segment.js +2 -1
  20. package/src/og/ellipsoid/wgs84.js +1 -1
  21. package/src/og/entity/LabelHandler.js +5 -2
  22. package/src/og/entity/LabelWorker.js +38 -53
  23. package/src/og/layer/BaseGeoImage.js +347 -312
  24. package/src/og/layer/CanvasTiles.js +312 -290
  25. package/src/og/layer/GeoImage.js +222 -214
  26. package/src/og/layer/GeoVideo.js +291 -291
  27. package/src/og/layer/Layer.js +71 -30
  28. package/src/og/layer/Material.js +109 -109
  29. package/src/og/layer/Vector.js +1 -0
  30. package/src/og/layer/XYZ.js +20 -12
  31. package/src/og/light/LightSource.js +364 -363
  32. package/src/og/math.js +2 -2
  33. package/src/og/quadTree/Node.js +7 -5
  34. package/src/og/renderer/Renderer.js +1 -1
  35. package/src/og/scene/Planet.js +103 -42
  36. package/src/og/segment/Segment.js +34 -56
  37. package/src/og/segment/Slice.js +1 -1
  38. package/src/og/shaders/drawnode.js +1 -1
  39. package/src/og/terrain/GlobusTerrain.js +31 -20
  40. package/src/og/terrain/MapboxTerrain.js +1 -1
  41. package/src/og/utils/BaseWorker.js +46 -0
  42. package/src/og/utils/GeoImageCreator.js +164 -161
  43. package/src/og/utils/Loader.js +60 -33
  44. package/src/og/utils/NormalMapCreator.js +403 -412
  45. package/src/og/utils/PlainSegmentWorker.js +29 -55
  46. package/src/og/utils/TerrainWorker.js +572 -589
  47. package/src/og/utils/functionComposition.js +13 -0
  48. package/src/og/webgl/Handler.js +42 -41
  49. package/types/Object3d.d.ts +1 -0
  50. package/types/camera/PlanetCamera.d.ts +4 -0
  51. package/types/control/GeoImageDragControl.d.ts +2 -0
  52. package/types/control/LayerAnimation.d.ts +73 -0
  53. package/types/control/LayerSwitcher.d.ts +55 -11
  54. package/types/control/MouseNavigation.d.ts +1 -0
  55. package/types/control/MouseWheelZoomControl.d.ts +1 -0
  56. package/types/control/Sun.d.ts +1 -0
  57. package/types/control/TouchNavigation.d.ts +1 -0
  58. package/types/control/UIhelpers.d.ts +13 -0
  59. package/types/control/index.d.ts +2 -1
  60. package/types/entity/LabelHandler.d.ts +2 -0
  61. package/types/entity/LabelWorker.d.ts +5 -7
  62. package/types/layer/BaseGeoImage.d.ts +9 -1
  63. package/types/layer/CanvasTiles.d.ts +5 -1
  64. package/types/layer/GeoImage.d.ts +1 -0
  65. package/types/layer/GeoTexture2d.d.ts +1 -0
  66. package/types/layer/Layer.d.ts +5 -1
  67. package/types/layer/Vector.d.ts +7 -0
  68. package/types/layer/WMS.d.ts +1 -0
  69. package/types/layer/XYZ.d.ts +8 -6
  70. package/types/math.d.ts +1 -1
  71. package/types/quadTree/EntityCollectionNode.d.ts +7 -0
  72. package/types/quadTree/Node.d.ts +1 -2
  73. package/types/renderer/Renderer.d.ts +1 -1
  74. package/types/renderer/RendererEvents.d.ts +16 -0
  75. package/types/scene/Planet.d.ts +19 -4
  76. package/types/segment/SegmentLonLat.d.ts +2 -0
  77. package/types/terrain/BilTerrain.d.ts +6 -0
  78. package/types/terrain/GlobusTerrain.d.ts +7 -0
  79. package/types/terrain/MapboxTerrain.d.ts +8 -0
  80. package/types/utils/BaseWorker.d.ts +14 -0
  81. package/types/utils/Loader.d.ts +3 -1
  82. package/types/utils/PlainSegmentWorker.d.ts +4 -6
  83. package/types/utils/TerrainWorker.d.ts +4 -6
  84. package/types/utils/functionComposition.d.ts +5 -0
  85. package/types/webgl/Handler.d.ts +4 -1
@@ -1,413 +1,404 @@
1
- /**
2
- * @module og/utils/NormalMapCreator
3
- */
4
-
5
- "use strict";
6
-
7
- import * as quadTree from "../quadTree/quadTree.js";
8
- import { Framebuffer } from "../webgl/Framebuffer.js";
9
- import { Lock } from "../Lock.js";
10
- import { Program } from "../webgl/Program.js";
11
- import { types } from "../webgl/types.js";
12
- import { QueueArray } from "../QueueArray.js";
13
-
14
- export class NormalMapCreator {
15
-
16
- constructor(planet, options) {
17
- options = options || {};
18
-
19
- this._minTabelSize = options.minTableSize || 1;
20
- this._maxTableSize = options.maxTableSize || 8;
21
-
22
- this._planet = planet;
23
- this._handler = planet.renderer.handler;
24
- this._verticesBufferArray = [];
25
- this._indexBufferArray = [];
26
- this._positionBuffer = null;
27
- this._framebuffer = null;
28
- this._normalMapVerticesTexture = null;
29
-
30
- this._width = options.width || 128;
31
- this._height = options.height || 128;
32
-
33
- this._queue = new QueueArray(1024);
34
-
35
- this._lock = new Lock();
36
-
37
- this._init();
38
- }
39
-
40
- _init() {
41
- var isWebkit = false; //('WebkitAppearance' in document.documentElement.style) && !/^((?!chrome).)*safari/i.test(navigator.userAgent);
42
-
43
- /*==================================================================================
44
- * http://www.sunsetlakesoftware.com/2013/10/21/optimizing-gaussian-blurs-mobile-gpu
45
- *=================================================================================*/
46
- var normalMapBlur = new Program("normalMapBlur", {
47
- attributes: {
48
- a_position: { type: types.VEC2, enableArray: true }
49
- },
50
- uniforms: {
51
- s_texture: { type: types.SAMPLER2D }
52
- },
53
- vertexShader:
54
- `attribute vec2 a_position;
55
- attribute vec2 a_texCoord;
56
-
57
- varying vec2 blurCoordinates[5];
58
-
59
- void main() {
60
- vec2 vt = a_position * 0.5 + 0.5;` +
61
- (isWebkit ? "vt.y = 1.0 - vt.y; " : " ") +
62
- `gl_Position = vec4(a_position, 0.0, 1.0);
63
- blurCoordinates[0] = vt;
64
- blurCoordinates[1] = vt + ` +
65
- (1.0 / this._width) * 1.407333 +
66
- ";" +
67
- "blurCoordinates[2] = vt - " +
68
- (1.0 / this._height) * 1.407333 +
69
- ";" +
70
- "blurCoordinates[3] = vt + " +
71
- (1.0 / this._width) * 3.294215 +
72
- ";" +
73
- "blurCoordinates[4] = vt - " +
74
- (1.0 / this._height) * 3.294215 +
75
- ";" +
76
- "}",
77
- fragmentShader: `precision lowp float;
78
- uniform sampler2D s_texture;
79
-
80
- varying vec2 blurCoordinates[5];
81
-
82
- void main() {
83
- lowp vec4 sum = vec4(0.0);
84
- //if(blurCoordinates[0].x <= 0.01 || blurCoordinates[0].x >= 0.99 ||
85
- // blurCoordinates[0].y <= 0.01 || blurCoordinates[0].y >= 0.99){
86
- // sum = texture2D(s_texture, blurCoordinates[0]);
87
- //} else {
88
- sum += texture2D(s_texture, blurCoordinates[0]) * 0.204164;
89
- sum += texture2D(s_texture, blurCoordinates[1]) * 0.304005;
90
- sum += texture2D(s_texture, blurCoordinates[2]) * 0.304005;
91
- sum += texture2D(s_texture, blurCoordinates[3]) * 0.093913;
92
- sum += texture2D(s_texture, blurCoordinates[4]) * 0.093913;
93
- //}
94
- gl_FragColor = sum;
95
- }`
96
- });
97
-
98
- var normalMap = new Program("normalMap", {
99
- attributes: {
100
- a_position: { type: types.VEC2, enableArray: true },
101
- a_normal: { type: types.VEC3, enableArray: true }
102
- },
103
- vertexShader: `attribute vec2 a_position;
104
- attribute vec3 a_normal;
105
-
106
- varying vec3 v_color;
107
-
108
- void main() {
109
- gl_Position = vec4(a_position, 0, 1);
110
- v_color = normalize(a_normal) * 0.5 + 0.5;
111
- }`,
112
- fragmentShader: `precision highp float;
113
-
114
- varying vec3 v_color;
115
-
116
- void main () {
117
- gl_FragColor = vec4(v_color, 1.0);
118
- }`
119
- });
120
-
121
- this._handler.addProgram(normalMapBlur);
122
- this._handler.addProgram(normalMap);
123
-
124
- //create hidden handler buffer
125
- this._framebuffer = new Framebuffer(this._handler, {
126
- width: this._width,
127
- height: this._height,
128
- useDepth: false
129
- });
130
-
131
- this._framebuffer.init();
132
-
133
- this._normalMapVerticesTexture = this._handler.createEmptyTexture_l(this._width, this._height);
134
-
135
- //create vertices hasharray for different grid size segments from 2^4(16) to 2^7(128)
136
- for (var p = this._minTabelSize; p <= this._maxTableSize; p++) {
137
- var gs = Math.pow(2, p);
138
- var gs2 = gs / 2;
139
- var vertices = new Float32Array((gs + 1) * (gs + 1) * 2);
140
-
141
- for (var i = 0; i <= gs; i++) {
142
- for (var j = 0; j <= gs; j++) {
143
- let ind = (i * (gs + 1) + j) * 2;
144
- vertices[ind] = -1 + j / gs2;
145
- vertices[ind + 1] = -1 + i / gs2;
146
- }
147
- }
148
-
149
- this._verticesBufferArray[gs] = this._handler.createArrayBuffer(
150
- vertices,
151
- 2,
152
- vertices.length / 2
153
- );
154
- this._indexBufferArray[gs] =
155
- this._planet._indexesCache[Math.log2(gs)][Math.log2(gs)][Math.log2(gs)][Math.log2(gs)][
156
- Math.log2(gs)
157
- ].buffer;
158
- }
159
-
160
- //create 2d screen square buffer
161
- var positions = new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0]);
162
-
163
- this._positionBuffer = this._handler.createArrayBuffer(positions, 2, positions.length / 2);
164
- }
165
-
166
- _drawNormalMapBlur(segment) {
167
- var normals = segment.normalMapNormals;
168
- if (
169
- segment.node &&
170
- segment.node.getState() !== quadTree.NOTRENDERING &&
171
- normals &&
172
- normals.length
173
- ) {
174
- var size = normals.length / 3;
175
- var gridSize = Math.sqrt(size) - 1;
176
-
177
- let indBuf = this._verticesBufferArray[gridSize];
178
-
179
- if (indBuf) {
180
- if (segment.planet.terrain.equalizeNormals) {
181
- segment._normalMapEdgeEqualize(quadTree.N);
182
- segment._normalMapEdgeEqualize(quadTree.S);
183
- segment._normalMapEdgeEqualize(quadTree.W);
184
- segment._normalMapEdgeEqualize(quadTree.E);
185
- }
186
-
187
- var outTexture = segment.normalMapTexturePtr;
188
-
189
- var h = this._handler;
190
- var gl = h.gl;
191
-
192
- var _normalsBuffer = h.createArrayBuffer(normals, 3, size, gl.DYNAMIC_DRAW);
193
-
194
- var f = this._framebuffer;
195
- var p = h.programs.normalMap;
196
- var sha = p._program.attributes;
197
-
198
- f.bindOutputTexture(this._normalMapVerticesTexture);
199
-
200
- p.activate();
201
-
202
- gl.bindBuffer(gl.ARRAY_BUFFER, indBuf);
203
- gl.vertexAttribPointer(sha.a_position, indBuf.itemSize, gl.FLOAT, false, 0, 0);
204
-
205
- gl.bindBuffer(gl.ARRAY_BUFFER, _normalsBuffer);
206
- gl.vertexAttribPointer(sha.a_normal, _normalsBuffer.itemSize, gl.FLOAT, false, 0, 0);
207
-
208
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBufferArray[gridSize]);
209
- gl.drawElements(
210
- gl.TRIANGLE_STRIP,
211
- this._indexBufferArray[gridSize].numItems,
212
- gl.UNSIGNED_INT,
213
- 0
214
- );
215
-
216
- gl.deleteBuffer(_normalsBuffer);
217
-
218
- //
219
- // blur pass
220
- //
221
- f.bindOutputTexture(outTexture);
222
-
223
- p = h.programs.normalMapBlur;
224
-
225
- p.activate();
226
- gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);
227
- gl.vertexAttribPointer(
228
- p._program.attributes.a_position,
229
- this._positionBuffer.itemSize,
230
- gl.FLOAT,
231
- false,
232
- 0,
233
- 0
234
- );
235
- gl.activeTexture(gl.TEXTURE0);
236
- gl.bindTexture(gl.TEXTURE_2D, this._normalMapVerticesTexture);
237
- gl.uniform1i(p._program.uniforms.s_texture, 0);
238
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, this._positionBuffer.numItems);
239
- return true;
240
- } else {
241
- return true;
242
- }
243
- }
244
- return false;
245
- }
246
-
247
- _drawNormalMapNoBlur(segment) {
248
- var normals = segment.normalMapNormals;
249
- if (
250
- segment.node &&
251
- segment.node.getState() !== quadTree.NOTRENDERING &&
252
- normals &&
253
- normals.length
254
- ) {
255
- var size = normals.length / 3;
256
- var gridSize = Math.sqrt(size) - 1;
257
-
258
- let indBuf = this._verticesBufferArray[gridSize];
259
-
260
- if (indBuf) {
261
- if (segment.planet.terrain.equalizeNormals) {
262
- segment._normalMapEdgeEqualize(quadTree.N);
263
- segment._normalMapEdgeEqualize(quadTree.S);
264
- segment._normalMapEdgeEqualize(quadTree.W);
265
- segment._normalMapEdgeEqualize(quadTree.E);
266
- }
267
-
268
- var outTexture = segment.normalMapTexturePtr;
269
-
270
- var h = this._handler;
271
- var gl = h.gl;
272
-
273
- var _normalsBuffer = h.createArrayBuffer(normals, 3, size, gl.DYNAMIC_DRAW);
274
-
275
- var f = this._framebuffer;
276
- var p = h.programs.normalMap;
277
- var sha = p._program.attributes;
278
-
279
- f.bindOutputTexture(outTexture);
280
-
281
- p.activate();
282
-
283
- gl.bindBuffer(gl.ARRAY_BUFFER, indBuf);
284
- gl.vertexAttribPointer(sha.a_position, indBuf.itemSize, gl.FLOAT, false, 0, 0);
285
-
286
- gl.bindBuffer(gl.ARRAY_BUFFER, _normalsBuffer);
287
- gl.vertexAttribPointer(sha.a_normal, _normalsBuffer.itemSize, gl.FLOAT, false, 0, 0);
288
-
289
- gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBufferArray[gridSize]);
290
- gl.drawElements(
291
- gl.TRIANGLE_STRIP,
292
- this._indexBufferArray[gridSize].numItems,
293
- gl.UNSIGNED_INT,
294
- 0
295
- );
296
-
297
- gl.deleteBuffer(_normalsBuffer);
298
-
299
- return true;
300
- } else {
301
- return true;
302
- }
303
- }
304
- return false;
305
- }
306
-
307
- _drawNormalMap(segment) {
308
- let t = segment.planet.terrain;
309
-
310
- if (t.isBlur(segment)) {
311
- return this._drawNormalMapBlur(segment);
312
- } else {
313
- return this._drawNormalMapNoBlur(segment);
314
- }
315
- }
316
-
317
- drawSingle(segment) {
318
- var h = this._handler,
319
- gl = h.gl;
320
-
321
- this._framebuffer.activate();
322
-
323
- gl.disable(gl.CULL_FACE);
324
- gl.disable(gl.DEPTH_TEST);
325
-
326
- if (segment.terrainReady && this._drawNormalMap(segment)) {
327
- segment.normalMapReady = true;
328
- segment.normalMapTexture = segment.normalMapTexturePtr;
329
- segment.normalMapTextureBias[0] = 0;
330
- segment.normalMapTextureBias[1] = 0;
331
- segment.normalMapTextureBias[2] = 1;
332
- }
333
- segment._inTheQueue = false;
334
-
335
- gl.disable(gl.BLEND);
336
- gl.enable(gl.DEPTH_TEST);
337
- gl.enable(gl.CULL_FACE);
338
-
339
- this._framebuffer.deactivate();
340
- }
341
-
342
- frame() {
343
- if (this._queue.length) {
344
- var h = this._handler,
345
- gl = h.gl;
346
-
347
- this._framebuffer.activate();
348
-
349
- gl.disable(gl.CULL_FACE);
350
- gl.disable(gl.DEPTH_TEST);
351
-
352
- var deltaTime = 0,
353
- startTime = window.performance.now();
354
-
355
- while (this._lock.isFree() && this._queue.length && deltaTime < 0.25) {
356
- var segment = this._queue.shift();
357
- if (segment.terrainReady && this._drawNormalMap(segment)) {
358
- segment.normalMapReady = true;
359
- segment.normalMapTexture = segment.normalMapTexturePtr;
360
- segment.normalMapTextureBias[0] = 0;
361
- segment.normalMapTextureBias[1] = 0;
362
- segment.normalMapTextureBias[2] = 1;
363
- }
364
- segment._inTheQueue = false;
365
- deltaTime = window.performance.now() - startTime;
366
- }
367
-
368
- gl.disable(gl.BLEND);
369
- gl.enable(gl.DEPTH_TEST);
370
- gl.enable(gl.CULL_FACE);
371
-
372
- this._framebuffer.deactivate();
373
- }
374
- }
375
-
376
- queue(segment) {
377
- segment._inTheQueue = true;
378
- this._queue.push(segment);
379
- }
380
-
381
- unshift(segment) {
382
- segment._inTheQueue = true;
383
- this._queue.unshift(segment);
384
- }
385
-
386
- remove(segment) {
387
- //...
388
- }
389
-
390
- clear() {
391
- while (this._queue.length) {
392
- var s = this._queue.pop();
393
- s._inTheQueue = false;
394
- }
395
- }
396
-
397
- /**
398
- * Set activity off
399
- * @public
400
- */
401
- lock(key) {
402
- this._lock.lock(key);
403
- }
404
-
405
- /**
406
- * Set activity on
407
- * @public
408
- */
409
- free(key) {
410
- this._lock.free(key);
411
- }
412
-
1
+ /**
2
+ * @module og/utils/NormalMapCreator
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import * as quadTree from "../quadTree/quadTree.js";
8
+ import { Framebuffer } from "../webgl/Framebuffer.js";
9
+ import { Lock } from "../Lock.js";
10
+ import { Program } from "../webgl/Program.js";
11
+ import { types } from "../webgl/types.js";
12
+ import { QueueArray } from "../QueueArray.js";
13
+
14
+ export class NormalMapCreator {
15
+
16
+ constructor(planet, options) {
17
+ options = options || {};
18
+
19
+ this._minTabelSize = options.minTableSize || 1;
20
+ this._maxTableSize = options.maxTableSize || 8;
21
+
22
+ this._planet = planet;
23
+ this._handler = planet.renderer.handler;
24
+ this._verticesBufferArray = [];
25
+ this._indexBufferArray = [];
26
+ this._positionBuffer = null;
27
+ this._framebuffer = null;
28
+ this._normalMapVerticesTexture = null;
29
+
30
+ this._width = options.width || 128;
31
+ this._height = options.height || 128;
32
+
33
+ this._queue = new QueueArray(1024);
34
+
35
+ this._lock = new Lock();
36
+
37
+ this._init();
38
+ }
39
+
40
+ _init() {
41
+ var isWebkit = false; //('WebkitAppearance' in document.documentElement.style) && !/^((?!chrome).)*safari/i.test(navigator.userAgent);
42
+
43
+ /*==================================================================================
44
+ * http://www.sunsetlakesoftware.com/2013/10/21/optimizing-gaussian-blurs-mobile-gpu
45
+ *=================================================================================*/
46
+ var normalMapBlur = new Program("normalMapBlur", {
47
+ attributes: {
48
+ a_position: "vec2"
49
+ },
50
+ uniforms: {
51
+ s_texture: "sampler2d"
52
+ },
53
+ vertexShader:
54
+ `attribute vec2 a_position;
55
+ attribute vec2 a_texCoord;
56
+
57
+ varying vec2 blurCoordinates[5];
58
+
59
+ void main() {
60
+ vec2 vt = a_position * 0.5 + 0.5;
61
+ ${isWebkit ? "vt.y = 1.0 - vt.y; " : " " }
62
+ gl_Position = vec4(a_position, 0.0, 1.0);
63
+ blurCoordinates[0] = vt;
64
+ blurCoordinates[1] = vt + ${(1.0 / this._width) * 1.407333 };
65
+ blurCoordinates[2] = vt - ${(1.0 / this._height) * 1.407333};
66
+ blurCoordinates[3] = vt + ${(1.0 / this._width) * 3.294215};
67
+ blurCoordinates[4] = vt - ${(1.0 / this._height) * 3.294215};
68
+ }`,
69
+ fragmentShader: `precision lowp float;
70
+ uniform sampler2D s_texture;
71
+ varying vec2 blurCoordinates[5];
72
+
73
+ void main() {
74
+ lowp vec4 sum = vec4(0.0);
75
+ //if(blurCoordinates[0].x <= 0.01 || blurCoordinates[0].x >= 0.99 ||
76
+ // blurCoordinates[0].y <= 0.01 || blurCoordinates[0].y >= 0.99){
77
+ // sum = texture2D(s_texture, blurCoordinates[0]);
78
+ //} else {
79
+ sum += texture2D(s_texture, blurCoordinates[0]) * 0.204164;
80
+ sum += texture2D(s_texture, blurCoordinates[1]) * 0.304005;
81
+ sum += texture2D(s_texture, blurCoordinates[2]) * 0.304005;
82
+ sum += texture2D(s_texture, blurCoordinates[3]) * 0.093913;
83
+ sum += texture2D(s_texture, blurCoordinates[4]) * 0.093913;
84
+ //}
85
+ gl_FragColor = sum;
86
+ }`
87
+ });
88
+
89
+ var normalMap = new Program("normalMap", {
90
+ attributes: {
91
+ a_position: "vec2",
92
+ a_normal: "vec3"
93
+ },
94
+ vertexShader: `attribute vec2 a_position;
95
+ attribute vec3 a_normal;
96
+
97
+ varying vec3 v_color;
98
+
99
+ void main() {
100
+ gl_Position = vec4(a_position, 0, 1);
101
+ v_color = normalize(a_normal) * 0.5 + 0.5;
102
+ }`,
103
+ fragmentShader: `precision highp float;
104
+
105
+ varying vec3 v_color;
106
+
107
+ void main () {
108
+ gl_FragColor = vec4(v_color, 1.0);
109
+ }`
110
+ });
111
+
112
+ this._handler.addProgram(normalMapBlur);
113
+ this._handler.addProgram(normalMap);
114
+
115
+ //create hidden handler buffer
116
+ this._framebuffer = new Framebuffer(this._handler, {
117
+ width: this._width,
118
+ height: this._height,
119
+ useDepth: false
120
+ });
121
+
122
+ this._framebuffer.init();
123
+
124
+ this._normalMapVerticesTexture = this._handler.createEmptyTexture_l(this._width, this._height);
125
+
126
+ //create vertices hasharray for different grid size segments from 2^4(16) to 2^7(128)
127
+ for (var p = this._minTabelSize; p <= this._maxTableSize; p++) {
128
+ var gs = Math.pow(2, p);
129
+ var gs2 = gs / 2;
130
+ var vertices = new Float32Array((gs + 1) * (gs + 1) * 2);
131
+
132
+ for (var i = 0; i <= gs; i++) {
133
+ for (var j = 0; j <= gs; j++) {
134
+ let ind = (i * (gs + 1) + j) * 2;
135
+ vertices[ind] = -1 + j / gs2;
136
+ vertices[ind + 1] = -1 + i / gs2;
137
+ }
138
+ }
139
+
140
+ this._verticesBufferArray[gs] = this._handler.createArrayBuffer(
141
+ vertices,
142
+ 2,
143
+ vertices.length / 2
144
+ );
145
+ this._indexBufferArray[gs] =
146
+ this._planet._indexesCache[Math.log2(gs)][Math.log2(gs)][Math.log2(gs)][Math.log2(gs)][
147
+ Math.log2(gs)
148
+ ].buffer;
149
+ }
150
+
151
+ //create 2d screen square buffer
152
+ var positions = new Float32Array([-1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0]);
153
+
154
+ this._positionBuffer = this._handler.createArrayBuffer(positions, 2, positions.length / 2);
155
+ }
156
+
157
+ _drawNormalMapBlur(segment) {
158
+ var normals = segment.normalMapNormals;
159
+ if (
160
+ segment.node &&
161
+ segment.node.getState() !== quadTree.NOTRENDERING &&
162
+ normals &&
163
+ normals.length
164
+ ) {
165
+ var size = normals.length / 3;
166
+ var gridSize = Math.sqrt(size) - 1;
167
+
168
+ let indBuf = this._verticesBufferArray[gridSize];
169
+
170
+ if (indBuf) {
171
+ if (segment.planet.terrain.equalizeNormals) {
172
+ segment._normalMapEdgeEqualize(quadTree.N);
173
+ segment._normalMapEdgeEqualize(quadTree.S);
174
+ segment._normalMapEdgeEqualize(quadTree.W);
175
+ segment._normalMapEdgeEqualize(quadTree.E);
176
+ }
177
+
178
+ var outTexture = segment.normalMapTexturePtr;
179
+
180
+ var h = this._handler;
181
+ var gl = h.gl;
182
+
183
+ var _normalsBuffer = h.createArrayBuffer(normals, 3, size, gl.DYNAMIC_DRAW);
184
+
185
+ var f = this._framebuffer;
186
+ var p = h.programs.normalMap;
187
+ var sha = p._program.attributes;
188
+
189
+ f.bindOutputTexture(this._normalMapVerticesTexture);
190
+
191
+ p.activate();
192
+
193
+ gl.bindBuffer(gl.ARRAY_BUFFER, indBuf);
194
+ gl.vertexAttribPointer(sha.a_position, indBuf.itemSize, gl.FLOAT, false, 0, 0);
195
+
196
+ gl.bindBuffer(gl.ARRAY_BUFFER, _normalsBuffer);
197
+ gl.vertexAttribPointer(sha.a_normal, _normalsBuffer.itemSize, gl.FLOAT, false, 0, 0);
198
+
199
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBufferArray[gridSize]);
200
+ gl.drawElements(
201
+ gl.TRIANGLE_STRIP,
202
+ this._indexBufferArray[gridSize].numItems,
203
+ gl.UNSIGNED_INT,
204
+ 0
205
+ );
206
+
207
+ gl.deleteBuffer(_normalsBuffer);
208
+
209
+ //
210
+ // blur pass
211
+ //
212
+ f.bindOutputTexture(outTexture);
213
+
214
+ p = h.programs.normalMapBlur;
215
+
216
+ p.activate();
217
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._positionBuffer);
218
+ gl.vertexAttribPointer(
219
+ p._program.attributes.a_position,
220
+ this._positionBuffer.itemSize,
221
+ gl.FLOAT,
222
+ false,
223
+ 0,
224
+ 0
225
+ );
226
+ gl.activeTexture(gl.TEXTURE0);
227
+ gl.bindTexture(gl.TEXTURE_2D, this._normalMapVerticesTexture);
228
+ gl.uniform1i(p._program.uniforms.s_texture, 0);
229
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, this._positionBuffer.numItems);
230
+ return true;
231
+ } else {
232
+ return true;
233
+ }
234
+ }
235
+ return false;
236
+ }
237
+
238
+ _drawNormalMapNoBlur(segment) {
239
+ var normals = segment.normalMapNormals;
240
+ if (
241
+ segment.node &&
242
+ segment.node.getState() !== quadTree.NOTRENDERING &&
243
+ normals &&
244
+ normals.length
245
+ ) {
246
+ var size = normals.length / 3;
247
+ var gridSize = Math.sqrt(size) - 1;
248
+
249
+ let indBuf = this._verticesBufferArray[gridSize];
250
+
251
+ if (indBuf) {
252
+ if (segment.planet.terrain.equalizeNormals) {
253
+ segment._normalMapEdgeEqualize(quadTree.N);
254
+ segment._normalMapEdgeEqualize(quadTree.S);
255
+ segment._normalMapEdgeEqualize(quadTree.W);
256
+ segment._normalMapEdgeEqualize(quadTree.E);
257
+ }
258
+
259
+ var outTexture = segment.normalMapTexturePtr;
260
+
261
+ var h = this._handler;
262
+ var gl = h.gl;
263
+
264
+ var _normalsBuffer = h.createArrayBuffer(normals, 3, size, gl.DYNAMIC_DRAW);
265
+
266
+ var f = this._framebuffer;
267
+ var p = h.programs.normalMap;
268
+ var sha = p._program.attributes;
269
+
270
+ f.bindOutputTexture(outTexture);
271
+
272
+ p.activate();
273
+
274
+ gl.bindBuffer(gl.ARRAY_BUFFER, indBuf);
275
+ gl.vertexAttribPointer(sha.a_position, indBuf.itemSize, gl.FLOAT, false, 0, 0);
276
+
277
+ gl.bindBuffer(gl.ARRAY_BUFFER, _normalsBuffer);
278
+ gl.vertexAttribPointer(sha.a_normal, _normalsBuffer.itemSize, gl.FLOAT, false, 0, 0);
279
+
280
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBufferArray[gridSize]);
281
+ gl.drawElements(
282
+ gl.TRIANGLE_STRIP,
283
+ this._indexBufferArray[gridSize].numItems,
284
+ gl.UNSIGNED_INT,
285
+ 0
286
+ );
287
+
288
+ gl.deleteBuffer(_normalsBuffer);
289
+
290
+ return true;
291
+ } else {
292
+ return true;
293
+ }
294
+ }
295
+ return false;
296
+ }
297
+
298
+ _drawNormalMap(segment) {
299
+ let t = segment.planet.terrain;
300
+
301
+ if (t.isBlur(segment)) {
302
+ return this._drawNormalMapBlur(segment);
303
+ } else {
304
+ return this._drawNormalMapNoBlur(segment);
305
+ }
306
+ }
307
+
308
+ drawSingle(segment) {
309
+ var h = this._handler,
310
+ gl = h.gl;
311
+
312
+ this._framebuffer.activate();
313
+
314
+ gl.disable(gl.CULL_FACE);
315
+ gl.disable(gl.DEPTH_TEST);
316
+
317
+ if (segment.terrainReady && this._drawNormalMap(segment)) {
318
+ segment.normalMapReady = true;
319
+ segment.normalMapTexture = segment.normalMapTexturePtr;
320
+ segment.normalMapTextureBias[0] = 0;
321
+ segment.normalMapTextureBias[1] = 0;
322
+ segment.normalMapTextureBias[2] = 1;
323
+ }
324
+ segment._inTheQueue = false;
325
+
326
+ gl.disable(gl.BLEND);
327
+ gl.enable(gl.DEPTH_TEST);
328
+ gl.enable(gl.CULL_FACE);
329
+
330
+ this._framebuffer.deactivate();
331
+ }
332
+
333
+ frame() {
334
+ if (this._queue.length) {
335
+ var h = this._handler,
336
+ gl = h.gl;
337
+
338
+ this._framebuffer.activate();
339
+
340
+ gl.disable(gl.CULL_FACE);
341
+ gl.disable(gl.DEPTH_TEST);
342
+
343
+ var deltaTime = 0,
344
+ startTime = window.performance.now();
345
+
346
+ while (this._lock.isFree() && this._queue.length && deltaTime < 0.25) {
347
+ var segment = this._queue.shift();
348
+ if (segment.terrainReady && this._drawNormalMap(segment)) {
349
+ segment.normalMapReady = true;
350
+ segment.normalMapTexture = segment.normalMapTexturePtr;
351
+ segment.normalMapTextureBias[0] = 0;
352
+ segment.normalMapTextureBias[1] = 0;
353
+ segment.normalMapTextureBias[2] = 1;
354
+ }
355
+ segment._inTheQueue = false;
356
+ deltaTime = window.performance.now() - startTime;
357
+ }
358
+
359
+ gl.disable(gl.BLEND);
360
+ gl.enable(gl.DEPTH_TEST);
361
+ gl.enable(gl.CULL_FACE);
362
+
363
+ this._framebuffer.deactivate();
364
+ }
365
+ }
366
+
367
+ queue(segment) {
368
+ segment._inTheQueue = true;
369
+ this._queue.push(segment);
370
+ }
371
+
372
+ unshift(segment) {
373
+ segment._inTheQueue = true;
374
+ this._queue.unshift(segment);
375
+ }
376
+
377
+ remove(segment) {
378
+ //...
379
+ }
380
+
381
+ clear() {
382
+ while (this._queue.length) {
383
+ var s = this._queue.pop();
384
+ s._inTheQueue = false;
385
+ }
386
+ }
387
+
388
+ /**
389
+ * Set activity off
390
+ * @public
391
+ */
392
+ lock(key) {
393
+ this._lock.lock(key);
394
+ }
395
+
396
+ /**
397
+ * Set activity on
398
+ * @public
399
+ */
400
+ free(key) {
401
+ this._lock.free(key);
402
+ }
403
+
413
404
  }