@openglobus/og 0.14.10 → 0.15.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.
Files changed (140) hide show
  1. package/css/og.css +378 -275
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +5 -5
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +31 -27
  12. package/src/og/camera/PlanetCamera.js +22 -14
  13. package/src/og/cons.js +107 -107
  14. package/src/og/control/Atmosphere.js +396 -0
  15. package/src/og/control/CompassButton.js +11 -18
  16. package/src/og/control/Control.js +197 -188
  17. package/src/og/control/GeoImageDragControl.js +84 -66
  18. package/src/og/control/LayerSwitcher.js +56 -138
  19. package/src/og/control/Lighting.js +314 -186
  20. package/src/og/control/MouseNavigation.js +2 -2
  21. package/src/og/control/RulerSwitcher.js +24 -19
  22. package/src/og/control/ScaleControl.js +30 -10
  23. package/src/og/control/SimpleSkyBackground.js +210 -0
  24. package/src/og/control/Sun.js +3 -1
  25. package/src/og/control/ZoomControl.js +30 -42
  26. package/src/og/control/index.js +6 -0
  27. package/src/og/control/ruler/RulerScene.js +5 -23
  28. package/src/og/control/selection/Selection.js +99 -0
  29. package/src/og/control/selection/SelectionScene.js +350 -0
  30. package/src/og/control/timeline/TimelineControl.js +99 -0
  31. package/src/og/control/timeline/TimelineModel.js +133 -0
  32. package/src/og/control/timeline/TimelineView.js +449 -0
  33. package/src/og/control/timeline/timelineUtils.js +132 -0
  34. package/src/og/ellipsoid/Ellipsoid.js +120 -93
  35. package/src/og/ellipsoid/wgs84.js +13 -13
  36. package/src/og/entity/Entity.js +36 -9
  37. package/src/og/entity/EntityCollection.js +0 -2
  38. package/src/og/entity/GeoObject.js +72 -56
  39. package/src/og/entity/GeoObjectHandler.js +487 -656
  40. package/src/og/entity/GeometryHandler.js +1341 -1337
  41. package/src/og/entity/Polyline.js +0 -16
  42. package/src/og/entity/Ray.js +0 -10
  43. package/src/og/entity/RayHandler.js +3 -44
  44. package/src/og/entity/Strip.js +1 -6
  45. package/src/og/index.js +13 -7
  46. package/src/og/input/input.js +3 -1
  47. package/src/og/layer/CanvasTiles.js +39 -34
  48. package/src/og/layer/Layer.js +69 -9
  49. package/src/og/layer/Material.js +1 -8
  50. package/src/og/layer/WMS.js +16 -5
  51. package/src/og/light/LightSource.js +2 -0
  52. package/src/og/math/Line3.js +140 -139
  53. package/src/og/math/Plane.js +118 -117
  54. package/src/og/math/Ray.js +242 -239
  55. package/src/og/math/Vec3.js +56 -37
  56. package/src/og/math/Vec4.js +3 -4
  57. package/src/og/math.js +21 -21
  58. package/src/og/quadTree/Node.js +5 -4
  59. package/src/og/quadTree/index.js +12 -0
  60. package/src/og/renderer/Renderer.js +64 -37
  61. package/src/og/renderer/RendererEvents.js +1071 -1065
  62. package/src/og/scene/Planet.js +354 -174
  63. package/src/og/scene/RenderNode.js +27 -12
  64. package/src/og/segment/Segment.js +0 -5
  65. package/src/og/shaders/atmos.js +332 -0
  66. package/src/og/shaders/drawnode.js +475 -109
  67. package/src/og/shaders/geoObject.js +96 -51
  68. package/src/og/shaders/polyline.js +212 -17
  69. package/src/og/shaders/ray.js +13 -6
  70. package/src/og/shaders/toneMapping.js +5 -5
  71. package/src/og/shaders/utils.js +88 -0
  72. package/src/og/terrain/GlobusTerrain.js +5 -4
  73. package/src/og/terrain/MapboxTerrain.js +231 -52
  74. package/src/og/ui/Button.js +106 -0
  75. package/src/og/ui/ButtonGroup.js +57 -0
  76. package/src/og/ui/Dialog.js +242 -0
  77. package/src/og/ui/Slider.js +144 -0
  78. package/src/og/ui/ToggleButton.js +51 -0
  79. package/src/og/{control → ui}/UIhelpers.js +11 -2
  80. package/src/og/ui/View.js +190 -0
  81. package/src/og/utils/shared.js +960 -942
  82. package/src/og/webgl/Framebuffer.js +308 -387
  83. package/src/og/webgl/Handler.js +90 -30
  84. package/src/og/webgl/Multisample.js +8 -0
  85. package/types/Clock.d.ts +7 -2
  86. package/types/Object3d.d.ts +14 -3
  87. package/types/camera/Camera.d.ts +18 -17
  88. package/types/camera/PlanetCamera.d.ts +3 -1
  89. package/types/control/Atmosphere.d.ts +15 -0
  90. package/types/control/CompassButton.d.ts +1 -2
  91. package/types/control/GeoImageDragControl.d.ts +7 -1
  92. package/types/control/LayerSwitcher.d.ts +5 -6
  93. package/types/control/Lighting.d.ts +32 -7
  94. package/types/control/ScaleControl.d.ts +2 -1
  95. package/types/control/SimpleSkyBackground.d.ts +15 -0
  96. package/types/control/ZoomControl.d.ts +0 -1
  97. package/types/control/index.d.ts +4 -1
  98. package/types/control/ruler/RulerScene.d.ts +0 -1
  99. package/types/control/selection/Selection.d.ts +49 -0
  100. package/types/control/selection/SelectionScene.d.ts +34 -0
  101. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  102. package/types/entity/Entity.d.ts +8 -0
  103. package/types/entity/GeoObject.d.ts +28 -22
  104. package/types/entity/GeoObjectHandler.d.ts +16 -56
  105. package/types/entity/Ray.d.ts +0 -3
  106. package/types/entity/RayHandler.d.ts +0 -4
  107. package/types/index.d.ts +9 -6
  108. package/types/input/input.d.ts +2 -0
  109. package/types/layer/CanvasTiles.d.ts +1 -0
  110. package/types/layer/Layer.d.ts +9 -0
  111. package/types/layer/WMS.d.ts +7 -3
  112. package/types/math/Plane.d.ts +1 -1
  113. package/types/math/Vec3.d.ts +19 -16
  114. package/types/math/Vec4.d.ts +2 -3
  115. package/types/math.d.ts +20 -20
  116. package/types/quadTree/index.d.ts +10 -0
  117. package/types/renderer/Renderer.d.ts +11 -37
  118. package/types/scene/Planet.d.ts +27 -1
  119. package/types/scene/RenderNode.d.ts +2 -1
  120. package/types/segment/Segment.d.ts +1 -1
  121. package/types/shaders/atmos.d.ts +4 -0
  122. package/types/shaders/drawnode.d.ts +3 -2
  123. package/types/shaders/utils.d.ts +1 -0
  124. package/types/terrain/GlobusTerrain.d.ts +1 -1
  125. package/types/terrain/MapboxTerrain.d.ts +2 -1
  126. package/types/ui/Button.d.ts +21 -0
  127. package/types/ui/Dialog.d.ts +41 -0
  128. package/types/ui/Slider.d.ts +30 -0
  129. package/types/ui/ToggleButton.d.ts +10 -0
  130. package/types/{control → ui}/UIhelpers.d.ts +1 -1
  131. package/types/ui/View.d.ts +32 -0
  132. package/types/utils/shared.d.ts +16 -14
  133. package/types/webgl/Framebuffer.d.ts +2 -5
  134. package/types/webgl/Handler.d.ts +15 -10
  135. package/types/webgl/Multisample.d.ts +2 -0
  136. package/src/og/ajax.js +0 -204
  137. package/src/og/entity/Object3d.js +0 -504
  138. package/src/og/utils/quadTreeType.js +0 -11
  139. package/types/ajax.d.ts +0 -24
  140. package/types/utils/quadTreeType.d.ts +0 -8
@@ -1,387 +1,308 @@
1
- /**
2
- * @module og/webgl/Framebuffer
3
- */
4
-
5
- "use strict";
6
-
7
- import { ImageCanvas } from "../ImageCanvas.js";
8
-
9
- /**
10
- * Class represents framebuffer.
11
- * @class
12
- * @param {Handler} handler - WebGL handler.
13
- * @param {Object} [options] - Framebuffer options:
14
- * @param {number} [options.width] - Framebuffer width. Default is handler canvas width.
15
- * @param {number} [options.height] - Framebuffer height. Default is handler canvas height.
16
- * @param {number} [options.size] - Color attachment size.
17
- * @param {String} [options.internalFormat="RGBA"] - Specifies the color components in the texture.
18
- * @param {String} [options.format="RGBA"] - Specifies the format of the texel data.
19
- * @param {String} [options.type="UNSIGNED_BYTE"] - Specifies the data type of the texel data.
20
- * @param {String} [options.depthComponent="DEPTH_COMPONENT16"] - Specifies depth buffer size.
21
- * @param {Boolean} [options.useDepth] - Using depth buffer during the rendering.
22
- */
23
- export class Framebuffer {
24
- constructor(handler, options = {}) {
25
- /**
26
- * WebGL handler.
27
- * @public
28
- * @type {Handler}
29
- */
30
- this.handler = handler;
31
-
32
- /**
33
- * Framebuffer object.
34
- * @private
35
- * @type {Object}
36
- */
37
- this._fbo = null;
38
-
39
- this._isBare = options.isBare || false;
40
-
41
- /**
42
- * Renderbuffer object.
43
- * @private
44
- * @type {Object}
45
- */
46
- this._depthRenderbuffer = null;
47
-
48
- this._filter = options.filter || "NEAREST";
49
-
50
- this._internalFormatArr =
51
- options.internalFormat instanceof Array
52
- ? options.internalFormat
53
- : [options.internalFormat || "RGBA"];
54
-
55
- this._formatArr =
56
- options.format instanceof Array ? options.format : [options.format || "RGBA"];
57
-
58
- this._typeArr =
59
- options.type instanceof Array ? options.type : [options.type || "UNSIGNED_BYTE"];
60
-
61
- this._attachmentArr =
62
- options.attachment instanceof Array
63
- ? options.attachment.map((a, i) => {
64
- let res = a.toUpperCase();
65
- if (res === "COLOR_ATTACHMENT") {
66
- return `${res}${i.toString()}`;
67
- }
68
- return res;
69
- })
70
- : [options.attachment || "COLOR_ATTACHMENT0"];
71
-
72
- /**
73
- * Framebuffer width.
74
- * @private
75
- * @type {number}
76
- */
77
- this._width = options.width || handler.canvas.width;
78
-
79
- /**
80
- * Framebuffer width.
81
- * @private
82
- * @type {number}
83
- */
84
- this._height = options.height || handler.canvas.height;
85
-
86
- this._depthComponent =
87
- options.depthComponent != undefined ? options.depthComponent : "DEPTH_COMPONENT16";
88
-
89
- this._useDepth = options.useDepth != undefined ? options.useDepth : true;
90
-
91
- /**
92
- * Framebuffer activity.
93
- * @private
94
- * @type {boolean}
95
- */
96
- this._active = false;
97
-
98
- this._size = options.size || 1;
99
-
100
- /**
101
- * Framebuffer texture.
102
- * @public
103
- * @type {number}
104
- */
105
- this.textures = options.textures || new Array(this._size);
106
- }
107
-
108
- static blit(sourceFramebuffer, destFramebuffer, glAttachment, glMask, glFilter) {
109
- let gl = sourceFramebuffer.handler.gl;
110
-
111
- gl.bindFramebuffer(gl.READ_FRAMEBUFFER, sourceFramebuffer._fbo);
112
- gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destFramebuffer._fbo);
113
- gl.readBuffer(glAttachment);
114
-
115
- gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);
116
-
117
- gl.blitFramebuffer(
118
- 0,
119
- 0,
120
- sourceFramebuffer._width,
121
- sourceFramebuffer._height,
122
- 0,
123
- 0,
124
- destFramebuffer._width,
125
- destFramebuffer._height,
126
- glMask,
127
- glFilter
128
- );
129
-
130
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
131
- gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
132
- gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
133
- }
134
-
135
- destroy() {
136
- var gl = this.handler.gl;
137
-
138
- for (var i = 0; i < this.textures.length; i++) {
139
- gl.deleteTexture(this.textures[i]);
140
- }
141
- this.textures = new Array(this._size);
142
-
143
- gl.deleteFramebuffer(this._fbo);
144
- gl.deleteRenderbuffer(this._depthRenderbuffer);
145
-
146
- this._depthRenderbuffer = null;
147
- this._fbo = null;
148
-
149
- this._active = false;
150
- }
151
-
152
- /**
153
- * Framebuffer initialization.
154
- * @private
155
- */
156
- init() {
157
- var gl = this.handler.gl;
158
-
159
- this._fbo = gl.createFramebuffer();
160
-
161
- gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
162
-
163
- if (!this._isBare) {
164
- let attachmentArr = [];
165
- for (var i = 0; i < this.textures.length; i++) {
166
- let ti =
167
- this.textures[i] ||
168
- this.handler.createEmptyTexture2DExt(
169
- this._width,
170
- this._height,
171
- this._filter,
172
- this._internalFormatArr[i],
173
- this._formatArr[i],
174
- this._typeArr[i]
175
- );
176
-
177
- let att_i = gl[this._attachmentArr[i]];
178
-
179
- this.bindOutputTexture(ti, att_i);
180
-
181
- this.textures[i] = ti;
182
-
183
- if (this._attachmentArr[i] != "DEPTH_ATTACHMENT") {
184
- attachmentArr.push(att_i);
185
- }
186
- }
187
- gl.drawBuffers && gl.drawBuffers(attachmentArr);
188
- }
189
-
190
- if (this._useDepth) {
191
- this._depthRenderbuffer = gl.createRenderbuffer();
192
- gl.bindRenderbuffer(gl.RENDERBUFFER, this._depthRenderbuffer);
193
- gl.renderbufferStorage(
194
- gl.RENDERBUFFER,
195
- gl[this._depthComponent],
196
- this._width,
197
- this._height
198
- );
199
- gl.framebufferRenderbuffer(
200
- gl.FRAMEBUFFER,
201
- gl.DEPTH_ATTACHMENT,
202
- gl.RENDERBUFFER,
203
- this._depthRenderbuffer
204
- );
205
- gl.bindRenderbuffer(gl.RENDERBUFFER, null);
206
- }
207
-
208
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
209
-
210
- return this;
211
- }
212
-
213
- /**
214
- * Bind buffer texture.
215
- * @public
216
- * @param{Object} texture - Output texture.
217
- * @param {Number} [attachmentIndex=0] - color attachment index.
218
- */
219
- bindOutputTexture(texture, glAttachment) {
220
- var gl = this.handler.gl;
221
- gl.bindTexture(gl.TEXTURE_2D, texture);
222
- gl.framebufferTexture2D(
223
- gl.FRAMEBUFFER,
224
- glAttachment || gl.COLOR_ATTACHMENT0,
225
- gl.TEXTURE_2D,
226
- texture,
227
- 0
228
- );
229
- gl.bindTexture(gl.TEXTURE_2D, null);
230
- }
231
-
232
- /**
233
- * Sets framebuffer viewport size.
234
- * @public
235
- * @param {number} width - Framebuffer width.
236
- * @param {number} height - Framebuffer height.
237
- */
238
- setSize(width, height, forceDestroy) {
239
- this._width = width;
240
- this._height = height;
241
-
242
- if (this._active) {
243
- this.handler.gl.viewport(0, 0, this._width, this._height);
244
- }
245
-
246
- if (this._useDepth || forceDestroy) {
247
- this.destroy();
248
- this.init();
249
- }
250
- }
251
-
252
- /**
253
- * Returns framebuffer completed.
254
- * @public
255
- * @returns {boolean} -
256
- */
257
- isComplete() {
258
- var gl = this.handler.gl;
259
- if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {
260
- return true;
261
- }
262
- return false;
263
- }
264
-
265
- /**
266
- * Gets pixel RBGA color from framebuffer by coordinates.
267
- * @public
268
- * @param {Uint8Array} res - Normalized x - coordinate.
269
- * @param {number} nx - Normalized x - coordinate.
270
- * @param {number} ny - Normalized y - coordinate.
271
- * @param {number} [w=1] - Normalized width.
272
- * @param {number} [h=1] - Normalized height.
273
- * @param {Number} [attachmentIndex=0] - color attachment index.
274
- */
275
- readPixels(res, nx, ny, index = 0, w = 1, h = 1) {
276
- var gl = this.handler.gl;
277
- gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
278
- gl.readBuffer && gl.readBuffer(gl.COLOR_ATTACHMENT0 + index || 0);
279
- gl.readPixels(
280
- nx * this._width,
281
- ny * this._height,
282
- w,
283
- h,
284
- gl.RGBA,
285
- gl[this._typeArr[index]],
286
- res
287
- );
288
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
289
- }
290
-
291
- /**
292
- * Reads all pixels(RGBA colors) from framebuffer.
293
- * @public
294
- * @param {Uint8Array} res - Result array.
295
- * @param {Number} [attachmentIndex=0] - color attachment index.
296
- */
297
- readAllPixels(res, attachmentIndex = 0) {
298
- var gl = this.handler.gl;
299
- gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
300
- gl.readBuffer && gl.readBuffer(gl.COLOR_ATTACHMENT0 + attachmentIndex);
301
- gl.readPixels(
302
- 0,
303
- 0,
304
- this._width,
305
- this._height,
306
- gl.RGBA,
307
- gl[this._typeArr[attachmentIndex]],
308
- res
309
- );
310
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
311
- }
312
-
313
- /**
314
- * Activate framebuffer frame to draw.
315
- * @public
316
- * @returns {Framebuffer} Returns Current framebuffer.
317
- */
318
- activate() {
319
- var gl = this.handler.gl;
320
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
321
- gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
322
- gl.viewport(0, 0, this._width, this._height);
323
- this._active = true;
324
- var c = this.handler.framebufferStack.current().data;
325
- c && (c._active = false);
326
- this.handler.framebufferStack.push(this);
327
- return this;
328
- }
329
-
330
- /**
331
- * Deactivate framebuffer frame.
332
- * @public
333
- */
334
- deactivate() {
335
- var h = this.handler,
336
- gl = h.gl;
337
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
338
- this._active = false;
339
-
340
- var f = this.handler.framebufferStack.popPrev();
341
-
342
- if (f) {
343
- gl.bindFramebuffer(gl.FRAMEBUFFER, f._fbo);
344
- gl.viewport(0, 0, f._width, f._height);
345
- } else {
346
- gl.viewport(0, 0, h.canvas.width, h.canvas.height);
347
- }
348
- }
349
-
350
- /**
351
- * Gets JavaScript image object that framebuffer has drawn.
352
- * @public
353
- * @returns {Object} -
354
- */
355
- getImage() {
356
- var data = new Uint8Array(4 * this._width * this._height);
357
- this.readAllPixels(data);
358
- var imageCanvas = new ImageCanvas(this._width, this._height);
359
- imageCanvas.setData(data);
360
- return imageCanvas.getImage();
361
- }
362
-
363
- /**
364
- * Open dialog window with framebuffer image.
365
- * @public
366
- */
367
- openImage() {
368
- var img = this.getImage();
369
- var dataUrl = img.src;
370
- var windowContent = "<!DOCTYPE html>";
371
- windowContent += "<html>";
372
- windowContent += "<head><title>Print</title></head>";
373
- windowContent += "<body>";
374
- windowContent += '<img src="' + dataUrl + '">';
375
- windowContent += "</body>";
376
- windowContent += "</html>";
377
- var printWin = window.open(
378
- "",
379
- "",
380
- "width=" + img.width + "px ,height=" + img.height + "px"
381
- );
382
- printWin.document.open();
383
- printWin.document.write(windowContent);
384
- printWin.document.close();
385
- printWin.focus();
386
- }
387
- }
1
+ /**
2
+ * @module og/webgl/Framebuffer
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import { ImageCanvas } from "../ImageCanvas.js";
8
+
9
+ /**
10
+ * Class represents framebuffer.
11
+ * @class
12
+ * @param {Handler} handler - WebGL handler.
13
+ * @param {Object} [options] - Framebuffer options:
14
+ * @param {number} [options.width] - Framebuffer width. Default is handler canvas width.
15
+ * @param {number} [options.height] - Framebuffer height. Default is handler canvas height.
16
+ * @param {number} [options.size] - Color attachment size.
17
+ * @param {String} [options.internalFormat="RGBA"] - Specifies the color components in the texture.
18
+ * @param {String} [options.format="RGBA"] - Specifies the format of the texel data.
19
+ * @param {String} [options.type="UNSIGNED_BYTE"] - Specifies the data type of the texel data.
20
+ * @param {String} [options.depthComponent="DEPTH_COMPONENT16"] - Specifies depth buffer size.
21
+ * @param {Boolean} [options.useDepth] - Using depth buffer during the rendering.
22
+ */
23
+ export class Framebuffer {
24
+ constructor(handler, options = {}) {
25
+ /**
26
+ * WebGL handler.
27
+ * @public
28
+ * @type {Handler}
29
+ */
30
+ this.handler = handler;
31
+
32
+ /**
33
+ * Framebuffer object.
34
+ * @private
35
+ * @type {Object}
36
+ */
37
+ this._fbo = null;
38
+
39
+ this._isBare = options.isBare || false;
40
+
41
+ /**
42
+ * Renderbuffer object.
43
+ * @private
44
+ * @type {Object}
45
+ */
46
+ this._depthRenderbuffer = null;
47
+
48
+ this._filter = options.filter || "NEAREST";
49
+
50
+ this._internalFormatArr = options.internalFormat instanceof Array ? options.internalFormat : [options.internalFormat || "RGBA"];
51
+
52
+ this._formatArr = options.format instanceof Array ? options.format : [options.format || "RGBA"];
53
+
54
+ this._typeArr = options.type instanceof Array ? options.type : [options.type || "UNSIGNED_BYTE"];
55
+
56
+ this._attachmentArr = options.attachment instanceof Array ? options.attachment.map((a, i) => {
57
+ let res = a.toUpperCase();
58
+ if (res === "COLOR_ATTACHMENT") {
59
+ return `${res}${i.toString()}`;
60
+ }
61
+ return res;
62
+ }) : [options.attachment || "COLOR_ATTACHMENT0"];
63
+
64
+ /**
65
+ * Framebuffer width.
66
+ * @private
67
+ * @type {number}
68
+ */
69
+ this._width = options.width || handler.canvas.width;
70
+
71
+ /**
72
+ * Framebuffer width.
73
+ * @private
74
+ * @type {number}
75
+ */
76
+ this._height = options.height || handler.canvas.height;
77
+
78
+ this._depthComponent = options.depthComponent != undefined ? options.depthComponent : "DEPTH_COMPONENT16";
79
+
80
+ this._useDepth = options.useDepth != undefined ? options.useDepth : true;
81
+
82
+ /**
83
+ * Framebuffer activity.
84
+ * @private
85
+ * @type {boolean}
86
+ */
87
+ this._active = false;
88
+
89
+ this._size = options.size || 1;
90
+
91
+ /**
92
+ * Framebuffer texture.
93
+ * @public
94
+ * @type {number}
95
+ */
96
+ this.textures = options.textures || new Array(this._size);
97
+ }
98
+
99
+ static blit(sourceFramebuffer, destFramebuffer, glAttachment, glMask, glFilter) {
100
+ let gl = sourceFramebuffer.handler.gl;
101
+
102
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, sourceFramebuffer._fbo);
103
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, destFramebuffer._fbo);
104
+ gl.readBuffer(glAttachment);
105
+
106
+ gl.clearBufferfv(gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);
107
+
108
+ gl.blitFramebuffer(0, 0, sourceFramebuffer._width, sourceFramebuffer._height, 0, 0, destFramebuffer._width, destFramebuffer._height, glMask, glFilter);
109
+
110
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
111
+ gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
112
+ gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
113
+ }
114
+
115
+ get width() {
116
+ return this._width;
117
+ }
118
+
119
+ get height() {
120
+ return this._height;
121
+ }
122
+
123
+ destroy() {
124
+ var gl = this.handler.gl;
125
+
126
+ for (var i = 0; i < this.textures.length; i++) {
127
+ gl.deleteTexture(this.textures[i]);
128
+ }
129
+ this.textures = new Array(this._size);
130
+
131
+ gl.deleteFramebuffer(this._fbo);
132
+ gl.deleteRenderbuffer(this._depthRenderbuffer);
133
+
134
+ this._depthRenderbuffer = null;
135
+ this._fbo = null;
136
+
137
+ this._active = false;
138
+ }
139
+
140
+ /**
141
+ * Framebuffer initialization.
142
+ * @private
143
+ */
144
+ init() {
145
+ var gl = this.handler.gl;
146
+
147
+ this._fbo = gl.createFramebuffer();
148
+
149
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
150
+
151
+ if (!this._isBare) {
152
+ let attachmentArr = [];
153
+ for (var i = 0; i < this.textures.length; i++) {
154
+ let ti = this.textures[i] || this.handler.createEmptyTexture2DExt(this._width, this._height, this._filter, this._internalFormatArr[i], this._formatArr[i], this._typeArr[i]);
155
+
156
+ let att_i = gl[this._attachmentArr[i]];
157
+
158
+ this.bindOutputTexture(ti, att_i);
159
+
160
+ this.textures[i] = ti;
161
+
162
+ if (this._attachmentArr[i] != "DEPTH_ATTACHMENT") {
163
+ attachmentArr.push(att_i);
164
+ }
165
+ }
166
+ gl.drawBuffers && gl.drawBuffers(attachmentArr);
167
+ }
168
+
169
+ if (this._useDepth) {
170
+ this._depthRenderbuffer = gl.createRenderbuffer();
171
+ gl.bindRenderbuffer(gl.RENDERBUFFER, this._depthRenderbuffer);
172
+ gl.renderbufferStorage(gl.RENDERBUFFER, gl[this._depthComponent], this._width, this._height);
173
+ gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this._depthRenderbuffer);
174
+ gl.bindRenderbuffer(gl.RENDERBUFFER, null);
175
+ }
176
+
177
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
178
+
179
+ return this;
180
+ }
181
+
182
+ /**
183
+ * Bind buffer texture.
184
+ * @public
185
+ * @param{Object} texture - Output texture.
186
+ * @param {Number} [attachmentIndex=0] - color attachment index.
187
+ */
188
+ bindOutputTexture(texture, glAttachment) {
189
+ var gl = this.handler.gl;
190
+ gl.bindTexture(gl.TEXTURE_2D, texture);
191
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, glAttachment || gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
192
+ gl.bindTexture(gl.TEXTURE_2D, null);
193
+ }
194
+
195
+ /**
196
+ * Sets framebuffer viewport size.
197
+ * @public
198
+ * @param {number} width - Framebuffer width.
199
+ * @param {number} height - Framebuffer height.
200
+ */
201
+ setSize(width, height, forceDestroy) {
202
+ this._width = width;
203
+ this._height = height;
204
+
205
+ if (this._active) {
206
+ this.handler.gl.viewport(0, 0, this._width, this._height);
207
+ }
208
+
209
+ if (this._useDepth || forceDestroy) {
210
+ this.destroy();
211
+ this.init();
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Returns framebuffer completed.
217
+ * @public
218
+ * @returns {boolean} -
219
+ */
220
+ isComplete() {
221
+ var gl = this.handler.gl;
222
+ if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {
223
+ return true;
224
+ }
225
+ return false;
226
+ }
227
+
228
+ /**
229
+ * Gets pixel RBGA color from framebuffer by coordinates.
230
+ * @public
231
+ * @param {Uint8Array} res - Normalized x - coordinate.
232
+ * @param {number} nx - Normalized x - coordinate.
233
+ * @param {number} ny - Normalized y - coordinate.
234
+ * @param {number} [w=1] - Normalized width.
235
+ * @param {number} [h=1] - Normalized height.
236
+ * @param {Number} [attachmentIndex=0] - color attachment index.
237
+ */
238
+ readPixels(res, nx, ny, index = 0, w = 1, h = 1) {
239
+ var gl = this.handler.gl;
240
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
241
+ gl.readBuffer && gl.readBuffer(gl.COLOR_ATTACHMENT0 + index || 0);
242
+ gl.readPixels(nx * this._width, ny * this._height, w, h, gl.RGBA, gl[this._typeArr[index]], res);
243
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
244
+ }
245
+
246
+ /**
247
+ * Reads all pixels(RGBA colors) from framebuffer.
248
+ * @public
249
+ * @param {Uint8Array} res - Result array.
250
+ * @param {Number} [attachmentIndex=0] - color attachment index.
251
+ */
252
+ readAllPixels(res, attachmentIndex = 0) {
253
+ var gl = this.handler.gl;
254
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
255
+ gl.readBuffer && gl.readBuffer(gl.COLOR_ATTACHMENT0 + attachmentIndex);
256
+ gl.readPixels(0, 0, this._width, this._height, gl.RGBA, gl[this._typeArr[attachmentIndex]], res);
257
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
258
+ }
259
+
260
+ /**
261
+ * Activate framebuffer frame to draw.
262
+ * @public
263
+ * @returns {Framebuffer} Returns Current framebuffer.
264
+ */
265
+ activate() {
266
+ var gl = this.handler.gl;
267
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
268
+ gl.bindFramebuffer(gl.FRAMEBUFFER, this._fbo);
269
+ gl.viewport(0, 0, this._width, this._height);
270
+ this._active = true;
271
+ var c = this.handler.framebufferStack.current().data;
272
+ c && (c._active = false);
273
+ this.handler.framebufferStack.push(this);
274
+ return this;
275
+ }
276
+
277
+ /**
278
+ * Deactivate framebuffer frame.
279
+ * @public
280
+ */
281
+ deactivate() {
282
+ var h = this.handler, gl = h.gl;
283
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
284
+ this._active = false;
285
+
286
+ var f = this.handler.framebufferStack.popPrev();
287
+
288
+ if (f) {
289
+ gl.bindFramebuffer(gl.FRAMEBUFFER, f._fbo);
290
+ gl.viewport(0, 0, f._width, f._height);
291
+ } else {
292
+ gl.viewport(0, 0, h.canvas.width, h.canvas.height);
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Gets JavaScript image object that framebuffer has drawn.
298
+ * @public
299
+ * @returns {Object} -
300
+ */
301
+ getImage() {
302
+ var data = new Uint8Array(4 * this._width * this._height);
303
+ this.readAllPixels(data);
304
+ var imageCanvas = new ImageCanvas(this._width, this._height);
305
+ imageCanvas.setData(data);
306
+ return imageCanvas.getImage();
307
+ }
308
+ }