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