@pirireis/webglobeplugins 0.17.1 → 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 (272) 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 -113
  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.js → tiles.ts} +162 -128
  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 -481
  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 -394
  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 -685
  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 -146
  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 -298
  242. package/Math/tessellation/tiler.js +0 -50
  243. package/Math/tessellation/triangle-tessellation-meta.js +0 -523
  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/investigation-tools/draw/tiles/adapters.js +0 -67
  249. package/programs/line-on-globe/linestrip/data.js +0 -4
  250. package/programs/polygon-on-globe/texture-dem-triangle-test-plugin-triangle.js +0 -328
  251. package/programs/polygon-on-globe/texture-dem-triangles.js +0 -268
  252. package/programs/vectorfields/logics/drawrectangleparticles.js +0 -114
  253. package/programs/vectorfields/logics/drawrectangleparticles1.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/vectorfield/waveparticles/plugin.js +0 -290
  272. package/write-text/context-text3.js +0 -167
@@ -0,0 +1,146 @@
1
+ /// <reference lib="webworker" />
2
+
3
+ import { Cache } from "./cache";
4
+ import { partialTessellation, zoomLevelShowThreshold } from "../../../../Math/tessellation/triangle-tessellation";
5
+ import { IndexAttributeEscapeValue } from "../../../../programs/polygon-on-globe/texture-dem-triangles";
6
+
7
+ const cache = new Cache(100); // 100 km threshold
8
+ let _pickableState = false;
9
+ let _variativeColorsOnState = false;
10
+
11
+ let showThreshold = 0;
12
+ // eslint-disable-next-line no-restricted-globals
13
+ self.onmessage = (event) => {
14
+ try {
15
+ const { bboxes, insertDeleteQueue, pickableState, variativeColorsOn } = event.data;
16
+ if (variativeColorsOn !== undefined) {
17
+ _variativeColorsOnState = variativeColorsOn;
18
+ }
19
+ if (pickableState !== undefined) {
20
+ _pickableState = pickableState;
21
+ }
22
+
23
+ // Process insert/delete queue
24
+ if (insertDeleteQueue[0] === "__CLEAR_ALL_ITEMS__") {
25
+ insertDeleteQueue.shift();
26
+ cache.clear();
27
+ }
28
+
29
+ for (const item of insertDeleteQueue) {
30
+ if (typeof item === 'string') {
31
+ cache.remove(item);
32
+ } else {
33
+ cache.insert(item.key, item);
34
+ }
35
+ }
36
+
37
+ // Update bboxes if provided
38
+ if (bboxes) {
39
+ cache.setBBOXes(bboxes);
40
+ showThreshold = zoomLevelShowThreshold(bboxes[0].zoom, 0.03);
41
+ }
42
+
43
+ // Search for triangles in view
44
+ const trianglesInView = cache.search();
45
+
46
+ // Prepare arrays for merging
47
+ const results = [];
48
+
49
+ // Convert bbox to BBoxZoom format for partialTessellation
50
+ const bboxZooms = bboxes ? bboxes.map(b => ({
51
+ bbox: {
52
+ min: [b.minX, b.minY],
53
+ max: [b.maxX, b.maxY]
54
+ },
55
+ zoom: b.zoom
56
+ })) : []; // This will be empty if no bbox, causing issues
57
+
58
+ let counter = 0;
59
+ let indexCounter = 0;
60
+ // Process each triangle
61
+ for (const triangle of trianglesInView) {
62
+ if (triangle.tessellationMeta.showThreshold * 0.075 > showThreshold) {
63
+ continue;
64
+ }
65
+
66
+ const result = (triangle.tessellationMeta.showThreshold < showThreshold) ? partialTessellation(
67
+ triangle.tessellationMeta,
68
+ bboxZooms,
69
+ 5 // innerCuts parameter
70
+ ) : triangle.tessellationMeta.shortCut;
71
+
72
+
73
+ counter += result.vec3s.length;
74
+ indexCounter += result.indices.length;
75
+ if (_pickableState) {
76
+ // TODO: find a better way to fill indeces to final array
77
+ result.pickIndex = triangle.polygon.index;
78
+ }
79
+ if (_variativeColorsOnState) {
80
+ const color = triangle.polygon.color || [IndexAttributeEscapeValue, IndexAttributeEscapeValue, IndexAttributeEscapeValue, IndexAttributeEscapeValue];
81
+ result.variativeColors = color;
82
+ // Update offset for next triangle
83
+ }
84
+ results.push(result);
85
+ }
86
+
87
+ // Send results back
88
+ const output = {
89
+ vec3s: new Float32Array(counter),
90
+ longLats: new Float32Array(counter / 3 * 2),
91
+ indices: new Uint32Array(indexCounter),
92
+
93
+ };
94
+
95
+ if (_pickableState) {
96
+ output.pickIndices = new Float32Array(counter / 3);
97
+ }
98
+ if (_variativeColorsOnState) {
99
+ output.variativeColors = new Float32Array(counter / 3 * 4);
100
+ }
101
+
102
+ let currentVertexOffset = 0;
103
+ let indexOffset = 0;
104
+ for (const result of results) {
105
+ output.vec3s.set(result.vec3s, currentVertexOffset);
106
+ output.longLats.set(result.longLats, (currentVertexOffset / 3) * 2);
107
+ output.indices.set(result.indices.map(i => i + currentVertexOffset / 3), indexOffset);
108
+ currentVertexOffset += result.vec3s.length;
109
+ indexOffset += result.indices.length;
110
+ if (_pickableState) {
111
+ const subArray = output.pickIndices.subarray(currentVertexOffset / 3 - result.vec3s.length / 3, currentVertexOffset / 3);
112
+ subArray.fill(result.pickIndex);
113
+ }
114
+ if (_variativeColorsOnState && result.variativeColors) {
115
+ const vertexCount = result.vec3s.length / 3;
116
+ const colorStartIndex = (currentVertexOffset / 3 - vertexCount) * 4;
117
+ for (let i = 0; i < vertexCount; i++) {
118
+ const offset = colorStartIndex + i * 4;
119
+ output.variativeColors[offset] = result.variativeColors[0];
120
+ output.variativeColors[offset + 1] = result.variativeColors[1];
121
+ output.variativeColors[offset + 2] = result.variativeColors[2];
122
+ output.variativeColors[offset + 3] = result.variativeColors[3];
123
+ }
124
+ }
125
+ }
126
+
127
+ const buffers = [
128
+ output.vec3s.buffer,
129
+ output.indices.buffer,
130
+ output.longLats.buffer,
131
+ ];
132
+ if (pickableState && output.pickIndices) {
133
+ buffers.push(output.pickIndices.buffer);
134
+ }
135
+ if (_variativeColorsOnState && output.variativeColors) {
136
+ buffers.push(output.variativeColors.buffer);
137
+ }
138
+ // eslint-disable-next-line no-restricted-globals
139
+ self.postMessage(output,
140
+ buffers);
141
+ } catch (error) {
142
+ console.error('Error in worker:', error);
143
+
144
+ // self.postMessage({ error: error.message || 'Unknown error in worker' });
145
+ }
146
+ };
@@ -0,0 +1,90 @@
1
+ # Requirements
2
+
3
+ - webgl program
4
+ - interaction with globe elevation api
5
+ - mesh algorithm
6
+
7
+
8
+ # WEBGL PROGRAM
9
+
10
+ Triangles with Webgl picking. Program can have color hightlighting too for selected item.
11
+
12
+ # Interation with Globe Elevation API
13
+
14
+ Elevation resolution is based on camera and focus positions.
15
+ Instead of blindly ask for elevation of coordinates, what else can be done?
16
+
17
+ ## 1. Server side solution
18
+ A detailed version can be requested from server. Server create mesh. The mesh preferably high resolution.
19
+ Therefore zoom level and camera information is no longer parameters.
20
+
21
+ On edit mod the change is on fly. Server probably cannot catch the speed of spontanius editting. On this case less detailed mesh can be
22
+ processed be client side. One edit finished, client asks for detailed final version.
23
+
24
+ **Criterias:** Visual compatibility with Globe surface, Performance, Memory, Web Traffic(maybe opening a mesh server at backand)
25
+
26
+ # Mesh Algorithm & Data Structure
27
+
28
+ olygon to elevation mesh
29
+
30
+ Data structure would be points and indexes.
31
+
32
+ Adaptors employed to convert user input to desired ınput.
33
+
34
+ Flat version of mesh can be build on front end if possible
35
+
36
+
37
+
38
+ ***********
39
+
40
+
41
+ [-] Mesh algorthm concave
42
+ [-] triangle plugin with gpu picking. input ( key, mesh (Variative size ?) , color,)
43
+
44
+
45
+ --------
46
+
47
+ # Loading DEM to texture array
48
+
49
+ There is 6 Tiles with dem in an instance of time.
50
+
51
+ These 6 tiles can be loaded to gpu as texture[6].
52
+ And 6 bbox can be loaded as vec4[6] rgba -> ur lr rl ll
53
+ Each vertex finds which tile they are blonged to, and calculate dem from points relative position to their bbox
54
+ If a vertex is not inside of a tile elevation is Zero.
55
+
56
+ ****
57
+
58
+ Taking interseption between points of six tile ( 5 * 5 * 6 ) and polygons will give necessery points.
59
+
60
+ In theory, That way we can contract polygon mesh that fits the Elevation model perfectly with minimal count of points.
61
+
62
+ {
63
+ If 'tiles' are not spontaninus. ve can predefine meshes acounding to current zoom level. If zoom level changes the shapes inside visibility bbox will be updated.
64
+ }
65
+
66
+
67
+
68
+ Hasana sorular
69
+
70
+ Ekrana yüklenen ekrandaki yükseklikler merkez baz alınarak 6 tane
71
+
72
+ 5 * 5 * 6 ?
73
+
74
+ bir anda sadece 6 tile in yükseikli ile mi çizim yapılmakta ?
75
+
76
+
77
+ GLOBA bunları bboxları ile alabileceğim bir method çıkabilir miyiz?
78
+
79
+ Dönen istekleri alabileceğim
80
+
81
+ --
82
+
83
+ Hasan ile konuştum.
84
+
85
+
86
+ ---
87
+
88
+ mesh
89
+
90
+ try mapbox delunay
@@ -0,0 +1,265 @@
1
+ import { WorkerContact } from "./data/worker-contact";
2
+ import { TextureDemTriangles } from "../../../programs/polygon-on-globe/texture-dem-triangles";
3
+ import { Globe, DrawRangeIndexParams, UBOHandler, DrawRange } from "../../../types";
4
+ import { noRegisterGlobeProgramCache } from "../../../programs/programcache";
5
+ import { PolygonInput, PolygonPluginInput } from "./types";
6
+ import { PickerDisplayer } from "../../../util/picking/picker-displayer";
7
+ import { IndexPolygonMap } from "./data/index-polygon-map";
8
+ import { WorkerOutput, TerrainPolygonOptions } from "./types";
9
+
10
+ export class TerrainPolygonSemiPlugin {
11
+ id: string;
12
+ globe: Globe = null as any;
13
+ private _options: TerrainPolygonOptions = {
14
+ pickable: false,
15
+ variativeColorsOn: false,
16
+ defaultColor: [0.5, 0.5, 1, 1],
17
+ pickedColor: [1, 0, 0, 1],
18
+ opacity: 1.0,
19
+ showTesselationPoints: false,
20
+ };
21
+ private _workerContact: WorkerContact = null as any;
22
+ private _program: TextureDemTriangles = null as any;
23
+ private _pickerDisplayer: PickerDisplayer | null = null;
24
+ private _indexPolygonMap: IndexPolygonMap = new IndexPolygonMap();
25
+ private _lastPickedPolygon: PolygonPluginInput | null = null;
26
+ private _elementArrayBuffer: WebGLBuffer = null as any;
27
+ private _vec3Buffer: WebGLBuffer = null as any;
28
+ private _pickIndexBuffer: WebGLBuffer | null = null;
29
+ private _variativeColorBuffer: WebGLBuffer = null as any;
30
+ private _mercatorXYBuffer: WebGLBuffer = null as any;
31
+ private _vao: WebGLVertexArrayObject = null as any;
32
+ private _uboHandler: UBOHandler = null as any;
33
+
34
+ private _drawPointsRangeIndexParams: DrawRangeIndexParams = {
35
+ drawRange: {
36
+ first: 0,
37
+ count: 0,
38
+ },
39
+ drawMode: WebGL2RenderingContext.POINTS,
40
+ elementBufferIndexType: WebGL2RenderingContext.UNSIGNED_INT,
41
+ elementBuffer: WebGLBuffer = null as any,
42
+ };
43
+
44
+ private _drawRangeIndexParams: DrawRangeIndexParams = {
45
+ drawRange: {
46
+ first: 0,
47
+ count: 0,
48
+ },
49
+ drawMode: WebGL2RenderingContext.TRIANGLES,
50
+ elementBufferIndexType: WebGL2RenderingContext.UNSIGNED_INT,
51
+ elementBuffer: WebGLBuffer = null as any,
52
+ };
53
+
54
+ constructor(id: string, options: Partial<TerrainPolygonOptions> = {}) {
55
+ this.id = id;
56
+ this._options = { ...this._options, ...options };
57
+ };
58
+
59
+
60
+ init(globe: Globe, gl: WebGL2RenderingContext) {
61
+ this.globe = globe;
62
+
63
+ this._drawRangeIndexParams.drawMode = globe.gl.TRIANGLES;
64
+ this._drawRangeIndexParams.elementBufferIndexType = globe.gl.UNSIGNED_INT
65
+
66
+ this._program = noRegisterGlobeProgramCache.getProgram(this.globe, TextureDemTriangles);
67
+ this._elementArrayBuffer = gl.createBuffer();
68
+ this._vec3Buffer = gl.createBuffer();
69
+ this._mercatorXYBuffer = gl.createBuffer();
70
+
71
+ this._uboHandler = this._program.createUBO();
72
+ this._uboHandler.updateSingle("opacity", new Float32Array([this._options.opacity]));
73
+ this._uboHandler.updateSingle("defaultColor", new Float32Array(this._options.defaultColor));
74
+
75
+ if (this._options.pickable) {
76
+ this._pickIndexBuffer = gl.createBuffer();
77
+ this._pickerDisplayer = new PickerDisplayer(this.globe, "R32I");
78
+ this._uboHandler.updateSingle("private_isPickedOn", new Float32Array([1.0]));
79
+ this._uboHandler.updateSingle("pickedColor", new Float32Array(this._options.pickedColor));
80
+ }
81
+
82
+ if (this._options.variativeColorsOn) {
83
+ this._variativeColorBuffer = gl.createBuffer();
84
+ }
85
+
86
+ this._vao = this._program.createVAO({
87
+ offset: 0,
88
+ stride: 0,
89
+ buffer: this._vec3Buffer
90
+ }, {
91
+ offset: 0,
92
+ stride: 0,
93
+ buffer: this._mercatorXYBuffer
94
+ }, this._options.pickable ? {
95
+ offset: 0,
96
+ stride: 0,
97
+ buffer: this._pickIndexBuffer!
98
+ } : undefined,
99
+ this._options.variativeColorsOn ? {
100
+ offset: 0,
101
+ stride: 0,
102
+ buffer: this._variativeColorBuffer!
103
+ } : undefined
104
+ );
105
+
106
+
107
+ this._drawRangeIndexParams.elementBuffer = this._elementArrayBuffer;
108
+ this._workerContact = new WorkerContact(this.globe, this._options, (result: WorkerOutput) => {
109
+ // console.log('TerrainPolygonSemiPlugin received data from worker', result);
110
+ this.setBuffers(result);
111
+ });
112
+ this._drawRangeIndexParams.elementBuffer = this._elementArrayBuffer;
113
+ this._drawPointsRangeIndexParams.elementBuffer = this._elementArrayBuffer;
114
+ }
115
+
116
+
117
+ insertBulk(polygons: PolygonPluginInput[]) {
118
+ // if (this._indexPolygonMap) {
119
+ polygons = this._indexPolygonMap.insertBulk(polygons);
120
+ // }
121
+ this._workerContact.insertBulk(polygons as PolygonInput[]);
122
+ }
123
+
124
+ deleteBulk(keys: string[]) {
125
+ this._workerContact.deleteBulk(keys);
126
+ this._indexPolygonMap.deleteBulk(keys);
127
+ }
128
+
129
+
130
+
131
+ setUniform(name: string, value: any) {
132
+ // check options have the key name
133
+ if (name.startsWith("private_")) {
134
+ throw new Error(`Cannot set private uniform ${name}`);
135
+ }
136
+ if (this._options.hasOwnProperty(name)) {
137
+ if ((this._options as any)[name] === value) {
138
+ return;
139
+ }
140
+ (this._options as any)[name] = value;
141
+ }
142
+ this._uboHandler.updateSingle(name, value);
143
+ this.globe.DrawRender();
144
+ }
145
+
146
+ setOpacity(opacity: number) {
147
+ if (this._options.opacity !== opacity) {
148
+ this._options.opacity = opacity;
149
+ this._uboHandler.updateSingle("opacity", new Float32Array([opacity]));
150
+ this.globe.DrawRender();
151
+ }
152
+ }
153
+
154
+ setBuffers(data: WorkerOutput) {
155
+ console.log("TerrainPolygonSemiPlugin updating buffers", data.indices.length / 3, "triangles");
156
+ const gl = this.globe.gl as WebGL2RenderingContext;
157
+
158
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._elementArrayBuffer);
159
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data.indices, gl.STREAM_DRAW);
160
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._vec3Buffer);
161
+ gl.bufferData(gl.ARRAY_BUFFER, data.vec3s, gl.STREAM_DRAW);
162
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._mercatorXYBuffer);
163
+ gl.bufferData(gl.ARRAY_BUFFER, data.longLats, gl.STREAM_DRAW);
164
+ if (this._options.pickable) {
165
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._pickIndexBuffer);
166
+ gl.bufferData(gl.ARRAY_BUFFER, data.pickIndices, gl.STREAM_DRAW);
167
+ }
168
+ if (this._options.variativeColorsOn) {
169
+ gl.bindBuffer(gl.ARRAY_BUFFER, this._variativeColorBuffer);
170
+ gl.bufferData(gl.ARRAY_BUFFER, data.variativeColors!, gl.STREAM_DRAW);
171
+ }
172
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
173
+ this._drawRangeIndexParams.drawRange.count = data.indices.length;
174
+ this._drawPointsRangeIndexParams.drawRange.count = data.indices.length;
175
+ this.globe.DrawRender();
176
+ }
177
+
178
+ getPickedPolygon(): PolygonPluginInput | null {
179
+ if (this._options.pickable === false) {
180
+ throw new Error("TerrainPolygonSemiPlugin is not pickable. Set pickable option to true on construction to enable picking.");
181
+ }
182
+ return this._lastPickedPolygon;
183
+ }
184
+
185
+
186
+ _selfSelect() {
187
+ const { globe, _pickerDisplayer } = this;
188
+ const pos = globe.api_GetMousePos();
189
+ const x = pos.canvasX;
190
+ const y = globe.api_ScrH() - pos.canvasY;
191
+ _pickerDisplayer!.pickXY(x, y, 0, (selectedIDsSet) => {
192
+ if (selectedIDsSet.size > 0) {
193
+ const selectedID = Array.from(selectedIDsSet)[0];
194
+ const newPolygon = this._indexPolygonMap.get(selectedID) || null;
195
+ if (newPolygon !== this._lastPickedPolygon) {
196
+ this._lastPickedPolygon = newPolygon;
197
+ globe.DrawRender();
198
+ this._uboHandler.updateSingle("private_pickedIndex", new Float32Array([selectedID]));
199
+ }
200
+ } else {
201
+ if (this._lastPickedPolygon !== null) {
202
+ this._lastPickedPolygon = null;
203
+ globe.DrawRender();
204
+ this._uboHandler.updateSingle("private_pickedIndex", new Float32Array([-1]));
205
+ }
206
+ }
207
+ })
208
+ }
209
+
210
+
211
+
212
+ clear() {
213
+ this._workerContact.clear();
214
+ this._indexPolygonMap.clear();
215
+ }
216
+
217
+ // GLOBE API INTERACTION METHODS
218
+
219
+ resize() {
220
+ if (this._options.pickable) {
221
+ this._pickerDisplayer?.resize();
222
+ }
223
+ }
224
+
225
+ draw3D() {
226
+ const gl = this.globe.gl as WebGL2RenderingContext;
227
+ gl.disable(gl.DEPTH_TEST);
228
+
229
+ // drawPoints
230
+ if (this._options.showTesselationPoints) {
231
+ this._program.draw(
232
+ this._vao,
233
+ this._drawPointsRangeIndexParams,
234
+ this._uboHandler);
235
+ }
236
+
237
+ if (this._pickerDisplayer) {
238
+ this._pickerDisplayer.bindFBO();
239
+ this._pickerDisplayer.clearTextures();
240
+ // gl.enable(gl.DEPTH_TEST);
241
+ } else {
242
+ // gl.disable(gl.DEPTH_TEST);
243
+ }
244
+ gl.frontFace(gl.CW);
245
+ this._program.draw(
246
+ this._vao,
247
+ this._drawRangeIndexParams,
248
+ this._uboHandler);
249
+ gl.frontFace(gl.CCW);
250
+
251
+ if (this._pickerDisplayer) {
252
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
253
+ this._pickerDisplayer.drawColorTexture();
254
+ this._selfSelect();
255
+ }
256
+ gl.enable(gl.DEPTH_TEST);
257
+
258
+ }
259
+
260
+ free() {
261
+ this._workerContact.free();
262
+ noRegisterGlobeProgramCache.releaseProgram(this.globe, TextureDemTriangles);
263
+
264
+ }
265
+ }
@@ -0,0 +1,69 @@
1
+
2
+ /**
3
+ * @module WebGLobePlugins/SemiPlugins/ShapeOnTerrain/TerrainPolygon
4
+ * @description
5
+ * Type definitions for TerrainPolygon plugin
6
+ * /
7
+ *
8
+ */
9
+
10
+ import { Color } from "../../../types";
11
+
12
+
13
+ /**
14
+ * @type PolygonInput
15
+ * @description
16
+ * Represents the input structure for defining a polygon on terrain.
17
+ * Position starts with the shell vertices followed by hole vertices.
18
+ * @param vertices - A flat array of vertex coordinates (e.g., [x1, y1, x2, y2, ...]).
19
+ * @param holes - An array of indices indicating the start of each hole in the positions array.
20
+ * @param dimensions - The number of dimensions for each vertex (typically 2 for 2D coordinates).
21
+ */
22
+ export type PolygonPluginInput = {
23
+ key: string;
24
+ geometry: { vertices: number[]; holes: number[] }[]
25
+ color?: Color;
26
+ };
27
+
28
+ export type TerrainPolygonOptions = {
29
+ pickable: boolean;
30
+ variativeColorsOn: boolean;
31
+ defaultColor: Color;
32
+ pickedColor: Color;
33
+ opacity: number;
34
+ showTesselationPoints: boolean;
35
+ pickedCallback?: (polygon: PolygonPluginInput | null) => void;
36
+ }
37
+
38
+ export type PolygonInput = PolygonPluginInput & { index: number };
39
+
40
+
41
+
42
+ export type TrianglesMiddleData = {
43
+ key: string;
44
+ vertices: number[];
45
+ indices: number[];
46
+ }
47
+
48
+ export type BBOXZOOMDATA = {
49
+ minX: number,
50
+ minY: number,
51
+ maxX: number,
52
+ maxY: number,
53
+ zoom: number
54
+ }[];
55
+
56
+ export type WorkerInput = {
57
+ pickableState: boolean | undefined;
58
+ variativeColorsOn: boolean | undefined;
59
+ bboxes: BBOXZOOMDATA | null | undefined;
60
+ insertDeleteQueue: (PolygonPluginInput | string)[] | null | undefined;
61
+ };
62
+
63
+ export type WorkerOutput = {
64
+ vec3s: Float32Array;
65
+ indices: Uint32Array;
66
+ longLats: Float32Array;
67
+ pickIndices: Float32Array | null;
68
+ variativeColors: Float32Array | null;
69
+ };
@@ -0,0 +1,2 @@
1
+ import { BBOXGlobeShell } from './object'
2
+ export { BBOXGlobeShell };