@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.
- package/css/og.css +378 -275
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +18 -17
- package/src/og/Clock.js +218 -194
- package/src/og/Globe.js +5 -5
- package/src/og/Object3d.js +104 -145
- package/src/og/camera/Camera.js +31 -27
- package/src/og/camera/PlanetCamera.js +22 -14
- package/src/og/cons.js +107 -107
- package/src/og/control/Atmosphere.js +396 -0
- package/src/og/control/CompassButton.js +11 -18
- package/src/og/control/Control.js +197 -188
- package/src/og/control/GeoImageDragControl.js +84 -66
- package/src/og/control/LayerSwitcher.js +56 -138
- package/src/og/control/Lighting.js +314 -186
- package/src/og/control/MouseNavigation.js +2 -2
- package/src/og/control/RulerSwitcher.js +24 -19
- package/src/og/control/ScaleControl.js +30 -10
- package/src/og/control/SimpleSkyBackground.js +210 -0
- package/src/og/control/Sun.js +3 -1
- package/src/og/control/ZoomControl.js +30 -42
- package/src/og/control/index.js +6 -0
- package/src/og/control/ruler/RulerScene.js +5 -23
- package/src/og/control/selection/Selection.js +99 -0
- package/src/og/control/selection/SelectionScene.js +350 -0
- package/src/og/control/timeline/TimelineControl.js +99 -0
- package/src/og/control/timeline/TimelineModel.js +133 -0
- package/src/og/control/timeline/TimelineView.js +449 -0
- package/src/og/control/timeline/timelineUtils.js +132 -0
- package/src/og/ellipsoid/Ellipsoid.js +120 -93
- package/src/og/ellipsoid/wgs84.js +13 -13
- package/src/og/entity/Entity.js +36 -9
- package/src/og/entity/EntityCollection.js +0 -2
- package/src/og/entity/GeoObject.js +72 -56
- package/src/og/entity/GeoObjectHandler.js +487 -656
- package/src/og/entity/GeometryHandler.js +1341 -1337
- package/src/og/entity/Polyline.js +0 -16
- package/src/og/entity/Ray.js +0 -10
- package/src/og/entity/RayHandler.js +3 -44
- package/src/og/entity/Strip.js +1 -6
- package/src/og/index.js +13 -7
- package/src/og/input/input.js +3 -1
- package/src/og/layer/CanvasTiles.js +39 -34
- package/src/og/layer/Layer.js +69 -9
- package/src/og/layer/Material.js +1 -8
- package/src/og/layer/WMS.js +16 -5
- package/src/og/light/LightSource.js +2 -0
- package/src/og/math/Line3.js +140 -139
- package/src/og/math/Plane.js +118 -117
- package/src/og/math/Ray.js +242 -239
- package/src/og/math/Vec3.js +56 -37
- package/src/og/math/Vec4.js +3 -4
- package/src/og/math.js +21 -21
- package/src/og/quadTree/Node.js +5 -4
- package/src/og/quadTree/index.js +12 -0
- package/src/og/renderer/Renderer.js +64 -37
- package/src/og/renderer/RendererEvents.js +1071 -1065
- package/src/og/scene/Planet.js +354 -174
- package/src/og/scene/RenderNode.js +27 -12
- package/src/og/segment/Segment.js +0 -5
- package/src/og/shaders/atmos.js +332 -0
- package/src/og/shaders/drawnode.js +475 -109
- package/src/og/shaders/geoObject.js +96 -51
- package/src/og/shaders/polyline.js +212 -17
- package/src/og/shaders/ray.js +13 -6
- package/src/og/shaders/toneMapping.js +5 -5
- package/src/og/shaders/utils.js +88 -0
- package/src/og/terrain/GlobusTerrain.js +5 -4
- package/src/og/terrain/MapboxTerrain.js +231 -52
- package/src/og/ui/Button.js +106 -0
- package/src/og/ui/ButtonGroup.js +57 -0
- package/src/og/ui/Dialog.js +242 -0
- package/src/og/ui/Slider.js +144 -0
- package/src/og/ui/ToggleButton.js +51 -0
- package/src/og/{control → ui}/UIhelpers.js +11 -2
- package/src/og/ui/View.js +190 -0
- package/src/og/utils/shared.js +960 -942
- package/src/og/webgl/Framebuffer.js +308 -387
- package/src/og/webgl/Handler.js +90 -30
- package/src/og/webgl/Multisample.js +8 -0
- package/types/Clock.d.ts +7 -2
- package/types/Object3d.d.ts +14 -3
- package/types/camera/Camera.d.ts +18 -17
- package/types/camera/PlanetCamera.d.ts +3 -1
- package/types/control/Atmosphere.d.ts +15 -0
- package/types/control/CompassButton.d.ts +1 -2
- package/types/control/GeoImageDragControl.d.ts +7 -1
- package/types/control/LayerSwitcher.d.ts +5 -6
- package/types/control/Lighting.d.ts +32 -7
- package/types/control/ScaleControl.d.ts +2 -1
- package/types/control/SimpleSkyBackground.d.ts +15 -0
- package/types/control/ZoomControl.d.ts +0 -1
- package/types/control/index.d.ts +4 -1
- package/types/control/ruler/RulerScene.d.ts +0 -1
- package/types/control/selection/Selection.d.ts +49 -0
- package/types/control/selection/SelectionScene.d.ts +34 -0
- package/types/ellipsoid/Ellipsoid.d.ts +3 -2
- package/types/entity/Entity.d.ts +8 -0
- package/types/entity/GeoObject.d.ts +28 -22
- package/types/entity/GeoObjectHandler.d.ts +16 -56
- package/types/entity/Ray.d.ts +0 -3
- package/types/entity/RayHandler.d.ts +0 -4
- package/types/index.d.ts +9 -6
- package/types/input/input.d.ts +2 -0
- package/types/layer/CanvasTiles.d.ts +1 -0
- package/types/layer/Layer.d.ts +9 -0
- package/types/layer/WMS.d.ts +7 -3
- package/types/math/Plane.d.ts +1 -1
- package/types/math/Vec3.d.ts +19 -16
- package/types/math/Vec4.d.ts +2 -3
- package/types/math.d.ts +20 -20
- package/types/quadTree/index.d.ts +10 -0
- package/types/renderer/Renderer.d.ts +11 -37
- package/types/scene/Planet.d.ts +27 -1
- package/types/scene/RenderNode.d.ts +2 -1
- package/types/segment/Segment.d.ts +1 -1
- package/types/shaders/atmos.d.ts +4 -0
- package/types/shaders/drawnode.d.ts +3 -2
- package/types/shaders/utils.d.ts +1 -0
- package/types/terrain/GlobusTerrain.d.ts +1 -1
- package/types/terrain/MapboxTerrain.d.ts +2 -1
- package/types/ui/Button.d.ts +21 -0
- package/types/ui/Dialog.d.ts +41 -0
- package/types/ui/Slider.d.ts +30 -0
- package/types/ui/ToggleButton.d.ts +10 -0
- package/types/{control → ui}/UIhelpers.d.ts +1 -1
- package/types/ui/View.d.ts +32 -0
- package/types/utils/shared.d.ts +16 -14
- package/types/webgl/Framebuffer.d.ts +2 -5
- package/types/webgl/Handler.d.ts +15 -10
- package/types/webgl/Multisample.d.ts +2 -0
- package/src/og/ajax.js +0 -204
- package/src/og/entity/Object3d.js +0 -504
- package/src/og/utils/quadTreeType.js +0 -11
- package/types/ajax.d.ts +0 -24
- 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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
*
|
|
74
|
-
* @
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Framebuffer
|
|
93
|
-
* @
|
|
94
|
-
* @type {
|
|
95
|
-
*/
|
|
96
|
-
this.
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
gl.bindFramebuffer(gl.READ_FRAMEBUFFER,
|
|
112
|
-
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
gl.
|
|
132
|
-
gl.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
this._fbo =
|
|
148
|
-
|
|
149
|
-
this.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
*
|
|
217
|
-
* @
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
gl.
|
|
222
|
-
gl.
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
*
|
|
234
|
-
* @
|
|
235
|
-
* @param {number}
|
|
236
|
-
* @param {
|
|
237
|
-
*/
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this.
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
+
}
|