@pirireis/webglobeplugins 0.9.6 → 0.9.8

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 (304) hide show
  1. package/{Math → dist/Math}/angle-calculation.js +15 -14
  2. package/dist/Math/arc.js +65 -0
  3. package/{Math → dist/Math}/bounds/line-bbox.js +188 -225
  4. package/dist/Math/constants.js +9 -0
  5. package/{Math/frustum/camera.ts → dist/Math/frustum/camera.js} +24 -32
  6. package/{Math/frustum/from-globeinfo.ts → dist/Math/frustum/from-globeinfo.js} +48 -63
  7. package/dist/Math/frustum/types.js +2 -0
  8. package/{Math/globe-util/horizon-plane.ts → dist/Math/globe-util/horizon-plane.js} +112 -137
  9. package/dist/Math/index.js +1 -0
  10. package/dist/Math/juction/arc-plane.js +83 -0
  11. package/dist/Math/juction/line-sphere.js +25 -0
  12. package/{Math/juction/plane-plane.ts → dist/Math/juction/plane-plane.js} +58 -66
  13. package/dist/Math/line.js +56 -0
  14. package/dist/Math/matrix4.js +1 -0
  15. package/{Math → dist/Math}/methods.js +201 -237
  16. package/dist/Math/plane.js +60 -0
  17. package/{Math/quaternion.ts → dist/Math/quaternion.js} +104 -120
  18. package/dist/Math/types.js +2 -0
  19. package/dist/Math/utils.js +4 -0
  20. package/{Math/vec3.ts → dist/Math/vec3.js} +126 -155
  21. package/dist/algorithms/search-binary.js +19 -0
  22. package/dist/altitude-locator/adaptors.js +1 -0
  23. package/{altitude-locator → dist/altitude-locator}/draw-subset-obj.js +18 -27
  24. package/dist/altitude-locator/keymethod.js +1 -0
  25. package/{altitude-locator → dist/altitude-locator}/plugin.js +341 -439
  26. package/{altitude-locator → dist/altitude-locator}/types.js +23 -26
  27. package/{arrowfield → dist/arrowfield}/adaptor.js +14 -11
  28. package/dist/arrowfield/index.js +10 -0
  29. package/{arrowfield → dist/arrowfield}/plugin.js +86 -128
  30. package/dist/bearing-line/index.js +8 -0
  31. package/{bearing-line → dist/bearing-line}/plugin.js +449 -512
  32. package/{circle-line-chain → dist/circle-line-chain}/chain-list-map.js +205 -221
  33. package/dist/circle-line-chain/init.js +1 -0
  34. package/{circle-line-chain → dist/circle-line-chain}/plugin.js +424 -469
  35. package/dist/circle-line-chain/util.js +5 -0
  36. package/{compass-rose → dist/compass-rose}/compass-rose-padding-flat.js +225 -266
  37. package/{compass-rose → dist/compass-rose}/compass-text-writer.js +153 -173
  38. package/dist/compass-rose/index.js +7 -0
  39. package/{compassrose → dist/compassrose}/compassrose.js +296 -341
  40. package/dist/compassrose/index.js +8 -0
  41. package/dist/globe-types.js +1 -0
  42. package/dist/heatwave/index.js +10 -0
  43. package/{heatwave → dist/heatwave}/isobar/objectarraylabels.js +202 -247
  44. package/{heatwave → dist/heatwave}/isobar/plugin.js +343 -340
  45. package/{heatwave → dist/heatwave}/isobar/quadtreecontours.js +300 -336
  46. package/{heatwave → dist/heatwave}/plugins/heatwaveglobeshell.js +206 -258
  47. package/dist/index.js +58 -0
  48. package/{jest.config.js → dist/jest.config.js} +7 -6
  49. package/{partialrings → dist/partialrings}/buffer-manager.js +81 -89
  50. package/dist/partialrings/index.js +41 -0
  51. package/{partialrings → dist/partialrings}/plugin.js +135 -160
  52. package/{partialrings → dist/partialrings}/program.js +204 -242
  53. package/{pin → dist/pin}/pin-object-array.js +305 -381
  54. package/{pin → dist/pin}/pin-point-totem.js +60 -77
  55. package/{point-heat-map → dist/point-heat-map}/adaptors/timetracksplugin-format-to-this.js +66 -78
  56. package/dist/point-heat-map/index.js +1 -0
  57. package/{point-heat-map → dist/point-heat-map}/plugin-webworker.js +126 -151
  58. package/{point-heat-map → dist/point-heat-map}/point-to-heat-map-flow.js +127 -150
  59. package/dist/point-tracks/key-methods.js +5 -0
  60. package/{point-tracks → dist/point-tracks}/plugin.js +338 -394
  61. package/dist/programs/arrowfield/index.js +7 -0
  62. package/{programs → dist/programs}/arrowfield/logic.js +144 -173
  63. package/{programs → dist/programs}/arrowfield/object.js +66 -89
  64. package/{programs → dist/programs}/data2legend/density-to-legend.js +76 -90
  65. package/{programs → dist/programs}/data2legend/point-to-density-texture.js +76 -90
  66. package/dist/programs/float2legendwithratio/index.js +8 -0
  67. package/{programs → dist/programs}/float2legendwithratio/logic.js +122 -145
  68. package/{programs → dist/programs}/float2legendwithratio/object.js +110 -141
  69. package/{programs → dist/programs}/globe-util/is-globe-moved.js +21 -27
  70. package/dist/programs/globeshell/index.js +8 -0
  71. package/dist/programs/globeshell/noise/noises.js +1 -0
  72. package/dist/programs/globeshell/wiggle/index.js +8 -0
  73. package/{programs → dist/programs}/globeshell/wiggle/logic.js +246 -272
  74. package/{programs → dist/programs}/globeshell/wiggle/object.js +72 -93
  75. package/dist/programs/helpers/blender/index.js +1 -0
  76. package/{programs → dist/programs}/helpers/blender/program.js +61 -73
  77. package/dist/programs/helpers/fadeaway/index.js +7 -0
  78. package/{programs → dist/programs}/helpers/fadeaway/logic.js +49 -53
  79. package/dist/programs/helpers/fadeaway/object.js +20 -0
  80. package/dist/programs/helpers/index.js +8 -0
  81. package/dist/programs/index.js +58 -0
  82. package/dist/programs/interface.js +1 -0
  83. package/{programs → dist/programs}/line-on-globe/angled-line.js +125 -155
  84. package/{programs → dist/programs}/line-on-globe/circle-accurate-3d.js +95 -121
  85. package/{programs → dist/programs}/line-on-globe/circle-accurate-flat.js +158 -204
  86. package/{programs → dist/programs}/line-on-globe/circle-accurate.js +117 -141
  87. package/{programs → dist/programs}/line-on-globe/circle.js +111 -135
  88. package/{programs → dist/programs}/line-on-globe/degree-padding-around-circle-3d.js +111 -140
  89. package/dist/programs/line-on-globe/index.js +1 -0
  90. package/{programs → dist/programs}/line-on-globe/lines-color-instanced-flat.js +91 -106
  91. package/{programs/line-on-globe/linestrip.ts → dist/programs/line-on-globe/linestrip.js} +108 -165
  92. package/{programs → dist/programs}/line-on-globe/naive-accurate-flexible.js +127 -171
  93. package/{programs → dist/programs}/line-on-globe/to-the-surface.js +83 -101
  94. package/dist/programs/line-on-globe/util.js +8 -0
  95. package/{programs → dist/programs}/picking/pickable-renderer.js +107 -135
  96. package/{programs → dist/programs}/point-on-globe/element-globe-surface-glow.js +101 -127
  97. package/{programs → dist/programs}/point-on-globe/element-point-glow.js +88 -119
  98. package/{programs → dist/programs}/point-on-globe/square-pixel-point.js +126 -141
  99. package/{programs/programcache.ts → dist/programs/programcache.js} +131 -131
  100. package/{programs → dist/programs}/rings/distancering/circleflatprogram.js +115 -95
  101. package/{programs → dist/programs}/rings/distancering/circlepaddingfreeangleprogram.js +320 -329
  102. package/{programs → dist/programs}/rings/distancering/circlepaddysharedbuffer.js +357 -420
  103. package/dist/programs/rings/distancering/index.js +14 -0
  104. package/{programs → dist/programs}/rings/distancering/paddyflatprogram.js +120 -94
  105. package/{programs → dist/programs}/rings/distancering/paddyflatprogram2d.js +122 -98
  106. package/{programs → dist/programs}/rings/distancering/paddyflatprogram3d.js +120 -94
  107. package/dist/programs/rings/distancering/shader.js +1 -0
  108. package/dist/programs/rings/index.js +17 -0
  109. package/{programs → dist/programs}/rings/partial-ring/piece-of-pie.js +181 -221
  110. package/{programs → dist/programs}/totems/camerauniformblock.js +147 -184
  111. package/{programs → dist/programs}/totems/canvas-webglobe-info.js +102 -128
  112. package/{programs → dist/programs}/totems/gpu-selection-uniform-block.js +104 -128
  113. package/dist/programs/totems/index.js +40 -0
  114. package/dist/programs/two-d/pixel-circle.js +1 -0
  115. package/{programs → dist/programs}/two-d/pixel-padding-for-compass.js +101 -113
  116. package/{programs → dist/programs}/util.js +17 -20
  117. package/dist/programs/vectorfields/index.js +23 -0
  118. package/{programs → dist/programs}/vectorfields/logics/drawrectangleparticles.js +65 -83
  119. package/dist/programs/vectorfields/logics/index.js +12 -0
  120. package/{programs → dist/programs}/vectorfields/logics/pixelbased.js +84 -103
  121. package/{programs → dist/programs}/vectorfields/logics/ubo.js +55 -56
  122. package/{programs → dist/programs}/vectorfields/pingpongbuffermanager.js +76 -80
  123. package/dist/rangerings/enum.js +5 -0
  124. package/dist/rangerings/index.js +15 -0
  125. package/{rangerings → dist/rangerings}/plugin.js +560 -649
  126. package/{rangerings → dist/rangerings}/rangeringangletext.js +329 -368
  127. package/{rangerings → dist/rangerings}/ring-account.js +117 -129
  128. package/{shaders → dist/shaders}/fragment-toy/firework.js +5 -2
  129. package/{shaders → dist/shaders}/fragment-toy/singularity.js +5 -5
  130. package/{shape-on-terrain/arc/naive/plugin.ts → dist/shape-on-terrain/arc/naive/plugin.js} +252 -304
  131. package/{timetracks → dist/timetracks}/adaptors-line-strip.js +71 -80
  132. package/{timetracks → dist/timetracks}/adaptors.js +122 -133
  133. package/dist/timetracks/index.js +19 -0
  134. package/{timetracks → dist/timetracks}/plugin-line-strip.js +250 -295
  135. package/{timetracks → dist/timetracks}/plugin.js +258 -304
  136. package/{timetracks → dist/timetracks}/program-line-strip.js +416 -493
  137. package/{timetracks → dist/timetracks}/program.js +464 -542
  138. package/{timetracks → dist/timetracks}/programpoint-line-strip.js +101 -122
  139. package/{timetracks → dist/timetracks}/programpoint.js +101 -122
  140. package/{types.ts → dist/types.js} +15 -17
  141. package/{util → dist/util}/account/bufferoffsetmanager.js +179 -209
  142. package/dist/util/account/index.js +23 -0
  143. package/{util/account/single-attribute-buffer-management/buffer-manager.ts → dist/util/account/single-attribute-buffer-management/buffer-manager.js} +108 -119
  144. package/{util/account/single-attribute-buffer-management/buffer-orchestrator.ts → dist/util/account/single-attribute-buffer-management/buffer-orchestrator.js} +150 -173
  145. package/dist/util/account/single-attribute-buffer-management/index.js +9 -0
  146. package/{util/account/single-attribute-buffer-management/object-store.ts → dist/util/account/single-attribute-buffer-management/object-store.js} +51 -65
  147. package/dist/util/account/single-attribute-buffer-management/types.js +2 -0
  148. package/{util → dist/util}/account/util.js +22 -22
  149. package/dist/util/algorithms/index.js +1 -0
  150. package/{util → dist/util}/algorithms/search-binary.js +28 -26
  151. package/dist/util/check/get.js +18 -0
  152. package/dist/util/check/index.js +1 -0
  153. package/dist/util/check/typecheck.js +49 -0
  154. package/{util → dist/util}/geometry/index.js +51 -53
  155. package/{util/gl-util/buffer/attribute-loader.ts → dist/util/gl-util/buffer/attribute-loader.js} +69 -85
  156. package/dist/util/gl-util/buffer/index.js +6 -0
  157. package/dist/util/gl-util/buffer/types.js +1 -0
  158. package/dist/util/gl-util/draw-options/methods.js +38 -0
  159. package/dist/util/gl-util/draw-options/types.js +15 -0
  160. package/{util/gl-util/uniform-block/manager.ts → dist/util/gl-util/uniform-block/manager.js} +156 -187
  161. package/dist/util/gl-util/uniform-block/shader.js +1 -0
  162. package/dist/util/gl-util/uniform-block/types.js +8 -0
  163. package/{util → dist/util}/heatwavedatamanager/datamanager.js +152 -168
  164. package/dist/util/heatwavedatamanager/index.js +10 -0
  165. package/{util → dist/util}/heatwavedatamanager/pointcoordinatesdatacalculator.js +122 -133
  166. package/{util → dist/util}/heatwavedatamanager/pointcoordsmeta.js +20 -22
  167. package/dist/util/index.js +57 -0
  168. package/dist/util/interpolation/index.js +1 -0
  169. package/dist/util/interpolation/timetrack/index.js +5 -0
  170. package/{util → dist/util}/interpolation/timetrack/timetrack-interpolator.js +79 -88
  171. package/{util → dist/util}/interpolation/timetrack/web-worker-str.js +5 -2
  172. package/{util → dist/util}/interpolation/timetrack/web-worker.js +48 -51
  173. package/{util → dist/util}/jshelpers/data-filler.js +20 -19
  174. package/{util → dist/util}/jshelpers/equality.js +20 -17
  175. package/dist/util/jshelpers/index.js +37 -0
  176. package/{util → dist/util}/jshelpers/timefilters.js +32 -32
  177. package/{util → dist/util}/picking/fence.js +46 -46
  178. package/{util → dist/util}/picking/picker-displayer.js +139 -177
  179. package/{util → dist/util}/programs/draw-texture-on-canvas.js +69 -82
  180. package/dist/util/programs/index.js +17 -0
  181. package/{util → dist/util}/programs/shapesonglobe.js +174 -206
  182. package/{util → dist/util}/programs/supersampletotextures.js +103 -132
  183. package/{util → dist/util}/programs/texturetoglobe.js +133 -154
  184. package/{util/shaderfunctions/geometrytransformations.ts → dist/util/shaderfunctions/geometrytransformations.js} +68 -116
  185. package/dist/util/shaderfunctions/index.js +18 -0
  186. package/{util → dist/util}/shaderfunctions/nodata.js +5 -4
  187. package/{util → dist/util}/shaderfunctions/noisefunctions.js +9 -10
  188. package/{util/surface-line-data/arc-bboxes.ts → dist/util/surface-line-data/arc-bboxes.js} +25 -42
  189. package/{util → dist/util}/surface-line-data/arcs-to-cuts.js +50 -74
  190. package/dist/util/surface-line-data/cut-arc.js +1 -0
  191. package/{util/surface-line-data/flow.ts → dist/util/surface-line-data/flow.js} +28 -52
  192. package/dist/util/surface-line-data/rbush-manager.js +1 -0
  193. package/dist/util/surface-line-data/types.js +1 -0
  194. package/dist/util/surface-line-data/web-worker.js +1 -0
  195. package/dist/util/webglobe/gldefaultstates.js +7 -0
  196. package/dist/util/webglobe/index.js +18 -0
  197. package/{util → dist/util}/webglobe/rasteroverlay.js +78 -96
  198. package/{util/webglobjectbuilders.ts → dist/util/webglobjectbuilders.js} +388 -456
  199. package/{util → dist/util}/webglobjectbuilders1.js +237 -271
  200. package/{waveparticles → dist/waveparticles}/adaptor.js +17 -16
  201. package/dist/waveparticles/index.js +10 -0
  202. package/{waveparticles → dist/waveparticles}/plugin.js +266 -313
  203. package/{wind → dist/wind}/imagetovectorfieldandmagnitude.js +35 -39
  204. package/dist/wind/index.js +14 -0
  205. package/{wind → dist/wind}/plugin.js +681 -812
  206. package/{wind → dist/wind}/vectorfieldimage.js +25 -27
  207. package/{write-text → dist/write-text}/attached-text-writer.js +91 -105
  208. package/{write-text → dist/write-text}/context-text.js +98 -125
  209. package/{write-text → dist/write-text}/context-text3.js +155 -178
  210. package/dist/write-text/index.js +5 -0
  211. package/{write-text → dist/write-text}/writer-plugin.js +8 -7
  212. package/package.json +5 -2
  213. package/Math/arc.ts +0 -76
  214. package/Math/constants.ts +0 -11
  215. package/Math/frustum/types.ts +0 -11
  216. package/Math/index.js +0 -0
  217. package/Math/juction/arc-plane.ts +0 -114
  218. package/Math/juction/line-sphere.ts +0 -30
  219. package/Math/line.ts +0 -70
  220. package/Math/matrix4.ts +0 -0
  221. package/Math/plane.ts +0 -86
  222. package/Math/roadmap.md +0 -10
  223. package/Math/types.ts +0 -45
  224. package/Math/utils.js +0 -3
  225. package/algorithms/search-binary.js +0 -14
  226. package/altitude-locator/adaptors.js +0 -0
  227. package/altitude-locator/keymethod.js +0 -0
  228. package/arrowfield/index.js +0 -3
  229. package/bearing-line/index.js +0 -2
  230. package/circle-line-chain/init.js +0 -0
  231. package/circle-line-chain/readme.md +0 -57
  232. package/circle-line-chain/util.js +0 -1
  233. package/compass-rose/index.js +0 -3
  234. package/compassrose/index.js +0 -2
  235. package/depth-locator/readme.md +0 -26
  236. package/globe-types.ts +0 -13
  237. package/heatwave/index.js +0 -4
  238. package/partialrings/goals.md +0 -17
  239. package/partialrings/index.js +0 -3
  240. package/point-heat-map/index.js +0 -0
  241. package/point-heat-map/readme.md +0 -15
  242. package/point-tracks/key-methods.js +0 -3
  243. package/programs/arrowfield/index.js +0 -2
  244. package/programs/float2legendwithratio/index.js +0 -3
  245. package/programs/globeshell/index.js +0 -2
  246. package/programs/globeshell/noise/noises.js +0 -0
  247. package/programs/globeshell/wiggle/index.js +0 -6
  248. package/programs/helpers/blender/index.js +0 -0
  249. package/programs/helpers/fadeaway/index.js +0 -3
  250. package/programs/helpers/fadeaway/object.js +0 -20
  251. package/programs/helpers/index.js +0 -2
  252. package/programs/index.js +0 -21
  253. package/programs/interface.ts +0 -7
  254. package/programs/line-on-globe/index.js +0 -0
  255. package/programs/line-on-globe/util.js +0 -8
  256. package/programs/rings/distancering/index.js +0 -5
  257. package/programs/rings/distancering/shader.js +0 -0
  258. package/programs/rings/index.js +0 -1
  259. package/programs/totems/camerauniformblock.d.ts +0 -48
  260. package/programs/totems/index.ts +0 -2
  261. package/programs/two-d/pixel-circle.js +0 -0
  262. package/programs/vectorfields/index.js +0 -3
  263. package/programs/vectorfields/logics/index.js +0 -5
  264. package/publish.bat +0 -60
  265. package/rangerings/enum.js +0 -3
  266. package/rangerings/index.js +0 -5
  267. package/shape-on-terrain/goal.md +0 -12
  268. package/tests/Math/junction/arc-plane.test.ts +0 -133
  269. package/tests/Math/junction/plane-plane.test.ts +0 -82
  270. package/tests/Math/plane.test.ts +0 -43
  271. package/tests/Math/vec3.test.ts +0 -14
  272. package/timetracks/index.js +0 -6
  273. package/timetracks/readme.md +0 -1
  274. package/tsconfig.json +0 -22
  275. package/util/account/index.js +0 -6
  276. package/util/account/single-attribute-buffer-management/index.ts +0 -13
  277. package/util/account/single-attribute-buffer-management/types.ts +0 -39
  278. package/util/algorithms/index.js +0 -0
  279. package/util/check/get.js +0 -13
  280. package/util/check/index.js +0 -0
  281. package/util/check/typecheck.js +0 -39
  282. package/util/gl-util/buffer/index.ts +0 -6
  283. package/util/gl-util/buffer/types.ts +0 -13
  284. package/util/gl-util/draw-options/methods.ts +0 -66
  285. package/util/gl-util/draw-options/types.ts +0 -28
  286. package/util/gl-util/uniform-block/roadmap.md +0 -70
  287. package/util/gl-util/uniform-block/shader.js +0 -0
  288. package/util/gl-util/uniform-block/types.ts +0 -27
  289. package/util/heatwavedatamanager/index.js +0 -3
  290. package/util/index.js +0 -13
  291. package/util/interpolation/index.js +0 -0
  292. package/util/interpolation/timetrack/index.js +0 -9
  293. package/util/jshelpers/index.js +0 -1
  294. package/util/programs/index.js +0 -1
  295. package/util/shaderfunctions/index.js +0 -2
  296. package/util/surface-line-data/cut-arc.js +0 -0
  297. package/util/surface-line-data/rbush-manager.js +0 -0
  298. package/util/surface-line-data/types.ts +0 -27
  299. package/util/surface-line-data/web-worker.js +0 -0
  300. package/util/webglobe/gldefaultstates.js +0 -5
  301. package/util/webglobe/index.js +0 -2
  302. package/waveparticles/index.js +0 -3
  303. package/wind/index.js +0 -5
  304. package/write-text/index.js +0 -1
@@ -1,512 +1,449 @@
1
- import { PieceOfPieProgramCache } from '../programs/rings/partial-ring/piece-of-pie';
2
- import { LineOnGlobeCache } from '../programs/line-on-globe/naive-accurate-flexible';
3
- import { CircleCache as Circle3DCache } from '../programs/line-on-globe/circle-accurate-3d';
4
- import { CircleCache, EDGE_COUNT as flatCircleEdgeCount, centerCoords2dflatDataCreator } from '../programs/line-on-globe/circle-accurate-flat';
5
- import { BufferOrchestrator, BufferManager } from '../util/account';
6
- import { mapGetOrThrow } from "../util/check/get";
7
- import { populateFloat32Array } from "../util/jshelpers/data-filler";
8
- import { ContextTextWriter3 } from '../write-text/context-text3'
9
- import { constraintFloat, isBoolean } from '../util/check/typecheck';
10
- import { sphereCoord } from '../util/geometry';
11
- import { createBufferAndReadInfo } from '../util/gl-util/buffer/attribute-loader';
12
-
13
- export const RINGPARTIAL_DRAW_MODE = Object.freeze({
14
- LINE_STRIP: "LINE_STRIP",
15
- TRIANGLE_FAN: "TRIANGLE_FAN",
16
- });
17
-
18
-
19
- /**
20
- * @typedef {{key, long, lat, endLong, endLat, bearingAngle, radius, rgba:[4numbers], rgbaMode, bigRadius, dashRatio, dashOpacity, circleDashAngle}} BearingLineItem
21
- * @property {string} key
22
- * @property {number} long
23
- * @property {number} lat
24
- * @property {number} endLong
25
- * @property {number} endLat
26
- * @property {number} bearingAngle 0-360
27
- * @property {number} radius angle ring radius
28
- * @property {number} altitude in meters effects all parts of the item
29
- * @property {Array<numbers>} rgba [r,g,b,a] 0-1
30
- * @property {number} rgbaMode 0 constant, 1 fading, 2 hides angle ring
31
- * @property {number} bigRadius undefined means it will be calculated from long, lat, endLong, endLat
32
- * @property {number} dashRatio 0-1
33
- * @property {number} dashOpacity 0-1
34
- * @property {number} circleDashAngle 0-360
35
- */
36
-
37
- const textWriterGetOrThrow = mapGetOrThrow("BearingLine textContextInjection id does not exist in map")
38
-
39
-
40
- const radian = (degree) => degree * Math.PI / 180;
41
-
42
- const integralSec = (angle) => {
43
- return Math.log(Math.tan(angle / 2 + Math.PI / 4));
44
- }
45
-
46
-
47
- const calculateStartAngle = (long, lat, endLong, endLat) => {
48
- const dLat = (integralSec(endLat) - integralSec(lat)); // Because lines are strectes toward poles.
49
- const dLong = endLong - long;
50
-
51
- let angle = -Math.atan2(dLat, dLong);
52
- return angle;
53
- }
54
-
55
-
56
-
57
- export default class BearingLinePlugin {
58
- /**
59
- * @param {*} id
60
- * @param {Map<[key, ContextTextWriter3]>} textWritersMap
61
- */
62
- constructor(id,
63
- {
64
- opacity = 1,
65
- textWritersMap = new Map(),
66
- textDataPreAdaptor = (x) => x,
67
- drawVRM = true,
68
- drawBearingLine = true,
69
- drawAngleRing = true,
70
- drawText = true,
71
- circleFlatEdgeCount = flatCircleEdgeCount - 2
72
- } = {}) {
73
- this.id = id;
74
- this._opacity = opacity;
75
- this.bufferOrchestrator = new BufferOrchestrator({ capacity: 10 });
76
- this._checkTextContextWriterInjectionMap(textWritersMap);
77
- this._textWritersMap = textWritersMap;
78
- this._textWritersMap.forEach((writer) => writer.keyAdaptor = (item) => item.key);
79
- this.drawVRM = drawVRM;
80
- this.drawBearingLine = drawBearingLine;
81
- this.drawAngleRing = drawAngleRing;
82
- this._textDataPreAdaptor = textDataPreAdaptor;
83
- this.drawText = drawText;
84
- this._memoryForText = new Map();
85
- this.circleFlatEdgeCount = circleFlatEdgeCount + 2;
86
- }
87
-
88
-
89
- setDoDrawVRM(bool) {
90
- isBoolean(bool);
91
- if (bool === this.drawVRM) return;
92
- this.drawVRM = bool;
93
- this.globe.DrawRender();
94
- }
95
-
96
-
97
- setDoDrawText(bool) {
98
- isBoolean(bool);
99
- if (bool === this.drawText) return;
100
- this.drawText = bool;
101
- this.globe.DrawRender();
102
- }
103
-
104
-
105
- setDoDrawText(bool) {
106
- isBoolean(bool);
107
- if (bool === this.drawText) return;
108
- this.drawText = bool;
109
- this.globe.DrawRender();
110
- }
111
-
112
-
113
- setDoDrawAngleRing(bool) {
114
- isBoolean(bool);
115
- if (bool === this.drawAngleRing) return;
116
- this.drawAngleRing = bool;
117
- this.globe.DrawRender();
118
- }
119
-
120
-
121
- setOpacity(opacity) {
122
- constraintFloat(opacity, 0, 1);
123
- this._opacity = opacity;
124
- this._textWritersMap.forEach((writer) => writer.setOpacity(opacity));
125
- this.globe.DrawRender();
126
- }
127
-
128
-
129
- /**
130
-
131
- * @param {Array<BearingLineItem>} items
132
- * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
133
- */
134
- insertBulk(items, { textWriterIDs = [] } = {}) {
135
- const { globe, bufferOrchestrator, bufferManagersCompMap } = this;// angleTextContext, distanceTextContext,
136
- const data = []
137
- for (let item of items) {
138
- data.push(this.__insertAdaptor(item));
139
- }
140
- bufferOrchestrator.insertBulk(data, bufferManagersCompMap);
141
- this.__insertTexts(items, textWriterIDs);
142
-
143
- globe.DrawRender();
144
- }
145
-
146
-
147
- /**
148
- * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
149
- * @param {Array<string>} itemKeys | if empty, all texts will be updated.
150
- */
151
- updateText(textWriterIDs = [], itemKeys = null) {
152
- const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
153
- if (itemKeys === null) {
154
- this._memoryForText.forEach((item) => {
155
- let _item = this._textDataPreAdaptor(item);
156
- textWritersMap.forEach((writer) => writer.insertText(_item));
157
- });
158
- } else {
159
- itemKeys.forEach((key) => {
160
- let item = this._memoryForText.get(key);
161
- if (item === undefined) return;
162
- let _item = this._textDataPreAdaptor(item);
163
- textWritersMap.forEach((writer) => writer.insertText(_item));
164
- });
165
- }
166
- this.globe.DrawRender();
167
- }
168
-
169
-
170
- deleteBulk(keys) {
171
- this.bufferOrchestrator.deleteBulk(keys, this.bufferManagersCompMap);
172
- for (const key of keys) {
173
- this._memoryForText.delete(key);
174
- }
175
- this._deleteTexts(keys);
176
- this.globe.DrawRender();
177
- }
178
-
179
-
180
- defrag() {// use with caution
181
- this.bufferOrchestrator.defrag(this.bufferManagersCompMap);
182
- }
183
-
184
-
185
- /**
186
- * @param {Array<{key, long, lat, endLong, endLat, bearingAngle}>} items
187
- * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
188
- */
189
- updateCoordinatesBulk(items, { textWriterIDs = [] } = {}) {
190
- const { globe, bufferOrchestrator, bufferManagersCompMap, } = this;
191
- const data = []
192
- for (let item of items) {
193
- data.push(this.__updateCoordsAdaptor(item));
194
- }
195
- this.__insertTexts(items, textWriterIDs);
196
- bufferOrchestrator.updateBulk(data, bufferManagersCompMap, ["centerCoords2d", "centerCoords3d", "targetCoords2d", "targetCoords3d",
197
- "startAngle2d", "tailAngle2d", "startAngle3d", "tailAngle3d", "bearingTargetCoords2d", "bearingTargetCoords3d", "centerCoords2dflat",
198
- "bigRadius", "radius"]);
199
- globe.DrawRender();
200
- }
201
-
202
-
203
- /**
204
- *
205
- * @param {Array<BearingLineItem>} items some colums EXCEPT positional ones
206
- * @param {string} propertyIDs
207
- * @param {string} textWriterIDs
208
- * Do NOT send empty data if property ID of this data is entered or NaN is loaded to the buffer, resulting in an unwanted behaviour.
209
- *{ textWriterIDs = []}
210
- */
211
- updatePartial(items, propertyIDs = [], { textWriterIDs = [] } = {}) {
212
- if (propertyIDs.length === 0) console.warn("updatePartial is called with no target propertyIDs");
213
- const fixedPropertyIDs = this.__fixPartialProperties(propertyIDs)
214
- const { bufferOrchestrator, bufferManagersCompMap } = this;
215
- bufferOrchestrator.updateBulk(items, bufferManagersCompMap, fixedPropertyIDs);
216
- // patch to update text opacity
217
- this.__insertTexts(items, textWriterIDs);
218
- this.globe.DrawRender();
219
- }
220
-
221
- // Private methods
222
-
223
- _checkTextContextWriterInjectionMap(textContextWriterInjectionMap) {
224
- if (!(textContextWriterInjectionMap instanceof Map)) throw new Error("textContextWriterInjectionMap is not an instance of Map");
225
- textContextWriterInjectionMap.forEach((v) => {
226
- if (!(v instanceof ContextTextWriter3)) throw new Error("textContextWriterInjectionMap element is not an instance of ContextTextWriter3");
227
- });
228
- }
229
-
230
-
231
- __insertTexts(items, textWriterIDs) {
232
- const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
233
- for (const item of items) {
234
- const oldItem = this._memoryForText.get(item.key);
235
- let _item = oldItem !== undefined ? { ...oldItem, ...item } : item;
236
- this._memoryForText.set(item.key, _item);
237
- if (this._textDataPreAdaptor !== null) _item = this._textDataPreAdaptor(_item);
238
- textWritersMap.forEach((writer) => writer.insertText(_item));
239
- }
240
- }
241
-
242
-
243
- __insertAdaptor(item) {
244
- const rgba = item.rgba !== undefined ? item.rgba : [0, 0, 0, 0];
245
- const rgbaMode = item.rgbaMode !== undefined ? item.rgbaMode : 0;
246
- const dashRatio = item.dashRatio !== undefined ? item.dashRatio : 1.0;
247
- const dashOpacity = item.dashOpacity !== undefined ? item.dashOpacity : 0.9;
248
- const circleDashAngle = item.circleDashAngle !== undefined ? item.circleDashAngle : 360;
249
- const coordsData = this.__updateCoordsAdaptor(item);
250
-
251
- return {
252
- ...coordsData,
253
- rgba,
254
- dashRatio,
255
- dashOpacity,
256
- circleDashAngle,
257
- rgbaMode
258
- };
259
- }
260
-
261
-
262
- __updateCoordsAdaptor(item) {
263
- const { globe } = this;
264
- const lat = radian(item.lat)
265
- const long = radian(item.long)
266
- const endLat = radian(item.endLat)
267
- const endLong = radian(item.endLong)
268
- const altitude = (item.altitude ?? 0) / 1000;
269
- const bigRadius = item.bigRadius ?? globe.Math.GetDist2D(item.long, item.lat, item.endLong, item.endLat);
270
- const radius = item.radius !== undefined ? item.radius : bigRadius * 0.2;
271
- const { long: bearingLong, lat: bearingLat } = globe.Math.FindPointByPolar(item.long, item.lat, bigRadius, item.bearingAngle)
272
- const startAngle2d = calculateStartAngle(long, lat, endLong, endLat);
273
- const bearingAngle2d = calculateStartAngle(long, lat, radian(bearingLong), radian(bearingLat))
274
- let tailAngle2d = bearingAngle2d - startAngle2d;
275
- if (tailAngle2d > 0) {
276
- tailAngle2d -= Math.PI * 2;
277
- }
278
- const bearingAngle = radian(item.bearingAngle - 90);
279
- const startAngleOfCircle = globe.Math.GetAzimuthAngle(item.long, item.lat, item.endLong, item.endLat) //startAngle2d * 180 / Math.PI;
280
- const startAngle3d = radian(startAngleOfCircle) - radian(90);
281
- let tailAngle3d = bearingAngle - startAngle3d;
282
- if (tailAngle3d > 0) {
283
- tailAngle3d -= Math.PI * 2;
284
- }
285
-
286
- const centerCoords2dflat = centerCoords2dflatDataCreator(globe, item.long, item.lat, item.endLong, item.endLat, { startAngleOfCircle, edgeCount: this.circleFlatEdgeCount });
287
- return {
288
- key: item.key,
289
- lat: item.lat,
290
- long: item.long,
291
- endLat: item.endLat,
292
- endLong: item.endLong,
293
- altitude,
294
- bearingAngle,
295
- radius,
296
- bigRadius,
297
- startAngle2d,
298
- tailAngle2d,
299
- startAngle3d,
300
- tailAngle3d,
301
- bearingLong,
302
- bearingLat,
303
- centerCoords2dflat
304
- };
305
- }
306
-
307
-
308
- __fixPartialProperties(propertyIDs) {
309
- const s = new Set(["rgba", "dashOpacity", "circleDashAngle"]);
310
- const result = []
311
- for (const item of propertyIDs) {
312
- result.push(item);
313
- if (s.has(item)) {
314
- result.push(item + "Mercator");
315
- }
316
- }
317
- return result;
318
- }
319
-
320
- // Globe API
321
-
322
- init(globe, gl) {
323
- this.gl = gl;
324
- this.globe = globe;
325
- this.lineProgram = LineOnGlobeCache.get(globe);
326
- this.pieceOfPieProgram = PieceOfPieProgramCache.get(globe);
327
- this.circleProgram = CircleCache.get(globe);
328
- this.circle3DProgram = Circle3DCache.get(globe);
329
- const circleFlatEdgeCount = this.circleFlatEdgeCount
330
- {
331
-
332
- // createBuffers
333
- const bufferType = "DYNAMIC_DRAW";
334
- const initialCapacity = this.bufferOrchestrator.capacity;
335
- this.bufferManagersCompMap = new Map(
336
- [
337
- ["centerCoords2d", {
338
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
339
- 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.long, item.lat)),
340
- }],
341
- ["centerCoords2dflat", {
342
- 'bufferManager': new BufferManager(gl, circleFlatEdgeCount * 2, { bufferType, initialCapacity }),
343
- 'adaptor': (item) => item.centerCoords2dflat,
344
- }],
345
- ["centerCoords3d", {
346
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
347
- 'adaptor': (item) => sphereCoord(item.long, item.lat, globe, item.altitude),
348
- }],
349
- ["targetCoords2d", {
350
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
351
- 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.endLong, item.endLat))
352
- }],
353
- ["targetCoords3d", {
354
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
355
- 'adaptor': (item) => sphereCoord(item.endLong, item.endLat, globe, item.altitude)
356
- }],
357
- ["bearingTargetCoords2d", {
358
- 'bufferManager': new BufferManager(gl, 2, { bufferType, initialCapacity }),
359
- 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.bearingLong, item.bearingLat))
360
- }],
361
- ["bearingTargetCoords3d", {
362
- 'bufferManager': new BufferManager(gl, 3, { bufferType, initialCapacity }),
363
- 'adaptor': (item) => sphereCoord(item.bearingLong, item.bearingLat, globe, item.altitude)
364
- }],
365
- ["startAngle2d", {
366
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
367
- 'adaptor': (item) => new Float32Array([item.startAngle2d])
368
- }],
369
- ["tailAngle2d", {
370
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
371
- 'adaptor': (item) => new Float32Array([item.tailAngle2d])
372
- }],
373
- ["startAngle3d", {
374
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
375
- 'adaptor': (item) => new Float32Array([item.startAngle3d])
376
- }],
377
- ["tailAngle3d", {
378
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
379
- 'adaptor': (item) => new Float32Array([item.tailAngle3d])
380
- }],
381
- ["bearingDashRatio", {
382
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
383
- 'adaptor': (item) => new Float32Array([0])
384
- }],
385
- ["rgba", {
386
- 'bufferManager': new BufferManager(gl, 4, { bufferType, initialCapacity }),
387
- 'adaptor': (item) => new Float32Array(item.rgba)
388
- }],
389
- ["radius", {
390
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
391
- 'adaptor': (item) => new Float32Array([item.radius])
392
- }],
393
- ["rgbaMode", {
394
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
395
- 'adaptor': (item) => new Float32Array([item.rgbaMode])
396
- }],
397
- ["dashRatio", {
398
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
399
- 'adaptor': (item) => new Float32Array([item.dashRatio])
400
- }],
401
-
402
- ["bigRadius", {
403
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
404
- 'adaptor': (item) => new Float32Array([item.bigRadius])
405
- }],
406
- ["dashOpacity", {
407
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
408
- 'adaptor': (item) => new Float32Array([item.dashOpacity]),
409
- }],
410
- ["circleDashAngle", {
411
- 'bufferManager': new BufferManager(gl, 1, { bufferType, initialCapacity }),
412
- 'adaptor': (item) => new Float32Array([item.circleDashAngle / 360]),
413
- }],
414
- // Mercator circle properties are duplicated for the sake of performance.
415
- ["rgbaMercator", {
416
- 'bufferManager': new BufferManager(gl, 4 * circleFlatEdgeCount, { bufferType, initialCapacity }),
417
- 'adaptor': (item) => populateFloat32Array.fillWithListData(circleFlatEdgeCount, item.rgba),
418
- }],
419
- ["circleDashAngleMercator", {
420
- 'bufferManager': new BufferManager(gl, circleFlatEdgeCount, { bufferType, initialCapacity }),
421
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(circleFlatEdgeCount, item.circleDashAngle / 360),
422
- }],
423
- ["dashOpacityMercator", {
424
- 'bufferManager': new BufferManager(gl, circleFlatEdgeCount, { bufferType, initialCapacity }),
425
- 'adaptor': (item) => populateFloat32Array.fillFloat32Array(circleFlatEdgeCount, item.dashOpacity),
426
- }],
427
- ]
428
- );
429
- }
430
-
431
- const vaoOBJ = (key) => createBufferAndReadInfo(this.bufferManagersCompMap.get(key).bufferManager.buffer);
432
- this.lineVao = this.lineProgram.createVAO(
433
- ...['centerCoords2d', 'centerCoords3d', 'targetCoords2d', 'targetCoords3d', 'dashOpacity', 'dashOpacity', 'rgba'].map(
434
- key => vaoOBJ(key)));
435
- this.ringVao = this.pieceOfPieProgram.createVAO(
436
- ...['centerCoords2d',
437
- 'centerCoords3d',
438
- 'startAngle2d',
439
- 'tailAngle2d',
440
- 'startAngle3d',
441
- 'tailAngle3d',
442
- 'rgba',
443
- 'radius',
444
- 'rgbaMode'].map(key => vaoOBJ(key)));
445
- this.bearingLineVAO = this.lineProgram.createVAO(
446
- ...['centerCoords2d', 'centerCoords3d', 'bearingTargetCoords2d', 'bearingTargetCoords3d', 'bearingDashRatio', 'dashOpacity', 'rgba'
447
- ].map(key => vaoOBJ(key)));
448
- this.circleVao = this.circleProgram.createVAO(
449
- ...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"
450
- ].map(key => vaoOBJ(key)));
451
- this.circle3DVao = this.circle3DProgram.createVAO(
452
- ...["centerCoords3d", "targetCoords3d", "rgba", "circleDashAngle", "dashOpacity"
453
- ].map(key => vaoOBJ(key)));
454
- }
455
-
456
-
457
- draw3D() {
458
- const { gl } = this;
459
- gl.disable(gl.DEPTH_TEST);
460
- const is3D = this.globe.api_GetCurrentGeometry() === 0;
461
- const drawRange = { first: 0, count: this.bufferOrchestrator.length }
462
-
463
- this.lineProgram.draw(this.lineVao, { drawRange }, this._opacity);
464
- if (this.drawAngleRing) {
465
- this.pieceOfPieProgram.draw(this.bufferOrchestrator.length, this.ringVao, 360, this._opacity * 0.8, RINGPARTIAL_DRAW_MODE.TRIANGLE_FAN);
466
- this.pieceOfPieProgram.draw(this.bufferOrchestrator.length, this.ringVao, 360, this._opacity * 0.8, RINGPARTIAL_DRAW_MODE.LINE_STRIP);
467
- }
468
- if (this.drawBearingLine) {
469
- // this.lineProgram.draw(this.bearingLineVAO, this.bufferOrchestrator.length, this._opacity );
470
- this.lineProgram.draw(this.bearingLineVAO, { drawRange }, this._opacity);
471
- }
472
- if (this.drawVRM) {
473
- if (is3D) {
474
- this.circle3DProgram.draw(this.circle3DVao, this.bufferOrchestrator.length, this._opacity);
475
- } else {
476
- this.circleProgram.draw(this.circleVao, this.bufferOrchestrator.length, this.circleFlatEdgeCount, this._opacity);
477
- }
478
- }
479
- if (this.drawText) {
480
- this._textWritersMap.forEach((writer) => writer.draw());
481
- }
482
- gl.enable(gl.DEPTH_TEST);
483
- }
484
-
485
-
486
- free() {
487
- if (this.isFreed) return;
488
- this.bufferManagersCompMap.forEach(({ bufferManager, adaptor }) => {
489
- bufferManager.free();
490
- });
491
- const { gl, globe } = this;
492
- gl.deleteVertexArray(this.lineVao);
493
- gl.deleteVertexArray(this.ringVao);
494
- gl.deleteVertexArray(this.bearingLineVAO);
495
- gl.deleteVertexArray(this.circleVao);
496
- gl.deleteVertexArray(this.circle3DVao);
497
- LineOnGlobeCache.release(globe);
498
- PieceOfPieProgramCache.release(globe);
499
- CircleCache.release(globe);
500
- Circle3DCache.release(globe)
501
- this.isFreed = true;
502
- }
503
-
504
-
505
- _deleteTexts(keys) {
506
- this._textWritersMap.forEach((writer) => {
507
- writer.deleteTextBulk(keys);
508
- });
509
- }
510
- }
511
-
512
-
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RINGPARTIAL_DRAW_MODE = void 0;
4
+ const piece_of_pie_1 = require("../programs/rings/partial-ring/piece-of-pie");
5
+ const naive_accurate_flexible_1 = require("../programs/line-on-globe/naive-accurate-flexible");
6
+ const circle_accurate_3d_1 = require("../programs/line-on-globe/circle-accurate-3d");
7
+ const circle_accurate_flat_1 = require("../programs/line-on-globe/circle-accurate-flat");
8
+ const account_1 = require("../util/account");
9
+ const get_1 = require("../util/check/get");
10
+ const data_filler_1 = require("../util/jshelpers/data-filler");
11
+ const context_text3_1 = require("../write-text/context-text3");
12
+ const typecheck_1 = require("../util/check/typecheck");
13
+ const geometry_1 = require("../util/geometry");
14
+ const attribute_loader_1 = require("../util/gl-util/buffer/attribute-loader");
15
+ exports.RINGPARTIAL_DRAW_MODE = Object.freeze({
16
+ LINE_STRIP: "LINE_STRIP",
17
+ TRIANGLE_FAN: "TRIANGLE_FAN",
18
+ });
19
+ /**
20
+ * @typedef {{key, long, lat, endLong, endLat, bearingAngle, radius, rgba:[4numbers], rgbaMode, bigRadius, dashRatio, dashOpacity, circleDashAngle}} BearingLineItem
21
+ * @property {string} key
22
+ * @property {number} long
23
+ * @property {number} lat
24
+ * @property {number} endLong
25
+ * @property {number} endLat
26
+ * @property {number} bearingAngle 0-360
27
+ * @property {number} radius angle ring radius
28
+ * @property {number} altitude in meters effects all parts of the item
29
+ * @property {Array<numbers>} rgba [r,g,b,a] 0-1
30
+ * @property {number} rgbaMode 0 constant, 1 fading, 2 hides angle ring
31
+ * @property {number} bigRadius undefined means it will be calculated from long, lat, endLong, endLat
32
+ * @property {number} dashRatio 0-1
33
+ * @property {number} dashOpacity 0-1
34
+ * @property {number} circleDashAngle 0-360
35
+ */
36
+ const textWriterGetOrThrow = (0, get_1.mapGetOrThrow)("BearingLine textContextInjection id does not exist in map");
37
+ const radian = (degree) => degree * Math.PI / 180;
38
+ const integralSec = (angle) => {
39
+ return Math.log(Math.tan(angle / 2 + Math.PI / 4));
40
+ };
41
+ const calculateStartAngle = (long, lat, endLong, endLat) => {
42
+ const dLat = (integralSec(endLat) - integralSec(lat)); // Because lines are strectes toward poles.
43
+ const dLong = endLong - long;
44
+ let angle = -Math.atan2(dLat, dLong);
45
+ return angle;
46
+ };
47
+ class BearingLinePlugin {
48
+ /**
49
+ * @param {*} id
50
+ * @param {Map<[key, ContextTextWriter3]>} textWritersMap
51
+ */
52
+ constructor(id, { opacity = 1, textWritersMap = new Map(), textDataPreAdaptor = (x) => x, drawVRM = true, drawBearingLine = true, drawAngleRing = true, drawText = true, circleFlatEdgeCount = circle_accurate_flat_1.EDGE_COUNT - 2 } = {}) {
53
+ this.id = id;
54
+ this._opacity = opacity;
55
+ this.bufferOrchestrator = new account_1.BufferOrchestrator({ capacity: 10 });
56
+ this._checkTextContextWriterInjectionMap(textWritersMap);
57
+ this._textWritersMap = textWritersMap;
58
+ this._textWritersMap.forEach((writer) => writer.keyAdaptor = (item) => item.key);
59
+ this.drawVRM = drawVRM;
60
+ this.drawBearingLine = drawBearingLine;
61
+ this.drawAngleRing = drawAngleRing;
62
+ this._textDataPreAdaptor = textDataPreAdaptor;
63
+ this.drawText = drawText;
64
+ this._memoryForText = new Map();
65
+ this.circleFlatEdgeCount = circleFlatEdgeCount + 2;
66
+ }
67
+ setDoDrawVRM(bool) {
68
+ (0, typecheck_1.isBoolean)(bool);
69
+ if (bool === this.drawVRM)
70
+ return;
71
+ this.drawVRM = bool;
72
+ this.globe.DrawRender();
73
+ }
74
+ setDoDrawText(bool) {
75
+ (0, typecheck_1.isBoolean)(bool);
76
+ if (bool === this.drawText)
77
+ return;
78
+ this.drawText = bool;
79
+ this.globe.DrawRender();
80
+ }
81
+ setDoDrawText(bool) {
82
+ (0, typecheck_1.isBoolean)(bool);
83
+ if (bool === this.drawText)
84
+ return;
85
+ this.drawText = bool;
86
+ this.globe.DrawRender();
87
+ }
88
+ setDoDrawAngleRing(bool) {
89
+ (0, typecheck_1.isBoolean)(bool);
90
+ if (bool === this.drawAngleRing)
91
+ return;
92
+ this.drawAngleRing = bool;
93
+ this.globe.DrawRender();
94
+ }
95
+ setOpacity(opacity) {
96
+ (0, typecheck_1.constraintFloat)(opacity, 0, 1);
97
+ this._opacity = opacity;
98
+ this._textWritersMap.forEach((writer) => writer.setOpacity(opacity));
99
+ this.globe.DrawRender();
100
+ }
101
+ /**
102
+
103
+ * @param {Array<BearingLineItem>} items
104
+ * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
105
+ */
106
+ insertBulk(items, { textWriterIDs = [] } = {}) {
107
+ const { globe, bufferOrchestrator, bufferManagersCompMap } = this; // angleTextContext, distanceTextContext,
108
+ const data = [];
109
+ for (let item of items) {
110
+ data.push(this.__insertAdaptor(item));
111
+ }
112
+ bufferOrchestrator.insertBulk(data, bufferManagersCompMap);
113
+ this.__insertTexts(items, textWriterIDs);
114
+ globe.DrawRender();
115
+ }
116
+ /**
117
+ * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
118
+ * @param {Array<string>} itemKeys | if empty, all texts will be updated.
119
+ */
120
+ updateText(textWriterIDs = [], itemKeys = null) {
121
+ const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
122
+ if (itemKeys === null) {
123
+ this._memoryForText.forEach((item) => {
124
+ let _item = this._textDataPreAdaptor(item);
125
+ textWritersMap.forEach((writer) => writer.insertText(_item));
126
+ });
127
+ }
128
+ else {
129
+ itemKeys.forEach((key) => {
130
+ let item = this._memoryForText.get(key);
131
+ if (item === undefined)
132
+ return;
133
+ let _item = this._textDataPreAdaptor(item);
134
+ textWritersMap.forEach((writer) => writer.insertText(_item));
135
+ });
136
+ }
137
+ this.globe.DrawRender();
138
+ }
139
+ deleteBulk(keys) {
140
+ this.bufferOrchestrator.deleteBulk(keys, this.bufferManagersCompMap);
141
+ for (const key of keys) {
142
+ this._memoryForText.delete(key);
143
+ }
144
+ this._deleteTexts(keys);
145
+ this.globe.DrawRender();
146
+ }
147
+ defrag() {
148
+ this.bufferOrchestrator.defrag(this.bufferManagersCompMap);
149
+ }
150
+ /**
151
+ * @param {Array<{key, long, lat, endLong, endLat, bearingAngle}>} items
152
+ * @param {Array<string>} textWriterIDs | textWritersMap keys to be used for writing text.
153
+ */
154
+ updateCoordinatesBulk(items, { textWriterIDs = [] } = {}) {
155
+ const { globe, bufferOrchestrator, bufferManagersCompMap, } = this;
156
+ const data = [];
157
+ for (let item of items) {
158
+ data.push(this.__updateCoordsAdaptor(item));
159
+ }
160
+ this.__insertTexts(items, textWriterIDs);
161
+ bufferOrchestrator.updateBulk(data, bufferManagersCompMap, ["centerCoords2d", "centerCoords3d", "targetCoords2d", "targetCoords3d",
162
+ "startAngle2d", "tailAngle2d", "startAngle3d", "tailAngle3d", "bearingTargetCoords2d", "bearingTargetCoords3d", "centerCoords2dflat",
163
+ "bigRadius", "radius"]);
164
+ globe.DrawRender();
165
+ }
166
+ /**
167
+ *
168
+ * @param {Array<BearingLineItem>} items some colums EXCEPT positional ones
169
+ * @param {string} propertyIDs
170
+ * @param {string} textWriterIDs
171
+ * Do NOT send empty data if property ID of this data is entered or NaN is loaded to the buffer, resulting in an unwanted behaviour.
172
+ *{ textWriterIDs = []}
173
+ */
174
+ updatePartial(items, propertyIDs = [], { textWriterIDs = [] } = {}) {
175
+ if (propertyIDs.length === 0)
176
+ console.warn("updatePartial is called with no target propertyIDs");
177
+ const fixedPropertyIDs = this.__fixPartialProperties(propertyIDs);
178
+ const { bufferOrchestrator, bufferManagersCompMap } = this;
179
+ bufferOrchestrator.updateBulk(items, bufferManagersCompMap, fixedPropertyIDs);
180
+ // patch to update text opacity
181
+ this.__insertTexts(items, textWriterIDs);
182
+ this.globe.DrawRender();
183
+ }
184
+ // Private methods
185
+ _checkTextContextWriterInjectionMap(textContextWriterInjectionMap) {
186
+ if (!(textContextWriterInjectionMap instanceof Map))
187
+ throw new Error("textContextWriterInjectionMap is not an instance of Map");
188
+ textContextWriterInjectionMap.forEach((v) => {
189
+ if (!(v instanceof context_text3_1.ContextTextWriter3))
190
+ throw new Error("textContextWriterInjectionMap element is not an instance of ContextTextWriter3");
191
+ });
192
+ }
193
+ __insertTexts(items, textWriterIDs) {
194
+ const textWritersMap = textWriterGetOrThrow(this._textWritersMap, textWriterIDs);
195
+ for (const item of items) {
196
+ const oldItem = this._memoryForText.get(item.key);
197
+ let _item = oldItem !== undefined ? { ...oldItem, ...item } : item;
198
+ this._memoryForText.set(item.key, _item);
199
+ if (this._textDataPreAdaptor !== null)
200
+ _item = this._textDataPreAdaptor(_item);
201
+ textWritersMap.forEach((writer) => writer.insertText(_item));
202
+ }
203
+ }
204
+ __insertAdaptor(item) {
205
+ const rgba = item.rgba !== undefined ? item.rgba : [0, 0, 0, 0];
206
+ const rgbaMode = item.rgbaMode !== undefined ? item.rgbaMode : 0;
207
+ const dashRatio = item.dashRatio !== undefined ? item.dashRatio : 1.0;
208
+ const dashOpacity = item.dashOpacity !== undefined ? item.dashOpacity : 0.9;
209
+ const circleDashAngle = item.circleDashAngle !== undefined ? item.circleDashAngle : 360;
210
+ const coordsData = this.__updateCoordsAdaptor(item);
211
+ return {
212
+ ...coordsData,
213
+ rgba,
214
+ dashRatio,
215
+ dashOpacity,
216
+ circleDashAngle,
217
+ rgbaMode
218
+ };
219
+ }
220
+ __updateCoordsAdaptor(item) {
221
+ var _a, _b;
222
+ const { globe } = this;
223
+ const lat = radian(item.lat);
224
+ const long = radian(item.long);
225
+ const endLat = radian(item.endLat);
226
+ const endLong = radian(item.endLong);
227
+ const altitude = ((_a = item.altitude) !== null && _a !== void 0 ? _a : 0) / 1000;
228
+ const bigRadius = (_b = item.bigRadius) !== null && _b !== void 0 ? _b : globe.Math.GetDist2D(item.long, item.lat, item.endLong, item.endLat);
229
+ const radius = item.radius !== undefined ? item.radius : bigRadius * 0.2;
230
+ const { long: bearingLong, lat: bearingLat } = globe.Math.FindPointByPolar(item.long, item.lat, bigRadius, item.bearingAngle);
231
+ const startAngle2d = calculateStartAngle(long, lat, endLong, endLat);
232
+ const bearingAngle2d = calculateStartAngle(long, lat, radian(bearingLong), radian(bearingLat));
233
+ let tailAngle2d = bearingAngle2d - startAngle2d;
234
+ if (tailAngle2d > 0) {
235
+ tailAngle2d -= Math.PI * 2;
236
+ }
237
+ const bearingAngle = radian(item.bearingAngle - 90);
238
+ const startAngleOfCircle = globe.Math.GetAzimuthAngle(item.long, item.lat, item.endLong, item.endLat); //startAngle2d * 180 / Math.PI;
239
+ const startAngle3d = radian(startAngleOfCircle) - radian(90);
240
+ let tailAngle3d = bearingAngle - startAngle3d;
241
+ if (tailAngle3d > 0) {
242
+ tailAngle3d -= Math.PI * 2;
243
+ }
244
+ const centerCoords2dflat = (0, circle_accurate_flat_1.centerCoords2dflatDataCreator)(globe, item.long, item.lat, item.endLong, item.endLat, { startAngleOfCircle, edgeCount: this.circleFlatEdgeCount });
245
+ return {
246
+ key: item.key,
247
+ lat: item.lat,
248
+ long: item.long,
249
+ endLat: item.endLat,
250
+ endLong: item.endLong,
251
+ altitude,
252
+ bearingAngle,
253
+ radius,
254
+ bigRadius,
255
+ startAngle2d,
256
+ tailAngle2d,
257
+ startAngle3d,
258
+ tailAngle3d,
259
+ bearingLong,
260
+ bearingLat,
261
+ centerCoords2dflat
262
+ };
263
+ }
264
+ __fixPartialProperties(propertyIDs) {
265
+ const s = new Set(["rgba", "dashOpacity", "circleDashAngle"]);
266
+ const result = [];
267
+ for (const item of propertyIDs) {
268
+ result.push(item);
269
+ if (s.has(item)) {
270
+ result.push(item + "Mercator");
271
+ }
272
+ }
273
+ return result;
274
+ }
275
+ // Globe API
276
+ init(globe, gl) {
277
+ this.gl = gl;
278
+ this.globe = globe;
279
+ this.lineProgram = naive_accurate_flexible_1.LineOnGlobeCache.get(globe);
280
+ this.pieceOfPieProgram = piece_of_pie_1.PieceOfPieProgramCache.get(globe);
281
+ this.circleProgram = circle_accurate_flat_1.CircleCache.get(globe);
282
+ this.circle3DProgram = circle_accurate_3d_1.CircleCache.get(globe);
283
+ const circleFlatEdgeCount = this.circleFlatEdgeCount;
284
+ {
285
+ // createBuffers
286
+ const bufferType = "DYNAMIC_DRAW";
287
+ const initialCapacity = this.bufferOrchestrator.capacity;
288
+ this.bufferManagersCompMap = new Map([
289
+ ["centerCoords2d", {
290
+ 'bufferManager': new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
291
+ 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.long, item.lat)),
292
+ }],
293
+ ["centerCoords2dflat", {
294
+ 'bufferManager': new account_1.BufferManager(gl, circleFlatEdgeCount * 2, { bufferType, initialCapacity }),
295
+ 'adaptor': (item) => item.centerCoords2dflat,
296
+ }],
297
+ ["centerCoords3d", {
298
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
299
+ 'adaptor': (item) => (0, geometry_1.sphereCoord)(item.long, item.lat, globe, item.altitude),
300
+ }],
301
+ ["targetCoords2d", {
302
+ 'bufferManager': new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
303
+ 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.endLong, item.endLat))
304
+ }],
305
+ ["targetCoords3d", {
306
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
307
+ 'adaptor': (item) => (0, geometry_1.sphereCoord)(item.endLong, item.endLat, globe, item.altitude)
308
+ }],
309
+ ["bearingTargetCoords2d", {
310
+ 'bufferManager': new account_1.BufferManager(gl, 2, { bufferType, initialCapacity }),
311
+ 'adaptor': (item) => new Float32Array(globe.api_GetMercator2DPoint(item.bearingLong, item.bearingLat))
312
+ }],
313
+ ["bearingTargetCoords3d", {
314
+ 'bufferManager': new account_1.BufferManager(gl, 3, { bufferType, initialCapacity }),
315
+ 'adaptor': (item) => (0, geometry_1.sphereCoord)(item.bearingLong, item.bearingLat, globe, item.altitude)
316
+ }],
317
+ ["startAngle2d", {
318
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
319
+ 'adaptor': (item) => new Float32Array([item.startAngle2d])
320
+ }],
321
+ ["tailAngle2d", {
322
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
323
+ 'adaptor': (item) => new Float32Array([item.tailAngle2d])
324
+ }],
325
+ ["startAngle3d", {
326
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
327
+ 'adaptor': (item) => new Float32Array([item.startAngle3d])
328
+ }],
329
+ ["tailAngle3d", {
330
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
331
+ 'adaptor': (item) => new Float32Array([item.tailAngle3d])
332
+ }],
333
+ ["bearingDashRatio", {
334
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
335
+ 'adaptor': (item) => new Float32Array([0])
336
+ }],
337
+ ["rgba", {
338
+ 'bufferManager': new account_1.BufferManager(gl, 4, { bufferType, initialCapacity }),
339
+ 'adaptor': (item) => new Float32Array(item.rgba)
340
+ }],
341
+ ["radius", {
342
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
343
+ 'adaptor': (item) => new Float32Array([item.radius])
344
+ }],
345
+ ["rgbaMode", {
346
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
347
+ 'adaptor': (item) => new Float32Array([item.rgbaMode])
348
+ }],
349
+ ["dashRatio", {
350
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
351
+ 'adaptor': (item) => new Float32Array([item.dashRatio])
352
+ }],
353
+ ["bigRadius", {
354
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
355
+ 'adaptor': (item) => new Float32Array([item.bigRadius])
356
+ }],
357
+ ["dashOpacity", {
358
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
359
+ 'adaptor': (item) => new Float32Array([item.dashOpacity]),
360
+ }],
361
+ ["circleDashAngle", {
362
+ 'bufferManager': new account_1.BufferManager(gl, 1, { bufferType, initialCapacity }),
363
+ 'adaptor': (item) => new Float32Array([item.circleDashAngle / 360]),
364
+ }],
365
+ // Mercator circle properties are duplicated for the sake of performance.
366
+ ["rgbaMercator", {
367
+ 'bufferManager': new account_1.BufferManager(gl, 4 * circleFlatEdgeCount, { bufferType, initialCapacity }),
368
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillWithListData(circleFlatEdgeCount, item.rgba),
369
+ }],
370
+ ["circleDashAngleMercator", {
371
+ 'bufferManager': new account_1.BufferManager(gl, circleFlatEdgeCount, { bufferType, initialCapacity }),
372
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillFloat32Array(circleFlatEdgeCount, item.circleDashAngle / 360),
373
+ }],
374
+ ["dashOpacityMercator", {
375
+ 'bufferManager': new account_1.BufferManager(gl, circleFlatEdgeCount, { bufferType, initialCapacity }),
376
+ 'adaptor': (item) => data_filler_1.populateFloat32Array.fillFloat32Array(circleFlatEdgeCount, item.dashOpacity),
377
+ }],
378
+ ]);
379
+ }
380
+ const vaoOBJ = (key) => (0, attribute_loader_1.createBufferAndReadInfo)(this.bufferManagersCompMap.get(key).bufferManager.buffer);
381
+ this.lineVao = this.lineProgram.createVAO(...['centerCoords2d', 'centerCoords3d', 'targetCoords2d', 'targetCoords3d', 'dashOpacity', 'dashOpacity', 'rgba'].map(key => vaoOBJ(key)));
382
+ this.ringVao = this.pieceOfPieProgram.createVAO(...['centerCoords2d',
383
+ 'centerCoords3d',
384
+ 'startAngle2d',
385
+ 'tailAngle2d',
386
+ 'startAngle3d',
387
+ 'tailAngle3d',
388
+ 'rgba',
389
+ 'radius',
390
+ 'rgbaMode'].map(key => vaoOBJ(key)));
391
+ this.bearingLineVAO = this.lineProgram.createVAO(...['centerCoords2d', 'centerCoords3d', 'bearingTargetCoords2d', 'bearingTargetCoords3d', 'bearingDashRatio', 'dashOpacity', 'rgba'
392
+ ].map(key => vaoOBJ(key)));
393
+ this.circleVao = this.circleProgram.createVAO(...["centerCoords2dflat", "rgbaMercator", "circleDashAngleMercator", "dashOpacityMercator"
394
+ ].map(key => vaoOBJ(key)));
395
+ this.circle3DVao = this.circle3DProgram.createVAO(...["centerCoords3d", "targetCoords3d", "rgba", "circleDashAngle", "dashOpacity"
396
+ ].map(key => vaoOBJ(key)));
397
+ }
398
+ draw3D() {
399
+ const { gl } = this;
400
+ gl.disable(gl.DEPTH_TEST);
401
+ const is3D = this.globe.api_GetCurrentGeometry() === 0;
402
+ const drawRange = { first: 0, count: this.bufferOrchestrator.length };
403
+ this.lineProgram.draw(this.lineVao, { drawRange }, this._opacity);
404
+ if (this.drawAngleRing) {
405
+ this.pieceOfPieProgram.draw(this.bufferOrchestrator.length, this.ringVao, 360, this._opacity * 0.8, exports.RINGPARTIAL_DRAW_MODE.TRIANGLE_FAN);
406
+ this.pieceOfPieProgram.draw(this.bufferOrchestrator.length, this.ringVao, 360, this._opacity * 0.8, exports.RINGPARTIAL_DRAW_MODE.LINE_STRIP);
407
+ }
408
+ if (this.drawBearingLine) {
409
+ // this.lineProgram.draw(this.bearingLineVAO, this.bufferOrchestrator.length, this._opacity );
410
+ this.lineProgram.draw(this.bearingLineVAO, { drawRange }, this._opacity);
411
+ }
412
+ if (this.drawVRM) {
413
+ if (is3D) {
414
+ this.circle3DProgram.draw(this.circle3DVao, this.bufferOrchestrator.length, this._opacity);
415
+ }
416
+ else {
417
+ this.circleProgram.draw(this.circleVao, this.bufferOrchestrator.length, this.circleFlatEdgeCount, this._opacity);
418
+ }
419
+ }
420
+ if (this.drawText) {
421
+ this._textWritersMap.forEach((writer) => writer.draw());
422
+ }
423
+ gl.enable(gl.DEPTH_TEST);
424
+ }
425
+ free() {
426
+ if (this.isFreed)
427
+ return;
428
+ this.bufferManagersCompMap.forEach(({ bufferManager, adaptor }) => {
429
+ bufferManager.free();
430
+ });
431
+ const { gl, globe } = this;
432
+ gl.deleteVertexArray(this.lineVao);
433
+ gl.deleteVertexArray(this.ringVao);
434
+ gl.deleteVertexArray(this.bearingLineVAO);
435
+ gl.deleteVertexArray(this.circleVao);
436
+ gl.deleteVertexArray(this.circle3DVao);
437
+ naive_accurate_flexible_1.LineOnGlobeCache.release(globe);
438
+ piece_of_pie_1.PieceOfPieProgramCache.release(globe);
439
+ circle_accurate_flat_1.CircleCache.release(globe);
440
+ circle_accurate_3d_1.CircleCache.release(globe);
441
+ this.isFreed = true;
442
+ }
443
+ _deleteTexts(keys) {
444
+ this._textWritersMap.forEach((writer) => {
445
+ writer.deleteTextBulk(keys);
446
+ });
447
+ }
448
+ }
449
+ exports.default = BearingLinePlugin;