@pirireis/webglobeplugins 0.15.2-3.alpha → 0.15.2-alpha

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 (45) hide show
  1. package/Math/arc-generate-points copy.js +366 -0
  2. package/Math/arc.js +2 -1
  3. package/Math/circle-cdf-points.js +170 -1
  4. package/Math/circle.js +25 -0
  5. package/Math/globe-util/horizon-plane.js +112 -0
  6. package/Math/methods.js +2 -2
  7. package/Math/vec3.js +2 -6
  8. package/altitude-locator/draw-subset-obj.js +16 -0
  9. package/altitude-locator/plugin.js +1 -1
  10. package/bearing-line/plugin.js +2 -3
  11. package/package.json +1 -1
  12. package/point-tracks/plugin.js +22 -82
  13. package/programs/line-on-globe/lines-color-instanced-flat.js +1 -0
  14. package/programs/line-on-globe/linestrip/linestrip.js +28 -2
  15. package/programs/line-on-globe/paddings/paddings.js +1 -0
  16. package/programs/point-on-globe/element-globe-surface-glow.js +1 -0
  17. package/programs/rings/partial-ring/piece-of-pie copy.js +286 -0
  18. package/programs/totems/camerauniformblock.js +0 -7
  19. package/programs/totems/canvas-webglobe-info.js +9 -9
  20. package/range-tools-on-terrain/bearing-line/adapters.js +5 -8
  21. package/range-tools-on-terrain/bearing-line/plugin.js +20 -95
  22. package/range-tools-on-terrain/circle-line-chain/adapters.js +8 -15
  23. package/range-tools-on-terrain/circle-line-chain/chain-list-map.js +15 -32
  24. package/range-tools-on-terrain/circle-line-chain/plugin.js +15 -75
  25. package/range-tools-on-terrain/range-ring/adapters.js +6 -74
  26. package/range-tools-on-terrain/range-ring/plugin.js +7 -222
  27. package/range-tools-on-terrain/range-ring/types.js +1 -9
  28. package/semiplugins/lightweight/line-plugin.js +47 -65
  29. package/semiplugins/lightweight/piece-of-pie-plugin.js +18 -44
  30. package/semiplugins/shape-on-terrain/arc-plugin.js +100 -197
  31. package/semiplugins/shape-on-terrain/circle-plugin.js +90 -209
  32. package/semiplugins/shape-on-terrain/derived/padding-plugin.js +101 -0
  33. package/semiplugins/shape-on-terrain/one-degree-padding.js +85 -0
  34. package/util/account/single-attribute-buffer-management/buffer-manager.js +0 -10
  35. package/util/account/single-attribute-buffer-management/buffer-orchestrator.js +8 -145
  36. package/util/account/single-attribute-buffer-management/object-store.js +0 -7
  37. package/util/build-strategy/static-dynamic.js +1 -11
  38. package/util/check/typecheck.js +0 -12
  39. package/util/geometry/index.js +1 -2
  40. package/programs/totems/globe-changes.js +0 -59
  41. package/semiplugins/interface.js +0 -1
  42. package/semiplugins/shape-on-terrain/padding-1-degree.js +0 -538
  43. package/util/account/single-attribute-buffer-management/buffer-orchestrator1.js +0 -159
  44. package/util/frame-counter-trigger.js +0 -84
  45. package/write-text/context-text4.js +0 -140
@@ -1,3 +1,7 @@
1
+ /**
2
+ * set and get node data
3
+ * node indexes;
4
+ */
1
5
  export class ChainListMap {
2
6
  _chainMap;
3
7
  _chainSideProperties;
@@ -75,9 +79,6 @@ export class ChainListMap {
75
79
  deleteKeys.push(chain[chain.length - 2].__identity__);
76
80
  deleteKeys.push(chain[chain.length - 1].__identity__);
77
81
  }
78
- else if (chain.length === 1) {
79
- deleteKeys.push(lastItem.__identity__);
80
- }
81
82
  }
82
83
  else {
83
84
  newChain.push(lastItem);
@@ -86,15 +87,15 @@ export class ChainListMap {
86
87
  this._chainMap.set(chainKey, newChain);
87
88
  return deleteKeys;
88
89
  }
89
- deleteChainAndReturnChainKeys(chainKey, textWritersMap = null) {
90
+ deleteChainAndReturnChainKeys(chainKey, writers) {
90
91
  const keys = this.getNodeKeysOfChain(chainKey);
91
- if (textWritersMap && textWritersMap.size > 0) {
92
- textWritersMap.forEach((writer) => {
92
+ if (writers.size > 0) {
93
+ writers.forEach((writer) => {
93
94
  writer.deleteTextBulk(keys);
94
95
  });
95
96
  }
96
97
  this._chainMap.delete(chainKey);
97
- this._chainSideProperties.delete(chainKey);
98
+ this._chainSideProperties.delete(chainKey); // TODO: this might be this way but adding this know can cause side effects
98
99
  for (const key of keys)
99
100
  this._indexMap.delete(key);
100
101
  return keys;
@@ -110,13 +111,13 @@ export class ChainListMap {
110
111
  chain[index] = node;
111
112
  }
112
113
  updateNodesProperties(chainKey, nodes) {
113
- const chain = this._chainMap.get(chainKey);
114
- if (!chain)
115
- return;
116
114
  nodes.forEach((node) => {
117
115
  const index = this.getIndexOfNode(chainKey, node.key);
118
116
  if (index === undefined)
119
117
  return;
118
+ const chain = this._chainMap.get(chainKey);
119
+ if (!chain)
120
+ return;
120
121
  const chainNode = chain[index];
121
122
  if (node.circleProperties) {
122
123
  if (typeof chainNode.circleProperties !== 'object')
@@ -132,12 +133,6 @@ export class ChainListMap {
132
133
  chainNode.lineProperties[key] = value;
133
134
  });
134
135
  }
135
- if (node.circleOn !== undefined)
136
- chainNode.circleOn = node.circleOn;
137
- if (node.arcOn !== undefined)
138
- chainNode.arcOn = node.arcOn;
139
- if (node.lineOn !== undefined)
140
- chainNode.lineOn = node.lineOn;
141
136
  });
142
137
  }
143
138
  updateCoordsinatesOfNode(node, chainKey) {
@@ -173,24 +168,12 @@ export class ChainListMap {
173
168
  memoryProperties[key] = value;
174
169
  });
175
170
  }
176
- // getNodeProperties(chainKey: string): ChainProperties | undefined {
177
- // return this._chainSideProperties.get(chainKey);
178
- // }
179
- getChainProperties(chainKey) {
171
+ // TODO: bad name clean up, need to check on frontend
172
+ getNodeProperties(chainKey) {
180
173
  return this._chainSideProperties.get(chainKey);
181
174
  }
182
- deleteTexts(chainKeys, textWriters) {
183
- if (!textWriters || textWriters.size === 0)
184
- return;
185
- textWriters.forEach((writer) => {
186
- chainKeys.forEach((chainKey) => {
187
- const chain = this._chainMap.get(chainKey);
188
- if (!chain)
189
- return;
190
- const keys = chain.map((node) => node.__identity__);
191
- writer.deleteTextBulk(keys);
192
- });
193
- });
175
+ getChainProperties(chainKey) {
176
+ return this._chainSideProperties.get(chainKey);
194
177
  }
195
178
  /**
196
179
  *
@@ -27,7 +27,6 @@ export class CircleLineChainPlugin {
27
27
  variativeColorsOn: false,
28
28
  defaultColor: [1, 1, 1, 1],
29
29
  defaultHeightFromGroundIn3D: 30,
30
- isMSL: false
31
30
  },
32
31
  arcOnTerrainOptions: {
33
32
  flatViewOn: true,
@@ -36,8 +35,7 @@ export class CircleLineChainPlugin {
36
35
  defaultColor: [1, 1, 1, 1],
37
36
  defaultHeightFromGroundIn3D: 0,
38
37
  vertexCount: 32,
39
- cameraAttractionIsOn: true, // If true, camera attraction is enabled else evenly distributed arc points are used
40
- isMSL: false, // If true, no elevation of terrain
38
+ cameraAttractionIsOn: true // If true, camera attraction is enabled else evenly distributed arc points are used
41
39
  },
42
40
  lineOptions: {
43
41
  flatViewOn: true,
@@ -47,7 +45,7 @@ export class CircleLineChainPlugin {
47
45
  dashedLineOpacityVariativeOn: false,
48
46
  dashedLineRatioVariativeOn: false,
49
47
  bufferType: "DYNAMIC_DRAW",
50
- opacity: 1.0,
48
+ opacity: 1.0
51
49
  }
52
50
  };
53
51
  constructor(id, { drawCircleOn, textWritersMap, textDataPreAdaptor, opacities, lineAdaptor, arcAdaptor, circleAdaptor, arcOnTerrainOptions, circleOnTerrainOptions, lineOptions } = {}) {
@@ -118,17 +116,11 @@ export class CircleLineChainPlugin {
118
116
  if (this._chainListMap.hasChain(chainKey)) {
119
117
  chainsToClean.push(chainKey);
120
118
  }
121
- }
122
- this._cleanChainsFromSemiPlugins(chainsToClean);
123
- for (const { chainKey, chainProperties, nodes } of chains) {
124
- if (!chainKey || !chainProperties || !nodes || nodes.length === 0) {
125
- console.warn("Invalid chain data, skipping insertion.");
126
- continue;
127
- }
128
119
  this._chainListMap.setChain(chainKey, nodes);
129
120
  this._chainListMap.setChainProperties(chainKey, chainProperties);
130
121
  chainKeys.push(chainKey);
131
122
  }
123
+ this._cleanChainsFromSemiPlugins(chainsToClean);
132
124
  // Reconstruct chains
133
125
  this._reconstructChains(chainKeys);
134
126
  // Update texts
@@ -158,23 +150,12 @@ export class CircleLineChainPlugin {
158
150
  this.globe?.DrawRender();
159
151
  }
160
152
  setOpacities(opacities) {
161
- if (this._freed) {
162
- console.warn("CircleLineChainPlugin is freed, cannot set opacities.");
163
- return;
164
- }
153
+ // TODO: Check opacities
165
154
  this._opacities = {
166
155
  ...this._opacities,
167
156
  ...opacities
168
157
  };
169
- this.globe?.DrawRender();
170
- }
171
- setElevationMode(mode) {
172
- if (this._freed) {
173
- console.warn("CircleLineChainPlugin is freed, cannot set elevation mode.");
174
- return;
175
- }
176
- this.arcPlugin?.setElevationMode(mode);
177
- this.circlePlugin?.setElevationMode(mode);
158
+ // set Opacities of plugins
178
159
  this.globe?.DrawRender();
179
160
  }
180
161
  deleteChains(chainKeys) {
@@ -194,61 +175,33 @@ export class CircleLineChainPlugin {
194
175
  this.circlePlugin?.deleteBulk(keys);
195
176
  this._updateTexts(chainKeys, Array.from(this._textWritersMap.keys()));
196
177
  }
197
- this.globe?.DrawRender();
198
178
  }
199
- deleteNodes(keysAndNodes) {
179
+ deleteNodes(keysAndNodes, { textWriterIDs = [] } = {}) {
200
180
  if (this._freed) {
201
181
  console.warn("CircleLineChainPlugin is freed, cannot delete nodes.");
202
182
  return;
203
183
  }
204
- const chainKeysToReconstruct = keysAndNodes.map(({ chainKey }) => chainKey);
205
- // this._chainListMap.deleteTexts(chainKeysToReconstruct, this._textWritersMap); // TODO: delete this method from chain-list-map
206
- this._cleanChainsFromSemiPlugins(chainKeysToReconstruct);
184
+ const chainKeysToReconstruct = [];
207
185
  keysAndNodes.forEach(({ chainKey, nodeKeys }) => {
208
186
  this._chainListMap.deleteNodesBelongToAChain(chainKey, nodeKeys);
187
+ chainKeysToReconstruct.push(chainKey);
209
188
  });
189
+ this._cleanChainsFromSemiPlugins(chainKeysToReconstruct);
210
190
  this._reconstructChains(chainKeysToReconstruct);
211
- this._updateTexts(chainKeysToReconstruct, Array.from(this._textWritersMap.keys()));
191
+ this._updateTexts(chainKeysToReconstruct, textWriterIDs);
212
192
  this.globe?.DrawRender();
213
193
  }
214
- updateNodesProperties(chainKey, nodesAndPropertyList, { textWriterIDs = [] } = {}) {
194
+ updateNodesProperties(chainKey, nodesAndPropertyMap, { textWriterIDs = [] } = {}) {
215
195
  if (this._freed) {
216
196
  console.warn("CircleLineChainPlugin is freed, cannot update nodes properties.");
217
197
  return;
218
198
  }
219
- this._chainListMap.updateNodesProperties(chainKey, nodesAndPropertyList);
199
+ this._chainListMap.updateNodesProperties(chainKey, nodesAndPropertyMap);
220
200
  this._cleanChainsFromSemiPlugins([chainKey]);
221
201
  this._reconstructChains([chainKey]);
222
202
  this._updateTexts([chainKey], textWriterIDs);
223
203
  this.globe?.DrawRender();
224
204
  }
225
- updateChainDrawOptionsProperties(chainKey, drawOptions) {
226
- if (this._freed) {
227
- console.warn("CircleLineChainPlugin is freed, cannot update chain draw options properties.");
228
- return;
229
- }
230
- const chain = this._chainListMap.getChain(chainKey);
231
- if (!chain) {
232
- console.warn(`Chain with key ${chainKey} not found.`);
233
- return;
234
- }
235
- const { nodes } = chain;
236
- nodes.forEach((node) => {
237
- if (drawOptions.circleOn !== undefined) {
238
- node.circleOn = drawOptions.circleOn;
239
- }
240
- if (drawOptions.arcOn !== undefined) {
241
- node.arcOn = drawOptions.arcOn;
242
- }
243
- if (drawOptions.line !== undefined) {
244
- node.lineOn = drawOptions.line;
245
- }
246
- });
247
- this._cleanChainsFromSemiPlugins([chainKey]);
248
- this._reconstructChains([chainKey]);
249
- this._updateTexts([chainKey], Array.from(this._textWritersMap.keys()));
250
- this.globe?.DrawRender();
251
- }
252
205
  updateCoordinatesBulk(chains, { textWriterIDs = [] } = {}) {
253
206
  if (this._freed) {
254
207
  console.warn("CircleLineChainPlugin is freed, cannot update coordinates.");
@@ -300,15 +253,6 @@ export class CircleLineChainPlugin {
300
253
  this.globe?.DrawRender();
301
254
  }
302
255
  setDefaultSemiPluginColor(semiPluginName, color) {
303
- if (semiPluginName === "ALL") {
304
- this._semiPluginOptions.circleOnTerrainOptions.defaultColor = color;
305
- this._semiPluginOptions.arcOnTerrainOptions.defaultColor = color;
306
- this._semiPluginOptions.lineOptions.defaultColor = color;
307
- this.circlePlugin?.setDefaultColor(color);
308
- this.arcPlugin?.setDefaultColor(color);
309
- this.linePlugin?.setDefaultColor(color);
310
- return;
311
- }
312
256
  switch (semiPluginName) {
313
257
  case "circleOnTerrain":
314
258
  this._semiPluginOptions.circleOnTerrainOptions.defaultColor = color;
@@ -350,11 +294,7 @@ export class CircleLineChainPlugin {
350
294
  for (const chainKey of chainKeys) {
351
295
  // Clean chains from text writers
352
296
  const nodeKeys = this._chainListMap.getNodeKeysOfChain(chainKey);
353
- this._textWritersMap.forEach((writer) => {
354
- writer.deleteTextBulk(nodeKeys);
355
- });
356
297
  nodeKeys.pop(); // Remove the last key which is destination of the last circle
357
- // Clean chains from semi-plugins
358
298
  this.circlePlugin?.deleteBulk(nodeKeys);
359
299
  this.linePlugin?.deleteBulk(nodeKeys);
360
300
  this.arcPlugin?.deleteBulk(nodeKeys);
@@ -405,7 +345,7 @@ export class CircleLineChainPlugin {
405
345
  }
406
346
  const circleOpacity = getOpacity(this._opacities, "circle");
407
347
  if (this._drawCircleOn && circleOpacity !== 0) {
408
- this.circlePlugin?.setPluginOpacity(circleOpacity, false);
348
+ this.circlePlugin?.setPluginOpacity(circleOpacity);
409
349
  this.circlePlugin?.draw3D();
410
350
  }
411
351
  const currentGeometry = globe.api_GetCurrentGeometry();
@@ -414,12 +354,12 @@ export class CircleLineChainPlugin {
414
354
  // globe view
415
355
  const lineOpacity = getOpacity(this._opacities, "globeArc");
416
356
  if (lineOpacity !== 0) {
417
- this.linePlugin?.setPluginOpacity(lineOpacity, false);
357
+ this.linePlugin?.setPluginOpacity(lineOpacity);
418
358
  this.linePlugin?.draw3D();
419
359
  }
420
360
  const arcOpacity = getOpacity(this._opacities, "globeArcFitsTerrain");
421
361
  if (arcOpacity !== 0) {
422
- this.arcPlugin?.setPluginOpacity(arcOpacity, false);
362
+ this.arcPlugin?.setPluginOpacity(arcOpacity);
423
363
  this.arcPlugin?.draw3D();
424
364
  }
425
365
  break;
@@ -7,87 +7,19 @@
7
7
  // altitude: rangeRing.altitude,
8
8
  // };
9
9
  // }
10
- export const keyAdapter = (centerID, rangeID) => {
11
- return `${centerID}-${rangeID}`;
12
- };
13
- export const allCircleKeysAdapter = (rangeRing) => {
14
- const result = new Array(rangeRing.rings.length);
15
- for (let i = 0; i < rangeRing.rings.length; i++) {
16
- result[i] = keyAdapter(rangeRing.centerID, rangeRing.rings[i].ringID);
17
- }
18
- return result;
19
- };
20
10
  export const rangeRingToCircleInputAdapter = (rangeRing) => {
21
- const centerID = rangeRing.centerID;
22
11
  return rangeRing.rings.map(ring => ({
23
- key: keyAdapter(centerID, ring.ringID),
12
+ key: ring.rindID,
24
13
  center: [rangeRing.long, rangeRing.lat],
25
14
  radius: ring.radius,
26
15
  color: rangeRing.rgba,
27
16
  altitude: rangeRing.altitude,
28
17
  }));
29
18
  };
30
- export const allArcKeysAdapter = (rangeRing) => {
31
- const arcEachRing = Math.ceil(360 / rangeRing.stepAngle);
32
- const result = new Array(arcEachRing * rangeRing.rings.length);
33
- for (let i = 0; i < rangeRing.rings.length; i++)
34
- for (let j = 0; j < arcEachRing; j++)
35
- result[i * arcEachRing + j] = keyAdapter(rangeRing.centerID, rangeRing.rings[i].ringID) + `-${j}`;
36
- return result;
37
- };
38
- export const rangeRingToArcInputAdapter = (globe, rangeRingInput) => {
39
- const { long, lat, stepAngle, altitude = 0, rgba, rings } = rangeRingInput;
40
- const arcEachRing = Math.ceil(360 / stepAngle);
41
- const result = new Array(rings.length * arcEachRing);
42
- for (let i = 0; i < rings.length; i++) {
43
- const ring = rings[i];
44
- for (let j = 0; j < arcEachRing; j++) {
45
- const angle = Math.min(stepAngle * j, 360);
46
- const startLongLat = globe.Math.FindPointByPolar(long, lat, ring.radius, angle);
47
- const endLongLat = globe.Math.FindPointByPolar(long, lat, ring.radius - ring.padding, angle);
48
- result[i * arcEachRing + j] = {
49
- key: keyAdapter(rangeRingInput.centerID, ring.ringID) + `-${j}`,
50
- start: [startLongLat.long, startLongLat.lat],
51
- end: [endLongLat.long, endLongLat.lat],
52
- color: rgba,
53
- height: altitude,
54
- };
55
- }
56
- }
57
- return result;
58
- };
59
- export function createColorRatios(color, stepAngle, colorFade = 0.4) {
60
- const angleCount = Math.ceil(360 / stepAngle) * 2;
61
- let angleLeft = 360;
62
- const result = new Array(angleCount);
63
- for (let i = 0; i < angleCount; i++) {
64
- const currentAngle = Math.min(stepAngle, angleLeft);
65
- angleLeft -= currentAngle;
66
- result[i * 2] = {
67
- color: [0, 0, 0, 0],
68
- ratio: 1,
69
- };
70
- const colorRatio = {
71
- // color: i % 2 === 0 ? color : [color[0] * colorFade, color[1] * colorFade, color[2] * colorFade, color[3]] as Color,
72
- color: i % 2 === 0 ? color : [1 - color[0] * colorFade, 1 - color[1] * colorFade, 1 - color[2] * colorFade, color[3]],
73
- ratio: currentAngle - 1
74
- };
75
- result[i * 2 + 1] = colorRatio;
76
- }
77
- return result;
19
+ function rangeRingToPaddingsCoordinatesAdapter(globe, center, rangeRing, startAngle, stepAngle) {
20
+ return new Float32Array();
78
21
  }
79
- export const padding1DegreeInputAdapter = (bearingLine) => {
80
- const { long, lat, rgba, altitude = 0, rings, stepAngle } = bearingLine;
81
- const result = new Array(rings.length);
82
- for (let i = 0; i < rings.length; i++) {
83
- const ring = rings[i];
84
- result[i] = {
85
- key: keyAdapter(bearingLine.centerID, ring.ringID),
86
- center: [long, lat],
87
- radius: ring.radius,
88
- colorsRatios: createColorRatios(rgba, stepAngle, 0.5),
89
- heightFromGroundIn3D: altitude,
90
- };
91
- }
92
- return result;
22
+ export const rangeRingToArcInputAdapter = (globe, rangeRing) => {
23
+ // TODO;
24
+ return [];
93
25
  };
@@ -1,18 +1,6 @@
1
1
  import { CircleOnTerrainPlugin } from "../../semiplugins/shape-on-terrain/circle-plugin";
2
2
  import { ArcOnTerrainPlugin } from "../../semiplugins/shape-on-terrain/arc-plugin";
3
- import { Padding1DegreePlugin } from '../../semiplugins/shape-on-terrain/padding-1-degree';
4
- import { padding1DegreeInputAdapter, rangeRingToArcInputAdapter, rangeRingToCircleInputAdapter, allCircleKeysAdapter, allArcKeysAdapter, createColorRatios } from "./adapters";
5
- export var ENUM_HIDE;
6
- (function (ENUM_HIDE) {
7
- ENUM_HIDE[ENUM_HIDE["SHOW"] = 0] = "SHOW";
8
- ENUM_HIDE[ENUM_HIDE["HIDE"] = 1] = "HIDE";
9
- ENUM_HIDE[ENUM_HIDE["HIDE_1_DEGREE_PADDINGS"] = 2] = "HIDE_1_DEGREE_PADDINGS";
10
- })(ENUM_HIDE || (ENUM_HIDE = {}));
11
- export var ENUM_TEXT_HIDE;
12
- (function (ENUM_TEXT_HIDE) {
13
- ENUM_TEXT_HIDE[ENUM_TEXT_HIDE["SHOW"] = 0] = "SHOW";
14
- ENUM_TEXT_HIDE[ENUM_TEXT_HIDE["HIDE"] = 1] = "HIDE";
15
- })(ENUM_TEXT_HIDE || (ENUM_TEXT_HIDE = {}));
3
+ import { LinePlugin } from "../../semiplugins/lightweight/line-plugin";
16
4
  // @ts-ignore
17
5
  export class RangeRingPlugin {
18
6
  id;
@@ -20,227 +8,24 @@ export class RangeRingPlugin {
20
8
  gl = null;
21
9
  circlePlugin;
22
10
  arcPlugin;
23
- paddingPlugin = null; // TODO: implement padding plugin
11
+ linePlugin;
24
12
  _memory = new Map();
25
- _freed = false;
26
- textWritersMap = new Map();
27
- _semiPluginOptions = {
28
- circleOnTerrainOptions: {
29
- variativeColorsOn: false,
30
- defaultColor: [1, 1, 1, 1],
31
- defaultHeightFromGroundIn3D: 30,
32
- },
33
- arcOnTerrainOptions: {
34
- flatViewOn: true,
35
- globeViewOn: true,
36
- variativeColorsOn: false,
37
- defaultColor: [1, 1, 1, 1],
38
- defaultHeightFromGroundIn3D: 0,
39
- vertexCount: 32,
40
- cameraAttractionIsOn: true // If true, camera attraction is enabled else evenly distributed arc points are used
41
- },
42
- paddingOptions: {
43
- variativeColorsOn: false,
44
- defaultColor: [1, 1, 1, 1],
45
- defaultHeightFromGroundIn3D: 0,
46
- },
47
- };
48
- constructor(id, { textDataPreAdaptor = (center) => center, textWritersMap = new Map(), }) {
13
+ constructor(id) {
49
14
  this.id = id;
50
- this.circlePlugin = new CircleOnTerrainPlugin(this.id + "-circle", {
51
- variativeColorsOn: true,
52
- });
15
+ this.circlePlugin = new CircleOnTerrainPlugin(this.id + "-circle");
53
16
  this.arcPlugin = new ArcOnTerrainPlugin(this.id + "-arc", {
54
- variativeColorsOn: true,
55
- vertexCount: 20,
56
- });
57
- this.paddingPlugin = new Padding1DegreePlugin(this.id + "-padding", {
58
- variativeColorsOn: true,
59
- defaultColor: [1, 1, 1, 1],
60
- defaultHeightFromGroundIn3D: 0,
17
+ vertexCount: 5,
61
18
  });
62
- if (textWritersMap) {
63
- this.textWritersMap = textWritersMap;
64
- }
19
+ this.linePlugin = new LinePlugin(this.id + "-line");
65
20
  }
66
21
  insertBulk(items) {
67
- if (this._freed) {
68
- console.warn("Plugin is freed, cannot insert items");
69
- return;
70
- }
71
- if (this.globe === null || this.gl === null) {
72
- console.warn("Globe or WebGL context is not initialized, cannot insert items");
73
- return;
74
- }
75
- const visableItems = items.filter(item => item.hide !== ENUM_HIDE.HIDE);
76
- if (this.paddingPlugin) {
77
- const paddingInputs = visableItems.map(item => padding1DegreeInputAdapter(item)).flat();
78
- this.paddingPlugin.insertBulk(paddingInputs);
79
- }
80
- const circleInputs = visableItems.filter(item => item.hide === ENUM_HIDE.SHOW).map(rangeRingToCircleInputAdapter).flat();
81
- this.circlePlugin.insertBulk(circleInputs);
82
- const arcInputs = visableItems.map((item) => rangeRingToArcInputAdapter(this.globe, item)).flat();
83
- this.arcPlugin.insertBulk(arcInputs);
84
- for (const item of items) {
85
- this._memory.set(item.centerID, item);
86
- if (item.hide !== ENUM_HIDE.HIDE && item.textHide === ENUM_HIDE.SHOW) {
87
- this.updateText([item.centerID]);
88
- }
89
- }
90
- }
91
- removeCenters(centers) {
92
- if (this._freed) {
93
- console.warn("Plugin is freed, cannot remove centers");
94
- return;
95
- }
96
- if (this.globe === null || this.gl === null) {
97
- console.warn("Globe or WebGL context is not initialized, cannot remove centers");
98
- return;
99
- }
100
- for (let i = 0; i < centers.length; i++) {
101
- const rangeRingInput = this._memory.get(centers[i]);
102
- if (!rangeRingInput) {
103
- console.warn(`No data found for centerID: ${centers[i]}`);
104
- continue;
105
- }
106
- const circleKeys = allCircleKeysAdapter(rangeRingInput);
107
- this.circlePlugin.deleteBulk(circleKeys);
108
- this.paddingPlugin?.deleteBulk(circleKeys);
109
- const allArcKeys = allArcKeysAdapter(rangeRingInput);
110
- this.arcPlugin.deleteBulk(allArcKeys);
111
- this._memory.delete(centers[i]);
112
- }
113
- this.globe.DrawRender();
114
- }
115
- updateCenters() {
116
- }
117
- updateCentersCoordinate(items) {
118
- if (this._freed) {
119
- console.warn("Plugin is freed, cannot update centers coordinates");
120
- return;
121
- }
122
- if (this.globe === null || this.gl === null) {
123
- console.warn("Globe or WebGL context is not initialized, cannot update centers coordinates");
124
- return;
125
- }
126
- const globe = this.globe;
127
- for (const item of items) {
128
- const { centerID, long, lat } = item;
129
- const rangeRingInput = this._memory.get(centerID);
130
- if (rangeRingInput) {
131
- rangeRingInput.long = long;
132
- rangeRingInput.lat = lat;
133
- const arcData = rangeRingToArcInputAdapter(globe, rangeRingInput);
134
- this.arcPlugin.updateCoordinates(arcData);
135
- const circleData = rangeRingToCircleInputAdapter(rangeRingInput);
136
- this.circlePlugin.updateCoordinates(circleData);
137
- this.paddingPlugin?.updateCoordinates(circleData);
138
- this.updateText([centerID]);
139
- }
140
- }
141
22
  }
142
- updateCentersColor(items) {
143
- if (this._freed) {
144
- console.warn("Plugin is freed, cannot update centers color");
145
- return;
146
- }
147
- if (this.globe === null || this.gl === null) {
148
- console.warn("Globe or WebGL context is not initialized, cannot update centers color");
149
- return;
150
- }
151
- // update Colors from memory map
152
- for (let item of items) {
153
- const data = this._memory.get(item.centerID);
154
- if (!data) {
155
- console.warn(`No data found for centerID: ${item.centerID}`);
156
- continue;
157
- }
158
- data.rgba = item.rgba;
159
- // update arc Colors
160
- const arcColors = allArcKeysAdapter(data).map(key => ({ key, color: data.rgba }));
161
- this.arcPlugin.updateColors(arcColors, false);
162
- const circleColors = allCircleKeysAdapter(data).map(key => ({ key, color: data.rgba }));
163
- this.circlePlugin.updateColors(circleColors);
164
- if (this.paddingPlugin) {
165
- const colorRatios = createColorRatios(data.rgba, data.stepAngle, 0.5);
166
- for (const { key } of circleColors) {
167
- this.paddingPlugin?.updateColorRatios(key, colorRatios, false);
168
- }
169
- }
170
- this.updateText([item.centerID]);
171
- }
172
- this.globe.DrawRender();
173
- }
174
- updateCentersHide() {
23
+ _build() {
175
24
  }
176
25
  init(globe, gl) {
177
26
  this.globe = globe;
178
27
  this.gl = gl;
179
- this.circlePlugin.init(globe, gl);
180
- this.arcPlugin.init(globe, gl);
181
- this.paddingPlugin?.init(globe, gl);
182
28
  }
183
29
  draw3D() {
184
- if (this._freed) {
185
- console.warn("RangeRing Plugin is freed, cannot draw");
186
- return;
187
- }
188
- this.arcPlugin.draw3D();
189
- this.paddingPlugin?.draw3D();
190
- this.circlePlugin.draw3D();
191
- for (const [key, writer] of this.textWritersMap) {
192
- writer.draw();
193
- }
194
- }
195
- free() {
196
- if (this._freed) {
197
- console.warn("RangeRing Plugin is already freed");
198
- return;
199
- }
200
- this._freed = true;
201
- this.circlePlugin.free();
202
- this.arcPlugin.free();
203
- this.paddingPlugin?.free();
204
- }
205
- updateText(centerIDs = null) {
206
- if (this._freed) {
207
- console.warn("Plugin is freed, cannot update text");
208
- return;
209
- }
210
- if (this.globe === null || this.gl === null) {
211
- console.warn("Globe or WebGL context is not initialized, cannot update text");
212
- return;
213
- }
214
- const globe = this.globe;
215
- const textWritersMap = this.textWritersMap;
216
- let keys = centerIDs ?? this._memory.keys();
217
- for (const centerID of keys) {
218
- const rangeRingData = this._memory.get(centerID);
219
- if (!rangeRingData)
220
- continue;
221
- for (const [key, writer] of textWritersMap) {
222
- writer.insertText(rangeRingData);
223
- }
224
- }
225
- }
226
- deleteText(centerIDs) {
227
- if (this._freed) {
228
- console.warn("Plugin is freed, cannot delete text");
229
- return;
230
- }
231
- if (this.globe === null || this.gl === null) {
232
- console.warn("Globe or WebGL context is not initialized, cannot delete text");
233
- return;
234
- }
235
- const globe = this.globe;
236
- const textWritersMap = this.textWritersMap;
237
- for (const centerID of centerIDs) {
238
- const rangeRingData = this._memory.get(centerID);
239
- if (!rangeRingData)
240
- continue;
241
- for (const [key, writer] of textWritersMap) {
242
- writer.deleteText(rangeRingData);
243
- }
244
- }
245
30
  }
246
31
  }
@@ -1,9 +1 @@
1
- export const ENUM_HIDE = Object.freeze({
2
- SHOW: 0,
3
- HIDE: 1,
4
- HIDE_1_DEGREE_PADDINGS: 2
5
- });
6
- export const ENUM_TEXT_HIDE = Object.freeze({
7
- SHOW: 0,
8
- HIDE: 1
9
- });
1
+ export {};