@realsee/dnalogel 2.0.0-alpha.4 → 2.0.0-alpha.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +44 -5
  3. package/dist/dnalogel.cjs.js +7 -2
  4. package/dist/dnalogel.es.js +3668 -184
  5. package/dist/dnalogel.umd.js +7 -2
  6. package/dist/style.css +1 -1
  7. package/libs/CSS3DRenderPlugin/index.js +1 -1
  8. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.d.ts +1 -0
  9. package/libs/PanoCompassPlugin/Assets/roomInfoIcon.js +1 -0
  10. package/libs/PanoCompassPlugin/getRoomInfoInstance.d.ts +8 -0
  11. package/libs/PanoCompassPlugin/getRoomInfoInstance.js +48 -0
  12. package/libs/PanoCompassPlugin/index.d.ts +29 -3
  13. package/libs/PanoCompassPlugin/index.js +126 -44
  14. package/libs/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
  15. package/libs/PanoMeasurePlugin/Controller/BaseController.js +69 -0
  16. package/libs/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
  17. package/libs/PanoMeasurePlugin/Controller/EditController.js +216 -0
  18. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
  19. package/libs/PanoMeasurePlugin/Controller/ShortcutKeyController.js +44 -0
  20. package/libs/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
  21. package/libs/PanoMeasurePlugin/Controller/WatchController.js +223 -0
  22. package/libs/PanoMeasurePlugin/Controller/index.d.ts +61 -0
  23. package/libs/PanoMeasurePlugin/Controller/index.js +176 -0
  24. package/libs/PanoMeasurePlugin/Model/index.d.ts +38 -0
  25. package/libs/PanoMeasurePlugin/Model/index.js +114 -0
  26. package/libs/PanoMeasurePlugin/Model/line.d.ts +30 -0
  27. package/libs/PanoMeasurePlugin/Model/line.js +64 -0
  28. package/libs/PanoMeasurePlugin/Model/point.d.ts +16 -0
  29. package/libs/PanoMeasurePlugin/Model/point.js +28 -0
  30. package/libs/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
  31. package/libs/PanoMeasurePlugin/Model/polyline.js +48 -0
  32. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
  33. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.js +15 -0
  34. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
  35. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.js +2 -0
  36. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
  37. package/libs/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.js +2 -0
  38. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
  39. package/libs/PanoMeasurePlugin/Modules/DeleteDom/index.js +108 -0
  40. package/libs/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
  41. package/libs/PanoMeasurePlugin/Modules/FiveHelper.js +33 -0
  42. package/libs/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
  43. package/libs/PanoMeasurePlugin/Modules/GuideController.js +75 -0
  44. package/libs/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
  45. package/libs/PanoMeasurePlugin/Modules/Magnifier.js +103 -0
  46. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
  47. package/libs/PanoMeasurePlugin/Modules/UIController/HTML.js +117 -0
  48. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
  49. package/libs/PanoMeasurePlugin/Modules/UIController/MainBtnController.js +102 -0
  50. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
  51. package/libs/PanoMeasurePlugin/Modules/UIController/Revoke/index.js +35 -0
  52. package/libs/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
  53. package/libs/PanoMeasurePlugin/Modules/UIController/index.js +69 -0
  54. package/libs/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
  55. package/libs/PanoMeasurePlugin/Modules/UIController/style.js +78 -0
  56. package/libs/PanoMeasurePlugin/index.d.ts +7 -0
  57. package/libs/PanoMeasurePlugin/index.js +5 -0
  58. package/libs/PanoMeasurePlugin/typings/data.d.ts +28 -0
  59. package/libs/PanoMeasurePlugin/typings/data.js +1 -0
  60. package/libs/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
  61. package/libs/PanoMeasurePlugin/typings/event.type.js +1 -0
  62. package/libs/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
  63. package/libs/PanoMeasurePlugin/typings/utils.type.js +1 -0
  64. package/libs/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
  65. package/libs/PanoMeasurePlugin/utils/clearGroup.js +3 -0
  66. package/libs/PanoMeasurePlugin/utils/constants.d.ts +4 -0
  67. package/libs/PanoMeasurePlugin/utils/constants.js +31 -0
  68. package/libs/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
  69. package/libs/PanoMeasurePlugin/utils/distanceDom.js +114 -0
  70. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
  71. package/libs/PanoMeasurePlugin/utils/findAssociatedLines.js +21 -0
  72. package/libs/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
  73. package/libs/PanoMeasurePlugin/utils/findClosestPoint.js +27 -0
  74. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
  75. package/libs/PanoMeasurePlugin/utils/getIntersectionFromEvent.js +9 -0
  76. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
  77. package/libs/PanoMeasurePlugin/utils/getPointFromHammerEvent.js +14 -0
  78. package/libs/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
  79. package/libs/PanoMeasurePlugin/utils/ironbox.js +1 -0
  80. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
  81. package/libs/PanoMeasurePlugin/utils/isNDCPointInScreen.js +6 -0
  82. package/libs/PanoMeasurePlugin/utils/line.d.ts +17 -0
  83. package/libs/PanoMeasurePlugin/utils/line.js +32 -0
  84. package/libs/PanoMeasurePlugin/utils/math.d.ts +17 -0
  85. package/libs/PanoMeasurePlugin/utils/math.js +44 -0
  86. package/libs/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
  87. package/libs/PanoMeasurePlugin/utils/mouseGroup.js +21 -0
  88. package/libs/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
  89. package/libs/PanoMeasurePlugin/utils/ndc2Screen.js +6 -0
  90. package/libs/PanoRulerPlugin/index.js +1 -0
  91. package/libs/PanoRulerPlugin/style.d.ts +1 -1
  92. package/libs/PanoRulerPlugin/style.js +1 -0
  93. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte +3 -3
  94. package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte.map +1 -1
  95. package/libs/floorplan/ModelFloorplanPlugin/Controller.d.ts +2 -0
  96. package/libs/floorplan/ModelFloorplanPlugin/Controller.js +3 -1
  97. package/libs/floorplan/TopviewFloorplanPlugin/Controller.d.ts +2 -0
  98. package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +4 -3
  99. package/libs/floorplan/constant.d.ts +5 -0
  100. package/libs/floorplan/constant.js +6 -0
  101. package/libs/floorplan/typings/floorplanServerData.d.ts +4 -0
  102. package/libs/index.d.ts +4 -1
  103. package/libs/index.js +4 -1
  104. package/libs/shared-utils/getPxmm.d.ts +6 -1
  105. package/libs/shared-utils/getPxmm.js +26 -12
  106. package/package.json +2 -1
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .room-label-item.svelte-17nkflf{position:absolute;font-size:.41667rem;z-index:0;transform:none;cursor:pointer;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.room-label-item__text.svelte-17nkflf{position:absolute;left:0;top:-3.33333rem;transform:translate(-50%);display:flex;justify-content:center;align-items:center;height:1.04167rem;min-width:1.66667rem;padding:0 .3125rem;pointer-events:all;background-size:100% 100%;background-repeat:no-repeat;white-space:nowrap}.room-label-item__bar.svelte-17nkflf{position:absolute;top:-2.29167rem;height:2.5rem;width:1px;background-image:linear-gradient(to bottom,rgba(255,255,255,1),rgba(255,255,255,0))}.wide.svelte-17nkflf{font-size:.52083rem}.room-labels-container.svelte-185yvaa{width:100%;height:100%;position:relative;color:#fff}.floorplan__camera-position.svelte-1kosz2p{position:absolute;width:0;height:0}.floorplan__camera-rotate.svelte-1kosz2p{position:absolute;left:.78125rem;top:.78125rem;transform-origin:.78125rem .78125rem;background-repeat:no-repeat;background-size:100%}.floorplan-plugin__compass.svelte-5l80pv{position:absolute;left:50%;top:-2.39583rem;width:12.03125rem;height:2.13542rem;will-change:opacity;transform-origin:center 9.58333rem}.floorplan-plugin__compass-image.svelte-5l80pv{width:100%;height:100%;position:absolute;left:0;top:0;opacity:.1;background-repeat:no-repeat;background-size:100% 100%}.floorplan-plugin__compass-text.svelte-5l80pv{position:absolute;left:50%;top:.78125rem;transform:translate(-50%);opacity:.2;font-weight:700;font-size:.52083rem;color:#fff}.floorplan-plugin__room-label-item.svelte-1ashbdx{position:absolute;display:flex;flex-flow:column;align-items:center;line-height:.78125rem;color:#fff;transform:translate(-50%,-50%);white-space:nowrap}.floorplan-plugin__room-size.svelte-1ashbdx{opacity:.45}.floorplan-plugin__room-labels.svelte-sw25w3{width:100%;height:100%;position:absolute;left:0;top:0;z-index:20}.floorplan-plugin__rule-labels.svelte-1rr09in{position:absolute;height:.26042rem;display:flex;align-items:center}.floorplan-plugin__rule-labels-top.svelte-1rr09in{left:0;top:0}.floorplan-plugin__rule-labels-bottom.svelte-1rr09in{left:0;bottom:0}.floorplan-plugin__rule-labels-left.svelte-1rr09in{bottom:0;left:0}.floorplan-plugin__rule-labels-right.svelte-1rr09in{bottom:0;right:0}.floorplan-plugin__rule-line.svelte-1rr09in{background:#fff;opacity:.05;width:100%;height:1px}.floorplan-plugin__rule-scale.svelte-1rr09in{position:absolute;background:#fff;opacity:.05;transform-origin:center;width:1px;height:.26042rem}.floorplan-plugin__text-wrapper.svelte-1rr09in{width:0;height:0;position:absolute}.floorplan-plugin__text-wrapper.floorplan-plugin__text-wrapper--is-left-or-top.svelte-1rr09in{top:.52083rem}.floorplan-plugin__text-wrapper.floorplan-plugin__text-wrapper-is-right-or-bottom.svelte-1rr09in{bottom:.52083rem}.floorplan-plugin__rule-text.svelte-1rr09in{position:absolute;width:-webkit-max-content;width:-moz-max-content;width:max-content;display:block;transform:translate(-50%,-50%) rotate(180deg);font-size:.52083rem;color:#fff;opacity:.2}.floorplan-plugin__rule-text.is-row.svelte-1rr09in{transform:translate(-50%,-50%)}img.svelte-1cuuebb,.floorplan-plugin__base-image.svelte-1qqy56u{width:100%;height:100%}.floorplan-plugin__base-image.svelte-126ja8e{position:absolute;z-index:10;width:100%;height:100%;pointer-events:none}svg.svelte-1b0icjc{position:absolute;width:100%;height:100%;overflow:visible}path.svelte-11takew{opacity:0}path.svelte-11takew:hover{opacity:.1}.floorplan-plugin__room-highlight.svelte-1aais5l{position:absolute;width:100%;height:100%;pointer-events:all}svg.svelte-1aais5l{width:100%;height:100%;overflow:visible}.floorplan-current-floor.svelte-3pdgs4{position:relative;width:100%;height:100%}.floorplan-main.svelte-177x2q7{width:100%;height:100%}.plugin-radar__camera-wrapper.svelte-o7uo2v{width:100%;height:100%;position:absolute;pointer-events:none}.plugin-radar__camera-position.svelte-o7uo2v{position:absolute;left:0;top:0;width:0;height:0;transform:none;pointer-events:none;transition:transform 1s linear}.plugin-radar__camera-rotate.svelte-o7uo2v{position:absolute;left:-.78125rem;top:-.78125rem;width:.88542rem;height:.88542rem;transform-origin:.78125rem .78125rem;transform:rotate(45deg);background-repeat:no-repeat;background-size:100%}.plugin-pano-floorplan__extra-objects.svelte-8n0d4v{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.plugin-pano-floorplan__extra-object-item--position.svelte-8n0d4v{position:absolute;width:0;height:0}.plugin-pano-floorplan__extra-object-item.svelte-8n0d4v{transform:translate(-50%,-50%)}.plugin-floorplan-radar.svelte-7d8ub2{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.plugin-floorplan-radar-container.svelte-7d8ub2{position:relative}
1
+ .room-label-item.svelte-17nkflf{position:absolute;font-size:.41667rem;z-index:0;transform:none;cursor:pointer;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.room-label-item__text.svelte-17nkflf{position:absolute;left:0;top:-3.33333rem;transform:translate(-50%);display:flex;justify-content:center;align-items:center;height:1.04167rem;min-width:1.66667rem;padding:0 .3125rem;pointer-events:all;background-size:100% 100%;background-repeat:no-repeat;white-space:nowrap}.room-label-item__bar.svelte-17nkflf{position:absolute;top:-2.29167rem;height:2.5rem;width:1px;background-image:linear-gradient(to bottom,rgba(255,255,255,1),rgba(255,255,255,0))}.wide.svelte-17nkflf{font-size:.52083rem}.room-labels-container.svelte-185yvaa{width:100%;height:100%;position:relative;color:#fff}.floorplan__camera-position.svelte-e8a2kn{position:absolute;width:0;height:0}.floorplan__camera-rotate.svelte-e8a2kn{position:absolute;background-repeat:no-repeat;background-size:100%}.floorplan-plugin__compass.svelte-5l80pv{position:absolute;left:50%;top:-2.39583rem;width:12.03125rem;height:2.13542rem;will-change:opacity;transform-origin:center 9.58333rem}.floorplan-plugin__compass-image.svelte-5l80pv{width:100%;height:100%;position:absolute;left:0;top:0;opacity:.1;background-repeat:no-repeat;background-size:100% 100%}.floorplan-plugin__compass-text.svelte-5l80pv{position:absolute;left:50%;top:.78125rem;transform:translate(-50%);opacity:.2;font-weight:700;font-size:.52083rem;color:#fff}.floorplan-plugin__room-label-item.svelte-1ashbdx{position:absolute;display:flex;flex-flow:column;align-items:center;line-height:.78125rem;color:#fff;transform:translate(-50%,-50%);white-space:nowrap}.floorplan-plugin__room-size.svelte-1ashbdx{opacity:.45}.floorplan-plugin__room-labels.svelte-sw25w3{width:100%;height:100%;position:absolute;left:0;top:0;z-index:20}.floorplan-plugin__rule-labels.svelte-1rr09in{position:absolute;height:.26042rem;display:flex;align-items:center}.floorplan-plugin__rule-labels-top.svelte-1rr09in{left:0;top:0}.floorplan-plugin__rule-labels-bottom.svelte-1rr09in{left:0;bottom:0}.floorplan-plugin__rule-labels-left.svelte-1rr09in{bottom:0;left:0}.floorplan-plugin__rule-labels-right.svelte-1rr09in{bottom:0;right:0}.floorplan-plugin__rule-line.svelte-1rr09in{background:#fff;opacity:.05;width:100%;height:1px}.floorplan-plugin__rule-scale.svelte-1rr09in{position:absolute;background:#fff;opacity:.05;transform-origin:center;width:1px;height:.26042rem}.floorplan-plugin__text-wrapper.svelte-1rr09in{width:0;height:0;position:absolute}.floorplan-plugin__text-wrapper.floorplan-plugin__text-wrapper--is-left-or-top.svelte-1rr09in{top:.52083rem}.floorplan-plugin__text-wrapper.floorplan-plugin__text-wrapper-is-right-or-bottom.svelte-1rr09in{bottom:.52083rem}.floorplan-plugin__rule-text.svelte-1rr09in{position:absolute;width:-webkit-max-content;width:-moz-max-content;width:max-content;display:block;transform:translate(-50%,-50%) rotate(180deg);font-size:.52083rem;color:#fff;opacity:.2}.floorplan-plugin__rule-text.is-row.svelte-1rr09in{transform:translate(-50%,-50%)}img.svelte-1cuuebb,.floorplan-plugin__base-image.svelte-1qqy56u{width:100%;height:100%}.floorplan-plugin__base-image.svelte-126ja8e{position:absolute;z-index:10;width:100%;height:100%;pointer-events:none}svg.svelte-1b0icjc{position:absolute;width:100%;height:100%;overflow:visible}path.svelte-11takew{opacity:0}path.svelte-11takew:hover{opacity:.1}.floorplan-plugin__room-highlight.svelte-1aais5l{position:absolute;width:100%;height:100%;pointer-events:all}svg.svelte-1aais5l{width:100%;height:100%;overflow:visible}.floorplan-current-floor.svelte-3pdgs4{position:relative;width:100%;height:100%}.floorplan-main.svelte-177x2q7{width:100%;height:100%}.plugin-radar__camera-wrapper.svelte-o7uo2v{width:100%;height:100%;position:absolute;pointer-events:none}.plugin-radar__camera-position.svelte-o7uo2v{position:absolute;left:0;top:0;width:0;height:0;transform:none;pointer-events:none;transition:transform 1s linear}.plugin-radar__camera-rotate.svelte-o7uo2v{position:absolute;left:-.78125rem;top:-.78125rem;width:.88542rem;height:.88542rem;transform-origin:.78125rem .78125rem;transform:rotate(45deg);background-repeat:no-repeat;background-size:100%}.plugin-pano-floorplan__extra-objects.svelte-8n0d4v{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.plugin-pano-floorplan__extra-object-item--position.svelte-8n0d4v{position:absolute;width:0;height:0}.plugin-pano-floorplan__extra-object-item.svelte-8n0d4v{transform:translate(-50%,-50%)}.plugin-floorplan-radar.svelte-7d8ub2{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.plugin-floorplan-radar-container.svelte-7d8ub2{position:relative}
@@ -147,7 +147,7 @@ export const CSS3DRenderPlugin = (five) => {
147
147
  * [0,0,1] => [0,1,0] 为rolate Worldy正方向
148
148
  * [0,1,1] => [-1,0,0] 为rolate Worldz正方向
149
149
  */
150
- const rotateX = (vector12.z > 0 ? 1 : -1) * rotateXAngle;
150
+ const rotateX = (vector12.z > 0 ? -1 : 1) * rotateXAngle;
151
151
  const rotateY = (vector01.z < 0 ? 1 : -1) * rotateYAngle;
152
152
  const rotateZ = ((vector01.x > 0 && vector01.y < 0) || (vector01.x < 0 && vector01.y > 0) ? -1 : 1) * rotateZAngle;
153
153
  css3DObject.rotateOnWorldAxis(new Vector3(1, 0, 0), rotateX); // x
@@ -0,0 +1 @@
1
+ export declare const roomInfoIcon = "data:image/png;base64,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";
@@ -0,0 +1 @@
1
+ export const roomInfoIcon = 'data:image/png;base64,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';
@@ -0,0 +1,8 @@
1
+ import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData';
2
+ export declare function getRoomInfoInstance(): {
3
+ appendTo(element: Element): void;
4
+ dispose(): void;
5
+ setRoom(room: FloorplanServerRoomItem): void;
6
+ show(): void;
7
+ hide(): void;
8
+ };
@@ -0,0 +1,48 @@
1
+ import { roomInfoIcon } from './Assets/roomInfoIcon';
2
+ export function getRoomInfoInstance() {
3
+ const infoDom = document.createElement('div');
4
+ const iconDom = document.createElement('i');
5
+ const textDom = document.createElement('span');
6
+ infoDom.appendChild(iconDom);
7
+ infoDom.appendChild(textDom);
8
+ // infoDom style
9
+ infoDom.style.position = 'relative';
10
+ infoDom.style.width = '100%';
11
+ infoDom.style.display = 'flex';
12
+ infoDom.style.flexDirection = 'column';
13
+ infoDom.style.alignItems = 'center';
14
+ infoDom.style.marginTop = `${150 / 16}rem`;
15
+ infoDom.style.opacity = '0';
16
+ infoDom.style.transition = 'opacity 1000ms linear';
17
+ // iconDom style
18
+ iconDom.style.display = 'block';
19
+ iconDom.style.width = `${134 / 16}rem`;
20
+ iconDom.style.height = `${22 / 16}rem`;
21
+ iconDom.style.backgroundSize = '100%';
22
+ iconDom.style.backgroundRepeat = 'no-repeat';
23
+ iconDom.style.backgroundImage = `url(${roomInfoIcon})`;
24
+ textDom.style.marginTop = `${10 / 16}rem`;
25
+ // textDom style
26
+ textDom.style.fontSize = `${16 / 16}rem`;
27
+ textDom.style.color = '#fff';
28
+ textDom.style.opacity = '0.7';
29
+ textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)';
30
+ textDom.style.fontWeight = 'bold';
31
+ return {
32
+ appendTo(element) {
33
+ element.appendChild(infoDom);
34
+ },
35
+ dispose() {
36
+ infoDom.remove();
37
+ },
38
+ setRoom(room) {
39
+ textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡';
40
+ },
41
+ show() {
42
+ infoDom.style.opacity = '1';
43
+ },
44
+ hide() {
45
+ infoDom.style.opacity = '0';
46
+ }
47
+ };
48
+ }
@@ -1,25 +1,51 @@
1
1
  import type { Five, FivePlugin } from '@realsee/five';
2
+ import type { FloorplanServerRoomItem } from '../floorplan/typings/floorplanServerData';
2
3
  export interface PanoCompassPluginParameterType {
3
4
  compassImageUrl?: string;
5
+ entryDoorImageUrl?: string;
4
6
  }
5
7
  export interface PanoCompassPluginData {
6
- north_rad: number;
8
+ north_rad: null | number;
9
+ entrance: null | undefined | {
10
+ position: {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ };
15
+ };
16
+ room_observers: undefined | {
17
+ index: number;
18
+ floor_index: number;
19
+ room: FloorplanServerRoomItem;
20
+ }[];
7
21
  }
8
22
  export declare type PanoCompassPluginExportType = PanoCompassController;
23
+ export declare const panoCompassPluginServerParams: {
24
+ name: string;
25
+ version: number;
26
+ };
9
27
  export declare const PanoCompassPlugin: FivePlugin<PanoCompassPluginParameterType | undefined, PanoCompassController>;
10
28
  export default PanoCompassPlugin;
11
29
  declare class PanoCompassController {
12
30
  five: Five;
13
31
  data?: PanoCompassPluginData;
14
32
  config?: PanoCompassPluginParameterType;
33
+ private group;
34
+ private modelLoaded;
35
+ private roomInfoInstance?;
36
+ private roomInfoWrapperInstance?;
15
37
  private compassMeshTween?;
16
38
  private compassMesh?;
39
+ private entryDoorMesh?;
17
40
  constructor(five: Five, config?: PanoCompassPluginParameterType);
18
41
  load(data: PanoCompassPluginData): void;
19
42
  dispose: () => void;
43
+ private onFiveFistPanoLoaded;
44
+ private init;
20
45
  private loadCompassMesh;
46
+ private loadEntryDoorMesh;
47
+ private loadRoomInfo;
21
48
  private onFivePanoWillArrive;
22
49
  private onFivePanoArrived;
23
- private fixPosition;
24
- private fixRotation;
50
+ private onFiveCameraDirectionUpdate;
25
51
  }
@@ -1,6 +1,12 @@
1
1
  import * as THREE from 'three';
2
+ import { getRoomInfoInstance } from './getRoomInfoInstance';
2
3
  import { loadTexture } from '../shared-utils/three/loadTexture';
4
+ import CSS3DRenderPlugin from '../CSS3DRenderPlugin';
3
5
  import { tweenProgress } from '../shared-utils/animationFrame/BetterTween';
6
+ export const panoCompassPluginServerParams = {
7
+ name: 'PanoCompassPlugin',
8
+ version: 0,
9
+ };
4
10
  export const PanoCompassPlugin = function (five, config) {
5
11
  return new PanoCompassController(five, config);
6
12
  };
@@ -9,50 +15,103 @@ class PanoCompassController {
9
15
  five;
10
16
  data;
11
17
  config;
18
+ group = new THREE.Group();
19
+ modelLoaded = false;
20
+ roomInfoInstance;
21
+ roomInfoWrapperInstance;
12
22
  compassMeshTween;
13
23
  compassMesh;
24
+ entryDoorMesh;
14
25
  constructor(five, config) {
15
26
  this.five = five;
16
27
  this.config = config;
17
- five.once('panoLoaded', this.loadCompassMesh);
28
+ this.five.scene.add(this.group);
18
29
  five.once('dispose', this.dispose);
30
+ five.once('modelLoaded', this.onFiveFistPanoLoaded);
19
31
  this.five.on('panoArrived', this.onFivePanoArrived);
20
32
  this.five.on('panoWillArrive', this.onFivePanoWillArrive);
33
+ this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate);
21
34
  }
22
35
  load(data) {
23
36
  this.data = data;
24
- if (this.compassMesh && !this.five.scene.children.includes(this.compassMesh)) {
25
- // 模型已经加载好了,才加载数据
26
- this.fixRotation(data.north_rad);
27
- this.fixPosition(this.five.panoIndex || 0);
28
- this.five.scene.add(this.compassMesh);
29
- }
37
+ if (this.modelLoaded)
38
+ this.init();
30
39
  }
31
40
  dispose = () => {
41
+ this.five.scene.remove(this.group);
42
+ this.group.remove(...this.group.children);
43
+ this.compassMesh?.material.map?.dispose();
44
+ this.entryDoorMesh?.material.map?.dispose();
32
45
  this.five.off('panoArrived', this.onFivePanoArrived);
33
46
  this.five.off('panoWillArrive', this.onFivePanoWillArrive);
34
- this.five.off();
35
47
  };
36
- loadCompassMesh = async () => {
37
- const compassImageUrl = this.config?.compassImageUrl || '//vrlab-image4.ljcdn.com/release/web/v3/north-point-circle.96498e69.png';
38
- const texture = await loadTexture(compassImageUrl);
48
+ onFiveFistPanoLoaded = () => {
49
+ this.modelLoaded = true;
50
+ if (this.data)
51
+ this.init();
52
+ };
53
+ async init() {
54
+ if (!this.data || !this.modelLoaded)
55
+ return;
56
+ const northRad = this.data.north_rad;
57
+ if (northRad != null) {
58
+ this.compassMesh = await this.loadCompassMesh();
59
+ this.compassMesh.rotateX(-Math.PI / 2);
60
+ this.compassMesh.rotateZ(northRad - Math.PI / 2);
61
+ this.group.add(this.compassMesh);
62
+ }
63
+ if (this.data.entrance != null) {
64
+ this.entryDoorMesh = await this.loadEntryDoorMesh();
65
+ this.roomInfoWrapperInstance = this.loadRoomInfo();
66
+ this.roomInfoInstance = getRoomInfoInstance();
67
+ this.entryDoorMesh.rotateX(-Math.PI / 2);
68
+ if (this.roomInfoWrapperInstance)
69
+ this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container);
70
+ this.group.add(this.entryDoorMesh);
71
+ }
72
+ this.onFivePanoArrived(this.five.panoIndex || 0);
73
+ this.five.needsRender = true;
74
+ }
75
+ async loadCompassMesh() {
76
+ const compassImageUrl = this.config?.compassImageUrl ||
77
+ '//vrlab-image4.ljcdn.com/release/web/v3/north-point-circle.96498e69.png';
78
+ const compassTexture = await loadTexture(compassImageUrl);
39
79
  const compassGeometry = new THREE.CircleGeometry(0.7, 32);
40
80
  const compassMaterial = new THREE.MeshBasicMaterial({
41
- map: texture,
81
+ map: compassTexture,
42
82
  transparent: true,
43
- opacity: 1,
83
+ opacity: 0,
44
84
  depthTest: false,
45
85
  });
46
86
  const compassMesh = new THREE.Mesh(compassGeometry, compassMaterial);
47
- compassMesh.rotateX(-Math.PI / 2);
48
87
  compassMesh.name = 'pano-compass-mesh';
49
- this.compassMesh = compassMesh;
50
- this.fixPosition(this.five.panoIndex || 0);
51
- if (!this.data)
52
- return;
53
- this.fixRotation(this.data.north_rad);
54
- this.five.scene.add(compassMesh);
55
- };
88
+ return compassMesh;
89
+ }
90
+ async loadEntryDoorMesh() {
91
+ const entryDoorImageUrl = this.config?.entryDoorImageUrl ||
92
+ '//vrlab-image4.ljcdn.com/release/web/enterDoor.831b8208.png';
93
+ const entryDoorTexture = await loadTexture(entryDoorImageUrl);
94
+ const entryDoorGeometry = new THREE.PlaneGeometry(0.2, 0.16);
95
+ const entryDoorMaterial = new THREE.MeshBasicMaterial({
96
+ map: entryDoorTexture,
97
+ transparent: true,
98
+ opacity: 0.8,
99
+ depthTest: false,
100
+ });
101
+ const entryDoorMesh = new THREE.Mesh(entryDoorGeometry, entryDoorMaterial);
102
+ entryDoorMesh.name = 'pano-compass-entry-door';
103
+ return entryDoorMesh;
104
+ }
105
+ loadRoomInfo() {
106
+ const points = [
107
+ new THREE.Vector3(-0.7, 0, -0.7),
108
+ new THREE.Vector3(0.7, 0, -0.7),
109
+ new THREE.Vector3(0.7, 0, 0.7),
110
+ new THREE.Vector3(-0.7, 0, 0.7),
111
+ ];
112
+ const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points);
113
+ return roomInfo;
114
+ }
56
115
  onFivePanoWillArrive = (panoIndex) => {
57
116
  if (panoIndex === this.five.panoIndex)
58
117
  return;
@@ -60,30 +119,53 @@ class PanoCompassController {
60
119
  this.compassMesh?.material.setValues({ opacity: 0 });
61
120
  };
62
121
  onFivePanoArrived = (panoIndex) => {
63
- if (this.compassMesh?.material.opacity !== 0)
64
- return;
65
- this.fixPosition(panoIndex);
66
- this.compassMeshTween?.dispose();
67
- this.compassMeshTween = tweenProgress(1000)
68
- .onUpdate(({ progress }) => {
69
- this.compassMesh?.material.setValues({ opacity: progress });
70
- this.five.needsRender = true;
71
- })
72
- .play();
73
- };
74
- fixPosition(panoIndex) {
75
- if (!this.compassMesh)
76
- return;
122
+ // ======== fix compass position ========
77
123
  const standingPosition = this.five.work.observers[panoIndex].standingPosition;
78
- // 指南针上移 0.01m,防止与地板重合
79
- const compassPosition = standingPosition.clone().add(new THREE.Vector3(0, 0.01, 0));
80
- this.compassMesh.position.copy(compassPosition);
124
+ if (this.compassMesh) {
125
+ // 指南针上移 0.01m,防止与地板重合
126
+ this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
127
+ if (this.compassMesh.material.opacity !== 0)
128
+ return;
129
+ this.compassMeshTween?.dispose();
130
+ this.compassMeshTween = tweenProgress(1000)
131
+ .onUpdate(({ progress }) => {
132
+ this.compassMesh?.material.setValues({ opacity: progress });
133
+ this.five.needsRender = true;
134
+ })
135
+ .play();
136
+ }
137
+ // ======== fix entry door label position and rotation ========
138
+ if (this.entryDoorMesh) {
139
+ const entryDoorPosition = new THREE.Vector3(this.data.entrance.position.x, this.data.entrance.position.y, this.data.entrance.position.z);
140
+ const panoToEntryDoorVector = entryDoorPosition
141
+ .clone()
142
+ .setY(standingPosition.y)
143
+ .sub(standingPosition)
144
+ .normalize();
145
+ const compassEntryDoorPosition = standingPosition
146
+ .clone()
147
+ .add(panoToEntryDoorVector.clone().multiplyScalar(0.7))
148
+ .setY(standingPosition.y + 0.01);
149
+ this.entryDoorMesh.rotation.z = new THREE.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector);
150
+ this.entryDoorMesh.position.copy(compassEntryDoorPosition);
151
+ // 不是客厅时,隐藏入户门指引
152
+ this.data?.room_observers[panoIndex].room.type === 1
153
+ ? this.entryDoorMesh?.material.setValues({ opacity: 1 })
154
+ : this.entryDoorMesh?.material.setValues({ opacity: 0 });
155
+ }
156
+ // ======== fix room info ========
157
+ if (this.roomInfoInstance && this.roomInfoWrapperInstance) {
158
+ this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
159
+ this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room);
160
+ }
81
161
  this.five.needsRender = true;
82
- }
83
- fixRotation(northRad) {
84
- if (!this.compassMesh)
162
+ };
163
+ onFiveCameraDirectionUpdate = ({ longitude, latitude, }) => {
164
+ if (!this.roomInfoWrapperInstance)
85
165
  return;
86
- this.compassMesh.rotateZ(northRad - Math.PI / 2);
87
- this.five.needsRender = true;
88
- }
166
+ this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude;
167
+ latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama'
168
+ ? this.roomInfoInstance?.show()
169
+ : this.roomInfoInstance?.hide();
170
+ };
89
171
  }
@@ -0,0 +1,36 @@
1
+ import Line from '../Model/line';
2
+ import Magnifier from '../Modules/Magnifier';
3
+ import FiveHelper from '../Modules/FiveHelper';
4
+ import { Group } from 'three';
5
+ import { Model } from '../Model';
6
+ import { PluginEvent } from '../typings/event.type';
7
+ import { Five, Intersection, IntersectMeshInterface, Subscribe } from '@realsee/five';
8
+ import { UserDistanceItem } from '../utils/distanceDom';
9
+ export interface IControllerParams {
10
+ five: Five;
11
+ group: Group;
12
+ model: Model;
13
+ mouseGroup: Group;
14
+ container: Element;
15
+ magnifier: Magnifier;
16
+ fiveHelper: FiveHelper;
17
+ hook: Subscribe<PluginEvent>;
18
+ userDistanceItemCreator?: () => UserDistanceItem;
19
+ }
20
+ export default abstract class BaseController {
21
+ protected five: Five;
22
+ protected group: Group;
23
+ protected model: Model;
24
+ protected disposed: boolean;
25
+ protected mouseGroup: Group;
26
+ protected container: Element;
27
+ protected fiveHelper: FiveHelper;
28
+ protected hook: IControllerParams['hook'];
29
+ protected magnifier: IControllerParams['magnifier'];
30
+ protected userDistanceItemCreator: IControllerParams['userDistanceItemCreator'];
31
+ constructor(params: IControllerParams);
32
+ protected removeLine(line: Line): void;
33
+ protected updateDistanceUI: () => void;
34
+ protected updateMouseGroup(intersection: Intersection, mesh?: IntersectMeshInterface): Group;
35
+ protected dispose(): void;
36
+ }
@@ -0,0 +1,69 @@
1
+ import { preventDefault } from '../utils/ironbox';
2
+ export default class BaseController {
3
+ five;
4
+ group;
5
+ model;
6
+ disposed = false;
7
+ mouseGroup;
8
+ container;
9
+ fiveHelper;
10
+ hook;
11
+ magnifier;
12
+ userDistanceItemCreator;
13
+ constructor(params) {
14
+ // ==================== Params ====================
15
+ this.five = params.five;
16
+ this.hook = params.hook;
17
+ this.model = params.model;
18
+ this.magnifier = params.magnifier;
19
+ this.container = params.container;
20
+ this.fiveHelper = params.fiveHelper;
21
+ this.userDistanceItemCreator = params.userDistanceItemCreator;
22
+ // ==================== Groups ====================
23
+ this.group = params.group;
24
+ this.mouseGroup = params.mouseGroup;
25
+ const fiveElement = this.five.getElement();
26
+ if (fiveElement) {
27
+ fiveElement.addEventListener('touchstart', preventDefault);
28
+ fiveElement.addEventListener('contextmenu', preventDefault);
29
+ }
30
+ }
31
+ removeLine(line) {
32
+ this.group.remove(line.mesh, line.lightMesh);
33
+ line.distanceItem.remove();
34
+ this.five.needsRender = true;
35
+ }
36
+ updateDistanceUI = () => {
37
+ this.model.lines.forEach((line) => line.distanceItem.update(this.five));
38
+ };
39
+ updateMouseGroup(intersection, mesh) {
40
+ if (!intersection)
41
+ return this.mouseGroup;
42
+ // ============ update mouseGroup position ============
43
+ const adsorbentPoint = this.fiveHelper.getAdsorbentPoint(intersection);
44
+ const viewPosition = adsorbentPoint ? adsorbentPoint : intersection.point;
45
+ this.mouseGroup.position.copy(viewPosition);
46
+ // ============ update mouseGroup quaternion ============
47
+ if (mesh) {
48
+ this.mouseGroup.quaternion.copy(mesh.quaternion);
49
+ }
50
+ else if (intersection.face) {
51
+ const normal = intersection.face.normal;
52
+ const positionVector = normal.clone().multiplyScalar(0.05);
53
+ const position = intersection.point.clone().add(positionVector);
54
+ const lookAtVector = position.clone().add(positionVector);
55
+ this.mouseGroup.lookAt(lookAtVector);
56
+ }
57
+ return this.mouseGroup;
58
+ }
59
+ dispose() {
60
+ this.disposed = true;
61
+ this.magnifier.dispose();
62
+ this.model.lines.forEach((line) => this.removeLine(line));
63
+ const fiveElement = this.five.getElement();
64
+ if (fiveElement) {
65
+ fiveElement.removeEventListener('touchstart', preventDefault);
66
+ fiveElement.removeEventListener('contextmenu', preventDefault);
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,52 @@
1
+ import { Model } from '../Model';
2
+ import Line from '../Model/line';
3
+ import { LineJson } from '../typings/data';
4
+ import BaseController, { IControllerParams } from './BaseController';
5
+ export interface EditEvent {
6
+ editedLineChange: (lines: LineJson[]) => void;
7
+ }
8
+ export default class EditController extends BaseController {
9
+ type: string;
10
+ model: Model;
11
+ private pressPoint?;
12
+ private hasAppendDashed;
13
+ private hasAppendMouseGroup;
14
+ private fiveElement?;
15
+ /** 上一个端点位置 */
16
+ private lastPoint;
17
+ /** 鼠标点到上一个端点连接的虚线 */
18
+ private dashed;
19
+ private hammer?;
20
+ /** 根据 intersection 更新放大镜和吸附点 */
21
+ private onIntersectionUpdate;
22
+ constructor(params: IControllerParams);
23
+ dispose(): void;
24
+ getEditingLines(): Line[];
25
+ /** 撤销编辑 */
26
+ revoke: () => void;
27
+ private onMouseLeave;
28
+ /** 编辑线条发生改变时通知外部 */
29
+ private onLineChanged;
30
+ private onPress;
31
+ /**
32
+ * 1. 如果之前没有长按行为「即没有长按点时」-> 滑动全景
33
+ * 2. 如果有长按点,把长按点位置更新为当前位置
34
+ */
35
+ private onPan;
36
+ private onPanEnd;
37
+ /**
38
+ * 1. 如果存在上一个点,需要绘制当前点到上一个点的连线
39
+ * 2. 把上一个点的位置更新为当前点的位置
40
+ * 3. 清除 mouseGroup 和 magnifier
41
+ */
42
+ private onTap;
43
+ private onWantsTapGesture;
44
+ /** 编辑时取消走点 */
45
+ private onWantsToMoveToPano;
46
+ /** 存在长按点时不能移动全景 */
47
+ private onWantsPanGesture;
48
+ /** 移动全景时更新 distanceItem 在屏幕上的位置 */
49
+ private onCameraUpdate;
50
+ /** 更新虚线 */
51
+ private updateDashed;
52
+ }