@pirireis/webglobeplugins 1.0.2 → 1.0.3

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 (259) hide show
  1. package/Math/{angle-calculation.ts → angle-calculation.js} +14 -18
  2. package/Math/{arc-cdf-points.ts → arc-cdf-points.js} +272 -329
  3. package/Math/{arc-generate-points-exponantial.ts → arc-generate-points-exponantial.js} +254 -299
  4. package/Math/{arc.ts → arc.js} +292 -421
  5. package/Math/bounds/line-bbox.js +186 -225
  6. package/Math/{circle-cdf-points.ts → circle-cdf-points.js} +78 -143
  7. package/Math/{circle.ts → circle.js} +33 -49
  8. package/Math/{constants.ts → constants.js} +4 -12
  9. package/Math/contour/{quadtreecontours.ts → quadtreecontours.js} +300 -371
  10. package/Math/contour/quadtreecontours1.js +298 -336
  11. package/Math/{finite-line-2d.ts → finite-line-2d.js} +58 -68
  12. package/Math/{haversine.ts → haversine.js} +22 -33
  13. package/Math/index.js +1 -0
  14. package/Math/juction/{arc-plane.ts → arc-plane.js} +143 -203
  15. package/Math/juction/{line-sphere.ts → line-sphere.js} +22 -32
  16. package/Math/juction/{plane-plane.ts → plane-plane.js} +53 -62
  17. package/Math/{line.ts → line.js} +52 -84
  18. package/Math/matrix4.js +1 -0
  19. package/Math/{methods.ts → methods.js} +126 -182
  20. package/Math/{plane.ts → plane.js} +56 -92
  21. package/Math/{quaternion.ts → quaternion.js} +106 -128
  22. package/Math/templete-shapes/{grid-visually-equal.ts → grid-visually-equal.js} +65 -118
  23. package/Math/tessellation/constants.js +1 -0
  24. package/Math/tessellation/{methods.ts → methods.js} +49 -79
  25. package/Math/tessellation/{nearest-value-padding.ts → nearest-value-padding.js} +112 -147
  26. package/Math/tessellation/{spherical-triangle-area.ts → spherical-triangle-area.js} +99 -127
  27. package/Math/tessellation/{tile-merger.ts → tile-merger.js} +429 -578
  28. package/Math/tessellation/{triangle-tessellation.ts → triangle-tessellation.js} +386 -533
  29. package/Math/tessellation/types.js +1 -0
  30. package/Math/types.js +1 -0
  31. package/Math/utils.js +2 -3
  32. package/Math/{vec3.ts → vec3.js} +155 -227
  33. package/Math/{xyz-tile.ts → xyz-tile.js} +18 -26
  34. package/algorithms/search-binary.js +16 -14
  35. package/altitude-locator/adaptors.js +1 -0
  36. package/altitude-locator/keymethod.js +1 -0
  37. package/altitude-locator/plugin.js +344 -445
  38. package/altitude-locator/types.js +21 -26
  39. package/compass-rose/compass-rose-padding-flat.js +230 -274
  40. package/compass-rose/{compass-text-writer.ts → compass-text-writer.js} +155 -210
  41. package/compass-rose/index.js +3 -3
  42. package/{constants.ts → constants.js} +6 -8
  43. package/heatwave/datamanager.js +149 -168
  44. package/heatwave/heatwave.js +206 -261
  45. package/heatwave/index.js +5 -5
  46. package/heatwave/isobar.js +303 -340
  47. package/heatwave/{texture-point-sampler.ts → texture-point-sampler.js} +187 -220
  48. package/investigation-tools/draw/tiles/adapters.js +67 -0
  49. package/investigation-tools/draw/tiles/{tiles.ts → tiles.js} +128 -162
  50. package/jest.config.js +7 -6
  51. package/package.json +1 -1
  52. package/pin/pin-object-array1.js +300 -381
  53. package/pin/pin-point-totem1.js +60 -77
  54. package/programs/arrowfield/arrow-field.js +60 -89
  55. package/programs/arrowfield/logic.js +141 -173
  56. package/programs/data2legend/density-to-legend.js +68 -86
  57. package/programs/data2legend/point-to-density-texture.js +67 -84
  58. package/programs/float2legendwithratio/index.js +2 -3
  59. package/programs/float2legendwithratio/logic.js +118 -144
  60. package/programs/float2legendwithratio/object.js +104 -141
  61. package/programs/helpers/blender.js +58 -73
  62. package/programs/helpers/{fadeaway.ts → fadeaway.js} +60 -73
  63. package/programs/index.js +20 -19
  64. package/programs/line-on-globe/circle-accurate-3d.js +85 -112
  65. package/programs/line-on-globe/circle-accurate-flat.js +148 -200
  66. package/programs/line-on-globe/degree-padding-around-circle-3d.js +102 -134
  67. package/programs/line-on-globe/index.js +1 -0
  68. package/programs/line-on-globe/lines-color-instanced-flat.js +80 -99
  69. package/programs/line-on-globe/linestrip/data.js +4 -0
  70. package/programs/line-on-globe/linestrip/{linestrip.ts → linestrip.js} +93 -152
  71. package/programs/line-on-globe/{naive-accurate-flexible.ts → naive-accurate-flexible.js} +126 -175
  72. package/programs/line-on-globe/util.js +5 -8
  73. package/programs/picking/pickable-polygon-renderer.js +98 -129
  74. package/programs/picking/pickable-renderer.js +98 -130
  75. package/programs/point-on-globe/element-globe-surface-glow.js +93 -122
  76. package/programs/point-on-globe/element-point-glow.js +80 -114
  77. package/programs/point-on-globe/square-pixel-point.js +121 -139
  78. package/programs/polygon-on-globe/{texture-dem-triangles.ts → texture-dem-triangles.js} +163 -207
  79. package/programs/{programcache.ts → programcache.js} +126 -134
  80. package/programs/rings/index.js +1 -1
  81. package/programs/rings/partial-ring/{piece-of-pie.ts → piece-of-pie.js} +152 -222
  82. package/programs/totems/camera-totem-attactment-interface.js +1 -0
  83. package/programs/totems/{camerauniformblock.ts → camerauniformblock.js} +225 -310
  84. package/programs/totems/{canvas-webglobe-info.ts → canvas-webglobe-info.js} +132 -147
  85. package/programs/totems/{dem-textures-manager.ts → dem-textures-manager.js} +257 -360
  86. package/programs/totems/{globe-changes.ts → globe-changes.js} +59 -79
  87. package/programs/totems/gpu-selection-uniform-block.js +99 -127
  88. package/programs/totems/{index.ts → index.js} +2 -2
  89. package/programs/two-d/pixel-padding-for-compass.js +87 -101
  90. package/programs/util.js +14 -19
  91. package/programs/vectorfields/logics/{constants.ts → constants.js} +4 -5
  92. package/programs/vectorfields/logics/{drawrectangleparticles.ts → drawrectangleparticles.js} +80 -115
  93. package/programs/vectorfields/logics/index.js +2 -4
  94. package/programs/vectorfields/logics/particle-ubo.js +16 -0
  95. package/programs/vectorfields/logics/{pixelbased.ts → pixelbased.js} +86 -115
  96. package/programs/vectorfields/logics/ubo.js +51 -57
  97. package/programs/vectorfields/{pingpongbuffermanager.ts → pingpongbuffermanager.js} +99 -113
  98. package/range-tools-on-terrain/bearing-line/{adapters.ts → adapters.js} +114 -154
  99. package/range-tools-on-terrain/bearing-line/{plugin.ts → plugin.js} +457 -569
  100. package/range-tools-on-terrain/bearing-line/types.js +1 -0
  101. package/range-tools-on-terrain/circle-line-chain/{adapters.ts → adapters.js} +85 -104
  102. package/range-tools-on-terrain/circle-line-chain/{chain-list-map.ts → chain-list-map.js} +382 -446
  103. package/range-tools-on-terrain/circle-line-chain/{plugin.ts → plugin.js} +464 -607
  104. package/range-tools-on-terrain/circle-line-chain/types.js +1 -0
  105. package/range-tools-on-terrain/range-ring/{adapters.ts → adapters.js} +93 -114
  106. package/range-tools-on-terrain/range-ring/{enum.ts → enum.js} +2 -2
  107. package/range-tools-on-terrain/range-ring/{plugin.ts → plugin.js} +377 -444
  108. package/range-tools-on-terrain/range-ring/rangeringangletext.js +331 -0
  109. package/range-tools-on-terrain/range-ring/types.js +9 -0
  110. package/semiplugins/interface.js +1 -0
  111. package/semiplugins/lightweight/{line-plugin.ts → line-plugin.js} +221 -342
  112. package/semiplugins/lightweight/{piece-of-pie-plugin.ts → piece-of-pie-plugin.js} +200 -275
  113. package/semiplugins/shape-on-terrain/{arc-plugin.ts → arc-plugin.js} +481 -616
  114. package/semiplugins/shape-on-terrain/{circle-plugin.ts → circle-plugin.js} +444 -588
  115. package/semiplugins/shape-on-terrain/{padding-1-degree.ts → padding-1-degree.js} +539 -713
  116. package/semiplugins/shape-on-terrain/terrain-polygon/{adapters.ts → adapters.js} +55 -69
  117. package/semiplugins/shape-on-terrain/terrain-polygon/data/{cache.ts → cache.js} +102 -149
  118. package/semiplugins/shape-on-terrain/terrain-polygon/data/{index-polygon-map.ts → index-polygon-map.js} +45 -58
  119. package/semiplugins/shape-on-terrain/terrain-polygon/data/{manager.ts → manager.js} +4 -4
  120. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.js +177 -196
  121. package/semiplugins/shape-on-terrain/terrain-polygon/data/{polygon-to-triangles.ts → polygon-to-triangles.js} +100 -144
  122. package/semiplugins/shape-on-terrain/terrain-polygon/data/{random.ts → random.js} +121 -165
  123. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.js +1 -0
  124. package/semiplugins/shape-on-terrain/terrain-polygon/data/{worker-contact.ts → worker-contact.js} +63 -81
  125. package/semiplugins/shape-on-terrain/terrain-polygon/data/worker.js +125 -146
  126. package/semiplugins/shape-on-terrain/terrain-polygon/{terrain-polygon.ts → terrain-polygon.js} +219 -265
  127. package/semiplugins/shape-on-terrain/terrain-polygon/types.js +8 -0
  128. package/semiplugins/shell/bbox-renderer/index.js +2 -0
  129. package/semiplugins/shell/bbox-renderer/{logic.ts → logic.js} +209 -273
  130. package/semiplugins/shell/bbox-renderer/object.js +75 -0
  131. package/semiplugins/type.js +1 -0
  132. package/semiplugins/utility/{container-plugin.ts → container-plugin.js} +94 -126
  133. package/semiplugins/utility/{object-pass-container-plugin.ts → object-pass-container-plugin.js} +80 -101
  134. package/shaders/fragment-toy/firework.js +1 -1
  135. package/shaders/fragment-toy/singularity.js +2 -5
  136. package/tracks/point-heat-map/adaptors/timetracksplugin-format-to-this.js +63 -78
  137. package/tracks/point-heat-map/index.js +1 -0
  138. package/tracks/point-heat-map/plugin-webworker.js +121 -148
  139. package/tracks/point-heat-map/point-to-heat-map-flow.js +121 -150
  140. package/tracks/point-tracks/key-methods.js +2 -3
  141. package/tracks/point-tracks/plugin.js +401 -487
  142. package/tracks/timetracks/adaptors-line-strip.js +65 -79
  143. package/tracks/timetracks/plugin-line-strip.js +240 -295
  144. package/tracks/timetracks/program-line-strip.js +411 -495
  145. package/tracks/timetracks/programpoint-line-strip.js +109 -137
  146. package/types.js +19 -0
  147. package/util/account/bufferoffsetmanager.js +176 -209
  148. package/util/account/create-buffermap-orchastration.js +39 -0
  149. package/util/account/index.js +3 -6
  150. package/util/account/single-attribute-buffer-management/{buffer-manager.ts → buffer-manager.js} +119 -151
  151. package/util/account/single-attribute-buffer-management/{buffer-orchestrator.ts → buffer-orchestrator.js} +212 -238
  152. package/util/account/single-attribute-buffer-management/{buffer-orchestrator1.ts → buffer-orchestrator1.js} +159 -184
  153. package/util/account/single-attribute-buffer-management/{index.ts → index.js} +4 -11
  154. package/util/account/single-attribute-buffer-management/{object-store.ts → object-store.js} +55 -76
  155. package/util/account/single-attribute-buffer-management/types.js +1 -0
  156. package/util/account/util.js +18 -22
  157. package/util/algorithms/index.js +1 -0
  158. package/util/algorithms/search-binary.js +25 -26
  159. package/util/build-strategy/{static-dynamic.ts → static-dynamic.js} +41 -50
  160. package/util/check/index.js +1 -0
  161. package/util/check/typecheck.js +66 -0
  162. package/util/{frame-counter-trigger.ts → frame-counter-trigger.js} +84 -99
  163. package/util/geometry/{index.ts → index.js} +121 -155
  164. package/util/gl-util/buffer/{attribute-loader.ts → attribute-loader.js} +62 -84
  165. package/util/gl-util/buffer/{index.ts → index.js} +3 -6
  166. package/util/gl-util/draw-options/{methods.ts → methods.js} +32 -47
  167. package/util/gl-util/uniform-block/{manager.ts → manager.js} +200 -232
  168. package/util/{globe-default-gl-states.ts → globe-default-gl-states.js} +4 -5
  169. package/util/{helper-methods.ts → helper-methods.js} +8 -9
  170. package/util/index.js +10 -9
  171. package/util/interpolation/index.js +1 -0
  172. package/util/interpolation/timetrack/index.js +2 -9
  173. package/util/interpolation/timetrack/timetrack-interpolator.js +79 -94
  174. package/util/interpolation/timetrack/web-worker.js +46 -51
  175. package/util/picking/{fence.ts → fence.js} +43 -47
  176. package/util/picking/{picker-displayer.ts → picker-displayer.js} +176 -226
  177. package/util/programs/draw-from-pixel-coords.js +164 -201
  178. package/util/programs/{draw-texture-on-canvas.ts → draw-texture-on-canvas.js} +69 -91
  179. package/util/programs/supersampletotextures.js +97 -130
  180. package/util/programs/texturetoglobe.js +128 -153
  181. package/util/shaderfunctions/{geometrytransformations.ts → geometrytransformations.js} +44 -106
  182. package/util/shaderfunctions/index.js +2 -2
  183. package/util/shaderfunctions/nodata.js +2 -4
  184. package/util/shaderfunctions/noisefunctions.js +7 -10
  185. package/util/{webglobjectbuilders.ts → webglobjectbuilders.js} +358 -446
  186. package/vectorfield/arrowfield/adaptor.js +11 -11
  187. package/vectorfield/arrowfield/index.js +3 -3
  188. package/vectorfield/arrowfield/plugin.js +83 -128
  189. package/vectorfield/waveparticles/adaptor.js +15 -16
  190. package/vectorfield/waveparticles/index.js +3 -3
  191. package/vectorfield/waveparticles/{plugin.ts → plugin.js} +415 -506
  192. package/vectorfield/wind/adapters/{image-to-fields.ts → image-to-fields.js} +61 -74
  193. package/vectorfield/wind/adapters/types.js +1 -0
  194. package/vectorfield/wind/{imagetovectorfieldandmagnitude.ts → imagetovectorfieldandmagnitude.js} +53 -78
  195. package/vectorfield/wind/index.js +5 -5
  196. package/vectorfield/wind/{plugin-persistant copy.ts → plugin-persistant copy.js } +364 -461
  197. package/vectorfield/wind/{plugin-persistant.ts → plugin-persistant.js} +375 -483
  198. package/vectorfield/wind/plugin.js +685 -883
  199. package/vectorfield/wind/vectorfieldimage.js +23 -27
  200. package/write-text/{context-text-bulk.ts → context-text-bulk.js} +200 -285
  201. package/write-text/context-text3.js +167 -0
  202. package/write-text/{context-text4.ts → context-text4.js} +146 -231
  203. package/write-text/context-textDELETE.js +94 -125
  204. package/write-text/objectarraylabels/{index.ts → index.js} +2 -2
  205. package/write-text/objectarraylabels/objectarraylabels.js +200 -247
  206. package/Math/matrix4.ts +0 -0
  207. package/Math/mesh/mapbox-delaunay.d.ts +0 -74
  208. package/Math/roadmap.md +0 -10
  209. package/Math/tessellation/constants.ts +0 -1
  210. package/Math/tessellation/roadmap.md +0 -48
  211. package/Math/tessellation/types.ts +0 -1
  212. package/Math/types.ts +0 -68
  213. package/investigation-tools/draw/tiles/adapters.ts +0 -133
  214. package/programs/line-on-globe/linestrip/data.ts +0 -29
  215. package/programs/polygon-on-globe/roadmap.md +0 -8
  216. package/programs/totems/camera-totem-attactment-interface.ts +0 -4
  217. package/programs/vectorfields/logics/particle-ubo.ts +0 -23
  218. package/publish.bat +0 -62
  219. package/range-tools-on-terrain/bearing-line/types.ts +0 -65
  220. package/range-tools-on-terrain/circle-line-chain/types.ts +0 -43
  221. package/range-tools-on-terrain/range-ring/rangeringangletext.ts +0 -396
  222. package/range-tools-on-terrain/range-ring/types.ts +0 -30
  223. package/semiplugins/interface.ts +0 -14
  224. package/semiplugins/shape-on-terrain/goal.md +0 -12
  225. package/semiplugins/shape-on-terrain/terrain-polygon/data/cache-shortcuts.md +0 -20
  226. package/semiplugins/shape-on-terrain/terrain-polygon/data/master-worker.ts +0 -209
  227. package/semiplugins/shape-on-terrain/terrain-polygon/data/readme.md +0 -5
  228. package/semiplugins/shape-on-terrain/terrain-polygon/data/types.ts +0 -37
  229. package/semiplugins/shape-on-terrain/terrain-polygon/notes.md +0 -90
  230. package/semiplugins/shape-on-terrain/terrain-polygon/types.ts +0 -69
  231. package/semiplugins/shell/bbox-renderer/index.ts +0 -2
  232. package/semiplugins/shell/bbox-renderer/object.ts +0 -129
  233. package/semiplugins/type.ts +0 -8
  234. package/terrain-plugin.mmd +0 -83
  235. package/tests/Math/arc-sampling-test.js +0 -367
  236. package/tests/Math/arc-sampling-test.ts +0 -429
  237. package/tests/Math/arc.test.ts +0 -77
  238. package/tests/Math/junction/arc-limit.test.ts +0 -7
  239. package/tests/Math/junction/arc-plane-points.test.ts +0 -196
  240. package/tests/Math/junction/arc-plane.test.ts +0 -172
  241. package/tests/Math/junction/line-sphere.test.ts +0 -127
  242. package/tests/Math/junction/plane-plane.test.ts +0 -91
  243. package/tests/Math/plane-test.ts +0 -17
  244. package/tests/Math/plane.test.ts +0 -43
  245. package/tests/Math/vec3.test.ts +0 -33
  246. package/tracks/point-heat-map/readme.md +0 -15
  247. package/tracks/timetracks/readme.md +0 -1
  248. package/tsconfig.json +0 -22
  249. package/types/@pirireis/webglobe.d.ts +0 -102
  250. package/types/delaunator.d.ts +0 -40
  251. package/types/earcut.d.ts +0 -11
  252. package/types/rbush.d.ts +0 -57
  253. package/types.ts +0 -319
  254. package/util/account/create-buffermap-orchastration.ts +0 -85
  255. package/util/account/single-attribute-buffer-management/types.ts +0 -43
  256. package/util/check/typecheck.ts +0 -74
  257. package/vectorfield/wind/adapters/types.ts +0 -12
  258. package/write-text/context-text3.ts +0 -252
  259. package/write-text/objectarraylabels/objectarraylabels.d.ts +0 -72
@@ -1,569 +1,457 @@
1
- import { BearingLineInput, Opacities, drawOption } from "./types";
2
- import { Globe, PluginInterface, Color } from "../../types";
3
-
4
- import { ContextTextWriter3 } from "../../write-text/context-text3";
5
- import {
6
- flatLinesInputAdapter,
7
- flatLinesBearingInputAdapter,
8
- bearingLineToCircleInputAdapter,
9
- bearingLineToArcInputAdapter,
10
- bearingLineToBearingArcInputAdapter,
11
- bearingLineToPieceOfPieInputAdapter,
12
- pieceOfPieOpacityAdaptor
13
- } from "./adapters";
14
- import { CircleOnTerrainPlugin, CircleOnTerrainPluginOptions } from "../../semiplugins/shape-on-terrain/circle-plugin";
15
- import { PieceOfPiePlugin, PieceOfPiePluginOptions } from "../../semiplugins/lightweight/piece-of-pie-plugin";
16
- import { ArcOnTerrainPlugin, ArcOnTerrainPluginOptions } from "../../semiplugins/shape-on-terrain/arc-plugin";
17
- import { LinePlugin, LinePluginOptions } from "../../semiplugins/lightweight/line-plugin";
18
-
19
-
20
- export class BearingLinePlugin implements PluginInterface {
21
-
22
- id: string;
23
- globe: Globe | null = null;
24
- private circlePlugin: CircleOnTerrainPlugin;
25
- private arcPlugin: ArcOnTerrainPlugin;
26
- private arcPluginBL: ArcOnTerrainPlugin;
27
- private pieceOfPiePlugin: PieceOfPiePlugin;
28
- private linePlugin: LinePlugin;
29
- private linePluginBL: LinePlugin;
30
- private _freed: boolean = false;
31
- private _opacities: Opacities = {
32
- general: 1,
33
- circle: 1,
34
- arc: 1,
35
- pie: 1,
36
- bearing: 1
37
- };
38
- private _textWritersMap: Map<string, ContextTextWriter3> = new Map();
39
- private _textDataPreAdaptor: ((item: BearingLineInput) => any) = (item) => item;
40
- private drawOptions: drawOption = {
41
- drawVRM: true,
42
- drawBearingLine: true,
43
- drawAngleRing: true,
44
- drawText: true,
45
- flatRealLineOn: true, // This is a new option to control flat real line drawing
46
- flatStraightLineOn: true // This is a new option to control flat straight line drawing
47
- }
48
- private _memory: Map<string, any> = new Map();
49
-
50
- private _semiPluginsOptions: {
51
- circleOnTerrainOptions: Partial<CircleOnTerrainPluginOptions>,
52
- arcOnTerrainOptions: Partial<ArcOnTerrainPluginOptions>,
53
- lineOptions: Partial<LinePluginOptions>,
54
- pieceOfPieOptions: Partial<PieceOfPiePluginOptions>,
55
-
56
- } = {
57
- circleOnTerrainOptions: {
58
- defaultColor: [1, 1, 1, 0.5],
59
- defaultHeightFromGroundIn3D: 30.0,
60
- variativeColorsOn: false,
61
- isMSL: false
62
- },
63
- arcOnTerrainOptions: {
64
- defaultHeightFromGroundIn3D: 30.0,
65
- variativeColorsOn: false,
66
- defaultColor: [1, 1, 1, 0.5] as Color,
67
- globeViewOn: true,
68
- flatViewOn: false,
69
- isMSL: false
70
- },
71
- lineOptions: {
72
- flatViewOn: true,
73
- globeViewOn: true,
74
- variativeColorsOn: false,
75
- defaultColor: [1, 1, 1, 0.5],
76
- },
77
- pieceOfPieOptions: {
78
- defaultColor: [1, 1, 1, 0.5],
79
- variativeColorsOn: false,
80
- defaultHeightFromGroundIn3D: 1000.0,
81
- }
82
- }
83
-
84
- constructor(id: string,
85
- {
86
- textWritersMap,
87
- textDataPreAdaptor,
88
- opacities,
89
- drawOptions,
90
- circleOnTerrainOptions = {
91
- defaultColor: [1, 1, 1, 0.5] as Color,
92
- defaultHeightFromGroundIn3D: 30.0,
93
- variativeColorsOn: false,
94
- },
95
- arcOnTerrainOptions = {
96
- globeViewOn: true,
97
- flatViewOn: false,
98
- defaultColor: [1, 1, 1, 0.5] as Color,
99
- defaultHeightFromGroundIn3D: 30.0,
100
- variativeColorsOn: false,
101
- },
102
- lineOptions = {
103
- flatViewOn: true,
104
- globeViewOn: false,
105
- variativeColorsOn: false,
106
- defaultColor: [1, 1, 1, 0.5] as Color,
107
- },
108
- pieceOfPieOptions = {
109
- defaultColor: [1, 1, 1, 0.5] as Color,
110
- variativeColorsOn: false,
111
- defaultHeightFromGroundIn3D: 1000.0,
112
- }
113
- }: {
114
- textWritersMap?: Map<string, ContextTextWriter3>,
115
- textDataPreAdaptor?: (item: BearingLineInput) => any,
116
- opacities?: Partial<Opacities>,
117
- drawOptions?: Partial<drawOption>,
118
- circleOnTerrainOptions?: Partial<CircleOnTerrainPluginOptions>,
119
- arcOnTerrainOptions?: Partial<ArcOnTerrainPluginOptions>,
120
- lineOptions?: Partial<LinePluginOptions>,
121
- pieceOfPieOptions?: Partial<PieceOfPiePluginOptions>,
122
- } = {}
123
- ) {
124
- this.id = id;
125
- if (!(textWritersMap instanceof Map)) throw new Error("textWritersMap is not an instance of Map");
126
- textWritersMap.forEach((v) => {
127
- if (!(v instanceof ContextTextWriter3)) throw new Error("textWritersMap element is not an instance of ContextTextWriter3");
128
- });
129
-
130
-
131
- if (circleOnTerrainOptions) {
132
- this._semiPluginsOptions.circleOnTerrainOptions = {
133
- ...this._semiPluginsOptions.circleOnTerrainOptions,
134
- ...circleOnTerrainOptions
135
- };
136
- }
137
- if (arcOnTerrainOptions) {
138
- this._semiPluginsOptions.arcOnTerrainOptions = {
139
- ...this._semiPluginsOptions.arcOnTerrainOptions,
140
- ...arcOnTerrainOptions
141
- };
142
- }
143
- if (lineOptions) {
144
- this._semiPluginsOptions.lineOptions = {
145
- ...this._semiPluginsOptions.lineOptions,
146
- ...lineOptions
147
- };
148
- }
149
- if (pieceOfPieOptions) this._semiPluginsOptions.pieceOfPieOptions = {
150
- ...this._semiPluginsOptions.pieceOfPieOptions,
151
- ...pieceOfPieOptions
152
- };
153
-
154
-
155
- this._textWritersMap = textWritersMap || new Map();
156
- this._textWritersMap.forEach((writer) => writer.setKeyAdaptor((item: { key: string }) => item.key));
157
- this._textDataPreAdaptor = textDataPreAdaptor || ((item) => item);
158
- this.circlePlugin = new CircleOnTerrainPlugin(id + "_circle",
159
- this._semiPluginsOptions.circleOnTerrainOptions as CircleOnTerrainPluginOptions
160
- )
161
- this.arcPlugin = new ArcOnTerrainPlugin(id + "_arc", {
162
- ...this._semiPluginsOptions.arcOnTerrainOptions,
163
- })
164
- this.arcPluginBL = new ArcOnTerrainPlugin(id + "_arcBL", {
165
- ...this._semiPluginsOptions.arcOnTerrainOptions,
166
- })
167
- this.pieceOfPiePlugin = new PieceOfPiePlugin(id + "_pieceOfPie", {
168
- bufferType: "DYNAMIC_DRAW",
169
- ...this._semiPluginsOptions.pieceOfPieOptions
170
-
171
- });
172
- this.linePlugin = new LinePlugin(id + "_line", {
173
- bufferType: "DYNAMIC_DRAW",
174
- ...this._semiPluginsOptions.lineOptions
175
- });
176
- this.linePluginBL = new LinePlugin(id + "_lineBL", {
177
- ...this._semiPluginsOptions.lineOptions // flatViewOn: true,
178
- });
179
- if (opacities) {
180
- this._opacities = {
181
- ...this._opacities,
182
- ...opacities,
183
- }
184
- }
185
- if (drawOptions) {
186
- this.drawOptions = {
187
- ...this.drawOptions,
188
- ...drawOptions
189
- };
190
- }
191
-
192
-
193
- }
194
-
195
-
196
-
197
- setDefaultSemiPluginColor(
198
- semiPluginName: "circleOnTerrain" | "arcOnTerrain" | "line" | "pieceOfPie" | "ALL",
199
- color: Color
200
- ) {
201
-
202
-
203
- if (this._freed) {
204
- throw new Error("Plugin has been freed, cannot set default semi plugin color.");
205
- }
206
- if (!this.globe) {
207
- throw new Error("Globe is not set, cannot set default semi plugin color.");
208
- }
209
-
210
- if (semiPluginName === "ALL") {
211
- this.circlePlugin.setDefaultColor(color);
212
- this.arcPlugin.setDefaultColor(color);
213
- this.arcPluginBL.setDefaultColor(color);
214
- this.linePlugin.setDefaultColor(color);
215
- this.linePluginBL.setDefaultColor(color);
216
- this.pieceOfPiePlugin.setDefaultColor(color);
217
- return;
218
- }
219
-
220
- switch (semiPluginName) {
221
- case "circleOnTerrain":
222
- this.circlePlugin.setDefaultColor(color);
223
- break;
224
- case "arcOnTerrain":
225
- this.arcPlugin.setDefaultColor(color);
226
- break;
227
- case "line":
228
- this.linePlugin.setDefaultColor(color);
229
- break;
230
- case "pieceOfPie":
231
- this.pieceOfPiePlugin.setDefaultColor(color);
232
- break;
233
- default:
234
- throw new Error(`Unknown semi plugin name: ${semiPluginName}`);
235
- }
236
- }
237
-
238
- setDoDrawVRM(drawVRM: boolean): void {
239
- if (this._freed) {
240
- throw new Error("Plugin has been freed, cannot set draw VRM.");
241
- }
242
- if (!this.globe) {
243
- throw new Error("Globe is not set, cannot set draw VRM.");
244
- }
245
- this.drawOptions.drawVRM = drawVRM;
246
- this.globe.DrawRender();
247
- }
248
-
249
- setDoDrawText(drawText: boolean): void {
250
- if (this._freed) {
251
- throw new Error("Plugin has been freed, cannot set draw text.");
252
- }
253
- if (!this.globe) {
254
- throw new Error("Globe is not set, cannot set draw text.");
255
- }
256
- this.drawOptions.drawText = drawText;
257
- this.globe.DrawRender();
258
- }
259
-
260
-
261
- setDoDrawBearingLine(drawBearingLine: boolean): void {
262
- if (this._freed) {
263
- throw new Error("Plugin has been freed, cannot set draw bearing line.");
264
- }
265
- if (!this.globe) {
266
- throw new Error("Globe is not set, cannot set draw bearing line.");
267
- }
268
- this.drawOptions.drawBearingLine = drawBearingLine;
269
- this.globe.DrawRender();
270
- }
271
-
272
-
273
- setDoDrawAngleRing(drawAngleRing: boolean): void {
274
- if (this._freed) {
275
- throw new Error("Plugin has been freed, cannot set draw angle ring.");
276
- }
277
- if (!this.globe) {
278
- throw new Error("Globe is not set, cannot set draw angle ring.");
279
- }
280
- this.drawOptions.drawAngleRing = drawAngleRing;
281
- this.globe.DrawRender();
282
- }
283
-
284
-
285
-
286
- updatePartial(items: (Partial<BearingLineInput> & { key: string })[], { textWriterIDs }: { textWriterIDs?: string[] } = {}) {
287
- if (this._freed) {
288
- throw new Error("Plugin has been freed, cannot update item.");
289
- }
290
- if (!this.globe) {
291
- throw new Error("Globe is not set, cannot update item.");
292
- }
293
- const fixedItems = []
294
- for (const item of items) {
295
- if (!this._memory.has(item.key)) {
296
- throw new Error(`Item with key ${item.key} not found in memory.`);
297
- }
298
- fixedItems.push(this.__memorizeItem(item));
299
- }
300
- this._build(fixedItems, { textWriterIDs });
301
- }
302
-
303
- setDrawOptions(drawOptions: Partial<drawOption>) {
304
- if (this._freed) {
305
- throw new Error("Plugin has been freed, cannot set draw options.");
306
- }
307
- if (!this.globe) {
308
- throw new Error("Globe is not set, cannot set draw options.");
309
- }
310
- this.drawOptions = {
311
- ...this.drawOptions,
312
- ...drawOptions
313
- };
314
- this.globe.DrawRender();
315
- }
316
-
317
- updateCoordinatesBulk(items: BearingLineInput[], { textWriterIDs }: { textWriterIDs?: string[] } = {}) {
318
- if (this._freed) {
319
- throw new Error("Plugin has been freed, cannot update coordinates.");
320
- }
321
- if (!this.globe) {
322
- throw new Error("Globe is not set, cannot update coordinates.");
323
- }
324
- const fixedItems = [];
325
- for (const item of items) {
326
- if (!this._memory.has(item.key)) {
327
- throw new Error(`Item with key ${item.key} not found in memory.`);
328
- } else {
329
- fixedItems.push(this.__memorizeItem(item));
330
- }
331
- }
332
- this._build(fixedItems, { textWriterIDs });
333
- }
334
-
335
-
336
- setOpacities(opacities: Partial<Opacities>) {
337
- if (this._freed) {
338
- throw new Error("Plugin has been freed, cannot set opacities.");
339
- }
340
- if (!this.globe) {
341
- throw new Error("Globe is not set, cannot set opacities.");
342
- }
343
- this._opacities = {
344
- ...this._opacities,
345
- ...opacities,
346
- };
347
- this.globe.DrawRender();
348
- }
349
-
350
-
351
- insertBulk(items: BearingLineInput[], { textWriterIDs }: { textWriterIDs?: string[] } = {}) {
352
-
353
- this._build(items, { textWriterIDs });
354
- }
355
-
356
- deleteBulk(keys: string[]) {
357
- if (this._freed) {
358
- throw new Error("Plugin has been freed, cannot delete items.");
359
- }
360
- if (!this.globe) {
361
- throw new Error("Globe is not set, cannot delete items.");
362
- }
363
- if (!this.circlePlugin || !this.arcPlugin) {
364
- throw new Error("Circle and Arc plugins are not initialized.");
365
- }
366
-
367
- this.circlePlugin.deleteBulk(keys);
368
- this.arcPlugin.deleteBulk(keys);
369
- this.arcPluginBL.deleteBulk(keys);
370
- this.pieceOfPiePlugin.deleteBulk(keys);
371
- this.linePlugin.deleteBulk(keys);
372
- this.linePluginBL.deleteBulk(keys);
373
- this.__deleteTexts(keys);
374
- this.globe.DrawRender();
375
- }
376
-
377
-
378
- updateText(textWriterIDs: string[], itemKeys: string[] | null = null) {
379
- if (this._freed) {
380
- throw new Error("Plugin has been freed, cannot update text.");
381
- }
382
-
383
- const items = itemKeys ? itemKeys.map(key => this._memory.get(key)).filter(Boolean) : Array.from(this._memory.values());
384
-
385
- this.__insertTexts(
386
- items,
387
- textWriterIDs
388
- );
389
-
390
- }
391
-
392
-
393
-
394
- _calculateRadiusFromBearingLine(bearingLine: BearingLineInput): void {
395
- const { long, lat, endLong, endLat } = bearingLine;
396
- // @ts-ignore
397
- bearingLine.radius = this.globe.Math.GetDist2D(long, lat, endLong, endLat);
398
- }
399
-
400
- __deleteTexts(keys: string[]) {
401
- if (this._freed) {
402
- throw new Error("Plugin has been freed, cannot delete texts.");
403
- }
404
- if (!this.globe) {
405
- throw new Error("Globe is not set, cannot delete texts.");
406
- }
407
- for (const textWriter of this._textWritersMap.values()) {
408
- textWriter.deleteTextBulk(keys);
409
- }
410
- keys.forEach(key => {
411
- this._memory.delete(key);
412
- });
413
- }
414
-
415
-
416
- __insertTexts(items: BearingLineInput[], textWriterIDs: string[] = []) {
417
- if (this._freed) {
418
- throw new Error("Plugin has been freed, cannot insert texts.");
419
- }
420
- if (!this.globe) {
421
- throw new Error("Globe is not set, cannot insert texts.");
422
- }
423
- if (textWriterIDs.length === 0) {
424
- textWriterIDs = Array.from(this._textWritersMap.keys());
425
- }
426
- // check textWriterIDs
427
- for (const textWriterID of textWriterIDs) {
428
- const textWriter = this._textWritersMap.get(textWriterID);
429
- if (!textWriter) {
430
- throw new Error(`Text writer with ID ${textWriterID} not found.`);
431
- }
432
- }
433
-
434
-
435
- for (const textWriterID of textWriterIDs) {
436
- const textWriter = this._textWritersMap.get(textWriterID);
437
- if (textWriter) {
438
- textWriter.insertTextBulk(items.map(x => this._textDataPreAdaptor(x)), textWriterID);
439
- }
440
- }
441
- }
442
-
443
-
444
- __memorizeItem(item: { key: string } & Partial<BearingLineInput>): BearingLineInput {
445
- const oldItem = this._memory.get(item.key);
446
- let newItem = oldItem ? { ...oldItem, ...item } : item;
447
- this._memory.set(item.key, newItem);
448
- return newItem;
449
- }
450
-
451
- _build(items: BearingLineInput[], { textWriterIDs }: { textWriterIDs?: string[] } = {}) {
452
- if (this._freed) {
453
- throw new Error("Plugin has been freed, cannot update coordinates.");
454
-
455
- }
456
- if (!this.globe) {
457
- throw new Error("Globe is not set, cannot update coordinates.");
458
- }
459
- if (!this.circlePlugin || !this.arcPlugin) {
460
- throw new Error("Circle and Arc plugins are not initialized.");
461
- }
462
- items.forEach(item => {
463
- this._calculateRadiusFromBearingLine(item);
464
- });
465
- const processedItems = items.map((item) => this.__memorizeItem(item));
466
-
467
- // @ts-ignore
468
- const circleInputs = processedItems.map(bearingLineToCircleInputAdapter(this.globe)) as CircleInput[];
469
- this.circlePlugin.insertBulk(circleInputs);
470
- const arcInputs = processedItems.map(bearingLineToArcInputAdapter);
471
- this.arcPlugin.insertBulk(arcInputs);
472
- // @ts-ignore
473
- const bearingArcInputs = processedItems.map((x) => bearingLineToBearingArcInputAdapter(this.globe, x));
474
- this.arcPluginBL.insertBulk(bearingArcInputs);
475
- this.__insertTexts(processedItems, textWriterIDs);
476
- // @ts-ignore
477
- const pieceOfPieInputs = processedItems.map((x) => bearingLineToPieceOfPieInputAdapter(this.globe, x));
478
- this.pieceOfPiePlugin.insertBulk(pieceOfPieInputs);
479
- // line inputs
480
- const lineInputs = processedItems.map(flatLinesInputAdapter);
481
- this.linePlugin.insertBulk(lineInputs);
482
- const lineInputsBL = processedItems.map(flatLinesBearingInputAdapter);
483
- this.linePluginBL.insertBulk(lineInputsBL);
484
- // @ts-ignore
485
- this.globe.DrawRender();
486
- }
487
-
488
- // globe API
489
-
490
- init(globe: Globe, gl: WebGL2RenderingContext): void {
491
- if (this._freed) {
492
- throw new Error("Plugin has been freed, cannot initialize.");
493
- }
494
- this.globe = globe;
495
-
496
- this.circlePlugin.init(globe, gl);
497
- this.arcPlugin.init(globe, gl);
498
- this.arcPluginBL.init(globe, gl);
499
- this.linePlugin.init(globe, gl);
500
- this.linePluginBL.init(globe, gl);
501
- this.pieceOfPiePlugin.init(globe, gl);
502
-
503
- }
504
-
505
- draw3D(): void {
506
-
507
- if (this._freed) {
508
- throw new Error("Plugin has been freed, cannot draw.");
509
- }
510
- if (!this.globe) {
511
- throw new Error("Globe is not set, cannot draw.");
512
- }
513
- if (!this.circlePlugin || !this.arcPlugin) {
514
- throw new Error("Circle and Arc plugins are not initialized.");
515
- }
516
-
517
- if (this.drawOptions.drawVRM) {
518
- this.circlePlugin.setPluginOpacity(this._opacities.circle ?? this._opacities.general, false);
519
- this.circlePlugin.draw3D();
520
- }
521
-
522
-
523
- if (this.drawOptions.drawBearingLine) {
524
- this.arcPluginBL.setPluginOpacity(this._opacities.bearing ?? this._opacities.general, false);
525
- this.arcPluginBL.draw3D();
526
- }
527
-
528
- if (this.drawOptions.drawAngleRing) {
529
- const currentLOD = this.globe.api_GetCurrentLODWithDecimal();
530
- const tiltAngle = this.globe.api_GetCurrentLookInfo().Tilt;
531
- const opacity = pieceOfPieOpacityAdaptor(currentLOD, tiltAngle) * (this._opacities.general ?? 1);
532
- if (opacity > 0) {
533
- this.pieceOfPiePlugin.setPluginOpacity(opacity, false);
534
- this.pieceOfPiePlugin.draw3D();
535
- }
536
- }
537
-
538
- const currentGeometry = this.globe.api_GetCurrentGeometry();
539
-
540
- this.arcPlugin.setPluginOpacity(this._opacities.arc ?? this._opacities.general, false);
541
- this.arcPlugin.draw3D();
542
-
543
- if (currentGeometry === 1) {
544
- this.linePlugin.draw3D();
545
- this.linePluginBL.draw3D();
546
- }
547
-
548
- for (const textWriter of this._textWritersMap.values()) {
549
- textWriter.draw();
550
- }
551
- }
552
-
553
-
554
- free(): void {
555
- if (this._freed) {
556
- throw new Error("Plugin has already been freed.");
557
- }
558
- this._freed = true;
559
- this.globe = null;
560
- this._memory.clear();
561
- this._textWritersMap.clear();
562
- this.circlePlugin.free();
563
- this.arcPlugin.free();
564
- this.arcPluginBL.free();
565
- this.pieceOfPiePlugin.free();
566
- this.linePlugin.free();
567
- this.linePluginBL.free();
568
- }
569
- }
1
+ import { ContextTextWriter3 } from "../../write-text/context-text3";
2
+ import { flatLinesInputAdapter, flatLinesBearingInputAdapter, bearingLineToCircleInputAdapter, bearingLineToArcInputAdapter, bearingLineToBearingArcInputAdapter, bearingLineToPieceOfPieInputAdapter, pieceOfPieOpacityAdaptor } from "./adapters";
3
+ import { CircleOnTerrainPlugin } from "../../semiplugins/shape-on-terrain/circle-plugin";
4
+ import { PieceOfPiePlugin } from "../../semiplugins/lightweight/piece-of-pie-plugin";
5
+ import { ArcOnTerrainPlugin } from "../../semiplugins/shape-on-terrain/arc-plugin";
6
+ import { LinePlugin } from "../../semiplugins/lightweight/line-plugin";
7
+ export class BearingLinePlugin {
8
+ id;
9
+ globe = null;
10
+ circlePlugin;
11
+ arcPlugin;
12
+ arcPluginBL;
13
+ pieceOfPiePlugin;
14
+ linePlugin;
15
+ linePluginBL;
16
+ _freed = false;
17
+ _opacities = {
18
+ general: 1,
19
+ circle: 1,
20
+ arc: 1,
21
+ pie: 1,
22
+ bearing: 1
23
+ };
24
+ _textWritersMap = new Map();
25
+ _textDataPreAdaptor = (item) => item;
26
+ drawOptions = {
27
+ drawVRM: true,
28
+ drawBearingLine: true,
29
+ drawAngleRing: true,
30
+ drawText: true,
31
+ flatRealLineOn: true, // This is a new option to control flat real line drawing
32
+ flatStraightLineOn: true // This is a new option to control flat straight line drawing
33
+ };
34
+ _memory = new Map();
35
+ _semiPluginsOptions = {
36
+ circleOnTerrainOptions: {
37
+ defaultColor: [1, 1, 1, 0.5],
38
+ defaultHeightFromGroundIn3D: 30.0,
39
+ variativeColorsOn: false,
40
+ isMSL: false
41
+ },
42
+ arcOnTerrainOptions: {
43
+ defaultHeightFromGroundIn3D: 30.0,
44
+ variativeColorsOn: false,
45
+ defaultColor: [1, 1, 1, 0.5],
46
+ globeViewOn: true,
47
+ flatViewOn: false,
48
+ isMSL: false
49
+ },
50
+ lineOptions: {
51
+ flatViewOn: true,
52
+ globeViewOn: true,
53
+ variativeColorsOn: false,
54
+ defaultColor: [1, 1, 1, 0.5],
55
+ },
56
+ pieceOfPieOptions: {
57
+ defaultColor: [1, 1, 1, 0.5],
58
+ variativeColorsOn: false,
59
+ defaultHeightFromGroundIn3D: 1000.0,
60
+ }
61
+ };
62
+ constructor(id, { textWritersMap, textDataPreAdaptor, opacities, drawOptions, circleOnTerrainOptions = {
63
+ defaultColor: [1, 1, 1, 0.5],
64
+ defaultHeightFromGroundIn3D: 30.0,
65
+ variativeColorsOn: false,
66
+ }, arcOnTerrainOptions = {
67
+ globeViewOn: true,
68
+ flatViewOn: false,
69
+ defaultColor: [1, 1, 1, 0.5],
70
+ defaultHeightFromGroundIn3D: 30.0,
71
+ variativeColorsOn: false,
72
+ }, lineOptions = {
73
+ flatViewOn: true,
74
+ globeViewOn: false,
75
+ variativeColorsOn: false,
76
+ defaultColor: [1, 1, 1, 0.5],
77
+ }, pieceOfPieOptions = {
78
+ defaultColor: [1, 1, 1, 0.5],
79
+ variativeColorsOn: false,
80
+ defaultHeightFromGroundIn3D: 1000.0,
81
+ } } = {}) {
82
+ this.id = id;
83
+ if (!(textWritersMap instanceof Map))
84
+ throw new Error("textWritersMap is not an instance of Map");
85
+ textWritersMap.forEach((v) => {
86
+ if (!(v instanceof ContextTextWriter3))
87
+ throw new Error("textWritersMap element is not an instance of ContextTextWriter3");
88
+ });
89
+ if (circleOnTerrainOptions) {
90
+ this._semiPluginsOptions.circleOnTerrainOptions = {
91
+ ...this._semiPluginsOptions.circleOnTerrainOptions,
92
+ ...circleOnTerrainOptions
93
+ };
94
+ }
95
+ if (arcOnTerrainOptions) {
96
+ this._semiPluginsOptions.arcOnTerrainOptions = {
97
+ ...this._semiPluginsOptions.arcOnTerrainOptions,
98
+ ...arcOnTerrainOptions
99
+ };
100
+ }
101
+ if (lineOptions) {
102
+ this._semiPluginsOptions.lineOptions = {
103
+ ...this._semiPluginsOptions.lineOptions,
104
+ ...lineOptions
105
+ };
106
+ }
107
+ if (pieceOfPieOptions)
108
+ this._semiPluginsOptions.pieceOfPieOptions = {
109
+ ...this._semiPluginsOptions.pieceOfPieOptions,
110
+ ...pieceOfPieOptions
111
+ };
112
+ this._textWritersMap = textWritersMap || new Map();
113
+ this._textWritersMap.forEach((writer) => writer.setKeyAdaptor((item) => item.key));
114
+ this._textDataPreAdaptor = textDataPreAdaptor || ((item) => item);
115
+ this.circlePlugin = new CircleOnTerrainPlugin(id + "_circle", this._semiPluginsOptions.circleOnTerrainOptions);
116
+ this.arcPlugin = new ArcOnTerrainPlugin(id + "_arc", {
117
+ ...this._semiPluginsOptions.arcOnTerrainOptions,
118
+ });
119
+ this.arcPluginBL = new ArcOnTerrainPlugin(id + "_arcBL", {
120
+ ...this._semiPluginsOptions.arcOnTerrainOptions,
121
+ });
122
+ this.pieceOfPiePlugin = new PieceOfPiePlugin(id + "_pieceOfPie", {
123
+ bufferType: "DYNAMIC_DRAW",
124
+ ...this._semiPluginsOptions.pieceOfPieOptions
125
+ });
126
+ this.linePlugin = new LinePlugin(id + "_line", {
127
+ bufferType: "DYNAMIC_DRAW",
128
+ ...this._semiPluginsOptions.lineOptions
129
+ });
130
+ this.linePluginBL = new LinePlugin(id + "_lineBL", {
131
+ ...this._semiPluginsOptions.lineOptions // flatViewOn: true,
132
+ });
133
+ if (opacities) {
134
+ this._opacities = {
135
+ ...this._opacities,
136
+ ...opacities,
137
+ };
138
+ }
139
+ if (drawOptions) {
140
+ this.drawOptions = {
141
+ ...this.drawOptions,
142
+ ...drawOptions
143
+ };
144
+ }
145
+ }
146
+ setDefaultSemiPluginColor(semiPluginName, color) {
147
+ if (this._freed) {
148
+ throw new Error("Plugin has been freed, cannot set default semi plugin color.");
149
+ }
150
+ if (!this.globe) {
151
+ throw new Error("Globe is not set, cannot set default semi plugin color.");
152
+ }
153
+ if (semiPluginName === "ALL") {
154
+ this.circlePlugin.setDefaultColor(color);
155
+ this.arcPlugin.setDefaultColor(color);
156
+ this.arcPluginBL.setDefaultColor(color);
157
+ this.linePlugin.setDefaultColor(color);
158
+ this.linePluginBL.setDefaultColor(color);
159
+ this.pieceOfPiePlugin.setDefaultColor(color);
160
+ return;
161
+ }
162
+ switch (semiPluginName) {
163
+ case "circleOnTerrain":
164
+ this.circlePlugin.setDefaultColor(color);
165
+ break;
166
+ case "arcOnTerrain":
167
+ this.arcPlugin.setDefaultColor(color);
168
+ break;
169
+ case "line":
170
+ this.linePlugin.setDefaultColor(color);
171
+ break;
172
+ case "pieceOfPie":
173
+ this.pieceOfPiePlugin.setDefaultColor(color);
174
+ break;
175
+ default:
176
+ throw new Error(`Unknown semi plugin name: ${semiPluginName}`);
177
+ }
178
+ }
179
+ setDoDrawVRM(drawVRM) {
180
+ if (this._freed) {
181
+ throw new Error("Plugin has been freed, cannot set draw VRM.");
182
+ }
183
+ if (!this.globe) {
184
+ throw new Error("Globe is not set, cannot set draw VRM.");
185
+ }
186
+ this.drawOptions.drawVRM = drawVRM;
187
+ this.globe.DrawRender();
188
+ }
189
+ setDoDrawText(drawText) {
190
+ if (this._freed) {
191
+ throw new Error("Plugin has been freed, cannot set draw text.");
192
+ }
193
+ if (!this.globe) {
194
+ throw new Error("Globe is not set, cannot set draw text.");
195
+ }
196
+ this.drawOptions.drawText = drawText;
197
+ this.globe.DrawRender();
198
+ }
199
+ setDoDrawBearingLine(drawBearingLine) {
200
+ if (this._freed) {
201
+ throw new Error("Plugin has been freed, cannot set draw bearing line.");
202
+ }
203
+ if (!this.globe) {
204
+ throw new Error("Globe is not set, cannot set draw bearing line.");
205
+ }
206
+ this.drawOptions.drawBearingLine = drawBearingLine;
207
+ this.globe.DrawRender();
208
+ }
209
+ setDoDrawAngleRing(drawAngleRing) {
210
+ if (this._freed) {
211
+ throw new Error("Plugin has been freed, cannot set draw angle ring.");
212
+ }
213
+ if (!this.globe) {
214
+ throw new Error("Globe is not set, cannot set draw angle ring.");
215
+ }
216
+ this.drawOptions.drawAngleRing = drawAngleRing;
217
+ this.globe.DrawRender();
218
+ }
219
+ updatePartial(items, { textWriterIDs } = {}) {
220
+ if (this._freed) {
221
+ throw new Error("Plugin has been freed, cannot update item.");
222
+ }
223
+ if (!this.globe) {
224
+ throw new Error("Globe is not set, cannot update item.");
225
+ }
226
+ const fixedItems = [];
227
+ for (const item of items) {
228
+ if (!this._memory.has(item.key)) {
229
+ throw new Error(`Item with key ${item.key} not found in memory.`);
230
+ }
231
+ fixedItems.push(this.__memorizeItem(item));
232
+ }
233
+ this._build(fixedItems, { textWriterIDs });
234
+ }
235
+ setDrawOptions(drawOptions) {
236
+ if (this._freed) {
237
+ throw new Error("Plugin has been freed, cannot set draw options.");
238
+ }
239
+ if (!this.globe) {
240
+ throw new Error("Globe is not set, cannot set draw options.");
241
+ }
242
+ this.drawOptions = {
243
+ ...this.drawOptions,
244
+ ...drawOptions
245
+ };
246
+ this.globe.DrawRender();
247
+ }
248
+ updateCoordinatesBulk(items, { textWriterIDs } = {}) {
249
+ if (this._freed) {
250
+ throw new Error("Plugin has been freed, cannot update coordinates.");
251
+ }
252
+ if (!this.globe) {
253
+ throw new Error("Globe is not set, cannot update coordinates.");
254
+ }
255
+ const fixedItems = [];
256
+ for (const item of items) {
257
+ if (!this._memory.has(item.key)) {
258
+ throw new Error(`Item with key ${item.key} not found in memory.`);
259
+ }
260
+ else {
261
+ fixedItems.push(this.__memorizeItem(item));
262
+ }
263
+ }
264
+ this._build(fixedItems, { textWriterIDs });
265
+ }
266
+ setOpacities(opacities) {
267
+ if (this._freed) {
268
+ throw new Error("Plugin has been freed, cannot set opacities.");
269
+ }
270
+ if (!this.globe) {
271
+ throw new Error("Globe is not set, cannot set opacities.");
272
+ }
273
+ this._opacities = {
274
+ ...this._opacities,
275
+ ...opacities,
276
+ };
277
+ this.globe.DrawRender();
278
+ }
279
+ insertBulk(items, { textWriterIDs } = {}) {
280
+ this._build(items, { textWriterIDs });
281
+ }
282
+ deleteBulk(keys) {
283
+ if (this._freed) {
284
+ throw new Error("Plugin has been freed, cannot delete items.");
285
+ }
286
+ if (!this.globe) {
287
+ throw new Error("Globe is not set, cannot delete items.");
288
+ }
289
+ if (!this.circlePlugin || !this.arcPlugin) {
290
+ throw new Error("Circle and Arc plugins are not initialized.");
291
+ }
292
+ this.circlePlugin.deleteBulk(keys);
293
+ this.arcPlugin.deleteBulk(keys);
294
+ this.arcPluginBL.deleteBulk(keys);
295
+ this.pieceOfPiePlugin.deleteBulk(keys);
296
+ this.linePlugin.deleteBulk(keys);
297
+ this.linePluginBL.deleteBulk(keys);
298
+ this.__deleteTexts(keys);
299
+ this.globe.DrawRender();
300
+ }
301
+ updateText(textWriterIDs, itemKeys = null) {
302
+ if (this._freed) {
303
+ throw new Error("Plugin has been freed, cannot update text.");
304
+ }
305
+ const items = itemKeys ? itemKeys.map(key => this._memory.get(key)).filter(Boolean) : Array.from(this._memory.values());
306
+ this.__insertTexts(items, textWriterIDs);
307
+ }
308
+ _calculateRadiusFromBearingLine(bearingLine) {
309
+ const { long, lat, endLong, endLat } = bearingLine;
310
+ // @ts-ignore
311
+ bearingLine.radius = this.globe.Math.GetDist2D(long, lat, endLong, endLat);
312
+ }
313
+ __deleteTexts(keys) {
314
+ if (this._freed) {
315
+ throw new Error("Plugin has been freed, cannot delete texts.");
316
+ }
317
+ if (!this.globe) {
318
+ throw new Error("Globe is not set, cannot delete texts.");
319
+ }
320
+ for (const textWriter of this._textWritersMap.values()) {
321
+ textWriter.deleteTextBulk(keys);
322
+ }
323
+ keys.forEach(key => {
324
+ this._memory.delete(key);
325
+ });
326
+ }
327
+ __insertTexts(items, textWriterIDs = []) {
328
+ if (this._freed) {
329
+ throw new Error("Plugin has been freed, cannot insert texts.");
330
+ }
331
+ if (!this.globe) {
332
+ throw new Error("Globe is not set, cannot insert texts.");
333
+ }
334
+ if (textWriterIDs.length === 0) {
335
+ textWriterIDs = Array.from(this._textWritersMap.keys());
336
+ }
337
+ // check textWriterIDs
338
+ for (const textWriterID of textWriterIDs) {
339
+ const textWriter = this._textWritersMap.get(textWriterID);
340
+ if (!textWriter) {
341
+ throw new Error(`Text writer with ID ${textWriterID} not found.`);
342
+ }
343
+ }
344
+ for (const textWriterID of textWriterIDs) {
345
+ const textWriter = this._textWritersMap.get(textWriterID);
346
+ if (textWriter) {
347
+ textWriter.insertTextBulk(items.map(x => this._textDataPreAdaptor(x)), textWriterID);
348
+ }
349
+ }
350
+ }
351
+ __memorizeItem(item) {
352
+ const oldItem = this._memory.get(item.key);
353
+ let newItem = oldItem ? { ...oldItem, ...item } : item;
354
+ this._memory.set(item.key, newItem);
355
+ return newItem;
356
+ }
357
+ _build(items, { textWriterIDs } = {}) {
358
+ if (this._freed) {
359
+ throw new Error("Plugin has been freed, cannot update coordinates.");
360
+ }
361
+ if (!this.globe) {
362
+ throw new Error("Globe is not set, cannot update coordinates.");
363
+ }
364
+ if (!this.circlePlugin || !this.arcPlugin) {
365
+ throw new Error("Circle and Arc plugins are not initialized.");
366
+ }
367
+ items.forEach(item => {
368
+ this._calculateRadiusFromBearingLine(item);
369
+ });
370
+ const processedItems = items.map((item) => this.__memorizeItem(item));
371
+ // @ts-ignore
372
+ const circleInputs = processedItems.map(bearingLineToCircleInputAdapter(this.globe));
373
+ this.circlePlugin.insertBulk(circleInputs);
374
+ const arcInputs = processedItems.map(bearingLineToArcInputAdapter);
375
+ this.arcPlugin.insertBulk(arcInputs);
376
+ // @ts-ignore
377
+ const bearingArcInputs = processedItems.map((x) => bearingLineToBearingArcInputAdapter(this.globe, x));
378
+ this.arcPluginBL.insertBulk(bearingArcInputs);
379
+ this.__insertTexts(processedItems, textWriterIDs);
380
+ // @ts-ignore
381
+ const pieceOfPieInputs = processedItems.map((x) => bearingLineToPieceOfPieInputAdapter(this.globe, x));
382
+ this.pieceOfPiePlugin.insertBulk(pieceOfPieInputs);
383
+ // line inputs
384
+ const lineInputs = processedItems.map(flatLinesInputAdapter);
385
+ this.linePlugin.insertBulk(lineInputs);
386
+ const lineInputsBL = processedItems.map(flatLinesBearingInputAdapter);
387
+ this.linePluginBL.insertBulk(lineInputsBL);
388
+ // @ts-ignore
389
+ this.globe.DrawRender();
390
+ }
391
+ // globe API
392
+ init(globe, gl) {
393
+ if (this._freed) {
394
+ throw new Error("Plugin has been freed, cannot initialize.");
395
+ }
396
+ this.globe = globe;
397
+ this.circlePlugin.init(globe, gl);
398
+ this.arcPlugin.init(globe, gl);
399
+ this.arcPluginBL.init(globe, gl);
400
+ this.linePlugin.init(globe, gl);
401
+ this.linePluginBL.init(globe, gl);
402
+ this.pieceOfPiePlugin.init(globe, gl);
403
+ }
404
+ draw3D() {
405
+ if (this._freed) {
406
+ throw new Error("Plugin has been freed, cannot draw.");
407
+ }
408
+ if (!this.globe) {
409
+ throw new Error("Globe is not set, cannot draw.");
410
+ }
411
+ if (!this.circlePlugin || !this.arcPlugin) {
412
+ throw new Error("Circle and Arc plugins are not initialized.");
413
+ }
414
+ if (this.drawOptions.drawVRM) {
415
+ this.circlePlugin.setPluginOpacity(this._opacities.circle ?? this._opacities.general, false);
416
+ this.circlePlugin.draw3D();
417
+ }
418
+ if (this.drawOptions.drawBearingLine) {
419
+ this.arcPluginBL.setPluginOpacity(this._opacities.bearing ?? this._opacities.general, false);
420
+ this.arcPluginBL.draw3D();
421
+ }
422
+ if (this.drawOptions.drawAngleRing) {
423
+ const currentLOD = this.globe.api_GetCurrentLODWithDecimal();
424
+ const tiltAngle = this.globe.api_GetCurrentLookInfo().Tilt;
425
+ const opacity = pieceOfPieOpacityAdaptor(currentLOD, tiltAngle) * (this._opacities.general ?? 1);
426
+ if (opacity > 0) {
427
+ this.pieceOfPiePlugin.setPluginOpacity(opacity, false);
428
+ this.pieceOfPiePlugin.draw3D();
429
+ }
430
+ }
431
+ const currentGeometry = this.globe.api_GetCurrentGeometry();
432
+ this.arcPlugin.setPluginOpacity(this._opacities.arc ?? this._opacities.general, false);
433
+ this.arcPlugin.draw3D();
434
+ if (currentGeometry === 1) {
435
+ this.linePlugin.draw3D();
436
+ this.linePluginBL.draw3D();
437
+ }
438
+ for (const textWriter of this._textWritersMap.values()) {
439
+ textWriter.draw();
440
+ }
441
+ }
442
+ free() {
443
+ if (this._freed) {
444
+ throw new Error("Plugin has already been freed.");
445
+ }
446
+ this._freed = true;
447
+ this.globe = null;
448
+ this._memory.clear();
449
+ this._textWritersMap.clear();
450
+ this.circlePlugin.free();
451
+ this.arcPlugin.free();
452
+ this.arcPluginBL.free();
453
+ this.pieceOfPiePlugin.free();
454
+ this.linePlugin.free();
455
+ this.linePluginBL.free();
456
+ }
457
+ }