@openglobus/og 0.13.4 → 0.13.7

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 (55) hide show
  1. package/css/og.css +66 -25
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/og/Events.js +188 -188
  9. package/src/og/Extent.js +1 -9
  10. package/src/og/Globe.js +1 -0
  11. package/src/og/control/DebugInfo.js +15 -4
  12. package/src/og/control/EarthCoordinates.js +151 -160
  13. package/src/og/control/KeyboardNavigation.js +48 -2
  14. package/src/og/control/TouchNavigation.js +13 -13
  15. package/src/og/control/ZoomControl.js +1 -1
  16. package/src/og/ellipsoid/Ellipsoid.js +1 -1
  17. package/src/og/entity/Billboard.js +165 -165
  18. package/src/og/entity/BillboardHandler.js +1 -1
  19. package/src/og/entity/Geometry.js +319 -319
  20. package/src/og/entity/Label.js +348 -346
  21. package/src/og/entity/LabelHandler.js +44 -37
  22. package/src/og/input/input.js +7 -1
  23. package/src/og/layer/CanvasTiles.js +8 -8
  24. package/src/og/layer/KML.js +181 -12
  25. package/src/og/layer/Layer.js +4 -2
  26. package/src/og/layer/XYZ.js +4 -2
  27. package/src/og/quadTree/Node.js +1 -0
  28. package/src/og/renderer/RendererEvents.js +17 -3
  29. package/src/og/scene/Planet.js +89 -30
  30. package/src/og/segment/Segment.js +1 -0
  31. package/src/og/shaders/label.js +56 -13
  32. package/src/og/terrain/EmptyTerrain.js +164 -146
  33. package/src/og/terrain/Geoid.js +246 -241
  34. package/src/og/terrain/GlobusTerrain.js +23 -24
  35. package/src/og/terrain/MapboxTerrain.js +292 -294
  36. package/src/og/utils/FontAtlas.js +25 -15
  37. package/src/og/utils/Loader.js +53 -12
  38. package/src/og/utils/PlainSegmentWorker.js +38 -26
  39. package/src/og/utils/TextureAtlas.js +291 -280
  40. package/src/og/utils/units.js +78 -0
  41. package/types/control/EarthCoordinates.d.ts +27 -30
  42. package/types/control/KeyboardNavigation.d.ts +3 -0
  43. package/types/entity/Label.d.ts +1 -0
  44. package/types/entity/LabelHandler.d.ts +1 -1
  45. package/types/input/input.d.ts +6 -0
  46. package/types/layer/KML.d.ts +26 -1
  47. package/types/renderer/RendererEvents.d.ts +2 -0
  48. package/types/scene/Planet.d.ts +10 -1
  49. package/types/terrain/EmptyTerrain.d.ts +4 -1
  50. package/types/terrain/Geoid.d.ts +1 -10
  51. package/types/terrain/GlobusTerrain.d.ts +0 -2
  52. package/types/terrain/MapboxTerrain.d.ts +1 -1
  53. package/types/utils/Loader.d.ts +3 -0
  54. package/types/utils/TextureAtlas.d.ts +2 -0
  55. package/types/utils/units.d.ts +20 -0
@@ -24,6 +24,9 @@ const OUTLINECOLOR_BUFFER = 10;
24
24
 
25
25
  window.LABEL_DEPTH_OFFSET = -0;
26
26
 
27
+ const EMPTY = -1.0;
28
+ const RTL = 1.0;
29
+
27
30
  /*
28
31
  * og.LabelHandler
29
32
  *
@@ -201,6 +204,8 @@ class LabelHandler extends BillboardHandler {
201
204
  var gl = h.gl,
202
205
  ec = this._entityCollection;
203
206
 
207
+ gl.disable(gl.CULL_FACE);
208
+
204
209
  gl.uniform1iv(shu.fontTextureArr, r.fontAtlas.samplerArr);
205
210
  gl.uniform4fv(shu.sdfParamsArr, r.fontAtlas.sdfParamsArr);
206
211
  gl.uniformMatrix4fv(shu.viewMatrix, false, r.activeCamera._viewMatrix._m);
@@ -264,6 +269,8 @@ class LabelHandler extends BillboardHandler {
264
269
  gl.drawArrays(gl.TRIANGLES, 0, this._vertexBuffer.numItems);
265
270
 
266
271
  gl.depthFunc(gl.LESS);
272
+
273
+ gl.enable(gl.CULL_FACE);
267
274
  }
268
275
 
269
276
  _pickingPASS() {
@@ -359,7 +366,10 @@ class LabelHandler extends BillboardHandler {
359
366
  label._isReady = false;
360
367
  }
361
368
 
362
- setText(index, text, fontIndex, align) {
369
+ setText(index, text, fontIndex, align, isRTL = false) {
370
+
371
+ text = text.normalize('NFKC');
372
+
363
373
  var fa = this._renderer.fontAtlas.atlasesArr[fontIndex];
364
374
 
365
375
  if (!fa) return;
@@ -370,15 +380,19 @@ class LabelHandler extends BillboardHandler {
370
380
 
371
381
  let c = 0;
372
382
 
373
- let n = fa.nodes[text[c]];
374
- let offset = 0.0;
375
383
  let len = Math.min(this._maxLetters, text.length);
384
+ let _rtl_ = 0.0;
385
+ if (isRTL) {
386
+ _rtl_ = RTL;
387
+ }
388
+
389
+ let offset = 0.0;
376
390
  let kern = fa.kernings;
377
391
 
378
392
  for (c = 0; c < len; c++) {
379
393
  let j = i + c * 24;
380
394
  let char = text[c];
381
- n = fa.nodes[char] || fa.nodes[" "];
395
+ let n = fa.get(char.charCodeAt()) || fa.get(" ".charCodeAt());
382
396
  let tc = n.texCoords;
383
397
 
384
398
  let m = n.metrics;
@@ -386,32 +400,32 @@ class LabelHandler extends BillboardHandler {
386
400
  a[j] = tc[0];
387
401
  a[j + 1] = tc[1];
388
402
  a[j + 2] = offset;
389
- a[j + 3] = 0.0;
403
+ a[j + 3] = _rtl_;
390
404
 
391
405
  a[j + 4] = tc[2];
392
406
  a[j + 5] = tc[3];
393
407
  a[j + 6] = offset;
394
- a[j + 7] = 0.0;
408
+ a[j + 7] = _rtl_;
395
409
 
396
410
  a[j + 8] = tc[4];
397
411
  a[j + 9] = tc[5];
398
412
  a[j + 10] = offset;
399
- a[j + 11] = 0.0;
413
+ a[j + 11] = _rtl_;
400
414
 
401
415
  a[j + 12] = tc[6];
402
416
  a[j + 13] = tc[7];
403
417
  a[j + 14] = offset;
404
- a[j + 15] = 0.0;
418
+ a[j + 15] = _rtl_;
405
419
 
406
420
  a[j + 16] = tc[8];
407
421
  a[j + 17] = tc[9];
408
422
  a[j + 18] = offset;
409
- a[j + 19] = 0.0;
423
+ a[j + 19] = _rtl_;
410
424
 
411
425
  a[j + 20] = tc[10];
412
426
  a[j + 21] = tc[11];
413
427
  a[j + 22] = offset;
414
- a[j + 23] = 0.0;
428
+ a[j + 23] = _rtl_;
415
429
 
416
430
  //
417
431
  // Gliph
@@ -446,9 +460,9 @@ class LabelHandler extends BillboardHandler {
446
460
  g[j + 22] = m.nXOffset;
447
461
  g[j + 23] = m.nYOffset;
448
462
 
449
- let k = kern[char];
450
- if (k) {
451
- k = k[text[c + 1]];
463
+ let k = kern[char.charCodeAt()];
464
+ if (k && text[c + 1]) {
465
+ k = k[text[c + 1].charCodeAt()];
452
466
  if (k) {
453
467
  offset += m.nAdvance + k;
454
468
  } else {
@@ -464,33 +478,23 @@ class LabelHandler extends BillboardHandler {
464
478
  offset *= -0.5;
465
479
  for (c = 0; c < len; c++) {
466
480
  let j = i + c * 24;
467
- a[j + 3] = offset;
468
- a[j + 7] = offset;
469
- a[j + 11] = offset;
470
- a[j + 15] = offset;
471
- a[j + 19] = offset;
472
- a[j + 23] = offset;
473
- }
474
- } else if (align === ALIGN.LEFT) {
475
- for (c = 0; c < len; c++) {
476
- let j = i + c * 24;
477
- a[j + 3] = 0;
478
- a[j + 7] = 0;
479
- a[j + 11] = 0;
480
- a[j + 15] = 0;
481
- a[j + 19] = 0;
482
- a[j + 23] = 0;
481
+ a[j + 2] += offset;
482
+ a[j + 6] += offset;
483
+ a[j + 10] += offset;
484
+ a[j + 14] += offset;
485
+ a[j + 18] += offset;
486
+ a[j + 22] += offset;
483
487
  }
484
488
  }
485
489
 
486
490
  for (; c < this._maxLetters; c++) {
487
491
  let j = i + c * 24;
488
- a[j + 2] = -1.0;
489
- a[j + 6] = -1.0;
490
- a[j + 10] = -1.0;
491
- a[j + 14] = -1.0;
492
- a[j + 18] = -1.0;
493
- a[j + 17] = -1.0;
492
+ a[j + 3] = EMPTY;
493
+ a[j + 7] = EMPTY;
494
+ a[j + 11] = EMPTY;
495
+ a[j + 15] = EMPTY;
496
+ a[j + 19] = EMPTY;
497
+ a[j + 23] = EMPTY;
494
498
  }
495
499
 
496
500
  this._changedBuffers[TEXCOORD_BUFFER] = true;
@@ -793,19 +797,22 @@ class LabelHandler extends BillboardHandler {
793
797
 
794
798
  for (var q = 0; q < this._maxLetters; q++) {
795
799
  var j = i + q * 12;
800
+
796
801
  a[j] = vertexArr[0];
797
802
  a[j + 1] = vertexArr[1];
798
- a[j + 2] = vertexArr[2];
799
803
 
804
+ a[j + 2] = vertexArr[2];
800
805
  a[j + 3] = vertexArr[3];
806
+
801
807
  a[j + 4] = vertexArr[4];
802
808
  a[j + 5] = vertexArr[5];
803
809
 
804
810
  a[j + 6] = vertexArr[6];
805
811
  a[j + 7] = vertexArr[7];
806
- a[j + 8] = vertexArr[8];
807
812
 
813
+ a[j + 8] = vertexArr[8];
808
814
  a[j + 9] = vertexArr[9];
815
+
809
816
  a[j + 10] = vertexArr[10];
810
817
  a[j + 11] = vertexArr[11];
811
818
  }
@@ -9,11 +9,14 @@ export const input = {
9
9
  KEY_ALT: 18,
10
10
  KEY_SHIFT: 16,
11
11
  KEY_SPACE: 32,
12
+ KEY_PGUP: 33,
13
+ KEY_PGDN: 34,
12
14
  KEY_LEFT: 37,
13
15
  KEY_UP: 38,
14
16
  KEY_RIGHT: 39,
15
17
  KEY_DOWN: 40,
16
18
  KEY_PRINTSCREEN: 44,
19
+ KEY_EQUALS: 61,
17
20
  KEY_A: 65,
18
21
  KEY_C: 67,
19
22
  KEY_D: 68,
@@ -23,6 +26,7 @@ export const input = {
23
26
  KEY_I: 73,
24
27
  KEY_K: 75,
25
28
  KEY_L: 76,
29
+ KEY_N: 78,
26
30
  KEY_O: 79,
27
31
  KEY_P: 80,
28
32
  KEY_Q: 81,
@@ -32,9 +36,11 @@ export const input = {
32
36
  KEY_W: 87,
33
37
  KEY_X: 88,
34
38
  KEY_Z: 90,
39
+ KEY_PLUS: 107,
35
40
  KEY_F1: 112,
41
+ KEY_MINUS: 173,
36
42
  KEY_APOSTROPHE: 192,
37
43
  MB_LEFT: 0,
38
44
  MB_RIGHT: 2,
39
45
  MB_MIDDLE: 1
40
- };
46
+ };
@@ -98,14 +98,14 @@ class CanvasTiles extends Layer {
98
98
  * @public
99
99
  * @param {boolean} visibility - Layer visibility.
100
100
  */
101
- setVisibility(visibility) {
101
+ setVisibility(visibility) {
102
102
  if (visibility !== this._visibility) {
103
103
  super.setVisibility(visibility);
104
104
 
105
105
  if (!visibility) {
106
106
  this.abortLoading();
107
107
  }
108
- }
108
+ }
109
109
  }
110
110
 
111
111
  /**
@@ -203,7 +203,7 @@ class CanvasTiles extends Layer {
203
203
  this._exec(pmat);
204
204
  }
205
205
  }
206
- } else if (this._counter === 0) {
206
+ } else if (this._counter === 0 && this._planet._terrainCompletedActivated) {
207
207
  this.events.dispatch(this.events.loadend);
208
208
  }
209
209
  }
@@ -227,21 +227,21 @@ class CanvasTiles extends Layer {
227
227
  applyMaterial(material) {
228
228
  if (material.isReady) {
229
229
  return [0, 0, 1, 1];
230
- } else {
231
-
230
+ } else {
231
+
232
232
  var segment = material.segment;
233
233
  var pn = segment.node,
234
234
  notEmpty = false;
235
-
235
+
236
236
  if (segment.passReady && !material.isLoading) {
237
- this.loadMaterial(material);
237
+ this.loadMaterial(material);
238
238
  }
239
239
 
240
240
  var mId = this._id;
241
241
  var psegm = material;
242
242
  while (pn.parentNode) {
243
243
  pn = pn.parentNode;
244
- psegm = pn.segment.materials[mId];
244
+ psegm = pn.segment.materials[mId];
245
245
  if (psegm && psegm.isReady) {
246
246
  notEmpty = true;
247
247
  break;
@@ -42,17 +42,179 @@ export class KML extends Vector {
42
42
  _extractCoordonatesFromKml(xmlDoc) {
43
43
  const raw = Array.from(xmlDoc.getElementsByTagName("coordinates"));
44
44
  const rawText = raw.map(item => item.textContent.trim());
45
- const coordinates = rawText.map(item =>
45
+ const coordinates = rawText.map(item =>
46
46
  item
47
- .replace(/\n/g, " ")
48
- .replace(/\t/g, " ")
49
- .replace(/ +/g," ")
50
- .split(" ")
51
- .map((co) => co.split(",").map(parseFloat))
47
+ .replace(/\n/g, " ")
48
+ .replace(/\t/g, " ")
49
+ .replace(/ +/g, " ")
50
+ .split(" ")
51
+ .map((co) => co.split(",").map(parseFloat))
52
52
  );
53
53
  return coordinates;
54
54
  }
55
55
 
56
+ /**
57
+ * @private
58
+ */
59
+ _AGBRtoRGBA(agbr) {
60
+ if (!agbr || agbr.length != 8) return
61
+
62
+ const a = parseInt(agbr.slice(0, 2), 16) / 255;
63
+ const b = parseInt(agbr.slice(2, 4), 16);
64
+ const g = parseInt(agbr.slice(4, 6), 16);
65
+ const r = parseInt(agbr.slice(6, 8), 16);
66
+
67
+ return `rgba(${r},${g},${b},${a})`;
68
+ }
69
+
70
+ /**
71
+ * @private
72
+ returns array of longitude, latitude, altitude (altitude optional)
73
+ */
74
+ _parseKMLcoordinates(coords) {
75
+ const coordinates = coords.innerHTML.trim()
76
+ .replace(/\n/g, ' ')
77
+ .replace(/\t/g, ' ')
78
+ .replace(/ +/g, ' ')
79
+ .split(" ")
80
+ .map((co) => co.split(",").map(parseFloat))
81
+
82
+ return coordinates;
83
+ }
84
+
85
+ /**
86
+ * @private
87
+ */
88
+ _kmlPlacemarkToEntity(placemark, extent) {
89
+ if (!placemark) return;
90
+
91
+ const nameTags = Array.from(placemark.getElementsByTagName("name"))
92
+ const name = nameTags && nameTags[0]?.innerHTML?.trim() || '';
93
+
94
+ const { iconHeading, iconURL, iconColor, lineWidth, lineColor } = this._extractStyle(placemark);
95
+
96
+ // TODO handle MultiGeometry
97
+
98
+ const lonLats = [];
99
+ for (const coord of placemark.getElementsByTagName("coordinates")) {
100
+ const coordinates = this._parseKMLcoordinates(coord) || [[0, 0, 0]]
101
+
102
+ for (const lonlatalt of coordinates) {
103
+ const [lon, lat, alt] = lonlatalt
104
+
105
+ lonLats.push(new LonLat(lon, lat, alt));
106
+
107
+ if (lon < extent.southWest.lon) extent.southWest.lon = lon;
108
+ if (lat < extent.southWest.lat) extent.southWest.lat = lat;
109
+ if (lon > extent.northEast.lon) extent.northEast.lon = lon;
110
+ if (lat > extent.northEast.lat) extent.northEast.lat = lat;
111
+ }
112
+ }
113
+
114
+ if (lonLats.length === 1) {
115
+ const hdgrad = iconHeading * 0.01745329; // radians
116
+
117
+ return new Entity({
118
+ name,
119
+ lonlat: lonLats[0],
120
+ billboard: {
121
+ src: iconURL,
122
+ size: [24, 24],
123
+ color: iconColor,
124
+ rotation: hdgrad
125
+ },
126
+ properties: {
127
+ color: iconColor,
128
+ heading: iconHeading
129
+ }
130
+ });
131
+
132
+ } else {
133
+ return new Entity({
134
+ polyline: {
135
+ pathLonLat: [lonLats],
136
+ thickness: lineWidth,
137
+ color: lineColor,
138
+ isClosed: false
139
+ }
140
+ });
141
+ }
142
+ }
143
+
144
+ _extractStyle(placemark) {
145
+ let iconColor;
146
+ let iconHeading;
147
+ let iconURL;
148
+ let lineColor;
149
+ let lineWidth;
150
+
151
+ const style = placemark.getElementsByTagName("Style")[0];
152
+ if (style) {
153
+ let iconstyle = style.getElementsByTagName("IconStyle")[0];
154
+ if (iconstyle) {
155
+ let color = iconstyle.getElementsByTagName("color")[0];
156
+ if (color)
157
+ iconColor = this._AGBRtoRGBA(color.innerHTML.trim());
158
+
159
+ let heading = iconstyle.getElementsByTagName("heading")[0];
160
+ if (heading) {
161
+ const hdg = parseFloat(heading.innerHTML.trim());
162
+ if (hdg >= 0 && hdg <= 360)
163
+ iconHeading = hdg % 360;
164
+ }
165
+
166
+ let icon = iconstyle.getElementsByTagName("Icon")[0];
167
+ if (icon) {
168
+ let href = icon.getElementsByTagName("href")[0];
169
+ if (href) {
170
+ iconURL = href.innerHTML.trim();
171
+ }
172
+ }
173
+ }
174
+
175
+ let linestyle = style.getElementsByTagName("LineStyle")[0];
176
+ if (linestyle) {
177
+ let color = linestyle.getElementsByTagName("color")[0];
178
+ if (color)
179
+ lineColor = this._AGBRtoRGBA(color.innerHTML.trim());
180
+ let width = linestyle.getElementsByTagName("width")[0];
181
+ if (width !== undefined)
182
+ lineWidth = parseFloat(width.innerHTML.trim());
183
+ }
184
+ }
185
+
186
+ if (!iconColor) iconColor = "#FFFFFF"
187
+ if (!iconHeading) iconHeading = 0
188
+ if (!iconURL) iconURL = "https://openglobus.org/examples/billboards/carrot.png"
189
+
190
+ if (!lineColor) lineColor = "#FFFFFF"
191
+ if (!lineWidth) lineWidth = 1
192
+
193
+ return { iconHeading, iconURL, iconColor, lineWidth, lineColor };
194
+ }
195
+
196
+ _parseKML(xml, extent, entities = undefined) {
197
+ if (!entities)
198
+ entities = [];
199
+
200
+ if (xml.documentElement.nodeName !== "kml")
201
+ return entities;
202
+
203
+ for (const placemark of xml.getElementsByTagName("Placemark")) {
204
+ const entity = this._kmlPlacemarkToEntity(placemark, extent);
205
+ if (entity) entities.push(entity);
206
+ }
207
+
208
+ return entities;
209
+ }
210
+
211
+ _convertKMLintoEntities(xml) {
212
+ const extent = new Extent(new LonLat(180.0, 90.0), new LonLat(-180.0, -90.0));
213
+ const entities = this._parseKML(xml, extent);
214
+
215
+ return { entities, extent }
216
+ }
217
+
56
218
  /**
57
219
  * Creates billboards or polylines from array of lonlat.
58
220
  * @public
@@ -129,6 +291,7 @@ export class KML extends Vector {
129
291
  * @returns {Promise<{entities: Entity[], extent: Extent}>}
130
292
  */
131
293
  async addKmlFromFiles(kmls, color = null, billboard = null) {
294
+ if (!Array.isArray(kmls)) return null
132
295
  const kmlObjs = await Promise.all(kmls.map(this._getXmlContent));
133
296
  const coordonates = kmlObjs.map(this._extractCoordonatesFromKml);
134
297
  const { entities, extent } = this._convertCoordonatesIntoEntities(
@@ -179,14 +342,20 @@ export class KML extends Vector {
179
342
  */
180
343
  async addKmlFromUrl(url, color = null, billboard = null) {
181
344
  const kml = await this._getKmlFromUrl(url);
182
- const coordonates = this._extractCoordonatesFromKml(kml);
183
- const { entities, extent } = this._convertCoordonatesIntoEntities(
184
- [coordonates],
185
- color || this._color,
186
- billboard || this._billboard
187
- );
345
+ /*
346
+ const coordonates = this._extractCoordonatesFromKml(kml);
347
+ const { entities, extent } = this._convertCoordonatesIntoEntities(
348
+ [coordonates],
349
+ color || this._color,
350
+ billboard || this._billboard
351
+ );
352
+ */
353
+ const { entities, extent } = this._convertKMLintoEntities(kml);
354
+
188
355
  this._extent = this._expandExtents(this._extent, extent);
356
+
189
357
  entities.forEach(this.add.bind(this));
358
+
190
359
  return { entities, extent };
191
360
  }
192
361
  }
@@ -413,8 +413,10 @@ class Layer {
413
413
  * @param {string} html - HTML code that represents layer attribution, it could be just a text.
414
414
  */
415
415
  setAttribution(html) {
416
- this._attribution = html;
417
- this._planet && this._planet.updateAttributionsList();
416
+ if (this._attribution !== html) {
417
+ this._attribution = html;
418
+ this._planet && this._planet.updateAttributionsList();
419
+ }
418
420
  }
419
421
 
420
422
  /**
@@ -162,6 +162,7 @@ class XYZ extends Layer {
162
162
 
163
163
  this._planet._tileLoader.load(
164
164
  {
165
+ sender: this,
165
166
  src: this._getHTTPRequestString(material.segment),
166
167
  type: "imageBitmap",
167
168
  filter: () =>
@@ -185,7 +186,8 @@ class XYZ extends Layer {
185
186
  material.textureNotExists();
186
187
  }
187
188
  }
188
- }
189
+ },
190
+ this._id
189
191
  );
190
192
  } else {
191
193
  material.textureNotExists();
@@ -303,7 +305,7 @@ class XYZ extends Layer {
303
305
  clearMaterial(material) {
304
306
  if (material.isReady && material.textureExists) {
305
307
  !material.texture.default &&
306
- material.segment.handler.gl.deleteTexture(material.texture);
308
+ material.segment.handler.gl.deleteTexture(material.texture);
307
309
  material.texture = null;
308
310
 
309
311
  if (material.image) {
@@ -404,6 +404,7 @@ class Node {
404
404
 
405
405
  if (!this.segment.terrainReady) {
406
406
  this.planet._renderCompleted = false;
407
+ this.planet._terrainCompleted = false;
407
408
  }
408
409
 
409
410
  let k = 0,
@@ -161,6 +161,8 @@ class RendererEvents extends Events {
161
161
  prev_x: 0,
162
162
  /** Previous touch Y coordinate. */
163
163
  prev_y: 0,
164
+ /** Screen touch position world direction. */
165
+ direction: new Vec3(),
164
166
  /** JavaScript touching system event message. */
165
167
  sys: null,
166
168
  /** Current touched(picking) object. */
@@ -222,6 +224,13 @@ class RendererEvents extends Events {
222
224
  this.mouseState.x,
223
225
  this.mouseState.y
224
226
  );
227
+ //
228
+ // TODO: Replace in some other place with a thought that we do
229
+ // not need to make unproject when we do not make touching
230
+ this.touchState.direction = this.renderer.activeCamera.unproject(
231
+ this.touchState.x,
232
+ this.touchState.y
233
+ );
225
234
  this.entityPickingEvents();
226
235
  this._keyboardHandler.handleEvents();
227
236
  this.handleMouseEvents();
@@ -493,7 +502,7 @@ class RendererEvents extends Events {
493
502
  var ts = this.touchState;
494
503
  ts.sys = event;
495
504
 
496
- ts.clienX = event.touches.item(0).clientX - event.offsetLeft;
505
+ ts.clientX = event.touches.item(0).clientX - event.offsetLeft;
497
506
  ts.clientY = event.touches.item(0).clientY - event.offsetTop;
498
507
 
499
508
  let h = this.renderer.handler;
@@ -569,8 +578,13 @@ class RendererEvents extends Events {
569
578
 
570
579
  ts.sys = event;
571
580
  ts.moving = true;
572
- // this._dblTchBegins = 0;
573
- // this._oneTouchStart = false;
581
+
582
+ var dX = ts.x - ts.prev_x
583
+ var dY = ts.y - ts.prev_y
584
+ if (Math.abs(dX) > 9 || Math.abs(dY) > 9) {
585
+ this._dblTchBegins = 0;
586
+ this._oneTouchStart = false;
587
+ }
574
588
  }
575
589
 
576
590
  /**