@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,232 +1,328 @@
1
- import { globeProgramCache } from "../programcache";
2
- import { fromLongLatToUnitVector } from "../../Math/vec3";
3
- import { RADIAN } from "../../Math/methods";
4
- import { GlobeChangeObserver } from "./globe-changes";
1
+ import { globeProgramCache } from "../programcache";
2
+ import { Globe, GlobeChanges } from "../../types";
3
+ import { Vec3 } from "../../Math/types";
4
+ import { fromLongLatToUnitVector } from "../../Math/vec3";
5
+ import { RADIAN } from "../../Math/methods";
6
+ import { GlobeChangeObserver } from "./globe-changes";
7
+ // import { DemTextureManager } from "./dem-textures-manager";
8
+
9
+ import { CameraTotemAttachmentInterface } from "./camera-totem-attactment-interface";
10
+
5
11
  export const CameraUniformBlockString = `
6
12
  layout(std140) uniform CameraUniformBlock {
7
- mat4 view; // 64 bytes 0
8
- mat4 projection; // 64 bytes 64
9
- vec3 translate; // 12 bytes 128
10
- bool is3D; // 4 bytes 140
11
- vec2 mapWH; // 8 bytes 144
12
- vec2 screenWH; // 8 bytes 152
13
- float z_level; // 4 bytes 160 | 164
14
- float world_distance; // 4 bytes 164
15
- float world_tilt; // 4 bytes 168
16
- float world_north_angle; // 4 bytes 172
17
- vec2 world_center_radian; // 8 bytes 176 | 184
18
- }; // 14 lines
19
- `;
20
- const Radian = Math.PI / 180.0;
21
- const _0vec3 = [0, 0, 0];
22
- export class CameraUniformBlockTotem {
23
- id;
24
- description;
25
- gl;
26
- globe;
27
- ubo;
28
- traslateFloat32;
29
- mapWHFloat32;
30
- _isMovedParams;
31
- _normalizedCameraVector = [0, 0, 0]; // Normalized camera vector
32
- // _frustumPlanes: any; // Uncomment and type if used
33
- _aproximatedLOD = -1;
34
- _globeChangeObserver = null;
35
- constructor() {
36
- this.id = "CameraUniformBlockTotem";
37
- this.description =
38
- `Sets a uniform block and provides buffer for it. The following is the glsl uniform block:` +
39
- CameraUniformBlockString;
40
- this.gl = null;
41
- this.globe = null;
42
- this.ubo = null;
43
- // this._frustumPlanes = { ... }
44
- this._isMovedParams = {
45
- lastLod: null,
46
- isMoved: false,
47
- };
48
- this.traslateFloat32 = new Float32Array(3);
49
- this.mapWHFloat32 = new Float32Array(2);
50
- }
51
- init(globe, gl) {
52
- this.gl = gl;
53
- this.globe = globe;
54
- this.ubo = this._createUBO();
55
- this.traslateFloat32 = new Float32Array(3);
56
- this.mapWHFloat32 = new Float32Array(2);
57
- this._globeChangeObserver = new GlobeChangeObserver(globe);
58
- this.setGeometry();
59
- this.resize();
60
- }
61
- _createUBO() {
62
- const gl = this.gl;
63
- const ubo = gl.createBuffer();
64
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
65
- // 184 bytes in reality. Overflow on linux for some reason. So, 200 bytes.
66
- gl.bufferData(gl.UNIFORM_BUFFER, 200, gl.STREAM_DRAW);
67
- gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, ubo);
68
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
69
- return ubo;
70
- }
71
- resize() {
72
- const gl = this.gl;
73
- const globe = this.globe;
74
- const ubo = this.ubo;
75
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
76
- gl.bufferSubData(gl.UNIFORM_BUFFER, 152, new Float32Array([globe.api_ScrW(), globe.api_ScrH()]));
77
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
78
- }
79
- setGeometry() {
80
- const gl = this.gl;
81
- const globe = this.globe;
82
- const ubo = this.ubo;
83
- const is3D = globe.api_GetCurrentGeometry() === 0 ? 1 : 0;
84
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
85
- gl.bufferSubData(gl.UNIFORM_BUFFER, 140, new Float32Array([is3D]));
86
- }
87
- draw3D(projection, modelView, translate) {
88
- const gl = this.gl;
89
- const traslateFloat32 = this.traslateFloat32;
90
- const ubo = this.ubo;
91
- const mapWHFloat32 = this.mapWHFloat32;
92
- const globe = this.globe;
93
- this._globeChangeObserver?.checkChanges();
94
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
95
- // view, projection, translate
96
- gl.bufferSubData(gl.UNIFORM_BUFFER, 0, modelView);
97
- gl.bufferSubData(gl.UNIFORM_BUFFER, 64, projection);
98
- traslateFloat32.set([translate.x, translate.y, translate.z], 0);
99
- gl.bufferSubData(gl.UNIFORM_BUFFER, 128, traslateFloat32);
100
- // zoom level
101
- gl.bufferSubData(gl.UNIFORM_BUFFER, 160, new Float32Array([globe.api_GetCurrentLODWithDecimal()]));
102
- // mapWH
103
- if (globe.api_GetCurrentGeometry() === 1) {
104
- const { width, height } = globe.api_GetCurrentWorldWH();
105
- mapWHFloat32.set([width, height]);
106
- gl.bufferSubData(gl.UNIFORM_BUFFER, 144, mapWHFloat32);
107
- }
108
- // float world_distance; // 4 bytes 164
109
- // float world_tilt; // 4 bytes 168
110
- // float world_north_angle; // 4 bytes 172
111
- // vec2 world_center_radian; // 8 bytes 180
112
- const { CenterLong, CenterLat, Distance, Tilt, NorthAng } = globe.api_GetCurrentLookInfo();
113
- gl.bufferSubData(gl.UNIFORM_BUFFER, 164, new Float32Array([
114
- Distance,
115
- Radian * Tilt,
116
- Radian * NorthAng,
117
- Radian * CenterLong,
118
- Radian * CenterLat,
119
- ]));
120
- // this._frustumPlanes = getFrustumPlanes(projection, translate);
121
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
122
- // isMoved
123
- const currentLOD = globe.api_GetCurrentLODWithDecimal();
124
- this._isMovedParams.isMoved =
125
- this._isMovedParams.lastLod !== currentLOD ||
126
- globe.api_IsScreenMoving();
127
- this._isMovedParams.lastLod = currentLOD;
128
- this.__setCameraVectors();
129
- // this._calculateAproximatedLOD();
130
- }
131
- __setCameraVectors() {
132
- if (!this.globe) {
133
- throw new Error("Globe is not initialized");
134
- }
135
- const globe = this.globe;
136
- const currentGeom = globe.api_GetCurrentGeometry();
137
- if (currentGeom === 0) {
138
- const { Fp } = globe; // FUPos
139
- const cameraVector = [Fp.x, Fp.y, Fp.z];
140
- const length = Math.sqrt(cameraVector.reduce((sum, val) => sum + val * val, 0));
141
- this._normalizedCameraVector[0] = cameraVector[0] / length;
142
- this._normalizedCameraVector[1] = cameraVector[1] / length;
143
- this._normalizedCameraVector[2] = cameraVector[2] / length;
144
- }
145
- else if (currentGeom === 1) {
146
- const { CenterLong, CenterLat } = globe.api_GetCurrentLookInfo();
147
- fromLongLatToUnitVector(_0vec3, [CenterLong * RADIAN, CenterLat * RADIAN]);
148
- this._normalizedCameraVector[0] = _0vec3[0];
149
- this._normalizedCameraVector[1] = _0vec3[1];
150
- this._normalizedCameraVector[2] = _0vec3[2];
151
- }
152
- }
153
- // TODO: cut implicits to the bottom
154
- assignBindingPoint(program, bindingPoint) {
155
- const gl = this.gl;
156
- const cameraBlockIndex = gl.getUniformBlockIndex(program, "CameraUniformBlock");
157
- gl.uniformBlockBinding(program, cameraBlockIndex, bindingPoint);
158
- }
159
- getUBO() {
160
- return this.ubo;
161
- }
162
- bind(bindingPoint) {
163
- const gl = this.gl;
164
- const ubo = this.ubo;
165
- gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, ubo);
166
- }
167
- unbind(bindingPoint) {
168
- const gl = this.gl;
169
- gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, null);
170
- }
171
- isMoved() {
172
- return this._isMovedParams.isMoved;
173
- }
174
- getCameraVector() {
175
- const globe = this.globe;
176
- return [globe.Fp.x, globe.Fp.y, globe.Fp.z];
177
- }
178
- getNormalizedCameraVector() {
179
- return this._normalizedCameraVector || _0vec3;
180
- }
181
- getCameraUpVector() {
182
- const globe = this.globe;
183
- return [globe.FUPos.x, globe.FUPos.y, globe.FUPos.z];
184
- }
185
- getLookAtVector() {
186
- const globe = this.globe;
187
- const { CenterLong, CenterLat } = globe.api_GetCurrentLookInfo();
188
- const result = [0, 0, 0];
189
- fromLongLatToUnitVector(result, [CenterLong * RADIAN, CenterLat * RADIAN]);
190
- return result;
191
- }
192
- getGlobeChanges() {
193
- return this._globeChangeObserver?.getChanges();
194
- }
195
- // getApproximatedLOD(): number {
196
- // return this._aproximatedLOD;
197
- // }
198
- // _calculateAproximatedLOD(){
199
- // const globe = this.globe!;
200
- // this._aproximatedLOD = approximatedZoomLevel(globe)
201
- // }
202
- free() {
203
- const gl = this.gl;
204
- const ubo = this.ubo;
205
- gl.deleteBuffer(ubo);
206
- }
207
- readBuffer() {
208
- const gl = this.gl;
209
- const ubo = this.ubo;
210
- const result = new Float32Array(41);
211
- gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
212
- gl.getBufferSubData(gl.UNIFORM_BUFFER, 0, result);
213
- gl.bindBuffer(gl.UNIFORM_BUFFER, null);
214
- return {
215
- view: result.slice(0, 16),
216
- projection: result.slice(16, 32),
217
- translate: result.slice(32, 35),
218
- is3D: result[35],
219
- mapWH: result.slice(36, 38),
220
- screenWH: result.slice(38, 40),
221
- z_level: result[40],
222
- };
223
- }
224
- }
225
- export const CameraUniformBlockTotemCache = Object.freeze({
226
- get: (globe) => {
227
- return globeProgramCache.getProgram(globe, CameraUniformBlockTotem);
228
- },
229
- release: (globe) => {
230
- return globeProgramCache.releaseProgram(globe, CameraUniformBlockTotem);
231
- },
232
- });
13
+ mat4 view; // 64 bytes 0
14
+ mat4 projection; // 64 bytes 64
15
+ vec3 translate; // 12 bytes 128
16
+ bool is3D; // 4 bytes 140
17
+ vec2 mapWH; // 8 bytes 144
18
+ vec2 screenWH; // 8 bytes 152
19
+ float z_level; // 4 bytes 160
20
+ float world_distance; // 4 bytes 164
21
+ float world_tilt; // 4 bytes 168
22
+ float world_north_angle; // 4 bytes 172
23
+ vec2 world_center_radian; // 8 bytes 176
24
+ float NaN; // padding to 16 bytes 184
25
+ }; // 188 bytes total
26
+ `;
27
+ // TODO: Remove NaN
28
+ const Radian = Math.PI / 180.0;
29
+
30
+ const _0vec3: Vec3 = [0, 0, 0];
31
+
32
+ interface GLContext extends WebGL2RenderingContext {
33
+ // Extend with any custom methods if needed
34
+ }
35
+
36
+
37
+
38
+
39
+ type TranslateVec3 = { x: number; y: number; z: number };
40
+
41
+ export class CameraUniformBlockTotem {
42
+ id: string;
43
+ description: string;
44
+ gl: GLContext | null;
45
+ globe: Globe | null;
46
+ ubo: WebGLBuffer | null;
47
+ traslateFloat32: Float32Array;
48
+ mapWHFloat32: Float32Array;
49
+ _isMovedParams: { lastLod: number | null; isMoved: boolean };
50
+ _normalizedCameraVector: Vec3 = [0, 0, 0]; // Normalized camera vector
51
+ // _frustumPlanes: any; // Uncomment and type if used
52
+ _aproximatedLOD: number = -1;
53
+ _globeChangeObserver: GlobeChangeObserver | null = null;
54
+ private attachments: Set<CameraTotemAttachmentInterface> = new Set();
55
+
56
+ constructor() {
57
+ this.id = "CameraUniformBlockTotem";
58
+ this.description = `Provides and updates camera related uniform block
59
+ Should be on top of DrawOrder.
60
+ Attachments can register to process right after camera data is updated without creating other plugins listed on DrawOrder
61
+ The following is the glsl uniform block: ${CameraUniformBlockString}`
62
+ this.gl = null;
63
+ this.globe = null;
64
+ this.ubo = null;
65
+ // this._frustumPlanes = { ... }
66
+ this._isMovedParams = {
67
+ lastLod: null,
68
+ isMoved: false,
69
+ };
70
+ this.traslateFloat32 = new Float32Array(3);
71
+ this.mapWHFloat32 = new Float32Array(2);
72
+ }
73
+
74
+ init(globe: Globe, gl: WebGL2RenderingContext) {
75
+ this.gl = gl;
76
+ this.globe = globe;
77
+ this.ubo = this._createUBO();
78
+ this.traslateFloat32 = new Float32Array(3);
79
+ this.mapWHFloat32 = new Float32Array(2);
80
+ this._globeChangeObserver = new GlobeChangeObserver(globe);
81
+ this.setGeometry();
82
+ this.resize();
83
+ }
84
+
85
+ _createUBO(): WebGLBuffer | null {
86
+ const gl = this.gl!;
87
+ const ubo = gl.createBuffer();
88
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
89
+ // 184 bytes in reality. Overflow on linux for some reason. So, 200 bytes.
90
+ gl.bufferData(gl.UNIFORM_BUFFER, 200, gl.STREAM_DRAW);
91
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, 0, ubo);
92
+ // assign NaN to padding float
93
+ gl.bufferSubData(
94
+ gl.UNIFORM_BUFFER, 184,
95
+ new Float32Array([NaN])
96
+ );
97
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
98
+ return ubo;
99
+ }
100
+
101
+ resize() {
102
+ const gl = this.gl!;
103
+ const globe = this.globe!;
104
+ const ubo = this.ubo!;
105
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
106
+ gl.bufferSubData(
107
+ gl.UNIFORM_BUFFER,
108
+ 152,
109
+ new Float32Array([globe.api_ScrW(), globe.api_ScrH()])
110
+ );
111
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
112
+ }
113
+
114
+ setGeometry() {
115
+ const gl = this.gl!;
116
+ const globe = this.globe!;
117
+ const ubo = this.ubo!;
118
+ const is3D = globe.api_GetCurrentGeometry() === 0 ? 1 : 0;
119
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
120
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 140, new Float32Array([is3D]));
121
+ }
122
+
123
+ draw3D(projection: Float32Array, modelView: Float32Array, translate: TranslateVec3) {
124
+ const gl = this.gl!;
125
+ const traslateFloat32 = this.traslateFloat32;
126
+ const ubo = this.ubo!;
127
+ const mapWHFloat32 = this.mapWHFloat32;
128
+ const globe = this.globe!;
129
+ this._globeChangeObserver?.checkChanges();
130
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
131
+ // view, projection, translate
132
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 0, modelView);
133
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 64, projection);
134
+ traslateFloat32.set([translate.x, translate.y, translate.z], 0);
135
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 128, traslateFloat32);
136
+ // zoom level
137
+ gl.bufferSubData(
138
+ gl.UNIFORM_BUFFER,
139
+ 160,
140
+ new Float32Array([globe.api_GetCurrentLODWithDecimal()])
141
+ );
142
+ // mapWH
143
+ if (globe.api_GetCurrentGeometry() === 1) {
144
+ const { width, height } = globe.api_GetCurrentWorldWH();
145
+ mapWHFloat32.set([width, height]);
146
+ gl.bufferSubData(gl.UNIFORM_BUFFER, 144, mapWHFloat32);
147
+ }
148
+ // float world_distance; // 4 bytes 164
149
+ // float world_tilt; // 4 bytes 168
150
+ // float world_north_angle; // 4 bytes 172
151
+ // vec2 world_center_radian; // 8 bytes 180
152
+ const { CenterLong, CenterLat, Distance, Tilt, NorthAng } =
153
+ globe.api_GetCurrentLookInfo();
154
+ gl.bufferSubData(
155
+ gl.UNIFORM_BUFFER,
156
+ 164,
157
+ new Float32Array([
158
+ Distance,
159
+ Radian * Tilt,
160
+ Radian * NorthAng,
161
+ Radian * CenterLong,
162
+ Radian * CenterLat,
163
+ ])
164
+ );
165
+
166
+ // this._frustumPlanes = getFrustumPlanes(projection, translate);
167
+
168
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
169
+
170
+ // isMoved
171
+ const currentLOD = globe.api_GetCurrentLODWithDecimal();
172
+ this._isMovedParams.isMoved =
173
+ this._isMovedParams.lastLod !== currentLOD ||
174
+ globe.api_IsScreenMoving();
175
+ this._isMovedParams.lastLod = currentLOD;
176
+
177
+ this.__setCameraVectors();
178
+ // this._calculateAproximatedLOD();
179
+ for (const attachment of this.attachments) {
180
+ attachment.update();
181
+ }
182
+ }
183
+
184
+ __setCameraVectors() {
185
+ if (!this.globe) {
186
+ throw new Error("Globe is not initialized");
187
+ }
188
+ const globe = this.globe;
189
+ const currentGeom = globe.api_GetCurrentGeometry()
190
+ if (currentGeom === 0) {
191
+
192
+ const { Fp } = globe as Globe; // FUPos
193
+
194
+
195
+ const cameraVector = [Fp.x, Fp.y, Fp.z];
196
+ const length = Math.sqrt(
197
+ cameraVector.reduce((sum, val) => sum + val * val, 0)
198
+ );
199
+
200
+
201
+ this._normalizedCameraVector[0] = cameraVector[0] / length;
202
+ this._normalizedCameraVector[1] = cameraVector[1] / length;
203
+ this._normalizedCameraVector[2] = cameraVector[2] / length;
204
+ } else if (currentGeom === 1) {
205
+ const { CenterLong, CenterLat } = globe.api_GetCurrentLookInfo();
206
+
207
+ fromLongLatToUnitVector(
208
+ _0vec3,
209
+ [CenterLong * RADIAN, CenterLat * RADIAN]
210
+ );
211
+ this._normalizedCameraVector[0] = _0vec3[0];
212
+ this._normalizedCameraVector[1] = _0vec3[1];
213
+ this._normalizedCameraVector[2] = _0vec3[2];
214
+ }
215
+ }
216
+
217
+ // TODO: cut implicits to the bottom
218
+
219
+ assignBindingPoint(program: WebGLProgram, bindingPoint: number) {
220
+ const gl = this.gl!;
221
+ const cameraBlockIndex = gl.getUniformBlockIndex(
222
+ program,
223
+ "CameraUniformBlock"
224
+ );
225
+ gl.uniformBlockBinding(program, cameraBlockIndex, bindingPoint);
226
+ }
227
+
228
+ getUBO(): WebGLBuffer | null {
229
+ return this.ubo;
230
+ }
231
+
232
+
233
+ bind(bindingPoint: number) {
234
+ const gl = this.gl!;
235
+ const ubo = this.ubo!;
236
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, ubo);
237
+ }
238
+
239
+ unbind(bindingPoint: number) {
240
+ const gl = this.gl!;
241
+ gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, null);
242
+ }
243
+
244
+ isMoved(): boolean {
245
+ return this._isMovedParams.isMoved;
246
+ }
247
+
248
+ getCameraVector(): Vec3 {
249
+ const globe = this.globe!;
250
+ return [globe.Fp.x, globe.Fp.y, globe.Fp.z];
251
+ }
252
+
253
+ getNormalizedCameraVector(): Vec3 {
254
+ return this._normalizedCameraVector || _0vec3;
255
+ }
256
+
257
+ getCameraUpVector(): Vec3 {
258
+ const globe = this.globe!;
259
+ return [globe.FUPos.x, globe.FUPos.y, globe.FUPos.z];
260
+ }
261
+
262
+
263
+ getLookAtVector(): Vec3 {
264
+ const globe = this.globe!;
265
+ const { CenterLong, CenterLat } = globe.api_GetCurrentLookInfo();
266
+ const result: Vec3 = [0, 0, 0];
267
+ fromLongLatToUnitVector(result, [CenterLong * RADIAN, CenterLat * RADIAN]);
268
+ return result;
269
+ }
270
+
271
+
272
+ getGlobeChanges(): GlobeChanges {
273
+ return this._globeChangeObserver?.getChanges()!;
274
+ }
275
+
276
+
277
+
278
+ registerAttachment(attachment: CameraTotemAttachmentInterface) {
279
+ this.attachments.add(attachment);
280
+ }
281
+
282
+ unregisterAttachment(attachment: CameraTotemAttachmentInterface) {
283
+ this.attachments.delete(attachment);
284
+ }
285
+
286
+
287
+
288
+
289
+
290
+ free() {
291
+ const gl = this.gl!;
292
+ const ubo = this.ubo!;
293
+ gl.deleteBuffer(ubo);
294
+
295
+ if (this.attachments.size > 0) {
296
+ throw new Error("There are still attachments registered to CameraUniformBlockTotem during free()");
297
+ }
298
+
299
+ }
300
+
301
+ readBuffer() {
302
+ const gl = this.gl!;
303
+ const ubo = this.ubo!;
304
+ const result = new Float32Array(41);
305
+ gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
306
+ gl.getBufferSubData(gl.UNIFORM_BUFFER, 0, result);
307
+ gl.bindBuffer(gl.UNIFORM_BUFFER, null);
308
+ return {
309
+ view: result.slice(0, 16),
310
+ projection: result.slice(16, 32),
311
+ translate: result.slice(32, 35),
312
+ is3D: result[35],
313
+ mapWH: result.slice(36, 38),
314
+ screenWH: result.slice(38, 40),
315
+ z_level: result[40],
316
+ };
317
+ }
318
+ }
319
+
320
+ export const CameraUniformBlockTotemCache = Object.freeze({
321
+ get: (globe: Globe) => {
322
+ return globeProgramCache.getProgram(globe, CameraUniformBlockTotem);
323
+ },
324
+ release: (globe: Globe) => {
325
+ return globeProgramCache.releaseProgram(globe, CameraUniformBlockTotem);
326
+ },
327
+ });
328
+