@openglobus/og 0.12.4 → 0.13.0

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 (93) hide show
  1. package/README.md +0 -2
  2. package/dist/@openglobus/og.esm.js +2 -2
  3. package/dist/@openglobus/og.esm.js.map +1 -1
  4. package/dist/@openglobus/og.umd.js +2 -2
  5. package/dist/@openglobus/og.umd.js.map +1 -1
  6. package/package.json +7 -7
  7. package/src/og/Extent.js +3 -3
  8. package/src/og/Globe.js +277 -275
  9. package/src/og/ImageCanvas.js +3 -3
  10. package/src/og/LonLat.js +9 -9
  11. package/src/og/QueueArray.js +2 -2
  12. package/src/og/Rectangle.js +5 -5
  13. package/src/og/bv/Box.js +1 -1
  14. package/src/og/bv/Sphere.js +2 -2
  15. package/src/og/camera/Camera.js +1 -1
  16. package/src/og/camera/PlanetCamera.js +649 -646
  17. package/src/og/control/LayerSwitcher.js +1 -1
  18. package/src/og/control/MouseNavigation.js +22 -13
  19. package/src/og/control/MouseWheelZoomControl.js +2 -2
  20. package/src/og/control/ScaleControl.js +1 -1
  21. package/src/og/control/TouchNavigation.js +319 -319
  22. package/src/og/control/ZoomControl.js +132 -132
  23. package/src/og/control/visibleExtent/Segment.js +12 -12
  24. package/src/og/ellipsoid/Ellipsoid.js +577 -567
  25. package/src/og/entity/BillboardHandler.js +878 -1051
  26. package/src/og/entity/Entity.js +1 -1
  27. package/src/og/entity/EntityCollection.js +847 -857
  28. package/src/og/entity/GeoObjectHandler.js +2 -2
  29. package/src/og/entity/LabelHandler.js +888 -1040
  30. package/src/og/entity/LabelWorker.js +0 -6
  31. package/src/og/entity/PointCloud.js +495 -495
  32. package/src/og/entity/Polyline.js +2218 -2222
  33. package/src/og/entity/RayHandler.js +1 -1
  34. package/src/og/layer/CanvasTiles.js +6 -3
  35. package/src/og/layer/GeoImage.js +1 -1
  36. package/src/og/layer/KML.js +5 -5
  37. package/src/og/layer/Layer.js +800 -752
  38. package/src/og/layer/Vector.js +997 -1010
  39. package/src/og/layer/XYZ.js +359 -357
  40. package/src/og/math/Line2.js +4 -4
  41. package/src/og/math/Quat.js +2 -2
  42. package/src/og/math/Ray.js +2 -2
  43. package/src/og/math/Vec2.js +524 -524
  44. package/src/og/math/Vec3.js +900 -900
  45. package/src/og/math/Vec4.js +261 -261
  46. package/src/og/math.js +397 -398
  47. package/src/og/quadTree/EntityCollectionNode.js +389 -387
  48. package/src/og/renderer/Renderer.js +14 -20
  49. package/src/og/renderer/RendererEvents.js +1034 -1045
  50. package/src/og/scene/Planet.js +12 -9
  51. package/src/og/scene/RenderNode.js +347 -354
  52. package/src/og/segment/Segment.js +3 -1
  53. package/src/og/segment/SegmentLonLat.js +1 -4
  54. package/src/og/shaders/billboard.js +220 -204
  55. package/src/og/shaders/drawnode.js +603 -603
  56. package/src/og/shaders/label.js +596 -456
  57. package/src/og/shaders/polyline.js +365 -361
  58. package/src/og/terrain/MapboxTerrain.js +1 -1
  59. package/src/og/utils/FontAtlas.js +209 -200
  60. package/src/og/utils/GeoImageCreator.js +4 -5
  61. package/src/og/utils/TextureAtlas.js +4 -4
  62. package/src/og/utils/VectorTileCreator.js +414 -414
  63. package/src/og/utils/shared.js +1 -1
  64. package/src/og/webgl/Handler.js +28 -60
  65. package/src/og/webgl/Multisample.js +260 -260
  66. package/src/og/webgl/Program.js +411 -396
  67. package/types/bv/Box.d.ts +1 -1
  68. package/types/bv/Sphere.d.ts +1 -1
  69. package/types/camera/PlanetCamera.d.ts +3 -3
  70. package/types/control/LayerSwitcher.d.ts +1 -1
  71. package/types/ellipsoid/Ellipsoid.d.ts +9 -2
  72. package/types/entity/BillboardHandler.d.ts +0 -4
  73. package/types/entity/EntityCollection.d.ts +0 -8
  74. package/types/entity/LabelHandler.d.ts +0 -2
  75. package/types/entity/Polyline.d.ts +1 -1
  76. package/types/layer/KML.d.ts +11 -11
  77. package/types/layer/Layer.d.ts +4 -0
  78. package/types/layer/Vector.d.ts +1 -8
  79. package/types/math/Line2.d.ts +4 -4
  80. package/types/math/Ray.d.ts +2 -2
  81. package/types/math/Vec2.d.ts +1 -1
  82. package/types/math/Vec3.d.ts +1 -1
  83. package/types/math/Vec4.d.ts +2 -2
  84. package/types/math.d.ts +1 -1
  85. package/types/renderer/Renderer.d.ts +1 -1
  86. package/types/renderer/RendererEvents.d.ts +1 -1
  87. package/types/shaders/label.d.ts +1 -1
  88. package/types/utils/FontAtlas.d.ts +3 -2
  89. package/types/utils/TextureAtlas.d.ts +3 -3
  90. package/types/utils/VectorTileCreator.d.ts +4 -4
  91. package/types/utils/shared.d.ts +1 -1
  92. package/types/webgl/Handler.d.ts +6 -31
  93. package/types/webgl/Program.d.ts +2 -0
@@ -1,396 +1,411 @@
1
- /**
2
- * @module og/webgl/Program
3
- */
4
-
5
- "use strict";
6
-
7
- import { callbacks } from "./callbacks.js";
8
- import { cons } from "../cons.js";
9
- import { typeStr, types } from "./types.js";
10
-
11
- const itemTypes = ["BYTE", "SHORT", "UNSIGNED_BYTE", "UNSIGNED_SHORT", "FLOAT", "HALF_FLOAT"];
12
-
13
- /**
14
- * Represents more comfortable using WebGL shader program.
15
- * @class
16
- * @param {string} name - Shader program name identificator.
17
- * @param {object} material - Object stores uniforms, attributes and program codes:
18
- * @param {object} material.uniforms - Uniforms definition section.
19
- * @param {object} material.attributes - Attributes definition section.
20
- * @param {string} material.vertexShader - Vertex glsl code.
21
- * @param {string} material.fragmentShader - Fragment glsl code.
22
- */
23
- class Program {
24
- constructor(name, material) {
25
- /**
26
- * Shader progarm name.
27
- * @public
28
- * @type {string}
29
- */
30
- this.name = name;
31
-
32
- this.attributes = {};
33
- this.uniforms = {};
34
-
35
- /**
36
- * Attributes.
37
- * @public
38
- * @type {Object}
39
- */
40
- this._attributes = {};
41
- for (let t in material.attributes) {
42
- if (
43
- typeof material.attributes[t] === "string" ||
44
- typeof material.attributes[t] === "number"
45
- ) {
46
- this._attributes[t] = { type: material.attributes[t] };
47
- } else {
48
- this._attributes[t] = material.attributes[t];
49
- }
50
- }
51
-
52
- /**
53
- * Uniforms.
54
- * @public
55
- * @type {Object}
56
- */
57
- this._uniforms = {};
58
- for (let t in material.uniforms) {
59
- if (
60
- typeof material.uniforms[t] === "string" ||
61
- typeof material.uniforms[t] === "number"
62
- ) {
63
- this._uniforms[t] = { type: material.uniforms[t] };
64
- } else {
65
- this._uniforms[t] = material.uniforms[t];
66
- }
67
- }
68
-
69
- /**
70
- * Vertex shader.
71
- * @public
72
- * @type {string}
73
- */
74
- this.vertexShader = material.vertexShader;
75
-
76
- /**
77
- * Fragment shader.
78
- * @public
79
- * @type {string}
80
- */
81
- this.fragmentShader = material.fragmentShader;
82
-
83
- /**
84
- * Webgl context.
85
- * @public
86
- * @type {Object}
87
- */
88
- this.gl = null;
89
-
90
- /**
91
- * All program variables.
92
- * @private
93
- * @type {Object}
94
- */
95
- this._variables = {};
96
-
97
- /**
98
- * Program pointer.
99
- * @private
100
- * @type {Object}
101
- */
102
- this._p = null;
103
-
104
- /**
105
- * Texture counter.
106
- * @prvate
107
- * @type {number}
108
- */
109
- this._textureID = 0;
110
-
111
- /**
112
- * Program attributes array.
113
- * @private
114
- * @type {Array.<Object>}
115
- */
116
- this._attribArrays = [];
117
-
118
- /**
119
- * Program attributes divisor.
120
- * @private
121
- * @type {Array.<Object>}
122
- */
123
- this._attribDivisor = [];
124
- }
125
-
126
- /**
127
- * Bind program buffer.
128
- * @function
129
- * @param {Program} program - Used program.
130
- * @param {Object} variable - Variable represents buffer data.
131
- */
132
- static bindBuffer(program, variable) {
133
- var gl = program.gl;
134
- gl.bindBuffer(gl.ARRAY_BUFFER, variable.value);
135
- gl.vertexAttribPointer(
136
- variable._pName,
137
- variable.value.itemSize,
138
- variable.itemType,
139
- variable.normalized,
140
- 0,
141
- 0
142
- );
143
- }
144
-
145
- /**
146
- * Sets the current program frame.
147
- * @public
148
- */
149
- use() {
150
- this.gl.useProgram(this._p);
151
- }
152
-
153
- /**
154
- * Sets program variables.
155
- * @public
156
- * @param {Object} material - Variables and values object.
157
- */
158
- set(material) {
159
- this._textureID = 0;
160
- for (var i in material) {
161
- this._variables[i].value = material[i];
162
- this._variables[i]._callback(this, this._variables[i]);
163
- }
164
- }
165
-
166
- /**
167
- * Apply current variables.
168
- * @public
169
- */
170
- apply() {
171
- this._textureID = 0;
172
- var v = this._variables;
173
- for (var i in v) {
174
- v[i]._callback(this, v[i]);
175
- }
176
- }
177
-
178
- /**
179
- * Calls drawElements index buffer function.
180
- * @public
181
- * @param {number} mode - Draw mode(GL_TRIANGLES, GL_LINESTRING etc.).
182
- * @param {Object} buffer - Index buffer.
183
- */
184
- drawIndexBuffer(mode, buffer) {
185
- this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, buffer);
186
- this.gl.drawElements(mode, buffer.numItems, this.gl.UNSIGNED_SHORT, 0);
187
- }
188
-
189
- /**
190
- * Calls drawArrays function.
191
- * @public
192
- * @param {number} mode - Draw mode(GL_TRIANGLES, GL_LINESTRING etc.).
193
- * @param {number} numItems - Curent binded buffer drawing items count.
194
- */
195
- drawArrays(mode, numItems) {
196
- this.gl.drawArrays(mode, 0, numItems);
197
- }
198
-
199
- /**
200
- * Check and log for an shader compile errors and warnings. Returns True - if no errors otherwise returns False.
201
- * @private
202
- * @param {Object} shader - WebGl shader program.
203
- * @param {string} src - Shader program source.
204
- * @returns {boolean} -
205
- */
206
- _getShaderCompileStatus(shader, src) {
207
- this.gl.shaderSource(shader, src);
208
- this.gl.compileShader(shader);
209
- if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {
210
- cons.logErr(
211
- "og/Program/Program:" + this.name + " - " + this.gl.getShaderInfoLog(shader) + "."
212
- );
213
- return false;
214
- }
215
- return true;
216
- }
217
-
218
- /**
219
- * Returns compiled vertex shader program pointer.
220
- * @private
221
- * @param {string} src - Vertex shader source code.
222
- * @returns {Object} -
223
- */
224
- _createVertexShader(src) {
225
- var shader = this.gl.createShader(this.gl.VERTEX_SHADER);
226
- if (!this._getShaderCompileStatus(shader, src)) {
227
- return null;
228
- }
229
- return shader;
230
- }
231
-
232
- /**
233
- * Returns compiled fragment shader program pointer.
234
- * @private
235
- * @param {string} src - Vertex shader source code.
236
- * @returns {Object} -
237
- */
238
- _createFragmentShader(src) {
239
- var shader = this.gl.createShader(this.gl.FRAGMENT_SHADER);
240
- if (!this._getShaderCompileStatus(shader, src)) {
241
- return null;
242
- }
243
- return shader;
244
- }
245
-
246
- /**
247
- * Disable current program vertexAttribArrays.
248
- * @public
249
- */
250
- disableAttribArrays() {
251
- var gl = this.gl;
252
- var a = this._attribArrays;
253
- for (let i = 0, len = a.length; i < len; i++) {
254
- gl.disableVertexAttribArray(a[i]);
255
- gl.vertexAttribDivisor(a[i], 0);
256
- }
257
- }
258
-
259
- /**
260
- * Enable current program vertexAttribArrays.
261
- * @public
262
- */
263
- enableAttribArrays() {
264
- var gl = this.gl;
265
- var a = this._attribArrays;
266
- var d = this._attribDivisor;
267
- for (let i = 0, len = a.length; i < len; i++) {
268
- gl.enableVertexAttribArray(a[i]);
269
- gl.vertexAttribDivisor(a[i], d[i]);
270
- }
271
- }
272
-
273
- /**
274
- * Delete program.
275
- * @public
276
- */
277
- delete() {
278
- this.gl.deleteProgram(this._p);
279
- }
280
-
281
- /**
282
- * Creates program.
283
- * @public
284
- * @param {Object} gl - WebGl context.
285
- */
286
- createProgram(gl) {
287
- this.gl = gl;
288
- this._p = this.gl.createProgram();
289
-
290
- var fs = this._createFragmentShader(this.fragmentShader);
291
- var vs = this._createVertexShader(this.vertexShader);
292
- gl.attachShader(this._p, fs);
293
- gl.attachShader(this._p, vs);
294
- gl.linkProgram(this._p);
295
-
296
- if (!gl.getProgramParameter(this._p, gl.LINK_STATUS)) {
297
- cons.logErr(
298
- "og/Program/Program:" +
299
- this.name +
300
- " - couldn't initialise shaders. " +
301
- gl.getProgramInfoLog(this._p) +
302
- "."
303
- );
304
- gl.deleteProgram(this._p);
305
- return;
306
- }
307
-
308
- this.use();
309
-
310
- for (var a in this._attributes) {
311
- //this.attributes[a]._name = a;
312
- this._variables[a] = this._attributes[a];
313
-
314
- this._attributes[a]._callback = Program.bindBuffer;
315
-
316
- let itemTypeStr = this._attributes[a].itemType
317
- ? this._attributes[a].itemType.trim().toUpperCase()
318
- : "FLOAT";
319
-
320
- if (itemTypes.indexOf(itemTypeStr) == -1) {
321
- cons.logErr(
322
- `og/Program/Program: ${this.name}- attribute '${a}', item type ${this._attributes[a].itemType} not exists.`
323
- );
324
- this._attributes[a].itemType = gl.FLOAT;
325
- } else {
326
- this._attributes[a].itemType = gl[itemTypeStr];
327
- }
328
-
329
- this._attributes[a].normalized = this._attributes[a].normalized || false;
330
- this._attributes[a].divisor = this._attributes[a].divisor || 0;
331
-
332
- this._p[a] = gl.getAttribLocation(this._p, a);
333
-
334
- if (this._p[a] == undefined) {
335
- cons.logErr(
336
- "og/Program/Program:" + this.name + " - attribute '" + a + "' is not exists."
337
- );
338
- gl.deleteProgram(this._p);
339
- return;
340
- }
341
-
342
- let type = this._attributes[a].type;
343
- if (typeof type === "string") {
344
- type = typeStr[type.trim().toLowerCase()];
345
- }
346
-
347
- let d = this._attributes[a].divisor;
348
- if (type === types.MAT4) {
349
- let loc = this._p[a];
350
- this._attribArrays.push(loc, loc + 1, loc + 2, loc + 3);
351
- this._attribDivisor.push(d, d, d, d);
352
- } else {
353
- this._attribArrays.push(this._p[a]);
354
- this._attribDivisor.push(d);
355
- }
356
-
357
- gl.enableVertexAttribArray(this._p[a]);
358
-
359
- this._attributes[a]._pName = this._p[a];
360
- this.attributes[a] = this._p[a];
361
- }
362
-
363
- for (var u in this._uniforms) {
364
- //this.uniforms[u]._name = u;
365
-
366
- if (typeof this._uniforms[u].type === "string") {
367
- this._uniforms[u]._callback =
368
- callbacks.u[typeStr[this._uniforms[u].type.trim().toLowerCase()]];
369
- } else {
370
- this._uniforms[u]._callback = callbacks.u[this._uniforms[u].type];
371
- }
372
-
373
- this._variables[u] = this._uniforms[u];
374
- this._p[u] = gl.getUniformLocation(this._p, u);
375
-
376
- if (this._p[u] == undefined) {
377
- cons.logErr(
378
- "og/Program/Program:" + this.name + " - uniform '" + u + "' is not exists."
379
- );
380
- gl.deleteProgram(this._p);
381
- return;
382
- }
383
-
384
- this._uniforms[u]._pName = this._p[u];
385
- this.uniforms[u] = this._p[u];
386
- }
387
-
388
- gl.detachShader(this._p, fs);
389
- gl.detachShader(this._p, vs);
390
-
391
- gl.deleteShader(fs);
392
- gl.deleteShader(vs);
393
- }
394
- }
395
-
396
- export { Program };
1
+ /**
2
+ * @module og/webgl/Program
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import { callbacks } from "./callbacks.js";
8
+ import { cons } from "../cons.js";
9
+ import { typeStr, types } from "./types.js";
10
+
11
+ const itemTypes = ["BYTE", "SHORT", "UNSIGNED_BYTE", "UNSIGNED_SHORT", "FLOAT", "HALF_FLOAT"];
12
+
13
+ /**
14
+ * Represents more comfortable using WebGL shader program.
15
+ * @class
16
+ * @param {string} name - Shader program name identificator.
17
+ * @param {object} material - Object stores uniforms, attributes and program codes:
18
+ * @param {object} material.uniforms - Uniforms definition section.
19
+ * @param {object} material.attributes - Attributes definition section.
20
+ * @param {string} material.vertexShader - Vertex glsl code.
21
+ * @param {string} material.fragmentShader - Fragment glsl code.
22
+ */
23
+ class Program {
24
+ constructor(name, material) {
25
+ /**
26
+ * Shader progarm name.
27
+ * @public
28
+ * @type {string}
29
+ */
30
+ this.name = name;
31
+
32
+ this.attributes = {};
33
+ this.uniforms = {};
34
+
35
+ /**
36
+ * Attributes.
37
+ * @public
38
+ * @type {Object}
39
+ */
40
+ this._attributes = {};
41
+ for (let t in material.attributes) {
42
+ if (
43
+ typeof material.attributes[t] === "string" ||
44
+ typeof material.attributes[t] === "number"
45
+ ) {
46
+ this._attributes[t] = { type: material.attributes[t] };
47
+ } else {
48
+ this._attributes[t] = material.attributes[t];
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Uniforms.
54
+ * @public
55
+ * @type {Object}
56
+ */
57
+ this._uniforms = {};
58
+ for (let t in material.uniforms) {
59
+ if (
60
+ typeof material.uniforms[t] === "string" ||
61
+ typeof material.uniforms[t] === "number"
62
+ ) {
63
+ this._uniforms[t] = { type: material.uniforms[t] };
64
+ } else {
65
+ this._uniforms[t] = material.uniforms[t];
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Vertex shader.
71
+ * @public
72
+ * @type {string}
73
+ */
74
+ this.vertexShader = material.vertexShader;
75
+
76
+ /**
77
+ * Fragment shader.
78
+ * @public
79
+ * @type {string}
80
+ */
81
+ this.fragmentShader = material.fragmentShader;
82
+
83
+ /**
84
+ * Webgl context.
85
+ * @public
86
+ * @type {Object}
87
+ */
88
+ this.gl = null;
89
+
90
+ /**
91
+ * All program variables.
92
+ * @private
93
+ * @type {Object}
94
+ */
95
+ this._variables = {};
96
+
97
+ /**
98
+ * Program pointer.
99
+ * @private
100
+ * @type {Object}
101
+ */
102
+ this._p = null;
103
+
104
+ /**
105
+ * Texture counter.
106
+ * @prvate
107
+ * @type {number}
108
+ */
109
+ this._textureID = 0;
110
+
111
+ /**
112
+ * Program attributes array.
113
+ * @private
114
+ * @type {Array.<Object>}
115
+ */
116
+ this._attribArrays = [];
117
+
118
+ /**
119
+ * Program attributes divisor.
120
+ * @private
121
+ * @type {Array.<Object>}
122
+ */
123
+ this._attribDivisor = [];
124
+
125
+ }
126
+
127
+ /**
128
+ * Bind program buffer.
129
+ * @function
130
+ * @param {Program} program - Used program.
131
+ * @param {Object} variable - Variable represents buffer data.
132
+ */
133
+ static bindBuffer(program, variable) {
134
+ var gl = program.gl;
135
+ gl.bindBuffer(gl.ARRAY_BUFFER, variable.value);
136
+ gl.vertexAttribPointer(
137
+ variable._pName,
138
+ variable.value.itemSize,
139
+ variable.itemType,
140
+ variable.normalized,
141
+ 0,
142
+ 0
143
+ );
144
+ }
145
+
146
+ /**
147
+ * Sets the current program frame.
148
+ * @public
149
+ */
150
+ use() {
151
+ this.gl.useProgram(this._p);
152
+ }
153
+
154
+ /**
155
+ * Sets program variables.
156
+ * @public
157
+ * @param {Object} material - Variables and values object.
158
+ */
159
+ set(material) {
160
+ this._textureID = 0;
161
+ for (var i in material) {
162
+ this._variables[i].value = material[i];
163
+ this._variables[i]._callback(this, this._variables[i]);
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Apply current variables.
169
+ * @public
170
+ */
171
+ apply() {
172
+ this._textureID = 0;
173
+ var v = this._variables;
174
+ for (var i in v) {
175
+ v[i]._callback(this, v[i]);
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Calls drawElements index buffer function.
181
+ * @public
182
+ * @param {number} mode - Draw mode(GL_TRIANGLES, GL_LINESTRING etc.).
183
+ * @param {Object} buffer - Index buffer.
184
+ */
185
+ drawIndexBuffer(mode, buffer) {
186
+ this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, buffer);
187
+ this.gl.drawElements(mode, buffer.numItems, this.gl.UNSIGNED_SHORT, 0);
188
+ }
189
+
190
+ /**
191
+ * Calls drawArrays function.
192
+ * @public
193
+ * @param {number} mode - Draw mode(GL_TRIANGLES, GL_LINESTRING etc.).
194
+ * @param {number} numItems - Curent binded buffer drawing items count.
195
+ */
196
+ drawArrays(mode, numItems) {
197
+ this.gl.drawArrays(mode, 0, numItems);
198
+ }
199
+
200
+ /**
201
+ * Check and log for an shader compile errors and warnings. Returns True - if no errors otherwise returns False.
202
+ * @private
203
+ * @param {Object} shader - WebGl shader program.
204
+ * @param {string} src - Shader program source.
205
+ * @returns {boolean} -
206
+ */
207
+ _getShaderCompileStatus(shader, src) {
208
+ this.gl.shaderSource(shader, src);
209
+ this.gl.compileShader(shader);
210
+ if (!this.gl.getShaderParameter(shader, this.gl.COMPILE_STATUS)) {
211
+ cons.logErr(
212
+ "og/Program/Program:" + this.name + " - " + this.gl.getShaderInfoLog(shader) + "."
213
+ );
214
+ return false;
215
+ }
216
+ return true;
217
+ }
218
+
219
+ /**
220
+ * Returns compiled vertex shader program pointer.
221
+ * @private
222
+ * @param {string} src - Vertex shader source code.
223
+ * @returns {Object} -
224
+ */
225
+ _createVertexShader(src) {
226
+ var shader = this.gl.createShader(this.gl.VERTEX_SHADER);
227
+ if (!this._getShaderCompileStatus(shader, src)) {
228
+ return null;
229
+ }
230
+ return shader;
231
+ }
232
+
233
+ /**
234
+ * Returns compiled fragment shader program pointer.
235
+ * @private
236
+ * @param {string} src - Vertex shader source code.
237
+ * @returns {Object} -
238
+ */
239
+ _createFragmentShader(src) {
240
+ var shader = this.gl.createShader(this.gl.FRAGMENT_SHADER);
241
+ if (!this._getShaderCompileStatus(shader, src)) {
242
+ return null;
243
+ }
244
+ return shader;
245
+ }
246
+
247
+ /**
248
+ * Disable current program vertexAttribArrays.
249
+ * @public
250
+ */
251
+ disableAttribArrays() {
252
+ var gl = this.gl;
253
+ var a = this._attribArrays;
254
+ for (let i = 0, len = a.length; i < len; i++) {
255
+ gl.disableVertexAttribArray(a[i]);
256
+ this.vertexAttribDivisor(a[i], 0);
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Enable current program vertexAttribArrays.
262
+ * @public
263
+ */
264
+ enableAttribArrays() {
265
+ var gl = this.gl;
266
+ var a = this._attribArrays;
267
+ var d = this._attribDivisor;
268
+ for (let i = 0, len = a.length; i < len; i++) {
269
+ gl.enableVertexAttribArray(a[i]);
270
+ this.vertexAttribDivisor(a[i], d[i]);
271
+ }
272
+ }
273
+
274
+ vertexAttribDivisor(index, divisor) {
275
+ const gl = this.gl;
276
+ gl.vertexAttribDivisor ? gl.vertexAttribDivisor(index, divisor) : gl.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(index, divisor);
277
+ }
278
+
279
+ /**
280
+ * Delete program.
281
+ * @public
282
+ */
283
+ delete() {
284
+ this.gl.deleteProgram(this._p);
285
+ }
286
+
287
+ /**
288
+ * Creates program.
289
+ * @public
290
+ * @param {Object} gl - WebGl context.
291
+ */
292
+ createProgram(gl) {
293
+ this.gl = gl;
294
+ this._p = this.gl.createProgram();
295
+
296
+ var fs = this._createFragmentShader(this.fragmentShader);
297
+ var vs = this._createVertexShader(this.vertexShader);
298
+ gl.attachShader(this._p, fs);
299
+ gl.attachShader(this._p, vs);
300
+ gl.linkProgram(this._p);
301
+
302
+ if (!this.drawElementsInstanced) {
303
+ this.drawElementsInstanced = gl.drawElementsInstanced ? gl.drawElementsInstanced.bind(gl) : gl.getExtension('ANGLE_instanced_arrays').drawElementsInstancedANGLE.bind(gl.getExtension('ANGLE_instanced_arrays'));
304
+ }
305
+
306
+ if (!this.vertexAttribDivisor) {
307
+ this.vertexAttribDivisor = gl.vertexAttribDivisor ? gl.vertexAttribDivisor.bind(gl) : gl.getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE.bind(gl.getExtension('ANGLE_instanced_arrays'));
308
+ }
309
+
310
+
311
+ if (!gl.getProgramParameter(this._p, gl.LINK_STATUS)) {
312
+ cons.logErr(
313
+ "og/Program/Program:" +
314
+ this.name +
315
+ " - couldn't initialise shaders. " +
316
+ gl.getProgramInfoLog(this._p) +
317
+ "."
318
+ );
319
+ gl.deleteProgram(this._p);
320
+ return;
321
+ }
322
+
323
+ this.use();
324
+
325
+ for (var a in this._attributes) {
326
+ //this.attributes[a]._name = a;
327
+ this._variables[a] = this._attributes[a];
328
+
329
+ this._attributes[a]._callback = Program.bindBuffer;
330
+
331
+ let itemTypeStr = this._attributes[a].itemType
332
+ ? this._attributes[a].itemType.trim().toUpperCase()
333
+ : "FLOAT";
334
+
335
+ if (itemTypes.indexOf(itemTypeStr) == -1) {
336
+ cons.logErr(
337
+ `og/Program/Program: ${this.name}- attribute '${a}', item type ${this._attributes[a].itemType} not exists.`
338
+ );
339
+ this._attributes[a].itemType = gl.FLOAT;
340
+ } else {
341
+ this._attributes[a].itemType = gl[itemTypeStr];
342
+ }
343
+
344
+ this._attributes[a].normalized = this._attributes[a].normalized || false;
345
+ this._attributes[a].divisor = this._attributes[a].divisor || 0;
346
+
347
+ this._p[a] = gl.getAttribLocation(this._p, a);
348
+
349
+ if (this._p[a] == undefined) {
350
+ cons.logErr(
351
+ "og/Program/Program:" + this.name + " - attribute '" + a + "' is not exists."
352
+ );
353
+ gl.deleteProgram(this._p);
354
+ return;
355
+ }
356
+
357
+ let type = this._attributes[a].type;
358
+ if (typeof type === "string") {
359
+ type = typeStr[type.trim().toLowerCase()];
360
+ }
361
+
362
+ let d = this._attributes[a].divisor;
363
+ if (type === types.MAT4) {
364
+ let loc = this._p[a];
365
+ this._attribArrays.push(loc, loc + 1, loc + 2, loc + 3);
366
+ this._attribDivisor.push(d, d, d, d);
367
+ } else {
368
+ this._attribArrays.push(this._p[a]);
369
+ this._attribDivisor.push(d);
370
+ }
371
+
372
+ gl.enableVertexAttribArray(this._p[a]);
373
+
374
+ this._attributes[a]._pName = this._p[a];
375
+ this.attributes[a] = this._p[a];
376
+ }
377
+
378
+ for (var u in this._uniforms) {
379
+ //this.uniforms[u]._name = u;
380
+
381
+ if (typeof this._uniforms[u].type === "string") {
382
+ this._uniforms[u]._callback =
383
+ callbacks.u[typeStr[this._uniforms[u].type.trim().toLowerCase()]];
384
+ } else {
385
+ this._uniforms[u]._callback = callbacks.u[this._uniforms[u].type];
386
+ }
387
+
388
+ this._variables[u] = this._uniforms[u];
389
+ this._p[u] = gl.getUniformLocation(this._p, u);
390
+
391
+ if (this._p[u] == undefined) {
392
+ cons.logErr(
393
+ "og/Program/Program:" + this.name + " - uniform '" + u + "' is not exists."
394
+ );
395
+ gl.deleteProgram(this._p);
396
+ return;
397
+ }
398
+
399
+ this._uniforms[u]._pName = this._p[u];
400
+ this.uniforms[u] = this._p[u];
401
+ }
402
+
403
+ gl.detachShader(this._p, fs);
404
+ gl.detachShader(this._p, vs);
405
+
406
+ gl.deleteShader(fs);
407
+ gl.deleteShader(vs);
408
+ }
409
+ }
410
+
411
+ export { Program };