@openglobus/og 0.13.7 → 0.13.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 (50) 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/Object3d.js +384 -0
  7. package/src/og/arial.js +1705 -1703
  8. package/src/og/camera/Camera.js +640 -640
  9. package/src/og/control/EarthCoordinates.js +1 -1
  10. package/src/og/control/LayerAnimation.js +115 -0
  11. package/src/og/control/MouseNavigation.js +460 -460
  12. package/src/og/control/Sun.js +170 -170
  13. package/src/og/control/ZoomControl.js +0 -2
  14. package/src/og/control/index.js +3 -1
  15. package/src/og/control/ruler/Ruler.js +43 -0
  16. package/src/og/control/ruler/RulerScene.js +370 -0
  17. package/src/og/control/visibleExtent/Segment.js +1 -4
  18. package/src/og/ellipsoid/Ellipsoid.js +19 -0
  19. package/src/og/entity/Entity.js +1 -1
  20. package/src/og/entity/GeoObject.js +1 -1
  21. package/src/og/entity/LabelHandler.js +1 -0
  22. package/src/og/layer/Layer.js +23 -40
  23. package/src/og/layer/Vector.js +80 -14
  24. package/src/og/layer/XYZ.js +4 -0
  25. package/src/og/math/Vec3.js +1 -1
  26. package/src/og/math.js +4 -4
  27. package/src/og/quadTree/Node.js +1 -1
  28. package/src/og/renderer/Renderer.js +1 -2
  29. package/src/og/res/images.js +0 -2
  30. package/src/og/scene/Planet.js +3 -2
  31. package/src/og/segment/Segment.js +0 -8
  32. package/src/og/shaders/label.js +30 -42
  33. package/src/og/utils/FontAtlas.js +1 -2
  34. package/src/og/utils/Loader.js +160 -153
  35. package/src/og/utils/VectorTileCreator.js +1 -1
  36. package/src/og/webgl/ProgramController.js +143 -143
  37. package/types/Object3d.d.ts +21 -0
  38. package/types/arial.d.ts +1 -0
  39. package/types/control/Sun.d.ts +1 -1
  40. package/types/control/index.d.ts +2 -1
  41. package/types/control/ruler/Ruler.d.ts +13 -0
  42. package/types/control/ruler/RulerScene.d.ts +48 -0
  43. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  44. package/types/layer/Layer.d.ts +23 -31
  45. package/types/layer/Vector.d.ts +2 -0
  46. package/types/layer/XYZ.d.ts +1 -0
  47. package/types/math.d.ts +1 -1
  48. package/types/res/images.d.ts +0 -1
  49. package/types/scene/Planet.d.ts +2 -2
  50. package/types/utils/Loader.d.ts +1 -0
@@ -1,460 +1,460 @@
1
- /**
2
- * @module og/control/MouseNavigation
3
- */
4
-
5
- "use strict";
6
-
7
- import * as math from "../math.js";
8
- import { Control } from "./Control.js";
9
- import { input } from "../input/input.js";
10
- import { Key } from "../Lock.js";
11
- import { LonLat } from "../LonLat.js";
12
- import { Mat4 } from "../math/Mat4.js";
13
- import { Quat } from "../math/Quat.js";
14
- import { Ray } from "../math/Ray.js";
15
- import { Sphere } from "../bv/Sphere.js";
16
- import { Vec3 } from "../math/Vec3.js";
17
-
18
- /**
19
- * Mouse planet camera dragging control.
20
- * @class
21
- * @extends {Control}
22
- * @param {Object} [options] - Control options.
23
- */
24
- class MouseNavigation extends Control {
25
- constructor(options) {
26
- super(options);
27
-
28
- this._name = "mouseNavigation";
29
-
30
- options = options || {};
31
-
32
- this.grabbedPoint = new Vec3();
33
- this._eye0 = new Vec3();
34
- this.pointOnEarth = new Vec3();
35
- this.earthUp = new Vec3();
36
- this.inertia = 0.007;
37
- this.grabbedSpheroid = new Sphere();
38
- this.planet = null;
39
- this.qRot = new Quat();
40
- this.scaleRot = 0.0;
41
-
42
- this.distDiff = 0.3;
43
- this.stepsCount = 8;
44
- this.stepsForward = null;
45
- this.stepIndex = 0;
46
-
47
- this._lmbDoubleClickActive = true;
48
-
49
- this.minSlope = options.minSlope || 0.1;
50
-
51
- this._wheelDirection = +1;
52
-
53
- this._keyLock = new Key();
54
- }
55
-
56
- static getMovePointsFromPixelTerrain(cam, planet, stepsCount, delta, point, forward, dir) {
57
- var steps = [];
58
-
59
- var eye = cam.eye.clone(),
60
- n = cam._b.clone(),
61
- u = cam._r.clone(),
62
- v = cam._u.clone();
63
-
64
- var a = planet.getCartesianFromPixelTerrain(point, true);
65
-
66
- if (!a) {
67
- a = planet.getCartesianFromPixelTerrain(planet.renderer.handler.getCenter(), true);
68
- }
69
-
70
- if (a) {
71
- if (!dir) {
72
- dir = Vec3.sub(a, cam.eye).normalize();
73
- }
74
-
75
- var d = a ? (delta * cam.eye.distance(a)) / stepsCount : 1000;
76
-
77
- if (forward) {
78
- d = -1.25 * d;
79
- } else {
80
- d *= 2;
81
- }
82
-
83
- var scaled_n = n.scaleTo(d);
84
-
85
- let slope = dir.dot(cam.eye.normal().negate());
86
-
87
- if (a && slope >= 0.1) {
88
- var grabbedSpheroid = new Sphere();
89
- grabbedSpheroid.radius = a.length();
90
-
91
- var rotArr = [],
92
- eyeArr = [];
93
-
94
- var breaked = false;
95
- for (var i = 0; i < stepsCount; i++) {
96
- eye.addA(scaled_n);
97
- var b = new Ray(eye, dir).hitSphere(grabbedSpheroid);
98
- eyeArr[i] = eye.clone();
99
- if (b) {
100
- rotArr[i] = new Mat4().rotateBetweenVectors(a.normal(), b.normal());
101
- } else {
102
- breaked = true;
103
- break;
104
- }
105
- }
106
-
107
- if (!breaked) {
108
- for (let i = 0; i < stepsCount; i++) {
109
- var rot = rotArr[i];
110
- steps[i] = {};
111
- steps[i].eye = rot.mulVec3(eyeArr[i]);
112
- steps[i].v = rot.mulVec3(v);
113
- steps[i].u = rot.mulVec3(u);
114
- steps[i].n = rot.mulVec3(n);
115
- }
116
- } else {
117
- eye = cam.eye.clone();
118
- for (let i = 0; i < stepsCount; i++) {
119
- steps[i] = {};
120
- steps[i].eye = eye.addA(scaled_n).clone();
121
- steps[i].v = v;
122
- steps[i].u = u;
123
- steps[i].n = n;
124
- }
125
- }
126
- } else {
127
- for (let i = 0; i < stepsCount; i++) {
128
- steps[i] = {};
129
- steps[i].eye = eye.addA(dir.scaleTo(-d)).clone();
130
- steps[i].v = v;
131
- steps[i].u = u;
132
- steps[i].n = n;
133
- }
134
- }
135
-
136
- return steps;
137
- }
138
- }
139
-
140
- onactivate() {
141
- this.renderer.events.on("mousewheel", this.onMouseWheel, this);
142
- this.renderer.events.on("lhold", this.onMouseLeftButtonDown, this);
143
- this.renderer.events.on("rhold", this.onMouseRightButtonDown, this);
144
- this.renderer.events.on("ldown", this.onMouseLeftButtonClick, this);
145
- this.renderer.events.on("lup", this.onMouseLeftButtonUp, this);
146
- this.renderer.events.on("rdown", this.onMouseRightButtonClick, this);
147
- this.renderer.events.on("draw", this.onDraw, this, -1000);
148
- this.renderer.events.on("mousemove", this.onMouseMove, this);
149
- this.renderer.events.on("mouseleave", this.onMouseLeave, this);
150
- this.renderer.events.on("mouseenter", this.onMouseEnter, this);
151
-
152
- if (this._lmbDoubleClickActive) {
153
- this.renderer.events.on("ldblclick", this.onMouseLeftButtonDoubleClick, this);
154
- }
155
- }
156
-
157
- ondeactivate() {
158
- this.renderer.events.off("mousewheel", this.onMouseWheel);
159
- this.renderer.events.off("lhold", this.onMouseLeftButtonDown);
160
- this.renderer.events.off("rhold", this.onMouseRightButtonDown);
161
- this.renderer.events.off("ldown", this.onMouseLeftButtonClick);
162
- this.renderer.events.off("lup", this.onMouseLeftButtonUp);
163
- this.renderer.events.off("rdown", this.onMouseRightButtonClick);
164
- this.renderer.events.off("draw", this.onDraw);
165
- this.renderer.events.off("ldblclick", this.onMouseLeftButtonDoubleClick);
166
- this.renderer.events.off("mouseleave", this.onMouseLeave);
167
- this.renderer.events.off("mouseenter", this.onMouseEnter);
168
- }
169
-
170
- activateDoubleClickZoom() {
171
- if (!this._lmbDoubleClickActive) {
172
- this._lmbDoubleClickActive = true;
173
- this.renderer.events.on("ldblclick", this.onMouseLeftButtonDoubleClick, this);
174
- }
175
- }
176
-
177
- deactivateDoubleClickZoom() {
178
- if (this._lmbDoubleClickActive) {
179
- this._lmbDoubleClickActive = false;
180
- this.renderer.events.off("ldblclick", this.onMouseLeftButtonDoubleClick);
181
- }
182
- }
183
-
184
- onMouseEnter(e) {
185
- const renderEvents = this.renderer.events;
186
- if (renderEvents.isKeyPressed(input.KEY_ALT)) {
187
- renderEvents.releaseKeys();
188
- }
189
-
190
- renderEvents.updateButtonsStates(e.buttons);
191
- if (renderEvents.mouseState.leftButtonDown) {
192
- this.renderer.handler.canvas.classList.add("ogGrabbingPoiner");
193
- } else {
194
- this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
195
- }
196
- }
197
-
198
- onMouseLeave(e) {
199
- if (this.renderer.events.mouseState.leftButtonDown) {
200
- this.scaleRot = 0;
201
- }
202
- this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
203
- }
204
-
205
- onMouseWheel(event) {
206
- if (this.stepIndex) {
207
- return;
208
- }
209
-
210
- this.planet.stopFlying();
211
-
212
- this.stopRotation();
213
-
214
- this._deactivate = true;
215
-
216
- this.planet.layerLock.lock(this._keyLock);
217
- //this.planet.terrainLock.lock(this._keyLock);
218
- this.planet._normalMapCreator.lock(this._keyLock);
219
-
220
- var ms = this.renderer.events.mouseState;
221
- this.stepsForward = MouseNavigation.getMovePointsFromPixelTerrain(
222
- this.renderer.activeCamera,
223
- this.planet,
224
- this.stepsCount,
225
- this.distDiff,
226
- ms,
227
- event.wheelDelta > 0,
228
- ms.direction
229
- );
230
-
231
- this._wheelDirection = event.wheelDelta;
232
-
233
- if (this.stepsForward) {
234
- this.stepIndex = this.stepsCount;
235
- }
236
- }
237
-
238
- oninit() {
239
- this.activate();
240
-
241
- this.renderer.events.on("keyfree", input.KEY_ALT, this.onShiftFree, this);
242
- this.renderer.events.on("keyfree", input.KEY_PRINTSCREEN, this.onShiftFree, this);
243
- }
244
-
245
- onMouseLeftButtonDoubleClick() {
246
- this.planet.stopFlying();
247
- this.stopRotation();
248
- var p = this.planet.getCartesianFromPixelTerrain(this.renderer.events.mouseState);
249
- if (p) {
250
- var cam = this.renderer.activeCamera;
251
- let maxAlt = cam.maxAltitude + this.planet.ellipsoid._b;
252
- let minAlt = cam.minAltitude + this.planet.ellipsoid._b;
253
- const camAlt = cam.eye.length();
254
- var g = this.planet.ellipsoid.cartesianToLonLat(p);
255
- if (camAlt > maxAlt || camAlt < minAlt) {
256
- this.planet.flyLonLat(new LonLat(g.lon, g.lat))
257
- return;
258
- }
259
-
260
- if (this.renderer.events.isKeyPressed(input.KEY_ALT)) {
261
- this.planet.flyLonLat(
262
- new LonLat(g.lon, g.lat, cam.eye.distance(p) * 2.0)
263
- );
264
- } else {
265
- this.planet.flyLonLat(
266
- new LonLat(g.lon, g.lat, cam.eye.distance(p) * 0.57)
267
- );
268
- }
269
- }
270
- }
271
-
272
- onMouseLeftButtonClick() {
273
- if (this._active) {
274
- this.renderer.handler.canvas.classList.add("ogGrabbingPoiner");
275
- this.grabbedPoint = this.planet.getCartesianFromMouseTerrain();
276
- if (this.grabbedPoint) {
277
- this._eye0.copy(this.renderer.activeCamera.eye);
278
- this.grabbedSpheroid.radius = this.grabbedPoint.length();
279
- this.stopRotation();
280
- }
281
- }
282
- }
283
-
284
- stopRotation() {
285
- this.qRot.clear();
286
- this.planet.layerLock.free(this._keyLock);
287
- this.planet.terrainLock.free(this._keyLock);
288
- this.planet._normalMapCreator.free(this._keyLock);
289
- }
290
-
291
- onMouseLeftButtonUp(e) {
292
- this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
293
- if (e.x === e.prev_x && e.y === e.prev_y) {
294
- this.scaleRot = 0.0;
295
- }
296
- }
297
-
298
- onMouseLeftButtonDown(e) {
299
- if (this._active) {
300
- if (!this.grabbedPoint) {
301
- return;
302
- }
303
-
304
- this.planet.stopFlying();
305
-
306
- if (this.renderer.events.mouseState.moving) {
307
- var cam = this.renderer.activeCamera;
308
-
309
- if (cam.slope > 0.2) {
310
- var targetPoint = new Ray(cam.eye, e.direction).hitSphere(this.grabbedSpheroid);
311
- if (targetPoint) {
312
- this.scaleRot = 1.0;
313
- this.qRot = Quat.getRotationBetweenVectors(
314
- targetPoint.normal(),
315
- this.grabbedPoint.normal()
316
- );
317
- var rot = this.qRot;
318
- cam.eye = rot.mulVec3(cam.eye);
319
- cam._u = rot.mulVec3(cam._u);
320
- cam._r = rot.mulVec3(cam._r);
321
- cam._b = rot.mulVec3(cam._b);
322
-
323
- cam.checkTerrainCollision();
324
-
325
- cam.update();
326
- }
327
- } else {
328
- var p0 = this.grabbedPoint,
329
- p1 = Vec3.add(p0, cam._r),
330
- p2 = Vec3.add(p0, p0.normal());
331
-
332
- var px = new Vec3();
333
- if (new Ray(cam.eye, e.direction).hitPlane(p0, p1, p2, px) === Ray.INSIDE) {
334
- cam.eye = this._eye0.addA(px.subA(p0).negate());
335
-
336
- cam.checkTerrainCollision();
337
-
338
- cam.update();
339
- }
340
- }
341
- }
342
- }
343
- }
344
-
345
- onMouseRightButtonClick(e) {
346
- this.stopRotation();
347
- this.planet.stopFlying();
348
- this.pointOnEarth = this.planet.getCartesianFromPixelTerrain(e);
349
- if (this.pointOnEarth) {
350
- this.earthUp = this.pointOnEarth.normal();
351
- }
352
- }
353
-
354
- onMouseRightButtonDown(e) {
355
- var cam = this.renderer.activeCamera;
356
-
357
- if (this.pointOnEarth && this.renderer.events.mouseState.moving) {
358
- this.renderer.controlsBag.scaleRot = 1.0;
359
- var l = (0.5 / cam.eye.distance(this.pointOnEarth)) * cam._lonLat.height * math.RADIANS;
360
- if (l > 0.007) l = 0.007;
361
- cam.rotateHorizontal(l * (e.x - e.prev_x), false, this.pointOnEarth, this.earthUp);
362
-
363
- cam.rotateVertical(l * (e.y - e.prev_y), this.pointOnEarth, this.minSlope);
364
-
365
- cam.checkTerrainCollision();
366
-
367
- cam.update();
368
- }
369
- }
370
-
371
- onShiftFree() {
372
- this._shiftBusy = false;
373
- }
374
-
375
- onMouseMove(e) {
376
- if (this._active && this.renderer.events.isKeyPressed(input.KEY_ALT)) {
377
- if (!this._shiftBusy) {
378
- this._shiftBusy = true;
379
- this.onMouseRightButtonClick(e);
380
- }
381
-
382
- this.onMouseRightButtonDown(e);
383
- }
384
- }
385
-
386
- onDraw(e) {
387
- if (this._active) {
388
- var r = this.renderer;
389
- var cam = r.activeCamera;
390
- var prevEye = cam.eye.clone();
391
-
392
- if (this.stepIndex) {
393
- r.controlsBag.scaleRot = 1.0;
394
- var sf = this.stepsForward[this.stepsCount - this.stepIndex--];
395
-
396
- let maxAlt = cam.maxAltitude + this.planet.ellipsoid._b;
397
- let minAlt = cam.minAltitude + this.planet.ellipsoid._b;
398
- const camAlt = sf.eye.length();
399
- if (camAlt > maxAlt || camAlt < minAlt && this._wheelDirection > 0) {
400
- this._wheelDirection = +1;
401
- return;
402
- }
403
-
404
- cam.eye = sf.eye;
405
- cam._u = sf.v;
406
- cam._r = sf.u;
407
- cam._b = sf.n;
408
-
409
- cam.checkTerrainCollision();
410
-
411
- cam.update();
412
- } else {
413
- if (this._deactivate) {
414
- this._deactivate = false;
415
-
416
- this.planet.layerLock.free(this._keyLock);
417
- this.planet.terrainLock.free(this._keyLock);
418
- this.planet._normalMapCreator.free(this._keyLock);
419
- }
420
- }
421
-
422
- if (r.events.mouseState.leftButtonDown || !this.scaleRot) {
423
- return;
424
- }
425
-
426
- this.scaleRot -= this.inertia;
427
- if (this.scaleRot <= 0.0) {
428
- this.scaleRot = 0.0;
429
- } else {
430
- r.controlsBag.scaleRot = this.scaleRot;
431
- var rot = this.qRot
432
- .slerp(Quat.IDENTITY, 1.0 - this.scaleRot * this.scaleRot * this.scaleRot)
433
- .normalize();
434
- if (!(rot.x || rot.y || rot.z)) {
435
- this.scaleRot = 0.0;
436
- }
437
- cam.eye = rot.mulVec3(cam.eye);
438
- cam._u = rot.mulVec3(cam._u);
439
- cam._r = rot.mulVec3(cam._r);
440
- cam._b = rot.mulVec3(cam._b);
441
-
442
- cam.checkTerrainCollision();
443
-
444
- cam.update();
445
- }
446
-
447
- if (cam.eye.distance(prevEye) / cam._terrainAltitude > 0.01) {
448
- this.planet.layerLock.lock(this._keyLock);
449
- this.planet.terrainLock.lock(this._keyLock);
450
- this.planet._normalMapCreator.lock(this._keyLock);
451
- } else {
452
- this.planet.layerLock.free(this._keyLock);
453
- this.planet.terrainLock.free(this._keyLock);
454
- this.planet._normalMapCreator.free(this._keyLock);
455
- }
456
- }
457
- }
458
- }
459
-
460
- export { MouseNavigation };
1
+ /**
2
+ * @module og/control/MouseNavigation
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import * as math from "../math.js";
8
+ import { Control } from "./Control.js";
9
+ import { input } from "../input/input.js";
10
+ import { Key } from "../Lock.js";
11
+ import { LonLat } from "../LonLat.js";
12
+ import { Mat4 } from "../math/Mat4.js";
13
+ import { Quat } from "../math/Quat.js";
14
+ import { Ray } from "../math/Ray.js";
15
+ import { Sphere } from "../bv/Sphere.js";
16
+ import { Vec3 } from "../math/Vec3.js";
17
+
18
+ /**
19
+ * Mouse planet camera dragging control.
20
+ * @class
21
+ * @extends {Control}
22
+ * @param {Object} [options] - Control options.
23
+ */
24
+ class MouseNavigation extends Control {
25
+ constructor(options) {
26
+ super(options);
27
+
28
+ this._name = "mouseNavigation";
29
+
30
+ options = options || {};
31
+
32
+ this.grabbedPoint = new Vec3();
33
+ this._eye0 = new Vec3();
34
+ this.pointOnEarth = new Vec3();
35
+ this.earthUp = new Vec3();
36
+ this.inertia = 0.007;
37
+ this.grabbedSpheroid = new Sphere();
38
+ this.planet = null;
39
+ this.qRot = new Quat();
40
+ this.scaleRot = 0.0;
41
+
42
+ this.distDiff = 0.3;
43
+ this.stepsCount = 8;
44
+ this.stepsForward = null;
45
+ this.stepIndex = 0;
46
+
47
+ this._lmbDoubleClickActive = true;
48
+
49
+ this.minSlope = options.minSlope || 0.1;
50
+
51
+ this._wheelDirection = +1;
52
+
53
+ this._keyLock = new Key();
54
+ }
55
+
56
+ static getMovePointsFromPixelTerrain(cam, planet, stepsCount, delta, point, forward, dir) {
57
+ var steps = [];
58
+
59
+ var eye = cam.eye.clone(),
60
+ n = cam._b.clone(),
61
+ u = cam._r.clone(),
62
+ v = cam._u.clone();
63
+
64
+ var a = planet.getCartesianFromPixelTerrain(point, true);
65
+
66
+ if (!a) {
67
+ a = planet.getCartesianFromPixelTerrain(planet.renderer.handler.getCenter(), true);
68
+ }
69
+
70
+ if (a) {
71
+ if (!dir) {
72
+ dir = Vec3.sub(a, cam.eye).normalize();
73
+ }
74
+
75
+ var d = (delta * cam.eye.distance(a)) / stepsCount;
76
+
77
+ if (forward) {
78
+ d = -1.25 * d;
79
+ } else {
80
+ d *= 2;
81
+ }
82
+
83
+ var scaled_n = n.scaleTo(d);
84
+
85
+ let slope = dir.dot(cam.eye.normal().negate());
86
+
87
+ if (slope >= 0.1) {
88
+ var grabbedSpheroid = new Sphere();
89
+ grabbedSpheroid.radius = a.length();
90
+
91
+ var rotArr = [],
92
+ eyeArr = [];
93
+
94
+ var breaked = false;
95
+ for (var i = 0; i < stepsCount; i++) {
96
+ eye.addA(scaled_n);
97
+ var b = new Ray(eye, dir).hitSphere(grabbedSpheroid);
98
+ eyeArr[i] = eye.clone();
99
+ if (b) {
100
+ rotArr[i] = new Mat4().rotateBetweenVectors(a.normal(), b.normal());
101
+ } else {
102
+ breaked = true;
103
+ break;
104
+ }
105
+ }
106
+
107
+ if (!breaked) {
108
+ for (let i = 0; i < stepsCount; i++) {
109
+ var rot = rotArr[i];
110
+ steps[i] = {};
111
+ steps[i].eye = rot.mulVec3(eyeArr[i]);
112
+ steps[i].v = rot.mulVec3(v);
113
+ steps[i].u = rot.mulVec3(u);
114
+ steps[i].n = rot.mulVec3(n);
115
+ }
116
+ } else {
117
+ eye = cam.eye.clone();
118
+ for (let i = 0; i < stepsCount; i++) {
119
+ steps[i] = {};
120
+ steps[i].eye = eye.addA(scaled_n).clone();
121
+ steps[i].v = v;
122
+ steps[i].u = u;
123
+ steps[i].n = n;
124
+ }
125
+ }
126
+ } else {
127
+ for (let i = 0; i < stepsCount; i++) {
128
+ steps[i] = {};
129
+ steps[i].eye = eye.addA(dir.scaleTo(-d)).clone();
130
+ steps[i].v = v;
131
+ steps[i].u = u;
132
+ steps[i].n = n;
133
+ }
134
+ }
135
+
136
+ return steps;
137
+ }
138
+ }
139
+
140
+ onactivate() {
141
+ this.renderer.events.on("mousewheel", this.onMouseWheel, this);
142
+ this.renderer.events.on("lhold", this.onMouseLeftButtonDown, this);
143
+ this.renderer.events.on("rhold", this.onMouseRightButtonDown, this);
144
+ this.renderer.events.on("ldown", this.onMouseLeftButtonClick, this);
145
+ this.renderer.events.on("lup", this.onMouseLeftButtonUp, this);
146
+ this.renderer.events.on("rdown", this.onMouseRightButtonClick, this);
147
+ this.renderer.events.on("draw", this.onDraw, this, -1000);
148
+ this.renderer.events.on("mousemove", this.onMouseMove, this);
149
+ this.renderer.events.on("mouseleave", this.onMouseLeave, this);
150
+ this.renderer.events.on("mouseenter", this.onMouseEnter, this);
151
+
152
+ if (this._lmbDoubleClickActive) {
153
+ this.renderer.events.on("ldblclick", this.onMouseLeftButtonDoubleClick, this);
154
+ }
155
+ }
156
+
157
+ ondeactivate() {
158
+ this.renderer.events.off("mousewheel", this.onMouseWheel);
159
+ this.renderer.events.off("lhold", this.onMouseLeftButtonDown);
160
+ this.renderer.events.off("rhold", this.onMouseRightButtonDown);
161
+ this.renderer.events.off("ldown", this.onMouseLeftButtonClick);
162
+ this.renderer.events.off("lup", this.onMouseLeftButtonUp);
163
+ this.renderer.events.off("rdown", this.onMouseRightButtonClick);
164
+ this.renderer.events.off("draw", this.onDraw);
165
+ this.renderer.events.off("ldblclick", this.onMouseLeftButtonDoubleClick);
166
+ this.renderer.events.off("mouseleave", this.onMouseLeave);
167
+ this.renderer.events.off("mouseenter", this.onMouseEnter);
168
+ }
169
+
170
+ activateDoubleClickZoom() {
171
+ if (!this._lmbDoubleClickActive) {
172
+ this._lmbDoubleClickActive = true;
173
+ this.renderer.events.on("ldblclick", this.onMouseLeftButtonDoubleClick, this);
174
+ }
175
+ }
176
+
177
+ deactivateDoubleClickZoom() {
178
+ if (this._lmbDoubleClickActive) {
179
+ this._lmbDoubleClickActive = false;
180
+ this.renderer.events.off("ldblclick", this.onMouseLeftButtonDoubleClick);
181
+ }
182
+ }
183
+
184
+ onMouseEnter(e) {
185
+ const renderEvents = this.renderer.events;
186
+ if (renderEvents.isKeyPressed(input.KEY_ALT)) {
187
+ renderEvents.releaseKeys();
188
+ }
189
+
190
+ renderEvents.updateButtonsStates(e.buttons);
191
+ if (renderEvents.mouseState.leftButtonDown) {
192
+ this.renderer.handler.canvas.classList.add("ogGrabbingPoiner");
193
+ } else {
194
+ this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
195
+ }
196
+ }
197
+
198
+ onMouseLeave(e) {
199
+ if (this.renderer.events.mouseState.leftButtonDown) {
200
+ this.scaleRot = 0;
201
+ }
202
+ this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
203
+ }
204
+
205
+ onMouseWheel(event) {
206
+ if (this.stepIndex) {
207
+ return;
208
+ }
209
+
210
+ this.planet.stopFlying();
211
+
212
+ this.stopRotation();
213
+
214
+ this._deactivate = true;
215
+
216
+ this.planet.layerLock.lock(this._keyLock);
217
+ //this.planet.terrainLock.lock(this._keyLock);
218
+ this.planet._normalMapCreator.lock(this._keyLock);
219
+
220
+ var ms = this.renderer.events.mouseState;
221
+ this.stepsForward = MouseNavigation.getMovePointsFromPixelTerrain(
222
+ this.renderer.activeCamera,
223
+ this.planet,
224
+ this.stepsCount,
225
+ this.distDiff,
226
+ ms,
227
+ event.wheelDelta > 0,
228
+ ms.direction
229
+ );
230
+
231
+ this._wheelDirection = event.wheelDelta;
232
+
233
+ if (this.stepsForward) {
234
+ this.stepIndex = this.stepsCount;
235
+ }
236
+ }
237
+
238
+ oninit() {
239
+ this.activate();
240
+
241
+ this.renderer.events.on("keyfree", input.KEY_ALT, this.onShiftFree, this);
242
+ this.renderer.events.on("keyfree", input.KEY_PRINTSCREEN, this.onShiftFree, this);
243
+ }
244
+
245
+ onMouseLeftButtonDoubleClick() {
246
+ this.planet.stopFlying();
247
+ this.stopRotation();
248
+ var p = this.planet.getCartesianFromPixelTerrain(this.renderer.events.mouseState);
249
+ if (p) {
250
+ var cam = this.renderer.activeCamera;
251
+ let maxAlt = cam.maxAltitude + this.planet.ellipsoid._b;
252
+ let minAlt = cam.minAltitude + this.planet.ellipsoid._b;
253
+ const camAlt = cam.eye.length();
254
+ var g = this.planet.ellipsoid.cartesianToLonLat(p);
255
+ if (camAlt > maxAlt || camAlt < minAlt) {
256
+ this.planet.flyLonLat(new LonLat(g.lon, g.lat))
257
+ return;
258
+ }
259
+
260
+ if (this.renderer.events.isKeyPressed(input.KEY_ALT)) {
261
+ this.planet.flyLonLat(
262
+ new LonLat(g.lon, g.lat, cam.eye.distance(p) * 2.0)
263
+ );
264
+ } else {
265
+ this.planet.flyLonLat(
266
+ new LonLat(g.lon, g.lat, cam.eye.distance(p) * 0.57)
267
+ );
268
+ }
269
+ }
270
+ }
271
+
272
+ onMouseLeftButtonClick() {
273
+ if (this._active) {
274
+ this.renderer.handler.canvas.classList.add("ogGrabbingPoiner");
275
+ this.grabbedPoint = this.planet.getCartesianFromMouseTerrain();
276
+ if (this.grabbedPoint) {
277
+ this._eye0.copy(this.renderer.activeCamera.eye);
278
+ this.grabbedSpheroid.radius = this.grabbedPoint.length();
279
+ this.stopRotation();
280
+ }
281
+ }
282
+ }
283
+
284
+ stopRotation() {
285
+ this.qRot.clear();
286
+ this.planet.layerLock.free(this._keyLock);
287
+ this.planet.terrainLock.free(this._keyLock);
288
+ this.planet._normalMapCreator.free(this._keyLock);
289
+ }
290
+
291
+ onMouseLeftButtonUp(e) {
292
+ this.renderer.handler.canvas.classList.remove("ogGrabbingPoiner");
293
+ if (e.x === e.prev_x && e.y === e.prev_y) {
294
+ this.scaleRot = 0.0;
295
+ }
296
+ }
297
+
298
+ onMouseLeftButtonDown(e) {
299
+ if (this._active) {
300
+ if (!this.grabbedPoint) {
301
+ return;
302
+ }
303
+
304
+ this.planet.stopFlying();
305
+
306
+ if (this.renderer.events.mouseState.moving) {
307
+ var cam = this.renderer.activeCamera;
308
+
309
+ if (cam.slope > 0.2) {
310
+ var targetPoint = new Ray(cam.eye, e.direction).hitSphere(this.grabbedSpheroid);
311
+ if (targetPoint) {
312
+ this.scaleRot = 1.0;
313
+ this.qRot = Quat.getRotationBetweenVectors(
314
+ targetPoint.normal(),
315
+ this.grabbedPoint.normal()
316
+ );
317
+ var rot = this.qRot;
318
+ cam.eye = rot.mulVec3(cam.eye);
319
+ cam._u = rot.mulVec3(cam._u);
320
+ cam._r = rot.mulVec3(cam._r);
321
+ cam._b = rot.mulVec3(cam._b);
322
+
323
+ cam.checkTerrainCollision();
324
+
325
+ cam.update();
326
+ }
327
+ } else {
328
+ var p0 = this.grabbedPoint,
329
+ p1 = Vec3.add(p0, cam._r),
330
+ p2 = Vec3.add(p0, p0.normal());
331
+
332
+ var px = new Vec3();
333
+ if (new Ray(cam.eye, e.direction).hitPlane(p0, p1, p2, px) === Ray.INSIDE) {
334
+ cam.eye = this._eye0.addA(px.subA(p0).negate());
335
+
336
+ cam.checkTerrainCollision();
337
+
338
+ cam.update();
339
+ }
340
+ }
341
+ }
342
+ }
343
+ }
344
+
345
+ onMouseRightButtonClick(e) {
346
+ this.stopRotation();
347
+ this.planet.stopFlying();
348
+ this.pointOnEarth = this.planet.getCartesianFromPixelTerrain(e);
349
+ if (this.pointOnEarth) {
350
+ this.earthUp = this.pointOnEarth.normal();
351
+ }
352
+ }
353
+
354
+ onMouseRightButtonDown(e) {
355
+ var cam = this.renderer.activeCamera;
356
+
357
+ if (this.pointOnEarth && this.renderer.events.mouseState.moving) {
358
+ this.renderer.controlsBag.scaleRot = 1.0;
359
+ var l = (0.5 / cam.eye.distance(this.pointOnEarth)) * cam._lonLat.height * math.RADIANS;
360
+ if (l > 0.007) l = 0.007;
361
+ cam.rotateHorizontal(l * (e.x - e.prev_x), false, this.pointOnEarth, this.earthUp);
362
+
363
+ cam.rotateVertical(l * (e.y - e.prev_y), this.pointOnEarth, this.minSlope);
364
+
365
+ cam.checkTerrainCollision();
366
+
367
+ cam.update();
368
+ }
369
+ }
370
+
371
+ onShiftFree() {
372
+ this._shiftBusy = false;
373
+ }
374
+
375
+ onMouseMove(e) {
376
+ if (this._active && this.renderer.events.isKeyPressed(input.KEY_ALT)) {
377
+ if (!this._shiftBusy) {
378
+ this._shiftBusy = true;
379
+ this.onMouseRightButtonClick(e);
380
+ }
381
+
382
+ this.onMouseRightButtonDown(e);
383
+ }
384
+ }
385
+
386
+ onDraw(e) {
387
+ if (this._active) {
388
+ var r = this.renderer;
389
+ var cam = r.activeCamera;
390
+ var prevEye = cam.eye.clone();
391
+
392
+ if (this.stepIndex) {
393
+ r.controlsBag.scaleRot = 1.0;
394
+ var sf = this.stepsForward[this.stepsCount - this.stepIndex--];
395
+
396
+ let maxAlt = cam.maxAltitude + this.planet.ellipsoid._b;
397
+ let minAlt = cam.minAltitude + this.planet.ellipsoid._b;
398
+ const camAlt = sf.eye.length();
399
+ if (camAlt > maxAlt || camAlt < minAlt && this._wheelDirection > 0) {
400
+ this._wheelDirection = +1;
401
+ return;
402
+ }
403
+
404
+ cam.eye = sf.eye;
405
+ cam._u = sf.v;
406
+ cam._r = sf.u;
407
+ cam._b = sf.n;
408
+
409
+ cam.checkTerrainCollision();
410
+
411
+ cam.update();
412
+ } else {
413
+ if (this._deactivate) {
414
+ this._deactivate = false;
415
+
416
+ this.planet.layerLock.free(this._keyLock);
417
+ this.planet.terrainLock.free(this._keyLock);
418
+ this.planet._normalMapCreator.free(this._keyLock);
419
+ }
420
+ }
421
+
422
+ if (r.events.mouseState.leftButtonDown || !this.scaleRot) {
423
+ return;
424
+ }
425
+
426
+ this.scaleRot -= this.inertia;
427
+ if (this.scaleRot <= 0.0) {
428
+ this.scaleRot = 0.0;
429
+ } else {
430
+ r.controlsBag.scaleRot = this.scaleRot;
431
+ var rot = this.qRot
432
+ .slerp(Quat.IDENTITY, 1.0 - this.scaleRot * this.scaleRot * this.scaleRot)
433
+ .normalize();
434
+ if (!(rot.x || rot.y || rot.z)) {
435
+ this.scaleRot = 0.0;
436
+ }
437
+ cam.eye = rot.mulVec3(cam.eye);
438
+ cam._u = rot.mulVec3(cam._u);
439
+ cam._r = rot.mulVec3(cam._r);
440
+ cam._b = rot.mulVec3(cam._b);
441
+
442
+ cam.checkTerrainCollision();
443
+
444
+ cam.update();
445
+ }
446
+
447
+ if (cam.eye.distance(prevEye) / cam._terrainAltitude > 0.01) {
448
+ this.planet.layerLock.lock(this._keyLock);
449
+ this.planet.terrainLock.lock(this._keyLock);
450
+ this.planet._normalMapCreator.lock(this._keyLock);
451
+ } else {
452
+ this.planet.layerLock.free(this._keyLock);
453
+ this.planet.terrainLock.free(this._keyLock);
454
+ this.planet._normalMapCreator.free(this._keyLock);
455
+ }
456
+ }
457
+ }
458
+ }
459
+
460
+ export { MouseNavigation };