@openglobus/og 0.11.6 → 0.12.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 +5 -2
- package/package.json +12 -12
- package/src/og/Globe.js +25 -10
- package/src/og/Popup.js +3 -2
- package/src/og/camera/Camera.js +70 -79
- package/src/og/camera/PlanetCamera.js +33 -33
- package/src/og/control/DebugInfo.js +2 -2
- package/src/og/control/EarthNavigation.js +26 -17
- package/src/og/control/Lighting.js +74 -64
- package/src/og/control/MouseNavigation.js +30 -29
- package/src/og/control/MouseWheelZoomControl.js +257 -0
- package/src/og/control/Sun.js +3 -3
- package/src/og/control/index.js +2 -0
- package/src/og/control/visibleExtent/Segment.js +1862 -0
- package/src/og/control/visibleExtent/VisibleExtent.js +80 -0
- package/src/og/control/visibleExtent/drawnode.js +751 -0
- package/src/og/ellipsoid/Ellipsoid.js +1 -1
- package/src/og/entity/BaseBillboard.js +67 -76
- package/src/og/entity/BillboardHandler.js +15 -8
- package/src/og/entity/Entity.js +742 -742
- package/src/og/entity/GeoObjectHandler.js +102 -117
- package/src/og/entity/Label.js +45 -48
- package/src/og/entity/LabelHandler.js +24 -23
- package/src/og/entity/LabelWorker.js +21 -16
- package/src/og/layer/CanvasTiles.js +8 -12
- package/src/og/layer/GeoImage.js +2 -10
- package/src/og/layer/GeoTexture2d.js +2 -10
- package/src/og/layer/GeoVideo.js +2 -10
- package/src/og/layer/Layer.js +23 -32
- package/src/og/layer/Material.js +1 -1
- package/src/og/layer/WMS.js +0 -2
- package/src/og/layer/XYZ.js +31 -33
- package/src/og/math/Vec3.js +18 -2
- package/src/og/quadTree/Node.js +52 -111
- package/src/og/quadTree/quadTree.js +1 -1
- package/src/og/renderer/Renderer.js +85 -122
- package/src/og/renderer/RendererEvents.js +44 -22
- package/src/og/scene/Planet.js +179 -198
- package/src/og/segment/Segment.js +99 -268
- package/src/og/segment/Slice.js +45 -0
- package/src/og/shaders/drawnode.js +174 -360
- package/src/og/shaders/toneMapping.js +1 -0
- package/src/og/shapes/BaseShape.js +1 -1
- package/src/og/terrain/EmptyTerrain.js +3 -2
- package/src/og/terrain/GlobusTerrain.js +2 -0
- package/src/og/utils/FontAtlas.js +6 -2
- package/src/og/utils/GeoImageCreator.js +5 -1
- package/src/og/utils/Loader.js +1 -1
- package/src/og/utils/PlainSegmentWorker.js +0 -13
- package/src/og/utils/TextureAtlas.js +2 -2
- package/src/og/utils/VectorTileCreator.js +1 -3
- package/src/og/utils/shared.js +1 -1
- package/src/og/webgl/Handler.js +156 -118
- package/types/Clock.d.ts +0 -94
- package/types/Deferred.d.ts +0 -6
- package/types/Events.d.ts +0 -77
- package/types/Extent.d.ts +0 -166
- package/types/Globe.d.ts +0 -82
- package/types/ImageCanvas.d.ts +0 -123
- package/types/Lock.d.ts +0 -12
- package/types/LonLat.d.ts +0 -108
- package/types/Popup.d.ts +0 -42
- package/types/QueueArray.d.ts +0 -19
- package/types/Rectangle.d.ts +0 -80
- package/types/Stack.d.ts +0 -19
- package/types/ajax.d.ts +0 -24
- package/types/arial.d.ts +0 -48
- package/types/astro/astro.d.ts +0 -38
- package/types/astro/earth.d.ts +0 -7
- package/types/astro/jd.d.ts +0 -254
- package/types/bv/Box.d.ts +0 -30
- package/types/bv/Sphere.d.ts +0 -38
- package/types/bv/index.d.ts +0 -3
- package/types/camera/Camera.d.ts +0 -312
- package/types/camera/Frustum.d.ts +0 -133
- package/types/camera/PlanetCamera.d.ts +0 -218
- package/types/camera/index.d.ts +0 -3
- package/types/cons.d.ts +0 -40
- package/types/control/CompassButton.d.ts +0 -17
- package/types/control/Control.d.ts +0 -104
- package/types/control/DebugInfo.d.ts +0 -15
- package/types/control/EarthCoordinates.d.ts +0 -47
- package/types/control/EarthNavigation.d.ts +0 -42
- package/types/control/GeoImageDragControl.d.ts +0 -6
- package/types/control/KeyboardNavigation.d.ts +0 -21
- package/types/control/LayerSwitcher.d.ts +0 -21
- package/types/control/Lighting.d.ts +0 -16
- package/types/control/MouseNavigation.d.ts +0 -47
- package/types/control/ScaleControl.d.ts +0 -22
- package/types/control/ShowFps.d.ts +0 -11
- package/types/control/SimpleNavigation.d.ts +0 -25
- package/types/control/Sun.d.ts +0 -50
- package/types/control/ToggleWireframe.d.ts +0 -12
- package/types/control/TouchNavigation.d.ts +0 -48
- package/types/control/ZoomControl.d.ts +0 -27
- package/types/control/index.d.ts +0 -17
- package/types/ellipsoid/Ellipsoid.d.ts +0 -146
- package/types/ellipsoid/index.d.ts +0 -3
- package/types/ellipsoid/wgs84.d.ts +0 -6
- package/types/entity/BaseBillboard.d.ts +0 -215
- package/types/entity/Billboard.d.ts +0 -94
- package/types/entity/BillboardHandler.d.ts +0 -78
- package/types/entity/Entity.d.ts +0 -348
- package/types/entity/EntityCollection.d.ts +0 -317
- package/types/entity/GeoObject.d.ts +0 -111
- package/types/entity/GeoObjectHandler.d.ts +0 -77
- package/types/entity/Geometry.d.ts +0 -74
- package/types/entity/GeometryHandler.d.ts +0 -76
- package/types/entity/Label.d.ts +0 -189
- package/types/entity/LabelHandler.d.ts +0 -31
- package/types/entity/LabelWorker.d.ts +0 -9
- package/types/entity/PointCloud.d.ts +0 -174
- package/types/entity/PointCloudHandler.d.ts +0 -38
- package/types/entity/Polyline.d.ts +0 -306
- package/types/entity/PolylineHandler.d.ts +0 -18
- package/types/entity/Ray.d.ts +0 -124
- package/types/entity/RayHandler.d.ts +0 -67
- package/types/entity/ShapeHandler.d.ts +0 -22
- package/types/entity/Strip.d.ts +0 -119
- package/types/entity/StripHandler.d.ts +0 -38
- package/types/entity/index.d.ts +0 -8
- package/types/index.core.d.ts +0 -65
- package/types/index.d.ts +0 -45
- package/types/index.webgl.d.ts +0 -7
- package/types/input/KeyboardHandler.d.ts +0 -10
- package/types/input/MouseHandler.d.ts +0 -5
- package/types/input/TouchHandler.d.ts +0 -5
- package/types/input/input.d.ts +0 -34
- package/types/layer/BaseGeoImage.d.ts +0 -94
- package/types/layer/CanvasTiles.d.ts +0 -68
- package/types/layer/GeoImage.d.ts +0 -52
- package/types/layer/GeoTexture2d.d.ts +0 -8
- package/types/layer/GeoVideo.d.ts +0 -55
- package/types/layer/KML.d.ts +0 -63
- package/types/layer/Layer.d.ts +0 -326
- package/types/layer/Material.d.ts +0 -45
- package/types/layer/Vector.d.ts +0 -208
- package/types/layer/WMS.d.ts +0 -63
- package/types/layer/XYZ.d.ts +0 -120
- package/types/layer/index.d.ts +0 -10
- package/types/light/LightSource.d.ts +0 -178
- package/types/math/Line2.d.ts +0 -11
- package/types/math/Line3.d.ts +0 -10
- package/types/math/Mat3.d.ts +0 -65
- package/types/math/Mat4.d.ts +0 -176
- package/types/math/Plane.d.ts +0 -18
- package/types/math/Quat.d.ts +0 -379
- package/types/math/Ray.d.ts +0 -82
- package/types/math/Vec2.d.ts +0 -309
- package/types/math/Vec3.d.ts +0 -460
- package/types/math/Vec4.d.ts +0 -162
- package/types/math/coder.d.ts +0 -43
- package/types/math/index.d.ts +0 -11
- package/types/math.d.ts +0 -261
- package/types/mercator.d.ts +0 -92
- package/types/proj/EPSG3857.d.ts +0 -6
- package/types/proj/EPSG4326.d.ts +0 -6
- package/types/proj/Proj.d.ts +0 -42
- package/types/quadTree/EntityCollectionNode.d.ts +0 -34
- package/types/quadTree/Node.d.ts +0 -61
- package/types/quadTree/quadTree.d.ts +0 -40
- package/types/renderer/Renderer.d.ts +0 -300
- package/types/renderer/RendererEvents.d.ts +0 -233
- package/types/res/images.d.ts +0 -3
- package/types/scene/Axes.d.ts +0 -11
- package/types/scene/BaseNode.d.ts +0 -60
- package/types/scene/Planet.d.ts +0 -577
- package/types/scene/RenderNode.d.ts +0 -142
- package/types/scene/SkyBox.d.ts +0 -10
- package/types/scene/index.d.ts +0 -4
- package/types/segment/Segment.d.ts +0 -279
- package/types/segment/SegmentLonLat.d.ts +0 -16
- package/types/segment/segmentHelper.d.ts +0 -13
- package/types/shaders/billboard.d.ts +0 -3
- package/types/shaders/depth.d.ts +0 -2
- package/types/shaders/drawnode.d.ts +0 -7
- package/types/shaders/geoObject.d.ts +0 -3
- package/types/shaders/label.d.ts +0 -4
- package/types/shaders/pointCloud.d.ts +0 -2
- package/types/shaders/polyline.d.ts +0 -3
- package/types/shaders/ray.d.ts +0 -2
- package/types/shaders/screenFrame.d.ts +0 -2
- package/types/shaders/shape.d.ts +0 -4
- package/types/shaders/skybox.d.ts +0 -2
- package/types/shaders/toneMapping.d.ts +0 -2
- package/types/shapes/BaseShape.d.ts +0 -250
- package/types/shapes/Sphere.d.ts +0 -41
- package/types/terrain/BilTerrain.d.ts +0 -7
- package/types/terrain/EmptyTerrain.d.ts +0 -72
- package/types/terrain/Geoid.d.ts +0 -26
- package/types/terrain/GlobusTerrain.d.ts +0 -116
- package/types/terrain/MapboxTerrain.d.ts +0 -7
- package/types/terrain/index.d.ts +0 -5
- package/types/utils/FontAtlas.d.ts +0 -14
- package/types/utils/GeoImageCreator.d.ts +0 -30
- package/types/utils/ImagesCacheManager.d.ts +0 -10
- package/types/utils/Loader.d.ts +0 -25
- package/types/utils/NormalMapCreator.d.ts +0 -39
- package/types/utils/PlainSegmentWorker.d.ts +0 -10
- package/types/utils/TerrainWorker.d.ts +0 -9
- package/types/utils/TextureAtlas.d.ts +0 -111
- package/types/utils/VectorTileCreator.d.ts +0 -16
- package/types/utils/colorTable.d.ts +0 -143
- package/types/utils/earcut.d.ts +0 -6
- package/types/utils/shared.d.ts +0 -231
- package/types/webgl/Framebuffer.d.ts +0 -135
- package/types/webgl/Handler.d.ts +0 -397
- package/types/webgl/Multisample.d.ts +0 -89
- package/types/webgl/Program.d.ts +0 -161
- package/types/webgl/ProgramController.d.ts +0 -89
- package/types/webgl/callbacks.d.ts +0 -1
- package/types/webgl/index.d.ts +0 -6
- package/types/webgl/types.d.ts +0 -2
|
@@ -80,6 +80,7 @@ export function toneMapping() {
|
|
|
80
80
|
float oneByGamma = gamma / gamma;
|
|
81
81
|
float oneByWhitePoint = whitepoint / whitepoint;
|
|
82
82
|
vec3 mapped = ReinhardToneMapping2(hdrColor) * oneByGamma * oneByWhitePoint;
|
|
83
|
+
//vec3 mapped = ACESFilmicToneMapping(hdrColor) * oneByGamma * oneByWhitePoint;
|
|
83
84
|
|
|
84
85
|
mapped = pow(mapped, vec3(1.0 / gamma));
|
|
85
86
|
|
|
@@ -304,7 +304,7 @@ class BaseShape {
|
|
|
304
304
|
var img = new Image();
|
|
305
305
|
var that = this;
|
|
306
306
|
img.onload = function () {
|
|
307
|
-
that.texture = renderNode.renderer.handler.
|
|
307
|
+
that.texture = renderNode.renderer.handler.createTextureDefault(this);
|
|
308
308
|
};
|
|
309
309
|
img.src = this._src;
|
|
310
310
|
}
|
|
@@ -14,7 +14,9 @@ class EmptyTerrain {
|
|
|
14
14
|
constructor(options = {}) {
|
|
15
15
|
this.equalizeVertices = false;
|
|
16
16
|
|
|
17
|
-
this.equalizeNormals = false;
|
|
17
|
+
this.equalizeNormals = false;
|
|
18
|
+
|
|
19
|
+
this.isEmpty = true;
|
|
18
20
|
|
|
19
21
|
/**
|
|
20
22
|
* Provider name is "empty"
|
|
@@ -106,7 +108,6 @@ class EmptyTerrain {
|
|
|
106
108
|
|
|
107
109
|
set geoid(geoid) {
|
|
108
110
|
this._geoid = geoid;
|
|
109
|
-
//...this._planet
|
|
110
111
|
}
|
|
111
112
|
|
|
112
113
|
get geoid() {
|
|
@@ -138,10 +138,14 @@ class FontAtlas {
|
|
|
138
138
|
|
|
139
139
|
let img = new Image();
|
|
140
140
|
img.onload = () => {
|
|
141
|
-
|
|
141
|
+
this._createTexture(atlas, img);
|
|
142
142
|
def.resolve(index);
|
|
143
143
|
};
|
|
144
144
|
img.src = ARIAL_FONT_B64;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
_createTexture(atlas, img) {
|
|
148
|
+
atlas.createTexture(img);
|
|
145
149
|
}
|
|
146
150
|
|
|
147
151
|
loadFont(faceName, srcDir, atlasUrl) {
|
|
@@ -183,7 +187,7 @@ class FontAtlas {
|
|
|
183
187
|
|
|
184
188
|
let img = new Image();
|
|
185
189
|
img.onload = () => {
|
|
186
|
-
|
|
190
|
+
this._createTexture(atlas, img);
|
|
187
191
|
def.resolve(index);
|
|
188
192
|
};
|
|
189
193
|
|
|
@@ -151,7 +151,11 @@ export class GeoImageCreator {
|
|
|
151
151
|
`precision highp float;
|
|
152
152
|
uniform sampler2D sourceTexture;
|
|
153
153
|
varying vec2 v_texCoords;
|
|
154
|
-
void main () {
|
|
154
|
+
void main () {
|
|
155
|
+
if(v_texCoords.x <= 0.001 || v_texCoords.x >= 0.999 ||
|
|
156
|
+
v_texCoords.y <= 0.001 || v_texCoords.y >= 0.999) {
|
|
157
|
+
discard;
|
|
158
|
+
}
|
|
155
159
|
gl_FragColor = texture2D(sourceTexture, v_texCoords);
|
|
156
160
|
}`
|
|
157
161
|
}));
|
package/src/og/utils/Loader.js
CHANGED
|
@@ -222,19 +222,6 @@ const _programm = `
|
|
|
222
222
|
res.x = nc * Math.sin(lonrad);
|
|
223
223
|
res.y = (N * (1.0 - E2) + h) * slt;
|
|
224
224
|
res.z = nc * Math.cos(lonrad);
|
|
225
|
-
|
|
226
|
-
//let cosLat = Math.cos(lat * RADIANS)
|
|
227
|
-
//let sinLat = Math.sin(lat * RADIANS)
|
|
228
|
-
|
|
229
|
-
//let cosLong = Math.cos(lon * RADIANS)
|
|
230
|
-
//let sinLong = Math.sin(lon * RADIANS)
|
|
231
|
-
|
|
232
|
-
//let c = 1.0 / Math.sqrt(cosLat * cosLat + (1 - f) * (1 - f) * sinLat * sinLat)
|
|
233
|
-
//s = (1 - f) * (1 - f) * c
|
|
234
|
-
|
|
235
|
-
//x = (R*c + altitude) * cosLat * cosLong
|
|
236
|
-
//y = (R*c + altitude) * cosLat * sinLong
|
|
237
|
-
//z = (R*s + altitude) * sinLat
|
|
238
225
|
};
|
|
239
226
|
|
|
240
227
|
var lonLatToCartesianInverse = function (lon, lat, heightFactor, res){
|
|
@@ -180,14 +180,14 @@ class TextureAtlas {
|
|
|
180
180
|
* Creates atlas gl texture.
|
|
181
181
|
* @public
|
|
182
182
|
*/
|
|
183
|
-
createTexture(img) {
|
|
183
|
+
createTexture(img, internalFormat) {
|
|
184
184
|
if (this._handler) {
|
|
185
185
|
this._handler.gl.deleteTexture(this.texture);
|
|
186
186
|
if (img) {
|
|
187
187
|
this.canvas.resize(img.width, img.height);
|
|
188
188
|
this.canvas.drawImage(img, 0, 0, img.width, img.height);
|
|
189
189
|
}
|
|
190
|
-
this.texture = this._handler.createTexture_l(this.canvas._canvas);
|
|
190
|
+
this.texture = this._handler.createTexture_l(this.canvas._canvas, internalFormat);
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -217,8 +217,6 @@ export class VectorTileCreator {
|
|
|
217
217
|
|
|
218
218
|
// var prevLayerId = -1;
|
|
219
219
|
|
|
220
|
-
var extentParams = new Float32Array(4);
|
|
221
|
-
|
|
222
220
|
var extentParamsHigh = new Float32Array(4);
|
|
223
221
|
var extentParamsLow = new Float32Array(4);
|
|
224
222
|
|
|
@@ -245,7 +243,7 @@ export class VectorTileCreator {
|
|
|
245
243
|
|
|
246
244
|
f.bindOutputTexture(texture);
|
|
247
245
|
|
|
248
|
-
gl.clearColor(
|
|
246
|
+
gl.clearColor(0.0, 0.0, 0.0, 0.0);
|
|
249
247
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
250
248
|
|
|
251
249
|
var extent = material.segment.getExtentMerc();
|
package/src/og/utils/shared.js
CHANGED
package/src/og/webgl/Handler.js
CHANGED
|
@@ -12,15 +12,11 @@ import { ProgramController } from "./ProgramController.js";
|
|
|
12
12
|
import { Stack } from "../Stack.js";
|
|
13
13
|
import { Vec2 } from "../math/Vec2.js";
|
|
14
14
|
|
|
15
|
-
/**
|
|
16
|
-
* Maximum texture image size.
|
|
17
|
-
* @const
|
|
18
|
-
* @type {number}
|
|
19
|
-
*/
|
|
20
|
-
const MAX_SIZE = 4096;
|
|
21
|
-
|
|
22
15
|
const vendorPrefixes = ["", "WEBKIT_", "MOZ_"];
|
|
23
16
|
|
|
17
|
+
// Maximal mipmap levels
|
|
18
|
+
const MAX_LEVELS = 2;
|
|
19
|
+
|
|
24
20
|
/**
|
|
25
21
|
* A WebGL handler for accessing low-level WebGL capabilities.
|
|
26
22
|
* @class
|
|
@@ -92,21 +88,13 @@ class Handler {
|
|
|
92
88
|
* @type {Object}
|
|
93
89
|
*/
|
|
94
90
|
this._params = params || {};
|
|
95
|
-
this._params.anisotropy = this._params.anisotropy ||
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
this._params.width = w || 256;
|
|
101
|
-
|
|
102
|
-
let h = this._params.height;
|
|
103
|
-
if (h > MAX_SIZE) {
|
|
104
|
-
h = MAX_SIZE;
|
|
105
|
-
}
|
|
106
|
-
this._params.height = h || 256;
|
|
91
|
+
this._params.anisotropy = this._params.anisotropy || 4;
|
|
92
|
+
this._params.width = this._params.width || 256;
|
|
93
|
+
this._params.height = this._params.height || 256;
|
|
94
|
+
this._params.pixelRatio = this._params.pixelRatio || 1.0;
|
|
107
95
|
this._params.context = this._params.context || {};
|
|
108
96
|
this._params.extensions = this._params.extensions || [];
|
|
109
|
-
this._oneByHeight = 1 / this._params.height;
|
|
97
|
+
this._oneByHeight = 1.0 / (this._params.height * this._params.pixelRatio);
|
|
110
98
|
|
|
111
99
|
/**
|
|
112
100
|
* Current WebGL extensions. Becomes here after context initialization.
|
|
@@ -131,12 +119,21 @@ class Handler {
|
|
|
131
119
|
* @private
|
|
132
120
|
* @type {frameCallback}
|
|
133
121
|
*/
|
|
134
|
-
this._frameCallback = function () {};
|
|
122
|
+
this._frameCallback = function () { };
|
|
135
123
|
|
|
136
124
|
this.transparentTexture = null;
|
|
137
125
|
|
|
138
126
|
this.framebufferStack = new Stack();
|
|
139
127
|
|
|
128
|
+
this.createTexture = {
|
|
129
|
+
"NEAREST": null,
|
|
130
|
+
"LINEAR": null,
|
|
131
|
+
"MIPMAP": null,
|
|
132
|
+
"ANISOTROPIC": null
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
this.createTextureDefault = null;
|
|
136
|
+
|
|
140
137
|
if (params.autoActivate || isEmpty(params.autoActivate)) {
|
|
141
138
|
this.initialize();
|
|
142
139
|
}
|
|
@@ -245,48 +242,6 @@ class Handler {
|
|
|
245
242
|
return texture;
|
|
246
243
|
}
|
|
247
244
|
|
|
248
|
-
///**
|
|
249
|
-
// * Creates Empty half float texture.
|
|
250
|
-
// * @public
|
|
251
|
-
// * @param {number} width - Empty texture width.
|
|
252
|
-
// * @param {number} height - Empty texture height.
|
|
253
|
-
// * @returns {Object} - WebGL half float texture object.
|
|
254
|
-
// */
|
|
255
|
-
//createEmptyTexture_hf(width, height) {
|
|
256
|
-
// var gl = this.gl;
|
|
257
|
-
// var texture = gl.createTexture();
|
|
258
|
-
// gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
259
|
-
// gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
260
|
-
// gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.HALF_FLOAT_OES, null);
|
|
261
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
262
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
263
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
264
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
265
|
-
// gl.bindTexture(gl.TEXTURE_2D, null);
|
|
266
|
-
// return texture;
|
|
267
|
-
//}
|
|
268
|
-
|
|
269
|
-
///**
|
|
270
|
-
// * Creates Empty float texture.
|
|
271
|
-
// * @public
|
|
272
|
-
// * @param {number} width - Empty texture width.
|
|
273
|
-
// * @param {number} height - Empty texture height.
|
|
274
|
-
// * @returns {Object} - WebGL float texture object.
|
|
275
|
-
// */
|
|
276
|
-
//createEmptyTexture_f(width, height) {
|
|
277
|
-
// var gl = this.gl;
|
|
278
|
-
// var texture = gl.createTexture();
|
|
279
|
-
// gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
280
|
-
// gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
281
|
-
// gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, null);
|
|
282
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
283
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
284
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
285
|
-
// //gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
286
|
-
// gl.bindTexture(gl.TEXTURE_2D, null);
|
|
287
|
-
// return texture;
|
|
288
|
-
//}
|
|
289
|
-
|
|
290
245
|
/**
|
|
291
246
|
* Creates Empty NEAREST filtered texture.
|
|
292
247
|
* @public
|
|
@@ -294,12 +249,12 @@ class Handler {
|
|
|
294
249
|
* @param {number} height - Empty texture height.
|
|
295
250
|
* @returns {Object} - WebGL texture object.
|
|
296
251
|
*/
|
|
297
|
-
createEmptyTexture_n(width, height) {
|
|
252
|
+
createEmptyTexture_n(width, height, internalFormat) {
|
|
298
253
|
let gl = this.gl;
|
|
299
254
|
let texture = gl.createTexture();
|
|
300
255
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
301
256
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
302
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
257
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
303
258
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
304
259
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
305
260
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
@@ -315,12 +270,12 @@ class Handler {
|
|
|
315
270
|
* @param {number} height - Empty texture height.
|
|
316
271
|
* @returns {Object} - WebGL texture object.
|
|
317
272
|
*/
|
|
318
|
-
createEmptyTexture_l(width, height) {
|
|
273
|
+
createEmptyTexture_l(width, height, internalFormat) {
|
|
319
274
|
let gl = this.gl;
|
|
320
275
|
let texture = gl.createTexture();
|
|
321
276
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
322
277
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
323
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
278
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
|
|
324
279
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
325
280
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
326
281
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
@@ -335,12 +290,12 @@ class Handler {
|
|
|
335
290
|
* @param {Object} image - Image or Canvas object.
|
|
336
291
|
* @returns {Object} - WebGL texture object.
|
|
337
292
|
*/
|
|
338
|
-
|
|
339
|
-
var gl =
|
|
293
|
+
createTexture_n_webgl1(image, internalFormat) {
|
|
294
|
+
var gl = this.gl;
|
|
340
295
|
var texture = gl.createTexture();
|
|
341
296
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
342
297
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
343
|
-
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
298
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
344
299
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
345
300
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
346
301
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
@@ -355,11 +310,13 @@ class Handler {
|
|
|
355
310
|
* @param {Object} image - Image or Canvas object.
|
|
356
311
|
* @returns {Object} - WebGL texture object.
|
|
357
312
|
*/
|
|
358
|
-
|
|
359
|
-
let gl =
|
|
313
|
+
createTexture_l_webgl1(image, internalFormat) {
|
|
314
|
+
let gl = this.gl;
|
|
360
315
|
let texture = gl.createTexture();
|
|
361
316
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
362
|
-
|
|
317
|
+
|
|
318
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
319
|
+
|
|
363
320
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
364
321
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
365
322
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
@@ -374,12 +331,14 @@ class Handler {
|
|
|
374
331
|
* @param {Object} image - Image or Canvas object.
|
|
375
332
|
* @returns {Object} - WebGL texture object.
|
|
376
333
|
*/
|
|
377
|
-
|
|
378
|
-
let gl =
|
|
334
|
+
createTexture_mm_webgl1(image, internalFormat) {
|
|
335
|
+
let gl = this.gl;
|
|
379
336
|
let texture = gl.createTexture();
|
|
380
337
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
381
338
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
382
|
-
|
|
339
|
+
|
|
340
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
341
|
+
|
|
383
342
|
gl.generateMipmap(gl.TEXTURE_2D);
|
|
384
343
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
385
344
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
@@ -394,19 +353,17 @@ class Handler {
|
|
|
394
353
|
* @param {Object} image - Image or Canvas object.
|
|
395
354
|
* @returns {Object} - WebGL texture object.
|
|
396
355
|
*/
|
|
397
|
-
|
|
398
|
-
let gl =
|
|
356
|
+
createTexture_a_webgl1(image, internalFormat) {
|
|
357
|
+
let gl = this.gl;
|
|
399
358
|
let texture = gl.createTexture();
|
|
400
359
|
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
401
360
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
402
|
-
|
|
361
|
+
|
|
362
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat || gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
363
|
+
|
|
403
364
|
gl.generateMipmap(gl.TEXTURE_2D);
|
|
404
365
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
405
|
-
gl.texParameterf(
|
|
406
|
-
gl.TEXTURE_2D,
|
|
407
|
-
handler.extensions.EXT_texture_filter_anisotropic.TEXTURE_MAX_ANISOTROPY_EXT,
|
|
408
|
-
handler._params.anisotropy
|
|
409
|
-
);
|
|
366
|
+
gl.texParameterf(gl.TEXTURE_2D, this.extensions.EXT_texture_filter_anisotropic.TEXTURE_MAX_ANISOTROPY_EXT, this._params.anisotropy);
|
|
410
367
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
411
368
|
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
412
369
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
@@ -414,29 +371,95 @@ class Handler {
|
|
|
414
371
|
}
|
|
415
372
|
|
|
416
373
|
/**
|
|
417
|
-
* Creates
|
|
374
|
+
* Creates NEAREST filter texture.
|
|
418
375
|
* @public
|
|
419
376
|
* @param {Object} image - Image or Canvas object.
|
|
420
377
|
* @returns {Object} - WebGL texture object.
|
|
421
378
|
*/
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
379
|
+
createTexture_n_webgl2(image, internalFormat) {
|
|
380
|
+
var gl = this.gl;
|
|
381
|
+
var texture = gl.createTexture();
|
|
382
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
383
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
425
384
|
|
|
426
|
-
|
|
427
|
-
|
|
385
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat || gl.RGBA8, image.width, image.height);
|
|
386
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
387
|
+
|
|
388
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
389
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
390
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
391
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
392
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
393
|
+
return texture;
|
|
428
394
|
}
|
|
429
395
|
|
|
430
|
-
|
|
431
|
-
|
|
396
|
+
/**
|
|
397
|
+
* Creates LINEAR filter texture.
|
|
398
|
+
* @public
|
|
399
|
+
* @param {Object} image - Image or Canvas object.
|
|
400
|
+
* @returns {Object} - WebGL texture object.
|
|
401
|
+
*/
|
|
402
|
+
createTexture_l_webgl2(image, internalFormat) {
|
|
403
|
+
let gl = this.gl;
|
|
404
|
+
let texture = gl.createTexture();
|
|
405
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
406
|
+
|
|
407
|
+
gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat || gl.RGBA8, image.width, image.height);
|
|
408
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
409
|
+
|
|
410
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
411
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
412
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
413
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
414
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
415
|
+
return texture;
|
|
432
416
|
}
|
|
433
417
|
|
|
434
|
-
|
|
435
|
-
|
|
418
|
+
/**
|
|
419
|
+
* Creates MIPMAP filter texture.
|
|
420
|
+
* @public
|
|
421
|
+
* @param {Object} image - Image or Canvas object.
|
|
422
|
+
* @returns {Object} - WebGL texture object.
|
|
423
|
+
*/
|
|
424
|
+
createTexture_mm_webgl2(image, internalFormat) {
|
|
425
|
+
let gl = this.gl;
|
|
426
|
+
let texture = gl.createTexture();
|
|
427
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
428
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
429
|
+
|
|
430
|
+
gl.texStorage2D(gl.TEXTURE_2D, MAX_LEVELS, internalFormat || gl.RGBA8, image.width, image.height);
|
|
431
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
432
|
+
|
|
433
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
434
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
435
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
436
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
437
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
438
|
+
return texture;
|
|
436
439
|
}
|
|
437
440
|
|
|
438
|
-
|
|
439
|
-
|
|
441
|
+
/**
|
|
442
|
+
* Creates ANISOTROPY filter texture.
|
|
443
|
+
* @public
|
|
444
|
+
* @param {Object} image - Image or Canvas object.
|
|
445
|
+
* @returns {Object} - WebGL texture object.
|
|
446
|
+
*/
|
|
447
|
+
createTexture_a_webgl2(image, internalFormat) {
|
|
448
|
+
let gl = this.gl;
|
|
449
|
+
let texture = gl.createTexture();
|
|
450
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
451
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
452
|
+
|
|
453
|
+
gl.texStorage2D(gl.TEXTURE_2D, MAX_LEVELS, internalFormat || gl.RGBA8, image.width, image.height);
|
|
454
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, gl.RGBA, gl.UNSIGNED_BYTE, image);
|
|
455
|
+
|
|
456
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
457
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
458
|
+
gl.texParameterf(gl.TEXTURE_2D, this.extensions.EXT_texture_filter_anisotropic.TEXTURE_MAX_ANISOTROPY_EXT, this._params.anisotropy);
|
|
459
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
460
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
461
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
462
|
+
return texture;
|
|
440
463
|
}
|
|
441
464
|
|
|
442
465
|
/**
|
|
@@ -623,8 +646,27 @@ class Handler {
|
|
|
623
646
|
this.initializeExtension(this._params.extensions[i], true);
|
|
624
647
|
}
|
|
625
648
|
|
|
649
|
+
if (this.gl.type === "webgl") {
|
|
650
|
+
this.createTexture_n = this.createTexture_n_webgl1.bind(this);
|
|
651
|
+
this.createTexture_l = this.createTexture_l_webgl1.bind(this);
|
|
652
|
+
this.createTexture_mm = this.createTexture_mm_webgl1.bind(this);
|
|
653
|
+
this.createTexture_a = this.createTexture_a_webgl1.bind(this);
|
|
654
|
+
} else {
|
|
655
|
+
this.createTexture_n = this.createTexture_n_webgl2.bind(this);
|
|
656
|
+
this.createTexture_l = this.createTexture_l_webgl2.bind(this);
|
|
657
|
+
this.createTexture_mm = this.createTexture_mm_webgl2.bind(this);
|
|
658
|
+
this.createTexture_a = this.createTexture_a_webgl2.bind(this);
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
this.createTexture["NEAREST"] = this.createTexture_n;
|
|
662
|
+
this.createTexture["LINEAR"] = this.createTexture_l;
|
|
663
|
+
this.createTexture["MIPMAP"] = this.createTexture_mm;
|
|
664
|
+
this.createTexture["ANISOTROPIC"] = this.createTexture_a;
|
|
665
|
+
|
|
626
666
|
if (!this.extensions.EXT_texture_filter_anisotropic) {
|
|
627
|
-
this.
|
|
667
|
+
this.createTextureDefault = this.createTexture_mm;
|
|
668
|
+
} else {
|
|
669
|
+
this.createTextureDefault = this.createTexture_a;
|
|
628
670
|
}
|
|
629
671
|
|
|
630
672
|
/** Initilalize shaders and rendering parameters*/
|
|
@@ -804,24 +846,26 @@ class Handler {
|
|
|
804
846
|
* @param {number} h - Canvas height.
|
|
805
847
|
*/
|
|
806
848
|
setSize(w, h) {
|
|
807
|
-
if (w > MAX_SIZE) {
|
|
808
|
-
w = MAX_SIZE;
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
if (h > MAX_SIZE) {
|
|
812
|
-
h = MAX_SIZE;
|
|
813
|
-
}
|
|
814
|
-
|
|
815
849
|
this._params.width = w;
|
|
816
850
|
this._params.height = h;
|
|
817
|
-
this.canvas.width = w;
|
|
818
|
-
this.canvas.height = h;
|
|
819
|
-
|
|
851
|
+
this.canvas.width = w * this._params.pixelRatio;
|
|
852
|
+
this.canvas.height = h * this._params.pixelRatio;
|
|
853
|
+
|
|
854
|
+
this._oneByHeight = 1.0 / this.canvas.height;
|
|
820
855
|
|
|
821
856
|
this.gl && this.gl.viewport(0, 0, w, h);
|
|
822
857
|
this.onCanvasResize && this.onCanvasResize(this.canvas);
|
|
823
858
|
}
|
|
824
859
|
|
|
860
|
+
get pixelRatio() {
|
|
861
|
+
return this._params.pixelRatio;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
set pixelRatio(pr) {
|
|
865
|
+
this._params.pixelRatio = pr;
|
|
866
|
+
this.setSize(this._params.width, this._params.height);
|
|
867
|
+
}
|
|
868
|
+
|
|
825
869
|
/**
|
|
826
870
|
* Returns context screen width.
|
|
827
871
|
* @public
|
|
@@ -878,7 +922,8 @@ class Handler {
|
|
|
878
922
|
|
|
879
923
|
/** Canvas resize checking */
|
|
880
924
|
let canvas = this.canvas;
|
|
881
|
-
|
|
925
|
+
|
|
926
|
+
if (Math.floor(canvas.clientWidth * this._params.pixelRatio) !== canvas.width || Math.floor(canvas.clientHeight * this._params.pixelRatio) !== canvas.height) {
|
|
882
927
|
this.setSize(canvas.clientWidth, canvas.clientHeight);
|
|
883
928
|
}
|
|
884
929
|
|
|
@@ -938,7 +983,7 @@ class Handler {
|
|
|
938
983
|
if (params && params.color) {
|
|
939
984
|
imgCnv = new ImageCanvas(2, 2);
|
|
940
985
|
imgCnv.fillColor(params.color);
|
|
941
|
-
texture =
|
|
986
|
+
texture = this.createTexture_n_webgl2(imgCnv._canvas);
|
|
942
987
|
texture.default = true;
|
|
943
988
|
success(texture);
|
|
944
989
|
} else if (params && params.url) {
|
|
@@ -953,7 +998,7 @@ class Handler {
|
|
|
953
998
|
} else {
|
|
954
999
|
imgCnv = new ImageCanvas(2, 2);
|
|
955
1000
|
imgCnv.fillColor("#C5C5C5");
|
|
956
|
-
texture =
|
|
1001
|
+
texture = this.createTexture_n_webgl2(imgCnv._canvas);
|
|
957
1002
|
texture.default = true;
|
|
958
1003
|
success(texture);
|
|
959
1004
|
}
|
|
@@ -1052,11 +1097,4 @@ class Handler {
|
|
|
1052
1097
|
}
|
|
1053
1098
|
}
|
|
1054
1099
|
|
|
1055
|
-
export const createTexture = {
|
|
1056
|
-
NEAREST: Handler.createTexture_n,
|
|
1057
|
-
LINEAR: Handler.createTexture_l,
|
|
1058
|
-
MIPMAP: Handler.createTexture_mm,
|
|
1059
|
-
ANISOTROPIC: Handler.createTexture_a
|
|
1060
|
-
};
|
|
1061
|
-
|
|
1062
1100
|
export { Handler };
|