@pirireis/webglobeplugins 0.17.0 → 1.0.2

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 (274) hide show
  1. package/Math/{angle-calculation.js → angle-calculation.ts} +18 -14
  2. package/Math/{arc-cdf-points.js → arc-cdf-points.ts} +329 -272
  3. package/Math/{arc-generate-points-exponantial.js → arc-generate-points-exponantial.ts} +299 -254
  4. package/Math/{arc.js → arc.ts} +421 -292
  5. package/Math/bounds/line-bbox.js +225 -186
  6. package/Math/{circle-cdf-points.js → circle-cdf-points.ts} +143 -78
  7. package/Math/{circle.js → circle.ts} +49 -33
  8. package/Math/{constants.js → constants.ts} +12 -4
  9. package/Math/contour/{quadtreecontours.js → quadtreecontours.ts} +371 -300
  10. package/Math/contour/quadtreecontours1.js +336 -298
  11. package/Math/{finite-line-2d.js → finite-line-2d.ts} +68 -58
  12. package/Math/haversine.ts +33 -0
  13. package/Math/index.js +0 -1
  14. package/Math/juction/{arc-plane.js → arc-plane.ts} +203 -143
  15. package/Math/juction/{line-sphere.js → line-sphere.ts} +32 -22
  16. package/Math/juction/{plane-plane.js → plane-plane.ts} +62 -53
  17. package/Math/{line.js → line.ts} +84 -52
  18. package/Math/matrix4.ts +0 -0
  19. package/Math/mesh/mapbox-delaunay.d.ts +74 -0
  20. package/Math/{methods.js → methods.ts} +182 -107
  21. package/Math/{plane.js → plane.ts} +92 -56
  22. package/Math/{quaternion.js → quaternion.ts} +128 -106
  23. package/Math/roadmap.md +10 -0
  24. package/Math/templete-shapes/{grid-visually-equal.js → grid-visually-equal.ts} +118 -65
  25. package/Math/tessellation/constants.ts +1 -0
  26. package/Math/tessellation/methods.ts +79 -0
  27. package/Math/tessellation/nearest-value-padding.ts +147 -0
  28. package/Math/tessellation/roadmap.md +48 -0
  29. package/Math/tessellation/spherical-triangle-area.ts +127 -0
  30. package/Math/tessellation/tile-merger.ts +578 -0
  31. package/Math/tessellation/triangle-tessellation.ts +533 -0
  32. package/Math/tessellation/types.ts +1 -0
  33. package/Math/types.ts +68 -0
  34. package/Math/utils.js +3 -2
  35. package/Math/{vec3.js → vec3.ts} +227 -151
  36. package/Math/xyz-tile.ts +26 -0
  37. package/algorithms/search-binary.js +14 -16
  38. package/altitude-locator/adaptors.js +0 -1
  39. package/altitude-locator/keymethod.js +0 -1
  40. package/altitude-locator/plugin.js +445 -345
  41. package/altitude-locator/types.js +26 -21
  42. package/compass-rose/compass-rose-padding-flat.js +274 -230
  43. package/compass-rose/{compass-text-writer.js → compass-text-writer.ts} +210 -155
  44. package/compass-rose/index.js +3 -3
  45. package/{constants.js → constants.ts} +8 -6
  46. package/heatwave/datamanager.js +168 -149
  47. package/heatwave/heatwave.js +261 -206
  48. package/heatwave/index.js +5 -5
  49. package/heatwave/isobar.js +340 -303
  50. package/heatwave/{texture-point-sampler.js → texture-point-sampler.ts} +220 -187
  51. package/investigation-tools/draw/tiles/adapters.ts +133 -0
  52. package/investigation-tools/draw/tiles/tiles.ts +162 -0
  53. package/jest.config.js +6 -7
  54. package/package.json +1 -1
  55. package/pin/pin-object-array1.js +381 -300
  56. package/pin/pin-point-totem1.js +77 -60
  57. package/programs/arrowfield/arrow-field.js +89 -60
  58. package/programs/arrowfield/logic.js +173 -141
  59. package/programs/data2legend/density-to-legend.js +86 -68
  60. package/programs/data2legend/point-to-density-texture.js +84 -67
  61. package/programs/float2legendwithratio/index.js +3 -2
  62. package/programs/float2legendwithratio/logic.js +144 -118
  63. package/programs/float2legendwithratio/object.js +141 -104
  64. package/programs/helpers/blender.js +73 -58
  65. package/programs/helpers/{fadeaway.js → fadeaway.ts} +73 -55
  66. package/programs/index.js +19 -20
  67. package/programs/line-on-globe/circle-accurate-3d.js +112 -85
  68. package/programs/line-on-globe/circle-accurate-flat.js +200 -148
  69. package/programs/line-on-globe/degree-padding-around-circle-3d.js +134 -102
  70. package/programs/line-on-globe/index.js +0 -1
  71. package/programs/line-on-globe/lines-color-instanced-flat.js +99 -80
  72. package/programs/line-on-globe/linestrip/data.ts +29 -0
  73. package/programs/line-on-globe/linestrip/{linestrip.js → linestrip.ts} +152 -93
  74. package/programs/line-on-globe/{naive-accurate-flexible.js → naive-accurate-flexible.ts} +175 -126
  75. package/programs/line-on-globe/util.js +8 -5
  76. package/programs/picking/pickable-polygon-renderer.js +129 -98
  77. package/programs/picking/pickable-renderer.js +130 -98
  78. package/programs/point-on-globe/element-globe-surface-glow.js +122 -93
  79. package/programs/point-on-globe/element-point-glow.js +114 -80
  80. package/programs/point-on-globe/square-pixel-point.js +139 -120
  81. package/programs/polygon-on-globe/roadmap.md +8 -0
  82. package/programs/polygon-on-globe/texture-dem-triangles.ts +290 -0
  83. package/programs/{programcache.js → programcache.ts} +134 -126
  84. package/programs/rings/index.js +1 -1
  85. package/programs/rings/partial-ring/{piece-of-pie.js → piece-of-pie.ts} +222 -152
  86. package/programs/totems/camera-totem-attactment-interface.ts +4 -0
  87. package/programs/totems/{camerauniformblock.js → camerauniformblock.ts} +326 -230
  88. package/programs/totems/{canvas-webglobe-info.js → canvas-webglobe-info.ts} +147 -132
  89. package/programs/totems/dem-textures-manager.ts +368 -0
  90. package/programs/totems/{globe-changes.js → globe-changes.ts} +79 -59
  91. package/programs/totems/gpu-selection-uniform-block.js +127 -99
  92. package/programs/totems/{index.js → index.ts} +2 -2
  93. package/programs/two-d/pixel-padding-for-compass.js +101 -87
  94. package/programs/util.js +19 -14
  95. package/programs/vectorfields/logics/{constants.js → constants.ts} +5 -4
  96. package/programs/vectorfields/logics/drawrectangleparticles.ts +182 -0
  97. package/programs/vectorfields/logics/index.js +4 -2
  98. package/programs/vectorfields/logics/particle-ubo.ts +23 -0
  99. package/programs/vectorfields/logics/{pixelbased.js → pixelbased.ts} +119 -84
  100. package/programs/vectorfields/logics/ubo.js +57 -51
  101. package/programs/vectorfields/{pingpongbuffermanager.js → pingpongbuffermanager.ts} +113 -73
  102. package/publish.bat +62 -0
  103. package/range-tools-on-terrain/bearing-line/{adapters.js → adapters.ts} +154 -114
  104. package/range-tools-on-terrain/bearing-line/{plugin.js → plugin.ts} +569 -457
  105. package/range-tools-on-terrain/bearing-line/types.ts +65 -0
  106. package/range-tools-on-terrain/circle-line-chain/{adapters.js → adapters.ts} +104 -85
  107. package/range-tools-on-terrain/circle-line-chain/{chain-list-map.js → chain-list-map.ts} +446 -382
  108. package/range-tools-on-terrain/circle-line-chain/{plugin.js → plugin.ts} +607 -464
  109. package/range-tools-on-terrain/circle-line-chain/types.ts +43 -0
  110. package/range-tools-on-terrain/range-ring/{adapters.js → adapters.ts} +114 -93
  111. package/range-tools-on-terrain/range-ring/{enum.js → enum.ts} +2 -2
  112. package/range-tools-on-terrain/range-ring/{plugin.js → plugin.ts} +444 -377
  113. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +396 -0
  114. package/range-tools-on-terrain/range-ring/types.ts +30 -0
  115. package/semiplugins/interface.ts +14 -0
  116. package/semiplugins/lightweight/{line-plugin.js → line-plugin.ts} +342 -221
  117. package/semiplugins/lightweight/{piece-of-pie-plugin.js → piece-of-pie-plugin.ts} +275 -200
  118. package/semiplugins/shape-on-terrain/{arc-plugin.js → arc-plugin.ts} +616 -472
  119. package/semiplugins/shape-on-terrain/{circle-plugin.js → circle-plugin.ts} +588 -444
  120. package/semiplugins/shape-on-terrain/goal.md +12 -0
  121. package/semiplugins/shape-on-terrain/{padding-1-degree.js → padding-1-degree.ts} +713 -539
  122. package/semiplugins/shape-on-terrain/terrain-polygon/adapters.ts +69 -0
  123. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +20 -0
  124. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache.ts +149 -0
  125. package/semiplugins/shape-on-terrain/terrain-polygon/data/index-polygon-map.ts +58 -0
  126. package/semiplugins/shape-on-terrain/terrain-polygon/data/manager.ts +4 -0
  127. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +196 -0
  128. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +209 -0
  129. package/semiplugins/shape-on-terrain/terrain-polygon/data/polygon-to-triangles.ts +144 -0
  130. package/semiplugins/shape-on-terrain/terrain-polygon/data/random.ts +165 -0
  131. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +5 -0
  132. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +37 -0
  133. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker-contact.ts +81 -0
  134. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +146 -0
  135. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +90 -0
  136. package/semiplugins/shape-on-terrain/terrain-polygon/terrain-polygon.ts +265 -0
  137. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +69 -0
  138. package/semiplugins/shell/bbox-renderer/index.ts +2 -0
  139. package/semiplugins/shell/bbox-renderer/{logic.js → logic.ts} +273 -249
  140. package/semiplugins/shell/bbox-renderer/object.ts +129 -0
  141. package/semiplugins/type.ts +8 -0
  142. package/semiplugins/utility/{container-plugin.js → container-plugin.ts} +126 -94
  143. package/semiplugins/utility/{object-pass-container-plugin.js → object-pass-container-plugin.ts} +101 -80
  144. package/shaders/fragment-toy/firework.js +1 -1
  145. package/shaders/fragment-toy/singularity.js +5 -2
  146. package/terrain-plugin.mmd +83 -0
  147. package/tests/Math/arc-sampling-test.js +367 -0
  148. package/tests/Math/arc-sampling-test.ts +429 -0
  149. package/tests/Math/arc.test.ts +77 -0
  150. package/tests/Math/junction/arc-limit.test.ts +7 -0
  151. package/tests/Math/junction/arc-plane-points.test.ts +196 -0
  152. package/tests/Math/junction/arc-plane.test.ts +172 -0
  153. package/tests/Math/junction/line-sphere.test.ts +127 -0
  154. package/tests/Math/junction/plane-plane.test.ts +91 -0
  155. package/tests/Math/plane-test.ts +17 -0
  156. package/tests/Math/plane.test.ts +43 -0
  157. package/tests/Math/vec3.test.ts +33 -0
  158. package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +78 -63
  159. package/tracks/point-heat-map/index.js +0 -1
  160. package/tracks/point-heat-map/plugin-webworker.js +148 -121
  161. package/tracks/point-heat-map/point-to-heat-map-flow.js +150 -121
  162. package/tracks/point-heat-map/readme.md +15 -0
  163. package/tracks/point-tracks/key-methods.js +3 -2
  164. package/tracks/point-tracks/plugin.js +487 -393
  165. package/tracks/timetracks/adaptors-line-strip.js +79 -65
  166. package/tracks/timetracks/plugin-line-strip.js +295 -240
  167. package/tracks/timetracks/program-line-strip.js +495 -411
  168. package/tracks/timetracks/programpoint-line-strip.js +137 -109
  169. package/tracks/timetracks/readme.md +1 -0
  170. package/tsconfig.json +22 -0
  171. package/types/@pirireis/webglobe.d.ts +102 -0
  172. package/types/delaunator.d.ts +40 -0
  173. package/types/earcut.d.ts +11 -0
  174. package/types/rbush.d.ts +57 -0
  175. package/types.ts +319 -0
  176. package/util/account/bufferoffsetmanager.js +209 -176
  177. package/util/account/create-buffermap-orchastration.ts +85 -0
  178. package/util/account/index.js +6 -3
  179. package/util/account/single-attribute-buffer-management/{buffer-manager.js → buffer-manager.ts} +151 -117
  180. package/util/account/single-attribute-buffer-management/{buffer-orchestrator.js → buffer-orchestrator.ts} +238 -212
  181. package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.js → buffer-orchestrator1.ts} +184 -159
  182. package/util/account/single-attribute-buffer-management/{index.js → index.ts} +11 -4
  183. package/util/account/single-attribute-buffer-management/{object-store.js → object-store.ts} +76 -55
  184. package/util/account/single-attribute-buffer-management/types.ts +43 -0
  185. package/util/account/util.js +22 -18
  186. package/util/algorithms/index.js +0 -1
  187. package/util/algorithms/search-binary.js +26 -25
  188. package/util/build-strategy/{static-dynamic.js → static-dynamic.ts} +50 -41
  189. package/util/check/index.js +0 -1
  190. package/util/check/typecheck.ts +74 -0
  191. package/util/{frame-counter-trigger.js → frame-counter-trigger.ts} +99 -84
  192. package/util/geometry/{index.js → index.ts} +155 -121
  193. package/util/gl-util/buffer/{attribute-loader.js → attribute-loader.ts} +84 -62
  194. package/util/gl-util/buffer/{index.js → index.ts} +6 -3
  195. package/util/gl-util/draw-options/{methods.js → methods.ts} +47 -32
  196. package/util/gl-util/uniform-block/{manager.js → manager.ts} +232 -190
  197. package/util/{webglobe/gldefaultstates.js → globe-default-gl-states.ts} +5 -4
  198. package/util/helper-methods.ts +9 -0
  199. package/util/index.js +9 -10
  200. package/util/interpolation/index.js +0 -1
  201. package/util/interpolation/timetrack/index.js +9 -2
  202. package/util/interpolation/timetrack/timetrack-interpolator.js +94 -79
  203. package/util/interpolation/timetrack/web-worker.js +51 -46
  204. package/util/picking/{fence.js → fence.ts} +47 -41
  205. package/util/picking/picker-displayer.ts +226 -0
  206. package/util/programs/draw-from-pixel-coords.js +201 -164
  207. package/util/programs/{draw-texture-on-canvas.js → draw-texture-on-canvas.ts} +92 -67
  208. package/util/programs/supersampletotextures.js +130 -97
  209. package/util/programs/texturetoglobe.js +153 -128
  210. package/util/shaderfunctions/{geometrytransformations.js → geometrytransformations.ts} +169 -41
  211. package/util/shaderfunctions/index.js +2 -2
  212. package/util/shaderfunctions/nodata.js +4 -2
  213. package/util/shaderfunctions/noisefunctions.js +10 -7
  214. package/util/{webglobjectbuilders.js → webglobjectbuilders.ts} +446 -358
  215. package/vectorfield/arrowfield/adaptor.js +11 -11
  216. package/vectorfield/arrowfield/index.js +3 -3
  217. package/vectorfield/arrowfield/plugin.js +128 -83
  218. package/vectorfield/waveparticles/adaptor.js +16 -15
  219. package/vectorfield/waveparticles/index.js +3 -3
  220. package/vectorfield/waveparticles/plugin.ts +506 -0
  221. package/vectorfield/wind/adapters/image-to-fields.ts +74 -0
  222. package/vectorfield/wind/adapters/types.ts +12 -0
  223. package/vectorfield/wind/{imagetovectorfieldandmagnitude.js → imagetovectorfieldandmagnitude.ts} +78 -56
  224. package/vectorfield/wind/index.js +5 -5
  225. package/vectorfield/wind/plugin-persistant copy.ts +461 -0
  226. package/vectorfield/wind/plugin-persistant.ts +483 -0
  227. package/vectorfield/wind/plugin.js +883 -671
  228. package/vectorfield/wind/vectorfieldimage.js +27 -23
  229. package/write-text/{context-text-bulk.js → context-text-bulk.ts} +285 -200
  230. package/write-text/context-text3.ts +252 -0
  231. package/write-text/{context-text4.js → context-text4.ts} +231 -145
  232. package/write-text/context-textDELETE.js +125 -94
  233. package/write-text/objectarraylabels/{index.js → index.ts} +2 -2
  234. package/write-text/objectarraylabels/objectarraylabels.d.ts +72 -0
  235. package/write-text/objectarraylabels/objectarraylabels.js +247 -200
  236. package/Math/matrix4.js +0 -1
  237. package/Math/tessellation/earcut/adapters.js +0 -37
  238. package/Math/tessellation/hybrid-triangle-tessellation-meta.js +0 -123
  239. package/Math/tessellation/methods.js +0 -46
  240. package/Math/tessellation/shred-input.js +0 -18
  241. package/Math/tessellation/tile-merger.js +0 -56
  242. package/Math/tessellation/tiler.js +0 -50
  243. package/Math/tessellation/triangle-tessellation-meta.js +0 -516
  244. package/Math/tessellation/triangle-tessellation.js +0 -14
  245. package/Math/tessellation/types.js +0 -1
  246. package/Math/tessellation/zoom-catch.js +0 -1
  247. package/Math/types.js +0 -1
  248. package/programs/line-on-globe/linestrip/data.js +0 -4
  249. package/programs/polygon-on-globe/partial-tesselation.js +0 -1
  250. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin-triangle.js +0 -204
  251. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin.js +0 -118
  252. package/programs/polygon-on-globe/texture-dem-triangles.js +0 -236
  253. package/programs/vectorfields/logics/drawrectangleparticles.js +0 -112
  254. package/programs/vectorfields/logics/ubo-new.js +0 -25
  255. package/range-tools-on-terrain/bearing-line/types.js +0 -1
  256. package/range-tools-on-terrain/circle-line-chain/types.js +0 -1
  257. package/range-tools-on-terrain/range-ring/rangeringangletext.js +0 -331
  258. package/range-tools-on-terrain/range-ring/types.js +0 -9
  259. package/semiplugins/interface.js +0 -1
  260. package/semiplugins/shape-on-terrain/terrain-cover/texture-dem-cover.js +0 -1
  261. package/semiplugins/shell/bbox-renderer/index.js +0 -2
  262. package/semiplugins/shell/bbox-renderer/object.js +0 -65
  263. package/semiplugins/type.js +0 -1
  264. package/types.js +0 -19
  265. package/util/account/create-buffermap-orchastration.js +0 -39
  266. package/util/account/single-attribute-buffer-management/types.js +0 -1
  267. package/util/check/typecheck.js +0 -66
  268. package/util/gl-util/uniform-block/types.js +0 -1
  269. package/util/picking/picker-displayer.js +0 -134
  270. package/util/webglobe/index.js +0 -2
  271. package/util/webglobe/rasteroverlay.js +0 -76
  272. package/vectorfield/waveparticles/plugin.js +0 -290
  273. package/write-text/attached-text-writer.js +0 -95
  274. package/write-text/context-text3.js +0 -167
@@ -1,4 +1,6 @@
1
- import { globeProgramCache } from "../programcache";
1
+ import { globeProgramCache } from "../programcache";
2
+ import { Globe } from "../../types"
3
+
2
4
  export const WebGlobeInfoUniformBlockString = `
3
5
  layout(std140) uniform WebGlobeInfo {
4
6
  vec2 canvas_resolution;
@@ -8,134 +10,147 @@ layout(std140) uniform WebGlobeInfo {
8
10
  float world_tilt;
9
11
  float earth_distance;
10
12
  };
11
- `;
12
- export default class CanvasWebGlobeInfo {
13
- id;
14
- description;
15
- gl;
16
- globe;
17
- ubo;
18
- traslateFloat32;
19
- mapWHFloat32;
20
- constructor() {
21
- this.id = "CanvasWebGlobeInfo";
22
- this.description =
23
- `Sets a uniform block and provides buffer for it. The following is the glsl uniform block:` +
24
- WebGlobeInfoUniformBlockString;
25
- this.gl = null;
26
- this.globe = null;
27
- this.ubo = null;
28
- this.traslateFloat32 = new Float32Array(3);
29
- this.mapWHFloat32 = new Float32Array(2);
30
- }
31
- init(globe, gl) {
32
- this.gl = gl;
33
- this.globe = globe;
34
- this.ubo = this._createUBO();
35
- this.traslateFloat32 = new Float32Array(3);
36
- this.mapWHFloat32 = new Float32Array(2);
37
- this.setGeometry();
38
- this.resize();
39
- }
40
- _createUBO() {
41
- if (!this.gl)
42
- return null;
43
- const gl = this.gl;
44
- const ubo = gl.createBuffer();
45
- if (!ubo)
46
- return null;
47
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
48
- gl.bufferData(gl.UNIFORM_BUFFER, 164, gl.STREAM_DRAW);
49
- gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, ubo);
50
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
51
- return ubo;
52
- }
53
- resize() {
54
- if (!this.gl || !this.globe || !this.ubo)
55
- return;
56
- const { gl, globe, ubo } = this;
57
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
58
- gl.bufferSubData(gl.UNIFORM_BUFFER, 152, new Float32Array([globe.api_ScrW(), globe.api_ScrH()]));
59
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
60
- }
61
- setGeometry() {
62
- if (!this.gl || !this.globe || !this.ubo)
63
- return;
64
- const { gl, globe, ubo } = this;
65
- const is3D = globe.api_GetCurrentGeometry() === 0 ? 1 : 0;
66
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
67
- gl.bufferSubData(gl.UNIFORM_BUFFER, 140, new Float32Array([is3D]));
68
- }
69
- draw3D(projection, modelView, translate) {
70
- if (!this.gl || !this.globe || !this.ubo)
71
- return;
72
- const { gl, traslateFloat32, ubo, mapWHFloat32, globe } = this;
73
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
74
- {
75
- // view, projection, translate
76
- gl.bufferSubData(gl.UNIFORM_BUFFER, 0, modelView);
77
- gl.bufferSubData(gl.UNIFORM_BUFFER, 64, projection);
78
- traslateFloat32.set([translate.x, translate.y, translate.z], 0);
79
- gl.bufferSubData(gl.UNIFORM_BUFFER, 128, traslateFloat32);
80
- }
81
- {
82
- // zoom level
83
- gl.bufferSubData(gl.UNIFORM_BUFFER, 160, new Float32Array([globe.api_GetCurrentLODWithDecimal()]));
84
- }
85
- {
86
- // mapWH
87
- if (globe.api_GetCurrentGeometry() === 1) {
88
- const { width, height } = globe.api_GetCurrentWorldWH();
89
- mapWHFloat32.set([width, height]);
90
- gl.bufferSubData(gl.UNIFORM_BUFFER, 144, mapWHFloat32);
91
- }
92
- }
93
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
94
- }
95
- getUBO() {
96
- return this.ubo;
97
- }
98
- bind(bindingPoint) {
99
- if (!this.gl || !this.ubo)
100
- return;
101
- const { gl, ubo } = this;
102
- gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, ubo);
103
- }
104
- unbind(bindingPoint) {
105
- if (!this.gl)
106
- return;
107
- const { gl } = this;
108
- gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, null);
109
- }
110
- free() {
111
- if (!this.gl || !this.ubo)
112
- return;
113
- const { gl, ubo } = this;
114
- gl.deleteBuffer(ubo);
115
- }
116
- readBuffer() {
117
- if (!this.gl || !this.ubo)
118
- return null;
119
- const result = new Float32Array(41);
120
- this.gl.bindBuffer(this.gl.UNIFORM_BUFFER, this.ubo);
121
- this.gl.getBufferSubData(this.gl.UNIFORM_BUFFER, 0, result);
122
- this.gl.bindBuffer(this.gl.UNIFORM_BUFFER, null);
123
- return {
124
- view: result.slice(0, 16),
125
- projection: result.slice(16, 32),
126
- translate: result.slice(32, 35),
127
- is3D: result[35],
128
- mapWH: result.slice(36, 38),
129
- screenWH: result.slice(38, 40),
130
- z_level: result[40],
131
- };
132
- }
133
- }
134
- export const CanvasWebGlobeInfoCache = Object.freeze({
135
- get: (globe) => {
136
- return globeProgramCache.getProgram(globe, CanvasWebGlobeInfo);
137
- },
138
- release: (globe) => {
139
- return globeProgramCache.releaseProgram(globe, CanvasWebGlobeInfo);
140
- },
141
- });
13
+ `;
14
+
15
+
16
+ export default class CanvasWebGlobeInfo {
17
+ id: string;
18
+ description: string;
19
+ gl: WebGL2RenderingContext | null;
20
+ globe: Globe | null;
21
+ ubo: WebGLBuffer | null;
22
+ traslateFloat32: Float32Array;
23
+ mapWHFloat32: Float32Array;
24
+
25
+ constructor() {
26
+ this.id = "CanvasWebGlobeInfo";
27
+ this.description =
28
+ `Sets a uniform block and provides buffer for it. The following is the glsl uniform block:` +
29
+ WebGlobeInfoUniformBlockString;
30
+ this.gl = null;
31
+ this.globe = null;
32
+ this.ubo = null;
33
+ this.traslateFloat32 = new Float32Array(3);
34
+ this.mapWHFloat32 = new Float32Array(2);
35
+ }
36
+
37
+ init(globe: Globe, gl: WebGL2RenderingContext) {
38
+ this.gl = gl;
39
+ this.globe = globe;
40
+ this.ubo = this._createUBO();
41
+ this.traslateFloat32 = new Float32Array(3);
42
+ this.mapWHFloat32 = new Float32Array(2);
43
+ this.setGeometry();
44
+ this.resize();
45
+ }
46
+
47
+ _createUBO(): WebGLBuffer | null {
48
+ if (!this.gl) return null;
49
+ const gl = this.gl;
50
+ const ubo = gl.createBuffer();
51
+ if (!ubo) return null;
52
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
53
+ gl.bufferData(gl.UNIFORM_BUFFER, 164, gl.STREAM_DRAW);
54
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, ubo);
55
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
56
+ return ubo;
57
+ }
58
+
59
+ resize() {
60
+ if (!this.gl || !this.globe || !this.ubo) return;
61
+ const { gl, globe, ubo } = this;
62
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
63
+ gl.bufferSubData(
64
+ gl.UNIFORM_BUFFER,
65
+ 152,
66
+ new Float32Array([globe.api_ScrW(), globe.api_ScrH()])
67
+ );
68
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
69
+ }
70
+
71
+ setGeometry() {
72
+ if (!this.gl || !this.globe || !this.ubo) return;
73
+ const { gl, globe, ubo } = this;
74
+ const is3D = globe.api_GetCurrentGeometry() === 0 ? 1 : 0;
75
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
76
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 140, new Float32Array([is3D]));
77
+ }
78
+
79
+ draw3D(projection: Float32Array, modelView: Float32Array, translate: { x: number; y: number; z: number }) {
80
+ if (!this.gl || !this.globe || !this.ubo) return;
81
+ const { gl, traslateFloat32, ubo, mapWHFloat32, globe } = this;
82
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
83
+ {
84
+ // view, projection, translate
85
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 0, modelView);
86
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 64, projection);
87
+ traslateFloat32.set([translate.x, translate.y, translate.z], 0);
88
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 128, traslateFloat32);
89
+ }
90
+ {
91
+ // zoom level
92
+ gl.bufferSubData(
93
+ gl.UNIFORM_BUFFER,
94
+ 160,
95
+ new Float32Array([globe.api_GetCurrentLODWithDecimal()])
96
+ );
97
+ }
98
+ {
99
+ // mapWH
100
+ if (globe.api_GetCurrentGeometry() === 1) {
101
+ const { width, height } = globe.api_GetCurrentWorldWH();
102
+ mapWHFloat32.set([width, height]);
103
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 144, mapWHFloat32);
104
+ }
105
+ }
106
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
107
+ }
108
+
109
+ getUBO(): WebGLBuffer | null {
110
+ return this.ubo;
111
+ }
112
+
113
+ bind(bindingPoint: number) {
114
+ if (!this.gl || !this.ubo) return;
115
+ const { gl, ubo } = this;
116
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, ubo);
117
+ }
118
+
119
+ unbind(bindingPoint: number) {
120
+ if (!this.gl) return;
121
+ const { gl } = this;
122
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, null);
123
+ }
124
+
125
+ free() {
126
+ if (!this.gl || !this.ubo) return;
127
+ const { gl, ubo } = this;
128
+ gl.deleteBuffer(ubo);
129
+ }
130
+
131
+ readBuffer() {
132
+ if (!this.gl || !this.ubo) return null;
133
+ const result = new Float32Array(41);
134
+ this.gl.bindBuffer(this.gl.UNIFORM_BUFFER, this.ubo);
135
+ this.gl.getBufferSubData(this.gl.UNIFORM_BUFFER, 0, result);
136
+ this.gl.bindBuffer(this.gl.UNIFORM_BUFFER, null);
137
+ return {
138
+ view: result.slice(0, 16),
139
+ projection: result.slice(16, 32),
140
+ translate: result.slice(32, 35),
141
+ is3D: result[35],
142
+ mapWH: result.slice(36, 38),
143
+ screenWH: result.slice(38, 40),
144
+ z_level: result[40],
145
+ };
146
+ }
147
+ }
148
+
149
+ export const CanvasWebGlobeInfoCache = Object.freeze({
150
+ get: (globe: Globe) => {
151
+ return globeProgramCache.getProgram(globe, CanvasWebGlobeInfo);
152
+ },
153
+ release: (globe: Globe) => {
154
+ return globeProgramCache.releaseProgram(globe, CanvasWebGlobeInfo);
155
+ },
156
+ });
@@ -0,0 +1,368 @@
1
+ import { mergeMeshes, MergedTilesInfo } from "../../Math/tessellation/tile-merger"
2
+ import { Globe, DrawnTileInfo } from "../../types";
3
+ import { globeBBoxToXYBBOX } from "../../Math/methods";
4
+ import { CameraTotemAttachmentInterface } from "./camera-totem-attactment-interface";
5
+ import { noRegisterGlobeProgramCache } from "../programcache";
6
+ import { CameraUniformBlockTotem, CameraUniformBlockTotemCache } from "./camerauniformblock";
7
+
8
+ export const DEM_TEXTURE_BLOCK_STRING = `
9
+ layout(std140) uniform DemTextureUniformBlock {
10
+ vec4 u_demTextureBBOX[6]; // 96 bytes
11
+ vec4 u_textureDataCoverRatio[6]; // 96 bytes
12
+ vec2 u_textureResolution; // 8 bytes
13
+ int u_breakLoopIndex; // 4 bytes
14
+ };
15
+ uniform sampler2DArray u_demTexture;
16
+ `;
17
+
18
+
19
+
20
+
21
+ const MAXLAYERS = 6;
22
+ // Size calculation:
23
+ // BBOX: 6 * 16 bytes = 96
24
+ // CoverRatio: 6 * 16 bytes = 96
25
+ // Resolution: 8 bytes (offset 192)
26
+ // BreakLoopIndex: 4 bytes (offset 200)
27
+ // Total used: 204 bytes.
28
+ // std140 blocks are typically padded to 16 bytes alignment -> 208 bytes.
29
+ // 208 bytes / 4 bytes per float = 52 floats.
30
+ const uniformBlockData = new Float32Array(52);
31
+
32
+
33
+ function drawnedTilesHash(drawnTiles: DrawnTileInfo[]): number {
34
+ let hash = 0;
35
+ for (const tile of drawnTiles) {
36
+ // Combine tile coordinates into a unique value
37
+ const val = (tile.level << 20) | (tile.x << 10) | tile.y;
38
+ hash = ((hash << 5) - hash) + val;
39
+ hash = hash | 0; // Convert to 32-bit integer
40
+ }
41
+ return hash;
42
+ }
43
+
44
+
45
+ function resCalculation(sourceResolution: number, mergeCount: number): number {
46
+ return sourceResolution + (mergeCount - 1) * (sourceResolution - 1);
47
+ }
48
+
49
+ export class DemTextureManager implements CameraTotemAttachmentInterface {
50
+ private _globe: Globe;
51
+ private _mergeParameters = {
52
+ mergeCount: 20,
53
+ tileDimensionLength: 5,
54
+ processLimit: 6
55
+ }
56
+
57
+ private STOP: boolean = false;
58
+
59
+ private mergedData: MergedTilesInfo[] = [];
60
+ private uniformBuffer: WebGLBuffer | null = null;
61
+ private demTexture: WebGLTexture | null = null;
62
+ private textureWidth: number;
63
+ private textureHeight: number;
64
+ private cameraBlockTotem: CameraUniformBlockTotem = null as any;
65
+
66
+ private tilesHash: number = 0;
67
+ private registry: Set<{ setMergedTiles(tiles: MergedTilesInfo[]): void }> = new Set();
68
+
69
+
70
+ constructor(globe: Globe, { mergeCount = 20, tileDimensionLength = 5, processLimit = 6 }: { mergeCount?: number, tileDimensionLength?: number, processLimit?: number } = {}) {
71
+ this._globe = globe;
72
+ this._mergeParameters.mergeCount = mergeCount;
73
+ this._mergeParameters.tileDimensionLength = tileDimensionLength;
74
+ this._mergeParameters.processLimit = processLimit;
75
+
76
+
77
+
78
+ this.textureWidth = this.textureHeight = resCalculation(tileDimensionLength, mergeCount);
79
+ this.cameraBlockTotem = CameraUniformBlockTotemCache.get(this._globe);
80
+ this.cameraBlockTotem.registerAttachment(this);
81
+
82
+ // Initialize uniform data buffer
83
+ this.initializeUniformBlock();
84
+ this.initializeTextureArray();
85
+ }
86
+
87
+ private initializeUniformBlock() {
88
+ const gl = this._globe.gl as WebGL2RenderingContext;
89
+ if (!gl) return;
90
+
91
+ // Create uniform buffer
92
+ this.uniformBuffer = gl.createBuffer();
93
+ gl.bindBuffer(gl.UNIFORM_BUFFER, this.uniformBuffer);
94
+ // Allocate buffer with correct size (52 floats * 4 bytes)
95
+ gl.bufferData(gl.UNIFORM_BUFFER, uniformBlockData.byteLength, gl.STREAM_COPY);
96
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
97
+ }
98
+
99
+ private initializeTextureArray() {
100
+ const gl = this._globe.gl as WebGL2RenderingContext;
101
+ if (!gl) return;
102
+
103
+ // Create texture array
104
+ this.demTexture = gl.createTexture();
105
+
106
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.demTexture);
107
+ // Calculate correct size: tileDimensionLength + (mergeCount - 1) * (tileDimensionLength - 1)
108
+ // For tileDimensionLength=5, mergeCount=8: 5 + 7*4 = RESOLUTION
109
+ // gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.R32F, this.textureWidth, this.textureHeight, 6);
110
+
111
+ // // Allocate storage for texture array
112
+ gl.texImage3D(
113
+ gl.TEXTURE_2D_ARRAY,
114
+ 0, // mip level
115
+ gl.R32F, // internal format (32-bit float for DEM data)
116
+ this.textureWidth,
117
+ this.textureHeight,
118
+ MAXLAYERS, // number of layers
119
+ 0, // border
120
+ gl.RED, // format
121
+ gl.FLOAT, // type
122
+ null // data (null to allocate)
123
+ );
124
+ const ext = gl.getExtension('OES_texture_float_linear');
125
+ if (!ext) {
126
+ throw new Error("OES_texture_float_linear extension is supported.");
127
+ }
128
+ // Set texture parameters
129
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
130
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
131
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
132
+ gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
133
+
134
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
135
+ }
136
+
137
+
138
+ assignBindingPoint(program: WebGLProgram, bindingPoint: number): boolean {
139
+ const gl = this._globe.gl as WebGL2RenderingContext;
140
+ if (!gl || !this.uniformBuffer || !program) {
141
+ console.warn('Cannot bind uniform block: missing GL context, buffer, or program');
142
+ return false;
143
+ }
144
+
145
+ const uniformBlockIndex = gl.getUniformBlockIndex(program, 'DemTextureUniformBlock');
146
+ if (uniformBlockIndex === gl.INVALID_INDEX) {
147
+ // Uniform block might be optimized out - this is not necessarily an error
148
+ console.warn(`Uniform block 'DemTextureUniformBlock' not found in program (may be optimized out)`);
149
+ return false;
150
+ }
151
+
152
+ gl.uniformBlockBinding(program, uniformBlockIndex, bindingPoint);
153
+ return true;
154
+ }
155
+
156
+
157
+ register(obj: { setMergedTiles(tiles: MergedTilesInfo[]): void }) {
158
+ this.registry.add(obj);
159
+ obj.setMergedTiles(this.mergedData);
160
+ }
161
+
162
+ unregister(obj: { setMergedTiles(tiles: MergedTilesInfo[]): void }) {
163
+ this.registry.delete(obj);
164
+ }
165
+
166
+
167
+
168
+
169
+ update() {
170
+ if (this.STOP) return;
171
+ const gl = this._globe.gl as WebGL2RenderingContext;
172
+ const tilesMetaData = this._globe.api_GetVisibleTilesInfo() as DrawnTileInfo[];
173
+ const newHash = drawnedTilesHash(tilesMetaData);
174
+ if (this.tilesHash === newHash) {
175
+ return; // No change in drawn tiles, skip update
176
+ }
177
+ this.tilesHash = newHash;
178
+ this.mergedData = mergeMeshes(
179
+ tilesMetaData,
180
+ this._mergeParameters.mergeCount,
181
+ this._mergeParameters.tileDimensionLength,
182
+ this._mergeParameters.processLimit,
183
+ this._globe
184
+ );
185
+
186
+ // Bind texture before updating
187
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.demTexture);
188
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
189
+ // turn off premultiply alpha
190
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
191
+
192
+ for (let i = 0; i < this.mergedData.length; i++) {
193
+ const { mesh, bbox, coverRatio } = this.mergedData[i];
194
+
195
+ gl.texSubImage3D(
196
+ gl.TEXTURE_2D_ARRAY,
197
+ 0, // mip level
198
+ 0, // xoffset
199
+ 0, // yoffset
200
+ i, // zoffset (layer index)
201
+ this.textureWidth,
202
+ this.textureHeight,
203
+ 1, // depth (1 layer)
204
+ gl.RED,
205
+ gl.FLOAT,
206
+ mesh
207
+ );
208
+
209
+ const bboxXY = globeBBoxToXYBBOX(bbox);
210
+ uniformBlockData[i * 4 + 0] = bboxXY.ll[0];
211
+ uniformBlockData[i * 4 + 1] = bboxXY.ll[1];
212
+ uniformBlockData[i * 4 + 2] = bboxXY.ur[0];
213
+ uniformBlockData[i * 4 + 3] = bboxXY.ur[1];
214
+
215
+ uniformBlockData[24 + i * 4 + 0] = coverRatio.x;
216
+ uniformBlockData[24 + i * 4 + 1] = coverRatio.y;
217
+ }
218
+
219
+ // Set resolution (offset 192 bytes -> index 48)
220
+ uniformBlockData[48] = this.textureWidth;
221
+ uniformBlockData[49] = this.textureHeight;
222
+
223
+ // Set break loop index (offset 200 bytes -> index 50)
224
+ uniformBlockData[50] = this.mergedData.length;
225
+
226
+ // Unbind texture after updating
227
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
228
+
229
+ gl.bindBuffer(gl.UNIFORM_BUFFER, this.uniformBuffer);
230
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 0, uniformBlockData);
231
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
232
+
233
+ for (const obj of this.registry) {
234
+ obj.setMergedTiles(this.mergedData);
235
+ }
236
+ }
237
+
238
+
239
+
240
+ bindData(textureUnit: number, bindingPoint: number) {
241
+ const gl = this._globe.gl as WebGL2RenderingContext;
242
+ if (!gl) return;
243
+
244
+ // Bind uniform buffer
245
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, this.uniformBuffer);
246
+
247
+
248
+ // Bind texture array
249
+ gl.activeTexture(gl.TEXTURE0 + textureUnit);
250
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.demTexture);
251
+
252
+
253
+ }
254
+
255
+
256
+ find(x: number, y: number, zoom: number): DrawnTileInfo | null {
257
+ for (const data of this._globe.api_GetVisibleTilesInfo() as DrawnTileInfo[]) {
258
+ if (data.x === x && data.y === y && data.level === zoom) {
259
+ return data;
260
+ }
261
+ }
262
+ return null;
263
+ }
264
+
265
+
266
+ showMergedDataInfo(zoomLevel: number) {
267
+
268
+
269
+ if (!this.mergedData[zoomLevel]) {
270
+ console.log(`No merged data at zoom level ${zoomLevel}`);
271
+ return;
272
+ }
273
+ const { textureHeight, textureWidth } = this;
274
+ const { mesh, bbox, coverRatio } = this.mergedData[zoomLevel];
275
+
276
+ const result = [];
277
+ const xLength = Math.ceil(mesh.length / textureHeight * coverRatio.x);
278
+ const yLength = Math.ceil(mesh.length / textureWidth * coverRatio.y);
279
+
280
+ for (let y = 0; y < yLength; y++) {
281
+ const row = [];
282
+ for (let x = 0; x < xLength; x++) {
283
+ const index = y * textureWidth + x;
284
+ const value = mesh[index];
285
+ row.push(value);
286
+ }
287
+ result.push(new Float32Array(row));
288
+ }
289
+
290
+ return { mesh: result, bbox: bbox, coverRatio: coverRatio };
291
+ }
292
+
293
+
294
+
295
+ unbindData(textureUnit: number, bindingPoint: number) {
296
+ const gl = this._globe.gl as WebGL2RenderingContext;
297
+ if (!gl) return;
298
+
299
+ // Unbind texture array
300
+ gl.activeTexture(gl.TEXTURE0 + textureUnit);
301
+
302
+ // Unbind
303
+ gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
304
+
305
+ // call this right after drawing
306
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, null);
307
+ }
308
+
309
+
310
+
311
+
312
+
313
+ get(): MergedTilesInfo[] {
314
+ return this.mergedData;
315
+ }
316
+
317
+ getBBoxes(): { minX: number, minY: number, maxX: number, maxY: number, zoom: number }[] {
318
+ const ressult: { minX: number, minY: number, maxX: number, maxY: number, zoom: number }[] = new Array(this.mergedData.length);
319
+ for (let i = 0; i < this.mergedData.length; i++) {
320
+ const { bbox, zoom } = this.mergedData[i];
321
+ ressult[i] = {
322
+ minX: bbox.ll.x,
323
+ minY: bbox.ll.y,
324
+ maxX: bbox.ur.x,
325
+ maxY: bbox.ur.y,
326
+ zoom
327
+ };
328
+ }
329
+ return ressult;
330
+ }
331
+
332
+ free() {
333
+ const gl = this._globe.gl as WebGL2RenderingContext;
334
+ this.cameraBlockTotem.unregisterAttachment(this);
335
+ if (gl) {
336
+ if (this.uniformBuffer) {
337
+ gl.deleteBuffer(this.uniformBuffer);
338
+ this.uniformBuffer = null;
339
+ }
340
+ if (this.demTexture) {
341
+ gl.deleteTexture(this.demTexture);
342
+ this.demTexture = null;
343
+ }
344
+ }
345
+ }
346
+ }
347
+
348
+
349
+ export const DemTextureManagerCache = Object.freeze({
350
+ get: (globe: Globe) => {
351
+ const result = noRegisterGlobeProgramCache.getProgram(globe, DemTextureManager)
352
+ window.demManager = result;
353
+ return result;
354
+ },
355
+
356
+ release: (globe: Globe) => {
357
+ noRegisterGlobeProgramCache.releaseProgram(globe, DemTextureManager);
358
+ }
359
+
360
+ });
361
+
362
+
363
+ // declare demManager window global
364
+ declare global {
365
+ interface Window {
366
+ demManager: DemTextureManager;
367
+ }
368
+ }