@openglobus/og 0.12.1 → 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 (230) hide show
  1. package/README.md +0 -2
  2. package/dist/@openglobus/og.css +1 -0
  3. package/dist/@openglobus/og.esm.js +21 -0
  4. package/dist/@openglobus/og.esm.js.map +1 -0
  5. package/dist/@openglobus/og.umd.js +21 -0
  6. package/dist/@openglobus/og.umd.js.map +1 -0
  7. package/package.json +8 -8
  8. package/src/og/Extent.js +3 -3
  9. package/src/og/Globe.js +277 -275
  10. package/src/og/ImageCanvas.js +3 -3
  11. package/src/og/LonLat.js +9 -9
  12. package/src/og/QueueArray.js +2 -2
  13. package/src/og/Rectangle.js +5 -5
  14. package/src/og/bv/Box.js +1 -1
  15. package/src/og/bv/Sphere.js +2 -2
  16. package/src/og/camera/Camera.js +1 -1
  17. package/src/og/camera/PlanetCamera.js +649 -646
  18. package/src/og/control/LayerSwitcher.js +1 -1
  19. package/src/og/control/MouseNavigation.js +22 -13
  20. package/src/og/control/MouseWheelZoomControl.js +2 -2
  21. package/src/og/control/ScaleControl.js +1 -1
  22. package/src/og/control/TouchNavigation.js +319 -319
  23. package/src/og/control/ZoomControl.js +132 -132
  24. package/src/og/control/visibleExtent/Segment.js +12 -12
  25. package/src/og/ellipsoid/Ellipsoid.js +577 -567
  26. package/src/og/entity/BillboardHandler.js +878 -1051
  27. package/src/og/entity/Entity.js +1 -1
  28. package/src/og/entity/EntityCollection.js +847 -857
  29. package/src/og/entity/GeoObjectHandler.js +37 -18
  30. package/src/og/entity/LabelHandler.js +888 -1040
  31. package/src/og/entity/LabelWorker.js +0 -6
  32. package/src/og/entity/PointCloud.js +495 -495
  33. package/src/og/entity/Polyline.js +2218 -2222
  34. package/src/og/entity/RayHandler.js +1 -1
  35. package/src/og/layer/CanvasTiles.js +6 -3
  36. package/src/og/layer/GeoImage.js +1 -1
  37. package/src/og/layer/KML.js +24 -17
  38. package/src/og/layer/Layer.js +806 -751
  39. package/src/og/layer/Vector.js +997 -1010
  40. package/src/og/layer/XYZ.js +359 -357
  41. package/src/og/math/Line2.js +4 -4
  42. package/src/og/math/Quat.js +2 -2
  43. package/src/og/math/Ray.js +2 -2
  44. package/src/og/math/Vec2.js +524 -524
  45. package/src/og/math/Vec3.js +900 -900
  46. package/src/og/math/Vec4.js +261 -261
  47. package/src/og/math.js +397 -398
  48. package/src/og/quadTree/EntityCollectionNode.js +389 -387
  49. package/src/og/renderer/Renderer.js +14 -20
  50. package/src/og/renderer/RendererEvents.js +1034 -1045
  51. package/src/og/scene/Planet.js +26 -23
  52. package/src/og/scene/RenderNode.js +347 -354
  53. package/src/og/segment/Segment.js +3 -1
  54. package/src/og/segment/SegmentLonLat.js +1 -4
  55. package/src/og/shaders/billboard.js +220 -204
  56. package/src/og/shaders/drawnode.js +603 -603
  57. package/src/og/shaders/geoObject.js +15 -6
  58. package/src/og/shaders/label.js +596 -456
  59. package/src/og/shaders/polyline.js +365 -361
  60. package/src/og/terrain/MapboxTerrain.js +1 -1
  61. package/src/og/utils/FontAtlas.js +209 -200
  62. package/src/og/utils/GeoImageCreator.js +4 -5
  63. package/src/og/utils/TextureAtlas.js +4 -4
  64. package/src/og/utils/VectorTileCreator.js +414 -414
  65. package/src/og/utils/shared.js +1 -1
  66. package/src/og/webgl/Handler.js +28 -60
  67. package/src/og/webgl/Multisample.js +260 -260
  68. package/src/og/webgl/Program.js +411 -396
  69. package/types/Clock.d.ts +94 -0
  70. package/types/Deferred.d.ts +6 -0
  71. package/types/Events.d.ts +77 -0
  72. package/types/Extent.d.ts +166 -0
  73. package/types/Globe.d.ts +85 -0
  74. package/types/ImageCanvas.d.ts +123 -0
  75. package/types/Lock.d.ts +12 -0
  76. package/types/LonLat.d.ts +108 -0
  77. package/types/Popup.d.ts +42 -0
  78. package/types/QueueArray.d.ts +19 -0
  79. package/types/Rectangle.d.ts +80 -0
  80. package/types/Stack.d.ts +19 -0
  81. package/types/ajax.d.ts +24 -0
  82. package/types/arial.d.ts +48 -0
  83. package/types/astro/astro.d.ts +38 -0
  84. package/types/astro/earth.d.ts +7 -0
  85. package/types/astro/jd.d.ts +254 -0
  86. package/types/bv/Box.d.ts +30 -0
  87. package/types/bv/Sphere.d.ts +38 -0
  88. package/types/bv/index.d.ts +3 -0
  89. package/types/camera/Camera.d.ts +312 -0
  90. package/types/camera/Frustum.d.ts +133 -0
  91. package/types/camera/PlanetCamera.d.ts +219 -0
  92. package/types/camera/index.d.ts +3 -0
  93. package/types/cons.d.ts +40 -0
  94. package/types/control/CompassButton.d.ts +17 -0
  95. package/types/control/Control.d.ts +104 -0
  96. package/types/control/DebugInfo.d.ts +15 -0
  97. package/types/control/EarthCoordinates.d.ts +47 -0
  98. package/types/control/EarthNavigation.d.ts +43 -0
  99. package/types/control/GeoImageDragControl.d.ts +6 -0
  100. package/types/control/KeyboardNavigation.d.ts +21 -0
  101. package/types/control/LayerSwitcher.d.ts +21 -0
  102. package/types/control/Lighting.d.ts +16 -0
  103. package/types/control/MouseNavigation.d.ts +48 -0
  104. package/types/control/MouseWheelZoomControl.d.ts +45 -0
  105. package/types/control/ScaleControl.d.ts +22 -0
  106. package/types/control/ShowFps.d.ts +11 -0
  107. package/types/control/SimpleNavigation.d.ts +25 -0
  108. package/types/control/Sun.d.ts +50 -0
  109. package/types/control/ToggleWireframe.d.ts +12 -0
  110. package/types/control/TouchNavigation.d.ts +48 -0
  111. package/types/control/ZoomControl.d.ts +27 -0
  112. package/types/control/index.d.ts +18 -0
  113. package/types/ellipsoid/Ellipsoid.d.ts +153 -0
  114. package/types/ellipsoid/index.d.ts +3 -0
  115. package/types/ellipsoid/wgs84.d.ts +6 -0
  116. package/types/entity/BaseBillboard.d.ts +215 -0
  117. package/types/entity/Billboard.d.ts +94 -0
  118. package/types/entity/BillboardHandler.d.ts +75 -0
  119. package/types/entity/Entity.d.ts +348 -0
  120. package/types/entity/EntityCollection.d.ts +309 -0
  121. package/types/entity/GeoObject.d.ts +111 -0
  122. package/types/entity/GeoObjectHandler.d.ts +81 -0
  123. package/types/entity/Geometry.d.ts +74 -0
  124. package/types/entity/GeometryHandler.d.ts +76 -0
  125. package/types/entity/Label.d.ts +189 -0
  126. package/types/entity/LabelHandler.d.ts +29 -0
  127. package/types/entity/LabelWorker.d.ts +11 -0
  128. package/types/entity/PointCloud.d.ts +174 -0
  129. package/types/entity/PointCloudHandler.d.ts +38 -0
  130. package/types/entity/Polyline.d.ts +306 -0
  131. package/types/entity/PolylineHandler.d.ts +18 -0
  132. package/types/entity/Ray.d.ts +124 -0
  133. package/types/entity/RayHandler.d.ts +67 -0
  134. package/types/entity/ShapeHandler.d.ts +22 -0
  135. package/types/entity/Strip.d.ts +119 -0
  136. package/types/entity/StripHandler.d.ts +38 -0
  137. package/types/entity/index.d.ts +8 -0
  138. package/types/index.core.d.ts +65 -0
  139. package/types/index.d.ts +45 -0
  140. package/types/index.webgl.d.ts +7 -0
  141. package/types/input/KeyboardHandler.d.ts +10 -0
  142. package/types/input/MouseHandler.d.ts +5 -0
  143. package/types/input/TouchHandler.d.ts +5 -0
  144. package/types/input/input.d.ts +34 -0
  145. package/types/layer/BaseGeoImage.d.ts +94 -0
  146. package/types/layer/CanvasTiles.d.ts +67 -0
  147. package/types/layer/GeoImage.d.ts +52 -0
  148. package/types/layer/GeoTexture2d.d.ts +8 -0
  149. package/types/layer/GeoVideo.d.ts +55 -0
  150. package/types/layer/KML.d.ts +68 -0
  151. package/types/layer/Layer.d.ts +315 -0
  152. package/types/layer/Material.d.ts +45 -0
  153. package/types/layer/Vector.d.ts +201 -0
  154. package/types/layer/WMS.d.ts +61 -0
  155. package/types/layer/XYZ.d.ts +119 -0
  156. package/types/layer/index.d.ts +10 -0
  157. package/types/light/LightSource.d.ts +178 -0
  158. package/types/math/Line2.d.ts +11 -0
  159. package/types/math/Line3.d.ts +10 -0
  160. package/types/math/Mat3.d.ts +65 -0
  161. package/types/math/Mat4.d.ts +176 -0
  162. package/types/math/Plane.d.ts +18 -0
  163. package/types/math/Quat.d.ts +379 -0
  164. package/types/math/Ray.d.ts +82 -0
  165. package/types/math/Vec2.d.ts +309 -0
  166. package/types/math/Vec3.d.ts +467 -0
  167. package/types/math/Vec4.d.ts +162 -0
  168. package/types/math/coder.d.ts +43 -0
  169. package/types/math/index.d.ts +11 -0
  170. package/types/math.d.ts +261 -0
  171. package/types/mercator.d.ts +92 -0
  172. package/types/proj/EPSG3857.d.ts +6 -0
  173. package/types/proj/EPSG4326.d.ts +6 -0
  174. package/types/proj/Proj.d.ts +42 -0
  175. package/types/quadTree/EntityCollectionNode.d.ts +34 -0
  176. package/types/quadTree/Node.d.ts +60 -0
  177. package/types/quadTree/quadTree.d.ts +40 -0
  178. package/types/renderer/Renderer.d.ts +290 -0
  179. package/types/renderer/RendererEvents.d.ts +237 -0
  180. package/types/res/images.d.ts +3 -0
  181. package/types/scene/Axes.d.ts +11 -0
  182. package/types/scene/BaseNode.d.ts +60 -0
  183. package/types/scene/Planet.d.ts +576 -0
  184. package/types/scene/RenderNode.d.ts +142 -0
  185. package/types/scene/SkyBox.d.ts +10 -0
  186. package/types/scene/index.d.ts +4 -0
  187. package/types/segment/Segment.d.ts +275 -0
  188. package/types/segment/SegmentLonLat.d.ts +17 -0
  189. package/types/segment/Slice.d.ts +10 -0
  190. package/types/segment/segmentHelper.d.ts +13 -0
  191. package/types/shaders/billboard.d.ts +3 -0
  192. package/types/shaders/depth.d.ts +2 -0
  193. package/types/shaders/drawnode.d.ts +7 -0
  194. package/types/shaders/geoObject.d.ts +3 -0
  195. package/types/shaders/label.d.ts +4 -0
  196. package/types/shaders/pointCloud.d.ts +2 -0
  197. package/types/shaders/polyline.d.ts +3 -0
  198. package/types/shaders/ray.d.ts +2 -0
  199. package/types/shaders/screenFrame.d.ts +2 -0
  200. package/types/shaders/shape.d.ts +4 -0
  201. package/types/shaders/skybox.d.ts +2 -0
  202. package/types/shaders/toneMapping.d.ts +2 -0
  203. package/types/shapes/BaseShape.d.ts +250 -0
  204. package/types/shapes/Sphere.d.ts +41 -0
  205. package/types/terrain/BilTerrain.d.ts +7 -0
  206. package/types/terrain/EmptyTerrain.d.ts +73 -0
  207. package/types/terrain/Geoid.d.ts +26 -0
  208. package/types/terrain/GlobusTerrain.d.ts +116 -0
  209. package/types/terrain/MapboxTerrain.d.ts +7 -0
  210. package/types/terrain/index.d.ts +5 -0
  211. package/types/utils/FontAtlas.d.ts +16 -0
  212. package/types/utils/GeoImageCreator.d.ts +30 -0
  213. package/types/utils/ImagesCacheManager.d.ts +10 -0
  214. package/types/utils/Loader.d.ts +25 -0
  215. package/types/utils/NormalMapCreator.d.ts +39 -0
  216. package/types/utils/PlainSegmentWorker.d.ts +10 -0
  217. package/types/utils/TerrainWorker.d.ts +9 -0
  218. package/types/utils/TextureAtlas.d.ts +111 -0
  219. package/types/utils/VectorTileCreator.d.ts +16 -0
  220. package/types/utils/colorTable.d.ts +143 -0
  221. package/types/utils/earcut.d.ts +6 -0
  222. package/types/utils/shared.d.ts +231 -0
  223. package/types/webgl/Framebuffer.d.ts +135 -0
  224. package/types/webgl/Handler.d.ts +392 -0
  225. package/types/webgl/Multisample.d.ts +89 -0
  226. package/types/webgl/Program.d.ts +163 -0
  227. package/types/webgl/ProgramController.d.ts +89 -0
  228. package/types/webgl/callbacks.d.ts +1 -0
  229. package/types/webgl/index.d.ts +6 -0
  230. package/types/webgl/types.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 };