@openglobus/og 0.16.2 → 0.17.0

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 (181) hide show
  1. package/README.md +1 -1
  2. package/css/og.css +24 -2
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/og/Clock.js +1 -5
  10. package/src/og/Events.js +0 -4
  11. package/src/og/Extent.js +5 -9
  12. package/src/og/Globe.js +92 -55
  13. package/src/og/ImageCanvas.js +12 -5
  14. package/src/og/Lock.js +44 -48
  15. package/src/og/LonLat.js +0 -4
  16. package/src/og/Object3d.js +1 -1
  17. package/src/og/Stack.js +49 -53
  18. package/src/og/astro/earth.js +112 -116
  19. package/src/og/astro/jd.js +514 -518
  20. package/src/og/astro/orbit.js +119 -123
  21. package/src/og/astro/rotation.js +36 -40
  22. package/src/og/bv/Box.js +77 -81
  23. package/src/og/bv/Sphere.js +57 -61
  24. package/src/og/camera/Camera.js +20 -7
  25. package/src/og/camera/PlanetCamera.js +8 -15
  26. package/src/og/control/Atmosphere.js +0 -4
  27. package/src/og/control/Control.js +9 -8
  28. package/src/og/control/DebugInfo.js +0 -4
  29. package/src/og/control/DrawingSwitcher.js +117 -0
  30. package/src/og/control/EarthCoordinates.js +214 -214
  31. package/src/og/control/GeoImageDragControl.js +0 -4
  32. package/src/og/control/KeyboardNavigation.js +0 -4
  33. package/src/og/control/LayerAnimation.js +0 -4
  34. package/src/og/control/LayerSwitcher.js +2 -4
  35. package/src/og/control/Lighting.js +11 -15
  36. package/src/og/control/MouseNavigation.js +0 -4
  37. package/src/og/control/MouseWheelZoomControl.js +0 -4
  38. package/src/og/control/RulerSwitcher.js +0 -4
  39. package/src/og/control/ScaleControl.js +2 -6
  40. package/src/og/control/ShowFps.js +40 -44
  41. package/src/og/control/SimpleNavigation.js +10 -10
  42. package/src/og/control/SimpleSkyBackground.js +0 -4
  43. package/src/og/control/Sun.js +0 -4
  44. package/src/og/control/ToggleWireframe.js +35 -39
  45. package/src/og/control/ZoomControl.js +0 -4
  46. package/src/og/control/drawing/DrawingControl.js +51 -0
  47. package/src/og/control/drawing/LineStringDrawingScene.js +203 -0
  48. package/src/og/control/drawing/PolygonDrawingScene.js +785 -0
  49. package/src/og/control/elevationProfile/ElevationProfile.js +275 -0
  50. package/src/og/control/index.js +5 -1
  51. package/src/og/control/ruler/Ruler.js +0 -4
  52. package/src/og/control/ruler/RulerScene.js +3 -2
  53. package/src/og/control/selection/Selection.js +0 -4
  54. package/src/og/control/selection/SelectionScene.js +2 -4
  55. package/src/og/control/timeline/TimelineControl.js +4 -4
  56. package/src/og/control/timeline/TimelineModel.js +2 -2
  57. package/src/og/control/timeline/TimelineView.js +1 -0
  58. package/src/og/control/visibleExtent/Segment.js +5 -5
  59. package/src/og/control/visibleExtent/drawnode.js +0 -4
  60. package/src/og/ellipsoid/Ellipsoid.js +205 -275
  61. package/src/og/ellipsoid/wgs84.js +0 -4
  62. package/src/og/entity/BaseBillboard.js +375 -379
  63. package/src/og/entity/Billboard.js +0 -4
  64. package/src/og/entity/BillboardHandler.js +0 -4
  65. package/src/og/entity/Entity.js +22 -22
  66. package/src/og/entity/EntityCollection.js +7 -11
  67. package/src/og/entity/GeoObject.js +0 -4
  68. package/src/og/entity/GeoObjectHandler.js +0 -4
  69. package/src/og/entity/Geometry.js +5 -4
  70. package/src/og/entity/GeometryHandler.js +3 -4
  71. package/src/og/entity/Label.js +0 -4
  72. package/src/og/entity/LabelHandler.js +0 -4
  73. package/src/og/entity/PointCloud.js +0 -4
  74. package/src/og/entity/PointCloudHandler.js +122 -126
  75. package/src/og/entity/Polyline.js +4 -6
  76. package/src/og/entity/PolylineHandler.js +104 -108
  77. package/src/og/entity/Ray.js +29 -29
  78. package/src/og/entity/Strip.js +1 -1
  79. package/src/og/index.js +3 -1
  80. package/src/og/input/KeyboardHandler.js +128 -132
  81. package/src/og/input/MouseHandler.js +94 -98
  82. package/src/og/input/TouchHandler.js +59 -63
  83. package/src/og/input/input.js +44 -48
  84. package/src/og/layer/BaseGeoImage.js +5 -8
  85. package/src/og/layer/CanvasTiles.js +0 -4
  86. package/src/og/layer/GeoImage.js +0 -4
  87. package/src/og/layer/GeoTexture2d.js +0 -4
  88. package/src/og/layer/GeoVideo.js +0 -4
  89. package/src/og/layer/KML.js +2 -3
  90. package/src/og/layer/Layer.js +22 -26
  91. package/src/og/layer/Material.js +0 -4
  92. package/src/og/layer/Vector.js +23 -20
  93. package/src/og/layer/WMS.js +182 -186
  94. package/src/og/layer/XYZ.js +0 -4
  95. package/src/og/light/LightSource.js +0 -4
  96. package/src/og/math/Line2.js +28 -32
  97. package/src/og/math/Mat3.js +152 -156
  98. package/src/og/math/Ray.js +0 -4
  99. package/src/og/math/Vec2.js +0 -4
  100. package/src/og/math/Vec3.js +0 -4
  101. package/src/og/math/Vec4.js +0 -4
  102. package/src/og/math/coder.js +104 -104
  103. package/src/og/math.js +39 -7
  104. package/src/og/proj/EPSG3857.js +13 -13
  105. package/src/og/proj/Proj.js +59 -63
  106. package/src/og/quadTree/EPSG4326QuadTreeStrategy.js +1 -0
  107. package/src/og/quadTree/EarthQuadTreeStrategy.js +1 -0
  108. package/src/og/quadTree/EntityCollectionNode.js +12 -16
  109. package/src/og/quadTree/MarsQuadTreeStrategy.js +1 -0
  110. package/src/og/quadTree/QuadTreeStrategy.js +1 -0
  111. package/src/og/quadTree/Wgs84QuadTreeStrategy.js +1 -0
  112. package/src/og/renderer/Renderer.js +109 -22
  113. package/src/og/renderer/RendererEvents.js +0 -4
  114. package/src/og/scene/Axes.js +74 -78
  115. package/src/og/scene/BaseNode.js +0 -4
  116. package/src/og/scene/Planet.js +114 -112
  117. package/src/og/scene/RenderNode.js +11 -3
  118. package/src/og/scene/SkyBox.js +104 -108
  119. package/src/og/segment/Segment.js +8 -4
  120. package/src/og/segment/SegmentLonLat.js +2 -6
  121. package/src/og/segment/segmentHelper.js +229 -225
  122. package/src/og/shaders/billboard.js +0 -4
  123. package/src/og/shaders/drawnode.js +5 -9
  124. package/src/og/shaders/geoObject.js +0 -4
  125. package/src/og/shaders/label.js +0 -4
  126. package/src/og/shaders/pickingMask.js +0 -4
  127. package/src/og/shaders/pointCloud.js +0 -4
  128. package/src/og/shaders/polyline.js +0 -4
  129. package/src/og/shaders/ray.js +0 -4
  130. package/src/og/shaders/skybox.js +0 -4
  131. package/src/og/terrain/EmptyTerrain.js +0 -4
  132. package/src/og/utils/FontAtlas.js +0 -4
  133. package/src/og/utils/GeoImageCreator.js +1 -2
  134. package/src/og/utils/NormalMapCreator.js +8 -9
  135. package/src/og/utils/VectorTileCreator.js +3 -9
  136. package/src/og/utils/shared.js +20 -1
  137. package/src/og/webgl/Framebuffer.js +0 -4
  138. package/src/og/webgl/Handler.js +45 -19
  139. package/src/og/webgl/Multisample.js +0 -4
  140. package/src/og/webgl/Program.js +0 -4
  141. package/src/og/webgl/ProgramController.js +2 -2
  142. package/types/Clock.d.ts +1 -1
  143. package/types/Extent.d.ts +5 -5
  144. package/types/Globe.d.ts +15 -1
  145. package/types/ImageCanvas.d.ts +5 -0
  146. package/types/bv/Box.d.ts +1 -1
  147. package/types/bv/Sphere.d.ts +3 -3
  148. package/types/camera/Camera.d.ts +3 -2
  149. package/types/camera/PlanetCamera.d.ts +4 -4
  150. package/types/control/DrawingSwitcher.d.ts +13 -0
  151. package/types/control/EarthCoordinates.d.ts +1 -1
  152. package/types/control/Lighting.d.ts +8 -8
  153. package/types/control/drawing/DrawingControl.d.ts +14 -0
  154. package/types/control/drawing/LineStringDrawingScene.d.ts +5 -0
  155. package/types/control/drawing/PolygonDrawingScene.d.ts +99 -0
  156. package/types/control/index.d.ts +3 -1
  157. package/types/control/ruler/RulerScene.d.ts +0 -1
  158. package/types/control/selection/SelectionScene.d.ts +0 -1
  159. package/types/ellipsoid/Ellipsoid.d.ts +50 -63
  160. package/types/entity/Entity.d.ts +3 -2
  161. package/types/entity/Geometry.d.ts +5 -0
  162. package/types/entity/Polyline.d.ts +1 -1
  163. package/types/entity/Ray.d.ts +1 -0
  164. package/types/index.d.ts +1 -0
  165. package/types/layer/BaseGeoImage.d.ts +1 -1
  166. package/types/layer/CanvasTiles.d.ts +1 -1
  167. package/types/layer/Layer.d.ts +1 -1
  168. package/types/layer/Vector.d.ts +1 -0
  169. package/types/math.d.ts +7 -0
  170. package/types/renderer/Renderer.d.ts +7 -1
  171. package/types/scene/Axes.d.ts +0 -1
  172. package/types/scene/Planet.d.ts +26 -24
  173. package/types/scene/RenderNode.d.ts +2 -0
  174. package/types/scene/SkyBox.d.ts +0 -1
  175. package/types/segment/Segment.d.ts +3 -2
  176. package/types/segment/SegmentLonLat.d.ts +0 -1
  177. package/types/utils/GeoImageCreator.d.ts +1 -1
  178. package/types/utils/NormalMapCreator.d.ts +1 -1
  179. package/types/utils/VectorTileCreator.d.ts +2 -2
  180. package/types/utils/shared.d.ts +2 -0
  181. package/types/webgl/Handler.d.ts +6 -4
@@ -0,0 +1,785 @@
1
+ 'use strict';
2
+
3
+ import * as math from "../../math.js";
4
+ import { Entity } from '../../entity/Entity.js';
5
+ import { Events } from '../../Events.js';
6
+ import { Vector } from '../../layer/Vector.js';
7
+ import { Vec2 } from '../../math/Vec2.js';
8
+ import { Object3d } from '../../Object3d.js';
9
+ import { RenderNode } from '../../scene/RenderNode.js';
10
+ import { Vec3 } from '../../math/Vec3.js';
11
+ import { Line3 } from '../../math/Line3.js';
12
+ import { LonLat } from '../../LonLat.js';
13
+ import { Geometry, GeometryType } from "../../entity/Geometry.js";
14
+
15
+ const POINTER_OBJ3D = Object3d.createCylinder(1, 1, 2.0, 20, 1, true, false, 0, -0.5, 0);
16
+
17
+ export const NUM_SEGMENTS = 200;
18
+ export const OUTLINE_ALT = 0.3;
19
+ export const COORDINATES_COLOR = "rgb(350, 350, 0)";
20
+ export const CENTER_COLOR = "rgb(0, 350, 50)";
21
+ export const OUTLINE_COLOR = "rgb(0, 350, 50)";
22
+ export const OUTLINE_THICKNESS = 3.5;
23
+
24
+ export const CORNER_OPTIONS = {
25
+ scale: 0.5,
26
+ instanced: true,
27
+ tag: "corners",
28
+ color: COORDINATES_COLOR,
29
+ object3d: POINTER_OBJ3D
30
+ };
31
+
32
+ export const CENTER_OPTIONS = {
33
+ scale: 0.4,
34
+ instanced: true,
35
+ tag: "centers",
36
+ color: CENTER_COLOR,
37
+ object3d: POINTER_OBJ3D
38
+ };
39
+
40
+ export const OUTLINE_OPTIONS = {
41
+ thickness: OUTLINE_THICKNESS,
42
+ color: OUTLINE_COLOR
43
+ }
44
+
45
+ class PolygonDrawingScene extends RenderNode {
46
+ constructor(options = {}) {
47
+ super(options.name);
48
+
49
+ this.events = new Events(EVENT_NAMES);
50
+
51
+ this._planet = null;
52
+
53
+ this._initCoordinates = options.coordinates || [];
54
+
55
+ this._pickedCorner = null;
56
+ this._pickedCenter = null;
57
+
58
+ this._startPos = null;
59
+ this._startClick = new Vec2();
60
+
61
+ this._geometryLayer = new Vector();
62
+
63
+ //
64
+ // outline vectors
65
+ //
66
+ this._cornerLayer = new Vector("corners", {
67
+ pickingScale: 3,
68
+ pickingEnabled: true,
69
+ polygonOffsetUnits: -5,
70
+ relativeToGround: true,
71
+ scaleByDistance: [100, 4000000, 1.0]
72
+ });
73
+
74
+ this._centerLayer = new Vector("centers", {
75
+ pickingScale: 3,
76
+ pickingEnabled: true,
77
+ polygonOffsetUnits: -5,
78
+ relativeToGround: true,
79
+ scaleByDistance: [100, 4000000, 1.0]
80
+ });
81
+
82
+ this._outlineLayer = new Vector("outline", {
83
+ entities: [new Entity({
84
+ polyline: {
85
+ path3v: [],
86
+ isClosed: false,
87
+ ...OUTLINE_OPTIONS
88
+ },
89
+ properties: {
90
+ index: 0
91
+ }
92
+ })],
93
+ pickingEnabled: false,
94
+ polygonOffsetUnits: -5,
95
+ relativeToGround: true
96
+ });
97
+
98
+ this._outlineLayer.getEntities()[0].polyline.altitude = OUTLINE_ALT;
99
+
100
+ //
101
+ // Ghost cursor pointer
102
+ //
103
+ this._ghostCorner = new Entity({
104
+ geoObject: CORNER_OPTIONS,
105
+ });
106
+
107
+ this._ghostOutlineLayer = new Vector("ghost-pointer", {
108
+ pickingEnabled: false,
109
+ polygonOffsetUnits: -5,
110
+ relativeToGround: true,
111
+ scaleByDistance: [100, 4000000, 1.0],
112
+ opacity: 0.5
113
+ });
114
+
115
+ this._showGhostPointer = false;
116
+
117
+ this._isStartPoint = false;
118
+
119
+ this._insertCornerIndex = -1;
120
+ }
121
+
122
+ get geometryType() {
123
+ return "Polygon";
124
+ }
125
+
126
+ getCoordinates() {
127
+ let corners = this._cornerLayer.getEntities();
128
+ if (corners.length > 0) {
129
+ return corners.map((c) => {
130
+ let ll = c.getLonLat();
131
+ return [ll.lon, ll.lat, ll.height];
132
+ });
133
+ } else {
134
+ return this._initCoordinates;
135
+ }
136
+ }
137
+
138
+ bindPlanet(planet) {
139
+ this._planet = planet;
140
+ }
141
+
142
+ init() {
143
+
144
+ this._initEvents();
145
+
146
+ this._initGhostLayerPointer();
147
+
148
+ if (this._initCoordinates.length) {
149
+ this.setCoordinates(this._initCoordinates);
150
+ }
151
+
152
+ this._planet.addLayer(this._outlineLayer);
153
+ this._planet.addLayer(this._cornerLayer);
154
+ this._planet.addLayer(this._centerLayer);
155
+
156
+ this.showGhostPointer();
157
+ this.startNewPoint();
158
+
159
+ this._planet.renderer.controls.mouseNavigation.deactivateDoubleClickZoom();
160
+
161
+ this._geometryLayer.addTo(this._planet);
162
+
163
+ this._onChange_ = this._onChange.bind(this);
164
+ this.events.on("change", this._onChange_, this);
165
+ }
166
+
167
+ _onChange(e) {
168
+ if (e.geometryType === "Polygon") {
169
+ let coords = this.getCoordinates();
170
+ let entity = new Entity({
171
+ 'geometry': {
172
+ 'type': e.geometryType,
173
+ 'coordinates': [coords],
174
+ 'style': {
175
+ 'fillColor': "rgba(0,146,247,0.2)"
176
+ }
177
+ }
178
+ });
179
+ this._geometryLayer.clear();
180
+ this._geometryLayer.add(entity);
181
+ }
182
+ }
183
+
184
+ onremove() {
185
+ this._clearEvents();
186
+ this.hideGhostPointer();
187
+ this.stopNewPoint();
188
+ this.clear();
189
+ this._geometryLayer.remove();
190
+ }
191
+
192
+ clear() {
193
+
194
+ this._geometryLayer.clear();
195
+
196
+ let corners = this._cornerLayer.getEntities();
197
+
198
+ let i = corners.length;
199
+ while (i--) {
200
+ corners[i].remove();
201
+ }
202
+
203
+ let centers = this._centerLayer.getEntities();
204
+ i = centers.length;
205
+ while (i--) {
206
+ centers[i].remove();
207
+ }
208
+
209
+ let entities = this._outlineLayer.getEntities();
210
+ i = entities.length;
211
+ while (i--) {
212
+ entities[i].polyline.clear();
213
+ if (i > 0) {
214
+ entities[i].remove();
215
+ }
216
+ }
217
+
218
+ this._clearGhostPointer();
219
+ }
220
+
221
+ setCoordinates(coords) {
222
+ this.clear();
223
+ for (let i = 0; i < coords.length; i++) {
224
+ let ci = coords[i];
225
+ let cart = this._planet.ellipsoid.lonLatToCartesian(new LonLat(ci[0], ci[1], ci[2]));
226
+ this._appendCart(cart);
227
+ }
228
+ this.events.dispatch(this.events.change, this);
229
+ }
230
+
231
+ stopNewPoint() {
232
+ if (this.renderer) {
233
+ this.renderer.events.off("ldblclick", this._onMouseDblClick_);
234
+ this._onMouseDblClick_ = null;
235
+ }
236
+ }
237
+
238
+ startNewPoint() {
239
+ this._onMouseDblClick_ = this._onMouseDblClick.bind(this);
240
+ this.renderer.events.on("ldblclick", this._onMouseDblClick_, this);
241
+ }
242
+
243
+ showGhostPointer() {
244
+ this._showGhostPointer = true;
245
+ this._planet.addLayer(this._ghostOutlineLayer);
246
+ this._insertCornerIndex = this._cornerLayer.getEntities().length;
247
+ }
248
+
249
+ hideGhostPointer() {
250
+ this._showGhostPointer = false;
251
+ this._ghostOutlineLayer.remove();
252
+ this._insertCornerIndex = -1;
253
+ }
254
+
255
+ setGhostPointerPosition(groundPos) {
256
+ if (groundPos) {
257
+ this._ghostCorner.setCartesian3v(groundPos);
258
+ this._updateGhostOutlinePointer(groundPos);
259
+ }
260
+ }
261
+
262
+ _onCornerMouseEnter(e) {
263
+ e.renderer.handler.canvas.style.cursor = "pointer";
264
+ this.hideGhostPointer();
265
+ }
266
+
267
+ _onCornerMouseLeave(e) {
268
+ e.renderer.handler.canvas.style.cursor = "default";
269
+ this.showGhostPointer();
270
+ }
271
+
272
+ _onCenterMouseEnter(e) {
273
+ e.renderer.handler.canvas.style.cursor = "pointer";
274
+ this.hideGhostPointer();
275
+ }
276
+
277
+ _onCenterMouseLeave(e) {
278
+ e.renderer.handler.canvas.style.cursor = "default";
279
+ if (!(this._pickedCenter || this._pickedCorner)) {
280
+ this.showGhostPointer();
281
+ }
282
+ }
283
+
284
+ _onLup(e) {
285
+ this._planet.renderer.controls.mouseNavigation.activate();
286
+ if (this._pickedCorner || this._pickedCenter) {
287
+ this.events.dispatch(this.events.change, this);
288
+ this.setGhostPointerPosition(this._planet.getCartesianFromPixelTerrain(e));
289
+ this.showGhostPointer();
290
+ this._pickedCorner = null;
291
+ this._pickedCenter = null;
292
+ }
293
+ }
294
+
295
+ _getLdown(e) {
296
+ this._planet.renderer.controls.mouseNavigation.deactivate();
297
+ this._startClick.set(e.x, e.y);
298
+ let coords = e.pickingObject.getCartesian();
299
+ this._startPos = this._planet.getPixelFromCartesian(coords);
300
+ return e.pickingObject;
301
+ }
302
+
303
+ _onCornerLdown(e) {
304
+ this._pickedCorner = this._getLdown(e);
305
+ }
306
+
307
+ _onCenterLdown(e) {
308
+ this._pickedCenter = this._getLdown(e);
309
+ }
310
+
311
+ _onMouseMove(e) {
312
+ if (this._pickedCenter) {
313
+ this._moveCenterPoint();
314
+ } else if (this._pickedCorner) {
315
+ this._moveCornerPoint(e);
316
+ } else {
317
+ this.setGhostPointerPosition(this._planet.getCartesianFromPixelTerrain(e));
318
+ }
319
+ }
320
+
321
+ _onCornerLdblclick(e) {
322
+ this._cornerDblClick = true;
323
+ let coords = this.getCoordinates();
324
+ coords.splice(e.pickingObject.layerIndex, 1);
325
+ this.setCoordinates(coords);
326
+ }
327
+
328
+ _onMouseDblClick(e) {
329
+
330
+ if (this._cornerDblClick) {
331
+ this._cornerDblClick = false;
332
+ return;
333
+ }
334
+
335
+ if (!this._showGhostPointer) {
336
+ return;
337
+ }
338
+
339
+ let cart = this._planet.getCartesianFromPixelTerrain(e);
340
+ if (cart) {
341
+ this._addNew(cart);
342
+ if (!this._isStartPoint && this._cornerLayer.getEntities().length > 2) {
343
+ this._isStartPoint = true;
344
+ this.events.dispatch(this.events.startpoint, this);
345
+ }
346
+ this.events.dispatch(this.events.change, this);
347
+ }
348
+ }
349
+
350
+ _initEvents() {
351
+
352
+ this._onCornerLdblclick_ = this._onCornerLdblclick.bind(this);
353
+ this._cornerLayer.events.on("ldblclick", this._onCornerLdblclick_, this);
354
+
355
+ this._onCornerLdown_ = this._onCornerLdown.bind(this);
356
+ this._cornerLayer.events.on("ldown", this._onCornerLdown_, this);
357
+
358
+ this._onCenterLdown_ = this._onCenterLdown.bind(this);
359
+ this._centerLayer.events.on("ldown", this._onCenterLdown_, this);
360
+
361
+ this._onLup_ = this._onLup.bind(this);
362
+ this.renderer.events.on("lup", this._onLup_, this);
363
+
364
+ this._onMouseMove_ = this._onMouseMove.bind(this);
365
+ this.renderer.events.on("mousemove", this._onMouseMove_, this);
366
+
367
+ this._onCornerMouseEnter_ = this._onCornerMouseEnter.bind(this);
368
+ this._cornerLayer.events.on("mouseenter", this._onCornerMouseEnter_, this);
369
+
370
+ this._onCornerMouseLeave_ = this._onCornerMouseLeave.bind(this);
371
+ this._cornerLayer.events.on("mouseleave", this._onCornerMouseLeave_, this);
372
+
373
+ this._onCenterMouseEnter_ = this._onCenterMouseEnter.bind(this);
374
+ this._centerLayer.events.on("mouseenter", this._onCenterMouseEnter_, this);
375
+
376
+ this._onCenterMouseLeave_ = this._onCenterMouseLeave.bind(this);
377
+ this._centerLayer.events.on("mouseleave", this._onCenterMouseLeave_, this);
378
+ }
379
+
380
+ _clearEvents() {
381
+ this._cornerLayer.events.off("ldblclick", this._onCornerLdblclick_);
382
+ this._onCornerLdblclick_ = null;
383
+
384
+ this._cornerLayer.events.off("ldown", this._onCornerLdown_);
385
+ this._onCornerLdown_ = null;
386
+
387
+ this._centerLayer.events.off("ldown", this._onCenterLdown_);
388
+ this._onCenterLdown_ = null;
389
+
390
+ this.renderer.events.off("lup", this._onLup_);
391
+ this._onLup_ = null;
392
+
393
+ this.renderer.events.off("mousemove", this._onMouseMove_);
394
+ this._onMouseMove_ = null;
395
+
396
+ this._cornerLayer.events.off("mouseenter", this._onCornerMouseEnter_);
397
+ this._onCornerMouseEnter_ = null;
398
+
399
+ this._cornerLayer.events.off("mouseleave", this._onCornerMouseLeave_);
400
+ this._onCornerMouseLeave_ = null;
401
+
402
+ this._centerLayer.events.off("mouseenter", this._onCenterMouseEnter_);
403
+ this._onCenterMouseEnter_ = null;
404
+
405
+ this._centerLayer.events.off("mouseleave", this._onCenterMouseLeave_);
406
+ this._onCenterMouseLeave_ = null;
407
+ }
408
+
409
+ _drawCorners() {
410
+ let corners = this._cornerLayer.getEntities();
411
+ for (let i = 0; i < corners.length; i++) {
412
+ let ai = corners[i];
413
+ this._checkTerrainCollision(ai);
414
+ }
415
+ }
416
+
417
+ _drawCenters() {
418
+ let centers = this._centerLayer.getEntities();
419
+ for (let i = 0; i < centers.length; i++) {
420
+ let ai = centers[i];
421
+ this._checkTerrainCollision(ai);
422
+ }
423
+ }
424
+
425
+ _drawGhostCorner() {
426
+ if (this._showGhostPointer) {
427
+ this._checkTerrainCollision(this._ghostCorner);
428
+ }
429
+ }
430
+
431
+ frame() {
432
+ this._drawCorners();
433
+ this._drawCenters();
434
+ this._drawGhostCorner();
435
+ }
436
+
437
+ _checkTerrainCollision(entity) {
438
+ let _tempTerrPoint = new Vec3();
439
+ let nodes = this._planet._renderedNodes;
440
+ for (let j = 0; j < nodes.length; j++) {
441
+ let seg = nodes[j].segment;
442
+ if (seg && seg._extentLonLat.isInside(entity.getLonLat())) {
443
+ seg.getEntityTerrainPoint(entity, _tempTerrPoint);
444
+ entity.setCartesian3v(_tempTerrPoint);
445
+ break;
446
+ }
447
+ }
448
+ }
449
+
450
+ _moveCenterPoint() {
451
+ let coords = this.getCoordinates(),
452
+ index = this._pickedCenter.layerIndex + 1,
453
+ ll = this._pickedCenter.getLonLat();
454
+ let newCorner = [ll.lon, ll.lat, ll.height];
455
+
456
+ coords.splice(index, 0, newCorner);
457
+
458
+ this.setCoordinates(coords);
459
+
460
+ this._pickedCenter = null;
461
+
462
+ this._pickedCorner = this._cornerLayer.getEntities()[index];
463
+ }
464
+
465
+ //
466
+ // virtual
467
+ //
468
+
469
+ _addNew(cart) {
470
+ if (this._insertCornerIndex === -1 || this._cornerLayer.getEntities().length < 2) {
471
+ this._appendCart(cart);
472
+ } else {
473
+ let area = this.getCoordinates(),
474
+ index = this._insertCornerIndex;
475
+ let ll = this._planet.ellipsoid.cartesianToLonLat(cart);
476
+ let newCorner = [ll.lon, ll.lat, ll.height];
477
+ area.splice(index, 0, newCorner);
478
+ this.clear();
479
+ this.setCoordinates(area);
480
+ }
481
+ }
482
+
483
+ _appendCart(cart) {
484
+ let corners = this._cornerLayer.getEntities();
485
+
486
+ let segNum = corners.length - 1;
487
+ let prevCorn = corners[segNum];
488
+
489
+ let corner = new Entity({
490
+ geoObject: CORNER_OPTIONS,
491
+ });
492
+
493
+ corner.setCartesian3v(cart);
494
+ corner.addTo(this._cornerLayer);
495
+ this._checkTerrainCollision(corner);
496
+
497
+ if (prevCorn) {
498
+
499
+ let firstCart = corners[0].getCartesian(),
500
+ prevCart = prevCorn.getCartesian();
501
+
502
+ let vecPrev = corner.getCartesian().sub(prevCart),
503
+ vecFirst = corner.getCartesian().sub(firstCart);
504
+
505
+ let distPrev = vecPrev.length(),
506
+ distFirst = vecFirst.length();
507
+
508
+ vecPrev.normalize();
509
+ vecFirst.normalize();
510
+
511
+ let prevPath = [],
512
+ firstPath = [];
513
+
514
+ for (let i = 0; i <= NUM_SEGMENTS; i++) {
515
+ let p = vecPrev.scaleTo(i * distPrev / NUM_SEGMENTS).addA(prevCart);
516
+ prevPath.push(p);
517
+
518
+ let f = vecFirst.scaleTo(i * distFirst / NUM_SEGMENTS).addA(firstCart);
519
+ firstPath.push(f);
520
+ }
521
+
522
+ this._outlineLayer.getEntities()[0].polyline.setPath3v([firstPath]);
523
+
524
+ let entity = new Entity({
525
+ polyline: {
526
+ path3v: [prevPath],
527
+ isClosed: false,
528
+ properties: {
529
+ index: segNum + 1
530
+ },
531
+ ...OUTLINE_OPTIONS
532
+ }
533
+ });
534
+ entity.polyline.altitude = OUTLINE_ALT;
535
+ this._outlineLayer.add(entity);
536
+
537
+ let centers = this._centerLayer.getEntities();
538
+ let firstCenter = centers[centers.length - 1];
539
+
540
+ let prevCenterCart = vecPrev.scaleTo(distPrev * 0.5).addA(prevCart),
541
+ firstCenterCart = vecFirst.scaleTo(distFirst * 0.5).addA(firstCart);
542
+
543
+ let center = new Entity({
544
+ geoObject: CENTER_OPTIONS,
545
+ });
546
+ center.setCartesian3v(prevCenterCart);
547
+ center.addTo(this._centerLayer);
548
+ this._checkTerrainCollision(center);
549
+
550
+ //moveToEnd
551
+ firstCenter.remove();
552
+ firstCenter.addTo(this._centerLayer);
553
+
554
+ firstCenter.setCartesian3v(firstCenterCart);
555
+
556
+ } else {
557
+ let center = new Entity({
558
+ geoObject: CENTER_OPTIONS,
559
+ });
560
+ center.addTo(this._centerLayer);
561
+ }
562
+ }
563
+
564
+ _clearGhostPointer() {
565
+ this._ghostOutlineLayer.getEntities()[0].polyline.clear();
566
+ this._ghostOutlineLayer.getEntities()[1].polyline.clear();
567
+ }
568
+
569
+ _moveCornerPoint(e) {
570
+ let d = new Vec2(e.x, e.y).sub(this._startClick),
571
+ p = this._startPos.add(d);
572
+
573
+ let groundCoords = this._planet.getCartesianFromPixelTerrain(p);
574
+
575
+ if (groundCoords) {
576
+
577
+ this._pickedCorner.setCartesian3v(groundCoords);
578
+
579
+ let corners = this._cornerLayer.getEntities();
580
+
581
+ if (corners.length) {
582
+ let ind = this._pickedCorner.layerIndex;
583
+ let size = corners.length;
584
+
585
+ let cartPrev = corners[ind === 0 ? (size - 1) : (ind - 1)].getCartesian(),
586
+ cartNext = corners[(ind + 1) % size].getCartesian();
587
+
588
+ let vecPrev = this._pickedCorner.getCartesian().sub(cartPrev),
589
+ vecNext = this._pickedCorner.getCartesian().sub(cartNext);
590
+
591
+ let distPrev = vecPrev.length(),
592
+ distNext = vecNext.length();
593
+
594
+ vecPrev.normalize();
595
+ vecNext.normalize();
596
+
597
+ let pathPrev = [],
598
+ pathNext = [];
599
+
600
+ for (let i = 0; i <= NUM_SEGMENTS; i++) {
601
+ let p = vecPrev.scaleTo(i * distPrev / NUM_SEGMENTS).addA(cartPrev);
602
+ pathPrev.push(p);
603
+
604
+ let f = vecNext.scaleTo(i * distNext / NUM_SEGMENTS).addA(cartNext);
605
+ pathNext.push(f);
606
+ }
607
+
608
+ let entities = this._outlineLayer.getEntities();
609
+
610
+ let prevPolyline = entities[ind].polyline,
611
+ nextPolyline = entities[(ind + 1) % size].polyline;
612
+
613
+ prevPolyline.setPath3v([pathPrev]);
614
+ nextPolyline.setPath3v([pathNext]);
615
+
616
+ //
617
+ // Move center points
618
+ let centers = this._centerLayer.getEntities();
619
+ let prevCenter = centers[ind === 0 ? (size - 1) : (ind - 1)],
620
+ nextCenter = centers[ind];
621
+
622
+ let prevCenterCart = vecPrev.scaleTo(distPrev * 0.5).addA(cartPrev),
623
+ nextCenterCart = vecNext.scaleTo(distNext * 0.5).addA(cartNext);
624
+
625
+ prevCenter.setCartesian3v(prevCenterCart);
626
+ this._checkTerrainCollision(prevCenter);
627
+
628
+ nextCenter.setCartesian3v(nextCenterCart);
629
+ this._checkTerrainCollision(nextCenter);
630
+ }
631
+ }
632
+ }
633
+
634
+ _updateGhostOutlinePointer(groundPos) {
635
+
636
+ let corners = this._cornerLayer.getEntities();
637
+ let size = corners.length;
638
+
639
+ if (size > 0) {
640
+
641
+ let ind = 0;
642
+
643
+ let minDist = math.MAX;
644
+
645
+ for (let i = 0; i < size; i++) {
646
+ let ci = corners[i];
647
+ let dist = ci.getCartesian().distance(groundPos);
648
+ if (dist < minDist) {
649
+ minDist = dist;
650
+ ind = i;
651
+ }
652
+ }
653
+
654
+ let cCurr = corners[ind].getCartesian(),
655
+ cNext = corners[(ind + 1) % size].getCartesian(),
656
+ cPrev = corners[ind === 0 ? (size - 1) : (ind - 1)].getCartesian();
657
+
658
+ let nPrev = cPrev.sub(cCurr).normalize(),
659
+ nNext = cNext.sub(cCurr).normalize(),
660
+ nGround = groundPos.sub(cCurr).normalize();
661
+
662
+ let midVec = nPrev.add(nNext).normalize();
663
+
664
+ let toMid = nGround.cross(midVec),
665
+ up = nPrev.cross(nNext);
666
+
667
+ if (toMid.dot(up) > 0) {
668
+ ind--;
669
+ if (ind < 0) {
670
+ ind = size - 1;
671
+ }
672
+ }
673
+
674
+ let temp = new Vec3();
675
+
676
+ for (let i = 0; i < size; i++) {
677
+ let side = new Line3(corners[i].getCartesian(), corners[(i + 1) % size].getCartesian());
678
+ let u = side.getNearestDistancePoint(groundPos, temp);
679
+ if (u) {
680
+ let dist = temp.distance(groundPos);
681
+ if (dist < minDist) {
682
+ minDist = dist;
683
+ ind = i;
684
+ }
685
+ }
686
+ }
687
+
688
+ this._insertCornerIndex = (ind + 1) % size;
689
+
690
+ let cartPrev = corners[ind % size].getCartesian(),
691
+ cartNext = corners[(ind + 1) % size].getCartesian();
692
+
693
+ let vecPrev = this._ghostCorner.getCartesian().sub(cartPrev),
694
+ vecNext = this._ghostCorner.getCartesian().sub(cartNext);
695
+
696
+ let distPrev = vecPrev.length(),
697
+ distNext = vecNext.length();
698
+
699
+ vecPrev.normalize();
700
+ vecNext.normalize();
701
+
702
+ let pathPrev = [],
703
+ pathNext = [];
704
+
705
+ for (let i = 0; i <= NUM_SEGMENTS; i++) {
706
+ let p = vecPrev.scaleTo(i * distPrev / NUM_SEGMENTS).addA(cartPrev);
707
+ pathPrev.push(p);
708
+
709
+ let f = vecNext.scaleTo(i * distNext / NUM_SEGMENTS).addA(cartNext);
710
+ pathNext.push(f);
711
+ }
712
+
713
+ let entities = this._ghostOutlineLayer.getEntities();
714
+
715
+ let prevPolyline = entities[0].polyline,
716
+ nextPolyline = entities[1].polyline;
717
+
718
+ prevPolyline.setPath3v([pathPrev]);
719
+ nextPolyline.setPath3v([pathNext]);
720
+ }
721
+ }
722
+
723
+ _initGhostLayerPointer() {
724
+ this._ghostOutlineLayer.setEntities([
725
+ new Entity({
726
+ polyline: {
727
+ path3v: [],
728
+ isClosed: false,
729
+ ...OUTLINE_OPTIONS
730
+ },
731
+ properties: {
732
+ index: 0
733
+ }
734
+ }), new Entity({
735
+ polyline: {
736
+ path3v: [],
737
+ isClosed: false,
738
+ ...OUTLINE_OPTIONS
739
+ },
740
+ properties: {
741
+ index: 0
742
+ }
743
+ }),
744
+ this._ghostCorner
745
+ ]);
746
+
747
+ this._ghostOutlineLayer.getEntities()[0].polyline.altitude =
748
+ this._ghostOutlineLayer.getEntities()[1].polyline.altitude = OUTLINE_ALT;
749
+ }
750
+ }
751
+
752
+ const EVENT_NAMES = [
753
+ "startpoint",
754
+ "change",
755
+ "add",
756
+ "remove",
757
+ "mousemove",
758
+ "mouseenter",
759
+ "mouseleave",
760
+ "lclick",
761
+ "rclick",
762
+ "mclick",
763
+ "ldblclick",
764
+ "rdblclick",
765
+ "mdblclick",
766
+ "lup",
767
+ "rup",
768
+ "mup",
769
+ "ldown",
770
+ "rdown",
771
+ "mdown",
772
+ "lhold",
773
+ "rhold",
774
+ "mhold",
775
+ "mousewheel",
776
+ "touchmove",
777
+ "touchstart",
778
+ "touchend",
779
+ "doubletouch",
780
+ "touchleave",
781
+ "touchenter"
782
+ ];
783
+
784
+
785
+ export { PolygonDrawingScene };