@realsee/dnalogel 2.0.0-alpha.8 → 2.0.0-alpha.9
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.
- package/CHANGELOG.md +3 -0
- package/dist/CSS3DRenderPlugin/index.d.ts +49 -0
- package/dist/CSS3DRenderPlugin/index.js +233 -0
- package/dist/CSS3DRenderPlugin/utils/createResizeObserver.d.ts +7 -0
- package/dist/CameraMovementPlugin/index.d.ts +7 -0
- package/dist/CameraMovementPlugin/index.js +302 -0
- package/dist/CameraMovementPlugin/typing.d.ts +68 -0
- package/dist/ModelChassisCompassPlugin/index.d.ts +19 -0
- package/dist/ModelChassisCompassPlugin/index.js +142 -0
- package/dist/ModelEntryDoorGuidePlugin/index.d.ts +26 -0
- package/dist/ModelEntryDoorGuidePlugin/index.js +196 -0
- package/dist/ModelRoomLabelPlugin/Assets/roomLabelBg.d.ts +1 -0
- package/dist/ModelRoomLabelPlugin/Controller.d.ts +36 -0
- package/dist/ModelRoomLabelPlugin/index.d.ts +12 -0
- package/dist/ModelRoomLabelPlugin/index.js +461 -0
- package/dist/ModelRoomLabelPlugin/typings.d.ts +35 -0
- package/dist/ModelRoomLabelPlugin/utils/parseData.d.ts +3 -0
- package/dist/ModelViewPlugin/index.d.ts +17 -0
- package/dist/ModelViewPlugin/index.js +187 -0
- package/dist/PanoCompassPlugin/Assets/roomInfoIcon.d.ts +1 -0
- package/dist/PanoCompassPlugin/getRoomInfoInstance.d.ts +8 -0
- package/dist/PanoCompassPlugin/index.d.ts +51 -0
- package/dist/PanoCompassPlugin/index.js +523 -0
- package/dist/PanoCursorRaycasterPlugin/index.d.ts +48 -0
- package/dist/PanoCursorRaycasterPlugin/index.js +88 -0
- package/dist/PanoMeasurePlugin/Controller/BaseController.d.ts +36 -0
- package/dist/PanoMeasurePlugin/Controller/EditController.d.ts +52 -0
- package/dist/PanoMeasurePlugin/Controller/ShortcutKeyController.d.ts +12 -0
- package/dist/PanoMeasurePlugin/Controller/WatchController.d.ts +25 -0
- package/dist/PanoMeasurePlugin/Controller/index.d.ts +61 -0
- package/dist/PanoMeasurePlugin/Model/index.d.ts +38 -0
- package/dist/PanoMeasurePlugin/Model/line.d.ts +30 -0
- package/dist/PanoMeasurePlugin/Model/point.d.ts +16 -0
- package/dist/PanoMeasurePlugin/Model/polyline.d.ts +16 -0
- package/dist/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete.svg.d.ts +2 -0
- package/dist/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_bg.png.d.ts +2 -0
- package/dist/PanoMeasurePlugin/Modules/DeleteDom/_Assets/delete_hover_bg.png.d.ts +2 -0
- package/dist/PanoMeasurePlugin/Modules/DeleteDom/index.d.ts +22 -0
- package/dist/PanoMeasurePlugin/Modules/FiveHelper.d.ts +11 -0
- package/dist/PanoMeasurePlugin/Modules/GuideController.d.ts +18 -0
- package/dist/PanoMeasurePlugin/Modules/Magnifier.d.ts +24 -0
- package/dist/PanoMeasurePlugin/Modules/UIController/HTML.d.ts +6 -0
- package/dist/PanoMeasurePlugin/Modules/UIController/MainBtnController.d.ts +18 -0
- package/dist/PanoMeasurePlugin/Modules/UIController/Revoke/index.d.ts +12 -0
- package/dist/PanoMeasurePlugin/Modules/UIController/index.d.ts +16 -0
- package/dist/PanoMeasurePlugin/Modules/UIController/style.d.ts +17 -0
- package/dist/PanoMeasurePlugin/index.d.ts +7 -0
- package/dist/PanoMeasurePlugin/index.js +4789 -0
- package/dist/PanoMeasurePlugin/typings/data.d.ts +28 -0
- package/dist/PanoMeasurePlugin/typings/event.type.d.ts +28 -0
- package/dist/PanoMeasurePlugin/typings/utils.type.d.ts +1 -0
- package/dist/PanoMeasurePlugin/utils/clearGroup.d.ts +2 -0
- package/dist/PanoMeasurePlugin/utils/constants.d.ts +4 -0
- package/dist/PanoMeasurePlugin/utils/distanceDom.d.ts +28 -0
- package/dist/PanoMeasurePlugin/utils/findAssociatedLines.d.ts +2 -0
- package/dist/PanoMeasurePlugin/utils/findClosestPoint.d.ts +10 -0
- package/dist/PanoMeasurePlugin/utils/getIntersectionFromEvent.d.ts +4 -0
- package/dist/PanoMeasurePlugin/utils/getPointFromHammerEvent.d.ts +10 -0
- package/dist/PanoMeasurePlugin/utils/ironbox.d.ts +1 -0
- package/dist/PanoMeasurePlugin/utils/isNDCPointInScreen.d.ts +2 -0
- package/dist/PanoMeasurePlugin/utils/line.d.ts +17 -0
- package/dist/PanoMeasurePlugin/utils/math.d.ts +17 -0
- package/dist/PanoMeasurePlugin/utils/mouseGroup.d.ts +2 -0
- package/dist/PanoMeasurePlugin/utils/ndc2Screen.d.ts +5 -0
- package/dist/PanoRulerPlugin/index.d.ts +31 -0
- package/dist/PanoRulerPlugin/index.js +610 -0
- package/dist/PanoRulerPlugin/style.d.ts +2 -0
- package/dist/PanoRulerPlugin/typings.d.ts +21 -0
- package/dist/floorplan/Assets/camera.d.ts +1 -0
- package/dist/floorplan/Assets/floorplanExtraObject.d.ts +1 -0
- package/dist/floorplan/ModelFloorplanPlugin/Assets/compass.d.ts +1 -0
- package/dist/floorplan/ModelFloorplanPlugin/Controller.d.ts +104 -0
- package/dist/floorplan/ModelFloorplanPlugin/index.d.ts +9 -0
- package/dist/floorplan/ModelFloorplanPlugin/index.js +3827 -0
- package/dist/floorplan/ModelFloorplanPlugin/typings/events.type.d.ts +23 -0
- package/dist/floorplan/ModelFloorplanPlugin/utils/constant.d.ts +15 -0
- package/dist/floorplan/ModelFloorplanPlugin/utils/correctFiveState.d.ts +14 -0
- package/dist/floorplan/PanoFloorplanRadarPlugin/Controller.d.ts +28 -0
- package/dist/floorplan/PanoFloorplanRadarPlugin/index.d.ts +8 -0
- package/dist/floorplan/PanoFloorplanRadarPlugin/index.js +1673 -0
- package/dist/floorplan/TopviewFloorplanPlugin/Controller.d.ts +61 -0
- package/dist/floorplan/TopviewFloorplanPlugin/index.d.ts +5 -0
- package/dist/floorplan/TopviewFloorplanPlugin/index.js +3466 -0
- package/dist/floorplan/TopviewFloorplanPlugin/style.d.ts +1 -0
- package/dist/floorplan/constant.d.ts +5 -0
- package/dist/floorplan/typings/floorplanData.d.ts +137 -0
- package/dist/floorplan/typings/floorplanServerData.d.ts +131 -0
- package/dist/floorplan/typings/utility.d.ts +2 -0
- package/dist/floorplan/utils/formatData.d.ts +5 -0
- package/dist/floorplan/utils/formatPosition.d.ts +36 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.es.js +11887 -0
- package/dist/index.js +11925 -0
- package/dist/index.umd.js +11920 -0
- package/dist/shared-utils/Preloader.d.ts +6 -0
- package/dist/shared-utils/Subscribe.d.ts +45 -0
- package/dist/shared-utils/animationFrame/BetterTween.d.ts +11 -0
- package/dist/shared-utils/animationFrame/calculateProgress.d.ts +8 -0
- package/dist/shared-utils/animationFrame/formatRad.d.ts +15 -0
- package/dist/shared-utils/animationFrame/index.d.ts +15 -0
- package/dist/shared-utils/animationFrame/tween.d.ts +75 -0
- package/dist/shared-utils/changeModelCanvasOpacity.d.ts +2 -0
- package/dist/shared-utils/createCanvasTextTexture.d.ts +8 -0
- package/dist/shared-utils/createLine/index.d.ts +3 -0
- package/dist/shared-utils/debounce.d.ts +6 -0
- package/dist/shared-utils/equal.d.ts +11 -0
- package/dist/shared-utils/filter.d.ts +27 -0
- package/dist/shared-utils/five/changeMode.d.ts +2 -0
- package/dist/shared-utils/five/useFivePlugin.d.ts +1 -0
- package/dist/shared-utils/formatRad.d.ts +7 -0
- package/dist/shared-utils/getPxmm.d.ts +11 -0
- package/dist/shared-utils/getRandomColor.d.ts +1 -0
- package/dist/shared-utils/isNil.d.ts +10 -0
- package/dist/shared-utils/isTruelyObject.d.ts +18 -0
- package/dist/shared-utils/math/evenNumber.d.ts +3 -0
- package/dist/shared-utils/math/planimetry.d.ts +116 -0
- package/dist/shared-utils/math/rad2Deg.d.ts +1 -0
- package/dist/shared-utils/nearlyEqual.d.ts +7 -0
- package/dist/shared-utils/nextFrame.d.ts +1 -0
- package/dist/shared-utils/noop.d.ts +5 -0
- package/dist/shared-utils/object3d2LocalMatrix.d.ts +12 -0
- package/dist/shared-utils/px2rem.d.ts +1 -0
- package/dist/shared-utils/removeArrayItem.d.ts +7 -0
- package/dist/shared-utils/tap.d.ts +8 -0
- package/dist/shared-utils/three/centerPoint.d.ts +2 -0
- package/dist/shared-utils/three/getExtraModelLoader.d.ts +6 -0
- package/dist/shared-utils/three/getNormal.d.ts +2 -0
- package/dist/shared-utils/three/getTextureLoader.d.ts +6 -0
- package/dist/shared-utils/three/loadFbxObj.d.ts +2 -0
- package/dist/shared-utils/three/loadTexture.d.ts +2 -0
- package/dist/shared-utils/three/transformPositionToVector3.d.ts +7 -0
- package/dist/shared-utils/three/transfromToMeshBasicMaterial.d.ts +2 -0
- package/dist/shared-utils/throttle.d.ts +7 -0
- package/dist/shared-utils/to.d.ts +8 -0
- package/dist/shared-utils/useDebounce.d.ts +8 -0
- package/dist/shared-utils/useThrottle.d.ts +8 -0
- package/dist/shared-utils/uuid.d.ts +4 -0
- package/dist/shared-utils/vectorTocoordinates.d.ts +7 -0
- package/dist/typings/math.type.d.ts +44 -0
- package/dist/typings/utils.type.d.ts +2 -0
- package/docs/classes/ModelRoomLabelController.html +6 -6
- package/docs/enums/FLOOR_PLAN_ATTACHED_TO.html +1 -1
- package/docs/enums/ModelFloorplanErrorType.html +1 -1
- package/docs/interfaces/LineJson.html +1 -1
- package/docs/interfaces/ModelChassisCompassPluginData.html +1 -1
- package/docs/interfaces/ModelChassisCompassPluginExportType.html +1 -1
- package/docs/interfaces/ModelChassisCompassPluginParameterType.html +1 -1
- package/docs/interfaces/ModelEntryDoorGuidePluginData.html +1 -1
- package/docs/interfaces/ModelEntryDoorGuidePluginExportType.html +1 -1
- package/docs/interfaces/ModelFloorplanParameterType.html +1 -1
- package/docs/interfaces/ModelFloorplanViewEvent.html +2 -2
- package/docs/interfaces/ModelRoomLabelPluginData.html +1 -1
- package/docs/interfaces/PanoCompassPluginData.html +1 -1
- package/docs/interfaces/PanoCompassPluginParameterType.html +1 -1
- package/docs/interfaces/PanoCursorRaycasterPluginExportType.html +6 -6
- package/docs/interfaces/PanoRulerPluginExportType.html +1 -1
- package/docs/interfaces/PanoRulerPluginOptions.html +1 -1
- package/docs/interfaces/PanoRulerPluginParameterType.html +1 -1
- package/docs/interfaces/PointJson.html +1 -1
- package/docs/interfaces/RoomLabel.html +7 -7
- package/docs/interfaces/TopviewFloorplanPluginParameterType.html +1 -1
- package/docs/modules.html +11 -11
- package/libs/ModelRoomLabelPlugin/Controller.js +2 -2
- package/libs/ModelRoomLabelPlugin/RoomLabelItem.js +121 -0
- package/libs/ModelRoomLabelPlugin/RoomLabelItems.js +253 -0
- package/libs/PanoMeasurePlugin/Controller/EditController.js +1 -1
- package/libs/floorplan/Components/BaseImage.js +217 -0
- package/libs/floorplan/Components/Normalmage.js +63 -0
- package/libs/floorplan/Components/RoomHighlight/Room.js +70 -0
- package/libs/floorplan/Components/RoomHighlight/RoomHighlight.js +289 -0
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial.js +328 -0
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_0.js +64 -0
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_1.js +103 -0
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_2.js +140 -0
- package/libs/floorplan/Components/SvgImage.js +83 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.js +120 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/Compass.js +106 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/CurrentFloor/CurrentFloor.js +463 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/Main.js +375 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabel.js +171 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabels.js +265 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleItem.js +301 -0
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleLabels.js +219 -0
- package/libs/floorplan/ModelFloorplanPlugin/Controller.js +1 -1
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Camera.js +152 -0
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/CurrentFloor.js +248 -0
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/ExtraObjects.js +154 -0
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Main.js +312 -0
- package/libs/floorplan/PanoFloorplanRadarPlugin/Controller.js +1 -1
- package/libs/floorplan/TopviewFloorplanPlugin/Controller.js +1 -1
- package/package.json +18 -10
- package/dist/dnalogel.cjs.js +0 -7
- package/dist/dnalogel.es.js +0 -41280
- package/dist/dnalogel.umd.js +0 -7
- package/dist/style.css +0 -1
- package/libs/ModelRoomLabelPlugin/RoomLabelItem.svelte +0 -63
- package/libs/ModelRoomLabelPlugin/RoomLabelItem.svelte.map +0 -1
- package/libs/ModelRoomLabelPlugin/RoomLabelItems.svelte +0 -80
- package/libs/ModelRoomLabelPlugin/RoomLabelItems.svelte.map +0 -1
- package/libs/floorplan/Components/BaseImage.svelte +0 -25
- package/libs/floorplan/Components/BaseImage.svelte.map +0 -1
- package/libs/floorplan/Components/Normalmage.svelte +0 -11
- package/libs/floorplan/Components/Normalmage.svelte.map +0 -1
- package/libs/floorplan/Components/RoomHighlight/Room.svelte +0 -21
- package/libs/floorplan/Components/RoomHighlight/Room.svelte.map +0 -1
- package/libs/floorplan/Components/RoomHighlight/RoomHighlight.svelte +0 -60
- package/libs/floorplan/Components/RoomHighlight/RoomHighlight.svelte.map +0 -1
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial.svelte +0 -35
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial.svelte.map +0 -1
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_0.svelte +0 -7
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_0.svelte.map +0 -1
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_1.svelte +0 -16
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_1.svelte.map +0 -1
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_2.svelte +0 -17
- package/libs/floorplan/Components/RoomMaterials/RoomMaterial_2.svelte.map +0 -1
- package/libs/floorplan/Components/SvgImage.svelte +0 -25
- package/libs/floorplan/Components/SvgImage.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte +0 -46
- package/libs/floorplan/ModelFloorplanPlugin/Components/Camera.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/Compass.svelte +0 -48
- package/libs/floorplan/ModelFloorplanPlugin/Components/Compass.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/CurrentFloor/CurrentFloor.svelte +0 -37
- package/libs/floorplan/ModelFloorplanPlugin/Components/CurrentFloor/CurrentFloor.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/Main.svelte +0 -50
- package/libs/floorplan/ModelFloorplanPlugin/Components/Main.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabel.svelte +0 -41
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabel.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabels.svelte +0 -25
- package/libs/floorplan/ModelFloorplanPlugin/Components/RoomLabels/RoomLabels.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleItem.svelte +0 -148
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleItem.svelte.map +0 -1
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleLabels.svelte +0 -15
- package/libs/floorplan/ModelFloorplanPlugin/Components/RuleLabels/RuleLabels.svelte.map +0 -1
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Camera.svelte +0 -84
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Camera.svelte.map +0 -1
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/CurrentFloor.svelte +0 -18
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/CurrentFloor.svelte.map +0 -1
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/ExtraObjects.svelte +0 -40
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/CurrentFloor/ExtraObjects.svelte.map +0 -1
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Main.svelte +0 -61
- package/libs/floorplan/PanoFloorplanRadarPlugin/Components/Main.svelte.map +0 -1
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var THREE = require('three');
|
|
6
|
+
var CSS3DRenderer = require('three/examples/jsm/renderers/CSS3DRenderer');
|
|
7
|
+
var TWEEN = require('@tweenjs/tween.js');
|
|
8
|
+
|
|
9
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
10
|
+
|
|
11
|
+
function _interopNamespace(e) {
|
|
12
|
+
if (e && e.__esModule) return e;
|
|
13
|
+
var n = Object.create(null);
|
|
14
|
+
if (e) {
|
|
15
|
+
Object.keys(e).forEach(function (k) {
|
|
16
|
+
if (k !== 'default') {
|
|
17
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
18
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () { return e[k]; }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
n["default"] = e;
|
|
26
|
+
return Object.freeze(n);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
|
|
30
|
+
var TWEEN__default = /*#__PURE__*/_interopDefaultLegacy(TWEEN);
|
|
31
|
+
|
|
32
|
+
const roomInfoIcon = 'data:image/png;base64,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';
|
|
33
|
+
|
|
34
|
+
function getRoomInfoInstance() {
|
|
35
|
+
const infoDom = document.createElement('div');
|
|
36
|
+
const iconDom = document.createElement('i');
|
|
37
|
+
const textDom = document.createElement('span');
|
|
38
|
+
infoDom.appendChild(iconDom);
|
|
39
|
+
infoDom.appendChild(textDom);
|
|
40
|
+
// infoDom style
|
|
41
|
+
infoDom.style.position = 'relative';
|
|
42
|
+
infoDom.style.width = '100%';
|
|
43
|
+
infoDom.style.display = 'flex';
|
|
44
|
+
infoDom.style.flexDirection = 'column';
|
|
45
|
+
infoDom.style.alignItems = 'center';
|
|
46
|
+
infoDom.style.marginTop = `${150 / 16}rem`;
|
|
47
|
+
infoDom.style.opacity = '0';
|
|
48
|
+
infoDom.style.transition = 'opacity 1000ms linear';
|
|
49
|
+
// iconDom style
|
|
50
|
+
iconDom.style.display = 'block';
|
|
51
|
+
iconDom.style.width = `${134 / 16}rem`;
|
|
52
|
+
iconDom.style.height = `${22 / 16}rem`;
|
|
53
|
+
iconDom.style.backgroundSize = '100%';
|
|
54
|
+
iconDom.style.backgroundRepeat = 'no-repeat';
|
|
55
|
+
iconDom.style.backgroundImage = `url(${roomInfoIcon})`;
|
|
56
|
+
textDom.style.marginTop = `${10 / 16}rem`;
|
|
57
|
+
// textDom style
|
|
58
|
+
textDom.style.fontSize = `${16 / 16}rem`;
|
|
59
|
+
textDom.style.color = '#fff';
|
|
60
|
+
textDom.style.opacity = '0.7';
|
|
61
|
+
textDom.style.textShadow = '0 2px 16px rgb(22 34 83 / 24%)';
|
|
62
|
+
textDom.style.fontWeight = 'bold';
|
|
63
|
+
return {
|
|
64
|
+
appendTo(element) {
|
|
65
|
+
element.appendChild(infoDom);
|
|
66
|
+
},
|
|
67
|
+
dispose() {
|
|
68
|
+
infoDom.remove();
|
|
69
|
+
},
|
|
70
|
+
setRoom(room) {
|
|
71
|
+
textDom.innerHTML = room.name + ' ' + Math.floor(room.size / 1000000) + '㎡';
|
|
72
|
+
},
|
|
73
|
+
show() {
|
|
74
|
+
infoDom.style.opacity = '1';
|
|
75
|
+
},
|
|
76
|
+
hide() {
|
|
77
|
+
infoDom.style.opacity = '0';
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const textureLoader = new THREE__namespace.TextureLoader();
|
|
83
|
+
async function loadTexture(url) {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
textureLoader.load(url, resolve, undefined, reject);
|
|
86
|
+
}).then((texture) => {
|
|
87
|
+
texture.encoding = THREE__namespace.sRGBEncoding;
|
|
88
|
+
return texture;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function evenNumber(num, config) {
|
|
93
|
+
const roundNum = Math.round(num);
|
|
94
|
+
return roundNum % 2 === 0 ? roundNum : roundNum + Number(config?.smaller ? -1 : 1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function centerPoint(point1, point2) {
|
|
98
|
+
return new THREE.Vector3((point1.x + point2.x) / 2, (point1.y + point2.y) / 2, (point1.z + point2.z) / 2);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const transformPositionToVector3 = ({ x, y, z }) => new THREE.Vector3(x, y, z);
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @description: 究极简陋的 ResizeObserver polyfill
|
|
105
|
+
*/
|
|
106
|
+
function createResizeObserver(func, element) {
|
|
107
|
+
if (!element || typeof ResizeObserver === 'undefined') {
|
|
108
|
+
return {
|
|
109
|
+
observe: () => window.addEventListener('resize', func),
|
|
110
|
+
unobserve: () => window.removeEventListener('resize', func),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const observer = new ResizeObserver(func);
|
|
115
|
+
return {
|
|
116
|
+
observe: () => observer.observe(element),
|
|
117
|
+
unobserve: () => observer.unobserve(element),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* **CSS3DRenderPlugin** 提供矩形区域(三维空间四个坐标点),你可以在此矩形区域中渲染 DOM 内容。
|
|
124
|
+
* 实现原理参考[CSS3DRenderer](https://threejs.org/docs/index.html?q=CSS3D#examples/en/renderers/CSS3DRenderer)。
|
|
125
|
+
*
|
|
126
|
+
* @returns
|
|
127
|
+
*/
|
|
128
|
+
const CSS3DRenderPlugin = (five) => {
|
|
129
|
+
const state = { disposeCallbacks: [] };
|
|
130
|
+
const create3DDomContainer = (...params) => {
|
|
131
|
+
const points = params[0].map((point) => (point instanceof THREE.Vector3 ? point : transformPositionToVector3(point)));
|
|
132
|
+
const config = params[1];
|
|
133
|
+
if (points?.length < 4)
|
|
134
|
+
return console.error('points must be equal or greater than than 4');
|
|
135
|
+
if (!five?.model?.loaded)
|
|
136
|
+
return console.error('five.model.loaded is: ', five?.model?.loaded);
|
|
137
|
+
const fiveElement = five.getElement();
|
|
138
|
+
if (!fiveElement)
|
|
139
|
+
return console.error('five.getElement() is ' + fiveElement);
|
|
140
|
+
const disposers = [];
|
|
141
|
+
const ratio = config?.ratio || 0.00216;
|
|
142
|
+
if (ratio <= 0.00215)
|
|
143
|
+
console.warn('if you need click css3DElement on safari, ratio must be greater than 0.00215');
|
|
144
|
+
const dpr = config?.dpr || 1;
|
|
145
|
+
const mode = config?.mode || 'front';
|
|
146
|
+
const autoRender = config?.autoRender ?? true;
|
|
147
|
+
const behindFiveContainer = config?.behindFiveContainer || fiveElement.parentElement || document.body;
|
|
148
|
+
const container = config?.container || document.createElement('div');
|
|
149
|
+
container.classList.add('__Dnalogel-plugin--CSS3DRenderPlugin');
|
|
150
|
+
// 获取css3DObject, 如果mode为behind的话,一起获取mesh
|
|
151
|
+
const { css3DObject, mesh } = createObject(points, { ratio, dpr, container, mode });
|
|
152
|
+
// ======= INIT START =======
|
|
153
|
+
let resizeObserver;
|
|
154
|
+
const frontModeUnInited = mode === 'front' && !state.frontMode;
|
|
155
|
+
const behindModeUnInited = mode === 'behind' && !state.behindMode;
|
|
156
|
+
const inited = !(frontModeUnInited || behindModeUnInited);
|
|
157
|
+
let stopRenderFlag = false;
|
|
158
|
+
let requestAnimationFrameId = null;
|
|
159
|
+
if (behindModeUnInited) {
|
|
160
|
+
state.behindMode = { scene: new THREE.Scene(), css3DRenderer: new CSS3DRenderer.CSS3DRenderer() };
|
|
161
|
+
}
|
|
162
|
+
if (frontModeUnInited) {
|
|
163
|
+
state.frontMode = { scene: new THREE.Scene(), css3DRenderer: new CSS3DRenderer.CSS3DRenderer() };
|
|
164
|
+
}
|
|
165
|
+
const { scene, css3DRenderer } = mode === 'behind' ? state.behindMode : state.frontMode;
|
|
166
|
+
const render = (() => {
|
|
167
|
+
if (!inited) {
|
|
168
|
+
const css3DRendererSetSize = () => {
|
|
169
|
+
// 这里evenNumber策略是遇到奇数会加1,不知道为啥会触发滚动条显示,导致fiveElement变小,fiveElement变小又触发了这里的resize,宽高变小,滚动条消失,然后又触发resize。。。无限循环
|
|
170
|
+
// 为了规避上面这种情况,evenNumber设置了一个参数,遇到奇数可选择减一
|
|
171
|
+
const rendererWidth = evenNumber(fiveElement.clientWidth, { smaller: true });
|
|
172
|
+
const rendererHeight = evenNumber(fiveElement.clientHeight, { smaller: true });
|
|
173
|
+
css3DRenderer.setSize(rendererWidth, rendererHeight);
|
|
174
|
+
};
|
|
175
|
+
css3DRendererSetSize();
|
|
176
|
+
resizeObserver = createResizeObserver(css3DRendererSetSize, fiveElement);
|
|
177
|
+
css3DRenderer.domElement.style.position = 'absolute';
|
|
178
|
+
css3DRenderer.domElement.style.top = '0';
|
|
179
|
+
css3DRenderer.domElement.style.userSelect = 'none';
|
|
180
|
+
css3DRenderer.domElement.style.pointerEvents = 'none';
|
|
181
|
+
const renderEveryFrame = () => {
|
|
182
|
+
if (stopRenderFlag)
|
|
183
|
+
return;
|
|
184
|
+
requestAnimationFrameId = requestAnimationFrame(renderEveryFrame);
|
|
185
|
+
css3DRenderer.render(scene, five.camera);
|
|
186
|
+
};
|
|
187
|
+
return () => {
|
|
188
|
+
scene.add(css3DObject);
|
|
189
|
+
resizeObserver?.observe?.();
|
|
190
|
+
renderEveryFrame();
|
|
191
|
+
if (mode === 'behind' && mesh) {
|
|
192
|
+
five.scene.add(mesh);
|
|
193
|
+
disposers.push(() => mesh && five.scene.remove(mesh));
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
return () => {
|
|
199
|
+
scene.add(css3DObject);
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
})();
|
|
203
|
+
if (frontModeUnInited) {
|
|
204
|
+
const wrapper = fiveElement.parentElement || document.body;
|
|
205
|
+
wrapper.appendChild(css3DRenderer.domElement);
|
|
206
|
+
}
|
|
207
|
+
if (behindModeUnInited) {
|
|
208
|
+
const wrapper = behindFiveContainer;
|
|
209
|
+
wrapper.appendChild(css3DRenderer.domElement);
|
|
210
|
+
}
|
|
211
|
+
// ======= INIT END =======
|
|
212
|
+
const dispose = () => {
|
|
213
|
+
stopRenderFlag = true;
|
|
214
|
+
disposers.forEach((d) => d?.());
|
|
215
|
+
scene.remove(css3DObject);
|
|
216
|
+
if (typeof requestAnimationFrameId === 'number')
|
|
217
|
+
cancelAnimationFrame(requestAnimationFrameId);
|
|
218
|
+
if (scene.children.length === 0) {
|
|
219
|
+
css3DRenderer.domElement.remove();
|
|
220
|
+
if (mode === 'front')
|
|
221
|
+
state.frontMode = undefined;
|
|
222
|
+
if (mode === 'behind')
|
|
223
|
+
state.behindMode = undefined;
|
|
224
|
+
if (!state.behindMode && !state.frontMode) {
|
|
225
|
+
resizeObserver?.unobserve?.();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return true;
|
|
229
|
+
};
|
|
230
|
+
const idx = state.disposeCallbacks.findIndex((item) => item === dispose);
|
|
231
|
+
if (idx !== -1) {
|
|
232
|
+
state.disposeCallbacks.splice(idx, 1);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
state.disposeCallbacks.push(dispose);
|
|
236
|
+
}
|
|
237
|
+
if (autoRender)
|
|
238
|
+
render();
|
|
239
|
+
return { container, dispose, css3DObject, render: autoRender ? undefined : render };
|
|
240
|
+
};
|
|
241
|
+
const createObject = (points, config) => {
|
|
242
|
+
const { ratio, dpr, container: element, mode } = config;
|
|
243
|
+
const planeWidth = points[0].distanceTo(points[1]);
|
|
244
|
+
const planeHeight = points[1].distanceTo(points[2]);
|
|
245
|
+
const domWidthPx = evenNumber((planeWidth / ratio) * dpr);
|
|
246
|
+
const domHeightPx = evenNumber((planeHeight / ratio) * dpr);
|
|
247
|
+
const css3DObject = new CSS3DRenderer.CSS3DObject(element);
|
|
248
|
+
css3DObject.scale.set(ratio, ratio, ratio);
|
|
249
|
+
element.style.width = domWidthPx + 'px';
|
|
250
|
+
element.style.height = domHeightPx + 'px';
|
|
251
|
+
element.style.pointerEvents = 'none';
|
|
252
|
+
const centerPosition = centerPoint(points[0], points[2]);
|
|
253
|
+
const vector01 = points[1].clone().sub(points[0]); // 点0 -> 点1 的向量
|
|
254
|
+
const vector12 = points[2].clone().sub(points[1]); // 点1 -> 点2 的向量
|
|
255
|
+
// 旋转
|
|
256
|
+
const rotateXAngle = new THREE.Vector3(0, 1, 0).angleTo(new THREE.Vector3(0, vector12.y, vector12.z));
|
|
257
|
+
const rotateYAngle = new THREE.Vector3(1, 0, 0).angleTo(new THREE.Vector3(vector01.x, 0, vector01.z));
|
|
258
|
+
const rotateZAngle = vector01.angleTo(new THREE.Vector3(vector01.x, 0, vector01.z));
|
|
259
|
+
/**
|
|
260
|
+
* [0,1,0] => [0,0,1] 为rolate Worldx正方向
|
|
261
|
+
* [0,0,1] => [0,1,0] 为rolate Worldy正方向
|
|
262
|
+
* [0,1,1] => [-1,0,0] 为rolate Worldz正方向
|
|
263
|
+
*/
|
|
264
|
+
const rotateX = (vector12.z > 0 ? -1 : 1) * rotateXAngle;
|
|
265
|
+
const rotateY = (vector01.z < 0 ? 1 : -1) * rotateYAngle;
|
|
266
|
+
const rotateZ = ((vector01.x > 0 && vector01.y < 0) || (vector01.x < 0 && vector01.y > 0) ? -1 : 1) * rotateZAngle;
|
|
267
|
+
css3DObject.rotateOnWorldAxis(new THREE.Vector3(1, 0, 0), rotateX); // x
|
|
268
|
+
css3DObject.rotateOnWorldAxis(new THREE.Vector3(0, 1, 0), rotateY); // y
|
|
269
|
+
css3DObject.rotateOnWorldAxis(new THREE.Vector3(0, 0, 1), rotateZ); // z
|
|
270
|
+
css3DObject.position.set(centerPosition.x, centerPosition.y, centerPosition.z);
|
|
271
|
+
let mesh;
|
|
272
|
+
if (mode === 'behind') {
|
|
273
|
+
const material = new THREE__namespace.MeshBasicMaterial({
|
|
274
|
+
opacity: 0,
|
|
275
|
+
transparent: false,
|
|
276
|
+
side: THREE__namespace.DoubleSide,
|
|
277
|
+
});
|
|
278
|
+
const geometry = new THREE__namespace.PlaneGeometry(domWidthPx, domHeightPx);
|
|
279
|
+
mesh = new THREE__namespace.Mesh(geometry, material);
|
|
280
|
+
mesh.name = 'CSS3DRenderPlugin-mesh';
|
|
281
|
+
mesh.position.copy(css3DObject.position);
|
|
282
|
+
mesh.rotation.copy(css3DObject.rotation);
|
|
283
|
+
mesh.scale.copy(css3DObject.scale);
|
|
284
|
+
}
|
|
285
|
+
return { css3DObject, mesh };
|
|
286
|
+
};
|
|
287
|
+
return {
|
|
288
|
+
create3DDomContainer,
|
|
289
|
+
disposeAll: () => {
|
|
290
|
+
state.disposeCallbacks.forEach((d) => d?.());
|
|
291
|
+
state.disposeCallbacks = [];
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const _requestAnimationFrame = window.requestAnimationFrame || ((fn) => setTimeout(fn, 16));
|
|
297
|
+
const _cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
|
|
298
|
+
/**
|
|
299
|
+
* 在每个 AnimationFrame 中调用传入的函数
|
|
300
|
+
* @param callback 每次 AnimationFrame 中调用的函数
|
|
301
|
+
* @param frame 每秒运行多少次
|
|
302
|
+
* @returns 返回一个函数,调用可以停止 AnimationFrameLoop
|
|
303
|
+
*/
|
|
304
|
+
function requestAnimationFrameInterval(callback, frame = 60) {
|
|
305
|
+
let index = -1;
|
|
306
|
+
let oldTime = 0;
|
|
307
|
+
let startTime = -1;
|
|
308
|
+
const minDeltaTime = 1000 / frame;
|
|
309
|
+
function loop(time) {
|
|
310
|
+
startTime === -1 && (startTime = time);
|
|
311
|
+
index = _requestAnimationFrame(loop);
|
|
312
|
+
const deltaTime = time - oldTime;
|
|
313
|
+
if (deltaTime < minDeltaTime)
|
|
314
|
+
return;
|
|
315
|
+
oldTime = time;
|
|
316
|
+
callback && callback(time - startTime);
|
|
317
|
+
}
|
|
318
|
+
index = _requestAnimationFrame(loop);
|
|
319
|
+
return function stop() {
|
|
320
|
+
_cancelAnimationFrame(index);
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
// export { Easing } from './tween'
|
|
324
|
+
// export { default as tween } from './tween'
|
|
325
|
+
|
|
326
|
+
class BetterTween extends TWEEN__default["default"].Tween {
|
|
327
|
+
disposeMethods = [];
|
|
328
|
+
animationFrameDisposer;
|
|
329
|
+
onDispose = (callback) => {
|
|
330
|
+
this.disposeMethods.push(callback);
|
|
331
|
+
return this;
|
|
332
|
+
};
|
|
333
|
+
play = () => {
|
|
334
|
+
this.start(0);
|
|
335
|
+
this.animationFrameDisposer = requestAnimationFrameInterval((time) => this.update(time));
|
|
336
|
+
return this;
|
|
337
|
+
};
|
|
338
|
+
dispose = () => {
|
|
339
|
+
this.stop();
|
|
340
|
+
this.animationFrameDisposer?.();
|
|
341
|
+
this.disposeMethods.forEach((fn) => fn());
|
|
342
|
+
this.disposeMethods = [];
|
|
343
|
+
TWEEN__default["default"].remove(this);
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function tweenProgress(duration, easing = TWEEN__default["default"].Easing.Linear.None) {
|
|
347
|
+
const tween = new BetterTween({ progress: 0 }).to({ progress: 1 });
|
|
348
|
+
if (duration !== undefined)
|
|
349
|
+
tween.duration(duration);
|
|
350
|
+
if (easing !== undefined)
|
|
351
|
+
tween.easing(easing);
|
|
352
|
+
return tween;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
const panoCompassPluginServerParams = {
|
|
356
|
+
name: 'PanoCompassPlugin',
|
|
357
|
+
version: 0,
|
|
358
|
+
};
|
|
359
|
+
const PanoCompassPlugin = function (five, config) {
|
|
360
|
+
return new PanoCompassController(five, config);
|
|
361
|
+
};
|
|
362
|
+
class PanoCompassController {
|
|
363
|
+
five;
|
|
364
|
+
data;
|
|
365
|
+
config;
|
|
366
|
+
group = new THREE__namespace.Group();
|
|
367
|
+
modelLoaded = false;
|
|
368
|
+
roomInfoInstance;
|
|
369
|
+
roomInfoWrapperInstance;
|
|
370
|
+
compassMeshTween;
|
|
371
|
+
compassMesh;
|
|
372
|
+
entryDoorMesh;
|
|
373
|
+
constructor(five, config) {
|
|
374
|
+
this.five = five;
|
|
375
|
+
this.config = config;
|
|
376
|
+
this.five.scene.add(this.group);
|
|
377
|
+
five.once('dispose', this.dispose);
|
|
378
|
+
five.once('modelLoaded', this.onFiveFistPanoLoaded);
|
|
379
|
+
this.five.on('panoArrived', this.onFivePanoArrived);
|
|
380
|
+
this.five.on('panoWillArrive', this.onFivePanoWillArrive);
|
|
381
|
+
this.five.on('cameraDirectionUpdate', this.onFiveCameraDirectionUpdate);
|
|
382
|
+
}
|
|
383
|
+
load(data) {
|
|
384
|
+
this.data = data;
|
|
385
|
+
if (this.modelLoaded)
|
|
386
|
+
this.init();
|
|
387
|
+
}
|
|
388
|
+
dispose = () => {
|
|
389
|
+
this.five.scene.remove(this.group);
|
|
390
|
+
this.group.remove(...this.group.children);
|
|
391
|
+
this.compassMesh?.material.map?.dispose();
|
|
392
|
+
this.entryDoorMesh?.material.map?.dispose();
|
|
393
|
+
this.five.off('panoArrived', this.onFivePanoArrived);
|
|
394
|
+
this.five.off('panoWillArrive', this.onFivePanoWillArrive);
|
|
395
|
+
};
|
|
396
|
+
onFiveFistPanoLoaded = () => {
|
|
397
|
+
this.modelLoaded = true;
|
|
398
|
+
if (this.data)
|
|
399
|
+
this.init();
|
|
400
|
+
};
|
|
401
|
+
async init() {
|
|
402
|
+
if (!this.data || !this.modelLoaded)
|
|
403
|
+
return;
|
|
404
|
+
const northRad = this.data.north_rad;
|
|
405
|
+
if (northRad != null) {
|
|
406
|
+
this.compassMesh = await this.loadCompassMesh();
|
|
407
|
+
this.compassMesh.rotateX(-Math.PI / 2);
|
|
408
|
+
this.compassMesh.rotateZ(northRad - Math.PI / 2);
|
|
409
|
+
this.group.add(this.compassMesh);
|
|
410
|
+
}
|
|
411
|
+
if (this.data.entrance != null) {
|
|
412
|
+
this.entryDoorMesh = await this.loadEntryDoorMesh();
|
|
413
|
+
this.roomInfoWrapperInstance = this.loadRoomInfo();
|
|
414
|
+
this.roomInfoInstance = getRoomInfoInstance();
|
|
415
|
+
this.entryDoorMesh.rotateX(-Math.PI / 2);
|
|
416
|
+
if (this.roomInfoWrapperInstance)
|
|
417
|
+
this.roomInfoInstance.appendTo(this.roomInfoWrapperInstance.container);
|
|
418
|
+
this.group.add(this.entryDoorMesh);
|
|
419
|
+
}
|
|
420
|
+
this.onFivePanoArrived(this.five.panoIndex || 0);
|
|
421
|
+
this.five.needsRender = true;
|
|
422
|
+
}
|
|
423
|
+
async loadCompassMesh() {
|
|
424
|
+
const compassImageUrl = this.config?.compassImageUrl ||
|
|
425
|
+
'//vrlab-image4.ljcdn.com/release/web/v3/north-point-circle.96498e69.png';
|
|
426
|
+
const compassTexture = await loadTexture(compassImageUrl);
|
|
427
|
+
const compassGeometry = new THREE__namespace.CircleGeometry(0.7, 32);
|
|
428
|
+
const compassMaterial = new THREE__namespace.MeshBasicMaterial({
|
|
429
|
+
map: compassTexture,
|
|
430
|
+
transparent: true,
|
|
431
|
+
opacity: 0,
|
|
432
|
+
depthTest: false,
|
|
433
|
+
});
|
|
434
|
+
const compassMesh = new THREE__namespace.Mesh(compassGeometry, compassMaterial);
|
|
435
|
+
compassMesh.name = 'pano-compass-mesh';
|
|
436
|
+
return compassMesh;
|
|
437
|
+
}
|
|
438
|
+
async loadEntryDoorMesh() {
|
|
439
|
+
const entryDoorImageUrl = this.config?.entryDoorImageUrl ||
|
|
440
|
+
'//vrlab-image4.ljcdn.com/release/web/enterDoor.831b8208.png';
|
|
441
|
+
const entryDoorTexture = await loadTexture(entryDoorImageUrl);
|
|
442
|
+
const entryDoorGeometry = new THREE__namespace.PlaneGeometry(0.2, 0.16);
|
|
443
|
+
const entryDoorMaterial = new THREE__namespace.MeshBasicMaterial({
|
|
444
|
+
map: entryDoorTexture,
|
|
445
|
+
transparent: true,
|
|
446
|
+
opacity: 0.8,
|
|
447
|
+
depthTest: false,
|
|
448
|
+
});
|
|
449
|
+
const entryDoorMesh = new THREE__namespace.Mesh(entryDoorGeometry, entryDoorMaterial);
|
|
450
|
+
entryDoorMesh.name = 'pano-compass-entry-door';
|
|
451
|
+
return entryDoorMesh;
|
|
452
|
+
}
|
|
453
|
+
loadRoomInfo() {
|
|
454
|
+
const points = [
|
|
455
|
+
new THREE__namespace.Vector3(-0.7, 0, -0.7),
|
|
456
|
+
new THREE__namespace.Vector3(0.7, 0, -0.7),
|
|
457
|
+
new THREE__namespace.Vector3(0.7, 0, 0.7),
|
|
458
|
+
new THREE__namespace.Vector3(-0.7, 0, 0.7),
|
|
459
|
+
];
|
|
460
|
+
const roomInfo = CSS3DRenderPlugin(this.five).create3DDomContainer(points);
|
|
461
|
+
return roomInfo;
|
|
462
|
+
}
|
|
463
|
+
onFivePanoWillArrive = (panoIndex) => {
|
|
464
|
+
if (panoIndex === this.five.panoIndex)
|
|
465
|
+
return;
|
|
466
|
+
this.compassMeshTween?.dispose();
|
|
467
|
+
this.compassMesh?.material.setValues({ opacity: 0 });
|
|
468
|
+
};
|
|
469
|
+
onFivePanoArrived = (panoIndex) => {
|
|
470
|
+
// ======== fix compass position ========
|
|
471
|
+
const standingPosition = this.five.work.observers[panoIndex].standingPosition;
|
|
472
|
+
if (this.compassMesh) {
|
|
473
|
+
// 指南针上移 0.01m,防止与地板重合
|
|
474
|
+
this.compassMesh.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
|
|
475
|
+
if (this.compassMesh.material.opacity !== 0)
|
|
476
|
+
return;
|
|
477
|
+
this.compassMeshTween?.dispose();
|
|
478
|
+
this.compassMeshTween = tweenProgress(1000)
|
|
479
|
+
.onUpdate(({ progress }) => {
|
|
480
|
+
this.compassMesh?.material.setValues({ opacity: progress });
|
|
481
|
+
this.five.needsRender = true;
|
|
482
|
+
})
|
|
483
|
+
.play();
|
|
484
|
+
}
|
|
485
|
+
// ======== fix entry door label position and rotation ========
|
|
486
|
+
if (this.entryDoorMesh) {
|
|
487
|
+
const entryDoorPosition = new THREE__namespace.Vector3(this.data.entrance.position.x, this.data.entrance.position.y, this.data.entrance.position.z);
|
|
488
|
+
const panoToEntryDoorVector = entryDoorPosition
|
|
489
|
+
.clone()
|
|
490
|
+
.setY(standingPosition.y)
|
|
491
|
+
.sub(standingPosition)
|
|
492
|
+
.normalize();
|
|
493
|
+
const compassEntryDoorPosition = standingPosition
|
|
494
|
+
.clone()
|
|
495
|
+
.add(panoToEntryDoorVector.clone().multiplyScalar(0.7))
|
|
496
|
+
.setY(standingPosition.y + 0.01);
|
|
497
|
+
this.entryDoorMesh.rotation.z = new THREE__namespace.Vector3(0, 0, -1).angleTo(panoToEntryDoorVector);
|
|
498
|
+
this.entryDoorMesh.position.copy(compassEntryDoorPosition);
|
|
499
|
+
// 不是客厅时,隐藏入户门指引
|
|
500
|
+
this.data?.room_observers[panoIndex].room.type === 1
|
|
501
|
+
? this.entryDoorMesh?.material.setValues({ opacity: 1 })
|
|
502
|
+
: this.entryDoorMesh?.material.setValues({ opacity: 0 });
|
|
503
|
+
}
|
|
504
|
+
// ======== fix room info ========
|
|
505
|
+
if (this.roomInfoInstance && this.roomInfoWrapperInstance) {
|
|
506
|
+
this.roomInfoWrapperInstance.css3DObject.position.copy(standingPosition.clone().setY(standingPosition.y + 0.01));
|
|
507
|
+
this.roomInfoInstance.setRoom(this.data.room_observers[panoIndex].room);
|
|
508
|
+
}
|
|
509
|
+
this.five.needsRender = true;
|
|
510
|
+
};
|
|
511
|
+
onFiveCameraDirectionUpdate = ({ longitude, latitude, }) => {
|
|
512
|
+
if (!this.roomInfoWrapperInstance)
|
|
513
|
+
return;
|
|
514
|
+
this.roomInfoWrapperInstance.css3DObject.rotation.z = longitude;
|
|
515
|
+
latitude > 0.66 && this.five.getCurrentState().mode === 'Panorama'
|
|
516
|
+
? this.roomInfoInstance?.show()
|
|
517
|
+
: this.roomInfoInstance?.hide();
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
exports.PanoCompassPlugin = PanoCompassPlugin;
|
|
522
|
+
exports["default"] = PanoCompassPlugin;
|
|
523
|
+
exports.panoCompassPluginServerParams = panoCompassPluginServerParams;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Group, Vector3 } from 'three';
|
|
2
|
+
import type { FivePlugin, Intersection } from '@realsee/five';
|
|
3
|
+
export interface PanoCursorRaycasterPluginParameterType {
|
|
4
|
+
}
|
|
5
|
+
export interface PanoCursorRaycasterPluginExportType {
|
|
6
|
+
/**
|
|
7
|
+
* @description: 获取鼠标与模型的焦点位置
|
|
8
|
+
* @return {Intersection | null} 鼠标与模型的焦点位置
|
|
9
|
+
*/
|
|
10
|
+
intersection: () => Intersection | null;
|
|
11
|
+
/**
|
|
12
|
+
* @description: 辅助坐标轴
|
|
13
|
+
* @param {Vector3} point: 坐标轴原点的位置
|
|
14
|
+
* @param {number} length: 坐标轴线长度,单位:米,默认值:2
|
|
15
|
+
* @param {number} fixDistance: 为避免被模型遮挡,默认向camera方向移动0.1m,默认值:0.1
|
|
16
|
+
* @return {{clear: () => void; pointAxesHelperMesh: THREE.Group}} clear: 清理函数;pointAxesHelperMesh: 辅助坐标轴mesh
|
|
17
|
+
*/
|
|
18
|
+
pointAxesHelper: (point: Vector3, length?: number, fixDistance?: number) => {
|
|
19
|
+
clear: () => void;
|
|
20
|
+
pointAxesHelperMesh: Group;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* @description: 将一个点在camera和点的向量上移动。传入点的位置和相对移动的距离,返回一个新的位置
|
|
24
|
+
* @param {Vector3} point: 点
|
|
25
|
+
* @param {number} distance: 向camera相对移动的距离(正方向为:点 -> 摄像头)
|
|
26
|
+
* @return {Vector3} 计算移动后的位置
|
|
27
|
+
*/
|
|
28
|
+
movePointTowardsCamera: (point: Vector3, distance: number) => Vector3;
|
|
29
|
+
/**
|
|
30
|
+
* @description: 某个点是否可见
|
|
31
|
+
* @param {Vector3} point: 要检测的点
|
|
32
|
+
* @param {number} distanceError: 允许的误差,如果点有可能打在模型后,则传入一个误差值,通常为0.01
|
|
33
|
+
* @return {boolean}: 是否可见
|
|
34
|
+
*/
|
|
35
|
+
canSeePoint: (point: Vector3, distanceError?: number) => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* @description: 清理函数
|
|
38
|
+
* @return {() => void} 清理函数
|
|
39
|
+
*/
|
|
40
|
+
destroy: () => void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 全景中对当前鼠标的位置进行碰撞监测
|
|
44
|
+
* @param five
|
|
45
|
+
* @return
|
|
46
|
+
*/
|
|
47
|
+
export declare const PanoCursorRaycasterPlugin: FivePlugin<PanoCursorRaycasterPluginParameterType, PanoCursorRaycasterPluginExportType>;
|
|
48
|
+
export default PanoCursorRaycasterPlugin;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var three = require('three');
|
|
6
|
+
var line = require('@realsee/five/line');
|
|
7
|
+
|
|
8
|
+
function createLine(point1, point2, color = new three.Vector3(1, 1, 1), dashed = false) {
|
|
9
|
+
const line$1 = new line.Line(point1, point2);
|
|
10
|
+
line$1.setMaterial({ dashed, color, linewidth: 1 });
|
|
11
|
+
line$1.remove(line$1.points);
|
|
12
|
+
return line$1;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 全景中对当前鼠标的位置进行碰撞监测
|
|
17
|
+
* @param five
|
|
18
|
+
* @return
|
|
19
|
+
*/
|
|
20
|
+
const PanoCursorRaycasterPlugin = (five) => {
|
|
21
|
+
const state = {
|
|
22
|
+
intersection: null,
|
|
23
|
+
disposers: [],
|
|
24
|
+
};
|
|
25
|
+
const updateIntersection = (intersection) => {
|
|
26
|
+
state.intersection = intersection;
|
|
27
|
+
};
|
|
28
|
+
const clearIntersection = () => {
|
|
29
|
+
state.intersection = null;
|
|
30
|
+
};
|
|
31
|
+
five.on('modelLoaded', () => {
|
|
32
|
+
five.on('intersectionOnModelUpdate', updateIntersection);
|
|
33
|
+
five.on('intersectionHidden', clearIntersection);
|
|
34
|
+
});
|
|
35
|
+
five.on('dispose', () => {
|
|
36
|
+
five.off('intersectionOnModelUpdate', updateIntersection);
|
|
37
|
+
five.off('intersectionHidden', clearIntersection);
|
|
38
|
+
});
|
|
39
|
+
const pointAxesHelper = (point, length = 2, fixDistance = 0.1) => {
|
|
40
|
+
const halfLength = length / 2;
|
|
41
|
+
const helperCenterPoint = movePointTowardsCamera(point, fixDistance);
|
|
42
|
+
const p = helperCenterPoint;
|
|
43
|
+
const pointAxesHelperMesh = new three.Group();
|
|
44
|
+
pointAxesHelperMesh.add(createLine(new three.Vector3(p.x + halfLength, p.y, p.z), new three.Vector3(p.x - halfLength, p.y, p.z), new three.Vector3(1, 0, 0)), createLine(new three.Vector3(p.x, p.y + halfLength, p.z), new three.Vector3(p.x, p.y - halfLength, p.z), new three.Vector3(0, 1, 0)), createLine(new three.Vector3(p.x, p.y, p.z + halfLength), new three.Vector3(p.x, p.y, p.z - halfLength), new three.Vector3(0, 0, 1)));
|
|
45
|
+
five.scene.add(pointAxesHelperMesh);
|
|
46
|
+
five.needsRender = true;
|
|
47
|
+
// 清理函数
|
|
48
|
+
const clear = () => {
|
|
49
|
+
five.scene.remove(pointAxesHelperMesh);
|
|
50
|
+
};
|
|
51
|
+
state.disposers.push(clear);
|
|
52
|
+
return { clear, pointAxesHelperMesh };
|
|
53
|
+
};
|
|
54
|
+
const canSeePoint = (point, distanceError = 0) => {
|
|
55
|
+
const cameraPosition = five?.camera?.position;
|
|
56
|
+
if (!cameraPosition)
|
|
57
|
+
return false;
|
|
58
|
+
const distance = point.distanceTo(cameraPosition);
|
|
59
|
+
const direction = point.sub(cameraPosition).normalize();
|
|
60
|
+
const raycaster = new three.Raycaster(cameraPosition, direction);
|
|
61
|
+
const intersection = five.model.intersectRaycaster(raycaster)?.[0];
|
|
62
|
+
return !(intersection && intersection.distance + distanceError < distance);
|
|
63
|
+
};
|
|
64
|
+
const intersection = () => {
|
|
65
|
+
return state.intersection;
|
|
66
|
+
};
|
|
67
|
+
const destroy = () => {
|
|
68
|
+
state.disposers?.forEach?.((d) => d?.());
|
|
69
|
+
five.off('intersectionOnModelUpdate', updateIntersection);
|
|
70
|
+
five.off('intersectionHidden', clearIntersection);
|
|
71
|
+
};
|
|
72
|
+
// 逐步取代 destroy ,向下兼容
|
|
73
|
+
const dispose = destroy;
|
|
74
|
+
const movePointTowardsCamera = (point, distance) => {
|
|
75
|
+
// 原点 position
|
|
76
|
+
const originPoint = point.clone();
|
|
77
|
+
// camera position
|
|
78
|
+
const cameraPosition = five.camera.position.clone();
|
|
79
|
+
// 移动的向量
|
|
80
|
+
const fixVector3 = cameraPosition.sub(originPoint).setLength(distance);
|
|
81
|
+
// 向量相加
|
|
82
|
+
return fixVector3.add(originPoint);
|
|
83
|
+
};
|
|
84
|
+
return { intersection, pointAxesHelper, movePointTowardsCamera, destroy, dispose, canSeePoint };
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
exports.PanoCursorRaycasterPlugin = PanoCursorRaycasterPlugin;
|
|
88
|
+
exports["default"] = PanoCursorRaycasterPlugin;
|