@realsee/dnalogel 2.0.0-alpha.4 → 2.0.0-alpha.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 (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +44 -5
  3. package/dist/dnalogel.cjs.js +7 -2
  4. package/dist/dnalogel.es.js +3668 -184
  5. package/dist/dnalogel.umd.js +7 -2
  6. package/dist/style.css +1 -1
  7. package/libs/CSS3DRenderPlugin/index.js +1 -1
  8. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.d.ts +1 -0
  9. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.js +1 -0
  10. package/libs/PanoCompassPlugin/getRoomInfoInstance.d.ts +8 -0
  11. package/libs/PanoCompassPlugin/getRoomInfoInstance.js +48 -0
  12. package/libs/PanoCompassPlugin/index.d.ts +29 -3
  13. package/libs/PanoCompassPlugin/index.js +126 -44
  14. package/libs/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
  15. package/libs/PanoMeasurePlugin/Controller/BaseController.js +69 -0
  16. package/libs/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
  17. package/libs/PanoMeasurePlugin/Controller/EditController.js +216 -0
  18. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
  19. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.js +44 -0
  20. package/libs/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
  21. package/libs/PanoMeasurePlugin/Controller/WatchController.js +223 -0
  22. package/libs/PanoMeasurePlugin/Controller/index.d.ts +61 -0
  23. package/libs/PanoMeasurePlugin/Controller/index.js +176 -0
  24. package/libs/PanoMeasurePlugin/Model/index.d.ts +38 -0
  25. package/libs/PanoMeasurePlugin/Model/index.js +114 -0
  26. package/libs/PanoMeasurePlugin/Model/line.d.ts +30 -0
  27. package/libs/PanoMeasurePlugin/Model/line.js +64 -0
  28. package/libs/PanoMeasurePlugin/Model/point.d.ts +16 -0
  29. package/libs/PanoMeasurePlugin/Model/point.js +28 -0
  30. package/libs/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
  31. package/libs/PanoMeasurePlugin/Model/polyline.js +48 -0
  32. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
  33. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.js +15 -0
  34. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
  35. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.js +2 -0
  36. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
  37. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.js +2 -0
  38. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
  39. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.js +108 -0
  40. package/libs/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
  41. package/libs/PanoMeasurePlugin/Modules/FiveHelper.js +33 -0
  42. package/libs/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
  43. package/libs/PanoMeasurePlugin/Modules/GuideController.js +75 -0
  44. package/libs/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
  45. package/libs/PanoMeasurePlugin/Modules/Magnifier.js +103 -0
  46. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
  47. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.js +117 -0
  48. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
  49. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.js +102 -0
  50. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
  51. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.js +35 -0
  52. package/libs/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
  53. package/libs/PanoMeasurePlugin/Modules/UIController/index.js +69 -0
  54. package/libs/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
  55. package/libs/PanoMeasurePlugin/Modules/UIController/style.js +78 -0
  56. package/libs/PanoMeasurePlugin/index.d.ts +7 -0
  57. package/libs/PanoMeasurePlugin/index.js +5 -0
  58. package/libs/PanoMeasurePlugin/typings/data.d.ts +28 -0
  59. package/libs/PanoMeasurePlugin/typings/data.js +1 -0
  60. package/libs/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
  61. package/libs/PanoMeasurePlugin/typings/event.type.js +1 -0
  62. package/libs/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
  63. package/libs/PanoMeasurePlugin/typings/utils.type.js +1 -0
  64. package/libs/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
  65. package/libs/PanoMeasurePlugin/utils/clearGroup.js +3 -0
  66. package/libs/PanoMeasurePlugin/utils/constants.d.ts +4 -0
  67. package/libs/PanoMeasurePlugin/utils/constants.js +31 -0
  68. package/libs/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
  69. package/libs/PanoMeasurePlugin/utils/distanceDom.js +114 -0
  70. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
  71. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.js +21 -0
  72. package/libs/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
  73. package/libs/PanoMeasurePlugin/utils/findClosestPoint.js +27 -0
  74. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
  75. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.js +9 -0
  76. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
  77. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.js +14 -0
  78. package/libs/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
  79. package/libs/PanoMeasurePlugin/utils/ironbox.js +1 -0
  80. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
  81. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.js +6 -0
  82. package/libs/PanoMeasurePlugin/utils/line.d.ts +17 -0
  83. package/libs/PanoMeasurePlugin/utils/line.js +32 -0
  84. package/libs/PanoMeasurePlugin/utils/math.d.ts +17 -0
  85. package/libs/PanoMeasurePlugin/utils/math.js +44 -0
  86. package/libs/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
  87. package/libs/PanoMeasurePlugin/utils/mouseGroup.js +21 -0
  88. package/libs/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
  89. package/libs/PanoMeasurePlugin/utils/ndc2Screen.js +6 -0
  90. package/libs/PanoRulerPlugin/index.js +1 -0
  91. package/libs/PanoRulerPlugin/style.d.ts +1 -1
  92. package/libs/PanoRulerPlugin/style.js +1 -0
  93. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte +3 -3
  94. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte.map +1 -1
  95. package/libs/floorplan/ModelFloorplanPlugin/Controller.d.ts +2 -0
  96. package/libs/floorplan/ModelFloorplanPlugin/Controller.js +3 -1
  97. package/libs/floorplan/TopviewFloorplanPlugin/Controller.d.ts +2 -0
  98. package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +4 -3
  99. package/libs/floorplan/constant.d.ts +5 -0
  100. package/libs/floorplan/constant.js +6 -0
  101. package/libs/floorplan/typings/floorplanServerData.d.ts +4 -0
  102. package/libs/index.d.ts +4 -1
  103. package/libs/index.js +4 -1
  104. package/libs/shared-utils/getPxmm.d.ts +6 -1
  105. package/libs/shared-utils/getPxmm.js +26 -12
  106. package/package.json +2 -1
@@ -22,9 +22,9 @@ var __publicField = (obj, key, value) => {
22
22
  return value;
23
23
  };
24
24
  import * as THREE from "three";
25
- import { Vector3 as Vector3$1, Scene as Scene$1, Group as Group$2, Raycaster as Raycaster$1, Vector2 as Vector2$1, MeshBasicMaterial as MeshBasicMaterial$1, CanvasTexture as CanvasTexture$1, AnimationMixer as AnimationMixer$1 } from "three";
25
+ import { Vector3 as Vector3$1, Scene as Scene$1, Group as Group$2, Raycaster as Raycaster$1, Vector2 as Vector2$1, MeshBasicMaterial as MeshBasicMaterial$1, CanvasTexture as CanvasTexture$1, AnimationMixer as AnimationMixer$1, Color as Color$1, TextureLoader as TextureLoader$1, PlaneGeometry as PlaneGeometry$1, sRGBEncoding as sRGBEncoding$1, Mesh as Mesh$1, CurvePath as CurvePath$1, LineCurve3 as LineCurve3$1, TubeGeometry as TubeGeometry$1, DoubleSide as DoubleSide$1, SphereGeometry as SphereGeometry$1 } from "three";
26
26
  import { CSS3DRenderer, CSS3DObject } from "three/examples/jsm/renderers/CSS3DRenderer";
27
- import { Line as Line$1 } from "@realsee/five/line";
27
+ import { Line as Line$2 } from "@realsee/five/line";
28
28
  import { Five, Subscribe } from "@realsee/five";
29
29
  const ModelViewPlugin = (five) => {
30
30
  let needsRender = true;
@@ -317,7 +317,7 @@ const CSS3DRenderPlugin = (five) => {
317
317
  const rotateXAngle = new Vector3$1(0, 1, 0).angleTo(new Vector3$1(0, vector12.y, vector12.z));
318
318
  const rotateYAngle = new Vector3$1(1, 0, 0).angleTo(new Vector3$1(vector01.x, 0, vector01.z));
319
319
  const rotateZAngle = vector01.angleTo(new Vector3$1(vector01.x, 0, vector01.z));
320
- const rotateX = (vector12.z > 0 ? 1 : -1) * rotateXAngle;
320
+ const rotateX = (vector12.z > 0 ? -1 : 1) * rotateXAngle;
321
321
  const rotateY = (vector01.z < 0 ? 1 : -1) * rotateYAngle;
322
322
  const rotateZ = (vector01.x > 0 && vector01.y < 0 || vector01.x < 0 && vector01.y > 0 ? -1 : 1) * rotateZAngle;
323
323
  css3DObject.rotateOnWorldAxis(new Vector3$1(1, 0, 0), rotateX);
@@ -349,7 +349,7 @@ const CSS3DRenderPlugin = (five) => {
349
349
  };
350
350
  };
351
351
  function createLine(point1, point2, color = new Vector3$1(1, 1, 1), dashed = false) {
352
- const line = new Line$1(point1, point2);
352
+ const line = new Line$2(point1, point2);
353
353
  line.setMaterial({ dashed, color, linewidth: 1 });
354
354
  line.remove(line.points);
355
355
  return line;
@@ -1476,6 +1476,12 @@ class ModelRoomLabelController {
1476
1476
  const ModelRoomLabelPlugin = (five) => {
1477
1477
  return new ModelRoomLabelController(five);
1478
1478
  };
1479
+ var FLOOR_PLAN_ATTACHED_TO = /* @__PURE__ */ ((FLOOR_PLAN_ATTACHED_TO2) => {
1480
+ FLOOR_PLAN_ATTACHED_TO2[FLOOR_PLAN_ATTACHED_TO2["FLOOR"] = 1] = "FLOOR";
1481
+ FLOOR_PLAN_ATTACHED_TO2[FLOOR_PLAN_ATTACHED_TO2["CEILING"] = 2] = "CEILING";
1482
+ FLOOR_PLAN_ATTACHED_TO2[FLOOR_PLAN_ATTACHED_TO2["BOUNDING_CENTER"] = 3] = "BOUNDING_CENTER";
1483
+ return FLOOR_PLAN_ATTACHED_TO2;
1484
+ })(FLOOR_PLAN_ATTACHED_TO || {});
1479
1485
  const pluginStyle = {
1480
1486
  position: "absolute",
1481
1487
  left: "50%",
@@ -1634,16 +1640,27 @@ function omit(object, props) {
1634
1640
  }
1635
1641
  });
1636
1642
  }
1637
- function getPxmm(five, container) {
1638
- const boundingCenter = new THREE.Vector3(0, 0, 0);
1639
- five.model.bounding.getCenter(boundingCenter);
1640
- const { y: boundingCenterY } = boundingCenter;
1641
- const { longitude } = five.getCurrentState();
1642
- const X2 = 1 / Math.abs(Math.cos(longitude));
1643
- const originPosition = new THREE.Vector3(0, boundingCenterY, 0);
1644
- const originPositionXUnit = new THREE.Vector3(X2, boundingCenterY, 0);
1645
- const mouse = originPosition.project(five.camera);
1646
- const xUnitMouse = originPositionXUnit.project(five.camera);
1643
+ function getPxmm(five, container, floorIndex, options) {
1644
+ const maxFloorIndex = Math.max(...five.work.observers.map((ob) => ob.floorIndex));
1645
+ function getFloorY(floorIndex2) {
1646
+ return floorIndex2 > maxFloorIndex ? five.model.bounding.max.y : Math.max(...five.work.observers.filter((ob) => ob.floorIndex === floorIndex2).map((ob) => ob.standingPosition.y));
1647
+ }
1648
+ function getY() {
1649
+ const currentFloorY = getFloorY(floorIndex);
1650
+ const nextFloorY = getFloorY(floorIndex + 1);
1651
+ const attachedTo = (options == null ? void 0 : options.attachedTo) || FLOOR_PLAN_ATTACHED_TO.BOUNDING_CENTER;
1652
+ if (attachedTo === FLOOR_PLAN_ATTACHED_TO.BOUNDING_CENTER)
1653
+ return (five.model.bounding.max.y + five.model.bounding.min.y) / 2;
1654
+ else if (attachedTo === FLOOR_PLAN_ATTACHED_TO.CEILING)
1655
+ return nextFloorY;
1656
+ else
1657
+ return currentFloorY;
1658
+ }
1659
+ const y2 = getY();
1660
+ const originPosition = new THREE.Vector3(0, y2, 0);
1661
+ const originPositionXUnit = new THREE.Vector3(1, y2, 0);
1662
+ const mouse = originPosition.clone().project(five.camera);
1663
+ const xUnitMouse = originPositionXUnit.clone().project(five.camera);
1647
1664
  const pxmm = Math.abs((xUnitMouse.x - mouse.x) / 1e3) * (container.getBoundingClientRect().width / 2);
1648
1665
  return pxmm;
1649
1666
  }
@@ -1659,12 +1676,15 @@ function create_fragment$k(ctx) {
1659
1676
  c() {
1660
1677
  div1 = element("div");
1661
1678
  div0 = element("div");
1662
- attr(div0, "class", "floorplan__camera-rotate svelte-1kosz2p");
1679
+ attr(div0, "class", "floorplan__camera-rotate svelte-e8a2kn");
1663
1680
  set_style(div0, "background-image", `url(${ctx[0] || CAMERA_IMAGE})`);
1664
1681
  set_style(div0, "width", ctx[4], false);
1665
1682
  set_style(div0, "height", ctx[4], false);
1683
+ set_style(div0, "left", "-" + ctx[4], false);
1684
+ set_style(div0, "top", "-" + ctx[4], false);
1666
1685
  set_style(div0, "transform", `rotate(${ctx[3]}deg)`, false);
1667
- attr(div1, "class", "floorplan__camera-position svelte-1kosz2p");
1686
+ set_style(div0, "transform-origin", `${ctx[4]} ${ctx[4]}`, false);
1687
+ attr(div1, "class", "floorplan__camera-position svelte-e8a2kn");
1668
1688
  set_style(div1, "left", ctx[1], false);
1669
1689
  set_style(div1, "top", ctx[2], false);
1670
1690
  },
@@ -3213,7 +3233,7 @@ function create_if_block$4(ctx) {
3213
3233
  };
3214
3234
  }
3215
3235
  function create_each_block$2(ctx) {
3216
- let svg;
3236
+ let svg2;
3217
3237
  let current_block_type_index;
3218
3238
  let if_block;
3219
3239
  let current;
@@ -3230,13 +3250,13 @@ function create_each_block$2(ctx) {
3230
3250
  if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
3231
3251
  return {
3232
3252
  c() {
3233
- svg = svg_element("svg");
3253
+ svg2 = svg_element("svg");
3234
3254
  if_block.c();
3235
- attr(svg, "class", "svelte-1b0icjc");
3255
+ attr(svg2, "class", "svelte-1b0icjc");
3236
3256
  },
3237
3257
  m(target, anchor) {
3238
- insert(target, svg, anchor);
3239
- if_blocks[current_block_type_index].m(svg, null);
3258
+ insert(target, svg2, anchor);
3259
+ if_blocks[current_block_type_index].m(svg2, null);
3240
3260
  current = true;
3241
3261
  },
3242
3262
  p(ctx2, dirty) {
@@ -3258,7 +3278,7 @@ function create_each_block$2(ctx) {
3258
3278
  if_block.p(ctx2, dirty);
3259
3279
  }
3260
3280
  transition_in(if_block, 1);
3261
- if_block.m(svg, null);
3281
+ if_block.m(svg2, null);
3262
3282
  }
3263
3283
  },
3264
3284
  i(local) {
@@ -3273,7 +3293,7 @@ function create_each_block$2(ctx) {
3273
3293
  },
3274
3294
  d(detaching) {
3275
3295
  if (detaching)
3276
- detach(svg);
3296
+ detach(svg2);
3277
3297
  if_blocks[current_block_type_index].d();
3278
3298
  }
3279
3299
  };
@@ -3489,7 +3509,7 @@ function create_each_block$1(key_1, ctx) {
3489
3509
  }
3490
3510
  function create_fragment$6(ctx) {
3491
3511
  let div;
3492
- let svg;
3512
+ let svg2;
3493
3513
  let each_blocks = [];
3494
3514
  let each_1_lookup = /* @__PURE__ */ new Map();
3495
3515
  let div_resize_listener;
@@ -3506,19 +3526,19 @@ function create_fragment$6(ctx) {
3506
3526
  return {
3507
3527
  c() {
3508
3528
  div = element("div");
3509
- svg = svg_element("svg");
3529
+ svg2 = svg_element("svg");
3510
3530
  for (let i = 0; i < each_blocks.length; i += 1) {
3511
3531
  each_blocks[i].c();
3512
3532
  }
3513
- attr(svg, "class", "svelte-1aais5l");
3533
+ attr(svg2, "class", "svelte-1aais5l");
3514
3534
  attr(div, "class", "floorplan-plugin__room-highlight svelte-1aais5l");
3515
3535
  add_render_callback(() => ctx[10].call(div));
3516
3536
  },
3517
3537
  m(target, anchor) {
3518
3538
  insert(target, div, anchor);
3519
- append(div, svg);
3539
+ append(div, svg2);
3520
3540
  for (let i = 0; i < each_blocks.length; i += 1) {
3521
- each_blocks[i].m(svg, null);
3541
+ each_blocks[i].m(svg2, null);
3522
3542
  }
3523
3543
  ctx[9](div);
3524
3544
  div_resize_listener = add_resize_listener(div, ctx[10].bind(div));
@@ -3532,7 +3552,7 @@ function create_fragment$6(ctx) {
3532
3552
  if (dirty & 7) {
3533
3553
  each_value = ctx2[2].floorDatas[ctx2[1]].rooms;
3534
3554
  group_outros();
3535
- each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx2, each_value, each_1_lookup, svg, outro_and_destroy_block, create_each_block$1, null, get_each_context$1);
3555
+ each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx2, each_value, each_1_lookup, svg2, outro_and_destroy_block, create_each_block$1, null, get_each_context$1);
3536
3556
  check_outros();
3537
3557
  }
3538
3558
  },
@@ -4384,6 +4404,7 @@ class TopviewFloorplanPluginController {
4384
4404
  if (shownFloor === null)
4385
4405
  return;
4386
4406
  this.floorIndex = shownFloor;
4407
+ this.updateSize();
4387
4408
  this.render();
4388
4409
  });
4389
4410
  __publicField(this, "handlePanoArrived", (index) => {
@@ -4435,7 +4456,8 @@ class TopviewFloorplanPluginController {
4435
4456
  const { min, max } = this.floorplanData.bounding;
4436
4457
  const width = max.x - min.x;
4437
4458
  const height = max.y - min.y;
4438
- const pxmm = getPxmm(this.five, this.wrapper);
4459
+ const options = this.configs.attachedTo ? { attachedTo: this.configs.attachedTo } : void 0;
4460
+ const pxmm = getPxmm(this.five, this.wrapper, this.floorIndex, options);
4439
4461
  const _width = Math.ceil(width * pxmm);
4440
4462
  const _height = Math.ceil(height * pxmm);
4441
4463
  this.pxmm = pxmm;
@@ -4467,8 +4489,8 @@ class TopviewFloorplanPluginController {
4467
4489
  }
4468
4490
  show() {
4469
4491
  this.visible = true;
4470
- this.updateSize();
4471
4492
  this.five.model.show(this.floorIndex);
4493
+ this.updateSize();
4472
4494
  const renderDuration = 500;
4473
4495
  const modelOpacity = this.configs.modelOpacity;
4474
4496
  if (typeof modelOpacity === "number") {
@@ -4502,7 +4524,6 @@ class TopviewFloorplanPluginController {
4502
4524
  ruleLabelsEnable
4503
4525
  } = this.configs;
4504
4526
  const handleClick = preventRoomClick ? () => false : void 0;
4505
- console.log("\u{1F680} ~ TopviewFloorplanPluginController ~ handleClick", handleClick);
4506
4527
  const props = {
4507
4528
  five: this.five,
4508
4529
  pxmm: this.pxmm,
@@ -5482,7 +5503,8 @@ class ModelFloorplanPluginController {
5482
5503
  const { min, max } = this.floorplanData.bounding;
5483
5504
  const width = max.x - min.x;
5484
5505
  const height = max.y - min.y;
5485
- const pxmm = getPxmm(this.five, this.wrapper);
5506
+ const options = this.configs.attachedTo ? { attachedTo: this.configs.attachedTo } : void 0;
5507
+ const pxmm = getPxmm(this.five, this.wrapper, this.floorIndex, options);
5486
5508
  const _width = Math.ceil(width * pxmm);
5487
5509
  const _height = Math.ceil(height * pxmm);
5488
5510
  if (this.size.width === _width && this.size.height === _height)
@@ -5574,6 +5596,7 @@ class ModelFloorplanPluginController {
5574
5596
  if (shownFloor === null)
5575
5597
  return;
5576
5598
  this.floorIndex = shownFloor;
5599
+ this.updateSize();
5577
5600
  this.render();
5578
5601
  });
5579
5602
  __publicField(this, "handleModelLoaded", () => {
@@ -5993,8 +6016,8 @@ var MathUtils = {
5993
6016
  var d1 = Math.random() * 4294967295 | 0;
5994
6017
  var d2 = Math.random() * 4294967295 | 0;
5995
6018
  var d3 = Math.random() * 4294967295 | 0;
5996
- var uuid = _lut[d0 & 255] + _lut[d0 >> 8 & 255] + _lut[d0 >> 16 & 255] + _lut[d0 >> 24 & 255] + "-" + _lut[d1 & 255] + _lut[d1 >> 8 & 255] + "-" + _lut[d1 >> 16 & 15 | 64] + _lut[d1 >> 24 & 255] + "-" + _lut[d2 & 63 | 128] + _lut[d2 >> 8 & 255] + "-" + _lut[d2 >> 16 & 255] + _lut[d2 >> 24 & 255] + _lut[d3 & 255] + _lut[d3 >> 8 & 255] + _lut[d3 >> 16 & 255] + _lut[d3 >> 24 & 255];
5997
- return uuid.toUpperCase();
6019
+ var uuid2 = _lut[d0 & 255] + _lut[d0 >> 8 & 255] + _lut[d0 >> 16 & 255] + _lut[d0 >> 24 & 255] + "-" + _lut[d1 & 255] + _lut[d1 >> 8 & 255] + "-" + _lut[d1 >> 16 & 15 | 64] + _lut[d1 >> 24 & 255] + "-" + _lut[d2 & 63 | 128] + _lut[d2 >> 8 & 255] + "-" + _lut[d2 >> 16 & 255] + _lut[d2 >> 24 & 255] + _lut[d3 & 255] + _lut[d3 >> 8 & 255] + _lut[d3 >> 16 & 255] + _lut[d3 >> 24 & 255];
6020
+ return uuid2.toUpperCase();
5998
6021
  },
5999
6022
  clamp: function(value, min, max) {
6000
6023
  return Math.max(min, Math.min(max, value));
@@ -6591,22 +6614,22 @@ Object.assign(Matrix3.prototype, {
6591
6614
  });
6592
6615
  var _canvas;
6593
6616
  var ImageUtils = {
6594
- getDataURL: function(image) {
6617
+ getDataURL: function(image2) {
6595
6618
  var canvas;
6596
6619
  if (typeof HTMLCanvasElement == "undefined") {
6597
- return image.src;
6598
- } else if (image instanceof HTMLCanvasElement) {
6599
- canvas = image;
6620
+ return image2.src;
6621
+ } else if (image2 instanceof HTMLCanvasElement) {
6622
+ canvas = image2;
6600
6623
  } else {
6601
6624
  if (_canvas === void 0)
6602
6625
  _canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
6603
- _canvas.width = image.width;
6604
- _canvas.height = image.height;
6626
+ _canvas.width = image2.width;
6627
+ _canvas.height = image2.height;
6605
6628
  var context = _canvas.getContext("2d");
6606
- if (image instanceof ImageData) {
6607
- context.putImageData(image, 0, 0);
6629
+ if (image2 instanceof ImageData) {
6630
+ context.putImageData(image2, 0, 0);
6608
6631
  } else {
6609
- context.drawImage(image, 0, 0, image.width, image.height);
6632
+ context.drawImage(image2, 0, 0, image2.width, image2.height);
6610
6633
  }
6611
6634
  canvas = _canvas;
6612
6635
  }
@@ -6618,11 +6641,11 @@ var ImageUtils = {
6618
6641
  }
6619
6642
  };
6620
6643
  var textureId = 0;
6621
- function Texture(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
6644
+ function Texture(image2, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
6622
6645
  Object.defineProperty(this, "id", { value: textureId++ });
6623
6646
  this.uuid = MathUtils.generateUUID();
6624
6647
  this.name = "";
6625
- this.image = image !== void 0 ? image : Texture.DEFAULT_IMAGE;
6648
+ this.image = image2 !== void 0 ? image2 : Texture.DEFAULT_IMAGE;
6626
6649
  this.mipmaps = [];
6627
6650
  this.mapping = mapping !== void 0 ? mapping : Texture.DEFAULT_MAPPING;
6628
6651
  this.wrapS = wrapS !== void 0 ? wrapS : ClampToEdgeWrapping;
@@ -6714,26 +6737,26 @@ Texture.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
6714
6737
  unpackAlignment: this.unpackAlignment
6715
6738
  };
6716
6739
  if (this.image !== void 0) {
6717
- var image = this.image;
6718
- if (image.uuid === void 0) {
6719
- image.uuid = MathUtils.generateUUID();
6740
+ var image2 = this.image;
6741
+ if (image2.uuid === void 0) {
6742
+ image2.uuid = MathUtils.generateUUID();
6720
6743
  }
6721
- if (!isRootObject && meta.images[image.uuid] === void 0) {
6744
+ if (!isRootObject && meta.images[image2.uuid] === void 0) {
6722
6745
  var url;
6723
- if (Array.isArray(image)) {
6746
+ if (Array.isArray(image2)) {
6724
6747
  url = [];
6725
- for (var i = 0, l2 = image.length; i < l2; i++) {
6726
- url.push(ImageUtils.getDataURL(image[i]));
6748
+ for (var i = 0, l2 = image2.length; i < l2; i++) {
6749
+ url.push(ImageUtils.getDataURL(image2[i]));
6727
6750
  }
6728
6751
  } else {
6729
- url = ImageUtils.getDataURL(image);
6752
+ url = ImageUtils.getDataURL(image2);
6730
6753
  }
6731
- meta.images[image.uuid] = {
6732
- uuid: image.uuid,
6754
+ meta.images[image2.uuid] = {
6755
+ uuid: image2.uuid,
6733
6756
  url
6734
6757
  };
6735
6758
  }
6736
- output.image = image.uuid;
6759
+ output.image = image2.uuid;
6737
6760
  }
6738
6761
  if (!isRootObject) {
6739
6762
  meta.textures[this.uuid] = output;
@@ -18006,36 +18029,36 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18006
18029
  function createCanvas(width, height) {
18007
18030
  return useOffscreenCanvas ? new OffscreenCanvas(width, height) : document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
18008
18031
  }
18009
- function resizeImage(image, needsPowerOfTwo, needsNewCanvas, maxSize) {
18032
+ function resizeImage(image2, needsPowerOfTwo, needsNewCanvas, maxSize) {
18010
18033
  var scale = 1;
18011
- if (image.width > maxSize || image.height > maxSize) {
18012
- scale = maxSize / Math.max(image.width, image.height);
18034
+ if (image2.width > maxSize || image2.height > maxSize) {
18035
+ scale = maxSize / Math.max(image2.width, image2.height);
18013
18036
  }
18014
18037
  if (scale < 1 || needsPowerOfTwo === true) {
18015
- if (typeof HTMLImageElement !== "undefined" && image instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) {
18038
+ if (typeof HTMLImageElement !== "undefined" && image2 instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image2 instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image2 instanceof ImageBitmap) {
18016
18039
  var floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;
18017
- var width = floor(scale * image.width);
18018
- var height = floor(scale * image.height);
18040
+ var width = floor(scale * image2.width);
18041
+ var height = floor(scale * image2.height);
18019
18042
  if (_canvas2 === void 0)
18020
18043
  _canvas2 = createCanvas(width, height);
18021
18044
  var canvas = needsNewCanvas ? createCanvas(width, height) : _canvas2;
18022
18045
  canvas.width = width;
18023
18046
  canvas.height = height;
18024
18047
  var context = canvas.getContext("2d");
18025
- context.drawImage(image, 0, 0, width, height);
18026
- console.warn("THREE.WebGLRenderer: Texture has been resized from (" + image.width + "x" + image.height + ") to (" + width + "x" + height + ").");
18048
+ context.drawImage(image2, 0, 0, width, height);
18049
+ console.warn("THREE.WebGLRenderer: Texture has been resized from (" + image2.width + "x" + image2.height + ") to (" + width + "x" + height + ").");
18027
18050
  return canvas;
18028
18051
  } else {
18029
- if ("data" in image) {
18030
- console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + image.width + "x" + image.height + ").");
18052
+ if ("data" in image2) {
18053
+ console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + image2.width + "x" + image2.height + ").");
18031
18054
  }
18032
- return image;
18055
+ return image2;
18033
18056
  }
18034
18057
  }
18035
- return image;
18058
+ return image2;
18036
18059
  }
18037
- function isPowerOfTwo(image) {
18038
- return MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height);
18060
+ function isPowerOfTwo(image2) {
18061
+ return MathUtils.isPowerOfTwo(image2.width) && MathUtils.isPowerOfTwo(image2.height);
18039
18062
  }
18040
18063
  function textureNeedsPowerOfTwo(texture) {
18041
18064
  if (isWebGL2)
@@ -18164,10 +18187,10 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18164
18187
  if (texture.isVideoTexture)
18165
18188
  updateVideoTexture(texture);
18166
18189
  if (texture.version > 0 && textureProperties.__version !== texture.version) {
18167
- var image = texture.image;
18168
- if (image === void 0) {
18190
+ var image2 = texture.image;
18191
+ if (image2 === void 0) {
18169
18192
  console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");
18170
- } else if (image.complete === false) {
18193
+ } else if (image2.complete === false) {
18171
18194
  console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");
18172
18195
  } else {
18173
18196
  uploadTexture(textureProperties, texture, slot);
@@ -18214,7 +18237,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18214
18237
  cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i];
18215
18238
  }
18216
18239
  }
18217
- var image = cubeImage[0], supportsMips = isPowerOfTwo(image) || isWebGL2, glFormat = utils.convert(texture.format), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType);
18240
+ var image2 = cubeImage[0], supportsMips = isPowerOfTwo(image2) || isWebGL2, glFormat = utils.convert(texture.format), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType);
18218
18241
  setTextureParameters(34067, texture, supportsMips);
18219
18242
  var mipmaps;
18220
18243
  if (isCompressed) {
@@ -18255,7 +18278,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18255
18278
  textureProperties.__maxMipLevel = mipmaps.length;
18256
18279
  }
18257
18280
  if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
18258
- generateMipmap(34067, texture, image.width, image.height);
18281
+ generateMipmap(34067, texture, image2.width, image2.height);
18259
18282
  }
18260
18283
  textureProperties.__version = texture.version;
18261
18284
  if (texture.onUpdate)
@@ -18339,8 +18362,8 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18339
18362
  _gl.pixelStorei(37441, texture.premultiplyAlpha);
18340
18363
  _gl.pixelStorei(3317, texture.unpackAlignment);
18341
18364
  var needsPowerOfTwo = textureNeedsPowerOfTwo(texture) && isPowerOfTwo(texture.image) === false;
18342
- var image = resizeImage(texture.image, needsPowerOfTwo, false, maxTextureSize);
18343
- var supportsMips = isPowerOfTwo(image) || isWebGL2, glFormat = utils.convert(texture.format), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType);
18365
+ var image2 = resizeImage(texture.image, needsPowerOfTwo, false, maxTextureSize);
18366
+ var supportsMips = isPowerOfTwo(image2) || isWebGL2, glFormat = utils.convert(texture.format), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType);
18344
18367
  setTextureParameters(textureType, texture, supportsMips);
18345
18368
  var mipmap, mipmaps = texture.mipmaps;
18346
18369
  if (texture.isDepthTexture) {
@@ -18375,7 +18398,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18375
18398
  glType = utils.convert(texture.type);
18376
18399
  }
18377
18400
  }
18378
- state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null);
18401
+ state.texImage2D(3553, 0, glInternalFormat, image2.width, image2.height, 0, glFormat, glType, null);
18379
18402
  } else if (texture.isDataTexture) {
18380
18403
  if (mipmaps.length > 0 && supportsMips) {
18381
18404
  for (var i = 0, il = mipmaps.length; i < il; i++) {
@@ -18385,7 +18408,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18385
18408
  texture.generateMipmaps = false;
18386
18409
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18387
18410
  } else {
18388
- state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data);
18411
+ state.texImage2D(3553, 0, glInternalFormat, image2.width, image2.height, 0, glFormat, glType, image2.data);
18389
18412
  textureProperties.__maxMipLevel = 0;
18390
18413
  }
18391
18414
  } else if (texture.isCompressedTexture) {
@@ -18403,10 +18426,10 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18403
18426
  }
18404
18427
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18405
18428
  } else if (texture.isDataTexture2DArray) {
18406
- state.texImage3D(35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data);
18429
+ state.texImage3D(35866, 0, glInternalFormat, image2.width, image2.height, image2.depth, 0, glFormat, glType, image2.data);
18407
18430
  textureProperties.__maxMipLevel = 0;
18408
18431
  } else if (texture.isDataTexture3D) {
18409
- state.texImage3D(32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data);
18432
+ state.texImage3D(32879, 0, glInternalFormat, image2.width, image2.height, image2.depth, 0, glFormat, glType, image2.data);
18410
18433
  textureProperties.__maxMipLevel = 0;
18411
18434
  } else {
18412
18435
  if (mipmaps.length > 0 && supportsMips) {
@@ -18417,12 +18440,12 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18417
18440
  texture.generateMipmaps = false;
18418
18441
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18419
18442
  } else {
18420
- state.texImage2D(3553, 0, glInternalFormat, glFormat, glType, image);
18443
+ state.texImage2D(3553, 0, glInternalFormat, glFormat, glType, image2);
18421
18444
  textureProperties.__maxMipLevel = 0;
18422
18445
  }
18423
18446
  }
18424
18447
  if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
18425
- generateMipmap(textureType, texture, image.width, image.height);
18448
+ generateMipmap(textureType, texture, image2.width, image2.height);
18426
18449
  }
18427
18450
  textureProperties.__version = texture.version;
18428
18451
  if (texture.onUpdate)
@@ -19891,10 +19914,10 @@ function WebGLRenderer(parameters) {
19891
19914
  renderer.setMode(4);
19892
19915
  }
19893
19916
  } else if (object.isLine) {
19894
- var lineWidth = material.linewidth;
19895
- if (lineWidth === void 0)
19896
- lineWidth = 1;
19897
- state.setLineWidth(lineWidth * getTargetPixelRatio());
19917
+ var lineWidth2 = material.linewidth;
19918
+ if (lineWidth2 === void 0)
19919
+ lineWidth2 = 1;
19920
+ state.setLineWidth(lineWidth2 * getTargetPixelRatio());
19898
19921
  if (object.isLineSegments) {
19899
19922
  renderer.setMode(1);
19900
19923
  } else if (object.isLineLoop) {
@@ -21270,7 +21293,7 @@ var _end = new Vector3();
21270
21293
  var _inverseMatrix$1 = new Matrix4();
21271
21294
  var _ray$1 = new Ray();
21272
21295
  var _sphere$2 = new Sphere();
21273
- function Line(geometry, material, mode) {
21296
+ function Line$1(geometry, material, mode) {
21274
21297
  if (mode === 1) {
21275
21298
  console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");
21276
21299
  }
@@ -21280,8 +21303,8 @@ function Line(geometry, material, mode) {
21280
21303
  this.material = material !== void 0 ? material : new LineBasicMaterial();
21281
21304
  this.updateMorphTargets();
21282
21305
  }
21283
- Line.prototype = Object.assign(Object.create(Object3D.prototype), {
21284
- constructor: Line,
21306
+ Line$1.prototype = Object.assign(Object.create(Object3D.prototype), {
21307
+ constructor: Line$1,
21285
21308
  isLine: true,
21286
21309
  computeLineDistances: function() {
21287
21310
  var geometry = this.geometry;
@@ -21432,10 +21455,10 @@ Line.prototype = Object.assign(Object.create(Object3D.prototype), {
21432
21455
  var _start$1 = new Vector3();
21433
21456
  var _end$1 = new Vector3();
21434
21457
  function LineSegments(geometry, material) {
21435
- Line.call(this, geometry, material);
21458
+ Line$1.call(this, geometry, material);
21436
21459
  this.type = "LineSegments";
21437
21460
  }
21438
- LineSegments.prototype = Object.assign(Object.create(Line.prototype), {
21461
+ LineSegments.prototype = Object.assign(Object.create(Line$1.prototype), {
21439
21462
  constructor: LineSegments,
21440
21463
  isLineSegments: true,
21441
21464
  computeLineDistances: function() {
@@ -21468,10 +21491,10 @@ LineSegments.prototype = Object.assign(Object.create(Line.prototype), {
21468
21491
  }
21469
21492
  });
21470
21493
  function LineLoop(geometry, material) {
21471
- Line.call(this, geometry, material);
21494
+ Line$1.call(this, geometry, material);
21472
21495
  this.type = "LineLoop";
21473
21496
  }
21474
- LineLoop.prototype = Object.assign(Object.create(Line.prototype), {
21497
+ LineLoop.prototype = Object.assign(Object.create(Line$1.prototype), {
21475
21498
  constructor: LineLoop,
21476
21499
  isLineLoop: true
21477
21500
  });
@@ -26080,32 +26103,32 @@ ImageLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26080
26103
  }, 0);
26081
26104
  return cached;
26082
26105
  }
26083
- var image = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
26106
+ var image2 = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
26084
26107
  function onImageLoad() {
26085
- image.removeEventListener("load", onImageLoad, false);
26086
- image.removeEventListener("error", onImageError, false);
26108
+ image2.removeEventListener("load", onImageLoad, false);
26109
+ image2.removeEventListener("error", onImageError, false);
26087
26110
  Cache.add(url, this);
26088
26111
  if (onLoad)
26089
26112
  onLoad(this);
26090
26113
  scope.manager.itemEnd(url);
26091
26114
  }
26092
26115
  function onImageError(event) {
26093
- image.removeEventListener("load", onImageLoad, false);
26094
- image.removeEventListener("error", onImageError, false);
26116
+ image2.removeEventListener("load", onImageLoad, false);
26117
+ image2.removeEventListener("error", onImageError, false);
26095
26118
  if (onError)
26096
26119
  onError(event);
26097
26120
  scope.manager.itemError(url);
26098
26121
  scope.manager.itemEnd(url);
26099
26122
  }
26100
- image.addEventListener("load", onImageLoad, false);
26101
- image.addEventListener("error", onImageError, false);
26123
+ image2.addEventListener("load", onImageLoad, false);
26124
+ image2.addEventListener("error", onImageError, false);
26102
26125
  if (url.substr(0, 5) !== "data:") {
26103
26126
  if (this.crossOrigin !== void 0)
26104
- image.crossOrigin = this.crossOrigin;
26127
+ image2.crossOrigin = this.crossOrigin;
26105
26128
  }
26106
26129
  scope.manager.itemStart(url);
26107
- image.src = url;
26108
- return image;
26130
+ image2.src = url;
26131
+ return image2;
26109
26132
  }
26110
26133
  });
26111
26134
  function CubeTextureLoader(manager) {
@@ -26120,8 +26143,8 @@ CubeTextureLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26120
26143
  loader.setPath(this.path);
26121
26144
  var loaded = 0;
26122
26145
  function loadTexture2(i2) {
26123
- loader.load(urls[i2], function(image) {
26124
- texture.images[i2] = image;
26146
+ loader.load(urls[i2], function(image2) {
26147
+ texture.images[i2] = image2;
26125
26148
  loaded++;
26126
26149
  if (loaded === 6) {
26127
26150
  texture.needsUpdate = true;
@@ -26146,8 +26169,8 @@ TextureLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26146
26169
  var loader = new ImageLoader(this.manager);
26147
26170
  loader.setCrossOrigin(this.crossOrigin);
26148
26171
  loader.setPath(this.path);
26149
- loader.load(url, function(image) {
26150
- texture.image = image;
26172
+ loader.load(url, function(image2) {
26173
+ texture.image = image2;
26151
26174
  var isJPEG = url.search(/\.jpe?g($|\?)/i) > 0 || url.search(/^data\:image\/jpeg/) === 0;
26152
26175
  texture.format = isJPEG ? RGBFormat : RGBAFormat;
26153
26176
  texture.needsUpdate = true;
@@ -28352,18 +28375,18 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28352
28375
  var loader = new ImageLoader(manager);
28353
28376
  loader.setCrossOrigin(this.crossOrigin);
28354
28377
  for (var i = 0, il = json.length; i < il; i++) {
28355
- var image = json[i];
28356
- var url = image.url;
28378
+ var image2 = json[i];
28379
+ var url = image2.url;
28357
28380
  if (Array.isArray(url)) {
28358
- images[image.uuid] = [];
28381
+ images[image2.uuid] = [];
28359
28382
  for (var j = 0, jl = url.length; j < jl; j++) {
28360
28383
  var currentUrl = url[j];
28361
28384
  var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(currentUrl) ? currentUrl : scope.resourcePath + currentUrl;
28362
- images[image.uuid].push(loadImage(path));
28385
+ images[image2.uuid].push(loadImage(path));
28363
28386
  }
28364
28387
  } else {
28365
- var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url) ? image.url : scope.resourcePath + image.url;
28366
- images[image.uuid] = loadImage(path);
28388
+ var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image2.url) ? image2.url : scope.resourcePath + image2.url;
28389
+ images[image2.uuid] = loadImage(path);
28367
28390
  }
28368
28391
  }
28369
28392
  }
@@ -28447,11 +28470,11 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28447
28470
  if (Array.isArray(name)) {
28448
28471
  var array = [];
28449
28472
  for (var i2 = 0, l3 = name.length; i2 < l3; i2++) {
28450
- var uuid = name[i2];
28451
- if (materials[uuid] === void 0) {
28452
- console.warn("THREE.ObjectLoader: Undefined material", uuid);
28473
+ var uuid2 = name[i2];
28474
+ if (materials[uuid2] === void 0) {
28475
+ console.warn("THREE.ObjectLoader: Undefined material", uuid2);
28453
28476
  }
28454
- array.push(materials[uuid]);
28477
+ array.push(materials[uuid2]);
28455
28478
  }
28456
28479
  return array;
28457
28480
  }
@@ -28536,7 +28559,7 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28536
28559
  object = new LOD();
28537
28560
  break;
28538
28561
  case "Line":
28539
- object = new Line(getGeometry(data.geometry), getMaterial(data.material), data.mode);
28562
+ object = new Line$1(getGeometry(data.geometry), getMaterial(data.material), data.mode);
28540
28563
  break;
28541
28564
  case "LineLoop":
28542
28565
  object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material));
@@ -30024,10 +30047,10 @@ Object.assign(AnimationObjectGroup.prototype, {
30024
30047
  add: function() {
30025
30048
  var objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length, knownObject = void 0;
30026
30049
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30027
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30050
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30028
30051
  if (index === void 0) {
30029
30052
  index = nObjects++;
30030
- indicesByUUID[uuid] = index;
30053
+ indicesByUUID[uuid2] = index;
30031
30054
  objects.push(object);
30032
30055
  for (var j = 0, m = nBindings; j !== m; ++j) {
30033
30056
  bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j]));
@@ -30037,7 +30060,7 @@ Object.assign(AnimationObjectGroup.prototype, {
30037
30060
  var firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex];
30038
30061
  indicesByUUID[lastCachedObject.uuid] = index;
30039
30062
  objects[index] = lastCachedObject;
30040
- indicesByUUID[uuid] = firstActiveIndex;
30063
+ indicesByUUID[uuid2] = firstActiveIndex;
30041
30064
  objects[firstActiveIndex] = object;
30042
30065
  for (var j = 0, m = nBindings; j !== m; ++j) {
30043
30066
  var bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex], binding = bindingsForPath[index];
@@ -30056,12 +30079,12 @@ Object.assign(AnimationObjectGroup.prototype, {
30056
30079
  remove: function() {
30057
30080
  var objects = this._objects, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length;
30058
30081
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30059
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30082
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30060
30083
  if (index !== void 0 && index >= nCachedObjects) {
30061
30084
  var lastCachedIndex = nCachedObjects++, firstActiveObject = objects[lastCachedIndex];
30062
30085
  indicesByUUID[firstActiveObject.uuid] = index;
30063
30086
  objects[index] = firstActiveObject;
30064
- indicesByUUID[uuid] = lastCachedIndex;
30087
+ indicesByUUID[uuid2] = lastCachedIndex;
30065
30088
  objects[lastCachedIndex] = object;
30066
30089
  for (var j = 0, m = nBindings; j !== m; ++j) {
30067
30090
  var bindingsForPath = bindings[j], firstActive = bindingsForPath[lastCachedIndex], binding = bindingsForPath[index];
@@ -30075,9 +30098,9 @@ Object.assign(AnimationObjectGroup.prototype, {
30075
30098
  uncache: function() {
30076
30099
  var objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length;
30077
30100
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30078
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30101
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30079
30102
  if (index !== void 0) {
30080
- delete indicesByUUID[uuid];
30103
+ delete indicesByUUID[uuid2];
30081
30104
  if (index < nCachedObjects) {
30082
30105
  var firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex], lastIndex = --nObjects, lastObject = objects[lastIndex];
30083
30106
  indicesByUUID[lastCachedObject.uuid] = index;
@@ -31505,11 +31528,11 @@ function DirectionalLightHelper(light, size, color) {
31505
31528
  0
31506
31529
  ], 3));
31507
31530
  var material = new LineBasicMaterial({ fog: false, toneMapped: false });
31508
- this.lightPlane = new Line(geometry, material);
31531
+ this.lightPlane = new Line$1(geometry, material);
31509
31532
  this.add(this.lightPlane);
31510
31533
  geometry = new BufferGeometry();
31511
31534
  geometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3));
31512
- this.targetLine = new Line(geometry, material);
31535
+ this.targetLine = new Line$1(geometry, material);
31513
31536
  this.add(this.targetLine);
31514
31537
  this.update();
31515
31538
  }
@@ -31740,7 +31763,7 @@ function PlaneHelper(plane, size, hex) {
31740
31763
  var geometry = new BufferGeometry();
31741
31764
  geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
31742
31765
  geometry.computeBoundingSphere();
31743
- Line.call(this, geometry, new LineBasicMaterial({ color, toneMapped: false }));
31766
+ Line$1.call(this, geometry, new LineBasicMaterial({ color, toneMapped: false }));
31744
31767
  this.type = "PlaneHelper";
31745
31768
  var positions2 = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1];
31746
31769
  var geometry2 = new BufferGeometry();
@@ -31748,7 +31771,7 @@ function PlaneHelper(plane, size, hex) {
31748
31771
  geometry2.computeBoundingSphere();
31749
31772
  this.add(new Mesh(geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false })));
31750
31773
  }
31751
- PlaneHelper.prototype = Object.create(Line.prototype);
31774
+ PlaneHelper.prototype = Object.create(Line$1.prototype);
31752
31775
  PlaneHelper.prototype.constructor = PlaneHelper;
31753
31776
  PlaneHelper.prototype.updateMatrixWorld = function(force) {
31754
31777
  var scale = -this.plane.constant;
@@ -31783,7 +31806,7 @@ function ArrowHelper(dir, origin, length, color, headLength, headWidth) {
31783
31806
  _coneGeometry.translate(0, -0.5, 0);
31784
31807
  }
31785
31808
  this.position.copy(origin);
31786
- this.line = new Line(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false }));
31809
+ this.line = new Line$1(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false }));
31787
31810
  this.line.matrixAutoUpdate = false;
31788
31811
  this.add(this.line);
31789
31812
  this.cone = new Mesh(_coneGeometry, new MeshBasicMaterial({ color, toneMapped: false }));
@@ -33791,8 +33814,8 @@ var FBXLoader = function() {
33791
33814
  var arrayBufferContent = videoNode.Content instanceof ArrayBuffer && videoNode.Content.byteLength > 0;
33792
33815
  var base64Content = typeof videoNode.Content === "string" && videoNode.Content !== "";
33793
33816
  if (arrayBufferContent || base64Content) {
33794
- var image = this.parseImage(videoNodes[nodeID]);
33795
- blobs[videoNode.RelativeFilename || videoNode.Filename] = image;
33817
+ var image2 = this.parseImage(videoNodes[nodeID]);
33818
+ blobs[videoNode.RelativeFilename || videoNode.Filename] = image2;
33796
33819
  }
33797
33820
  }
33798
33821
  }
@@ -34368,7 +34391,7 @@ var FBXLoader = function() {
34368
34391
  return geo;
34369
34392
  }, null);
34370
34393
  var material = new LineBasicMaterial({ color: 3342591, linewidth: 1 });
34371
- return new Line(geometry, material);
34394
+ return new Line$1(geometry, material);
34372
34395
  },
34373
34396
  getTransformData: function(model, modelNode) {
34374
34397
  var transformData = {};
@@ -34484,17 +34507,17 @@ var FBXLoader = function() {
34484
34507
  });
34485
34508
  },
34486
34509
  setupMorphMaterial: function(child, material, index) {
34487
- var uuid = child.uuid;
34510
+ var uuid2 = child.uuid;
34488
34511
  var matUuid = material.uuid;
34489
34512
  var sharedMat = false;
34490
34513
  sceneGraph.traverse(function(node) {
34491
34514
  if (node.isMesh) {
34492
34515
  if (Array.isArray(node.material)) {
34493
34516
  node.material.forEach(function(mat) {
34494
- if (mat.uuid === matUuid && node.uuid !== uuid)
34517
+ if (mat.uuid === matUuid && node.uuid !== uuid2)
34495
34518
  sharedMat = true;
34496
34519
  });
34497
- } else if (node.material.uuid === matUuid && node.uuid !== uuid)
34520
+ } else if (node.material.uuid === matUuid && node.uuid !== uuid2)
34498
34521
  sharedMat = true;
34499
34522
  }
34500
34523
  });
@@ -37159,7 +37182,7 @@ const CameraMovementPlugin = (five) => {
37159
37182
  rotate
37160
37183
  };
37161
37184
  };
37162
- function samePointAt(point1, point2) {
37185
+ function samePointAt$1(point1, point2) {
37163
37186
  return point1.x === point2.x && point1.y === point2.y;
37164
37187
  }
37165
37188
  function sameK(k1, k2) {
@@ -37200,9 +37223,9 @@ function intersectionOfLine(linePoints1, linePoints2, needIntersectionInLine) {
37200
37223
  return { x, y: y2 };
37201
37224
  }
37202
37225
  function pointOnLine(point, linePoints) {
37203
- if (samePointAt(point, linePoints[0]))
37226
+ if (samePointAt$1(point, linePoints[0]))
37204
37227
  return true;
37205
- if (samePointAt(point, linePoints[1]))
37228
+ if (samePointAt$1(point, linePoints[1]))
37206
37229
  return true;
37207
37230
  return (linePoints[0].x - point.x) * (point.x - linePoints[1].x) >= 0 && (linePoints[0].y - point.y) * (point.y - linePoints[1].y) >= 0 && sameK(getK(linePoints[0], point), getK(point, linePoints[1]));
37208
37231
  }
@@ -37276,6 +37299,7 @@ const PanoRulerStyle = `<style type="text/css">
37276
37299
  padding: 0.1875rem 0.375rem;
37277
37300
  background: rgba(195,195,195,0.30);
37278
37301
  backdrop-filter: blur(0.25rem);
37302
+ -webkit-backdrop-filter: blur(0.25rem);
37279
37303
  border-radius: 6.25rem;
37280
37304
  border: 0.0625rem solid rgba(255,255,255,0.6);
37281
37305
  white-space: nowrap;
@@ -37617,6 +37641,7 @@ const PanoRulerPlugin = (five, params) => {
37617
37641
  if (labelWidth >= distance || labelWidth / 2 >= labelOffset / 100 * distance || labelWidth / 2 >= (1 - labelOffset / 100) * distance) {
37618
37642
  $line.style.display = "none";
37619
37643
  } else {
37644
+ $line.style.display = "block";
37620
37645
  $line.style.width = distance + "px";
37621
37646
  $line.style.left = startLeft + "px";
37622
37647
  $line.style.top = startTop + "px";
@@ -37667,6 +37692,51 @@ const PanoRulerPlugin = (five, params) => {
37667
37692
  state
37668
37693
  };
37669
37694
  };
37695
+ const roomInfoIcon = "data:image/png;base64,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";
37696
+ function getRoomInfoInstance() {
37697
+ const infoDom = document.createElement("div");
37698
+ const iconDom = document.createElement("i");
37699
+ const textDom = document.createElement("span");
37700
+ infoDom.appendChild(iconDom);
37701
+ infoDom.appendChild(textDom);
37702
+ infoDom.style.position = "relative";
37703
+ infoDom.style.width = "100%";
37704
+ infoDom.style.display = "flex";
37705
+ infoDom.style.flexDirection = "column";
37706
+ infoDom.style.alignItems = "center";
37707
+ infoDom.style.marginTop = `${150 / 16}rem`;
37708
+ infoDom.style.opacity = "0";
37709
+ infoDom.style.transition = "opacity 1000ms linear";
37710
+ iconDom.style.display = "block";
37711
+ iconDom.style.width = `${134 / 16}rem`;
37712
+ iconDom.style.height = `${22 / 16}rem`;
37713
+ iconDom.style.backgroundSize = "100%";
37714
+ iconDom.style.backgroundRepeat = "no-repeat";
37715
+ iconDom.style.backgroundImage = `url(${roomInfoIcon})`;
37716
+ textDom.style.marginTop = `${10 / 16}rem`;
37717
+ textDom.style.fontSize = `${16 / 16}rem`;
37718
+ textDom.style.color = "#fff";
37719
+ textDom.style.opacity = "0.7";
37720
+ textDom.style.textShadow = "0 2px 16px rgb(22 34 83 / 24%)";
37721
+ textDom.style.fontWeight = "bold";
37722
+ return {
37723
+ appendTo(element2) {
37724
+ element2.appendChild(infoDom);
37725
+ },
37726
+ dispose() {
37727
+ infoDom.remove();
37728
+ },
37729
+ setRoom(room) {
37730
+ textDom.innerHTML = room.name + " " + Math.floor(room.size / 1e6) + "\u33A1";
37731
+ },
37732
+ show() {
37733
+ infoDom.style.opacity = "1";
37734
+ },
37735
+ hide() {
37736
+ infoDom.style.opacity = "0";
37737
+ }
37738
+ };
37739
+ }
37670
37740
  const textureLoader = new THREE.TextureLoader();
37671
37741
  async function loadTexture(url) {
37672
37742
  return new Promise((resolve, reject) => {
@@ -37716,33 +37786,26 @@ class PanoCompassController {
37716
37786
  __publicField(this, "five");
37717
37787
  __publicField(this, "data");
37718
37788
  __publicField(this, "config");
37789
+ __publicField(this, "group", new THREE.Group());
37790
+ __publicField(this, "modelLoaded", false);
37791
+ __publicField(this, "roomInfoInstance");
37792
+ __publicField(this, "roomInfoWrapperInstance");
37719
37793
  __publicField(this, "compassMeshTween");
37720
37794
  __publicField(this, "compassMesh");
37795
+ __publicField(this, "entryDoorMesh");
37721
37796
  __publicField(this, "dispose", () => {
37797
+ var _a, _b, _c, _d;
37798
+ this.five.scene.remove(this.group);
37799
+ this.group.remove(...this.group.children);
37800
+ (_b = (_a = this.compassMesh) == null ? void 0 : _a.material.map) == null ? void 0 : _b.dispose();
37801
+ (_d = (_c = this.entryDoorMesh) == null ? void 0 : _c.material.map) == null ? void 0 : _d.dispose();
37722
37802
  this.five.off("panoArrived", this.onFivePanoArrived);
37723
37803
  this.five.off("panoWillArrive", this.onFivePanoWillArrive);
37724
- this.five.off();
37725
37804
  });
37726
- __publicField(this, "loadCompassMesh", async () => {
37727
- var _a;
37728
- const compassImageUrl = ((_a = this.config) == null ? void 0 : _a.compassImageUrl) || "//vrlab-image4.ljcdn.com/release/web/v3/north-point-circle.96498e69.png";
37729
- const texture = await loadTexture(compassImageUrl);
37730
- const compassGeometry = new THREE.CircleGeometry(0.7, 32);
37731
- const compassMaterial = new THREE.MeshBasicMaterial({
37732
- map: texture,
37733
- transparent: true,
37734
- opacity: 1,
37735
- depthTest: false
37736
- });
37737
- const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial);
37738
- compassMesh.rotateX(-Math.PI / 2);
37739
- compassMesh.name = "pano-compass-mesh";
37740
- this.compassMesh = compassMesh;
37741
- this.fixPosition(this.five.panoIndex || 0);
37742
- if (!this.data)
37743
- return;
37744
- this.fixRotation(this.data.north_rad);
37745
- this.five.scene.add(compassMesh);
37805
+ __publicField(this, "onFiveFistPanoLoaded", () => {
37806
+ this.modelLoaded = true;
37807
+ if (this.data)
37808
+ this.init();
37746
37809
  });
37747
37810
  __publicField(this, "onFivePanoWillArrive", (panoIndex) => {
37748
37811
  var _a, _b;
@@ -37752,45 +37815,3466 @@ class PanoCompassController {
37752
37815
  (_b = this.compassMesh) == null ? void 0 : _b.material.setValues({ opacity: 0 });
37753
37816
  });
37754
37817
  __publicField(this, "onFivePanoArrived", (panoIndex) => {
37818
+ var _a, _b, _c, _d;
37819
+ const standingPosition = this.five.work.observers[panoIndex].standingPosition;
37820
+ if (this.compassMesh) {
37821
+ this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
37822
+ if (this.compassMesh.material.opacity !== 0)
37823
+ return;
37824
+ (_a = this.compassMeshTween) == null ? void 0 : _a.dispose();
37825
+ this.compassMeshTween = tweenProgress(1e3).onUpdate(({ progress }) => {
37826
+ var _a2;
37827
+ (_a2 = this.compassMesh) == null ? void 0 : _a2.material.setValues({ opacity: progress });
37828
+ this.five.needsRender = true;
37829
+ }).play();
37830
+ }
37831
+ if (this.entryDoorMesh) {
37832
+ const entryDoorPosition = new THREE.Vector3(this.data.entrance.position.x, this.data.entrance.position.y, this.data.entrance.position.z);
37833
+ const panoToEntryDoorVector = entryDoorPosition.clone().setY(standingPosition.y).sub(standingPosition).normalize();
37834
+ const compassEntryDoorPosition = standingPosition.clone().add(panoToEntryDoorVector.clone().multiplyScalar(0.7)).setY(standingPosition.y + 0.01);
37835
+ this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector);
37836
+ this.entryDoorMesh.position.copy(compassEntryDoorPosition);
37837
+ ((_b = this.data) == null ? void 0 : _b.room_observers[panoIndex].room.type) === 1 ? (_c = this.entryDoorMesh) == null ? void 0 : _c.material.setValues({ opacity: 1 }) : (_d = this.entryDoorMesh) == null ? void 0 : _d.material.setValues({ opacity: 0 });
37838
+ }
37839
+ if (this.roomInfoInstance && this.roomInfoWrapperInstance) {
37840
+ this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
37841
+ this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room);
37842
+ }
37843
+ this.five.needsRender = true;
37844
+ });
37845
+ __publicField(this, "onFiveCameraDirectionUpdate", ({
37846
+ longitude,
37847
+ latitude
37848
+ }) => {
37755
37849
  var _a, _b;
37756
- if (((_a = this.compassMesh) == null ? void 0 : _a.material.opacity) !== 0)
37850
+ if (!this.roomInfoWrapperInstance)
37757
37851
  return;
37758
- this.fixPosition(panoIndex);
37759
- (_b = this.compassMeshTween) == null ? void 0 : _b.dispose();
37760
- this.compassMeshTween = tweenProgress(1e3).onUpdate(({ progress }) => {
37761
- var _a2;
37762
- (_a2 = this.compassMesh) == null ? void 0 : _a2.material.setValues({ opacity: progress });
37763
- this.five.needsRender = true;
37764
- }).play();
37852
+ this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude;
37853
+ latitude > 0.66 && this.five.getCurrentState().mode === "Panorama" ? (_a = this.roomInfoInstance) == null ? void 0 : _a.show() : (_b = this.roomInfoInstance) == null ? void 0 : _b.hide();
37765
37854
  });
37766
37855
  this.five = five;
37767
37856
  this.config = config;
37768
- five.once("panoLoaded", this.loadCompassMesh);
37857
+ this.five.scene.add(this.group);
37769
37858
  five.once("dispose", this.dispose);
37859
+ five.once("modelLoaded", this.onFiveFistPanoLoaded);
37770
37860
  this.five.on("panoArrived", this.onFivePanoArrived);
37771
37861
  this.five.on("panoWillArrive", this.onFivePanoWillArrive);
37862
+ this.five.on("cameraDirectionUpdate", this.onFiveCameraDirectionUpdate);
37772
37863
  }
37773
37864
  load(data) {
37774
37865
  this.data = data;
37775
- if (this.compassMesh && !this.five.scene.children.includes(this.compassMesh)) {
37776
- this.fixRotation(data.north_rad);
37777
- this.fixPosition(this.five.panoIndex || 0);
37778
- this.five.scene.add(this.compassMesh);
37866
+ if (this.modelLoaded)
37867
+ this.init();
37868
+ }
37869
+ async init() {
37870
+ if (!this.data || !this.modelLoaded)
37871
+ return;
37872
+ const northRad = this.data.north_rad;
37873
+ if (northRad != null) {
37874
+ this.compassMesh = await this.loadCompassMesh();
37875
+ this.compassMesh.rotateX(-Math.PI / 2);
37876
+ this.compassMesh.rotateZ(northRad - Math.PI / 2);
37877
+ this.group.add(this.compassMesh);
37878
+ }
37879
+ if (this.data.entrance != null) {
37880
+ this.entryDoorMesh = await this.loadEntryDoorMesh();
37881
+ this.roomInfoWrapperInstance = this.loadRoomInfo();
37882
+ this.roomInfoInstance = getRoomInfoInstance();
37883
+ this.entryDoorMesh.rotateX(-Math.PI / 2);
37884
+ if (this.roomInfoWrapperInstance)
37885
+ this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container);
37886
+ this.group.add(this.entryDoorMesh);
37887
+ }
37888
+ this.onFivePanoArrived(this.five.panoIndex || 0);
37889
+ this.five.needsRender = true;
37890
+ }
37891
+ async loadCompassMesh() {
37892
+ var _a;
37893
+ const compassImageUrl = ((_a = this.config) == null ? void 0 : _a.compassImageUrl) || "//vrlab-image4.ljcdn.com/release/web/v3/north-point-circle.96498e69.png";
37894
+ const compassTexture = await loadTexture(compassImageUrl);
37895
+ const compassGeometry = new THREE.CircleGeometry(0.7, 32);
37896
+ const compassMaterial = new THREE.MeshBasicMaterial({
37897
+ map: compassTexture,
37898
+ transparent: true,
37899
+ opacity: 0,
37900
+ depthTest: false
37901
+ });
37902
+ const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial);
37903
+ compassMesh.name = "pano-compass-mesh";
37904
+ return compassMesh;
37905
+ }
37906
+ async loadEntryDoorMesh() {
37907
+ var _a;
37908
+ const entryDoorImageUrl = ((_a = this.config) == null ? void 0 : _a.entryDoorImageUrl) || "//vrlab-image4.ljcdn.com/release/web/enterDoor.831b8208.png";
37909
+ const entryDoorTexture = await loadTexture(entryDoorImageUrl);
37910
+ const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16);
37911
+ const entryDoorMaterial = new THREE.MeshBasicMaterial({
37912
+ map: entryDoorTexture,
37913
+ transparent: true,
37914
+ opacity: 0.8,
37915
+ depthTest: false
37916
+ });
37917
+ const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial);
37918
+ entryDoorMesh.name = "pano-compass-entry-door";
37919
+ return entryDoorMesh;
37920
+ }
37921
+ loadRoomInfo() {
37922
+ const points = [
37923
+ new THREE.Vector3(-0.7, 0, -0.7),
37924
+ new THREE.Vector3(0.7, 0, -0.7),
37925
+ new THREE.Vector3(0.7, 0, 0.7),
37926
+ new THREE.Vector3(-0.7, 0, 0.7)
37927
+ ];
37928
+ const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points);
37929
+ return roomInfo;
37930
+ }
37931
+ }
37932
+ function exchange(array, index1, index2) {
37933
+ const value = array[index1];
37934
+ array[index1] = array[index2];
37935
+ array[index2] = value;
37936
+ }
37937
+ class Magnifier {
37938
+ constructor(five, options) {
37939
+ __publicField(this, "five");
37940
+ __publicField(this, "scale");
37941
+ __publicField(this, "width");
37942
+ __publicField(this, "height");
37943
+ __publicField(this, "pixelRatio");
37944
+ __publicField(this, "originWidth");
37945
+ __publicField(this, "originHeight");
37946
+ __publicField(this, "context");
37947
+ __publicField(this, "canvas", document.createElement("canvas"));
37948
+ __publicField(this, "container");
37949
+ if (!five.renderer)
37950
+ throw new Error("Five Render \u672A\u521D\u59CB\u5316");
37951
+ this.five = five;
37952
+ const scale = options.scale;
37953
+ const pixelRatio = five.renderer.getPixelRatio();
37954
+ const originWidth = options.width;
37955
+ const originHeight = options.height;
37956
+ const width = originWidth * pixelRatio;
37957
+ const height = originHeight * pixelRatio;
37958
+ const magnifier = this.canvas;
37959
+ const context = this.canvas.getContext("2d");
37960
+ if (!context)
37961
+ throw new Error("CANNOT CREATE CONTEXT2D");
37962
+ this.scale = scale;
37963
+ this.context = context;
37964
+ this.width = width;
37965
+ this.height = height;
37966
+ this.originWidth = originWidth;
37967
+ this.originHeight = originHeight;
37968
+ this.pixelRatio = pixelRatio;
37969
+ magnifier.classList.add("plugin-measure-magnifier");
37970
+ magnifier.style.position = "absolute";
37971
+ magnifier.style.pointerEvents = "none";
37972
+ magnifier.style.borderRadius = "50%";
37973
+ magnifier.style.left = -width / 2 + "px";
37974
+ magnifier.style.top = -height - 90 + "px";
37975
+ magnifier.setAttribute("width", width.toString());
37976
+ magnifier.setAttribute("height", height.toString());
37977
+ this.canvas.style.width = originWidth + "px";
37978
+ this.canvas.style.height = originHeight + "px";
37979
+ }
37980
+ dispose() {
37981
+ this.clear();
37982
+ this.canvas.remove();
37983
+ }
37984
+ clear() {
37985
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
37986
+ }
37987
+ appendTo(element2) {
37988
+ this.container = element2;
37989
+ element2.append(this.canvas);
37990
+ }
37991
+ updateWithPoint(point) {
37992
+ if (!this.five.renderer || !this.container)
37993
+ return;
37994
+ const { scale, pixelRatio, context, originWidth, originHeight, width, height } = this;
37995
+ const position2d = point.clone().project(this.five.camera);
37996
+ const left = (position2d.x + 1) / 2 * this.container.clientWidth;
37997
+ const right = -(position2d.x - 1) / 2 * this.container.clientWidth;
37998
+ const top = -(position2d.y - 1) / 2 * this.container.clientHeight;
37999
+ if (left < 183) {
38000
+ this.canvas.style.top = -originHeight / 2 + "px";
38001
+ this.canvas.style.left = 90 + "px";
38002
+ } else if (top < 183) {
38003
+ this.canvas.style.top = 90 + "px";
38004
+ this.canvas.style.left = -originWidth / 2 + "px";
38005
+ } else if (right < 183) {
38006
+ this.canvas.style.top = -originHeight / 2 + "px";
38007
+ this.canvas.style.left = -originWidth - 90 + "px";
38008
+ } else {
38009
+ this.canvas.style.left = -originWidth / 2 + "px";
38010
+ this.canvas.style.top = -originHeight - 90 + "px";
38011
+ }
38012
+ this.canvas.style.transform = `translate3d(${left}px, ${top}px, 10px)`;
38013
+ const renderSize = this.five.renderer.getSize(new Vector2$1());
38014
+ const x = (position2d.x + 1) / 2 * renderSize.x;
38015
+ const y2 = (position2d.y + 1) / 2 * renderSize.y;
38016
+ const pixels = this.five.getPixels(x - originWidth / scale / 2, y2 - originHeight / scale / 2, originWidth / scale, originHeight / scale, pixelRatio * scale);
38017
+ const length = width * height / 2;
38018
+ for (let index = 0; index < length; index++) {
38019
+ const targetIndex = (height - Math.floor(index / width) - 1) * width + index % width;
38020
+ exchange(pixels, index * 4 + 0, targetIndex * 4 + 0);
38021
+ exchange(pixels, index * 4 + 1, targetIndex * 4 + 1);
38022
+ exchange(pixels, index * 4 + 2, targetIndex * 4 + 2);
38023
+ exchange(pixels, index * 4 + 3, targetIndex * 4 + 3);
38024
+ }
38025
+ const imageData = context.createImageData(width, height);
38026
+ imageData.data.set(pixels);
38027
+ context.putImageData(imageData, 0, 0);
38028
+ }
38029
+ }
38030
+ class FiveHelper {
38031
+ constructor(five) {
38032
+ __publicField(this, "edges", []);
38033
+ __publicField(this, "five");
38034
+ __publicField(this, "onModelLoaded", () => {
38035
+ if (!this.five.model)
38036
+ return;
38037
+ this.edges = this.five.model.getEdges();
38038
+ });
38039
+ this.five = five;
38040
+ this.five.model.loaded ? this.onModelLoaded() : this.five.on("modelLoaded", this.onModelLoaded);
38041
+ }
38042
+ dispose() {
38043
+ }
38044
+ getAdsorbentPoint(intersection) {
38045
+ if (this.edges.length === 0)
38046
+ return null;
38047
+ let distance = Infinity;
38048
+ let closestPoint;
38049
+ this.edges.forEach((line) => {
38050
+ const _closestPoint = line.closestPointToPoint(intersection.point, true, new Vector3$1());
38051
+ const _distance = _closestPoint.distanceTo(intersection.point);
38052
+ if (_distance < distance) {
38053
+ closestPoint = _closestPoint;
38054
+ distance = _distance;
38055
+ }
38056
+ });
38057
+ if (distance > 0.1)
38058
+ return null;
38059
+ return closestPoint || null;
38060
+ }
38061
+ }
38062
+ var hammer = { exports: {} };
38063
+ /*! Hammer.JS - v2.0.7 - 2016-04-22
38064
+ * http://hammerjs.github.io/
38065
+ *
38066
+ * Copyright (c) 2016 Jorik Tangelder;
38067
+ * Licensed under the MIT license */
38068
+ (function(module) {
38069
+ (function(window2, document2, exportName, undefined$1) {
38070
+ var VENDOR_PREFIXES = ["", "webkit", "Moz", "MS", "ms", "o"];
38071
+ var TEST_ELEMENT = document2.createElement("div");
38072
+ var TYPE_FUNCTION = "function";
38073
+ var round = Math.round;
38074
+ var abs = Math.abs;
38075
+ var now2 = Date.now;
38076
+ function setTimeoutContext(fn, timeout, context) {
38077
+ return setTimeout(bindFn(fn, context), timeout);
38078
+ }
38079
+ function invokeArrayArg(arg, fn, context) {
38080
+ if (Array.isArray(arg)) {
38081
+ each(arg, context[fn], context);
38082
+ return true;
38083
+ }
38084
+ return false;
38085
+ }
38086
+ function each(obj, iterator, context) {
38087
+ var i;
38088
+ if (!obj) {
38089
+ return;
38090
+ }
38091
+ if (obj.forEach) {
38092
+ obj.forEach(iterator, context);
38093
+ } else if (obj.length !== undefined$1) {
38094
+ i = 0;
38095
+ while (i < obj.length) {
38096
+ iterator.call(context, obj[i], i, obj);
38097
+ i++;
38098
+ }
38099
+ } else {
38100
+ for (i in obj) {
38101
+ obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);
38102
+ }
38103
+ }
38104
+ }
38105
+ function deprecate(method, name, message) {
38106
+ var deprecationMessage = "DEPRECATED METHOD: " + name + "\n" + message + " AT \n";
38107
+ return function() {
38108
+ var e = new Error("get-stack-trace");
38109
+ var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, "").replace(/^\s+at\s+/gm, "").replace(/^Object.<anonymous>\s*\(/gm, "{anonymous}()@") : "Unknown Stack Trace";
38110
+ var log = window2.console && (window2.console.warn || window2.console.log);
38111
+ if (log) {
38112
+ log.call(window2.console, deprecationMessage, stack);
38113
+ }
38114
+ return method.apply(this, arguments);
38115
+ };
38116
+ }
38117
+ var assign2;
38118
+ if (typeof Object.assign !== "function") {
38119
+ assign2 = function assign3(target) {
38120
+ if (target === undefined$1 || target === null) {
38121
+ throw new TypeError("Cannot convert undefined or null to object");
38122
+ }
38123
+ var output = Object(target);
38124
+ for (var index = 1; index < arguments.length; index++) {
38125
+ var source = arguments[index];
38126
+ if (source !== undefined$1 && source !== null) {
38127
+ for (var nextKey in source) {
38128
+ if (source.hasOwnProperty(nextKey)) {
38129
+ output[nextKey] = source[nextKey];
38130
+ }
38131
+ }
38132
+ }
38133
+ }
38134
+ return output;
38135
+ };
38136
+ } else {
38137
+ assign2 = Object.assign;
38138
+ }
38139
+ var extend = deprecate(function extend2(dest, src, merge2) {
38140
+ var keys = Object.keys(src);
38141
+ var i = 0;
38142
+ while (i < keys.length) {
38143
+ if (!merge2 || merge2 && dest[keys[i]] === undefined$1) {
38144
+ dest[keys[i]] = src[keys[i]];
38145
+ }
38146
+ i++;
38147
+ }
38148
+ return dest;
38149
+ }, "extend", "Use `assign`.");
38150
+ var merge = deprecate(function merge2(dest, src) {
38151
+ return extend(dest, src, true);
38152
+ }, "merge", "Use `assign`.");
38153
+ function inherit(child, base, properties) {
38154
+ var baseP = base.prototype, childP;
38155
+ childP = child.prototype = Object.create(baseP);
38156
+ childP.constructor = child;
38157
+ childP._super = baseP;
38158
+ if (properties) {
38159
+ assign2(childP, properties);
38160
+ }
38161
+ }
38162
+ function bindFn(fn, context) {
38163
+ return function boundFn() {
38164
+ return fn.apply(context, arguments);
38165
+ };
38166
+ }
38167
+ function boolOrFn(val, args) {
38168
+ if (typeof val == TYPE_FUNCTION) {
38169
+ return val.apply(args ? args[0] || undefined$1 : undefined$1, args);
38170
+ }
38171
+ return val;
38172
+ }
38173
+ function ifUndefined(val1, val2) {
38174
+ return val1 === undefined$1 ? val2 : val1;
38175
+ }
38176
+ function addEventListeners(target, types, handler) {
38177
+ each(splitStr(types), function(type) {
38178
+ target.addEventListener(type, handler, false);
38179
+ });
38180
+ }
38181
+ function removeEventListeners(target, types, handler) {
38182
+ each(splitStr(types), function(type) {
38183
+ target.removeEventListener(type, handler, false);
38184
+ });
38185
+ }
38186
+ function hasParent(node, parent) {
38187
+ while (node) {
38188
+ if (node == parent) {
38189
+ return true;
38190
+ }
38191
+ node = node.parentNode;
38192
+ }
38193
+ return false;
38194
+ }
38195
+ function inStr(str, find) {
38196
+ return str.indexOf(find) > -1;
38197
+ }
38198
+ function splitStr(str) {
38199
+ return str.trim().split(/\s+/g);
38200
+ }
38201
+ function inArray(src, find, findByKey) {
38202
+ if (src.indexOf && !findByKey) {
38203
+ return src.indexOf(find);
38204
+ } else {
38205
+ var i = 0;
38206
+ while (i < src.length) {
38207
+ if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) {
38208
+ return i;
38209
+ }
38210
+ i++;
38211
+ }
38212
+ return -1;
38213
+ }
38214
+ }
38215
+ function toArray(obj) {
38216
+ return Array.prototype.slice.call(obj, 0);
38217
+ }
38218
+ function uniqueArray(src, key, sort) {
38219
+ var results = [];
38220
+ var values = [];
38221
+ var i = 0;
38222
+ while (i < src.length) {
38223
+ var val = key ? src[i][key] : src[i];
38224
+ if (inArray(values, val) < 0) {
38225
+ results.push(src[i]);
38226
+ }
38227
+ values[i] = val;
38228
+ i++;
38229
+ }
38230
+ if (sort) {
38231
+ if (!key) {
38232
+ results = results.sort();
38233
+ } else {
38234
+ results = results.sort(function sortUniqueArray(a, b) {
38235
+ return a[key] > b[key];
38236
+ });
38237
+ }
38238
+ }
38239
+ return results;
38240
+ }
38241
+ function prefixed(obj, property) {
38242
+ var prefix, prop;
38243
+ var camelProp = property[0].toUpperCase() + property.slice(1);
38244
+ var i = 0;
38245
+ while (i < VENDOR_PREFIXES.length) {
38246
+ prefix = VENDOR_PREFIXES[i];
38247
+ prop = prefix ? prefix + camelProp : property;
38248
+ if (prop in obj) {
38249
+ return prop;
38250
+ }
38251
+ i++;
38252
+ }
38253
+ return undefined$1;
38254
+ }
38255
+ var _uniqueId = 1;
38256
+ function uniqueId() {
38257
+ return _uniqueId++;
38258
+ }
38259
+ function getWindowForElement(element2) {
38260
+ var doc = element2.ownerDocument || element2;
38261
+ return doc.defaultView || doc.parentWindow || window2;
38262
+ }
38263
+ var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;
38264
+ var SUPPORT_TOUCH = "ontouchstart" in window2;
38265
+ var SUPPORT_POINTER_EVENTS = prefixed(window2, "PointerEvent") !== undefined$1;
38266
+ var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);
38267
+ var INPUT_TYPE_TOUCH = "touch";
38268
+ var INPUT_TYPE_PEN = "pen";
38269
+ var INPUT_TYPE_MOUSE = "mouse";
38270
+ var INPUT_TYPE_KINECT = "kinect";
38271
+ var COMPUTE_INTERVAL = 25;
38272
+ var INPUT_START = 1;
38273
+ var INPUT_MOVE = 2;
38274
+ var INPUT_END = 4;
38275
+ var INPUT_CANCEL = 8;
38276
+ var DIRECTION_NONE = 1;
38277
+ var DIRECTION_LEFT = 2;
38278
+ var DIRECTION_RIGHT = 4;
38279
+ var DIRECTION_UP = 8;
38280
+ var DIRECTION_DOWN = 16;
38281
+ var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;
38282
+ var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;
38283
+ var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;
38284
+ var PROPS_XY = ["x", "y"];
38285
+ var PROPS_CLIENT_XY = ["clientX", "clientY"];
38286
+ function Input(manager, callback) {
38287
+ var self2 = this;
38288
+ this.manager = manager;
38289
+ this.callback = callback;
38290
+ this.element = manager.element;
38291
+ this.target = manager.options.inputTarget;
38292
+ this.domHandler = function(ev) {
38293
+ if (boolOrFn(manager.options.enable, [manager])) {
38294
+ self2.handler(ev);
38295
+ }
38296
+ };
38297
+ this.init();
38298
+ }
38299
+ Input.prototype = {
38300
+ handler: function() {
38301
+ },
38302
+ init: function() {
38303
+ this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);
38304
+ this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);
38305
+ this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
38306
+ },
38307
+ destroy: function() {
38308
+ this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);
38309
+ this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);
38310
+ this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);
38311
+ }
38312
+ };
38313
+ function createInputInstance(manager) {
38314
+ var Type;
38315
+ var inputClass = manager.options.inputClass;
38316
+ if (inputClass) {
38317
+ Type = inputClass;
38318
+ } else if (SUPPORT_POINTER_EVENTS) {
38319
+ Type = PointerEventInput;
38320
+ } else if (SUPPORT_ONLY_TOUCH) {
38321
+ Type = TouchInput;
38322
+ } else if (!SUPPORT_TOUCH) {
38323
+ Type = MouseInput;
38324
+ } else {
38325
+ Type = TouchMouseInput;
38326
+ }
38327
+ return new Type(manager, inputHandler);
38328
+ }
38329
+ function inputHandler(manager, eventType, input) {
38330
+ var pointersLen = input.pointers.length;
38331
+ var changedPointersLen = input.changedPointers.length;
38332
+ var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0;
38333
+ var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0;
38334
+ input.isFirst = !!isFirst;
38335
+ input.isFinal = !!isFinal;
38336
+ if (isFirst) {
38337
+ manager.session = {};
38338
+ }
38339
+ input.eventType = eventType;
38340
+ computeInputData(manager, input);
38341
+ manager.emit("hammer.input", input);
38342
+ manager.recognize(input);
38343
+ manager.session.prevInput = input;
38344
+ }
38345
+ function computeInputData(manager, input) {
38346
+ var session = manager.session;
38347
+ var pointers = input.pointers;
38348
+ var pointersLength = pointers.length;
38349
+ if (!session.firstInput) {
38350
+ session.firstInput = simpleCloneInputData(input);
38351
+ }
38352
+ if (pointersLength > 1 && !session.firstMultiple) {
38353
+ session.firstMultiple = simpleCloneInputData(input);
38354
+ } else if (pointersLength === 1) {
38355
+ session.firstMultiple = false;
38356
+ }
38357
+ var firstInput = session.firstInput;
38358
+ var firstMultiple = session.firstMultiple;
38359
+ var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;
38360
+ var center = input.center = getCenter(pointers);
38361
+ input.timeStamp = now2();
38362
+ input.deltaTime = input.timeStamp - firstInput.timeStamp;
38363
+ input.angle = getAngle(offsetCenter, center);
38364
+ input.distance = getDistance2(offsetCenter, center);
38365
+ computeDeltaXY(session, input);
38366
+ input.offsetDirection = getDirection(input.deltaX, input.deltaY);
38367
+ var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);
38368
+ input.overallVelocityX = overallVelocity.x;
38369
+ input.overallVelocityY = overallVelocity.y;
38370
+ input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y;
38371
+ input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;
38372
+ input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;
38373
+ input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers;
38374
+ computeIntervalInputData(session, input);
38375
+ var target = manager.element;
38376
+ if (hasParent(input.srcEvent.target, target)) {
38377
+ target = input.srcEvent.target;
38378
+ }
38379
+ input.target = target;
38380
+ }
38381
+ function computeDeltaXY(session, input) {
38382
+ var center = input.center;
38383
+ var offset = session.offsetDelta || {};
38384
+ var prevDelta = session.prevDelta || {};
38385
+ var prevInput = session.prevInput || {};
38386
+ if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {
38387
+ prevDelta = session.prevDelta = {
38388
+ x: prevInput.deltaX || 0,
38389
+ y: prevInput.deltaY || 0
38390
+ };
38391
+ offset = session.offsetDelta = {
38392
+ x: center.x,
38393
+ y: center.y
38394
+ };
38395
+ }
38396
+ input.deltaX = prevDelta.x + (center.x - offset.x);
38397
+ input.deltaY = prevDelta.y + (center.y - offset.y);
38398
+ }
38399
+ function computeIntervalInputData(session, input) {
38400
+ var last = session.lastInterval || input, deltaTime = input.timeStamp - last.timeStamp, velocity, velocityX, velocityY, direction;
38401
+ if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined$1)) {
38402
+ var deltaX = input.deltaX - last.deltaX;
38403
+ var deltaY = input.deltaY - last.deltaY;
38404
+ var v2 = getVelocity(deltaTime, deltaX, deltaY);
38405
+ velocityX = v2.x;
38406
+ velocityY = v2.y;
38407
+ velocity = abs(v2.x) > abs(v2.y) ? v2.x : v2.y;
38408
+ direction = getDirection(deltaX, deltaY);
38409
+ session.lastInterval = input;
38410
+ } else {
38411
+ velocity = last.velocity;
38412
+ velocityX = last.velocityX;
38413
+ velocityY = last.velocityY;
38414
+ direction = last.direction;
38415
+ }
38416
+ input.velocity = velocity;
38417
+ input.velocityX = velocityX;
38418
+ input.velocityY = velocityY;
38419
+ input.direction = direction;
38420
+ }
38421
+ function simpleCloneInputData(input) {
38422
+ var pointers = [];
38423
+ var i = 0;
38424
+ while (i < input.pointers.length) {
38425
+ pointers[i] = {
38426
+ clientX: round(input.pointers[i].clientX),
38427
+ clientY: round(input.pointers[i].clientY)
38428
+ };
38429
+ i++;
38430
+ }
38431
+ return {
38432
+ timeStamp: now2(),
38433
+ pointers,
38434
+ center: getCenter(pointers),
38435
+ deltaX: input.deltaX,
38436
+ deltaY: input.deltaY
38437
+ };
38438
+ }
38439
+ function getCenter(pointers) {
38440
+ var pointersLength = pointers.length;
38441
+ if (pointersLength === 1) {
38442
+ return {
38443
+ x: round(pointers[0].clientX),
38444
+ y: round(pointers[0].clientY)
38445
+ };
38446
+ }
38447
+ var x = 0, y2 = 0, i = 0;
38448
+ while (i < pointersLength) {
38449
+ x += pointers[i].clientX;
38450
+ y2 += pointers[i].clientY;
38451
+ i++;
38452
+ }
38453
+ return {
38454
+ x: round(x / pointersLength),
38455
+ y: round(y2 / pointersLength)
38456
+ };
38457
+ }
38458
+ function getVelocity(deltaTime, x, y2) {
38459
+ return {
38460
+ x: x / deltaTime || 0,
38461
+ y: y2 / deltaTime || 0
38462
+ };
38463
+ }
38464
+ function getDirection(x, y2) {
38465
+ if (x === y2) {
38466
+ return DIRECTION_NONE;
38467
+ }
38468
+ if (abs(x) >= abs(y2)) {
38469
+ return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
38470
+ }
38471
+ return y2 < 0 ? DIRECTION_UP : DIRECTION_DOWN;
38472
+ }
38473
+ function getDistance2(p1, p2, props) {
38474
+ if (!props) {
38475
+ props = PROPS_XY;
38476
+ }
38477
+ var x = p2[props[0]] - p1[props[0]], y2 = p2[props[1]] - p1[props[1]];
38478
+ return Math.sqrt(x * x + y2 * y2);
38479
+ }
38480
+ function getAngle(p1, p2, props) {
38481
+ if (!props) {
38482
+ props = PROPS_XY;
38483
+ }
38484
+ var x = p2[props[0]] - p1[props[0]], y2 = p2[props[1]] - p1[props[1]];
38485
+ return Math.atan2(y2, x) * 180 / Math.PI;
38486
+ }
38487
+ function getRotation(start, end) {
38488
+ return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);
38489
+ }
38490
+ function getScale(start, end) {
38491
+ return getDistance2(end[0], end[1], PROPS_CLIENT_XY) / getDistance2(start[0], start[1], PROPS_CLIENT_XY);
38492
+ }
38493
+ var MOUSE_INPUT_MAP = {
38494
+ mousedown: INPUT_START,
38495
+ mousemove: INPUT_MOVE,
38496
+ mouseup: INPUT_END
38497
+ };
38498
+ var MOUSE_ELEMENT_EVENTS = "mousedown";
38499
+ var MOUSE_WINDOW_EVENTS = "mousemove mouseup";
38500
+ function MouseInput() {
38501
+ this.evEl = MOUSE_ELEMENT_EVENTS;
38502
+ this.evWin = MOUSE_WINDOW_EVENTS;
38503
+ this.pressed = false;
38504
+ Input.apply(this, arguments);
38505
+ }
38506
+ inherit(MouseInput, Input, {
38507
+ handler: function MEhandler(ev) {
38508
+ var eventType = MOUSE_INPUT_MAP[ev.type];
38509
+ if (eventType & INPUT_START && ev.button === 0) {
38510
+ this.pressed = true;
38511
+ }
38512
+ if (eventType & INPUT_MOVE && ev.which !== 1) {
38513
+ eventType = INPUT_END;
38514
+ }
38515
+ if (!this.pressed) {
38516
+ return;
38517
+ }
38518
+ if (eventType & INPUT_END) {
38519
+ this.pressed = false;
38520
+ }
38521
+ this.callback(this.manager, eventType, {
38522
+ pointers: [ev],
38523
+ changedPointers: [ev],
38524
+ pointerType: INPUT_TYPE_MOUSE,
38525
+ srcEvent: ev
38526
+ });
38527
+ }
38528
+ });
38529
+ var POINTER_INPUT_MAP = {
38530
+ pointerdown: INPUT_START,
38531
+ pointermove: INPUT_MOVE,
38532
+ pointerup: INPUT_END,
38533
+ pointercancel: INPUT_CANCEL,
38534
+ pointerout: INPUT_CANCEL
38535
+ };
38536
+ var IE10_POINTER_TYPE_ENUM = {
38537
+ 2: INPUT_TYPE_TOUCH,
38538
+ 3: INPUT_TYPE_PEN,
38539
+ 4: INPUT_TYPE_MOUSE,
38540
+ 5: INPUT_TYPE_KINECT
38541
+ };
38542
+ var POINTER_ELEMENT_EVENTS = "pointerdown";
38543
+ var POINTER_WINDOW_EVENTS = "pointermove pointerup pointercancel";
38544
+ if (window2.MSPointerEvent && !window2.PointerEvent) {
38545
+ POINTER_ELEMENT_EVENTS = "MSPointerDown";
38546
+ POINTER_WINDOW_EVENTS = "MSPointerMove MSPointerUp MSPointerCancel";
38547
+ }
38548
+ function PointerEventInput() {
38549
+ this.evEl = POINTER_ELEMENT_EVENTS;
38550
+ this.evWin = POINTER_WINDOW_EVENTS;
38551
+ Input.apply(this, arguments);
38552
+ this.store = this.manager.session.pointerEvents = [];
38553
+ }
38554
+ inherit(PointerEventInput, Input, {
38555
+ handler: function PEhandler(ev) {
38556
+ var store = this.store;
38557
+ var removePointer = false;
38558
+ var eventTypeNormalized = ev.type.toLowerCase().replace("ms", "");
38559
+ var eventType = POINTER_INPUT_MAP[eventTypeNormalized];
38560
+ var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;
38561
+ var isTouch = pointerType == INPUT_TYPE_TOUCH;
38562
+ var storeIndex = inArray(store, ev.pointerId, "pointerId");
38563
+ if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {
38564
+ if (storeIndex < 0) {
38565
+ store.push(ev);
38566
+ storeIndex = store.length - 1;
38567
+ }
38568
+ } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
38569
+ removePointer = true;
38570
+ }
38571
+ if (storeIndex < 0) {
38572
+ return;
38573
+ }
38574
+ store[storeIndex] = ev;
38575
+ this.callback(this.manager, eventType, {
38576
+ pointers: store,
38577
+ changedPointers: [ev],
38578
+ pointerType,
38579
+ srcEvent: ev
38580
+ });
38581
+ if (removePointer) {
38582
+ store.splice(storeIndex, 1);
38583
+ }
38584
+ }
38585
+ });
38586
+ var SINGLE_TOUCH_INPUT_MAP = {
38587
+ touchstart: INPUT_START,
38588
+ touchmove: INPUT_MOVE,
38589
+ touchend: INPUT_END,
38590
+ touchcancel: INPUT_CANCEL
38591
+ };
38592
+ var SINGLE_TOUCH_TARGET_EVENTS = "touchstart";
38593
+ var SINGLE_TOUCH_WINDOW_EVENTS = "touchstart touchmove touchend touchcancel";
38594
+ function SingleTouchInput() {
38595
+ this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;
38596
+ this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;
38597
+ this.started = false;
38598
+ Input.apply(this, arguments);
38599
+ }
38600
+ inherit(SingleTouchInput, Input, {
38601
+ handler: function TEhandler(ev) {
38602
+ var type = SINGLE_TOUCH_INPUT_MAP[ev.type];
38603
+ if (type === INPUT_START) {
38604
+ this.started = true;
38605
+ }
38606
+ if (!this.started) {
38607
+ return;
38608
+ }
38609
+ var touches = normalizeSingleTouches.call(this, ev, type);
38610
+ if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {
38611
+ this.started = false;
38612
+ }
38613
+ this.callback(this.manager, type, {
38614
+ pointers: touches[0],
38615
+ changedPointers: touches[1],
38616
+ pointerType: INPUT_TYPE_TOUCH,
38617
+ srcEvent: ev
38618
+ });
38619
+ }
38620
+ });
38621
+ function normalizeSingleTouches(ev, type) {
38622
+ var all = toArray(ev.touches);
38623
+ var changed = toArray(ev.changedTouches);
38624
+ if (type & (INPUT_END | INPUT_CANCEL)) {
38625
+ all = uniqueArray(all.concat(changed), "identifier", true);
38626
+ }
38627
+ return [all, changed];
38628
+ }
38629
+ var TOUCH_INPUT_MAP = {
38630
+ touchstart: INPUT_START,
38631
+ touchmove: INPUT_MOVE,
38632
+ touchend: INPUT_END,
38633
+ touchcancel: INPUT_CANCEL
38634
+ };
38635
+ var TOUCH_TARGET_EVENTS = "touchstart touchmove touchend touchcancel";
38636
+ function TouchInput() {
38637
+ this.evTarget = TOUCH_TARGET_EVENTS;
38638
+ this.targetIds = {};
38639
+ Input.apply(this, arguments);
38640
+ }
38641
+ inherit(TouchInput, Input, {
38642
+ handler: function MTEhandler(ev) {
38643
+ var type = TOUCH_INPUT_MAP[ev.type];
38644
+ var touches = getTouches.call(this, ev, type);
38645
+ if (!touches) {
38646
+ return;
38647
+ }
38648
+ this.callback(this.manager, type, {
38649
+ pointers: touches[0],
38650
+ changedPointers: touches[1],
38651
+ pointerType: INPUT_TYPE_TOUCH,
38652
+ srcEvent: ev
38653
+ });
38654
+ }
38655
+ });
38656
+ function getTouches(ev, type) {
38657
+ var allTouches = toArray(ev.touches);
38658
+ var targetIds = this.targetIds;
38659
+ if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {
38660
+ targetIds[allTouches[0].identifier] = true;
38661
+ return [allTouches, allTouches];
38662
+ }
38663
+ var i, targetTouches, changedTouches = toArray(ev.changedTouches), changedTargetTouches = [], target = this.target;
38664
+ targetTouches = allTouches.filter(function(touch) {
38665
+ return hasParent(touch.target, target);
38666
+ });
38667
+ if (type === INPUT_START) {
38668
+ i = 0;
38669
+ while (i < targetTouches.length) {
38670
+ targetIds[targetTouches[i].identifier] = true;
38671
+ i++;
38672
+ }
38673
+ }
38674
+ i = 0;
38675
+ while (i < changedTouches.length) {
38676
+ if (targetIds[changedTouches[i].identifier]) {
38677
+ changedTargetTouches.push(changedTouches[i]);
38678
+ }
38679
+ if (type & (INPUT_END | INPUT_CANCEL)) {
38680
+ delete targetIds[changedTouches[i].identifier];
38681
+ }
38682
+ i++;
38683
+ }
38684
+ if (!changedTargetTouches.length) {
38685
+ return;
38686
+ }
38687
+ return [
38688
+ uniqueArray(targetTouches.concat(changedTargetTouches), "identifier", true),
38689
+ changedTargetTouches
38690
+ ];
38691
+ }
38692
+ var DEDUP_TIMEOUT = 2500;
38693
+ var DEDUP_DISTANCE = 25;
38694
+ function TouchMouseInput() {
38695
+ Input.apply(this, arguments);
38696
+ var handler = bindFn(this.handler, this);
38697
+ this.touch = new TouchInput(this.manager, handler);
38698
+ this.mouse = new MouseInput(this.manager, handler);
38699
+ this.primaryTouch = null;
38700
+ this.lastTouches = [];
38701
+ }
38702
+ inherit(TouchMouseInput, Input, {
38703
+ handler: function TMEhandler(manager, inputEvent, inputData) {
38704
+ var isTouch = inputData.pointerType == INPUT_TYPE_TOUCH, isMouse = inputData.pointerType == INPUT_TYPE_MOUSE;
38705
+ if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {
38706
+ return;
38707
+ }
38708
+ if (isTouch) {
38709
+ recordTouches.call(this, inputEvent, inputData);
38710
+ } else if (isMouse && isSyntheticEvent.call(this, inputData)) {
38711
+ return;
38712
+ }
38713
+ this.callback(manager, inputEvent, inputData);
38714
+ },
38715
+ destroy: function destroy() {
38716
+ this.touch.destroy();
38717
+ this.mouse.destroy();
38718
+ }
38719
+ });
38720
+ function recordTouches(eventType, eventData) {
38721
+ if (eventType & INPUT_START) {
38722
+ this.primaryTouch = eventData.changedPointers[0].identifier;
38723
+ setLastTouch.call(this, eventData);
38724
+ } else if (eventType & (INPUT_END | INPUT_CANCEL)) {
38725
+ setLastTouch.call(this, eventData);
38726
+ }
38727
+ }
38728
+ function setLastTouch(eventData) {
38729
+ var touch = eventData.changedPointers[0];
38730
+ if (touch.identifier === this.primaryTouch) {
38731
+ var lastTouch = { x: touch.clientX, y: touch.clientY };
38732
+ this.lastTouches.push(lastTouch);
38733
+ var lts = this.lastTouches;
38734
+ var removeLastTouch = function() {
38735
+ var i = lts.indexOf(lastTouch);
38736
+ if (i > -1) {
38737
+ lts.splice(i, 1);
38738
+ }
38739
+ };
38740
+ setTimeout(removeLastTouch, DEDUP_TIMEOUT);
38741
+ }
38742
+ }
38743
+ function isSyntheticEvent(eventData) {
38744
+ var x = eventData.srcEvent.clientX, y2 = eventData.srcEvent.clientY;
38745
+ for (var i = 0; i < this.lastTouches.length; i++) {
38746
+ var t2 = this.lastTouches[i];
38747
+ var dx = Math.abs(x - t2.x), dy = Math.abs(y2 - t2.y);
38748
+ if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {
38749
+ return true;
38750
+ }
38751
+ }
38752
+ return false;
38753
+ }
38754
+ var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, "touchAction");
38755
+ var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined$1;
38756
+ var TOUCH_ACTION_COMPUTE = "compute";
38757
+ var TOUCH_ACTION_AUTO = "auto";
38758
+ var TOUCH_ACTION_MANIPULATION = "manipulation";
38759
+ var TOUCH_ACTION_NONE = "none";
38760
+ var TOUCH_ACTION_PAN_X = "pan-x";
38761
+ var TOUCH_ACTION_PAN_Y = "pan-y";
38762
+ var TOUCH_ACTION_MAP = getTouchActionProps();
38763
+ function TouchAction(manager, value) {
38764
+ this.manager = manager;
38765
+ this.set(value);
38766
+ }
38767
+ TouchAction.prototype = {
38768
+ set: function(value) {
38769
+ if (value == TOUCH_ACTION_COMPUTE) {
38770
+ value = this.compute();
38771
+ }
38772
+ if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {
38773
+ this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;
38774
+ }
38775
+ this.actions = value.toLowerCase().trim();
38776
+ },
38777
+ update: function() {
38778
+ this.set(this.manager.options.touchAction);
38779
+ },
38780
+ compute: function() {
38781
+ var actions = [];
38782
+ each(this.manager.recognizers, function(recognizer) {
38783
+ if (boolOrFn(recognizer.options.enable, [recognizer])) {
38784
+ actions = actions.concat(recognizer.getTouchAction());
38785
+ }
38786
+ });
38787
+ return cleanTouchActions(actions.join(" "));
38788
+ },
38789
+ preventDefaults: function(input) {
38790
+ var srcEvent = input.srcEvent;
38791
+ var direction = input.offsetDirection;
38792
+ if (this.manager.session.prevented) {
38793
+ srcEvent.preventDefault();
38794
+ return;
38795
+ }
38796
+ var actions = this.actions;
38797
+ var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];
38798
+ var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];
38799
+ var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];
38800
+ if (hasNone) {
38801
+ var isTapPointer = input.pointers.length === 1;
38802
+ var isTapMovement = input.distance < 2;
38803
+ var isTapTouchTime = input.deltaTime < 250;
38804
+ if (isTapPointer && isTapMovement && isTapTouchTime) {
38805
+ return;
38806
+ }
38807
+ }
38808
+ if (hasPanX && hasPanY) {
38809
+ return;
38810
+ }
38811
+ if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) {
38812
+ return this.preventSrc(srcEvent);
38813
+ }
38814
+ },
38815
+ preventSrc: function(srcEvent) {
38816
+ this.manager.session.prevented = true;
38817
+ srcEvent.preventDefault();
38818
+ }
38819
+ };
38820
+ function cleanTouchActions(actions) {
38821
+ if (inStr(actions, TOUCH_ACTION_NONE)) {
38822
+ return TOUCH_ACTION_NONE;
38823
+ }
38824
+ var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);
38825
+ var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);
38826
+ if (hasPanX && hasPanY) {
38827
+ return TOUCH_ACTION_NONE;
38828
+ }
38829
+ if (hasPanX || hasPanY) {
38830
+ return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;
38831
+ }
38832
+ if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {
38833
+ return TOUCH_ACTION_MANIPULATION;
38834
+ }
38835
+ return TOUCH_ACTION_AUTO;
38836
+ }
38837
+ function getTouchActionProps() {
38838
+ if (!NATIVE_TOUCH_ACTION) {
38839
+ return false;
38840
+ }
38841
+ var touchMap = {};
38842
+ var cssSupports = window2.CSS && window2.CSS.supports;
38843
+ ["auto", "manipulation", "pan-y", "pan-x", "pan-x pan-y", "none"].forEach(function(val) {
38844
+ touchMap[val] = cssSupports ? window2.CSS.supports("touch-action", val) : true;
38845
+ });
38846
+ return touchMap;
38847
+ }
38848
+ var STATE_POSSIBLE = 1;
38849
+ var STATE_BEGAN = 2;
38850
+ var STATE_CHANGED = 4;
38851
+ var STATE_ENDED = 8;
38852
+ var STATE_RECOGNIZED = STATE_ENDED;
38853
+ var STATE_CANCELLED = 16;
38854
+ var STATE_FAILED = 32;
38855
+ function Recognizer(options) {
38856
+ this.options = assign2({}, this.defaults, options || {});
38857
+ this.id = uniqueId();
38858
+ this.manager = null;
38859
+ this.options.enable = ifUndefined(this.options.enable, true);
38860
+ this.state = STATE_POSSIBLE;
38861
+ this.simultaneous = {};
38862
+ this.requireFail = [];
38863
+ }
38864
+ Recognizer.prototype = {
38865
+ defaults: {},
38866
+ set: function(options) {
38867
+ assign2(this.options, options);
38868
+ this.manager && this.manager.touchAction.update();
38869
+ return this;
38870
+ },
38871
+ recognizeWith: function(otherRecognizer) {
38872
+ if (invokeArrayArg(otherRecognizer, "recognizeWith", this)) {
38873
+ return this;
38874
+ }
38875
+ var simultaneous = this.simultaneous;
38876
+ otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
38877
+ if (!simultaneous[otherRecognizer.id]) {
38878
+ simultaneous[otherRecognizer.id] = otherRecognizer;
38879
+ otherRecognizer.recognizeWith(this);
38880
+ }
38881
+ return this;
38882
+ },
38883
+ dropRecognizeWith: function(otherRecognizer) {
38884
+ if (invokeArrayArg(otherRecognizer, "dropRecognizeWith", this)) {
38885
+ return this;
38886
+ }
38887
+ otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
38888
+ delete this.simultaneous[otherRecognizer.id];
38889
+ return this;
38890
+ },
38891
+ requireFailure: function(otherRecognizer) {
38892
+ if (invokeArrayArg(otherRecognizer, "requireFailure", this)) {
38893
+ return this;
38894
+ }
38895
+ var requireFail = this.requireFail;
38896
+ otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
38897
+ if (inArray(requireFail, otherRecognizer) === -1) {
38898
+ requireFail.push(otherRecognizer);
38899
+ otherRecognizer.requireFailure(this);
38900
+ }
38901
+ return this;
38902
+ },
38903
+ dropRequireFailure: function(otherRecognizer) {
38904
+ if (invokeArrayArg(otherRecognizer, "dropRequireFailure", this)) {
38905
+ return this;
38906
+ }
38907
+ otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);
38908
+ var index = inArray(this.requireFail, otherRecognizer);
38909
+ if (index > -1) {
38910
+ this.requireFail.splice(index, 1);
38911
+ }
38912
+ return this;
38913
+ },
38914
+ hasRequireFailures: function() {
38915
+ return this.requireFail.length > 0;
38916
+ },
38917
+ canRecognizeWith: function(otherRecognizer) {
38918
+ return !!this.simultaneous[otherRecognizer.id];
38919
+ },
38920
+ emit: function(input) {
38921
+ var self2 = this;
38922
+ var state = this.state;
38923
+ function emit(event) {
38924
+ self2.manager.emit(event, input);
38925
+ }
38926
+ if (state < STATE_ENDED) {
38927
+ emit(self2.options.event + stateStr(state));
38928
+ }
38929
+ emit(self2.options.event);
38930
+ if (input.additionalEvent) {
38931
+ emit(input.additionalEvent);
38932
+ }
38933
+ if (state >= STATE_ENDED) {
38934
+ emit(self2.options.event + stateStr(state));
38935
+ }
38936
+ },
38937
+ tryEmit: function(input) {
38938
+ if (this.canEmit()) {
38939
+ return this.emit(input);
38940
+ }
38941
+ this.state = STATE_FAILED;
38942
+ },
38943
+ canEmit: function() {
38944
+ var i = 0;
38945
+ while (i < this.requireFail.length) {
38946
+ if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {
38947
+ return false;
38948
+ }
38949
+ i++;
38950
+ }
38951
+ return true;
38952
+ },
38953
+ recognize: function(inputData) {
38954
+ var inputDataClone = assign2({}, inputData);
38955
+ if (!boolOrFn(this.options.enable, [this, inputDataClone])) {
38956
+ this.reset();
38957
+ this.state = STATE_FAILED;
38958
+ return;
38959
+ }
38960
+ if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {
38961
+ this.state = STATE_POSSIBLE;
38962
+ }
38963
+ this.state = this.process(inputDataClone);
38964
+ if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {
38965
+ this.tryEmit(inputDataClone);
38966
+ }
38967
+ },
38968
+ process: function(inputData) {
38969
+ },
38970
+ getTouchAction: function() {
38971
+ },
38972
+ reset: function() {
38973
+ }
38974
+ };
38975
+ function stateStr(state) {
38976
+ if (state & STATE_CANCELLED) {
38977
+ return "cancel";
38978
+ } else if (state & STATE_ENDED) {
38979
+ return "end";
38980
+ } else if (state & STATE_CHANGED) {
38981
+ return "move";
38982
+ } else if (state & STATE_BEGAN) {
38983
+ return "start";
38984
+ }
38985
+ return "";
38986
+ }
38987
+ function directionStr(direction) {
38988
+ if (direction == DIRECTION_DOWN) {
38989
+ return "down";
38990
+ } else if (direction == DIRECTION_UP) {
38991
+ return "up";
38992
+ } else if (direction == DIRECTION_LEFT) {
38993
+ return "left";
38994
+ } else if (direction == DIRECTION_RIGHT) {
38995
+ return "right";
38996
+ }
38997
+ return "";
38998
+ }
38999
+ function getRecognizerByNameIfManager(otherRecognizer, recognizer) {
39000
+ var manager = recognizer.manager;
39001
+ if (manager) {
39002
+ return manager.get(otherRecognizer);
39003
+ }
39004
+ return otherRecognizer;
39005
+ }
39006
+ function AttrRecognizer() {
39007
+ Recognizer.apply(this, arguments);
39008
+ }
39009
+ inherit(AttrRecognizer, Recognizer, {
39010
+ defaults: {
39011
+ pointers: 1
39012
+ },
39013
+ attrTest: function(input) {
39014
+ var optionPointers = this.options.pointers;
39015
+ return optionPointers === 0 || input.pointers.length === optionPointers;
39016
+ },
39017
+ process: function(input) {
39018
+ var state = this.state;
39019
+ var eventType = input.eventType;
39020
+ var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);
39021
+ var isValid = this.attrTest(input);
39022
+ if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {
39023
+ return state | STATE_CANCELLED;
39024
+ } else if (isRecognized || isValid) {
39025
+ if (eventType & INPUT_END) {
39026
+ return state | STATE_ENDED;
39027
+ } else if (!(state & STATE_BEGAN)) {
39028
+ return STATE_BEGAN;
39029
+ }
39030
+ return state | STATE_CHANGED;
39031
+ }
39032
+ return STATE_FAILED;
39033
+ }
39034
+ });
39035
+ function PanRecognizer() {
39036
+ AttrRecognizer.apply(this, arguments);
39037
+ this.pX = null;
39038
+ this.pY = null;
39039
+ }
39040
+ inherit(PanRecognizer, AttrRecognizer, {
39041
+ defaults: {
39042
+ event: "pan",
39043
+ threshold: 10,
39044
+ pointers: 1,
39045
+ direction: DIRECTION_ALL
39046
+ },
39047
+ getTouchAction: function() {
39048
+ var direction = this.options.direction;
39049
+ var actions = [];
39050
+ if (direction & DIRECTION_HORIZONTAL) {
39051
+ actions.push(TOUCH_ACTION_PAN_Y);
39052
+ }
39053
+ if (direction & DIRECTION_VERTICAL) {
39054
+ actions.push(TOUCH_ACTION_PAN_X);
39055
+ }
39056
+ return actions;
39057
+ },
39058
+ directionTest: function(input) {
39059
+ var options = this.options;
39060
+ var hasMoved = true;
39061
+ var distance = input.distance;
39062
+ var direction = input.direction;
39063
+ var x = input.deltaX;
39064
+ var y2 = input.deltaY;
39065
+ if (!(direction & options.direction)) {
39066
+ if (options.direction & DIRECTION_HORIZONTAL) {
39067
+ direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
39068
+ hasMoved = x != this.pX;
39069
+ distance = Math.abs(input.deltaX);
39070
+ } else {
39071
+ direction = y2 === 0 ? DIRECTION_NONE : y2 < 0 ? DIRECTION_UP : DIRECTION_DOWN;
39072
+ hasMoved = y2 != this.pY;
39073
+ distance = Math.abs(input.deltaY);
39074
+ }
39075
+ }
39076
+ input.direction = direction;
39077
+ return hasMoved && distance > options.threshold && direction & options.direction;
39078
+ },
39079
+ attrTest: function(input) {
39080
+ return AttrRecognizer.prototype.attrTest.call(this, input) && (this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input));
39081
+ },
39082
+ emit: function(input) {
39083
+ this.pX = input.deltaX;
39084
+ this.pY = input.deltaY;
39085
+ var direction = directionStr(input.direction);
39086
+ if (direction) {
39087
+ input.additionalEvent = this.options.event + direction;
39088
+ }
39089
+ this._super.emit.call(this, input);
39090
+ }
39091
+ });
39092
+ function PinchRecognizer() {
39093
+ AttrRecognizer.apply(this, arguments);
39094
+ }
39095
+ inherit(PinchRecognizer, AttrRecognizer, {
39096
+ defaults: {
39097
+ event: "pinch",
39098
+ threshold: 0,
39099
+ pointers: 2
39100
+ },
39101
+ getTouchAction: function() {
39102
+ return [TOUCH_ACTION_NONE];
39103
+ },
39104
+ attrTest: function(input) {
39105
+ return this._super.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);
39106
+ },
39107
+ emit: function(input) {
39108
+ if (input.scale !== 1) {
39109
+ var inOut = input.scale < 1 ? "in" : "out";
39110
+ input.additionalEvent = this.options.event + inOut;
39111
+ }
39112
+ this._super.emit.call(this, input);
39113
+ }
39114
+ });
39115
+ function PressRecognizer() {
39116
+ Recognizer.apply(this, arguments);
39117
+ this._timer = null;
39118
+ this._input = null;
39119
+ }
39120
+ inherit(PressRecognizer, Recognizer, {
39121
+ defaults: {
39122
+ event: "press",
39123
+ pointers: 1,
39124
+ time: 251,
39125
+ threshold: 9
39126
+ },
39127
+ getTouchAction: function() {
39128
+ return [TOUCH_ACTION_AUTO];
39129
+ },
39130
+ process: function(input) {
39131
+ var options = this.options;
39132
+ var validPointers = input.pointers.length === options.pointers;
39133
+ var validMovement = input.distance < options.threshold;
39134
+ var validTime = input.deltaTime > options.time;
39135
+ this._input = input;
39136
+ if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) {
39137
+ this.reset();
39138
+ } else if (input.eventType & INPUT_START) {
39139
+ this.reset();
39140
+ this._timer = setTimeoutContext(function() {
39141
+ this.state = STATE_RECOGNIZED;
39142
+ this.tryEmit();
39143
+ }, options.time, this);
39144
+ } else if (input.eventType & INPUT_END) {
39145
+ return STATE_RECOGNIZED;
39146
+ }
39147
+ return STATE_FAILED;
39148
+ },
39149
+ reset: function() {
39150
+ clearTimeout(this._timer);
39151
+ },
39152
+ emit: function(input) {
39153
+ if (this.state !== STATE_RECOGNIZED) {
39154
+ return;
39155
+ }
39156
+ if (input && input.eventType & INPUT_END) {
39157
+ this.manager.emit(this.options.event + "up", input);
39158
+ } else {
39159
+ this._input.timeStamp = now2();
39160
+ this.manager.emit(this.options.event, this._input);
39161
+ }
39162
+ }
39163
+ });
39164
+ function RotateRecognizer() {
39165
+ AttrRecognizer.apply(this, arguments);
39166
+ }
39167
+ inherit(RotateRecognizer, AttrRecognizer, {
39168
+ defaults: {
39169
+ event: "rotate",
39170
+ threshold: 0,
39171
+ pointers: 2
39172
+ },
39173
+ getTouchAction: function() {
39174
+ return [TOUCH_ACTION_NONE];
39175
+ },
39176
+ attrTest: function(input) {
39177
+ return this._super.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);
39178
+ }
39179
+ });
39180
+ function SwipeRecognizer() {
39181
+ AttrRecognizer.apply(this, arguments);
39182
+ }
39183
+ inherit(SwipeRecognizer, AttrRecognizer, {
39184
+ defaults: {
39185
+ event: "swipe",
39186
+ threshold: 10,
39187
+ velocity: 0.3,
39188
+ direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,
39189
+ pointers: 1
39190
+ },
39191
+ getTouchAction: function() {
39192
+ return PanRecognizer.prototype.getTouchAction.call(this);
39193
+ },
39194
+ attrTest: function(input) {
39195
+ var direction = this.options.direction;
39196
+ var velocity;
39197
+ if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {
39198
+ velocity = input.overallVelocity;
39199
+ } else if (direction & DIRECTION_HORIZONTAL) {
39200
+ velocity = input.overallVelocityX;
39201
+ } else if (direction & DIRECTION_VERTICAL) {
39202
+ velocity = input.overallVelocityY;
39203
+ }
39204
+ return this._super.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers == this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END;
39205
+ },
39206
+ emit: function(input) {
39207
+ var direction = directionStr(input.offsetDirection);
39208
+ if (direction) {
39209
+ this.manager.emit(this.options.event + direction, input);
39210
+ }
39211
+ this.manager.emit(this.options.event, input);
39212
+ }
39213
+ });
39214
+ function TapRecognizer() {
39215
+ Recognizer.apply(this, arguments);
39216
+ this.pTime = false;
39217
+ this.pCenter = false;
39218
+ this._timer = null;
39219
+ this._input = null;
39220
+ this.count = 0;
39221
+ }
39222
+ inherit(TapRecognizer, Recognizer, {
39223
+ defaults: {
39224
+ event: "tap",
39225
+ pointers: 1,
39226
+ taps: 1,
39227
+ interval: 300,
39228
+ time: 250,
39229
+ threshold: 9,
39230
+ posThreshold: 10
39231
+ },
39232
+ getTouchAction: function() {
39233
+ return [TOUCH_ACTION_MANIPULATION];
39234
+ },
39235
+ process: function(input) {
39236
+ var options = this.options;
39237
+ var validPointers = input.pointers.length === options.pointers;
39238
+ var validMovement = input.distance < options.threshold;
39239
+ var validTouchTime = input.deltaTime < options.time;
39240
+ this.reset();
39241
+ if (input.eventType & INPUT_START && this.count === 0) {
39242
+ return this.failTimeout();
39243
+ }
39244
+ if (validMovement && validTouchTime && validPointers) {
39245
+ if (input.eventType != INPUT_END) {
39246
+ return this.failTimeout();
39247
+ }
39248
+ var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true;
39249
+ var validMultiTap = !this.pCenter || getDistance2(this.pCenter, input.center) < options.posThreshold;
39250
+ this.pTime = input.timeStamp;
39251
+ this.pCenter = input.center;
39252
+ if (!validMultiTap || !validInterval) {
39253
+ this.count = 1;
39254
+ } else {
39255
+ this.count += 1;
39256
+ }
39257
+ this._input = input;
39258
+ var tapCount = this.count % options.taps;
39259
+ if (tapCount === 0) {
39260
+ if (!this.hasRequireFailures()) {
39261
+ return STATE_RECOGNIZED;
39262
+ } else {
39263
+ this._timer = setTimeoutContext(function() {
39264
+ this.state = STATE_RECOGNIZED;
39265
+ this.tryEmit();
39266
+ }, options.interval, this);
39267
+ return STATE_BEGAN;
39268
+ }
39269
+ }
39270
+ }
39271
+ return STATE_FAILED;
39272
+ },
39273
+ failTimeout: function() {
39274
+ this._timer = setTimeoutContext(function() {
39275
+ this.state = STATE_FAILED;
39276
+ }, this.options.interval, this);
39277
+ return STATE_FAILED;
39278
+ },
39279
+ reset: function() {
39280
+ clearTimeout(this._timer);
39281
+ },
39282
+ emit: function() {
39283
+ if (this.state == STATE_RECOGNIZED) {
39284
+ this._input.tapCount = this.count;
39285
+ this.manager.emit(this.options.event, this._input);
39286
+ }
39287
+ }
39288
+ });
39289
+ function Hammer2(element2, options) {
39290
+ options = options || {};
39291
+ options.recognizers = ifUndefined(options.recognizers, Hammer2.defaults.preset);
39292
+ return new Manager(element2, options);
39293
+ }
39294
+ Hammer2.VERSION = "2.0.7";
39295
+ Hammer2.defaults = {
39296
+ domEvents: false,
39297
+ touchAction: TOUCH_ACTION_COMPUTE,
39298
+ enable: true,
39299
+ inputTarget: null,
39300
+ inputClass: null,
39301
+ preset: [
39302
+ [RotateRecognizer, { enable: false }],
39303
+ [PinchRecognizer, { enable: false }, ["rotate"]],
39304
+ [SwipeRecognizer, { direction: DIRECTION_HORIZONTAL }],
39305
+ [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ["swipe"]],
39306
+ [TapRecognizer],
39307
+ [TapRecognizer, { event: "doubletap", taps: 2 }, ["tap"]],
39308
+ [PressRecognizer]
39309
+ ],
39310
+ cssProps: {
39311
+ userSelect: "none",
39312
+ touchSelect: "none",
39313
+ touchCallout: "none",
39314
+ contentZooming: "none",
39315
+ userDrag: "none",
39316
+ tapHighlightColor: "rgba(0,0,0,0)"
39317
+ }
39318
+ };
39319
+ var STOP = 1;
39320
+ var FORCED_STOP = 2;
39321
+ function Manager(element2, options) {
39322
+ this.options = assign2({}, Hammer2.defaults, options || {});
39323
+ this.options.inputTarget = this.options.inputTarget || element2;
39324
+ this.handlers = {};
39325
+ this.session = {};
39326
+ this.recognizers = [];
39327
+ this.oldCssProps = {};
39328
+ this.element = element2;
39329
+ this.input = createInputInstance(this);
39330
+ this.touchAction = new TouchAction(this, this.options.touchAction);
39331
+ toggleCssProps(this, true);
39332
+ each(this.options.recognizers, function(item) {
39333
+ var recognizer = this.add(new item[0](item[1]));
39334
+ item[2] && recognizer.recognizeWith(item[2]);
39335
+ item[3] && recognizer.requireFailure(item[3]);
39336
+ }, this);
39337
+ }
39338
+ Manager.prototype = {
39339
+ set: function(options) {
39340
+ assign2(this.options, options);
39341
+ if (options.touchAction) {
39342
+ this.touchAction.update();
39343
+ }
39344
+ if (options.inputTarget) {
39345
+ this.input.destroy();
39346
+ this.input.target = options.inputTarget;
39347
+ this.input.init();
39348
+ }
39349
+ return this;
39350
+ },
39351
+ stop: function(force) {
39352
+ this.session.stopped = force ? FORCED_STOP : STOP;
39353
+ },
39354
+ recognize: function(inputData) {
39355
+ var session = this.session;
39356
+ if (session.stopped) {
39357
+ return;
39358
+ }
39359
+ this.touchAction.preventDefaults(inputData);
39360
+ var recognizer;
39361
+ var recognizers = this.recognizers;
39362
+ var curRecognizer = session.curRecognizer;
39363
+ if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) {
39364
+ curRecognizer = session.curRecognizer = null;
39365
+ }
39366
+ var i = 0;
39367
+ while (i < recognizers.length) {
39368
+ recognizer = recognizers[i];
39369
+ if (session.stopped !== FORCED_STOP && (!curRecognizer || recognizer == curRecognizer || recognizer.canRecognizeWith(curRecognizer))) {
39370
+ recognizer.recognize(inputData);
39371
+ } else {
39372
+ recognizer.reset();
39373
+ }
39374
+ if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {
39375
+ curRecognizer = session.curRecognizer = recognizer;
39376
+ }
39377
+ i++;
39378
+ }
39379
+ },
39380
+ get: function(recognizer) {
39381
+ if (recognizer instanceof Recognizer) {
39382
+ return recognizer;
39383
+ }
39384
+ var recognizers = this.recognizers;
39385
+ for (var i = 0; i < recognizers.length; i++) {
39386
+ if (recognizers[i].options.event == recognizer) {
39387
+ return recognizers[i];
39388
+ }
39389
+ }
39390
+ return null;
39391
+ },
39392
+ add: function(recognizer) {
39393
+ if (invokeArrayArg(recognizer, "add", this)) {
39394
+ return this;
39395
+ }
39396
+ var existing = this.get(recognizer.options.event);
39397
+ if (existing) {
39398
+ this.remove(existing);
39399
+ }
39400
+ this.recognizers.push(recognizer);
39401
+ recognizer.manager = this;
39402
+ this.touchAction.update();
39403
+ return recognizer;
39404
+ },
39405
+ remove: function(recognizer) {
39406
+ if (invokeArrayArg(recognizer, "remove", this)) {
39407
+ return this;
39408
+ }
39409
+ recognizer = this.get(recognizer);
39410
+ if (recognizer) {
39411
+ var recognizers = this.recognizers;
39412
+ var index = inArray(recognizers, recognizer);
39413
+ if (index !== -1) {
39414
+ recognizers.splice(index, 1);
39415
+ this.touchAction.update();
39416
+ }
39417
+ }
39418
+ return this;
39419
+ },
39420
+ on: function(events, handler) {
39421
+ if (events === undefined$1) {
39422
+ return;
39423
+ }
39424
+ if (handler === undefined$1) {
39425
+ return;
39426
+ }
39427
+ var handlers = this.handlers;
39428
+ each(splitStr(events), function(event) {
39429
+ handlers[event] = handlers[event] || [];
39430
+ handlers[event].push(handler);
39431
+ });
39432
+ return this;
39433
+ },
39434
+ off: function(events, handler) {
39435
+ if (events === undefined$1) {
39436
+ return;
39437
+ }
39438
+ var handlers = this.handlers;
39439
+ each(splitStr(events), function(event) {
39440
+ if (!handler) {
39441
+ delete handlers[event];
39442
+ } else {
39443
+ handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);
39444
+ }
39445
+ });
39446
+ return this;
39447
+ },
39448
+ emit: function(event, data) {
39449
+ if (this.options.domEvents) {
39450
+ triggerDomEvent(event, data);
39451
+ }
39452
+ var handlers = this.handlers[event] && this.handlers[event].slice();
39453
+ if (!handlers || !handlers.length) {
39454
+ return;
39455
+ }
39456
+ data.type = event;
39457
+ data.preventDefault = function() {
39458
+ data.srcEvent.preventDefault();
39459
+ };
39460
+ var i = 0;
39461
+ while (i < handlers.length) {
39462
+ handlers[i](data);
39463
+ i++;
39464
+ }
39465
+ },
39466
+ destroy: function() {
39467
+ this.element && toggleCssProps(this, false);
39468
+ this.handlers = {};
39469
+ this.session = {};
39470
+ this.input.destroy();
39471
+ this.element = null;
39472
+ }
39473
+ };
39474
+ function toggleCssProps(manager, add2) {
39475
+ var element2 = manager.element;
39476
+ if (!element2.style) {
39477
+ return;
39478
+ }
39479
+ var prop;
39480
+ each(manager.options.cssProps, function(value, name) {
39481
+ prop = prefixed(element2.style, name);
39482
+ if (add2) {
39483
+ manager.oldCssProps[prop] = element2.style[prop];
39484
+ element2.style[prop] = value;
39485
+ } else {
39486
+ element2.style[prop] = manager.oldCssProps[prop] || "";
39487
+ }
39488
+ });
39489
+ if (!add2) {
39490
+ manager.oldCssProps = {};
39491
+ }
39492
+ }
39493
+ function triggerDomEvent(event, data) {
39494
+ var gestureEvent = document2.createEvent("Event");
39495
+ gestureEvent.initEvent(event, true, true);
39496
+ gestureEvent.gesture = data;
39497
+ data.target.dispatchEvent(gestureEvent);
39498
+ }
39499
+ assign2(Hammer2, {
39500
+ INPUT_START,
39501
+ INPUT_MOVE,
39502
+ INPUT_END,
39503
+ INPUT_CANCEL,
39504
+ STATE_POSSIBLE,
39505
+ STATE_BEGAN,
39506
+ STATE_CHANGED,
39507
+ STATE_ENDED,
39508
+ STATE_RECOGNIZED,
39509
+ STATE_CANCELLED,
39510
+ STATE_FAILED,
39511
+ DIRECTION_NONE,
39512
+ DIRECTION_LEFT,
39513
+ DIRECTION_RIGHT,
39514
+ DIRECTION_UP,
39515
+ DIRECTION_DOWN,
39516
+ DIRECTION_HORIZONTAL,
39517
+ DIRECTION_VERTICAL,
39518
+ DIRECTION_ALL,
39519
+ Manager,
39520
+ Input,
39521
+ TouchAction,
39522
+ TouchInput,
39523
+ MouseInput,
39524
+ PointerEventInput,
39525
+ TouchMouseInput,
39526
+ SingleTouchInput,
39527
+ Recognizer,
39528
+ AttrRecognizer,
39529
+ Tap: TapRecognizer,
39530
+ Pan: PanRecognizer,
39531
+ Swipe: SwipeRecognizer,
39532
+ Pinch: PinchRecognizer,
39533
+ Rotate: RotateRecognizer,
39534
+ Press: PressRecognizer,
39535
+ on: addEventListeners,
39536
+ off: removeEventListeners,
39537
+ each,
39538
+ merge,
39539
+ extend,
39540
+ assign: assign2,
39541
+ inherit,
39542
+ bindFn,
39543
+ prefixed
39544
+ });
39545
+ var freeGlobal = typeof window2 !== "undefined" ? window2 : typeof self !== "undefined" ? self : {};
39546
+ freeGlobal.Hammer = Hammer2;
39547
+ if (typeof undefined$1 === "function" && undefined$1.amd) {
39548
+ undefined$1(function() {
39549
+ return Hammer2;
39550
+ });
39551
+ } else if (module.exports) {
39552
+ module.exports = Hammer2;
39553
+ } else {
39554
+ window2[exportName] = Hammer2;
37779
39555
  }
39556
+ })(window, document, "Hammer");
39557
+ })(hammer);
39558
+ var Hammer = hammer.exports;
39559
+ function S4() {
39560
+ return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
39561
+ }
39562
+ function uuid() {
39563
+ return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0, 3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
39564
+ }
39565
+ class Polyline {
39566
+ constructor() {
39567
+ __publicField(this, "id", uuid());
39568
+ __publicField(this, "points", []);
39569
+ __publicField(this, "lines", []);
39570
+ }
39571
+ push(line) {
39572
+ const next = this.getNext(line);
39573
+ if (!next)
39574
+ throw new Error("\u5F53\u524D\u7EBF\u6BB5\u4E8E\u4E0A\u4E00\u6761\u7EBF\u6BB5\u65E0\u6CD5\u6784\u6210\u6298\u7EBF");
39575
+ this.lines.push(next.line);
39576
+ this.points.push(...next.points);
39577
+ return this.lines.length;
39578
+ }
39579
+ pop() {
39580
+ const lastPoint = this.lines.pop();
39581
+ const polylineLength = this.lines.length;
39582
+ if (polylineLength === 0)
39583
+ this.points.slice(0, this.points.length);
39584
+ else
39585
+ this.points.pop();
39586
+ return lastPoint;
39587
+ }
39588
+ getNext(line) {
39589
+ const lastPoint = this.points.slice(-1)[0];
39590
+ if (!lastPoint)
39591
+ return { line, points: line.points };
39592
+ if (!line.points.includes(lastPoint))
39593
+ return null;
39594
+ const nextPoint = line.points.find((point) => point !== lastPoint);
39595
+ if (!nextPoint)
39596
+ return null;
39597
+ return { line, points: [nextPoint] };
39598
+ }
39599
+ toJson() {
39600
+ return {
39601
+ id: this.id,
39602
+ lines: this.lines.map((line) => line.id),
39603
+ points: this.points.map((point) => point.id)
39604
+ };
37780
39605
  }
37781
- fixPosition(panoIndex) {
37782
- if (!this.compassMesh)
39606
+ toCompletelyJson() {
39607
+ return {
39608
+ id: this.id,
39609
+ points: this.points.map((point) => point.toJson()),
39610
+ lines: this.lines.map((line) => line.toCompletelyJson())
39611
+ };
39612
+ }
39613
+ }
39614
+ const lineWidth = 2;
39615
+ const lightLineWidth = 4;
39616
+ const lineColor = new Color$1(16777215);
39617
+ const lightLineColor = new Color$1(2981119);
39618
+ const pointColor = new Color$1(16777215);
39619
+ const lightPointColor = new Color$1(2981119);
39620
+ const pointSize = 8;
39621
+ const lightPointSize = 16;
39622
+ const pointImage = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAIVBMVEUAAAD////////////////////////////////////////PIev5AAAACnRSTlMAG/Py2baba05un7UgfgAAAHJJREFUKM9joBpgLHVSCRdA4metAoJlCJHmVWBgAeNzroKCCVCBLpjACqgJVjCBxRBT2FbBQQJYQAohsBAsUIUQWA4WiEIILAULeCEEloAFtBACizAEMLRgGIphLabDMJ2O6TlM72MGECIIMQIZIxqoBQCPvpJ/e9FaAAAAAABJRU5ErkJggg==";
39623
+ const pointTexture = new TextureLoader$1().load(pointImage);
39624
+ const normalLineOpts = {
39625
+ pointTexture,
39626
+ pointSize,
39627
+ lineWidth,
39628
+ lineColor,
39629
+ pointColor,
39630
+ lineRenderOrder: 20,
39631
+ pointsRenderOrder: 20
39632
+ };
39633
+ Object.assign({}, normalLineOpts, { dashed: true });
39634
+ const lightLineOpts = {
39635
+ pointTexture,
39636
+ pointSize: lightPointSize,
39637
+ lineWidth: lightLineWidth,
39638
+ lineColor: lightLineColor,
39639
+ pointColor: lightPointColor,
39640
+ lineRenderOrder: 10,
39641
+ pointsRenderOrder: 10
39642
+ };
39643
+ function creatLine(start, end, opts) {
39644
+ var _a, _b, _c, _d, _e;
39645
+ const lineWidth2 = (_a = opts == null ? void 0 : opts.lineWidth) != null ? _a : 2;
39646
+ const lineColor2 = (_b = opts == null ? void 0 : opts.lineColor) != null ? _b : new Color$1(16777215);
39647
+ const pointSize2 = (_c = opts == null ? void 0 : opts.pointSize) != null ? _c : 5;
39648
+ const lineRenderOrder = (_d = opts == null ? void 0 : opts.lineRenderOrder) != null ? _d : 10;
39649
+ const pointsRenderOrder = (_e = opts == null ? void 0 : opts.lineRenderOrder) != null ? _e : 20;
39650
+ const line = new Line$2(start, end);
39651
+ line.setMaterial({ linewidth: lineWidth2, color: lineColor2 });
39652
+ line.line.material.depthTest = false;
39653
+ line.line.material.transparent = true;
39654
+ line.line.renderOrder = lineRenderOrder;
39655
+ line.points.renderOrder = pointsRenderOrder;
39656
+ const pointMaterial = line.points.material;
39657
+ pointMaterial.depthTest = false;
39658
+ pointMaterial.size = pointSize2;
39659
+ (opts == null ? void 0 : opts.pointColor) && pointMaterial.color.set(opts.pointColor).convertSRGBToLinear();
39660
+ if (opts == null ? void 0 : opts.pointTexture)
39661
+ pointMaterial.map = opts.pointTexture;
39662
+ return line;
39663
+ }
39664
+ function creatLineMesh(line, type) {
39665
+ const [point, anotherPoint] = line.points;
39666
+ const opts = type === "light" ? lightLineOpts : normalLineOpts;
39667
+ const fiveLine = creatLine(point.position, anotherPoint.position, opts);
39668
+ fiveLine.name = "normalLine_" + line.id;
39669
+ return fiveLine;
39670
+ }
39671
+ function isNDCPointInScreen(ndcPoint) {
39672
+ const { x, y: y2, z } = ndcPoint;
39673
+ if (Math.abs(x) > 1 || Math.abs(y2) > 1 || Math.abs(z) > 1)
39674
+ return false;
39675
+ return true;
39676
+ }
39677
+ function creatContentDom() {
39678
+ const contentDom = document.createElement("div");
39679
+ contentDom.style.height = "24px";
39680
+ contentDom.style.width = "62px";
39681
+ contentDom.style.lineHeight = "24px";
39682
+ contentDom.style.textAlign = "center";
39683
+ contentDom.style.transform = "translate(-50%, -50%)";
39684
+ contentDom.style.borderRadius = "12px";
39685
+ contentDom.style.fontSize = "14px";
39686
+ contentDom.style.color = "#000000";
39687
+ contentDom.style.background = "#fff";
39688
+ contentDom.style.pointerEvents = "all";
39689
+ contentDom.style.cursor = "pointer";
39690
+ return contentDom;
39691
+ }
39692
+ function createContainerDom(line) {
39693
+ const containerDom = document.createElement("div");
39694
+ containerDom.id = "distance_" + line.id;
39695
+ containerDom.classList.add("five-plugin-measure__distance");
39696
+ containerDom.style.opacity = "0";
39697
+ containerDom.style.position = "absolute";
39698
+ containerDom.style.left = "0";
39699
+ containerDom.style.top = "0";
39700
+ containerDom.style.transform = "translate3d(0, 0, 0)";
39701
+ return containerDom;
39702
+ }
39703
+ function creatDistanceItem(props) {
39704
+ function handleClick() {
39705
+ var _a;
39706
+ highlight();
39707
+ (_a = props.clickCallback) == null ? void 0 : _a.call(props, distanceItem);
39708
+ }
39709
+ function highlight() {
39710
+ if (userDistanceItem)
39711
+ return userDistanceItem.highlight();
39712
+ contentDom.style.border = "1px solid #538FFF";
39713
+ contentDom.style.color = "#538FFF";
39714
+ }
39715
+ function unHighlight() {
39716
+ if (userDistanceItem)
39717
+ return userDistanceItem.unHighlight();
39718
+ contentDom.style.border = "none";
39719
+ contentDom.style.color = "#000";
39720
+ }
39721
+ function update2(five) {
39722
+ const fiveElement = five.getElement();
39723
+ if (!fiveElement)
39724
+ return;
39725
+ const screenWidth = fiveElement.clientWidth;
39726
+ const screenHeight = fiveElement.clientHeight;
39727
+ if (line.points.length < 2)
37783
39728
  return;
37784
- const standingPosition = this.five.work.observers[panoIndex].standingPosition;
37785
- const compassPosition = standingPosition.clone().add(new THREE.Vector3(0, 0.01, 0));
37786
- this.compassMesh.position.copy(compassPosition);
39729
+ const [startPoint, endPoint] = line.points;
39730
+ const ndcStartPosition = startPoint.position.clone().project(five.camera);
39731
+ const ndcEndPosition = endPoint.position.clone().project(five.camera);
39732
+ const ndcDomPosition = ndcStartPosition.clone().lerp(ndcEndPosition, 0.5);
39733
+ const visible = (() => {
39734
+ if (Math.abs(ndcStartPosition.z) > 1 || Math.abs(ndcEndPosition.z) > 1)
39735
+ return false;
39736
+ if (!isNDCPointInScreen(ndcStartPosition) && !isNDCPointInScreen(ndcEndPosition))
39737
+ return false;
39738
+ if (!isNDCPointInScreen(ndcDomPosition))
39739
+ return false;
39740
+ const screenStartPosition = new Vector2$1(ndcStartPosition.x * screenWidth, ndcStartPosition.y * screenHeight);
39741
+ const screenEndPosition = new Vector2$1(ndcEndPosition.x * screenWidth, ndcEndPosition.y * screenHeight);
39742
+ if (screenStartPosition.distanceTo(screenEndPosition) < 20)
39743
+ return false;
39744
+ return true;
39745
+ })();
39746
+ if (visible === false) {
39747
+ containerDom.style.opacity = "0";
39748
+ containerDom.style.pointerEvents = "none";
39749
+ return;
39750
+ }
39751
+ const left = (ndcDomPosition.x + 1) / 2 * screenWidth;
39752
+ const top = -(ndcDomPosition.y - 1) / 2 * screenHeight;
39753
+ containerDom.style.transform = `translate3d(${left}px, ${top}px, 10px)`;
39754
+ containerDom.style.opacity = "1";
39755
+ containerDom.style.pointerEvents = "all";
39756
+ if (userDistanceItem) {
39757
+ userDistanceItem.update({ line: line.toCompletelyJson(), polyline: line.getPolyline().toCompletelyJson() });
39758
+ }
39759
+ const distanceString = startPoint.position.clone().distanceTo(endPoint.position).toFixed(2) + "m";
39760
+ contentDom.innerText !== distanceString && (contentDom.innerText = distanceString);
39761
+ }
39762
+ function appendTo(container) {
39763
+ container.appendChild(containerDom);
39764
+ containerDom.addEventListener("click", handleClick);
39765
+ }
39766
+ function remove2() {
39767
+ contentDom.removeEventListener("click", handleClick);
39768
+ containerDom.remove();
39769
+ }
39770
+ const { line } = props;
39771
+ const lineID = line.id;
39772
+ const contentDom = creatContentDom();
39773
+ const containerDom = createContainerDom(line);
39774
+ const userDistanceItem = props.userDistanceItem;
39775
+ const ndcPosition = new Vector3$1(0, 0, 0);
39776
+ const distanceItem = {
39777
+ lineID,
39778
+ ndcPosition,
39779
+ update: update2,
39780
+ appendTo,
39781
+ remove: remove2,
39782
+ highlight,
39783
+ unHighlight
39784
+ };
39785
+ (userDistanceItem == null ? void 0 : userDistanceItem.element) ? containerDom.appendChild(userDistanceItem.element) : containerDom.appendChild(contentDom);
39786
+ return distanceItem;
39787
+ }
39788
+ class Line {
39789
+ constructor(point, anotherPoint, model) {
39790
+ __publicField(this, "id");
39791
+ __publicField(this, "selected", false);
39792
+ __publicField(this, "type", "line");
39793
+ __publicField(this, "model");
39794
+ __publicField(this, "mesh");
39795
+ __publicField(this, "points");
39796
+ __publicField(this, "lightMesh");
39797
+ __publicField(this, "hook");
39798
+ __publicField(this, "distanceItem");
39799
+ __publicField(this, "polyline");
39800
+ this.id = uuid();
39801
+ this.model = model;
39802
+ if (point.id === anotherPoint.id)
39803
+ throw new Error("\u65E0\u6548\u7684\u7EBF\u6BB5, \u4E00\u4E2A\u70B9\u65E0\u6CD5\u6784\u6210\u7EBF\u6BB5");
39804
+ this.hook = new Subscribe();
39805
+ this.points = [point, anotherPoint];
39806
+ this.mesh = creatLineMesh(this, "normal");
39807
+ this.lightMesh = creatLineMesh(this, "light");
39808
+ this.distanceItem = creatDistanceItem({
39809
+ line: this,
39810
+ clickCallback: () => this.hook.emit("selected", this),
39811
+ userDistanceItem: this.model.params.userDistanceItemCreator ? this.model.params.userDistanceItemCreator() : void 0
39812
+ });
39813
+ point.lines.push(this);
39814
+ anotherPoint.lines.push(this);
39815
+ }
39816
+ clear() {
39817
+ this.selected = false;
39818
+ this.polyline = void 0;
39819
+ }
39820
+ getPolyline() {
39821
+ if (this.polyline)
39822
+ return this.polyline;
39823
+ const modelPolyline = this.model.polylines.find((polyline2) => polyline2.lines.includes(this));
39824
+ this.polyline = modelPolyline;
39825
+ if (modelPolyline)
39826
+ return modelPolyline;
39827
+ const polyline = new Polyline();
39828
+ polyline.push(this);
39829
+ return polyline;
39830
+ }
39831
+ findAnotherPoint(point) {
39832
+ return this.points.find(({ id }) => id !== point.id);
39833
+ }
39834
+ toJson() {
39835
+ return { id: this.id, points: this.points.map(({ id }) => id) };
39836
+ }
39837
+ toCompletelyJson() {
39838
+ return { id: this.id, points: this.points.map((point) => point.toJson()) };
39839
+ }
39840
+ clone() {
39841
+ const line = new Line(this.points[0].clone(), this.points[1].clone(), this.model);
39842
+ return line;
39843
+ }
39844
+ }
39845
+ function removeArrayItem(item, array) {
39846
+ for (let index = 0, len = array.length; index < len; index++) {
39847
+ if (item === array[index])
39848
+ return array.splice(index, 1)[0];
39849
+ }
39850
+ }
39851
+ class Point {
39852
+ constructor(position) {
39853
+ __publicField(this, "id");
39854
+ __publicField(this, "lines");
39855
+ __publicField(this, "position");
39856
+ __publicField(this, "type", "point");
39857
+ this.id = uuid();
39858
+ this.lines = [];
39859
+ this.position = new Vector3$1();
39860
+ position instanceof Vector3$1 ? this.position.copy(position) : this.position.fromArray(position);
39861
+ }
39862
+ toJson() {
39863
+ return { id: this.id, lines: this.lines.map(({ id }) => id), position: this.position.toArray() };
39864
+ }
39865
+ addLine(line) {
39866
+ this.lines.push(line);
39867
+ }
39868
+ removeLine(line) {
39869
+ removeArrayItem(line, this.lines);
39870
+ }
39871
+ clone() {
39872
+ const point = new Point(this.position);
39873
+ return point;
39874
+ }
39875
+ }
39876
+ class Model {
39877
+ constructor(params) {
39878
+ __publicField(this, "lines", []);
39879
+ __publicField(this, "points", []);
39880
+ __publicField(this, "params");
39881
+ __publicField(this, "polylines", []);
39882
+ __publicField(this, "hook", new Subscribe());
39883
+ this.params = params;
39884
+ }
39885
+ addLine(line) {
39886
+ const [startPoint, endPoint] = line.points;
39887
+ if (!startPoint || !endPoint)
39888
+ return this;
39889
+ if (!this.includes(startPoint))
39890
+ this.points.push(startPoint);
39891
+ if (!this.includes(endPoint))
39892
+ this.points.push(endPoint);
39893
+ this.lines.push(line);
39894
+ const lastPolyline = this.polylines.find((polyline) => !!polyline.getNext(line));
39895
+ if (lastPolyline) {
39896
+ lastPolyline.push(line);
39897
+ } else {
39898
+ const polyline = new Polyline();
39899
+ polyline.push(line);
39900
+ this.polylines.push(polyline);
39901
+ }
39902
+ this.hook.emit("lineAdded", line);
39903
+ }
39904
+ removeLineByID(lineID) {
39905
+ const line = this.getLineByID(lineID);
39906
+ if (line)
39907
+ this.removeLine(line);
39908
+ }
39909
+ removeLine(line) {
39910
+ const polyline = this.polylines.find((polyline2) => polyline2.lines.includes(line));
39911
+ if (polyline) {
39912
+ if (polyline.lines.slice(-1)[0] !== line)
39913
+ throw new Error("\u4E0D\u80FD\u4ECE\u4E2D\u95F4\u5220\u9664\u7EBF\u6BB5");
39914
+ polyline.pop();
39915
+ if (polyline.lines.length === 0)
39916
+ removeArrayItem(polyline, this.polylines);
39917
+ }
39918
+ const [point, anotherPoint] = line.points;
39919
+ if (point.lines.length === 0)
39920
+ removeArrayItem(point, this.points);
39921
+ if (anotherPoint.lines.length === 0)
39922
+ removeArrayItem(anotherPoint, this.points);
39923
+ removeArrayItem(line, this.lines);
39924
+ line.clear();
39925
+ this.hook.emit("lineRemoved", line);
39926
+ return this;
39927
+ }
39928
+ mergeModel(model) {
39929
+ model.lines.forEach((line) => this.addLine(line));
39930
+ }
39931
+ includes(item) {
39932
+ if (item.type === "point") {
39933
+ return this.points.find(({ id }) => id === item.id) !== void 0;
39934
+ } else if (item.type === "line") {
39935
+ return this.lines.find(({ id }) => id === item.id) !== void 0;
39936
+ }
39937
+ }
39938
+ getPointByID(id) {
39939
+ return this.points.find(({ id: _id }) => _id === id);
39940
+ }
39941
+ getLineByID(id) {
39942
+ return this.lines.find(({ id: _id }) => _id === id);
39943
+ }
39944
+ getClosestPoint() {
39945
+ }
39946
+ parse(data) {
39947
+ const points = data.points.map(({ id, position }) => {
39948
+ const point = new Point(position);
39949
+ point.id = id;
39950
+ return point;
39951
+ });
39952
+ const lines = data.lines.map((data2) => {
39953
+ const [pointID, anotherPointID] = data2.points;
39954
+ const point = this.getPointByID.call({ points }, pointID);
39955
+ const anotherPoint = this.getPointByID.call({ points }, anotherPointID);
39956
+ if (!point || !anotherPoint)
39957
+ throw new Error("\u7EBF\u4E0A\u7684\u70B9\u4E0D\u5B58\u5728");
39958
+ const line = new Line(point, anotherPoint, this);
39959
+ line.id = data2.id;
39960
+ return line;
39961
+ });
39962
+ const polylines = data.polylines.map((polylineJson) => {
39963
+ const polyline = new Polyline();
39964
+ polylineJson.lines.forEach((lineID) => {
39965
+ const line = lines.find(({ id }) => id === lineID);
39966
+ line && polyline.push(line);
39967
+ });
39968
+ return polyline;
39969
+ });
39970
+ this.points.splice(0, this.points.length, ...points);
39971
+ this.lines.splice(0, this.lines.length, ...lines);
39972
+ this.polylines.splice(0, this.polylines.length, ...polylines);
39973
+ return this;
39974
+ }
39975
+ toJson() {
39976
+ return {
39977
+ points: this.points.map((point) => point.toJson()),
39978
+ lines: this.lines.map((line) => line.toJson()),
39979
+ polylines: this.polylines.map((polyline) => polyline.toJson()).filter((polylines) => polylines.lines.length > 0)
39980
+ };
39981
+ }
39982
+ }
39983
+ const preventDefault = (e) => e.preventDefault();
39984
+ class BaseController {
39985
+ constructor(params) {
39986
+ __publicField(this, "five");
39987
+ __publicField(this, "group");
39988
+ __publicField(this, "model");
39989
+ __publicField(this, "disposed", false);
39990
+ __publicField(this, "mouseGroup");
39991
+ __publicField(this, "container");
39992
+ __publicField(this, "fiveHelper");
39993
+ __publicField(this, "hook");
39994
+ __publicField(this, "magnifier");
39995
+ __publicField(this, "userDistanceItemCreator");
39996
+ __publicField(this, "updateDistanceUI", () => {
39997
+ this.model.lines.forEach((line) => line.distanceItem.update(this.five));
39998
+ });
39999
+ this.five = params.five;
40000
+ this.hook = params.hook;
40001
+ this.model = params.model;
40002
+ this.magnifier = params.magnifier;
40003
+ this.container = params.container;
40004
+ this.fiveHelper = params.fiveHelper;
40005
+ this.userDistanceItemCreator = params.userDistanceItemCreator;
40006
+ this.group = params.group;
40007
+ this.mouseGroup = params.mouseGroup;
40008
+ const fiveElement = this.five.getElement();
40009
+ if (fiveElement) {
40010
+ fiveElement.addEventListener("touchstart", preventDefault);
40011
+ fiveElement.addEventListener("contextmenu", preventDefault);
40012
+ }
40013
+ }
40014
+ removeLine(line) {
40015
+ this.group.remove(line.mesh, line.lightMesh);
40016
+ line.distanceItem.remove();
37787
40017
  this.five.needsRender = true;
37788
40018
  }
37789
- fixRotation(northRad) {
37790
- if (!this.compassMesh)
40019
+ updateMouseGroup(intersection, mesh) {
40020
+ if (!intersection)
40021
+ return this.mouseGroup;
40022
+ const adsorbentPoint = this.fiveHelper.getAdsorbentPoint(intersection);
40023
+ const viewPosition = adsorbentPoint ? adsorbentPoint : intersection.point;
40024
+ this.mouseGroup.position.copy(viewPosition);
40025
+ if (mesh) {
40026
+ this.mouseGroup.quaternion.copy(mesh.quaternion);
40027
+ } else if (intersection.face) {
40028
+ const normal = intersection.face.normal;
40029
+ const positionVector = normal.clone().multiplyScalar(0.05);
40030
+ const position = intersection.point.clone().add(positionVector);
40031
+ const lookAtVector = position.clone().add(positionVector);
40032
+ this.mouseGroup.lookAt(lookAtVector);
40033
+ }
40034
+ return this.mouseGroup;
40035
+ }
40036
+ dispose() {
40037
+ this.disposed = true;
40038
+ this.magnifier.dispose();
40039
+ this.model.lines.forEach((line) => this.removeLine(line));
40040
+ const fiveElement = this.five.getElement();
40041
+ if (fiveElement) {
40042
+ fiveElement.removeEventListener("touchstart", preventDefault);
40043
+ fiveElement.removeEventListener("contextmenu", preventDefault);
40044
+ }
40045
+ }
40046
+ }
40047
+ function getPointFromHammerEvent(event) {
40048
+ const { x: clientX, y: clientY } = event.center;
40049
+ const { clientWidth, clientHeight } = event.target;
40050
+ const clientRect = event.target.getBoundingClientRect();
40051
+ const position = new Vector2$1(clientX, clientY).sub(new Vector2$1(clientRect.left, clientRect.top));
40052
+ const mouse = new Vector2$1(position.x / clientWidth * 2 - 1, -(position.y / clientHeight) * 2 + 1);
40053
+ return { point: position, ndcPoint: mouse };
40054
+ }
40055
+ function getIntersectionFromEvent(five, event) {
40056
+ const mouse = getPointFromHammerEvent(event).ndcPoint;
40057
+ const raycaster = new Raycaster$1();
40058
+ raycaster.setFromCamera(mouse, five.camera);
40059
+ return five.model.intersectRaycaster(raycaster);
40060
+ }
40061
+ class EditController extends BaseController {
40062
+ constructor(params) {
40063
+ super(params);
40064
+ __publicField(this, "type", "edit");
40065
+ __publicField(this, "model", new Model({ userDistanceItemCreator: this.userDistanceItemCreator }));
40066
+ __publicField(this, "pressPoint");
40067
+ __publicField(this, "hasAppendDashed", false);
40068
+ __publicField(this, "hasAppendMouseGroup", false);
40069
+ __publicField(this, "fiveElement");
40070
+ __publicField(this, "lastPoint", null);
40071
+ __publicField(this, "dashed");
40072
+ __publicField(this, "hammer");
40073
+ __publicField(this, "onIntersectionUpdate", throttle((intersection, mesh) => {
40074
+ var _a;
40075
+ if (this.hasAppendMouseGroup === false) {
40076
+ this.group.add(this.mouseGroup);
40077
+ this.magnifier.appendTo(this.container);
40078
+ this.hasAppendMouseGroup = true;
40079
+ }
40080
+ const position = this.updateMouseGroup(intersection, mesh).position;
40081
+ (_a = this.pressPoint) == null ? void 0 : _a.position.copy(position);
40082
+ this.updateDashed();
40083
+ requestAnimationFrame(() => this.magnifier.updateWithPoint(this.mouseGroup.position));
40084
+ this.five.needsRender = true;
40085
+ }, 20));
40086
+ __publicField(this, "revoke", () => {
40087
+ if (this.model.lines.length === 0 && this.lastPoint) {
40088
+ this.lastPoint = null;
40089
+ this.hasAppendDashed = false;
40090
+ this.dashed.distanceItem.remove();
40091
+ this.group.remove(this.dashed.mesh);
40092
+ this.hook.emit("anchorChange", null);
40093
+ this.five.needsRender = true;
40094
+ return;
40095
+ }
40096
+ if (this.model.lines.length === 0 && !this.lastPoint)
40097
+ return;
40098
+ if (!this.lastPoint)
40099
+ return;
40100
+ const revokedLine = this.model.lines[this.model.lines.length - 1];
40101
+ const lastPoint = revokedLine.findAnotherPoint(this.lastPoint);
40102
+ if (!lastPoint)
40103
+ return;
40104
+ this.lastPoint = lastPoint;
40105
+ this.hook.emit("anchorChange", lastPoint.position);
40106
+ this.group.remove(revokedLine.mesh);
40107
+ this.model.removeLine(revokedLine);
40108
+ this.hasAppendMouseGroup = false;
40109
+ this.mouseGroup.position.copy(this.lastPoint.position);
40110
+ this.group.remove(this.mouseGroup);
40111
+ revokedLine.distanceItem.remove();
40112
+ this.updateDashed();
40113
+ this.magnifier.dispose();
40114
+ this.five.needsRender = true;
40115
+ });
40116
+ __publicField(this, "onMouseLeave", () => {
40117
+ this.magnifier.dispose();
40118
+ this.group.remove(this.mouseGroup);
40119
+ this.hasAppendMouseGroup = false;
40120
+ if (this.lastPoint) {
40121
+ this.mouseGroup.position.copy(this.lastPoint.position);
40122
+ this.updateDashed();
40123
+ }
40124
+ });
40125
+ __publicField(this, "onLineChanged", () => {
40126
+ this.hook.emit("editedLineChange", this.model.lines.map((line) => line.toCompletelyJson()));
40127
+ });
40128
+ __publicField(this, "onPress", (e) => {
40129
+ const [intersection] = getIntersectionFromEvent(this.five, e);
40130
+ if (!intersection || !intersection.face)
40131
+ return;
40132
+ const nowPoint = new Point(intersection.point);
40133
+ this.pressPoint = nowPoint;
40134
+ this.onIntersectionUpdate(intersection);
40135
+ });
40136
+ __publicField(this, "onPan", (e) => {
40137
+ if (!this.pressPoint)
40138
+ return;
40139
+ const [intersection] = getIntersectionFromEvent(this.five, e);
40140
+ if (!intersection || !intersection.face)
40141
+ return;
40142
+ this.onIntersectionUpdate(intersection);
40143
+ });
40144
+ __publicField(this, "onPanEnd", (e) => {
40145
+ if (!this.pressPoint)
40146
+ return;
40147
+ this.onTap(e);
40148
+ });
40149
+ __publicField(this, "onTap", (e) => {
40150
+ if (!this.hasAppendDashed) {
40151
+ this.dashed.distanceItem.appendTo(this.container);
40152
+ this.group.add(this.dashed.mesh);
40153
+ }
40154
+ this.hasAppendDashed = true;
40155
+ const [intersection] = getIntersectionFromEvent(this.five, e);
40156
+ this.updateMouseGroup(intersection);
40157
+ const nowPoint = new Point(this.mouseGroup.position);
40158
+ const lastPoint = this.lastPoint;
40159
+ if (nowPoint)
40160
+ this.lastPoint = nowPoint;
40161
+ if (nowPoint && lastPoint) {
40162
+ const line = new Line(lastPoint, nowPoint, this.model);
40163
+ line.distanceItem.appendTo(this.container);
40164
+ this.model.addLine(line);
40165
+ this.group.add(line.mesh);
40166
+ line.distanceItem.update(this.five);
40167
+ }
40168
+ this.pressPoint = void 0;
40169
+ this.hasAppendMouseGroup = false;
40170
+ this.magnifier.dispose();
40171
+ this.group.remove(this.mouseGroup);
40172
+ this.updateDashed();
40173
+ this.five.needsRender = true;
40174
+ this.hook.emit("anchorChange", nowPoint.position);
40175
+ });
40176
+ __publicField(this, "onWantsTapGesture", () => false);
40177
+ __publicField(this, "onWantsToMoveToPano", () => false);
40178
+ __publicField(this, "onWantsPanGesture", () => this.pressPoint ? false : void 0);
40179
+ __publicField(this, "onCameraUpdate", () => {
40180
+ this.updateDistanceUI();
40181
+ this.dashed.distanceItem.update(this.five);
40182
+ });
40183
+ __publicField(this, "updateDashed", () => {
40184
+ if (!this.lastPoint)
40185
+ return;
40186
+ this.dashed.points[0].position.copy(this.lastPoint.position);
40187
+ this.dashed.points[1].position.copy(this.mouseGroup.position);
40188
+ this.dashed.mesh.setPoints(this.lastPoint.position, this.mouseGroup.position);
40189
+ this.dashed.distanceItem.update(this.five);
40190
+ });
40191
+ var _a;
40192
+ this.dashed = new Line(new Point([0, 0, 0]), new Point([0, 0, 0]), this.model);
40193
+ this.dashed.mesh.setMaterial({ dashed: true, dashScale: 100 });
40194
+ this.five.on("cameraUpdate", this.onCameraUpdate);
40195
+ this.five.on("wantsPanGesture", this.onWantsPanGesture);
40196
+ this.five.on("wantsTapGesture", this.onWantsTapGesture);
40197
+ this.five.on("wantsToMoveToPano", this.onWantsToMoveToPano);
40198
+ this.five.on("intersectionOnModelUpdate", this.onIntersectionUpdate);
40199
+ this.model.hook.on("lineAdded", this.onLineChanged);
40200
+ this.model.hook.on("lineRemoved", this.onLineChanged);
40201
+ const fiveElement = this.five.getElement();
40202
+ if (fiveElement) {
40203
+ this.fiveElement = fiveElement;
40204
+ const hammer2 = new Hammer(fiveElement);
40205
+ this.hammer = hammer2;
40206
+ hammer2.on("tap", this.onTap);
40207
+ hammer2.on("pan", this.onPan);
40208
+ hammer2.on("press", this.onPress);
40209
+ hammer2.on("panend", this.onPanEnd);
40210
+ }
40211
+ (_a = this.fiveElement) == null ? void 0 : _a.addEventListener("mouseleave", this.onMouseLeave);
40212
+ this.hook.emit("anchorChange", null);
40213
+ this.five.refresh();
40214
+ }
40215
+ dispose() {
40216
+ var _a, _b;
40217
+ super.dispose();
40218
+ this.group.remove(this.mouseGroup, this.dashed.mesh);
40219
+ this.five.off("cameraUpdate", this.onCameraUpdate);
40220
+ this.five.off("wantsPanGesture", this.onWantsPanGesture);
40221
+ this.five.off("wantsTapGesture", this.onWantsTapGesture);
40222
+ this.five.off("wantsToMoveToPano", this.onWantsToMoveToPano);
40223
+ this.five.off("intersectionOnModelUpdate", this.onIntersectionUpdate);
40224
+ this.model.hook.off("lineAdded", this.onLineChanged);
40225
+ this.model.hook.off("lineRemoved", this.onLineChanged);
40226
+ (_a = this.hammer) == null ? void 0 : _a.destroy();
40227
+ (_b = this.fiveElement) == null ? void 0 : _b.removeEventListener("mouseleave", this.onMouseLeave);
40228
+ this.magnifier.dispose();
40229
+ this.dashed.distanceItem.remove();
40230
+ this.five.needsRender = true;
40231
+ }
40232
+ getEditingLines() {
40233
+ return this.model.lines;
40234
+ }
40235
+ }
40236
+ const svg = `<svg class="fpm__delete-icon" width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
40237
+ <defs>
40238
+ <linearGradient x1="21.443%" y1="100%" x2="67.281%" y2="6.672%" id="a">
40239
+ <stop stop-color="#FFFCFC" stop-opacity=".6" offset="0%" />
40240
+ <stop stop-color="#FFF" offset="100%" />
40241
+ </linearGradient>
40242
+ </defs>
40243
+ <path
40244
+ d="M14.932 3.545a.75.75 0 0 1 .102 1.494l-.102.006H13.83l-.979 8.813a2.05 2.05 0 0 1-1.882 1.818l-.155.006H4.868a2.05 2.05 0 0 1-2.037-1.824l-.98-8.813H.75a.75.75 0 0 1-.102-1.493l.102-.007h14.182zm-2.611 1.5H3.36l.961 8.648a.55.55 0 0 0 .369.46l.087.021.091.008h5.946a.55.55 0 0 0 .546-.49l.961-8.647zM10.795 0a.75.75 0 0 1 .102 1.493l-.102.007H4.886A.75.75 0 0 1 4.785.007L4.886 0h5.91z"
40245
+ transform="translate(2.16 2.16)"
40246
+ fill="url(#a)"
40247
+ fill-rule="nonzero"
40248
+ />
40249
+ </svg>`;
40250
+ const image$1 = `data:image/png;base64,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`;
40251
+ const image = `data:image/png;base64,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`;
40252
+ class DeleteDom {
40253
+ constructor(five, opts) {
40254
+ __publicField(this, "visible", false);
40255
+ __publicField(this, "five");
40256
+ __publicField(this, "lines", []);
40257
+ __publicField(this, "points", []);
40258
+ __publicField(this, "onClick");
40259
+ __publicField(this, "content", document.createElement("div"));
40260
+ __publicField(this, "container", document.createElement("div"));
40261
+ __publicField(this, "onMouseEnter", () => {
40262
+ this.content.style.backgroundImage = `url(${image})`;
40263
+ });
40264
+ __publicField(this, "onMouseLeave", () => {
40265
+ this.content.style.backgroundImage = `url(${image$1})`;
40266
+ });
40267
+ this.five = five;
40268
+ this.onClick = (opts == null ? void 0 : opts.onClick) || (() => void 0);
40269
+ this.container.classList.add("fpm__delete");
40270
+ this.container.style.opacity = "0";
40271
+ this.container.style.position = "absolute";
40272
+ this.container.style.left = "0";
40273
+ this.container.style.top = "0";
40274
+ this.container.style.transform = `translate3d(0, 0, 10px)`;
40275
+ this.container.style.pointerEvents = `none`;
40276
+ this.content.classList.add("fpm__delete-content");
40277
+ this.content.style.width = "67px";
40278
+ this.content.style.height = "31px";
40279
+ this.content.style.display = "flex";
40280
+ this.content.style.alignItems = "center";
40281
+ this.content.style.justifyContent = "center";
40282
+ this.content.style.transform = "translate(-50%, -50%)";
40283
+ this.content.style.color = "#fff";
40284
+ this.content.style.fontSize = "14px";
40285
+ this.content.style.lineHeight = "31px";
40286
+ this.content.style.borderRadius = "15px";
40287
+ this.content.style.backgroundSize = "100% 100%";
40288
+ this.content.style.cursor = "pointer";
40289
+ this.content.style.userSelect = "none";
40290
+ this.content.style.backgroundImage = `url(${image$1})`;
40291
+ this.content.innerHTML = `
40292
+ ${svg}
40293
+ <span>\u5220\u9664</span>
40294
+ `;
40295
+ this.container.append(this.content);
40296
+ const deleteSvgDom = this.content.querySelector(".fpm__delete-icon");
40297
+ if (deleteSvgDom) {
40298
+ deleteSvgDom.style.width = "20px";
40299
+ deleteSvgDom.style.height = "20px";
40300
+ deleteSvgDom.style.marginRight = "2px";
40301
+ }
40302
+ this.content.addEventListener("click", this.onClick);
40303
+ this.content.addEventListener("mouseenter", this.onMouseEnter);
40304
+ this.content.addEventListener("mouseleave", this.onMouseLeave);
40305
+ }
40306
+ dispose() {
40307
+ this.content.removeEventListener("click", this.onClick);
40308
+ this.content.removeEventListener("mouseenter", this.onMouseEnter);
40309
+ this.content.removeEventListener("mouseleave", this.onMouseLeave);
40310
+ this.container.remove();
40311
+ }
40312
+ appendTo(element2) {
40313
+ element2.append(this.container);
40314
+ return this;
40315
+ }
40316
+ setLines(lines) {
40317
+ this.lines = lines;
40318
+ this.points = Array.from(new Set(this.lines.map((line) => [line.points[0], line.points[1]]).flat(1)));
40319
+ return this;
40320
+ }
40321
+ updatePosition() {
40322
+ if (this.lines.length === 0)
40323
+ return this;
40324
+ const points = this.points.map((point) => point.position);
40325
+ const ndcPoints = points.map((point) => point.clone().project(this.five.camera));
40326
+ if (ndcPoints.some((ndcPoint) => Math.abs(ndcPoint.z) > 1))
40327
+ return this.hide();
40328
+ const xArray = ndcPoints.map((point) => point.x);
40329
+ const yArray = ndcPoints.map((point) => point.y);
40330
+ const centerX = (Math.min(...xArray) + Math.max(...xArray)) / 2;
40331
+ const maxY = Math.max(...yArray);
40332
+ const wrapper = this.container.parentElement;
40333
+ if (!wrapper)
40334
+ return this;
40335
+ const centerScreenX = (centerX + 1) / 2 * wrapper.clientWidth;
40336
+ const maxScreenY = -(maxY - 1) / 2 * wrapper.clientHeight;
40337
+ const x = centerScreenX;
40338
+ const y2 = maxScreenY - 34;
40339
+ this.container.style.transform = `translate3d(${x}px, ${y2}px, 10px)`;
40340
+ return this.show();
40341
+ }
40342
+ hide() {
40343
+ this.visible = false;
40344
+ this.container.style.opacity = "0";
40345
+ this.container.style.pointerEvents = "none";
40346
+ return this;
40347
+ }
40348
+ show() {
40349
+ this.visible = true;
40350
+ this.container.style.opacity = "1";
40351
+ this.container.style.pointerEvents = "auto";
40352
+ return this;
40353
+ }
40354
+ }
40355
+ function closestPointOnLine(point, linePoints) {
40356
+ const tA = point.x - linePoints[0].x;
40357
+ const tB = point.y - linePoints[0].y;
40358
+ const tC = linePoints[1].x - linePoints[0].x;
40359
+ const tD = linePoints[1].y - linePoints[0].y;
40360
+ const tDot = tA * tC + tB * tD;
40361
+ const tLenSq = tC * tC + tD * tD;
40362
+ const tParam = tDot / tLenSq;
40363
+ let tXx, tYy;
40364
+ if (tParam < 0 || samePointAt(linePoints[0], linePoints[1])) {
40365
+ tXx = linePoints[0].x;
40366
+ tYy = linePoints[0].y;
40367
+ } else if (tParam > 1) {
40368
+ tXx = linePoints[1].x;
40369
+ tYy = linePoints[1].y;
40370
+ } else {
40371
+ tXx = linePoints[0].x + tParam * tC;
40372
+ tYy = linePoints[0].y + tParam * tD;
40373
+ }
40374
+ return new Vector2$1(tXx, tYy);
40375
+ }
40376
+ function samePointAt(point1, point2) {
40377
+ return point1.x === point2.x && point1.y === point2.y;
40378
+ }
40379
+ function ndc2Screen(ndcPosition, containerSize) {
40380
+ const left = (ndcPosition.x + 1) / 2 * containerSize.width;
40381
+ const top = -(ndcPosition.y - 1) / 2 * containerSize.height;
40382
+ return new Vector2$1(left, top);
40383
+ }
40384
+ function findClosestPoint(five, points, tapPoint, maxDistance) {
40385
+ const container = five.getElement();
40386
+ if (!container)
40387
+ return null;
40388
+ if (points.length === 0)
40389
+ return null;
40390
+ const containerSize = { width: container.clientWidth, height: container.clientHeight };
40391
+ const ndcPoints = points.map((point) => {
40392
+ const ndcPosition = point.position.clone().project(five.camera);
40393
+ if (!isNDCPointInScreen(ndcPosition))
40394
+ return { distance: Infinity, point };
40395
+ const screenPosition = ndc2Screen(ndcPosition, containerSize);
40396
+ const distance = screenPosition.distanceTo(tapPoint);
40397
+ return { distance, point };
40398
+ }).sort((a, b) => a.distance - b.distance);
40399
+ if (typeof maxDistance === "number" && ndcPoints[0].distance > maxDistance)
40400
+ return null;
40401
+ return ndcPoints[0];
40402
+ }
40403
+ function findAssociatedLines(line) {
40404
+ const mergeNextLine = (point, nextIndex, target) => {
40405
+ const nextLine = point.lines.find((line2) => {
40406
+ const pointIndex = line2.points.findIndex(({ id }) => id === point.id);
40407
+ if (pointIndex === nextIndex)
40408
+ return false;
40409
+ return true;
40410
+ });
40411
+ if (!nextLine)
40412
+ return target;
40413
+ const nextPoint = nextLine.points[nextIndex];
40414
+ if (!nextPoint)
40415
+ return target;
40416
+ return mergeNextLine(nextPoint, nextIndex, target.concat(nextLine));
40417
+ };
40418
+ const rightLines = mergeNextLine(line.points[0], 1, []);
40419
+ const leftLines = mergeNextLine(line.points[0], 0, []);
40420
+ const lines = rightLines.concat(leftLines);
40421
+ return lines;
40422
+ }
40423
+ class WatchController extends BaseController {
40424
+ constructor(params) {
40425
+ super(params);
40426
+ __publicField(this, "type", "watch");
40427
+ __publicField(this, "deleteDom");
40428
+ __publicField(this, "highlightedLines", []);
40429
+ __publicField(this, "fiveElement");
40430
+ __publicField(this, "editPointState");
40431
+ __publicField(this, "hammer");
40432
+ __publicField(this, "onPanStart", (e) => {
40433
+ var _a;
40434
+ if (this.model.points.length === 0 || !this.fiveElement)
40435
+ return;
40436
+ const mouse = getPointFromHammerEvent(e).point;
40437
+ const closestPoint = (_a = findClosestPoint(this.five, this.model.points, mouse, 20)) == null ? void 0 : _a.point;
40438
+ if (!closestPoint) {
40439
+ this.editPointState = void 0;
40440
+ return;
40441
+ }
40442
+ const editPointState = {
40443
+ point: closestPoint,
40444
+ associatedLines: findAssociatedLines(closestPoint.lines[0])
40445
+ };
40446
+ const cancelDragLine = this.hook.emit("wantsDragLine", {
40447
+ point: closestPoint.id,
40448
+ lines: editPointState.associatedLines.map(({ id }) => id)
40449
+ });
40450
+ if (cancelDragLine)
40451
+ return;
40452
+ this.editPointState = editPointState;
40453
+ this.magnifier.appendTo(this.container);
40454
+ this.group.add(this.mouseGroup);
40455
+ });
40456
+ __publicField(this, "onPanEnd", () => {
40457
+ if (!this.editPointState)
40458
+ return;
40459
+ this.editPointState.point.lines.forEach((line) => line.mesh.setMaterial({ dashed: false }));
40460
+ this.highlightLines(this.editPointState.associatedLines);
40461
+ this.editPointState = void 0;
40462
+ this.magnifier.dispose();
40463
+ this.group.remove(this.mouseGroup);
40464
+ });
40465
+ __publicField(this, "onPan", (e) => {
40466
+ if (!this.editPointState || !this.fiveElement)
40467
+ return;
40468
+ const mouse = getPointFromHammerEvent(e).ndcPoint;
40469
+ const raycaster = new Raycaster$1();
40470
+ raycaster.setFromCamera(mouse, this.five.camera);
40471
+ const [intersection] = this.five.model.intersectRaycaster(raycaster);
40472
+ if (!intersection)
40473
+ return;
40474
+ this.onIntersectionUpdate(intersection);
40475
+ });
40476
+ __publicField(this, "onIntersectionUpdate", (intersection, mesh) => {
40477
+ if (!this.editPointState)
40478
+ return;
40479
+ this.clearHighlightLines();
40480
+ this.editPointState.point.position.copy(intersection.point);
40481
+ this.editPointState.point.lines.forEach((line) => {
40482
+ line.mesh.setPoints(line.points[0].position.clone(), line.points[1].position.clone());
40483
+ line.lightMesh.setPoints(line.points[0].position.clone(), line.points[1].position.clone());
40484
+ line.mesh.setMaterial({ dashed: true });
40485
+ });
40486
+ this.updateDistanceUI();
40487
+ this.magnifier.updateWithPoint(intersection.point);
40488
+ this.mouseGroup.position.copy(intersection.point);
40489
+ if (mesh) {
40490
+ this.mouseGroup.quaternion.copy(mesh.quaternion);
40491
+ } else if (intersection.face) {
40492
+ const face = intersection.face.normal;
40493
+ const positionVector = face.clone().multiplyScalar(0.05);
40494
+ const position = intersection.point.clone().add(positionVector);
40495
+ const lookAtVector = position.clone().add(positionVector);
40496
+ this.mouseGroup.lookAt(lookAtVector);
40497
+ }
40498
+ this.five.needsRender = true;
40499
+ this.hook.emit("selectedChange", this.editPointState.associatedLines.map((line) => line.toCompletelyJson()));
40500
+ });
40501
+ __publicField(this, "wantsPanGesture", () => {
40502
+ if (this.editPointState)
40503
+ return false;
40504
+ });
40505
+ __publicField(this, "wantsTapGesture", (raycaster) => {
40506
+ const [target] = this.five.model.intersectRaycaster(raycaster);
40507
+ if (!target)
40508
+ return;
40509
+ const camera = this.five.camera;
40510
+ const ndcTarget = target.point.clone().project(camera);
40511
+ const screenWidth = this.container.clientWidth;
40512
+ const screenHeight = this.container.clientHeight;
40513
+ const targetScreenPosition = new Vector2$1(ndcTarget.x * screenWidth, ndcTarget.y * screenHeight);
40514
+ const screenLines = this.model.lines.map((line) => {
40515
+ const [startPoint, endPoint] = line.points;
40516
+ const ndcStartPoint = startPoint.position.clone().project(camera);
40517
+ const ndcEndPoint = endPoint.position.clone().project(camera);
40518
+ if (!isNDCPointInScreen(ndcStartPoint) && !isNDCPointInScreen(ndcEndPoint))
40519
+ return null;
40520
+ const startScreenPosition = new Vector2$1(ndcStartPoint.x * screenWidth, ndcStartPoint.y * screenHeight);
40521
+ const endScreenPosition = new Vector2$1(ndcEndPoint.x * screenWidth, ndcEndPoint.y * screenHeight);
40522
+ return { id: line.id, points: [startScreenPosition, endScreenPosition] };
40523
+ }).filter((line) => !!line);
40524
+ if (screenLines.length === 0)
40525
+ return;
40526
+ const distanceLines = screenLines.map((line) => {
40527
+ const closestPoint = closestPointOnLine(targetScreenPosition, line.points);
40528
+ return { id: line.id, distance: closestPoint.distanceTo(targetScreenPosition) };
40529
+ }).sort((a, b) => a.distance - b.distance);
40530
+ const closestScreenLine = distanceLines[0];
40531
+ if (closestScreenLine.distance > 20)
40532
+ return;
40533
+ const closestLine = this.model.lines.find(({ id }) => id === closestScreenLine.id);
40534
+ if (!closestLine)
40535
+ return;
40536
+ this.chooseLine(closestLine);
40537
+ return false;
40538
+ });
40539
+ __publicField(this, "chooseLine", (line) => {
40540
+ const highlightLines = findAssociatedLines(line);
40541
+ this.highlightLines(highlightLines);
40542
+ this.five.needsRender = true;
40543
+ this.hook.emit("selectedChange", highlightLines.map((line2) => line2.toCompletelyJson()));
40544
+ });
40545
+ __publicField(this, "lineRemoved", (line) => {
40546
+ this.removeLine(line);
40547
+ this.hook.emit("selectedChange", this.model.lines.filter((line2) => line2.selected).map((line2) => line2.toCompletelyJson()));
40548
+ });
40549
+ __publicField(this, "onCameraUpdate", () => {
40550
+ this.updateDistanceUI();
40551
+ this.highlightedLines.length > 0 && this.deleteDom.updatePosition();
40552
+ });
40553
+ __publicField(this, "deleteDomClickCallback", () => {
40554
+ const firstLine = this.highlightedLines[0];
40555
+ firstLine.getPolyline().lines.slice().reverse().forEach((line) => this.model.removeLine(line));
40556
+ this.highlightedLines = [];
40557
+ this.deleteDom.setLines([]).hide();
40558
+ });
40559
+ this.deleteDom = new DeleteDom(this.five, { onClick: this.deleteDomClickCallback }).appendTo(this.container);
40560
+ this.model.lines.forEach((line) => {
40561
+ line.distanceItem.appendTo(this.container);
40562
+ line.distanceItem.update(this.five);
40563
+ line.hook.on("selected", this.chooseLine);
40564
+ this.group.add(line.mesh);
40565
+ });
40566
+ const fiveElement = this.five.getElement();
40567
+ if (fiveElement) {
40568
+ this.fiveElement = fiveElement;
40569
+ const hammer2 = new Hammer(fiveElement);
40570
+ this.hammer = hammer2;
40571
+ hammer2.on("pan", this.onPan);
40572
+ hammer2.on("panstart", this.onPanStart);
40573
+ hammer2.on("panend", this.onPanEnd);
40574
+ }
40575
+ this.model.hook.on("lineRemoved", this.lineRemoved);
40576
+ this.five.on("cameraUpdate", this.onCameraUpdate);
40577
+ this.five.on("wantsTapGesture", this.wantsTapGesture);
40578
+ this.five.on("wantsPanGesture", this.wantsPanGesture);
40579
+ this.five.needsRender = true;
40580
+ }
40581
+ dispose() {
40582
+ var _a;
40583
+ super.dispose();
40584
+ this.deleteDom.dispose();
40585
+ this.model.hook.off("lineRemoved", this.lineRemoved);
40586
+ this.five.off("cameraUpdate", this.onCameraUpdate);
40587
+ this.five.off("wantsPanGesture", this.wantsPanGesture);
40588
+ this.five.off("wantsTapGesture", this.wantsTapGesture);
40589
+ this.five.needsRender = true;
40590
+ this.hook.emit("selectedChange", []);
40591
+ (_a = this.hammer) == null ? void 0 : _a.destroy();
40592
+ }
40593
+ highlightLine(line) {
40594
+ if (line.selected)
40595
+ return;
40596
+ line.selected = true;
40597
+ this.group.add(line.lightMesh);
40598
+ line.distanceItem.highlight();
40599
+ this.five.needsRender = true;
40600
+ }
40601
+ clearHighlightLines() {
40602
+ if (this.group.children.length === 0)
40603
+ return;
40604
+ this.deleteDom.setLines([]).hide();
40605
+ this.model.lines.forEach((line) => {
40606
+ line.selected = false;
40607
+ line.distanceItem.unHighlight();
40608
+ this.group.remove(line.lightMesh);
40609
+ });
40610
+ this.highlightedLines = [];
40611
+ this.five.needsRender = true;
40612
+ }
40613
+ highlightLines(lines) {
40614
+ this.clearHighlightLines();
40615
+ this.highlightedLines = lines;
40616
+ this.deleteDom.setLines(lines).updatePosition().show();
40617
+ lines.forEach((line) => this.highlightLine(line));
40618
+ }
40619
+ }
40620
+ const planTextureUrl = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAAI6CAMAAAAZlhLyAAACB1BMVEUAAAD+/v6qqqqgoKCLi4t7e3u4uLhvb29MTExZWVlCQkJgYGBqamo4ODi9vb3///9FRUXPz887Ozv///9QUFBWVlZdXV38/Pzj4+Pn5+f8/Pz5+fn9/f329vZoaGje3t78/Pz////x8fH8/Pzs7OyBgYHd3d39/f319fX+/v79/f2Kior6+vr////+/v76+vr+/v7////8/Pz9/f3+/v7m5ub7+/v+/v7+/v7j4+P////+/v79/f3d3d3h4eH4+Pj+/v79/f12dnbc3Nz9/f3w8PD9/f34+Pj9/f3+/v5jY2P8/Pz9/f2ioqJubm7v7+/+/v76+vr5+fnv7+/09PSDg4P////t7e3+/v7+/v7+/v7///+ZmZl7e3v7+/vy8vL+/v7+/v7p6en19fX////s7Oz+/v6lpaX+/v7r6+vg4OD9/f3q6ur///////+UlJTt7e329vbz8/Pg4OD///+wsLCdnZ2QkJDe3t77+/vz8/Pw8PD+/v7c3Nyqqqrw8PD4+Pj+/v7////4+Pj////s7Oyurq7f39/p6en8/Pz////8/Pz19fVycnK0tLT////q6ure3t7o6Oj////s7Oz39/fd3d3h4eH+/v7j4+P////+/v7n5+f///////////////+ysrLe3t7////////8/PzHx8fl5eX////39/fv7+/d3d3///8S/hbOAAAArHRSTlMAzhATFhkNGyEfIx4dJQ/OKwoozS4wMh3Uy4SPbjs34kJ9EAkGP+8Snk1nRRo5JYl2eDQiA88wY3PXRDYN6dyTX0s751SxPJdhPjRdV1M4ti0XFa+pQiq5aShQSE09IKJwWMilWr9SVzLC3wvFwplKvKKY9spfUEjge6yqnexaLpqQakgBtVz1wQe9i4s6ZaG788fGKIXx95TZzKbSuKu1s2LlsJb7dqiu/cSWYhzVwQAALl1JREFUeNrs0jFqalEUheE9C9ugAQloCg0WmuIJIbxHUsQUQhQEQUTINNI463fvqU2xT3G5xfetNYQ/+M3PT7SDfDo/T0/SIe+pCJAOt0mHvrgvAqRDUn061/vrNSDrOhqNpEOFURGQNfqWDlW+i4CadJ6lQ95zESAdbpMOfTEcPg+Hw4CsphvpUGM4bsoZB2SNW9JB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`;
40621
+ function getMouseGroup() {
40622
+ const group = new Group$2();
40623
+ const planGeometry = new PlaneGeometry$1(0.3, 0.3);
40624
+ const planTexture = new TextureLoader$1().load(planTextureUrl);
40625
+ planTexture.encoding = sRGBEncoding$1;
40626
+ const planMaterial = new MeshBasicMaterial$1({ map: planTexture, transparent: true, depthTest: false });
40627
+ const planMesh = new Mesh$1(planGeometry, planMaterial);
40628
+ const zPath = new CurvePath$1();
40629
+ zPath.add(new LineCurve3$1(new Vector3$1(0, 0, 0), new Vector3$1(0, 0, 0.1)));
40630
+ const zGeometry = new TubeGeometry$1(zPath, 10, 5e-3);
40631
+ const zMaterial = new MeshBasicMaterial$1({ color: 3404271, depthTest: false, side: DoubleSide$1 });
40632
+ const zMesh = new Mesh$1(zGeometry, zMaterial);
40633
+ const ballGeometry = new SphereGeometry$1(0.01, 32, 32);
40634
+ const ballMesh = new Mesh$1(ballGeometry, zMaterial);
40635
+ ballMesh.position.set(0, 0, 0.1);
40636
+ group.name = "mouse-current";
40637
+ group.add(planMesh, zMesh, ballMesh);
40638
+ return group;
40639
+ }
40640
+ const MAIN_NORMAL_PATH = "M31.379 15.466a1.045 1.045 0 0 1-.92 1.076l-11.276.607a1.6 1.6 0 0 0-1.512 1.511l-.599 11.113a1.045 1.045 0 0 1-.92 1.075l-.164.008a1.183 1.183 0 0 1-1.123-.975l-.016-.164-.221-10.768a1.6 1.6 0 0 0-1.567-1.567l-11.3-.231-.165-.016a1.187 1.187 0 0 1-.964-.996l-.01-.127.007-.164c.061-.496.455-.876.958-.917l.118-.003 11.112-.599a1.6 1.6 0 0 0 1.498-1.37l.014-.142.607-11.276a1.045 1.045 0 0 1 1.076-.92c.573.015 1.055.46 1.13 1.019l.009.121.221 10.766a1.6 1.6 0 0 0 1.567 1.566l11.3.234a1.181 1.181 0 0 1 1.14 1.139z";
40641
+ const MAIN_DONE_PATH = "M27.1772552,8.15828895 C27.8664561,7.48070421 28.5574369,7.81156875 28.8336646,8.04968716 C29.1098924,8.28780557 29.3990219,9.110014 28.8256559,9.79263351 L28.7110903,9.9165024 L13.9697229,25.1399531 C13.3288458,25.7700285 12.3239388,25.8070917 11.6402346,25.2511429 L11.5159715,25.1399531 L3.7056151,18.0063788 C3.01641417,17.3287941 3.00699739,16.2207954 3.68458213,15.5315945 C4.32230894,14.8829348 5.3413021,14.8364368 6.03356826,15.3981178 L6.15936649,15.5105615 L12.6856594,21.9049888 L27.1772552,8.15828895 Z";
40642
+ const MAIN_MOUSE_ENTER_FILL = "url(#fpm__main-b)";
40643
+ const MAIN_MOUSE_LEAVE_FILL = "url(#fpm__main-c)";
40644
+ const revokeSvg = `
40645
+ <svg class="fpm__revoke-icon" width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
40646
+ <defs>
40647
+ <linearGradient x1="47.631%" y1="55.183%" x2="2.967%" y2="86.323%" id="fpm__revoke-a">
40648
+ <stop stop-color="#FFF" offset="0%" />
40649
+ <stop stop-color="#FFF" stop-opacity=".5" offset="100%" />
40650
+ </linearGradient>
40651
+ <linearGradient x1="5.297%" y1="43.016%" x2="38.238%" y2="79.932%" id="fpm__revoke-b">
40652
+ <stop stop-color="#FFF" offset="0%" />
40653
+ <stop stop-color="#FFF" stop-opacity="0" offset="100%" />
40654
+ </linearGradient>
40655
+ </defs>
40656
+ <path
40657
+ d="M13.388 7.108c.552 0 1.005.42 1.06.957l.006.11v1.224c0 .921.745 1.667 1.666 1.667h7.184c5.804 0 10.509 4.616 10.509 10.309 0 5.595-4.544 10.15-10.21 10.305l-.3.004H8.924c-.917 0-1.66-.729-1.66-1.628 0-.846.658-1.541 1.5-1.62l.16-.008h14.38c3.972 0 7.191-3.158 7.191-7.053 0-3.81-3.08-6.916-6.933-7.049l-.257-.004H10.029l-.109-.005H8.212c-.245 0-.482-.085-.67-.237l-.09-.082a1.066 1.066 0 0 1-.065-1.422l.079-.086 5.175-5.077c.2-.195.468-.305.747-.305z"
40658
+ fill="url(#fpm__revoke-a)"
40659
+ fill-rule="nonzero"
40660
+ stroke="url(#fpm__revoke-b)"
40661
+ stroke-width=".5"
40662
+ />
40663
+ </svg>
40664
+ `;
40665
+ const exitSvg = `
40666
+ <svg class="fpm__exit-icon width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg">
40667
+ <defs>
40668
+ <linearGradient x1="36.288%" y1="73.736%" x2="54.242%" y2="97.166%" id="fpm__exit-a">
40669
+ <stop stop-color="#FFF" offset="0%" />
40670
+ <stop stop-color="#FFF" stop-opacity=".5" offset="100%" />
40671
+ </linearGradient>
40672
+ <linearGradient x1="100%" y1="47.234%" x2="24.047%" y2="47.234%" id="fpm__exit-b">
40673
+ <stop stop-color="#FFF" offset="0%" />
40674
+ <stop stop-color="#FFF" stop-opacity=".005" offset="99.535%" />
40675
+ <stop stop-color="#FFF" stop-opacity="0" offset="100%" />
40676
+ </linearGradient>
40677
+ </defs>
40678
+ <path
40679
+ d="M22 7a1.5 1.5 0 0 1 .144 2.993L22 10h-9a1.5 1.5 0 0 0-1.493 1.356l-.007.144v17a1.5 1.5 0 0 0 1.356 1.493L13 30h9a1.5 1.5 0 0 1 .144 2.993L22 33h-9a4.5 4.5 0 0 1-4.495-4.288L8.5 28.5v-17a4.5 4.5 0 0 1 4.288-4.495L13 7h9zm6.317 7.755a1 1 0 0 1 .7.286l4.856 4.764a1 1 0 0 1-.7 1.713h-5.856V21.5h-8.032a1.5 1.5 0 1 1 0-3h6.365c.92 0 1.666-.746 1.667-1.667v-1.078a1 1 0 0 1 1-1z"
40680
+ fill="url(#fpm__exit-a)"
40681
+ fill-rule="nonzero"
40682
+ stroke="url(#fpm__exit-b)"
40683
+ stroke-width=".5"
40684
+ />
40685
+ </svg>
40686
+ `;
40687
+ const mainSvg = `
40688
+ <svg class="fpm__main-icon" width="60" height="60" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg">
40689
+ <defs>
40690
+ <mask id="fpm__main-icon-mask">
40691
+ <rect id="fpm__main-icon-mask-black" x="0" y="0" width="30" height="30" fill="black"></rect>
40692
+ <rect id="fpm__main-icon-mask-white" x="0" y="0" width="0" height="30" fill="white"></rect>
40693
+ </mask>
40694
+ <linearGradient id="fpm__main-a" x1="25.371%" y1="0%" x2="109.587%" y2="172.268%">
40695
+ <stop stop-color="#FFF" offset="0%" />
40696
+ <stop stop-color="#FFF" stop-opacity=".77" offset="44.051%" />
40697
+ <stop stop-color="#FFF" stop-opacity=".201" offset="100%" />
40698
+ </linearGradient>
40699
+ <radialGradient id="fpm__main-b" fx="50%" fy="50%" r="50.864%" gradientTransform="matrix(-.98302 0 0 -1 .992 1)">
40700
+ <stop stop-color="#2D7CFF" offset="0%" />
40701
+ <stop stop-color="#2D7CFF" stop-opacity=".3" offset="100%" />
40702
+ </radialGradient>
40703
+ <radialGradient id="fpm__main-c" fx="50%" fy="50%" r="50.864%" gradientTransform="matrix(-.98302 0 0 -1 .992 1)">
40704
+ <stop stop-opacity=".4" offset="0%" />
40705
+ <stop stop-opacity=".12" offset="100%" />
40706
+ </radialGradient>
40707
+ </defs>
40708
+ <g fill="none" fill-rule="evenodd">
40709
+ <circle fill="url(#fpm__main-a)" cx="30" cy="30" r="30" />
40710
+ <path
40711
+ class="fpm__main-icon-path"
40712
+ d="${MAIN_NORMAL_PATH}"
40713
+ fill="${MAIN_MOUSE_LEAVE_FILL}"
40714
+ fill-rule="nonzero"
40715
+ transform="translate(14 14)"
40716
+ />
40717
+ </g>
40718
+ </svg>
40719
+ `;
40720
+ var htmlString = `
40721
+ <style>
40722
+ .fpm__revoke {
40723
+ opacity: 0.3;
40724
+ }
40725
+
40726
+ .fpm__revoke.enabled {
40727
+ opacity: 0.7;
40728
+ }
40729
+
40730
+ .fpm__revoke.enabled:hover {
40731
+ opacity: 1;
40732
+ }
40733
+
40734
+ .fpm__revoke-icon {
40735
+ width: 40px;
40736
+ height: 40px;
40737
+ margin-top: 10px;
40738
+ cursor: pointer;
40739
+ }
40740
+ </style>
40741
+ <div class="fpm_ui-bg"></div>
40742
+ <div class="fpm_operating-space">
40743
+ <div class="fpm__ui-item fpm__revoke">
40744
+ ${revokeSvg}
40745
+ <span class="fpm__text fpm__revoke-text">\u64A4\u9500</span>
40746
+ </div>
40747
+ <div class="fpm__ui-item fpm__main">
40748
+ ${mainSvg}
40749
+ <span class="fpm__text fpm__main-text">\u6DFB\u52A0</span>
40750
+ </div>
40751
+ <div class="fpm__ui-item fpm__exit">
40752
+ ${exitSvg}
40753
+ <span class="fpm__text fpm__exit-text">\u9000\u51FA</span>
40754
+ </div>
40755
+ </div>
40756
+ `;
40757
+ const uiWrapperStyle = {
40758
+ position: "absolute",
40759
+ top: "0",
40760
+ left: "0",
40761
+ width: "100%",
40762
+ height: "100%",
40763
+ opacity: "0",
40764
+ transform: "translate(0, 10px)",
40765
+ transition: "opacity 500ms ease-in-out, transform 500ms ease-in-out"
40766
+ };
40767
+ const operatingSpaceStyle = {
40768
+ position: "absolute",
40769
+ left: "50%",
40770
+ bottom: "32px",
40771
+ transform: "translateX(-50%)",
40772
+ width: "300px",
40773
+ height: "89px",
40774
+ display: "flex",
40775
+ justifyContent: "space-between",
40776
+ fontSize: "16px",
40777
+ pointerEvents: "all",
40778
+ color: "#fff",
40779
+ zIndex: "10"
40780
+ };
40781
+ const buttonGroupStyle = {
40782
+ height: "100%",
40783
+ width: "max-content",
40784
+ display: "flex",
40785
+ flexDirection: "column",
40786
+ justifyContent: "space-between",
40787
+ alignItems: "center"
40788
+ };
40789
+ const controllerBackgroundStyle = {
40790
+ position: "absolute",
40791
+ bottom: "0",
40792
+ left: "0",
40793
+ opacity: "0.5",
40794
+ width: "100%",
40795
+ height: "184px",
40796
+ background: `linear-gradient(180deg, rgba(0,0,0,0.00) 0%, #000000 100%)`,
40797
+ zIndex: "0"
40798
+ };
40799
+ const mainItemStyle = {
40800
+ margin: "0 80px",
40801
+ opacity: "0.7"
40802
+ };
40803
+ const exitItemStyle = {
40804
+ opacity: "0.7"
40805
+ };
40806
+ const mainIconStyle = {
40807
+ width: "60px",
40808
+ height: "60px",
40809
+ backgroundSize: "100%",
40810
+ cursor: "pointer"
40811
+ };
40812
+ const exitIconStyle = {
40813
+ width: "40px",
40814
+ height: "40px",
40815
+ marginTop: "10px",
40816
+ backgroundSize: "100%",
40817
+ cursor: "pointer"
40818
+ };
40819
+ const textStyle = {
40820
+ cursor: "default",
40821
+ userSelect: "none"
40822
+ };
40823
+ class MainBtnController {
40824
+ constructor(measureController, container) {
40825
+ __publicField(this, "container");
40826
+ __publicField(this, "measureController");
40827
+ __publicField(this, "mainIconMaskTween");
40828
+ __publicField(this, "mainElement");
40829
+ __publicField(this, "onMouseEnter", () => {
40830
+ const { mainItem, pathDom } = this.mainElement;
40831
+ mainItem.style.opacity = "1";
40832
+ pathDom.setAttribute("fill", MAIN_MOUSE_ENTER_FILL);
40833
+ });
40834
+ __publicField(this, "onMouseLeave", () => {
40835
+ const { mainItem, pathDom } = this.mainElement;
40836
+ mainItem.style.opacity = "0.7";
40837
+ pathDom.setAttribute("fill", MAIN_MOUSE_LEAVE_FILL);
40838
+ });
40839
+ __publicField(this, "onClick", () => {
40840
+ const mode = this.measureController.getCurrentMode();
40841
+ mode === "Watch" ? this.measureController.changeMode("Edit") : this.measureController.save().changeMode("Watch");
40842
+ });
40843
+ __publicField(this, "editedLineChangeHandler", (lines) => {
40844
+ if (lines.length > 1)
40845
+ return;
40846
+ if (lines.length === 0)
40847
+ return this.change2Cancel(false);
40848
+ this.change2Done();
40849
+ });
40850
+ __publicField(this, "modeChangeHandler", (mode) => {
40851
+ mode === "Watch" ? this.change2Add() : this.change2Cancel();
40852
+ });
40853
+ this.measureController = measureController;
40854
+ this.container = container;
40855
+ this.mainElement = this.getMainElement();
40856
+ Object.assign(this.mainElement.mainIcon.style, mainIconStyle);
40857
+ Object.assign(this.mainElement.mainItem.style, mainItemStyle);
40858
+ this.change2Add();
40859
+ this.measureController.hook.on("modeChange", this.modeChangeHandler);
40860
+ this.mainElement.mainIcon.addEventListener("click", this.onClick);
40861
+ this.mainElement.mainIcon.addEventListener("mouseenter", this.onMouseEnter);
40862
+ this.mainElement.mainIcon.addEventListener("mouseleave", this.onMouseLeave);
40863
+ }
40864
+ dispose() {
40865
+ this.measureController.hook.off("modeChange", this.modeChangeHandler);
40866
+ this.measureController.hook.off("editedLineChange", this.editedLineChangeHandler);
40867
+ this.mainElement.mainIcon.removeEventListener("click", this.onClick);
40868
+ this.mainElement.mainIcon.removeEventListener("mouseenter", this.onMouseEnter);
40869
+ this.mainElement.mainIcon.removeEventListener("mouseleave", this.onMouseLeave);
40870
+ }
40871
+ getMainElement() {
40872
+ const mainTextDom = this.container.querySelector(".fpm__main-text");
40873
+ const mainItem = this.container.querySelector(".fpm__main");
40874
+ const mainIcon = this.container.querySelector(".fpm__main-icon");
40875
+ const pathDom = mainItem == null ? void 0 : mainItem.querySelector(".fpm__main-icon-path");
40876
+ const maskWhiteRect = mainIcon == null ? void 0 : mainIcon.querySelector("#fpm__main-icon-mask-white");
40877
+ if (!mainItem || !mainTextDom || !mainIcon || !pathDom || !maskWhiteRect)
40878
+ throw new Error("cannot find dom");
40879
+ return { mainTextDom, mainItem, mainIcon, pathDom, maskWhiteRect };
40880
+ }
40881
+ change2Add() {
40882
+ this.measureController.hook.off("editedLineChange", this.editedLineChangeHandler);
40883
+ const { mainIcon, mainTextDom, pathDom } = this.mainElement;
40884
+ mainIcon.style.transition = mainTextDom.innerText === "\u5B8C\u6210" ? "none" : "transform 300ms ease-in-out";
40885
+ mainIcon.style.transform = "rotate(0deg)";
40886
+ mainTextDom.innerText = "\u6DFB\u52A0";
40887
+ pathDom == null ? void 0 : pathDom.setAttribute("d", MAIN_NORMAL_PATH);
40888
+ }
40889
+ change2Cancel(withAnime = true) {
40890
+ const { mainIcon, mainTextDom, pathDom } = this.mainElement;
40891
+ pathDom.setAttribute("d", MAIN_NORMAL_PATH);
40892
+ pathDom.setAttribute("mask", "");
40893
+ mainIcon.style.transition = withAnime ? "transform 300ms ease-in-out" : "none";
40894
+ mainIcon.style.transform = "rotate(45deg)";
40895
+ mainTextDom && (mainTextDom.innerText = "\u53D6\u6D88");
40896
+ this.measureController.hook.on("editedLineChange", this.editedLineChangeHandler);
40897
+ }
40898
+ change2Done() {
40899
+ var _a;
40900
+ const { mainTextDom, mainIcon, pathDom, maskWhiteRect } = this.getMainElement();
40901
+ if (mainTextDom.innerText === "\u5B8C\u6210")
40902
+ return;
40903
+ mainIcon.style.transition = "none";
40904
+ mainIcon.style.transform = "rotate(0deg)";
40905
+ mainTextDom.innerText = "\u5B8C\u6210";
40906
+ pathDom.setAttribute("d", MAIN_DONE_PATH);
40907
+ pathDom.setAttribute("mask", `url(#fpm__main-icon-mask)`);
40908
+ (_a = this.mainIconMaskTween) == null ? void 0 : _a.dispose();
40909
+ this.mainIconMaskTween = tweenProgress().easing(exports.Easing.Quartic.InOut).onUpdate(({ progress }) => {
40910
+ maskWhiteRect.setAttribute("width", (progress * 30).toString());
40911
+ }).onComplete(() => {
40912
+ var _a2;
40913
+ return (_a2 = this.mainIconMaskTween) == null ? void 0 : _a2.dispose();
40914
+ }).play();
40915
+ }
40916
+ }
40917
+ class Revoke {
40918
+ constructor(measureController, container) {
40919
+ __publicField(this, "container");
40920
+ __publicField(this, "revokeIcon");
40921
+ __publicField(this, "revokeItem");
40922
+ __publicField(this, "measureController");
40923
+ __publicField(this, "onClick", () => {
40924
+ this.measureController.revoke();
40925
+ });
40926
+ __publicField(this, "onModeChange", (mode) => {
40927
+ if (mode !== "Edit") {
40928
+ this.revokeItem.classList.remove("enabled");
40929
+ return;
40930
+ }
40931
+ this.revokeItem.classList.add("enabled");
40932
+ });
40933
+ __publicField(this, "handleRevoke", () => {
40934
+ return () => {
40935
+ };
40936
+ });
40937
+ this.measureController = measureController;
40938
+ this.container = container;
40939
+ const revokeIcon = this.container.querySelector(".fpm__revoke-icon");
40940
+ const revokeItem = this.container.querySelector(".fpm__revoke");
40941
+ if (!revokeIcon || !revokeItem)
40942
+ throw new Error("\u4E0D\u6B63\u786E\u7684\u9009\u62E9\u5668");
40943
+ this.revokeIcon = revokeIcon;
40944
+ this.revokeItem = revokeItem;
40945
+ this.revokeIcon.addEventListener("click", this.onClick);
40946
+ measureController.hook.on("modeChange", this.onModeChange);
40947
+ }
40948
+ dispose() {
40949
+ this.revokeIcon.removeEventListener("click", this.onClick);
40950
+ this.measureController.hook.off("modeChange", this.onModeChange);
40951
+ }
40952
+ }
40953
+ class UIController {
40954
+ constructor(measureController, params) {
40955
+ __publicField(this, "revoke");
40956
+ __publicField(this, "container");
40957
+ __publicField(this, "mainController");
40958
+ __publicField(this, "disposers", []);
40959
+ __publicField(this, "measureController");
40960
+ __publicField(this, "handleExit", () => {
40961
+ const exitIcon = this.container.querySelector(".fpm__exit-icon");
40962
+ const exitItem = this.container.querySelector(".fpm__exit");
40963
+ if (!exitItem || !exitIcon)
40964
+ throw new Error("cannot find dom");
40965
+ Object.assign(exitItem.style, exitItemStyle);
40966
+ Object.assign(exitIcon == null ? void 0 : exitIcon.style, exitIconStyle);
40967
+ const onMouseEnter = () => exitItem.style.opacity = "1";
40968
+ const onMouseLeave = () => exitItem.style.opacity = "0.7";
40969
+ const handleClick = () => {
40970
+ this.measureController.disable();
40971
+ };
40972
+ exitIcon.addEventListener("click", handleClick);
40973
+ exitIcon.addEventListener("mouseenter", onMouseEnter);
40974
+ exitIcon.addEventListener("mouseleave", onMouseLeave);
40975
+ return () => {
40976
+ exitIcon.removeEventListener("click", handleClick);
40977
+ exitIcon.removeEventListener("mouseenter", onMouseEnter);
40978
+ exitIcon.removeEventListener("mouseleave", onMouseLeave);
40979
+ };
40980
+ });
40981
+ this.measureController = measureController;
40982
+ this.container = document.createElement("div");
40983
+ this.container.innerHTML = htmlString;
40984
+ this.container.classList.add("fpm__ui-controller");
40985
+ params.container.appendChild(this.container);
40986
+ const textDoms = this.container.querySelectorAll(".fpm__text");
40987
+ const UIItems = this.container.querySelectorAll(".fpm__ui-item");
40988
+ const bgDom = this.container.querySelector(".fpm_ui-bg");
40989
+ const operatingSpaceDom = this.container.querySelector(".fpm_operating-space");
40990
+ Object.assign(bgDom == null ? void 0 : bgDom.style, controllerBackgroundStyle);
40991
+ Object.assign(operatingSpaceDom == null ? void 0 : operatingSpaceDom.style, operatingSpaceStyle);
40992
+ Object.assign(this.container.style, uiWrapperStyle);
40993
+ UIItems.forEach((item) => Object.assign(item.style, buttonGroupStyle));
40994
+ textDoms.forEach((item) => Object.assign(item.style, textStyle));
40995
+ }
40996
+ dispose() {
40997
+ this.hide();
40998
+ this.container.remove();
40999
+ }
41000
+ show() {
41001
+ this.container.style.opacity = "1";
41002
+ this.container.style.transform = "translate(0, 0)";
41003
+ this.revoke = new Revoke(this.measureController, this.container);
41004
+ this.mainController = new MainBtnController(this.measureController, this.container);
41005
+ this.disposers.push(this.handleExit());
41006
+ return this;
41007
+ }
41008
+ hide() {
41009
+ var _a, _b;
41010
+ this.container.style.opacity = "0";
41011
+ this.container.style.transform = "translate(0, 10px)";
41012
+ (_a = this.revoke) == null ? void 0 : _a.dispose();
41013
+ (_b = this.mainController) == null ? void 0 : _b.dispose();
41014
+ this.disposers.forEach((disposer) => disposer());
41015
+ this.disposers = [];
41016
+ return this;
41017
+ }
41018
+ }
41019
+ class GuideController {
41020
+ constructor(measureController, params) {
41021
+ __publicField(this, "measureController");
41022
+ __publicField(this, "textDom", document.createElement("span"));
41023
+ __publicField(this, "container", document.createElement("div"));
41024
+ __publicField(this, "hasAnchor", false);
41025
+ __publicField(this, "onModelChange", (mode) => {
41026
+ if (mode === "Watch") {
41027
+ this.textDom.innerText = ``;
41028
+ return;
41029
+ }
41030
+ this.textDom.innerText = `\u8BF7\u9009\u62E9\u7B2C\u4E00\u4E2A\u6D4B\u91CF\u70B9\uFF0CEsc\u6216\u5355\u51FB\u9F20\u6807\u53F3\u952E\u53EF\u53D6\u6D88\u9009\u62E9`;
41031
+ });
41032
+ __publicField(this, "anchorChange", (anchor) => {
41033
+ if (!this.hasAnchor && !!anchor) {
41034
+ this.hasAnchor = true;
41035
+ this.textDom.innerText = `\u9009\u62E9\u4E0B\u4E00\u4E2A\u6D4B\u91CF\u70B9\uFF0CEsc\u6216\u5355\u51FB\u9F20\u6807\u53F3\u952E\u53D6\u6D88\u9009\u62E9`;
41036
+ } else if (!anchor) {
41037
+ this.hasAnchor = false;
41038
+ this.textDom.innerText = `\u8BF7\u9009\u62E9\u7B2C\u4E00\u4E2A\u6D4B\u91CF\u70B9\uFF0CEsc\u6216\u5355\u51FB\u9F20\u6807\u53F3\u952E\u53EF\u53D6\u6D88\u9009\u62E9`;
41039
+ }
41040
+ });
41041
+ __publicField(this, "onEditedLineChange", (lines) => {
41042
+ if (lines.length === 1) {
41043
+ this.textDom.innerText = `\u53EF\u4EE5\u8FDE\u7EED\u9009\u62E9\u6D4B\u91CF\u70B9\uFF0C\u6216\u70B9\u51FB\u4E0B\u65B9\u201C\u5B8C\u6210\u201D\u7ED3\u675F\u6D4B\u91CF\uFF08Esc\u53D6\u6D88\uFF0CCommand+S\u4FDD\u5B58\uFF09`;
41044
+ }
41045
+ });
41046
+ this.initDom();
41047
+ params.container.append(this.container);
41048
+ this.measureController = measureController;
41049
+ measureController.hook.on("modeChange", this.onModelChange);
41050
+ measureController.hook.on("anchorChange", this.anchorChange);
41051
+ measureController.hook.on("editedLineChange", this.onEditedLineChange);
41052
+ }
41053
+ dispose() {
41054
+ this.hide();
41055
+ this.container.remove();
41056
+ }
41057
+ show() {
41058
+ this.container.style.opacity = "1";
41059
+ this.container.style.transform = "translate(0, 0)";
41060
+ return this;
41061
+ }
41062
+ hide() {
41063
+ this.container.style.opacity = "0";
41064
+ this.container.style.transform = "translate(0, -10px)";
41065
+ this.measureController.hook.off("modeChange", this.onModelChange);
41066
+ this.measureController.hook.off("anchorChange", this.anchorChange);
41067
+ this.measureController.hook.off("editedLineChange", this.onEditedLineChange);
41068
+ return this;
41069
+ }
41070
+ initDom() {
41071
+ const container = this.container;
41072
+ const textDom = this.textDom;
41073
+ container.classList.add("fpm__guide-container");
41074
+ container.style.position = "absolute";
41075
+ container.style.top = "0px";
41076
+ container.style.left = "0px";
41077
+ container.style.width = "100%";
41078
+ container.style.height = "110px";
41079
+ container.style.display = "flex";
41080
+ container.style.alignItems = "center";
41081
+ container.style.justifyContent = "center";
41082
+ container.style.transform = "translate(0, -10px)";
41083
+ container.style.background = `linear-gradient(180deg, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.00) 100%)`;
41084
+ container.style.transition = "opacity 500ms ease-in-out, transform 500ms ease-in-out";
41085
+ container.style.opacity = "0";
41086
+ textDom.classList.add("fpm__guide-text");
41087
+ textDom.style.color = "#fff";
41088
+ textDom.style.fontSize = "20px";
41089
+ textDom.innerText = `\u70B9\u51FB\u4E0B\u65B9\u201C\u6DFB\u52A0\u201D\u5F00\u59CB\u6D4B\u8DDD`;
41090
+ container.appendChild(textDom);
41091
+ }
41092
+ }
41093
+ class ShortcutKeyController {
41094
+ constructor(measureController, five) {
41095
+ __publicField(this, "five");
41096
+ __publicField(this, "measureController");
41097
+ __publicField(this, "onKeyDown", (e) => {
41098
+ if (e.metaKey && e.code === "KeyS") {
41099
+ this.measureController.save().changeMode("Watch");
41100
+ e.preventDefault();
41101
+ return;
41102
+ }
41103
+ if (e.code === "Escape")
41104
+ return this.escape();
41105
+ });
41106
+ __publicField(this, "onMouseDown", (e) => {
41107
+ if (e.button !== 2)
41108
+ return;
41109
+ e.preventDefault();
41110
+ this.escape();
41111
+ });
41112
+ this.five = five;
41113
+ this.measureController = measureController;
41114
+ const fiveElement = this.five.getElement();
41115
+ if (!fiveElement)
41116
+ return;
41117
+ document.body.addEventListener("keydown", this.onKeyDown);
41118
+ fiveElement.addEventListener("mousedown", this.onMouseDown);
41119
+ }
41120
+ dispose() {
41121
+ const fiveElement = this.five.getElement();
41122
+ if (!fiveElement)
41123
+ return;
41124
+ document.body.removeEventListener("keydown", this.onKeyDown);
41125
+ fiveElement.removeEventListener("mousedown", this.onMouseDown);
41126
+ }
41127
+ escape() {
41128
+ if (this.measureController.getCurrentMode() === "Watch")
41129
+ return this.measureController.disable();
41130
+ return this.measureController.changeMode("Watch");
41131
+ }
41132
+ }
41133
+ class MeasureController {
41134
+ constructor(five, params) {
41135
+ __publicField(this, "hasOpen", false);
41136
+ __publicField(this, "hook", new Subscribe());
41137
+ __publicField(this, "five");
41138
+ __publicField(this, "model");
41139
+ __publicField(this, "group");
41140
+ __publicField(this, "magnifier");
41141
+ __publicField(this, "fiveHelper");
41142
+ __publicField(this, "useUIController");
41143
+ __publicField(this, "params");
41144
+ __publicField(this, "useGuideController");
41145
+ __publicField(this, "container", document.createElement("div"));
41146
+ __publicField(this, "shortcutKeyController");
41147
+ __publicField(this, "controller", null);
41148
+ __publicField(this, "controllerParams");
41149
+ __publicField(this, "getCurrentMode", () => {
41150
+ if (this.controller instanceof EditController)
41151
+ return "Edit";
41152
+ if (this.controller instanceof WatchController)
41153
+ return "Watch";
41154
+ return null;
41155
+ });
41156
+ __publicField(this, "changeMode", (mode) => {
41157
+ var _a;
41158
+ if (!this.hasOpen)
41159
+ return;
41160
+ if (this.getCurrentMode() === mode)
41161
+ return;
41162
+ (_a = this.controller) == null ? void 0 : _a.dispose();
41163
+ const controllerMap = {
41164
+ Watch: WatchController,
41165
+ Edit: EditController
41166
+ };
41167
+ if (!controllerMap[mode])
41168
+ throw new Error("\u4E0D\u5B58\u5728\u7684 Mode");
41169
+ this.controller = new controllerMap[mode](this.controllerParams);
41170
+ this.hook.emit("modeChange", mode);
41171
+ });
41172
+ this.five = five;
41173
+ this.params = params;
41174
+ this.model = new Model({ userDistanceItemCreator: this.params.userDistanceItemCreator });
41175
+ this.fiveHelper = new FiveHelper(five);
41176
+ const magnifierSize = 190;
41177
+ const magnifierScale = 2;
41178
+ this.magnifier = new Magnifier(five, { scale: magnifierScale, width: magnifierSize, height: magnifierSize });
41179
+ this.group = new Group$2();
41180
+ this.group.name = "plugin-measure-group";
41181
+ this.container.classList.add("five-plugin-measure-container");
41182
+ this.container.style.position = "relative";
41183
+ this.container.style.pointerEvents = "none";
41184
+ this.container.style.width = "100%";
41185
+ this.container.style.height = "100%";
41186
+ this.container.style.background = "rgba(0, 0, 0, 0.15)";
41187
+ this.controllerParams = {
41188
+ five: this.five,
41189
+ hook: this.hook,
41190
+ group: this.group,
41191
+ model: this.model,
41192
+ magnifier: this.magnifier,
41193
+ container: this.container,
41194
+ fiveHelper: this.fiveHelper,
41195
+ mouseGroup: getMouseGroup(),
41196
+ userDistanceItemCreator: this.params.userDistanceItemCreator
41197
+ };
41198
+ if (this.params.useUIController !== false)
41199
+ this.useUIController = new UIController(this, this.controllerParams);
41200
+ if (this.params.useUIController !== false)
41201
+ this.useGuideController = new GuideController(this, this.controllerParams);
41202
+ }
41203
+ appendTo(parent) {
41204
+ parent.append(this.container);
41205
+ }
41206
+ dispose() {
41207
+ var _a, _b;
41208
+ this.disable();
41209
+ (_a = this.useUIController) == null ? void 0 : _a.dispose();
41210
+ (_b = this.magnifier) == null ? void 0 : _b.dispose();
41211
+ this.five.needsRender = true;
41212
+ }
41213
+ load(data) {
41214
+ this.model.parse(data);
41215
+ this.save();
41216
+ }
41217
+ enable() {
41218
+ var _a, _b;
41219
+ if (this.hasOpen)
37791
41220
  return;
37792
- this.compassMesh.rotateZ(northRad - Math.PI / 2);
41221
+ this.hasOpen = true;
41222
+ this.five.scene.add(this.group);
41223
+ this.five.helperVisible = false;
41224
+ this.controller = new WatchController(this.controllerParams);
41225
+ (_a = this.useUIController) == null ? void 0 : _a.show();
41226
+ (_b = this.useGuideController) == null ? void 0 : _b.show();
41227
+ this.shortcutKeyController = new ShortcutKeyController(this, this.five);
41228
+ this.hook.emit("enable", true);
41229
+ }
41230
+ disable() {
41231
+ var _a, _b, _c, _d;
41232
+ this.hasOpen = false;
41233
+ (_a = this.controller) == null ? void 0 : _a.dispose();
41234
+ (_b = this.useUIController) == null ? void 0 : _b.hide();
41235
+ (_c = this.useGuideController) == null ? void 0 : _c.hide();
41236
+ (_d = this.shortcutKeyController) == null ? void 0 : _d.dispose();
41237
+ this.controller = null;
41238
+ this.five.helperVisible = true;
41239
+ this.five.scene.remove(this.group);
37793
41240
  this.five.needsRender = true;
41241
+ this.hook.emit("disable", true);
41242
+ }
41243
+ revoke() {
41244
+ if (!(this.controller instanceof EditController))
41245
+ return;
41246
+ this.controller.revoke();
41247
+ return;
41248
+ }
41249
+ removeLineByID(lineID) {
41250
+ this.model.removeLineByID(lineID);
41251
+ }
41252
+ highlightLine(lineID) {
41253
+ if (this.getCurrentMode() !== "Watch")
41254
+ return false;
41255
+ const line = this.model.getLineByID(lineID);
41256
+ if (!line)
41257
+ return false;
41258
+ this.controller.highlightLine(line);
41259
+ return true;
41260
+ }
41261
+ clearHighlightLines() {
41262
+ if (this.getCurrentMode() !== "Watch")
41263
+ return false;
41264
+ this.controller.clearHighlightLines();
41265
+ return true;
41266
+ }
41267
+ save() {
41268
+ if (!(this.controller instanceof EditController))
41269
+ return this;
41270
+ this.model.mergeModel(this.controller.model);
41271
+ return this;
41272
+ }
41273
+ toJson() {
41274
+ return this.model.toJson();
37794
41275
  }
37795
41276
  }
37796
- export { CSS3DRenderPlugin, CameraMovementPlugin, ModelChassisCompassPlugin, ModelEntryDoorGuidePlugin, ModelFloorplanPlugin, ModelRoomLabelPlugin, ModelViewPlugin, PanoCompassPlugin as PanoCompassPluginPlugin, PanoCursorRaycasterPlugin, PanoFloorplanRadarPlugin, PanoRulerPlugin, TopviewFloorplanPlugin };
41277
+ const PanoMeasurePlugin = function MeasurePlugin(five, params) {
41278
+ return new MeasureController(five, params);
41279
+ };
41280
+ export { CSS3DRenderPlugin, CameraMovementPlugin, FLOOR_PLAN_ATTACHED_TO, ModelChassisCompassPlugin, ModelEntryDoorGuidePlugin, ModelFloorplanPlugin, ModelRoomLabelPlugin, ModelViewPlugin, PanoCompassPlugin, PanoCursorRaycasterPlugin, PanoFloorplanRadarPlugin, PanoMeasurePlugin, PanoRulerPlugin, TopviewFloorplanPlugin };