@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,200 +1,275 @@
1
- import { PieceOfPieProgramCache } from "../../programs/rings/partial-ring/piece-of-pie";
2
- import { BufferManager, BufferOrchestrator } from "../../util/account/single-attribute-buffer-management/index";
3
- import { sphereCoord } from "../../util/geometry/index";
4
- import { opacityCheck } from "../../util/check/typecheck";
5
- const INITIAL_CAPACITY = 10; // Initial capacity for the buffer orchestrator
6
- const EDGE_COUNT = 100; // Number of edges for the pie chart
7
- const Radians = Math.PI / 180; // Conversion factor from degrees to radians
8
- export class PieceOfPiePlugin {
9
- id;
10
- _isFreed = false;
11
- globe = null;
12
- gl = null;
13
- program = null;
14
- vao = null;
15
- bufferManagersMap = null;
16
- bufferOrchestrator = new BufferOrchestrator({ capacity: INITIAL_CAPACITY });
17
- drawMode = "BOTH";
18
- _uboHandler = null;
19
- _pluginOptions = {
20
- bufferType: "STATIC_DRAW",
21
- initialCapacity: INITIAL_CAPACITY,
22
- opacity: 1.0, // Default opacity is 1.0
23
- defaultHeightFromGroundIn3D: 0, // Default altitude is ground level
24
- defaultColor: [1, 1, 1, 1], // Default color is white with full opacity
25
- variativeColorsOn: false, // Default is to not use variative colors
26
- };
27
- constructor(id, options = null) {
28
- this.id = id;
29
- if (options) {
30
- this._pluginOptions = {
31
- ...this._pluginOptions,
32
- ...options
33
- };
34
- }
35
- }
36
- insertBulk(items) {
37
- this.bufferOrchestrator.insertBulk(items, this.bufferManagersMap);
38
- this.globe?.DrawRender();
39
- }
40
- deleteBulk(keys) {
41
- this.bufferOrchestrator.deleteBulk(keys, this.bufferManagersMap);
42
- this.globe?.DrawRender();
43
- }
44
- setPluginOpacity(opacity, drawRender = true) {
45
- opacityCheck(opacity);
46
- this._uboHandler?.updateSingle("u_opacity", new Float32Array([opacity]));
47
- if (drawRender) {
48
- this.globe?.DrawRender();
49
- }
50
- }
51
- setDrawMode(drawMode) {
52
- if (drawMode !== "TRIANGLE_FAN" && drawMode !== "LINE_STRIP" && drawMode !== "BOTH") {
53
- throw new Error("Invalid draw mode. Use 'TRIANGLE_FAN' or 'LINE_STRIP'.");
54
- }
55
- this.drawMode = drawMode;
56
- this.globe?.DrawRender();
57
- }
58
- setDefaultColor(color) {
59
- if (this._isFreed) {
60
- console.warn("PieceOfPiePlugin is freed, cannot set default color.");
61
- return;
62
- }
63
- if (!Array.isArray(color) || color.length !== 4) {
64
- throw new Error("Color must be an array of 4 numbers [R, G, B, A].");
65
- }
66
- this._uboHandler?.updateSingle("u_color", new Float32Array(color));
67
- this.globe?.DrawRender();
68
- }
69
- _createBufferManagersMap() {
70
- const { gl, globe, _pluginOptions } = this;
71
- const { bufferType, initialCapacity } = _pluginOptions;
72
- if (!gl || !globe) {
73
- throw new Error("Globe and WebGL context must be initialized before creating buffer management map.");
74
- }
75
- const bufferManagersMap = new Map([
76
- ["centerCoords2d", {
77
- bufferManager: new BufferManager(this.gl, 2, { bufferType: bufferType, initialCapacity }),
78
- adaptor: (item) => new Float32Array(globe.api_GetMercator2DPoint(item.center[0], item.center[1])),
79
- }],
80
- ["centerCoords3d", {
81
- bufferManager: new BufferManager(gl, 3, { bufferType, initialCapacity }),
82
- adaptor: (item) => sphereCoord(item.center[0], item.center[1], globe, (item.altitude ?? this._pluginOptions.defaultHeightFromGroundIn3D) / 1000)
83
- }],
84
- ["startAngle2d", {
85
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
86
- adaptor: (item) => {
87
- if (item.startAngle2D === undefined) {
88
- return new Float32Array([0]); // Default angle if not provided
89
- }
90
- return new Float32Array([(item.startAngle2D) * Radians]);
91
- }
92
- }],
93
- ["tailAngle2d", {
94
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
95
- adaptor: (item) => {
96
- if (item.coverAngle2D === undefined) {
97
- return new Float32Array([0]); // Default angle if not provided
98
- }
99
- return new Float32Array([item.coverAngle2D * Radians]);
100
- }
101
- }],
102
- ["startAngle3d", {
103
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
104
- adaptor: (item) => {
105
- if (item.startAngle3D === undefined) {
106
- return new Float32Array([0]); // Default angle if not provided
107
- }
108
- return new Float32Array([item.startAngle3D * Radians]);
109
- }
110
- }],
111
- ["tailAngle3d", {
112
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
113
- adaptor: (item) => {
114
- if (item.coverAngle3D === undefined) {
115
- return new Float32Array([0]); // Default angle if not provided
116
- }
117
- return new Float32Array([item.coverAngle3D * Radians]);
118
- }
119
- }],
120
- ["fillingMode", {
121
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
122
- adaptor: (item) => new Float32Array([item.fillingMode ?? 0])
123
- }],
124
- ["radius", {
125
- bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
126
- adaptor: (item) => new Float32Array([item.radius])
127
- }],
128
- ]);
129
- if (this._pluginOptions.variativeColorsOn) {
130
- bufferManagersMap.set("rgba", {
131
- bufferManager: new BufferManager(gl, 4, { bufferType, initialCapacity }),
132
- adaptor: (item) => {
133
- if (!item.color || item.color.length === 0) {
134
- return new Float32Array([1, 1, 1, 1]); // Default color if none provided
135
- }
136
- return new Float32Array(item.color);
137
- }
138
- });
139
- }
140
- this.bufferManagersMap = bufferManagersMap;
141
- }
142
- init(globe, gl) {
143
- this.globe = globe;
144
- this.gl = gl;
145
- this.program = PieceOfPieProgramCache.get(globe);
146
- this._createBufferManagersMap();
147
- this.vao = this.program.createVAO(
148
- //@ts-ignore
149
- ...['centerCoords2d',
150
- 'centerCoords3d',
151
- 'startAngle2d',
152
- 'tailAngle2d',
153
- 'startAngle3d',
154
- 'tailAngle3d',
155
- 'rgba',
156
- 'radius',
157
- 'fillingMode'].map((name) => {
158
- if (!this.bufferManagersMap?.has(name)) {
159
- return null; // this make vao with default attribute value with no buffer bound to it
160
- }
161
- const buffer = this.bufferManagersMap?.get(name)?.bufferManager.buffer;
162
- return {
163
- buffer: buffer,
164
- stride: 0,
165
- offset: 0,
166
- };
167
- }));
168
- this._uboHandler = this.program.createUBO();
169
- this._uboHandler.updateSingle("u_color", new Float32Array(this._pluginOptions.defaultColor));
170
- this._uboHandler.updateSingle("u_opacity", new Float32Array([this._pluginOptions.opacity ?? 1.0])); // Default opacity is 1.0
171
- }
172
- draw3D() {
173
- if (!this.gl || !this.program || !this.vao || !this.globe) {
174
- console.warn("PieChartPlugin is not initialized properly Or unregistered from globe.");
175
- return;
176
- }
177
- const length = this.bufferOrchestrator.length;
178
- this.gl.disable(this.gl.DEPTH_TEST);
179
- if (this.drawMode === "BOTH") {
180
- this.program?.draw(length, this.vao, EDGE_COUNT, "LINE_STRIP", this._uboHandler);
181
- this.program?.draw(length, this.vao, EDGE_COUNT, "TRIANGLE_FAN", this._uboHandler);
182
- }
183
- else {
184
- this.program?.draw(length, this.vao, EDGE_COUNT, this.drawMode, this._uboHandler);
185
- }
186
- this.gl.enable(this.gl.DEPTH_TEST);
187
- }
188
- free() {
189
- if (this._isFreed) {
190
- console.warn("PieChartPlugin is already freed.");
191
- return;
192
- }
193
- PieceOfPieProgramCache.release(this.globe);
194
- this.gl?.deleteVertexArray(this.vao);
195
- this._isFreed = true;
196
- this.globe = null;
197
- this.gl = null;
198
- this.program = null;
199
- }
200
- }
1
+ import { Globe, Meter, PluginInterface, Color, BUFFER_TYPE, BufferAndReadInfo, UBOHandler, LongLatDegree } from "../../types";
2
+ import { PieceOfPieProgramCache, Logic, DrawMode } from "../../programs/rings/partial-ring/piece-of-pie";
3
+ import { BufferManagersMap, BufferManager, BufferOrchestrator } from "../../util/account/single-attribute-buffer-management/index";
4
+ import { sphereCoord } from "../../util/geometry/index";
5
+ import { opacityCheck } from "../../util/check/typecheck";
6
+ import { CentigradeDegree } from "../../types";
7
+
8
+
9
+ const INITIAL_CAPACITY = 10; // Initial capacity for the buffer orchestrator
10
+ const EDGE_COUNT = 100; // Number of edges for the pie chart
11
+ const Radians = Math.PI / 180; // Conversion factor from degrees to radians
12
+
13
+ export type FillingMode = 0 | 1 | 2; // 0: constant, 1: fading, 2: hide
14
+ export type DrawModePlugin = DrawMode | "BOTH";
15
+
16
+
17
+
18
+ export type PieceOfPiePluginOptions = {
19
+ defaultHeightFromGroundIn3D: Meter; // Default altitude for the pie chart
20
+ bufferType: BUFFER_TYPE; // Type of buffer to use
21
+ initialCapacity: number; // Initial capacity for the buffer orchestrator
22
+ defaultColor: Color; // Default color for the pie chart
23
+ variativeColorsOn: boolean; // Whether to use variative colors
24
+ opacity: number; // Opacity of the pie chart
25
+ }
26
+
27
+
28
+ export type PieceOfPiePluginInput = {
29
+ key: string;
30
+ center: LongLatDegree;
31
+ radius: Meter;
32
+ startAngle2D?: CentigradeDegree; // in radians
33
+ startAngle3D?: CentigradeDegree; // in radians
34
+ coverAngle2D?: CentigradeDegree; // in radians
35
+ coverAngle3D?: CentigradeDegree; // in radians
36
+ altitude?: Meter;
37
+ fillingMode?: FillingMode;
38
+ color?: Color;
39
+ }
40
+
41
+
42
+ export class PieceOfPiePlugin implements PluginInterface {
43
+ id: string;
44
+ private _isFreed: boolean = false;
45
+ globe: Globe | null = null;
46
+ private gl: WebGL2RenderingContext | null = null;
47
+ private program: Logic | null = null;
48
+ private vao: WebGLVertexArrayObject | null = null;
49
+ private bufferManagersMap: BufferManagersMap | null = null;
50
+ private bufferOrchestrator: BufferOrchestrator = new BufferOrchestrator({ capacity: INITIAL_CAPACITY });
51
+ private drawMode: DrawModePlugin = "BOTH";
52
+ private _uboHandler: UBOHandler | null = null;
53
+
54
+ private _pluginOptions: PieceOfPiePluginOptions = {
55
+ bufferType: "STATIC_DRAW",
56
+ initialCapacity: INITIAL_CAPACITY,
57
+ opacity: 1.0, // Default opacity is 1.0
58
+ defaultHeightFromGroundIn3D: 0, // Default altitude is ground level
59
+ defaultColor: [1, 1, 1, 1], // Default color is white with full opacity
60
+ variativeColorsOn: false, // Default is to not use variative colors
61
+ };
62
+ constructor(
63
+ id: string,
64
+ options: Partial<PieceOfPiePluginOptions> | null = null
65
+ ) {
66
+ this.id = id;
67
+ if (options) {
68
+ this._pluginOptions = {
69
+ ...this._pluginOptions,
70
+ ...options
71
+ };
72
+ }
73
+ }
74
+
75
+
76
+ insertBulk(items: PieceOfPiePluginInput[]): void {
77
+
78
+ this.bufferOrchestrator.insertBulk(items, this.bufferManagersMap as BufferManagersMap);
79
+ this.globe?.DrawRender();
80
+ }
81
+
82
+
83
+ deleteBulk(keys: string[]): void {
84
+ this.bufferOrchestrator.deleteBulk(keys, this.bufferManagersMap as BufferManagersMap);
85
+ this.globe?.DrawRender();
86
+ }
87
+
88
+
89
+ setPluginOpacity(opacity: number, drawRender: boolean = true): void {
90
+ opacityCheck(opacity);
91
+ this._uboHandler?.updateSingle("u_opacity", new Float32Array([opacity]));
92
+ if (drawRender) {
93
+ this.globe?.DrawRender();
94
+ }
95
+ }
96
+
97
+ setDrawMode(drawMode: DrawMode): void {
98
+ if (drawMode !== "TRIANGLE_FAN" && drawMode !== "LINE_STRIP" && drawMode !== "BOTH") {
99
+ throw new Error("Invalid draw mode. Use 'TRIANGLE_FAN' or 'LINE_STRIP'.");
100
+ }
101
+ this.drawMode = drawMode;
102
+ this.globe?.DrawRender();
103
+ }
104
+
105
+
106
+ setDefaultColor(color: Color): void {
107
+ if (this._isFreed) {
108
+ console.warn("PieceOfPiePlugin is freed, cannot set default color.");
109
+ return;
110
+ }
111
+ if (!Array.isArray(color) || color.length !== 4) {
112
+ throw new Error("Color must be an array of 4 numbers [R, G, B, A].");
113
+ }
114
+ this._uboHandler?.updateSingle("u_color", new Float32Array(color));
115
+ this.globe?.DrawRender();
116
+ }
117
+
118
+
119
+ _createBufferManagersMap(): void {
120
+ const { gl, globe, _pluginOptions } = this;
121
+ const { bufferType, initialCapacity } = _pluginOptions;
122
+ if (!gl || !globe) {
123
+ throw new Error("Globe and WebGL context must be initialized before creating buffer management map.");
124
+ }
125
+
126
+ const bufferManagersMap: BufferManagersMap = new Map(
127
+ [
128
+ ["centerCoords2d", {
129
+ bufferManager: new BufferManager(
130
+ this.gl as WebGL2RenderingContext,
131
+ 2,
132
+ { bufferType: bufferType, initialCapacity }
133
+ ),
134
+ adaptor: (item: PieceOfPiePluginInput) => new Float32Array(
135
+ globe.api_GetMercator2DPoint(item.center[0], item.center[1])
136
+ ),
137
+ }],
138
+ ["centerCoords3d", {
139
+ bufferManager: new BufferManager(gl, 3, { bufferType, initialCapacity }),
140
+ adaptor: (item: PieceOfPiePluginInput) => sphereCoord(
141
+ item.center[0], item.center[1],
142
+ globe,
143
+ (item.altitude ?? this._pluginOptions.defaultHeightFromGroundIn3D) / 1000
144
+ )
145
+ }],
146
+ ["startAngle2d", {
147
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
148
+ adaptor: (item: PieceOfPiePluginInput) => {
149
+ if (item.startAngle2D === undefined) {
150
+ return new Float32Array([0]); // Default angle if not provided
151
+ }
152
+ return new Float32Array([(item.startAngle2D) * Radians]);
153
+ }
154
+ }],
155
+ ["tailAngle2d", {
156
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
157
+ adaptor: (item: PieceOfPiePluginInput) => {
158
+ if (item.coverAngle2D === undefined) {
159
+ return new Float32Array([0]); // Default angle if not provided
160
+ }
161
+ return new Float32Array([item.coverAngle2D * Radians]);
162
+ }
163
+ }],
164
+ ["startAngle3d", {
165
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
166
+ adaptor: (item: PieceOfPiePluginInput) => {
167
+ if (item.startAngle3D === undefined) {
168
+ return new Float32Array([0]); // Default angle if not provided
169
+ }
170
+ return new Float32Array([item.startAngle3D * Radians]);
171
+ }
172
+ }],
173
+ ["tailAngle3d", {
174
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
175
+ adaptor: (item: PieceOfPiePluginInput) => {
176
+ if (item.coverAngle3D === undefined) {
177
+ return new Float32Array([0]); // Default angle if not provided
178
+ }
179
+ return new Float32Array([item.coverAngle3D * Radians]);
180
+ }
181
+ }],
182
+ ["fillingMode", {
183
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
184
+ adaptor: (item: PieceOfPiePluginInput) => new Float32Array([item.fillingMode ?? 0])
185
+ }],
186
+
187
+ ["radius", {
188
+ bufferManager: new BufferManager(gl, 1, { bufferType, initialCapacity }),
189
+ adaptor: (item: PieceOfPiePluginInput) => new Float32Array([item.radius])
190
+ }],
191
+ ]
192
+ );
193
+
194
+ if (this._pluginOptions.variativeColorsOn) {
195
+ bufferManagersMap.set("rgba", {
196
+ bufferManager: new BufferManager(gl, 4, { bufferType, initialCapacity }),
197
+ adaptor: (item: PieceOfPiePluginInput) => {
198
+ if (!item.color || item.color.length === 0) {
199
+ return new Float32Array([1, 1, 1, 1]); // Default color if none provided
200
+ }
201
+ return new Float32Array(item.color);
202
+ }
203
+ }
204
+ );
205
+ }
206
+ this.bufferManagersMap = bufferManagersMap;
207
+ }
208
+
209
+
210
+ init(globe: Globe, gl: WebGL2RenderingContext): void {
211
+ this.globe = globe;
212
+ this.gl = gl;
213
+ this.program = PieceOfPieProgramCache.get(globe) as Logic;
214
+ this._createBufferManagersMap();
215
+ this.vao = this.program.createVAO(
216
+ //@ts-ignore
217
+ ...['centerCoords2d',
218
+ 'centerCoords3d',
219
+ 'startAngle2d',
220
+ 'tailAngle2d',
221
+ 'startAngle3d',
222
+ 'tailAngle3d',
223
+ 'rgba',
224
+ 'radius',
225
+ 'fillingMode'].map((name) => {
226
+ if (!this.bufferManagersMap?.has(name)) {
227
+ return null; // this make vao with default attribute value with no buffer bound to it
228
+ }
229
+ const buffer = this.bufferManagersMap?.get(name)?.bufferManager.buffer;
230
+ return {
231
+ buffer: buffer,
232
+ stride: 0,
233
+ offset: 0,
234
+ } as BufferAndReadInfo;
235
+ })
236
+ );
237
+
238
+ this._uboHandler = this.program.createUBO();
239
+ this._uboHandler.updateSingle("u_color", new Float32Array(this._pluginOptions.defaultColor));
240
+ this._uboHandler.updateSingle("u_opacity", new Float32Array([this._pluginOptions.opacity ?? 1.0])); // Default opacity is 1.0
241
+ }
242
+
243
+
244
+
245
+ draw3D(): void {
246
+ if (!this.gl || !this.program || !this.vao || !this.globe) {
247
+ console.warn("PieChartPlugin is not initialized properly Or unregistered from globe.");
248
+ return;
249
+ }
250
+ const length = this.bufferOrchestrator.length;
251
+ this.gl.disable(this.gl.DEPTH_TEST);
252
+ if (this.drawMode === "BOTH") {
253
+ this.program?.draw(length, this.vao, EDGE_COUNT, "LINE_STRIP", this._uboHandler);
254
+ this.program?.draw(length, this.vao, EDGE_COUNT, "TRIANGLE_FAN", this._uboHandler);
255
+ } else {
256
+ this.program?.draw(length, this.vao, EDGE_COUNT, this.drawMode as DrawMode, this._uboHandler);
257
+ }
258
+ this.gl.enable(this.gl.DEPTH_TEST);
259
+ }
260
+
261
+
262
+ free(): void {
263
+ if (this._isFreed) {
264
+ console.warn("PieChartPlugin is already freed.");
265
+ return;
266
+ }
267
+ PieceOfPieProgramCache.release(this.globe as Globe);
268
+ this.gl?.deleteVertexArray(this.vao as WebGLVertexArrayObject);
269
+ this._isFreed = true;
270
+ this.globe = null;
271
+ this.gl = null;
272
+ this.program = null;
273
+ }
274
+
275
+ }