@openglobus/og 0.13.3 → 0.13.6

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/dist/@openglobus/og.esm.js +2 -2
  2. package/dist/@openglobus/og.esm.js.map +1 -1
  3. package/dist/@openglobus/og.umd.js +2 -2
  4. package/dist/@openglobus/og.umd.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/og/Events.js +188 -188
  7. package/src/og/Globe.js +1 -0
  8. package/src/og/control/KeyboardNavigation.js +48 -2
  9. package/src/og/control/TouchNavigation.js +340 -319
  10. package/src/og/control/ZoomControl.js +1 -1
  11. package/src/og/ellipsoid/Ellipsoid.js +1 -1
  12. package/src/og/entity/Billboard.js +165 -165
  13. package/src/og/entity/BillboardHandler.js +1 -1
  14. package/src/og/entity/GeoObject.js +4 -0
  15. package/src/og/entity/GeoObjectHandler.js +22 -33
  16. package/src/og/entity/Geometry.js +319 -319
  17. package/src/og/entity/Label.js +348 -346
  18. package/src/og/entity/LabelHandler.js +44 -37
  19. package/src/og/input/input.js +7 -1
  20. package/src/og/layer/KML.js +181 -12
  21. package/src/og/layer/Layer.js +4 -2
  22. package/src/og/renderer/RendererEvents.js +1065 -1051
  23. package/src/og/scene/Planet.js +45 -27
  24. package/src/og/shaders/billboard.js +8 -0
  25. package/src/og/shaders/label.js +56 -13
  26. package/src/og/terrain/EmptyTerrain.js +159 -146
  27. package/src/og/terrain/Geoid.js +246 -241
  28. package/src/og/terrain/GlobusTerrain.js +17 -18
  29. package/src/og/terrain/MapboxTerrain.js +292 -294
  30. package/src/og/utils/FontAtlas.js +25 -15
  31. package/src/og/utils/PlainSegmentWorker.js +38 -26
  32. package/src/og/utils/TextureAtlas.js +291 -280
  33. package/types/control/KeyboardNavigation.d.ts +3 -0
  34. package/types/entity/GeoObject.d.ts +1 -0
  35. package/types/entity/Label.d.ts +1 -0
  36. package/types/entity/LabelHandler.d.ts +1 -1
  37. package/types/input/input.d.ts +6 -0
  38. package/types/layer/KML.d.ts +26 -1
  39. package/types/renderer/RendererEvents.d.ts +2 -0
  40. package/types/scene/Planet.d.ts +5 -0
  41. package/types/terrain/EmptyTerrain.d.ts +3 -1
  42. package/types/terrain/Geoid.d.ts +1 -10
  43. package/types/terrain/GlobusTerrain.d.ts +0 -1
  44. package/types/terrain/MapboxTerrain.d.ts +1 -1
  45. package/types/utils/TextureAtlas.d.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openglobus/og",
3
- "version": "0.13.3",
3
+ "version": "0.13.6",
4
4
  "description": "[OpenGlobus](http://www.openglobus.org/) is a javascript library designed to display interactive 3d maps and planets with map tiles, imagery and vector data, markers and 3d objects. It uses the WebGL technology, open source and completely free.",
5
5
  "directories": {
6
6
  "example": "./sandbox"
package/src/og/Events.js CHANGED
@@ -1,188 +1,188 @@
1
- /**
2
- * @module og/Events
3
- */
4
-
5
- "use strict";
6
-
7
- import { stamp, binaryInsert } from "./utils/shared.js";
8
-
9
- /**
10
- * Base events class to handle custom events.
11
- * @class
12
- */
13
- class Events {
14
- /**
15
- *
16
- * @param {Array.<string>} [eventNames] - Event names that could be dispatched.
17
- * @param {*} [sender]
18
- */
19
- constructor(eventNames, sender) {
20
- /**
21
- * Registered event names.
22
- * @protected
23
- * @type {Array.<string>}
24
- */
25
- this._eventNames = [];
26
-
27
- eventNames && this.registerNames(eventNames);
28
-
29
- this._sender = sender || this;
30
-
31
- /**
32
- * Stop propagation flag
33
- * @protected
34
- * @type {boolean}
35
- */
36
- this._stopPropagation = false;
37
-
38
- this._stampCache = {};
39
-
40
- this.__id = Events._staticCounter++;
41
- }
42
-
43
- static get _staticCounter() {
44
- if (!this.__counter__ && this.__counter__ !== 0) {
45
- this.__counter__ = 0;
46
- }
47
- return this.__counter__;
48
- }
49
-
50
- static set _staticCounter(n) {
51
- this.__counter__ = n;
52
- }
53
-
54
- bindSender(sender) {
55
- this._sender = sender || this;
56
- }
57
-
58
- /**
59
- * Function that creates event object properties that would be dispatched.
60
- * @public
61
- * @param {Array.<string>} eventNames - Specified event names list.
62
- */
63
- registerNames(eventNames) {
64
- for (var i = 0; i < eventNames.length; i++) {
65
- this[eventNames[i]] = { active: true, handlers: [] };
66
- this._eventNames.push(eventNames[i]);
67
- }
68
- }
69
-
70
- _getStamp(name, id, ogid) {
71
- return `${name}_${id}_${ogid}`;
72
- }
73
-
74
- /**
75
- * Returns true if event callback has stamped.
76
- * @protected
77
- * @param {Object} name - Event identifier.
78
- * @param {Object} obj - Event callback.
79
- * @return {boolean} -
80
- */
81
- _stamp(name, obj) {
82
- var ogid = stamp(obj);
83
-
84
- var st = this._getStamp(name, this.__id, ogid);
85
-
86
- if (!this._stampCache[st]) {
87
- this._stampCache[st] = ogid;
88
- return true;
89
- }
90
-
91
- return false;
92
- }
93
-
94
- /**
95
- * Attach listener.
96
- * @public
97
- * @param {string} name - Event name to listen.
98
- * @param {eventCallback} callback - Event callback function.
99
- * @param {Object} sender - Event callback function owner.
100
- */
101
- on(name, callback, sender, priority = 0) {
102
- if (this._stamp(name, callback)) {
103
- if (this[name]) {
104
- let c = callback.bind(sender || this._sender);
105
- c._openglobus_id = callback._openglobus_id;
106
- c._openglobus_priority = priority;
107
- binaryInsert(this[name].handlers, c, (a, b) => {
108
- return b._openglobus_priority - a._openglobus_priority;
109
- });
110
- }
111
- }
112
- }
113
-
114
- /**
115
- * Stop listening event name with specified callback function.
116
- * @public
117
- * @param {string} name - Event name.
118
- * @param {eventCallback} callback - Attached event callback.
119
- */
120
- off(name, callback) {
121
- if (callback) {
122
- var st = this._getStamp(name, this.__id, callback._openglobus_id);
123
- if (callback._openglobus_id && this._stampCache[st]) {
124
- var h = this[name].handlers;
125
- var i = h.length;
126
- var indexToRemove = -1;
127
- while (i--) {
128
- var hi = h[i];
129
- if (hi._openglobus_id === callback._openglobus_id) {
130
- indexToRemove = i;
131
- break;
132
- }
133
- }
134
-
135
- if (indexToRemove !== -1) {
136
- h.splice(indexToRemove, 1);
137
- this._stampCache[st] = undefined;
138
- delete this._stampCache[st];
139
- }
140
- }
141
- }
142
- }
143
-
144
- /**
145
- * Dispatch event.
146
- * @public
147
- * @param {Object} event - Event instance property that created by event name.
148
- * @param {Object} [obj] - Event object.
149
- */
150
- dispatch(event, ...args) {
151
- let result = true;
152
- if (event && event.active && !this._stopPropagation) {
153
- let h = event.handlers,
154
- i = h.length;
155
- while (i--) {
156
- if (h[i](...args) === false) {
157
- result = false;
158
- }
159
- }
160
- }
161
- this._stopPropagation = false;
162
- return result;
163
- }
164
-
165
- /**
166
- * Brakes events propagation.
167
- * @public
168
- */
169
- stopPropagation() {
170
- this._stopPropagation = true;
171
- }
172
-
173
- /**
174
- * Removes all events.
175
- * @public
176
- */
177
- clear() {
178
- for (var i = 0; i < this._eventNames.length; i++) {
179
- var e = this[this._eventNames[i]];
180
- e.handlers.length = 0;
181
- e.handlers = [];
182
- }
183
- this._eventNames.length = 0;
184
- this._eventNames = [];
185
- }
186
- }
187
-
188
- export { Events };
1
+ /**
2
+ * @module og/Events
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import { stamp, binaryInsert } from "./utils/shared.js";
8
+
9
+ /**
10
+ * Base events class to handle custom events.
11
+ * @class
12
+ */
13
+ class Events {
14
+ /**
15
+ *
16
+ * @param {Array.<string>} [eventNames] - Event names that could be dispatched.
17
+ * @param {*} [sender]
18
+ */
19
+ constructor(eventNames, sender) {
20
+ /**
21
+ * Registered event names.
22
+ * @protected
23
+ * @type {Array.<string>}
24
+ */
25
+ this._eventNames = [];
26
+
27
+ eventNames && this.registerNames(eventNames);
28
+
29
+ this._sender = sender || this;
30
+
31
+ /**
32
+ * Stop propagation flag
33
+ * @protected
34
+ * @type {boolean}
35
+ */
36
+ this._stopPropagation = false;
37
+
38
+ this._stampCache = {};
39
+
40
+ this.__id = Events._staticCounter++;
41
+ }
42
+
43
+ static get _staticCounter() {
44
+ if (!this.__counter__ && this.__counter__ !== 0) {
45
+ this.__counter__ = 0;
46
+ }
47
+ return this.__counter__;
48
+ }
49
+
50
+ static set _staticCounter(n) {
51
+ this.__counter__ = n;
52
+ }
53
+
54
+ bindSender(sender) {
55
+ this._sender = sender || this;
56
+ }
57
+
58
+ /**
59
+ * Function that creates event object properties that would be dispatched.
60
+ * @public
61
+ * @param {Array.<string>} eventNames - Specified event names list.
62
+ */
63
+ registerNames(eventNames) {
64
+ for (var i = 0; i < eventNames.length; i++) {
65
+ this[eventNames[i]] = { active: true, handlers: [] };
66
+ this._eventNames.push(eventNames[i]);
67
+ }
68
+ }
69
+
70
+ _getStamp(name, id, ogid) {
71
+ return `${name}_${id}_${ogid}`;
72
+ }
73
+
74
+ /**
75
+ * Returns true if event callback has stamped.
76
+ * @protected
77
+ * @param {Object} name - Event identifier.
78
+ * @param {Object} obj - Event callback.
79
+ * @return {boolean} -
80
+ */
81
+ _stamp(name, obj) {
82
+ var ogid = stamp(obj);
83
+
84
+ var st = this._getStamp(name, this.__id, ogid);
85
+
86
+ if (!this._stampCache[st]) {
87
+ this._stampCache[st] = ogid;
88
+ return true;
89
+ }
90
+
91
+ return false;
92
+ }
93
+
94
+ /**
95
+ * Attach listener.
96
+ * @public
97
+ * @param {string} name - Event name to listen.
98
+ * @param {eventCallback} callback - Event callback function.
99
+ * @param {Object} sender - Event callback function owner.
100
+ */
101
+ on(name, callback, sender, priority = 0) {
102
+ if (this._stamp(name, callback)) {
103
+ if (this[name]) {
104
+ let c = callback.bind(sender || this._sender);
105
+ c._openglobus_id = callback._openglobus_id;
106
+ c._openglobus_priority = priority;
107
+ binaryInsert(this[name].handlers, c, (a, b) => {
108
+ return b._openglobus_priority - a._openglobus_priority;
109
+ });
110
+ }
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Stop listening event name with specified callback function.
116
+ * @public
117
+ * @param {string} name - Event name.
118
+ * @param {eventCallback} callback - Attached event callback.
119
+ */
120
+ off(name, callback) {
121
+ if (callback) {
122
+ var st = this._getStamp(name, this.__id, callback._openglobus_id);
123
+ if (callback._openglobus_id && this._stampCache[st]) {
124
+ var h = this[name].handlers;
125
+ var i = h.length;
126
+ var indexToRemove = -1;
127
+ while (i--) {
128
+ var hi = h[i];
129
+ if (hi._openglobus_id === callback._openglobus_id) {
130
+ indexToRemove = i;
131
+ break;
132
+ }
133
+ }
134
+
135
+ if (indexToRemove !== -1) {
136
+ h.splice(indexToRemove, 1);
137
+ this._stampCache[st] = undefined;
138
+ delete this._stampCache[st];
139
+ }
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Dispatch event.
146
+ * @public
147
+ * @param {Object} event - Event instance property that created by event name.
148
+ * @param {Object} [obj] - Event object.
149
+ */
150
+ dispatch(event, ...args) {
151
+ let result = true;
152
+ if (event && event.active && !this._stopPropagation) {
153
+ let h = event.handlers.slice(0),
154
+ i = h.length;
155
+ while (i--) {
156
+ if (h[i](...args) === false) {
157
+ result = false;
158
+ }
159
+ }
160
+ }
161
+ this._stopPropagation = false;
162
+ return result;
163
+ }
164
+
165
+ /**
166
+ * Brakes events propagation.
167
+ * @public
168
+ */
169
+ stopPropagation() {
170
+ this._stopPropagation = true;
171
+ }
172
+
173
+ /**
174
+ * Removes all events.
175
+ * @public
176
+ */
177
+ clear() {
178
+ for (var i = 0; i < this._eventNames.length; i++) {
179
+ var e = this[this._eventNames[i]];
180
+ e.handlers.length = 0;
181
+ e.handlers = [];
182
+ }
183
+ this._eventNames.length = 0;
184
+ this._eventNames = [];
185
+ }
186
+ }
187
+
188
+ export { Events };
package/src/og/Globe.js CHANGED
@@ -8,6 +8,7 @@ import { CompassButton } from "./control/CompassButton.js";
8
8
  import { EarthCoordinates } from "./control/EarthCoordinates.js";
9
9
  import { EarthNavigation } from "./control/EarthNavigation.js";
10
10
  import { MouseNavigation } from "./control/MouseNavigation.js";
11
+ import { KeyboardNavigation } from "./control/KeyboardNavigation.js";
11
12
  import { ScaleControl } from "./control/ScaleControl.js";
12
13
  import { Sun } from "./control/Sun.js";
13
14
  import { TouchNavigation } from "./control/TouchNavigation.js";
@@ -24,16 +24,22 @@ class KeyboardNavigation extends Control {
24
24
  }
25
25
 
26
26
  oninit() {
27
+ this.renderer.events.on("keypress", input.KEY_PGUP, this.onCameraMoveForward, this);
28
+ this.renderer.events.on("keypress", input.KEY_PGDN, this.onCameraMoveBackward, this);
29
+ this.renderer.events.on("keypress", input.KEY_PLUS, this.onCameraMoveForward, this);
30
+ this.renderer.events.on("keypress", input.KEY_EQUALS, this.onCameraMoveForward, this);
31
+ this.renderer.events.on("keypress", input.KEY_MINUS, this.onCameraMoveBackward, this);
27
32
  this.renderer.events.on("keypress", input.KEY_W, this.onCameraMoveForward, this);
28
33
  this.renderer.events.on("keypress", input.KEY_S, this.onCameraMoveBackward, this);
29
34
  this.renderer.events.on("keypress", input.KEY_A, this.onCameraStrifeLeft, this);
30
35
  this.renderer.events.on("keypress", input.KEY_D, this.onCameraStrifeRight, this);
31
36
  this.renderer.events.on("keypress", input.KEY_UP, this.onCameraLookUp, this);
32
37
  this.renderer.events.on("keypress", input.KEY_DOWN, this.onCameraLookDown, this);
33
- this.renderer.events.on("keypress", input.KEY_LEFT, this.onCameraTurnLeft, this);
34
- this.renderer.events.on("keypress", input.KEY_RIGHT, this.onCameraTurnRight, this);
38
+ this.renderer.events.on("keypress", input.KEY_LEFT, this.onCameraLookLeft, this);
39
+ this.renderer.events.on("keypress", input.KEY_RIGHT, this.onCameraLookRight, this);
35
40
  this.renderer.events.on("keypress", input.KEY_Q, this.onCameraRollLeft, this);
36
41
  this.renderer.events.on("keypress", input.KEY_E, this.onCameraRollRight, this);
42
+ this.renderer.events.on("keypress", input.KEY_N, this.onCameraRollNorth, this);
37
43
  }
38
44
 
39
45
  onCameraMoveForward(event) {
@@ -84,6 +90,26 @@ class KeyboardNavigation extends Control {
84
90
  cam.update();
85
91
  }
86
92
 
93
+ onCameraLookLeft(event) {
94
+ var cam = this.renderer.activeCamera;
95
+ if (this.renderer.events.isKeyPressed(input.KEY_SHIFT)) {
96
+ cam.roll(15 / this.renderer.handler.deltaTime);
97
+ } else {
98
+ cam.rotateHorizontal((cam._lonLat.height / 3000000) * math.RADIANS, Vec3.ZERO);
99
+ }
100
+ cam.update();
101
+ }
102
+
103
+ onCameraLookRight(event) {
104
+ var cam = this.renderer.activeCamera;
105
+ if (this.renderer.events.isKeyPressed(input.KEY_SHIFT)) {
106
+ cam.roll(-15 / this.renderer.handler.deltaTime);
107
+ } else {
108
+ cam.rotateHorizontal((-cam._lonLat.height / 3000000) * math.RADIANS, Vec3.ZERO);
109
+ }
110
+ cam.update();
111
+ }
112
+
87
113
  onCameraTurnLeft(event) {
88
114
  var cam = this.renderer.activeCamera;
89
115
  if (this.renderer.events.isKeyPressed(input.KEY_SHIFT)) {
@@ -104,6 +130,26 @@ class KeyboardNavigation extends Control {
104
130
  cam.update();
105
131
  }
106
132
 
133
+ // from CompassButton._onClick()
134
+ onCameraRollNorth(event) {
135
+ let c = this.planet.getCartesianFromPixelTerrain(this.renderer.handler.getCenter());
136
+ if (c) {
137
+ this.planet.flyCartesian(
138
+ c.normal().scaleTo(c.length() + c.distance(this.planet.camera.eye)),
139
+ null,
140
+ null,
141
+ 0,
142
+ null,
143
+ null,
144
+ () => {
145
+ this.planet.camera.look(c);
146
+ }
147
+ );
148
+ } else {
149
+ this.planet.flyCartesian(this.planet.camera.eye);
150
+ }
151
+ }
152
+
107
153
  onCameraRollLeft(event) {
108
154
  this.renderer.activeCamera.roll(-15 / this.renderer.handler.deltaTime);
109
155
  this.renderer.activeCamera.update();