@realsee/dnalogel 2.0.0-alpha.5 → 2.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +44 -5
  3. package/dist/dnalogel.cjs.js +7 -2
  4. package/dist/dnalogel.es.js +3675 -191
  5. package/dist/dnalogel.umd.js +7 -2
  6. package/dist/style.css +1 -1
  7. package/docs/.nojekyll +1 -0
  8. package/docs/assets/highlight.css +78 -0
  9. package/docs/assets/icons.css +1043 -0
  10. package/docs/assets/icons.png +0 -0
  11. package/docs/assets/icons@2x.png +0 -0
  12. package/docs/assets/main.js +52 -0
  13. package/docs/assets/search.js +1 -0
  14. package/docs/assets/style.css +1413 -0
  15. package/docs/assets/widgets.png +0 -0
  16. package/docs/assets/widgets@2x.png +0 -0
  17. package/docs/classes/ModelRoomLabelController.html +20 -0
  18. package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +1 -0
  19. package/docs/enums/ModelFloorplanErrorType.html +1 -0
  20. package/docs/index.html +43 -0
  21. package/docs/interfaces/LineJson.html +1 -0
  22. package/docs/interfaces/ModelChassisCompassPluginData.html +1 -0
  23. package/docs/interfaces/ModelChassisCompassPluginExportType.html +1 -0
  24. package/docs/interfaces/ModelChassisCompassPluginParameterType.html +1 -0
  25. package/docs/interfaces/ModelEntryDoorGuidePluginData.html +1 -0
  26. package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +1 -0
  27. package/docs/interfaces/ModelFloorplanParameterType.html +1 -0
  28. package/docs/interfaces/ModelFloorplanViewEvent.html +5 -0
  29. package/docs/interfaces/ModelRoomLabelPluginData.html +1 -0
  30. package/docs/interfaces/PanoCompassPluginData.html +1 -0
  31. package/docs/interfaces/PanoCompassPluginParameterType.html +1 -0
  32. package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +11 -0
  33. package/docs/interfaces/PanoRulerPluginExportType.html +1 -0
  34. package/docs/interfaces/PanoRulerPluginOptions.html +1 -0
  35. package/docs/interfaces/PanoRulerPluginParameterType.html +1 -0
  36. package/docs/interfaces/PointJson.html +1 -0
  37. package/docs/interfaces/RoomLabel.html +13 -0
  38. package/docs/interfaces/TopviewFloorplanPluginParameterType.html +1 -0
  39. package/docs/modules.html +26 -0
  40. package/libs/CSS3DRenderPlugin/index.js +1 -1
  41. package/libs/ModelEntryDoorGuidePlugin/index.js +1 -0
  42. package/libs/ModelViewPlugin/index.js +6 -6
  43. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.d.ts +1 -0
  44. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.js +1 -0
  45. package/libs/PanoCompassPlugin/getRoomInfoInstance.d.ts +8 -0
  46. package/libs/PanoCompassPlugin/getRoomInfoInstance.js +48 -0
  47. package/libs/PanoCompassPlugin/index.d.ts +29 -3
  48. package/libs/PanoCompassPlugin/index.js +126 -44
  49. package/libs/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
  50. package/libs/PanoMeasurePlugin/Controller/BaseController.js +69 -0
  51. package/libs/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
  52. package/libs/PanoMeasurePlugin/Controller/EditController.js +216 -0
  53. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
  54. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.js +44 -0
  55. package/libs/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
  56. package/libs/PanoMeasurePlugin/Controller/WatchController.js +223 -0
  57. package/libs/PanoMeasurePlugin/Controller/index.d.ts +61 -0
  58. package/libs/PanoMeasurePlugin/Controller/index.js +176 -0
  59. package/libs/PanoMeasurePlugin/Model/index.d.ts +38 -0
  60. package/libs/PanoMeasurePlugin/Model/index.js +114 -0
  61. package/libs/PanoMeasurePlugin/Model/line.d.ts +30 -0
  62. package/libs/PanoMeasurePlugin/Model/line.js +64 -0
  63. package/libs/PanoMeasurePlugin/Model/point.d.ts +16 -0
  64. package/libs/PanoMeasurePlugin/Model/point.js +28 -0
  65. package/libs/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
  66. package/libs/PanoMeasurePlugin/Model/polyline.js +48 -0
  67. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
  68. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.js +15 -0
  69. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
  70. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.js +2 -0
  71. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
  72. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.js +2 -0
  73. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
  74. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.js +108 -0
  75. package/libs/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
  76. package/libs/PanoMeasurePlugin/Modules/FiveHelper.js +33 -0
  77. package/libs/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
  78. package/libs/PanoMeasurePlugin/Modules/GuideController.js +75 -0
  79. package/libs/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
  80. package/libs/PanoMeasurePlugin/Modules/Magnifier.js +103 -0
  81. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
  82. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.js +117 -0
  83. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
  84. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.js +102 -0
  85. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
  86. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.js +35 -0
  87. package/libs/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
  88. package/libs/PanoMeasurePlugin/Modules/UIController/index.js +69 -0
  89. package/libs/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
  90. package/libs/PanoMeasurePlugin/Modules/UIController/style.js +78 -0
  91. package/libs/PanoMeasurePlugin/index.d.ts +7 -0
  92. package/libs/PanoMeasurePlugin/index.js +5 -0
  93. package/libs/PanoMeasurePlugin/typings/data.d.ts +28 -0
  94. package/libs/PanoMeasurePlugin/typings/data.js +1 -0
  95. package/libs/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
  96. package/libs/PanoMeasurePlugin/typings/event.type.js +1 -0
  97. package/libs/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
  98. package/libs/PanoMeasurePlugin/typings/utils.type.js +1 -0
  99. package/libs/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
  100. package/libs/PanoMeasurePlugin/utils/clearGroup.js +3 -0
  101. package/libs/PanoMeasurePlugin/utils/constants.d.ts +4 -0
  102. package/libs/PanoMeasurePlugin/utils/constants.js +31 -0
  103. package/libs/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
  104. package/libs/PanoMeasurePlugin/utils/distanceDom.js +114 -0
  105. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
  106. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.js +21 -0
  107. package/libs/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
  108. package/libs/PanoMeasurePlugin/utils/findClosestPoint.js +27 -0
  109. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
  110. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.js +9 -0
  111. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
  112. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.js +14 -0
  113. package/libs/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
  114. package/libs/PanoMeasurePlugin/utils/ironbox.js +1 -0
  115. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
  116. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.js +6 -0
  117. package/libs/PanoMeasurePlugin/utils/line.d.ts +17 -0
  118. package/libs/PanoMeasurePlugin/utils/line.js +32 -0
  119. package/libs/PanoMeasurePlugin/utils/math.d.ts +17 -0
  120. package/libs/PanoMeasurePlugin/utils/math.js +44 -0
  121. package/libs/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
  122. package/libs/PanoMeasurePlugin/utils/mouseGroup.js +21 -0
  123. package/libs/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
  124. package/libs/PanoMeasurePlugin/utils/ndc2Screen.js +6 -0
  125. package/libs/PanoRulerPlugin/index.js +1 -0
  126. package/libs/PanoRulerPlugin/style.d.ts +1 -1
  127. package/libs/PanoRulerPlugin/style.js +1 -0
  128. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte +3 -3
  129. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte.map +1 -1
  130. package/libs/floorplan/ModelFloorplanPlugin/Controller.d.ts +2 -0
  131. package/libs/floorplan/ModelFloorplanPlugin/Controller.js +3 -2
  132. package/libs/floorplan/TopviewFloorplanPlugin/Controller.d.ts +2 -0
  133. package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +4 -3
  134. package/libs/floorplan/constant.d.ts +5 -0
  135. package/libs/floorplan/constant.js +6 -0
  136. package/libs/floorplan/typings/floorplanServerData.d.ts +4 -0
  137. package/libs/index.d.ts +3 -0
  138. package/libs/index.js +3 -0
  139. package/libs/shared-utils/getPxmm.d.ts +6 -1
  140. package/libs/shared-utils/getPxmm.js +26 -12
  141. package/package.json +4 -3
@@ -22,12 +22,13 @@ 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;
31
+ let renderer = null;
31
32
  const scene = new THREE.Scene();
32
33
  const camera = new THREE.PerspectiveCamera(60, 1, 0.1, 1e3);
33
34
  let model = new THREE.Object3D();
@@ -45,7 +46,6 @@ const ModelViewPlugin = (five) => {
45
46
  scene.add(light);
46
47
  }
47
48
  scene.add(model);
48
- let renderer = null;
49
49
  const initRendererIfNeeds = () => {
50
50
  if (!five.renderer)
51
51
  return;
@@ -58,7 +58,7 @@ const ModelViewPlugin = (five) => {
58
58
  }
59
59
  return renderer;
60
60
  };
61
- const modelWillLoad = () => {
61
+ const handleModelWillLoad = () => {
62
62
  model.traverse((object) => {
63
63
  if (object instanceof THREE.Mesh) {
64
64
  const materials = [].concat(object.material);
@@ -70,7 +70,7 @@ const ModelViewPlugin = (five) => {
70
70
  scene.add(model);
71
71
  update2();
72
72
  };
73
- const modelLoaded = () => {
73
+ const handleModelLoaded = () => {
74
74
  function cloneMaterial(material) {
75
75
  material = material.clone();
76
76
  material.uniforms.modelAlpha.value = 1;
@@ -120,7 +120,7 @@ const ModelViewPlugin = (five) => {
120
120
  camera.aspect = width / height;
121
121
  camera.updateProjectionMatrix();
122
122
  }
123
- needsRender = true;
123
+ update2();
124
124
  };
125
125
  const cameraDistance = () => {
126
126
  const bounding = five.model.bounding;
@@ -162,8 +162,8 @@ const ModelViewPlugin = (five) => {
162
162
  renderer.dispose();
163
163
  renderer = null;
164
164
  };
165
- five.on("modelLoaded", modelLoaded);
166
- five.on("modelWillLoad", modelWillLoad);
165
+ five.on("modelLoaded", handleModelLoaded);
166
+ five.on("modelWillLoad", handleModelWillLoad);
167
167
  five.on("cameraDirectionUpdate", update2);
168
168
  five.on("dispose", dispose);
169
169
  five.on("renderFrame", render);
@@ -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", () => {
@@ -5672,7 +5695,6 @@ class ModelFloorplanPluginController {
5672
5695
  this.five.model.loaded ? this.handleModelLoaded() : five.once("modelLoaded", this.handleModelLoaded);
5673
5696
  five.once("dispose", this.dispose);
5674
5697
  five.on("modeChange", this.handleModeChange);
5675
- five.on("panGesture", this.handlePanGesture);
5676
5698
  five.on("panoArrived", this.handlePanoArrived);
5677
5699
  five.on("wantsChangeMode", this.handleWantsChangeMode);
5678
5700
  five.on("wantsInteriaPan", this.handleWantsInteriaPan);
@@ -5993,8 +6015,8 @@ var MathUtils = {
5993
6015
  var d1 = Math.random() * 4294967295 | 0;
5994
6016
  var d2 = Math.random() * 4294967295 | 0;
5995
6017
  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();
6018
+ 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];
6019
+ return uuid2.toUpperCase();
5998
6020
  },
5999
6021
  clamp: function(value, min, max) {
6000
6022
  return Math.max(min, Math.min(max, value));
@@ -6591,22 +6613,22 @@ Object.assign(Matrix3.prototype, {
6591
6613
  });
6592
6614
  var _canvas;
6593
6615
  var ImageUtils = {
6594
- getDataURL: function(image) {
6616
+ getDataURL: function(image2) {
6595
6617
  var canvas;
6596
6618
  if (typeof HTMLCanvasElement == "undefined") {
6597
- return image.src;
6598
- } else if (image instanceof HTMLCanvasElement) {
6599
- canvas = image;
6619
+ return image2.src;
6620
+ } else if (image2 instanceof HTMLCanvasElement) {
6621
+ canvas = image2;
6600
6622
  } else {
6601
6623
  if (_canvas === void 0)
6602
6624
  _canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
6603
- _canvas.width = image.width;
6604
- _canvas.height = image.height;
6625
+ _canvas.width = image2.width;
6626
+ _canvas.height = image2.height;
6605
6627
  var context = _canvas.getContext("2d");
6606
- if (image instanceof ImageData) {
6607
- context.putImageData(image, 0, 0);
6628
+ if (image2 instanceof ImageData) {
6629
+ context.putImageData(image2, 0, 0);
6608
6630
  } else {
6609
- context.drawImage(image, 0, 0, image.width, image.height);
6631
+ context.drawImage(image2, 0, 0, image2.width, image2.height);
6610
6632
  }
6611
6633
  canvas = _canvas;
6612
6634
  }
@@ -6618,11 +6640,11 @@ var ImageUtils = {
6618
6640
  }
6619
6641
  };
6620
6642
  var textureId = 0;
6621
- function Texture(image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
6643
+ function Texture(image2, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding) {
6622
6644
  Object.defineProperty(this, "id", { value: textureId++ });
6623
6645
  this.uuid = MathUtils.generateUUID();
6624
6646
  this.name = "";
6625
- this.image = image !== void 0 ? image : Texture.DEFAULT_IMAGE;
6647
+ this.image = image2 !== void 0 ? image2 : Texture.DEFAULT_IMAGE;
6626
6648
  this.mipmaps = [];
6627
6649
  this.mapping = mapping !== void 0 ? mapping : Texture.DEFAULT_MAPPING;
6628
6650
  this.wrapS = wrapS !== void 0 ? wrapS : ClampToEdgeWrapping;
@@ -6714,26 +6736,26 @@ Texture.prototype = Object.assign(Object.create(EventDispatcher.prototype), {
6714
6736
  unpackAlignment: this.unpackAlignment
6715
6737
  };
6716
6738
  if (this.image !== void 0) {
6717
- var image = this.image;
6718
- if (image.uuid === void 0) {
6719
- image.uuid = MathUtils.generateUUID();
6739
+ var image2 = this.image;
6740
+ if (image2.uuid === void 0) {
6741
+ image2.uuid = MathUtils.generateUUID();
6720
6742
  }
6721
- if (!isRootObject && meta.images[image.uuid] === void 0) {
6743
+ if (!isRootObject && meta.images[image2.uuid] === void 0) {
6722
6744
  var url;
6723
- if (Array.isArray(image)) {
6745
+ if (Array.isArray(image2)) {
6724
6746
  url = [];
6725
- for (var i = 0, l2 = image.length; i < l2; i++) {
6726
- url.push(ImageUtils.getDataURL(image[i]));
6747
+ for (var i = 0, l2 = image2.length; i < l2; i++) {
6748
+ url.push(ImageUtils.getDataURL(image2[i]));
6727
6749
  }
6728
6750
  } else {
6729
- url = ImageUtils.getDataURL(image);
6751
+ url = ImageUtils.getDataURL(image2);
6730
6752
  }
6731
- meta.images[image.uuid] = {
6732
- uuid: image.uuid,
6753
+ meta.images[image2.uuid] = {
6754
+ uuid: image2.uuid,
6733
6755
  url
6734
6756
  };
6735
6757
  }
6736
- output.image = image.uuid;
6758
+ output.image = image2.uuid;
6737
6759
  }
6738
6760
  if (!isRootObject) {
6739
6761
  meta.textures[this.uuid] = output;
@@ -18006,36 +18028,36 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18006
18028
  function createCanvas(width, height) {
18007
18029
  return useOffscreenCanvas ? new OffscreenCanvas(width, height) : document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
18008
18030
  }
18009
- function resizeImage(image, needsPowerOfTwo, needsNewCanvas, maxSize) {
18031
+ function resizeImage(image2, needsPowerOfTwo, needsNewCanvas, maxSize) {
18010
18032
  var scale = 1;
18011
- if (image.width > maxSize || image.height > maxSize) {
18012
- scale = maxSize / Math.max(image.width, image.height);
18033
+ if (image2.width > maxSize || image2.height > maxSize) {
18034
+ scale = maxSize / Math.max(image2.width, image2.height);
18013
18035
  }
18014
18036
  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) {
18037
+ if (typeof HTMLImageElement !== "undefined" && image2 instanceof HTMLImageElement || typeof HTMLCanvasElement !== "undefined" && image2 instanceof HTMLCanvasElement || typeof ImageBitmap !== "undefined" && image2 instanceof ImageBitmap) {
18016
18038
  var floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;
18017
- var width = floor(scale * image.width);
18018
- var height = floor(scale * image.height);
18039
+ var width = floor(scale * image2.width);
18040
+ var height = floor(scale * image2.height);
18019
18041
  if (_canvas2 === void 0)
18020
18042
  _canvas2 = createCanvas(width, height);
18021
18043
  var canvas = needsNewCanvas ? createCanvas(width, height) : _canvas2;
18022
18044
  canvas.width = width;
18023
18045
  canvas.height = height;
18024
18046
  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 + ").");
18047
+ context.drawImage(image2, 0, 0, width, height);
18048
+ console.warn("THREE.WebGLRenderer: Texture has been resized from (" + image2.width + "x" + image2.height + ") to (" + width + "x" + height + ").");
18027
18049
  return canvas;
18028
18050
  } else {
18029
- if ("data" in image) {
18030
- console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + image.width + "x" + image.height + ").");
18051
+ if ("data" in image2) {
18052
+ console.warn("THREE.WebGLRenderer: Image in DataTexture is too big (" + image2.width + "x" + image2.height + ").");
18031
18053
  }
18032
- return image;
18054
+ return image2;
18033
18055
  }
18034
18056
  }
18035
- return image;
18057
+ return image2;
18036
18058
  }
18037
- function isPowerOfTwo(image) {
18038
- return MathUtils.isPowerOfTwo(image.width) && MathUtils.isPowerOfTwo(image.height);
18059
+ function isPowerOfTwo(image2) {
18060
+ return MathUtils.isPowerOfTwo(image2.width) && MathUtils.isPowerOfTwo(image2.height);
18039
18061
  }
18040
18062
  function textureNeedsPowerOfTwo(texture) {
18041
18063
  if (isWebGL2)
@@ -18164,10 +18186,10 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18164
18186
  if (texture.isVideoTexture)
18165
18187
  updateVideoTexture(texture);
18166
18188
  if (texture.version > 0 && textureProperties.__version !== texture.version) {
18167
- var image = texture.image;
18168
- if (image === void 0) {
18189
+ var image2 = texture.image;
18190
+ if (image2 === void 0) {
18169
18191
  console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");
18170
- } else if (image.complete === false) {
18192
+ } else if (image2.complete === false) {
18171
18193
  console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");
18172
18194
  } else {
18173
18195
  uploadTexture(textureProperties, texture, slot);
@@ -18214,7 +18236,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18214
18236
  cubeImage[i] = isDataTexture ? texture.image[i].image : texture.image[i];
18215
18237
  }
18216
18238
  }
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);
18239
+ 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
18240
  setTextureParameters(34067, texture, supportsMips);
18219
18241
  var mipmaps;
18220
18242
  if (isCompressed) {
@@ -18255,7 +18277,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18255
18277
  textureProperties.__maxMipLevel = mipmaps.length;
18256
18278
  }
18257
18279
  if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
18258
- generateMipmap(34067, texture, image.width, image.height);
18280
+ generateMipmap(34067, texture, image2.width, image2.height);
18259
18281
  }
18260
18282
  textureProperties.__version = texture.version;
18261
18283
  if (texture.onUpdate)
@@ -18339,8 +18361,8 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18339
18361
  _gl.pixelStorei(37441, texture.premultiplyAlpha);
18340
18362
  _gl.pixelStorei(3317, texture.unpackAlignment);
18341
18363
  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);
18364
+ var image2 = resizeImage(texture.image, needsPowerOfTwo, false, maxTextureSize);
18365
+ var supportsMips = isPowerOfTwo(image2) || isWebGL2, glFormat = utils.convert(texture.format), glType = utils.convert(texture.type), glInternalFormat = getInternalFormat(texture.internalFormat, glFormat, glType);
18344
18366
  setTextureParameters(textureType, texture, supportsMips);
18345
18367
  var mipmap, mipmaps = texture.mipmaps;
18346
18368
  if (texture.isDepthTexture) {
@@ -18375,7 +18397,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18375
18397
  glType = utils.convert(texture.type);
18376
18398
  }
18377
18399
  }
18378
- state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null);
18400
+ state.texImage2D(3553, 0, glInternalFormat, image2.width, image2.height, 0, glFormat, glType, null);
18379
18401
  } else if (texture.isDataTexture) {
18380
18402
  if (mipmaps.length > 0 && supportsMips) {
18381
18403
  for (var i = 0, il = mipmaps.length; i < il; i++) {
@@ -18385,7 +18407,7 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18385
18407
  texture.generateMipmaps = false;
18386
18408
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18387
18409
  } else {
18388
- state.texImage2D(3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data);
18410
+ state.texImage2D(3553, 0, glInternalFormat, image2.width, image2.height, 0, glFormat, glType, image2.data);
18389
18411
  textureProperties.__maxMipLevel = 0;
18390
18412
  }
18391
18413
  } else if (texture.isCompressedTexture) {
@@ -18403,10 +18425,10 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18403
18425
  }
18404
18426
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18405
18427
  } else if (texture.isDataTexture2DArray) {
18406
- state.texImage3D(35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data);
18428
+ state.texImage3D(35866, 0, glInternalFormat, image2.width, image2.height, image2.depth, 0, glFormat, glType, image2.data);
18407
18429
  textureProperties.__maxMipLevel = 0;
18408
18430
  } else if (texture.isDataTexture3D) {
18409
- state.texImage3D(32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data);
18431
+ state.texImage3D(32879, 0, glInternalFormat, image2.width, image2.height, image2.depth, 0, glFormat, glType, image2.data);
18410
18432
  textureProperties.__maxMipLevel = 0;
18411
18433
  } else {
18412
18434
  if (mipmaps.length > 0 && supportsMips) {
@@ -18417,12 +18439,12 @@ function WebGLTextures(_gl, extensions, state, properties, capabilities, utils,
18417
18439
  texture.generateMipmaps = false;
18418
18440
  textureProperties.__maxMipLevel = mipmaps.length - 1;
18419
18441
  } else {
18420
- state.texImage2D(3553, 0, glInternalFormat, glFormat, glType, image);
18442
+ state.texImage2D(3553, 0, glInternalFormat, glFormat, glType, image2);
18421
18443
  textureProperties.__maxMipLevel = 0;
18422
18444
  }
18423
18445
  }
18424
18446
  if (textureNeedsGenerateMipmaps(texture, supportsMips)) {
18425
- generateMipmap(textureType, texture, image.width, image.height);
18447
+ generateMipmap(textureType, texture, image2.width, image2.height);
18426
18448
  }
18427
18449
  textureProperties.__version = texture.version;
18428
18450
  if (texture.onUpdate)
@@ -19891,10 +19913,10 @@ function WebGLRenderer(parameters) {
19891
19913
  renderer.setMode(4);
19892
19914
  }
19893
19915
  } else if (object.isLine) {
19894
- var lineWidth = material.linewidth;
19895
- if (lineWidth === void 0)
19896
- lineWidth = 1;
19897
- state.setLineWidth(lineWidth * getTargetPixelRatio());
19916
+ var lineWidth2 = material.linewidth;
19917
+ if (lineWidth2 === void 0)
19918
+ lineWidth2 = 1;
19919
+ state.setLineWidth(lineWidth2 * getTargetPixelRatio());
19898
19920
  if (object.isLineSegments) {
19899
19921
  renderer.setMode(1);
19900
19922
  } else if (object.isLineLoop) {
@@ -21270,7 +21292,7 @@ var _end = new Vector3();
21270
21292
  var _inverseMatrix$1 = new Matrix4();
21271
21293
  var _ray$1 = new Ray();
21272
21294
  var _sphere$2 = new Sphere();
21273
- function Line(geometry, material, mode) {
21295
+ function Line$1(geometry, material, mode) {
21274
21296
  if (mode === 1) {
21275
21297
  console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");
21276
21298
  }
@@ -21280,8 +21302,8 @@ function Line(geometry, material, mode) {
21280
21302
  this.material = material !== void 0 ? material : new LineBasicMaterial();
21281
21303
  this.updateMorphTargets();
21282
21304
  }
21283
- Line.prototype = Object.assign(Object.create(Object3D.prototype), {
21284
- constructor: Line,
21305
+ Line$1.prototype = Object.assign(Object.create(Object3D.prototype), {
21306
+ constructor: Line$1,
21285
21307
  isLine: true,
21286
21308
  computeLineDistances: function() {
21287
21309
  var geometry = this.geometry;
@@ -21432,10 +21454,10 @@ Line.prototype = Object.assign(Object.create(Object3D.prototype), {
21432
21454
  var _start$1 = new Vector3();
21433
21455
  var _end$1 = new Vector3();
21434
21456
  function LineSegments(geometry, material) {
21435
- Line.call(this, geometry, material);
21457
+ Line$1.call(this, geometry, material);
21436
21458
  this.type = "LineSegments";
21437
21459
  }
21438
- LineSegments.prototype = Object.assign(Object.create(Line.prototype), {
21460
+ LineSegments.prototype = Object.assign(Object.create(Line$1.prototype), {
21439
21461
  constructor: LineSegments,
21440
21462
  isLineSegments: true,
21441
21463
  computeLineDistances: function() {
@@ -21468,10 +21490,10 @@ LineSegments.prototype = Object.assign(Object.create(Line.prototype), {
21468
21490
  }
21469
21491
  });
21470
21492
  function LineLoop(geometry, material) {
21471
- Line.call(this, geometry, material);
21493
+ Line$1.call(this, geometry, material);
21472
21494
  this.type = "LineLoop";
21473
21495
  }
21474
- LineLoop.prototype = Object.assign(Object.create(Line.prototype), {
21496
+ LineLoop.prototype = Object.assign(Object.create(Line$1.prototype), {
21475
21497
  constructor: LineLoop,
21476
21498
  isLineLoop: true
21477
21499
  });
@@ -26080,32 +26102,32 @@ ImageLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26080
26102
  }, 0);
26081
26103
  return cached;
26082
26104
  }
26083
- var image = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
26105
+ var image2 = document.createElementNS("http://www.w3.org/1999/xhtml", "img");
26084
26106
  function onImageLoad() {
26085
- image.removeEventListener("load", onImageLoad, false);
26086
- image.removeEventListener("error", onImageError, false);
26107
+ image2.removeEventListener("load", onImageLoad, false);
26108
+ image2.removeEventListener("error", onImageError, false);
26087
26109
  Cache.add(url, this);
26088
26110
  if (onLoad)
26089
26111
  onLoad(this);
26090
26112
  scope.manager.itemEnd(url);
26091
26113
  }
26092
26114
  function onImageError(event) {
26093
- image.removeEventListener("load", onImageLoad, false);
26094
- image.removeEventListener("error", onImageError, false);
26115
+ image2.removeEventListener("load", onImageLoad, false);
26116
+ image2.removeEventListener("error", onImageError, false);
26095
26117
  if (onError)
26096
26118
  onError(event);
26097
26119
  scope.manager.itemError(url);
26098
26120
  scope.manager.itemEnd(url);
26099
26121
  }
26100
- image.addEventListener("load", onImageLoad, false);
26101
- image.addEventListener("error", onImageError, false);
26122
+ image2.addEventListener("load", onImageLoad, false);
26123
+ image2.addEventListener("error", onImageError, false);
26102
26124
  if (url.substr(0, 5) !== "data:") {
26103
26125
  if (this.crossOrigin !== void 0)
26104
- image.crossOrigin = this.crossOrigin;
26126
+ image2.crossOrigin = this.crossOrigin;
26105
26127
  }
26106
26128
  scope.manager.itemStart(url);
26107
- image.src = url;
26108
- return image;
26129
+ image2.src = url;
26130
+ return image2;
26109
26131
  }
26110
26132
  });
26111
26133
  function CubeTextureLoader(manager) {
@@ -26120,8 +26142,8 @@ CubeTextureLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26120
26142
  loader.setPath(this.path);
26121
26143
  var loaded = 0;
26122
26144
  function loadTexture2(i2) {
26123
- loader.load(urls[i2], function(image) {
26124
- texture.images[i2] = image;
26145
+ loader.load(urls[i2], function(image2) {
26146
+ texture.images[i2] = image2;
26125
26147
  loaded++;
26126
26148
  if (loaded === 6) {
26127
26149
  texture.needsUpdate = true;
@@ -26146,8 +26168,8 @@ TextureLoader.prototype = Object.assign(Object.create(Loader.prototype), {
26146
26168
  var loader = new ImageLoader(this.manager);
26147
26169
  loader.setCrossOrigin(this.crossOrigin);
26148
26170
  loader.setPath(this.path);
26149
- loader.load(url, function(image) {
26150
- texture.image = image;
26171
+ loader.load(url, function(image2) {
26172
+ texture.image = image2;
26151
26173
  var isJPEG = url.search(/\.jpe?g($|\?)/i) > 0 || url.search(/^data\:image\/jpeg/) === 0;
26152
26174
  texture.format = isJPEG ? RGBFormat : RGBAFormat;
26153
26175
  texture.needsUpdate = true;
@@ -28352,18 +28374,18 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28352
28374
  var loader = new ImageLoader(manager);
28353
28375
  loader.setCrossOrigin(this.crossOrigin);
28354
28376
  for (var i = 0, il = json.length; i < il; i++) {
28355
- var image = json[i];
28356
- var url = image.url;
28377
+ var image2 = json[i];
28378
+ var url = image2.url;
28357
28379
  if (Array.isArray(url)) {
28358
- images[image.uuid] = [];
28380
+ images[image2.uuid] = [];
28359
28381
  for (var j = 0, jl = url.length; j < jl; j++) {
28360
28382
  var currentUrl = url[j];
28361
28383
  var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(currentUrl) ? currentUrl : scope.resourcePath + currentUrl;
28362
- images[image.uuid].push(loadImage(path));
28384
+ images[image2.uuid].push(loadImage(path));
28363
28385
  }
28364
28386
  } else {
28365
- var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url) ? image.url : scope.resourcePath + image.url;
28366
- images[image.uuid] = loadImage(path);
28387
+ var path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test(image2.url) ? image2.url : scope.resourcePath + image2.url;
28388
+ images[image2.uuid] = loadImage(path);
28367
28389
  }
28368
28390
  }
28369
28391
  }
@@ -28447,11 +28469,11 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28447
28469
  if (Array.isArray(name)) {
28448
28470
  var array = [];
28449
28471
  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);
28472
+ var uuid2 = name[i2];
28473
+ if (materials[uuid2] === void 0) {
28474
+ console.warn("THREE.ObjectLoader: Undefined material", uuid2);
28453
28475
  }
28454
- array.push(materials[uuid]);
28476
+ array.push(materials[uuid2]);
28455
28477
  }
28456
28478
  return array;
28457
28479
  }
@@ -28536,7 +28558,7 @@ ObjectLoader.prototype = Object.assign(Object.create(Loader.prototype), {
28536
28558
  object = new LOD();
28537
28559
  break;
28538
28560
  case "Line":
28539
- object = new Line(getGeometry(data.geometry), getMaterial(data.material), data.mode);
28561
+ object = new Line$1(getGeometry(data.geometry), getMaterial(data.material), data.mode);
28540
28562
  break;
28541
28563
  case "LineLoop":
28542
28564
  object = new LineLoop(getGeometry(data.geometry), getMaterial(data.material));
@@ -30024,10 +30046,10 @@ Object.assign(AnimationObjectGroup.prototype, {
30024
30046
  add: function() {
30025
30047
  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
30048
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30027
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30049
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30028
30050
  if (index === void 0) {
30029
30051
  index = nObjects++;
30030
- indicesByUUID[uuid] = index;
30052
+ indicesByUUID[uuid2] = index;
30031
30053
  objects.push(object);
30032
30054
  for (var j = 0, m = nBindings; j !== m; ++j) {
30033
30055
  bindings[j].push(new PropertyBinding(object, paths[j], parsedPaths[j]));
@@ -30037,7 +30059,7 @@ Object.assign(AnimationObjectGroup.prototype, {
30037
30059
  var firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex];
30038
30060
  indicesByUUID[lastCachedObject.uuid] = index;
30039
30061
  objects[index] = lastCachedObject;
30040
- indicesByUUID[uuid] = firstActiveIndex;
30062
+ indicesByUUID[uuid2] = firstActiveIndex;
30041
30063
  objects[firstActiveIndex] = object;
30042
30064
  for (var j = 0, m = nBindings; j !== m; ++j) {
30043
30065
  var bindingsForPath = bindings[j], lastCached = bindingsForPath[firstActiveIndex], binding = bindingsForPath[index];
@@ -30056,12 +30078,12 @@ Object.assign(AnimationObjectGroup.prototype, {
30056
30078
  remove: function() {
30057
30079
  var objects = this._objects, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length;
30058
30080
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30059
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30081
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30060
30082
  if (index !== void 0 && index >= nCachedObjects) {
30061
30083
  var lastCachedIndex = nCachedObjects++, firstActiveObject = objects[lastCachedIndex];
30062
30084
  indicesByUUID[firstActiveObject.uuid] = index;
30063
30085
  objects[index] = firstActiveObject;
30064
- indicesByUUID[uuid] = lastCachedIndex;
30086
+ indicesByUUID[uuid2] = lastCachedIndex;
30065
30087
  objects[lastCachedIndex] = object;
30066
30088
  for (var j = 0, m = nBindings; j !== m; ++j) {
30067
30089
  var bindingsForPath = bindings[j], firstActive = bindingsForPath[lastCachedIndex], binding = bindingsForPath[index];
@@ -30075,9 +30097,9 @@ Object.assign(AnimationObjectGroup.prototype, {
30075
30097
  uncache: function() {
30076
30098
  var objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length;
30077
30099
  for (var i = 0, n = arguments.length; i !== n; ++i) {
30078
- var object = arguments[i], uuid = object.uuid, index = indicesByUUID[uuid];
30100
+ var object = arguments[i], uuid2 = object.uuid, index = indicesByUUID[uuid2];
30079
30101
  if (index !== void 0) {
30080
- delete indicesByUUID[uuid];
30102
+ delete indicesByUUID[uuid2];
30081
30103
  if (index < nCachedObjects) {
30082
30104
  var firstActiveIndex = --nCachedObjects, lastCachedObject = objects[firstActiveIndex], lastIndex = --nObjects, lastObject = objects[lastIndex];
30083
30105
  indicesByUUID[lastCachedObject.uuid] = index;
@@ -31505,11 +31527,11 @@ function DirectionalLightHelper(light, size, color) {
31505
31527
  0
31506
31528
  ], 3));
31507
31529
  var material = new LineBasicMaterial({ fog: false, toneMapped: false });
31508
- this.lightPlane = new Line(geometry, material);
31530
+ this.lightPlane = new Line$1(geometry, material);
31509
31531
  this.add(this.lightPlane);
31510
31532
  geometry = new BufferGeometry();
31511
31533
  geometry.setAttribute("position", new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3));
31512
- this.targetLine = new Line(geometry, material);
31534
+ this.targetLine = new Line$1(geometry, material);
31513
31535
  this.add(this.targetLine);
31514
31536
  this.update();
31515
31537
  }
@@ -31740,7 +31762,7 @@ function PlaneHelper(plane, size, hex) {
31740
31762
  var geometry = new BufferGeometry();
31741
31763
  geometry.setAttribute("position", new Float32BufferAttribute(positions, 3));
31742
31764
  geometry.computeBoundingSphere();
31743
- Line.call(this, geometry, new LineBasicMaterial({ color, toneMapped: false }));
31765
+ Line$1.call(this, geometry, new LineBasicMaterial({ color, toneMapped: false }));
31744
31766
  this.type = "PlaneHelper";
31745
31767
  var positions2 = [1, 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1];
31746
31768
  var geometry2 = new BufferGeometry();
@@ -31748,7 +31770,7 @@ function PlaneHelper(plane, size, hex) {
31748
31770
  geometry2.computeBoundingSphere();
31749
31771
  this.add(new Mesh(geometry2, new MeshBasicMaterial({ color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false })));
31750
31772
  }
31751
- PlaneHelper.prototype = Object.create(Line.prototype);
31773
+ PlaneHelper.prototype = Object.create(Line$1.prototype);
31752
31774
  PlaneHelper.prototype.constructor = PlaneHelper;
31753
31775
  PlaneHelper.prototype.updateMatrixWorld = function(force) {
31754
31776
  var scale = -this.plane.constant;
@@ -31783,7 +31805,7 @@ function ArrowHelper(dir, origin, length, color, headLength, headWidth) {
31783
31805
  _coneGeometry.translate(0, -0.5, 0);
31784
31806
  }
31785
31807
  this.position.copy(origin);
31786
- this.line = new Line(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false }));
31808
+ this.line = new Line$1(_lineGeometry, new LineBasicMaterial({ color, toneMapped: false }));
31787
31809
  this.line.matrixAutoUpdate = false;
31788
31810
  this.add(this.line);
31789
31811
  this.cone = new Mesh(_coneGeometry, new MeshBasicMaterial({ color, toneMapped: false }));
@@ -33791,8 +33813,8 @@ var FBXLoader = function() {
33791
33813
  var arrayBufferContent = videoNode.Content instanceof ArrayBuffer && videoNode.Content.byteLength > 0;
33792
33814
  var base64Content = typeof videoNode.Content === "string" && videoNode.Content !== "";
33793
33815
  if (arrayBufferContent || base64Content) {
33794
- var image = this.parseImage(videoNodes[nodeID]);
33795
- blobs[videoNode.RelativeFilename || videoNode.Filename] = image;
33816
+ var image2 = this.parseImage(videoNodes[nodeID]);
33817
+ blobs[videoNode.RelativeFilename || videoNode.Filename] = image2;
33796
33818
  }
33797
33819
  }
33798
33820
  }
@@ -34368,7 +34390,7 @@ var FBXLoader = function() {
34368
34390
  return geo;
34369
34391
  }, null);
34370
34392
  var material = new LineBasicMaterial({ color: 3342591, linewidth: 1 });
34371
- return new Line(geometry, material);
34393
+ return new Line$1(geometry, material);
34372
34394
  },
34373
34395
  getTransformData: function(model, modelNode) {
34374
34396
  var transformData = {};
@@ -34484,17 +34506,17 @@ var FBXLoader = function() {
34484
34506
  });
34485
34507
  },
34486
34508
  setupMorphMaterial: function(child, material, index) {
34487
- var uuid = child.uuid;
34509
+ var uuid2 = child.uuid;
34488
34510
  var matUuid = material.uuid;
34489
34511
  var sharedMat = false;
34490
34512
  sceneGraph.traverse(function(node) {
34491
34513
  if (node.isMesh) {
34492
34514
  if (Array.isArray(node.material)) {
34493
34515
  node.material.forEach(function(mat) {
34494
- if (mat.uuid === matUuid && node.uuid !== uuid)
34516
+ if (mat.uuid === matUuid && node.uuid !== uuid2)
34495
34517
  sharedMat = true;
34496
34518
  });
34497
- } else if (node.material.uuid === matUuid && node.uuid !== uuid)
34519
+ } else if (node.material.uuid === matUuid && node.uuid !== uuid2)
34498
34520
  sharedMat = true;
34499
34521
  }
34500
34522
  });
@@ -36264,6 +36286,7 @@ const ModelEntryDoorGuidePlugin = (five, params) => {
36264
36286
  if (!state.enabled)
36265
36287
  return true;
36266
36288
  state.enabled = false;
36289
+ hide();
36267
36290
  five.off("modeChange", modeChangeHandler);
36268
36291
  return true;
36269
36292
  };
@@ -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
+ };
39605
+ }
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
+ };
37780
39612
  }
37781
- fixPosition(panoIndex) {
37782
- if (!this.compassMesh)
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();
40017
+ this.five.needsRender = true;
40018
+ }
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();
37787
40230
  this.five.needsRender = true;
37788
40231
  }
37789
- fixRotation(northRad) {
37790
- if (!this.compassMesh)
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)
37791
40595
  return;
37792
- this.compassMesh.rotateZ(northRad - Math.PI / 2);
40596
+ line.selected = true;
40597
+ this.group.add(line.lightMesh);
40598
+ line.distanceItem.highlight();
37793
40599
  this.five.needsRender = true;
37794
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)
41220
+ return;
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);
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();
41275
+ }
37795
41276
  }
37796
- export { CSS3DRenderPlugin, CameraMovementPlugin, ModelChassisCompassPlugin, ModelEntryDoorGuidePlugin, ModelFloorplanPlugin, ModelRoomLabelPlugin, ModelViewPlugin, PanoCompassPlugin, 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 };