@inweb/viewer-three 26.9.2 → 26.9.3
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/dist/plugins/components/AxesHelperComponent.js.map +1 -1
- package/dist/plugins/components/AxesHelperComponent.min.js +1 -1
- package/dist/plugins/components/AxesHelperComponent.module.js +1 -1
- package/dist/plugins/components/AxesHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/ExtentsHelperComponent.js.map +1 -1
- package/dist/plugins/components/ExtentsHelperComponent.min.js +1 -1
- package/dist/plugins/components/ExtentsHelperComponent.module.js +1 -1
- package/dist/plugins/components/ExtentsHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/LightHelperComponent.js.map +1 -1
- package/dist/plugins/components/LightHelperComponent.min.js +1 -1
- package/dist/plugins/components/LightHelperComponent.module.js +7 -7
- package/dist/plugins/components/LightHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/RoomEnvironmentComponent.js.map +1 -1
- package/dist/plugins/components/RoomEnvironmentComponent.min.js +1 -1
- package/dist/plugins/components/RoomEnvironmentComponent.module.js +1 -1
- package/dist/plugins/components/RoomEnvironmentComponent.module.js.map +1 -1
- package/dist/plugins/components/StatsPanelComponent.js.map +1 -1
- package/dist/plugins/components/StatsPanelComponent.min.js +1 -1
- package/dist/plugins/components/StatsPanelComponent.module.js +1 -1
- package/dist/plugins/components/StatsPanelComponent.module.js.map +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.js.map +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.min.js +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.module.js +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.module.js.map +1 -1
- package/dist/plugins/loaders/IFCXLoader.js +4 -4
- package/dist/plugins/loaders/IFCXLoader.js.map +1 -1
- package/dist/plugins/loaders/IFCXLoader.min.js +1 -1
- package/dist/plugins/loaders/IFCXLoader.module.js +92 -92
- package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/plugins/loaders/PotreeLoader.js +1 -1
- package/dist/plugins/loaders/PotreeLoader.js.map +1 -1
- package/dist/plugins/loaders/PotreeLoader.min.js +1 -1
- package/dist/plugins/loaders/PotreeLoader.module.js +2 -2
- package/dist/plugins/loaders/PotreeLoader.module.js.map +1 -1
- package/dist/viewer-three.js +1210 -839
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +559 -270
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/controls/FlyControls.d.ts +34 -0
- package/lib/Viewer/controls/WalkControls.d.ts +19 -3
- package/lib/Viewer/draggers/FlyDragger.d.ts +14 -0
- package/package.json +5 -5
- package/src/Viewer/controls/FlyControls.ts +205 -0
- package/src/Viewer/controls/WalkControls.ts +129 -20
- package/src/Viewer/draggers/FlyDragger.ts +73 -0
- package/src/Viewer/draggers/WalkDragger.ts +10 -2
- package/src/Viewer/draggers/index.ts +2 -0
|
@@ -2,7 +2,7 @@ import { draggersRegistry, commandsRegistry, componentsRegistry, Loader, loaders
|
|
|
2
2
|
|
|
3
3
|
export * from "@inweb/viewer-core";
|
|
4
4
|
|
|
5
|
-
import { Line, Vector3, BufferGeometry, Float32BufferAttribute, LineBasicMaterial, Mesh, MeshBasicMaterial, DoubleSide, EventDispatcher, MOUSE, TOUCH, Spherical, Quaternion, Vector2, Plane, Object3D, Matrix4, Vector4, Raycaster, Controls, Clock,
|
|
5
|
+
import { Line, Vector3, BufferGeometry, Float32BufferAttribute, LineBasicMaterial, Mesh, MeshBasicMaterial, DoubleSide, EventDispatcher, MOUSE, TOUCH, Spherical, Quaternion, Vector2, Plane, Object3D, Matrix4, Vector4, Raycaster, Controls, Clock, MathUtils, Sphere, Box3, Color, AmbientLight, DirectionalLight, HemisphereLight, MeshPhongMaterial, WebGLRenderTarget, UnsignedByteType, RGBAFormat, EdgesGeometry, OrthographicCamera, CylinderGeometry, Sprite, CanvasTexture, SRGBColorSpace, SpriteMaterial, LoadingManager, LoaderUtils, TextureLoader, BufferAttribute, PointsMaterial, Points, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, LineLoop, Group, NormalBlending, PerspectiveCamera, UniformsUtils, ShaderMaterial, AdditiveBlending, HalfFloatType, Scene, WebGLRenderer, LinearSRGBColorSpace } from "three";
|
|
6
6
|
|
|
7
7
|
import { TransformControls } from "three/examples/jsm/controls/TransformControls.js";
|
|
8
8
|
|
|
@@ -1049,7 +1049,7 @@ class MeasureSnapper {
|
|
|
1049
1049
|
}
|
|
1050
1050
|
update(scene) {
|
|
1051
1051
|
this.objects = [];
|
|
1052
|
-
scene.traverseVisible(
|
|
1052
|
+
scene.traverseVisible(child => this.objects.push(child));
|
|
1053
1053
|
}
|
|
1054
1054
|
}
|
|
1055
1055
|
|
|
@@ -1082,21 +1082,21 @@ class MeasureOverlay {
|
|
|
1082
1082
|
this.container = undefined;
|
|
1083
1083
|
}
|
|
1084
1084
|
clear() {
|
|
1085
|
-
this.lines.forEach(
|
|
1085
|
+
this.lines.forEach(line => line.dispose());
|
|
1086
1086
|
this.lines = [];
|
|
1087
1087
|
}
|
|
1088
1088
|
render() {
|
|
1089
1089
|
this.projector.updateProjectionMatrix();
|
|
1090
|
-
this.lines.forEach(
|
|
1090
|
+
this.lines.forEach(line => line.render());
|
|
1091
1091
|
}
|
|
1092
1092
|
update() {
|
|
1093
|
-
this.lines.forEach(
|
|
1093
|
+
this.lines.forEach(line => line.update());
|
|
1094
1094
|
}
|
|
1095
1095
|
addLine(line) {
|
|
1096
1096
|
this.lines.push(line);
|
|
1097
1097
|
}
|
|
1098
1098
|
removeLine(line) {
|
|
1099
|
-
this.lines = this.lines.filter(
|
|
1099
|
+
this.lines = this.lines.filter(x => x !== line);
|
|
1100
1100
|
}
|
|
1101
1101
|
}
|
|
1102
1102
|
|
|
@@ -1304,6 +1304,282 @@ class PanDragger extends OrbitDragger {
|
|
|
1304
1304
|
}
|
|
1305
1305
|
|
|
1306
1306
|
class WalkControls extends Controls {
|
|
1307
|
+
constructor(camera, canvas, groundObjects, viewer) {
|
|
1308
|
+
super(camera, canvas);
|
|
1309
|
+
this.EYE_HEIGHT = 1.7;
|
|
1310
|
+
this.FAILING_DISTANCE = 2;
|
|
1311
|
+
this.GROUND_FOLLOWING_SPEED = .05;
|
|
1312
|
+
this.LOOK_SPEED = .1;
|
|
1313
|
+
this.WALK_SPEED_DELIMITER = 4;
|
|
1314
|
+
this.WHEEL_SPEED_DELIMITER = 15e3;
|
|
1315
|
+
this.movementSpeed = .1;
|
|
1316
|
+
this.multiplier = 3;
|
|
1317
|
+
this.moveWheel = 0;
|
|
1318
|
+
this.mouseDragOn = false;
|
|
1319
|
+
this.onPointerDown = event => {
|
|
1320
|
+
if (event.button !== 0) return;
|
|
1321
|
+
this.domElement.setPointerCapture(event.pointerId);
|
|
1322
|
+
this.downPosition.set(event.clientX, event.clientY);
|
|
1323
|
+
this.quaternion.copy(this.object.quaternion);
|
|
1324
|
+
this.mouseDragOn = true;
|
|
1325
|
+
};
|
|
1326
|
+
this.onPointerMove = event => {
|
|
1327
|
+
if (!this.mouseDragOn) return;
|
|
1328
|
+
const movePosition = new Vector2(event.clientX, event.clientY);
|
|
1329
|
+
if (this.downPosition.distanceTo(movePosition) === 0) return;
|
|
1330
|
+
this.rotateDelta.copy(this.downPosition).sub(movePosition);
|
|
1331
|
+
this.rotateCamera(this.rotateDelta);
|
|
1332
|
+
this.dispatchEvent({
|
|
1333
|
+
type: "change"
|
|
1334
|
+
});
|
|
1335
|
+
};
|
|
1336
|
+
this.onPointerUp = event => {
|
|
1337
|
+
this.domElement.releasePointerCapture(event.pointerId);
|
|
1338
|
+
this.mouseDragOn = false;
|
|
1339
|
+
};
|
|
1340
|
+
this.onPointerCancel = event => {
|
|
1341
|
+
this.domElement.dispatchEvent(new PointerEvent("pointerup", event));
|
|
1342
|
+
};
|
|
1343
|
+
this.onWheel = event => {
|
|
1344
|
+
this.moveWheel = event.deltaY;
|
|
1345
|
+
this.update();
|
|
1346
|
+
};
|
|
1347
|
+
this.onKeyDown = event => {
|
|
1348
|
+
switch (event.code) {
|
|
1349
|
+
case "NumpadSubtract":
|
|
1350
|
+
case "Minus":
|
|
1351
|
+
if (this.multiplier > 1) {
|
|
1352
|
+
this.multiplier = this.multiplier - 1;
|
|
1353
|
+
this.dispatchEvent({
|
|
1354
|
+
type: "walkspeedchange",
|
|
1355
|
+
data: this.multiplier
|
|
1356
|
+
});
|
|
1357
|
+
}
|
|
1358
|
+
break;
|
|
1359
|
+
|
|
1360
|
+
case "NumpadAdd":
|
|
1361
|
+
case "Equal":
|
|
1362
|
+
if (this.multiplier < 10) {
|
|
1363
|
+
this.multiplier = this.multiplier + 1;
|
|
1364
|
+
this.dispatchEvent({
|
|
1365
|
+
type: "walkspeedchange",
|
|
1366
|
+
data: this.multiplier
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
break;
|
|
1370
|
+
|
|
1371
|
+
case "ArrowLeft":
|
|
1372
|
+
case "ArrowRight":
|
|
1373
|
+
case "ArrowUp":
|
|
1374
|
+
case "ArrowDown":
|
|
1375
|
+
case "KeyW":
|
|
1376
|
+
case "KeyS":
|
|
1377
|
+
case "KeyA":
|
|
1378
|
+
case "KeyD":
|
|
1379
|
+
case "KeyQ":
|
|
1380
|
+
case "KeyE":
|
|
1381
|
+
this.moveKeys.add(event.code);
|
|
1382
|
+
this.update();
|
|
1383
|
+
break;
|
|
1384
|
+
}
|
|
1385
|
+
};
|
|
1386
|
+
this.onKeyUp = event => {
|
|
1387
|
+
if (this.moveKeys.delete(event.code)) this.update();
|
|
1388
|
+
};
|
|
1389
|
+
this.initHighlighter = () => {
|
|
1390
|
+
this.highlighter = this.viewer.getComponent("HighlighterComponent");
|
|
1391
|
+
};
|
|
1392
|
+
this.camera = camera;
|
|
1393
|
+
this.viewer = viewer;
|
|
1394
|
+
this.groundObjects = groundObjects;
|
|
1395
|
+
this.raycaster = new Raycaster;
|
|
1396
|
+
this.raycaster.near = 0;
|
|
1397
|
+
this.raycaster.far = this.EYE_HEIGHT + this.FAILING_DISTANCE;
|
|
1398
|
+
this.moveKeys = new Set;
|
|
1399
|
+
this.moveClock = new Clock;
|
|
1400
|
+
this.quaternion = camera.quaternion.clone();
|
|
1401
|
+
this.downPosition = new Vector2(0, 0);
|
|
1402
|
+
this.rotateDelta = new Vector2(0, 0);
|
|
1403
|
+
this.domElement.addEventListener("pointerdown", this.onPointerDown);
|
|
1404
|
+
this.domElement.addEventListener("pointermove", this.onPointerMove);
|
|
1405
|
+
this.domElement.addEventListener("pointerup", this.onPointerUp);
|
|
1406
|
+
this.domElement.addEventListener("pointercancel", this.onPointerCancel);
|
|
1407
|
+
this.domElement.addEventListener("wheel", this.onWheel);
|
|
1408
|
+
window.addEventListener("keydown", this.onKeyDown);
|
|
1409
|
+
window.addEventListener("keyup", this.onKeyUp);
|
|
1410
|
+
}
|
|
1411
|
+
dispose() {
|
|
1412
|
+
this.domElement.removeEventListener("pointerdown", this.onPointerDown);
|
|
1413
|
+
this.domElement.removeEventListener("pointermove", this.onPointerMove);
|
|
1414
|
+
this.domElement.removeEventListener("pointerup", this.onPointerUp);
|
|
1415
|
+
this.domElement.removeEventListener("pointercancel", this.onPointerCancel);
|
|
1416
|
+
this.domElement.removeEventListener("wheel", this.onWheel);
|
|
1417
|
+
window.removeEventListener("keydown", this.onKeyDown);
|
|
1418
|
+
window.removeEventListener("keyup", this.onKeyUp);
|
|
1419
|
+
super.dispose();
|
|
1420
|
+
}
|
|
1421
|
+
updateGroundFollowing() {
|
|
1422
|
+
this.raycaster.set(this.object.position, new Vector3(0, -1, 0));
|
|
1423
|
+
this.raycaster.params = this.raycaster.params = {
|
|
1424
|
+
Mesh: {},
|
|
1425
|
+
Line: {
|
|
1426
|
+
threshold: 0
|
|
1427
|
+
},
|
|
1428
|
+
Line2: {
|
|
1429
|
+
threshold: 0
|
|
1430
|
+
},
|
|
1431
|
+
LOD: {
|
|
1432
|
+
threshold: 0
|
|
1433
|
+
},
|
|
1434
|
+
Points: {
|
|
1435
|
+
threshold: 0
|
|
1436
|
+
},
|
|
1437
|
+
Sprite: {
|
|
1438
|
+
threshold: 0
|
|
1439
|
+
}
|
|
1440
|
+
};
|
|
1441
|
+
let intersects = this.raycaster.intersectObjects(this.groundObjects, false);
|
|
1442
|
+
if (intersects.length > 0) {
|
|
1443
|
+
const groundY = intersects[0].point.y;
|
|
1444
|
+
const targetY = groundY + this.EYE_HEIGHT;
|
|
1445
|
+
this.object.position.y = MathUtils.lerp(this.object.position.y, targetY, this.GROUND_FOLLOWING_SPEED);
|
|
1446
|
+
}
|
|
1447
|
+
}
|
|
1448
|
+
select(objects, model) {
|
|
1449
|
+
if (!model) {
|
|
1450
|
+
this.viewer.models.forEach(model => this.select(objects, model));
|
|
1451
|
+
return;
|
|
1452
|
+
}
|
|
1453
|
+
if (!Array.isArray(objects)) objects = [ objects ];
|
|
1454
|
+
if (!objects.length) return;
|
|
1455
|
+
model.showOriginalObjects(objects);
|
|
1456
|
+
this.highlighter.highlight(objects);
|
|
1457
|
+
objects.forEach(object => this.viewer.selected.push(object));
|
|
1458
|
+
objects.forEach(object => object.isSelected = true);
|
|
1459
|
+
}
|
|
1460
|
+
update() {
|
|
1461
|
+
let moved = false;
|
|
1462
|
+
let upgradeGroundFollowing = false;
|
|
1463
|
+
const forward = new Vector3;
|
|
1464
|
+
const sideways = new Vector3;
|
|
1465
|
+
if (this.moveKeys.size > 0) {
|
|
1466
|
+
upgradeGroundFollowing = true;
|
|
1467
|
+
const timeDelta = this.moveClock.getDelta();
|
|
1468
|
+
const moveDelta = timeDelta * this.multiplier * this.movementSpeed / this.WALK_SPEED_DELIMITER;
|
|
1469
|
+
this.object.getWorldDirection(forward);
|
|
1470
|
+
forward.y = 0;
|
|
1471
|
+
forward.normalize();
|
|
1472
|
+
sideways.setFromMatrixColumn(this.object.matrix, 0);
|
|
1473
|
+
sideways.y = 0;
|
|
1474
|
+
sideways.normalize();
|
|
1475
|
+
if (this.moveKeys.has("KeyW")) {
|
|
1476
|
+
this.object.position.addScaledVector(forward, moveDelta);
|
|
1477
|
+
}
|
|
1478
|
+
if (this.moveKeys.has("KeyS")) {
|
|
1479
|
+
this.object.position.addScaledVector(forward, -moveDelta);
|
|
1480
|
+
}
|
|
1481
|
+
if (this.moveKeys.has("KeyA")) {
|
|
1482
|
+
this.object.position.addScaledVector(sideways, -moveDelta);
|
|
1483
|
+
}
|
|
1484
|
+
if (this.moveKeys.has("KeyD")) {
|
|
1485
|
+
this.object.position.addScaledVector(sideways, moveDelta);
|
|
1486
|
+
}
|
|
1487
|
+
if (this.moveKeys.has("KeyQ")) {
|
|
1488
|
+
this.object.translateY(moveDelta);
|
|
1489
|
+
upgradeGroundFollowing = false;
|
|
1490
|
+
}
|
|
1491
|
+
if (this.moveKeys.has("KeyE")) {
|
|
1492
|
+
this.object.translateY(-moveDelta);
|
|
1493
|
+
upgradeGroundFollowing = false;
|
|
1494
|
+
}
|
|
1495
|
+
const lookDelta = this.LOOK_SPEED + (this.multiplier - 1);
|
|
1496
|
+
if (this.moveKeys.has("ArrowUp")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, -lookDelta / 2)));
|
|
1497
|
+
if (this.moveKeys.has("ArrowDown")) this.rotateCamera(this.rotateDelta.add(new Vector2(0, lookDelta / 2)));
|
|
1498
|
+
if (this.moveKeys.has("ArrowLeft")) this.rotateCamera(this.rotateDelta.add(new Vector2(lookDelta, 0)));
|
|
1499
|
+
if (this.moveKeys.has("ArrowRight")) this.rotateCamera(this.rotateDelta.add(new Vector2(-lookDelta, 0)));
|
|
1500
|
+
this.moveWheel = 0;
|
|
1501
|
+
moved = true;
|
|
1502
|
+
}
|
|
1503
|
+
if (this.moveWheel !== 0) {
|
|
1504
|
+
const moveDelta = this.moveWheel * this.multiplier * this.movementSpeed / this.WHEEL_SPEED_DELIMITER;
|
|
1505
|
+
this.object.getWorldDirection(forward);
|
|
1506
|
+
forward.y = 0;
|
|
1507
|
+
forward.normalize();
|
|
1508
|
+
this.object.position.addScaledVector(forward, -moveDelta);
|
|
1509
|
+
this.moveWheel += -1 * Math.sign(this.moveWheel);
|
|
1510
|
+
moved = true;
|
|
1511
|
+
}
|
|
1512
|
+
if (upgradeGroundFollowing) this.updateGroundFollowing();
|
|
1513
|
+
if (moved) {
|
|
1514
|
+
this.dispatchEvent({
|
|
1515
|
+
type: "change"
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1518
|
+
if (this.moveKeys.size === 0 && this.moveWheel === 0) {
|
|
1519
|
+
this.moveClock.stop();
|
|
1520
|
+
this.moveClock.autoStart = true;
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
rotateCamera(delta) {
|
|
1524
|
+
const rotateX = Math.PI * delta.x / this.domElement.clientWidth;
|
|
1525
|
+
const rotateY = Math.PI * delta.y / this.domElement.clientHeight;
|
|
1526
|
+
const xRotation = new Quaternion;
|
|
1527
|
+
xRotation.setFromAxisAngle(this.object.up, rotateX);
|
|
1528
|
+
const yRotation = new Quaternion;
|
|
1529
|
+
yRotation.setFromAxisAngle(new Vector3(1, 0, 0), rotateY);
|
|
1530
|
+
const quaternion = this.quaternion.clone();
|
|
1531
|
+
quaternion.premultiply(xRotation).multiply(yRotation).normalize();
|
|
1532
|
+
this.object.setRotationFromQuaternion(quaternion);
|
|
1533
|
+
}
|
|
1534
|
+
}
|
|
1535
|
+
|
|
1536
|
+
class WalkDragger {
|
|
1537
|
+
constructor(viewer) {
|
|
1538
|
+
this.updateControls = () => {
|
|
1539
|
+
const size = this.viewer.extents.getSize(new Vector3);
|
|
1540
|
+
this.controls.movementSpeed = Math.min(size.x, size.y, size.z) / 2;
|
|
1541
|
+
};
|
|
1542
|
+
this.controlsChange = () => {
|
|
1543
|
+
this.viewer.update();
|
|
1544
|
+
this.viewer.emitEvent({
|
|
1545
|
+
type: "changecamera"
|
|
1546
|
+
});
|
|
1547
|
+
};
|
|
1548
|
+
this.walkspeedChange = event => {
|
|
1549
|
+
this.viewer.emitEvent(event);
|
|
1550
|
+
};
|
|
1551
|
+
this.viewerRender = () => {
|
|
1552
|
+
this.controls.update();
|
|
1553
|
+
};
|
|
1554
|
+
this.viewerZoom = () => {
|
|
1555
|
+
this.controls.rotateDelta.set(0, 0);
|
|
1556
|
+
};
|
|
1557
|
+
const meshOnlyGround = [];
|
|
1558
|
+
viewer.models[0].getObjects().forEach(obj => {
|
|
1559
|
+
obj.traverse(child => {
|
|
1560
|
+
if (child instanceof Mesh) {
|
|
1561
|
+
meshOnlyGround.push(child);
|
|
1562
|
+
}
|
|
1563
|
+
});
|
|
1564
|
+
});
|
|
1565
|
+
this.controls = new WalkControls(viewer.camera, viewer.canvas, meshOnlyGround, viewer);
|
|
1566
|
+
this.controls.addEventListener("change", this.controlsChange);
|
|
1567
|
+
this.controls.addEventListener("walkspeedchange", this.walkspeedChange);
|
|
1568
|
+
this.viewer = viewer;
|
|
1569
|
+
this.viewer.on("render", this.viewerRender);
|
|
1570
|
+
this.viewer.on("zoom", this.viewerZoom);
|
|
1571
|
+
this.updateControls();
|
|
1572
|
+
}
|
|
1573
|
+
dispose() {
|
|
1574
|
+
this.viewer.off("render", this.viewerRender);
|
|
1575
|
+
this.viewer.off("zoom", this.viewerZoom);
|
|
1576
|
+
this.controls.removeEventListener("walkspeedchange", this.walkspeedChange);
|
|
1577
|
+
this.controls.removeEventListener("change", this.controlsChange);
|
|
1578
|
+
this.controls.dispose();
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
|
|
1582
|
+
class FlyControls extends Controls {
|
|
1307
1583
|
constructor(camera, canvas) {
|
|
1308
1584
|
super(camera, canvas);
|
|
1309
1585
|
this.movementSpeed = .2;
|
|
@@ -1346,7 +1622,7 @@ class WalkControls extends Controls {
|
|
|
1346
1622
|
if (this.multiplier > 1) {
|
|
1347
1623
|
this.multiplier = this.multiplier - 1;
|
|
1348
1624
|
this.dispatchEvent({
|
|
1349
|
-
type: "
|
|
1625
|
+
type: "flyspeedchange",
|
|
1350
1626
|
data: this.multiplier
|
|
1351
1627
|
});
|
|
1352
1628
|
}
|
|
@@ -1357,7 +1633,7 @@ class WalkControls extends Controls {
|
|
|
1357
1633
|
if (this.multiplier < 10) {
|
|
1358
1634
|
this.multiplier = this.multiplier + 1;
|
|
1359
1635
|
this.dispatchEvent({
|
|
1360
|
-
type: "
|
|
1636
|
+
type: "flyspeedchange",
|
|
1361
1637
|
data: this.multiplier
|
|
1362
1638
|
});
|
|
1363
1639
|
}
|
|
@@ -1450,7 +1726,7 @@ class WalkControls extends Controls {
|
|
|
1450
1726
|
}
|
|
1451
1727
|
}
|
|
1452
1728
|
|
|
1453
|
-
class
|
|
1729
|
+
class FlyDragger {
|
|
1454
1730
|
constructor(viewer) {
|
|
1455
1731
|
this.updateControls = () => {
|
|
1456
1732
|
const size = this.viewer.extents.getSize(new Vector3);
|
|
@@ -1462,7 +1738,7 @@ class WalkDragger {
|
|
|
1462
1738
|
type: "changecamera"
|
|
1463
1739
|
});
|
|
1464
1740
|
};
|
|
1465
|
-
this.
|
|
1741
|
+
this.flyspeedChange = event => {
|
|
1466
1742
|
this.viewer.emitEvent(event);
|
|
1467
1743
|
};
|
|
1468
1744
|
this.viewerRender = () => {
|
|
@@ -1471,9 +1747,9 @@ class WalkDragger {
|
|
|
1471
1747
|
this.viewerZoom = () => {
|
|
1472
1748
|
this.controls.rotateDelta.set(0, 0);
|
|
1473
1749
|
};
|
|
1474
|
-
this.controls = new
|
|
1750
|
+
this.controls = new FlyControls(viewer.camera, viewer.canvas);
|
|
1475
1751
|
this.controls.addEventListener("change", this.controlsChange);
|
|
1476
|
-
this.controls.addEventListener("
|
|
1752
|
+
this.controls.addEventListener("flyspeedchange", this.flyspeedChange);
|
|
1477
1753
|
this.viewer = viewer;
|
|
1478
1754
|
this.viewer.on("render", this.viewerRender);
|
|
1479
1755
|
this.viewer.on("zoom", this.viewerZoom);
|
|
@@ -1482,7 +1758,7 @@ class WalkDragger {
|
|
|
1482
1758
|
dispose() {
|
|
1483
1759
|
this.viewer.off("render", this.viewerRender);
|
|
1484
1760
|
this.viewer.off("zoom", this.viewerZoom);
|
|
1485
|
-
this.controls.removeEventListener("
|
|
1761
|
+
this.controls.removeEventListener("flyspeedchange", this.flyspeedChange);
|
|
1486
1762
|
this.controls.removeEventListener("change", this.controlsChange);
|
|
1487
1763
|
this.controls.dispose();
|
|
1488
1764
|
}
|
|
@@ -1501,21 +1777,23 @@ class ZoomDragger extends OrbitDragger {
|
|
|
1501
1777
|
|
|
1502
1778
|
const draggers = draggersRegistry("threejs");
|
|
1503
1779
|
|
|
1504
|
-
draggers.registerDragger("Pan",
|
|
1780
|
+
draggers.registerDragger("Pan", viewer => new PanDragger(viewer));
|
|
1781
|
+
|
|
1782
|
+
draggers.registerDragger("Orbit", viewer => new OrbitDragger(viewer));
|
|
1505
1783
|
|
|
1506
|
-
draggers.registerDragger("
|
|
1784
|
+
draggers.registerDragger("Zoom", viewer => new ZoomDragger(viewer));
|
|
1507
1785
|
|
|
1508
|
-
draggers.registerDragger("
|
|
1786
|
+
draggers.registerDragger("MeasureLine", viewer => new MeasureLineDragger(viewer));
|
|
1509
1787
|
|
|
1510
|
-
draggers.registerDragger("
|
|
1788
|
+
draggers.registerDragger("CuttingPlaneXAxis", viewer => new CuttingPlaneXAxisDragger(viewer));
|
|
1511
1789
|
|
|
1512
|
-
draggers.registerDragger("
|
|
1790
|
+
draggers.registerDragger("CuttingPlaneYAxis", viewer => new CuttingPlaneYAxisDragger(viewer));
|
|
1513
1791
|
|
|
1514
|
-
draggers.registerDragger("
|
|
1792
|
+
draggers.registerDragger("CuttingPlaneZAxis", viewer => new CuttingPlaneZAxisDragger(viewer));
|
|
1515
1793
|
|
|
1516
|
-
draggers.registerDragger("
|
|
1794
|
+
draggers.registerDragger("Walk", viewer => new WalkDragger(viewer));
|
|
1517
1795
|
|
|
1518
|
-
draggers.registerDragger("
|
|
1796
|
+
draggers.registerDragger("Fly", viewer => new FlyDragger(viewer));
|
|
1519
1797
|
|
|
1520
1798
|
function applyModelTransform(viewer, model) {
|
|
1521
1799
|
console.warn("applyModelTransform not implemented");
|
|
@@ -1546,7 +1824,7 @@ function createPreview(viewer, type = "image/jpeg", encoderOptions = .25) {
|
|
|
1546
1824
|
}
|
|
1547
1825
|
|
|
1548
1826
|
function explode(viewer, index = 0) {
|
|
1549
|
-
viewer.models.forEach(
|
|
1827
|
+
viewer.models.forEach(model => model.explode(index));
|
|
1550
1828
|
viewer.update();
|
|
1551
1829
|
viewer.emitEvent({
|
|
1552
1830
|
type: "explode",
|
|
@@ -1627,17 +1905,17 @@ function getDefaultViewPositions() {
|
|
|
1627
1905
|
}
|
|
1628
1906
|
|
|
1629
1907
|
function getModels(viewer) {
|
|
1630
|
-
return viewer.models.map(
|
|
1908
|
+
return viewer.models.map(model => model.handle);
|
|
1631
1909
|
}
|
|
1632
1910
|
|
|
1633
1911
|
function getSelected(viewer) {
|
|
1634
1912
|
const handles = [];
|
|
1635
|
-
viewer.models.forEach(
|
|
1913
|
+
viewer.models.forEach(model => handles.push(...model.getHandlesByObjects(viewer.selected)));
|
|
1636
1914
|
return handles;
|
|
1637
1915
|
}
|
|
1638
1916
|
|
|
1639
1917
|
function hideSelected(viewer) {
|
|
1640
|
-
viewer.models.forEach(
|
|
1918
|
+
viewer.models.forEach(model => model.hideObjects(viewer.selected));
|
|
1641
1919
|
const selection = viewer.getComponent("SelectionComponent");
|
|
1642
1920
|
selection.clearSelection();
|
|
1643
1921
|
viewer.update();
|
|
@@ -1652,7 +1930,7 @@ function hideSelected(viewer) {
|
|
|
1652
1930
|
}
|
|
1653
1931
|
|
|
1654
1932
|
function isolateSelected(viewer) {
|
|
1655
|
-
viewer.models.forEach(
|
|
1933
|
+
viewer.models.forEach(model => model.isolateObjects(viewer.selected));
|
|
1656
1934
|
viewer.update();
|
|
1657
1935
|
viewer.emitEvent({
|
|
1658
1936
|
type: "isolate"
|
|
@@ -1683,7 +1961,7 @@ function resetView(viewer) {
|
|
|
1683
1961
|
function selectModel(viewer, handle) {
|
|
1684
1962
|
const selection = viewer.getComponent("SelectionComponent");
|
|
1685
1963
|
selection.clearSelection();
|
|
1686
|
-
viewer.models.filter(
|
|
1964
|
+
viewer.models.filter(model => model.handle === handle).forEach(model => selection.select(model.getObjects(), model));
|
|
1687
1965
|
viewer.update();
|
|
1688
1966
|
viewer.emit({
|
|
1689
1967
|
type: "select",
|
|
@@ -1702,11 +1980,11 @@ function setMarkupColor(viewer, r = 255, g = 0, b = 0) {
|
|
|
1702
1980
|
function setSelected(viewer, handles = []) {
|
|
1703
1981
|
const selection = viewer.getComponent("SelectionComponent");
|
|
1704
1982
|
selection.clearSelection();
|
|
1705
|
-
viewer.models.forEach(
|
|
1983
|
+
viewer.models.forEach(model => {
|
|
1706
1984
|
const objects = model.getObjectsByHandles(handles);
|
|
1707
1985
|
model.showObjects(objects);
|
|
1708
1986
|
selection.select(objects, model);
|
|
1709
|
-
})
|
|
1987
|
+
});
|
|
1710
1988
|
viewer.update();
|
|
1711
1989
|
viewer.emitEvent({
|
|
1712
1990
|
type: "show"
|
|
@@ -1719,7 +1997,7 @@ function setSelected(viewer, handles = []) {
|
|
|
1719
1997
|
}
|
|
1720
1998
|
|
|
1721
1999
|
function showAll(viewer) {
|
|
1722
|
-
viewer.models.forEach(
|
|
2000
|
+
viewer.models.forEach(model => model.showAllObjects());
|
|
1723
2001
|
viewer.update();
|
|
1724
2002
|
viewer.emitEvent({
|
|
1725
2003
|
type: "showall"
|
|
@@ -1733,17 +2011,17 @@ function zoomToExtents(viewer) {
|
|
|
1733
2011
|
function zoomToObjects(viewer, handles = []) {
|
|
1734
2012
|
const handleSet = new Set(handles);
|
|
1735
2013
|
const objects = [];
|
|
1736
|
-
viewer.scene.traverseVisible(
|
|
2014
|
+
viewer.scene.traverseVisible(child => {
|
|
1737
2015
|
var _a;
|
|
1738
|
-
if (handleSet.has((_a = child.userData) === null || _a ===
|
|
1739
|
-
})
|
|
1740
|
-
const extents = objects.reduce((
|
|
2016
|
+
if (handleSet.has((_a = child.userData) === null || _a === void 0 ? void 0 : _a.handle)) objects.push(child);
|
|
2017
|
+
});
|
|
2018
|
+
const extents = objects.reduce((result, object) => result.expandByObject(object), new Box3);
|
|
1741
2019
|
if (extents.isEmpty()) extents.copy(viewer.extents);
|
|
1742
2020
|
zoomTo(viewer, extents);
|
|
1743
2021
|
}
|
|
1744
2022
|
|
|
1745
2023
|
function zoomToSelected(viewer) {
|
|
1746
|
-
const extents = viewer.selected.reduce((
|
|
2024
|
+
const extents = viewer.selected.reduce((result, object) => result.expandByObject(object), new Box3);
|
|
1747
2025
|
if (extents.isEmpty()) extents.copy(viewer.extents);
|
|
1748
2026
|
zoomTo(viewer, extents);
|
|
1749
2027
|
}
|
|
@@ -1796,25 +2074,25 @@ commands.registerCommand("zoomToObjects", zoomToObjects);
|
|
|
1796
2074
|
|
|
1797
2075
|
commands.registerCommand("zoomToSelected", zoomToSelected);
|
|
1798
2076
|
|
|
1799
|
-
commands.registerCommand("top",
|
|
2077
|
+
commands.registerCommand("top", viewer => setDefaultViewPosition(viewer, "top"));
|
|
1800
2078
|
|
|
1801
|
-
commands.registerCommand("bottom",
|
|
2079
|
+
commands.registerCommand("bottom", viewer => setDefaultViewPosition(viewer, "bottom"));
|
|
1802
2080
|
|
|
1803
|
-
commands.registerCommand("left",
|
|
2081
|
+
commands.registerCommand("left", viewer => setDefaultViewPosition(viewer, "left"));
|
|
1804
2082
|
|
|
1805
|
-
commands.registerCommand("right",
|
|
2083
|
+
commands.registerCommand("right", viewer => setDefaultViewPosition(viewer, "right"));
|
|
1806
2084
|
|
|
1807
|
-
commands.registerCommand("front",
|
|
2085
|
+
commands.registerCommand("front", viewer => setDefaultViewPosition(viewer, "front"));
|
|
1808
2086
|
|
|
1809
|
-
commands.registerCommand("back",
|
|
2087
|
+
commands.registerCommand("back", viewer => setDefaultViewPosition(viewer, "back"));
|
|
1810
2088
|
|
|
1811
|
-
commands.registerCommand("sw",
|
|
2089
|
+
commands.registerCommand("sw", viewer => setDefaultViewPosition(viewer, "sw"));
|
|
1812
2090
|
|
|
1813
|
-
commands.registerCommand("se",
|
|
2091
|
+
commands.registerCommand("se", viewer => setDefaultViewPosition(viewer, "se"));
|
|
1814
2092
|
|
|
1815
|
-
commands.registerCommand("ne",
|
|
2093
|
+
commands.registerCommand("ne", viewer => setDefaultViewPosition(viewer, "ne"));
|
|
1816
2094
|
|
|
1817
|
-
commands.registerCommand("nw",
|
|
2095
|
+
commands.registerCommand("nw", viewer => setDefaultViewPosition(viewer, "nw"));
|
|
1818
2096
|
|
|
1819
2097
|
commands.registerCommandAlias("clearMarkup", "clearOverlay");
|
|
1820
2098
|
|
|
@@ -1867,9 +2145,9 @@ class CameraComponent {
|
|
|
1867
2145
|
const rendererSize = this.viewer.renderer.getSize(new Vector2);
|
|
1868
2146
|
const aspect = rendererSize.x / rendererSize.y;
|
|
1869
2147
|
let camera;
|
|
1870
|
-
this.viewer.scene.traverse(
|
|
2148
|
+
this.viewer.scene.traverse(object => {
|
|
1871
2149
|
if (object.isCamera) if (!camera) camera = object; else if (object.isPerspectiveCamera && camera.isOrthographicCamera) camera = object;
|
|
1872
|
-
})
|
|
2150
|
+
});
|
|
1873
2151
|
if (camera) {
|
|
1874
2152
|
camera.isDefaultCamera = true;
|
|
1875
2153
|
camera.scale.set(1, 1, 1);
|
|
@@ -1909,7 +2187,7 @@ class ExtentsComponent {
|
|
|
1909
2187
|
constructor(viewer) {
|
|
1910
2188
|
this.syncExtents = () => {
|
|
1911
2189
|
const extents = new Box3;
|
|
1912
|
-
this.viewer.models.forEach(
|
|
2190
|
+
this.viewer.models.forEach(model => model.getExtents(extents));
|
|
1913
2191
|
this.viewer.extents.copy(extents);
|
|
1914
2192
|
this.viewer.extents.getCenter(this.viewer.target);
|
|
1915
2193
|
};
|
|
@@ -2119,7 +2397,7 @@ class HighlighterComponent {
|
|
|
2119
2397
|
const {edgesVisibility: edgesVisibility} = this.viewer.options;
|
|
2120
2398
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2121
2399
|
if (!objects.length) return;
|
|
2122
|
-
objects.filter(
|
|
2400
|
+
objects.filter(object => !object.userData.isEdge).forEach(object => {
|
|
2123
2401
|
if (object.isHighlighted) return;
|
|
2124
2402
|
if (object.isLine || object.isLineSegments) {
|
|
2125
2403
|
const positions = object.geometry.attributes.position.array;
|
|
@@ -2149,19 +2427,19 @@ class HighlighterComponent {
|
|
|
2149
2427
|
object.material = this.facesMaterial;
|
|
2150
2428
|
object.isHighlighted = true;
|
|
2151
2429
|
}
|
|
2152
|
-
})
|
|
2430
|
+
});
|
|
2153
2431
|
}
|
|
2154
2432
|
unhighlight(objects) {
|
|
2155
2433
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2156
2434
|
if (!objects.length) return;
|
|
2157
|
-
objects.forEach(
|
|
2435
|
+
objects.forEach(object => {
|
|
2158
2436
|
if (!object.isHighlighted) return;
|
|
2159
2437
|
object.isHighlighted = false;
|
|
2160
2438
|
object.material = object.userData.originalMaterial;
|
|
2161
2439
|
object.userData.highlightWireframe.removeFromParent();
|
|
2162
2440
|
delete object.userData.originalMaterial;
|
|
2163
2441
|
delete object.userData.highlightWireframe;
|
|
2164
|
-
})
|
|
2442
|
+
});
|
|
2165
2443
|
}
|
|
2166
2444
|
syncHighlightColors() {
|
|
2167
2445
|
const {facesColor: facesColor, facesTransparancy: facesTransparancy, facesOverlap: facesOverlap} = this.viewer.options;
|
|
@@ -2177,16 +2455,16 @@ class HighlighterComponent {
|
|
|
2177
2455
|
this.lineGlowMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);
|
|
2178
2456
|
this.lineGlowMaterial.depthTest = !edgesOverlap;
|
|
2179
2457
|
this.lineGlowMaterial.depthWrite = !edgesOverlap;
|
|
2180
|
-
this.viewer.selected.forEach(
|
|
2458
|
+
this.viewer.selected.forEach(selected => {
|
|
2181
2459
|
const wireframe = selected.userData.highlightWireframe;
|
|
2182
2460
|
if (wireframe) wireframe.visible = edgesVisibility;
|
|
2183
|
-
})
|
|
2461
|
+
});
|
|
2184
2462
|
}
|
|
2185
2463
|
viewerResize(event) {
|
|
2186
2464
|
var _a, _b, _c;
|
|
2187
|
-
(_a = this.renderTarget) === null || _a ===
|
|
2188
|
-
(_b = this.edgesMaterial) === null || _b ===
|
|
2189
|
-
(_c = this.lineGlowMaterial) === null || _c ===
|
|
2465
|
+
(_a = this.renderTarget) === null || _a === void 0 ? void 0 : _a.setSize(event.width, event.height);
|
|
2466
|
+
(_b = this.edgesMaterial) === null || _b === void 0 ? void 0 : _b.resolution.set(event.width, event.height);
|
|
2467
|
+
(_c = this.lineGlowMaterial) === null || _c === void 0 ? void 0 : _c.resolution.set(event.width, event.height);
|
|
2190
2468
|
}
|
|
2191
2469
|
}
|
|
2192
2470
|
|
|
@@ -2201,15 +2479,15 @@ class SelectionComponent {
|
|
|
2201
2479
|
const upPosition = this.getMousePosition(event, new Vector2);
|
|
2202
2480
|
if (upPosition.distanceTo(this.downPosition) !== 0) return;
|
|
2203
2481
|
let intersections = [];
|
|
2204
|
-
this.viewer.models.forEach(
|
|
2482
|
+
this.viewer.models.forEach(model => {
|
|
2205
2483
|
const objects = model.getVisibleObjects();
|
|
2206
2484
|
const intersects = this.getPointerIntersects(upPosition, objects);
|
|
2207
2485
|
if (intersects.length > 0) intersections.push({
|
|
2208
2486
|
...intersects[0],
|
|
2209
2487
|
model: model
|
|
2210
2488
|
});
|
|
2211
|
-
})
|
|
2212
|
-
intersections = intersections.sort((
|
|
2489
|
+
});
|
|
2490
|
+
intersections = intersections.sort((a, b) => a.distance - b.distance);
|
|
2213
2491
|
if (!event.shiftKey) this.clearSelection();
|
|
2214
2492
|
if (intersections.length > 0) {
|
|
2215
2493
|
const model = intersections[0].model;
|
|
@@ -2272,27 +2550,27 @@ class SelectionComponent {
|
|
|
2272
2550
|
}
|
|
2273
2551
|
select(objects, model) {
|
|
2274
2552
|
if (!model) {
|
|
2275
|
-
this.viewer.models.forEach(
|
|
2553
|
+
this.viewer.models.forEach(model => this.select(objects, model));
|
|
2276
2554
|
return;
|
|
2277
2555
|
}
|
|
2278
2556
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2279
2557
|
if (!objects.length) return;
|
|
2280
2558
|
model.showOriginalObjects(objects);
|
|
2281
2559
|
this.highlighter.highlight(objects);
|
|
2282
|
-
objects.forEach(
|
|
2283
|
-
objects.forEach(
|
|
2560
|
+
objects.forEach(object => this.viewer.selected.push(object));
|
|
2561
|
+
objects.forEach(object => object.isSelected = true);
|
|
2284
2562
|
}
|
|
2285
2563
|
deselect(objects, model) {
|
|
2286
2564
|
if (!model) {
|
|
2287
|
-
this.viewer.models.forEach(
|
|
2565
|
+
this.viewer.models.forEach(model => this.select(objects, model));
|
|
2288
2566
|
return;
|
|
2289
2567
|
}
|
|
2290
2568
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2291
2569
|
if (!objects.length) return;
|
|
2292
2570
|
this.highlighter.unhighlight(objects);
|
|
2293
2571
|
model.hideOriginalObjects(objects);
|
|
2294
|
-
this.viewer.selected = this.viewer.selected.filter(
|
|
2295
|
-
objects.forEach(
|
|
2572
|
+
this.viewer.selected = this.viewer.selected.filter(x => !objects.includes(x));
|
|
2573
|
+
objects.forEach(object => object.isSelected = false);
|
|
2296
2574
|
}
|
|
2297
2575
|
toggleSelection(objects, model) {
|
|
2298
2576
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
@@ -2302,8 +2580,8 @@ class SelectionComponent {
|
|
|
2302
2580
|
clearSelection() {
|
|
2303
2581
|
if (!this.viewer.selected.length) return;
|
|
2304
2582
|
this.highlighter.unhighlight(this.viewer.selected);
|
|
2305
|
-
this.viewer.models.forEach(
|
|
2306
|
-
this.viewer.selected.forEach(
|
|
2583
|
+
this.viewer.models.forEach(model => model.hideOriginalObjects(this.viewer.selected));
|
|
2584
|
+
this.viewer.selected.forEach(object => object.isSelected = false);
|
|
2307
2585
|
this.viewer.selected.length = 0;
|
|
2308
2586
|
}
|
|
2309
2587
|
}
|
|
@@ -2339,8 +2617,8 @@ class WCSHelper extends Object3D {
|
|
|
2339
2617
|
Y: [ [ new Mesh(arrowGeometry, matGreen), [ 0, .5, 0 ], null ], [ new Mesh(lineGeometry, matGreen), null, null ], [ new Sprite(spriteGreen), [ 0, 1.55, 0 ] ] ],
|
|
2340
2618
|
Z: [ [ new Mesh(arrowGeometry, matBlue), [ 0, 0, .5 ], [ Math.PI / 2, 0, 0 ] ], [ new Mesh(lineGeometry, matBlue), null, [ Math.PI / 2, 0, 0 ] ], [ new Sprite(spriteBlue), [ 0, 0, 1.55 ] ] ]
|
|
2341
2619
|
};
|
|
2342
|
-
Object.keys(axesMap).forEach(
|
|
2343
|
-
axesMap[key].forEach(
|
|
2620
|
+
Object.keys(axesMap).forEach(key => {
|
|
2621
|
+
axesMap[key].forEach(objects => {
|
|
2344
2622
|
const object = objects[0];
|
|
2345
2623
|
const position = objects[1];
|
|
2346
2624
|
const rotation = objects[2];
|
|
@@ -2349,14 +2627,14 @@ class WCSHelper extends Object3D {
|
|
|
2349
2627
|
if (rotation) object.rotation.set(rotation[0], rotation[1], rotation[2]);
|
|
2350
2628
|
object.updateMatrixWorld();
|
|
2351
2629
|
this.add(object);
|
|
2352
|
-
})
|
|
2353
|
-
})
|
|
2630
|
+
});
|
|
2631
|
+
});
|
|
2354
2632
|
}
|
|
2355
2633
|
dispose() {
|
|
2356
|
-
this.traverse(
|
|
2634
|
+
this.traverse(object => {
|
|
2357
2635
|
if (object.geometry) object.geometry.dispose();
|
|
2358
2636
|
if (object.material) object.material.dispose();
|
|
2359
|
-
})
|
|
2637
|
+
});
|
|
2360
2638
|
}
|
|
2361
2639
|
getSpriteMaterial(color, text) {
|
|
2362
2640
|
const canvas = document.createElement("canvas");
|
|
@@ -2418,23 +2696,23 @@ class WCSHelperComponent {
|
|
|
2418
2696
|
|
|
2419
2697
|
const components = componentsRegistry("threejs");
|
|
2420
2698
|
|
|
2421
|
-
components.registerComponent("ExtentsComponent",
|
|
2699
|
+
components.registerComponent("ExtentsComponent", viewer => new ExtentsComponent(viewer));
|
|
2422
2700
|
|
|
2423
|
-
components.registerComponent("CameraComponent",
|
|
2701
|
+
components.registerComponent("CameraComponent", viewer => new CameraComponent(viewer));
|
|
2424
2702
|
|
|
2425
|
-
components.registerComponent("BackgroundComponent",
|
|
2703
|
+
components.registerComponent("BackgroundComponent", viewer => new BackgroundComponent(viewer));
|
|
2426
2704
|
|
|
2427
|
-
components.registerComponent("LightComponent",
|
|
2705
|
+
components.registerComponent("LightComponent", viewer => new LightComponent(viewer));
|
|
2428
2706
|
|
|
2429
|
-
components.registerComponent("ResizeCanvasComponent",
|
|
2707
|
+
components.registerComponent("ResizeCanvasComponent", viewer => new ResizeCanvasComponent(viewer));
|
|
2430
2708
|
|
|
2431
|
-
components.registerComponent("RenderLoopComponent",
|
|
2709
|
+
components.registerComponent("RenderLoopComponent", viewer => new RenderLoopComponent(viewer));
|
|
2432
2710
|
|
|
2433
|
-
components.registerComponent("HighlighterComponent",
|
|
2711
|
+
components.registerComponent("HighlighterComponent", viewer => new HighlighterComponent(viewer));
|
|
2434
2712
|
|
|
2435
|
-
components.registerComponent("SelectionComponent",
|
|
2713
|
+
components.registerComponent("SelectionComponent", viewer => new SelectionComponent(viewer));
|
|
2436
2714
|
|
|
2437
|
-
components.registerComponent("WCSHelperComponent",
|
|
2715
|
+
components.registerComponent("WCSHelperComponent", viewer => new WCSHelperComponent(viewer));
|
|
2438
2716
|
|
|
2439
2717
|
class GLTFLoadingManager extends LoadingManager {
|
|
2440
2718
|
constructor(file, params = {}) {
|
|
@@ -2449,19 +2727,19 @@ class GLTFLoadingManager extends LoadingManager {
|
|
|
2449
2727
|
this.fileURL = file;
|
|
2450
2728
|
this.resourcePath = LoaderUtils.extractUrlBase(file);
|
|
2451
2729
|
} else {
|
|
2452
|
-
externalFiles.forEach((
|
|
2730
|
+
externalFiles.forEach((value, key) => this.fileURL = value === file ? key : this.fileURL);
|
|
2453
2731
|
externalFiles.set(this.fileURL, file);
|
|
2454
2732
|
}
|
|
2455
|
-
externalFiles.forEach((
|
|
2733
|
+
externalFiles.forEach((value, key) => {
|
|
2456
2734
|
let dataURL;
|
|
2457
2735
|
if (typeof value === "string") dataURL = value; else dataURL = URL.createObjectURL(new Blob([ value ]));
|
|
2458
2736
|
this.dataURLs.set(key, dataURL);
|
|
2459
|
-
})
|
|
2460
|
-
this.setURLModifier(
|
|
2737
|
+
});
|
|
2738
|
+
this.setURLModifier(url => {
|
|
2461
2739
|
const key = decodeURI(url).replace(this.path, "").replace(this.resourcePath, "").replace(/^(\.?\/)/, "");
|
|
2462
2740
|
const dataURL = this.dataURLs.get(key);
|
|
2463
|
-
return dataURL !== null && dataURL !==
|
|
2464
|
-
})
|
|
2741
|
+
return dataURL !== null && dataURL !== void 0 ? dataURL : url;
|
|
2742
|
+
});
|
|
2465
2743
|
}
|
|
2466
2744
|
dispose() {
|
|
2467
2745
|
this.dataURLs.forEach(URL.revokeObjectURL);
|
|
@@ -2479,7 +2757,7 @@ class ModelImpl {
|
|
|
2479
2757
|
}
|
|
2480
2758
|
function disposeMaterials(material) {
|
|
2481
2759
|
const materials = Array.isArray(material) ? material : [ material ];
|
|
2482
|
-
materials.forEach(
|
|
2760
|
+
materials.forEach(material => disposeMaterial(material));
|
|
2483
2761
|
}
|
|
2484
2762
|
function disposeObject(object) {
|
|
2485
2763
|
if (object.geometry) object.geometry.dispose();
|
|
@@ -2489,17 +2767,17 @@ class ModelImpl {
|
|
|
2489
2767
|
this.scene.clear();
|
|
2490
2768
|
}
|
|
2491
2769
|
getExtents(target) {
|
|
2492
|
-
this.scene.traverseVisible(
|
|
2770
|
+
this.scene.traverseVisible(object => !object.children.length && target.expandByObject(object));
|
|
2493
2771
|
return target;
|
|
2494
2772
|
}
|
|
2495
2773
|
getObjects() {
|
|
2496
2774
|
const objects = [];
|
|
2497
|
-
this.scene.traverse(
|
|
2775
|
+
this.scene.traverse(object => objects.push(object));
|
|
2498
2776
|
return objects;
|
|
2499
2777
|
}
|
|
2500
2778
|
getVisibleObjects() {
|
|
2501
2779
|
const objects = [];
|
|
2502
|
-
this.scene.traverseVisible(
|
|
2780
|
+
this.scene.traverseVisible(object => objects.push(object));
|
|
2503
2781
|
return objects;
|
|
2504
2782
|
}
|
|
2505
2783
|
hasObject(object) {
|
|
@@ -2511,23 +2789,23 @@ class ModelImpl {
|
|
|
2511
2789
|
}
|
|
2512
2790
|
getOwnObjects(objects) {
|
|
2513
2791
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2514
|
-
return objects.filter(
|
|
2792
|
+
return objects.filter(object => this.hasObject(object));
|
|
2515
2793
|
}
|
|
2516
2794
|
getObjectsByHandles(handles) {
|
|
2517
2795
|
const handleSet = new Set(handles);
|
|
2518
2796
|
const objects = [];
|
|
2519
|
-
this.scene.traverse(
|
|
2797
|
+
this.scene.traverse(object => handleSet.has(object.userData.handle) && objects.push(object));
|
|
2520
2798
|
return objects;
|
|
2521
2799
|
}
|
|
2522
2800
|
getHandlesByObjects(objects) {
|
|
2523
2801
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2524
2802
|
const handlesSet = new Set;
|
|
2525
|
-
this.getOwnObjects(objects).forEach(
|
|
2803
|
+
this.getOwnObjects(objects).forEach(object => handlesSet.add(object.userData.handle));
|
|
2526
2804
|
return Array.from(handlesSet);
|
|
2527
2805
|
}
|
|
2528
2806
|
hideObjects(objects) {
|
|
2529
2807
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2530
|
-
this.getOwnObjects(objects).forEach(
|
|
2808
|
+
this.getOwnObjects(objects).forEach(object => object.visible = false);
|
|
2531
2809
|
return this;
|
|
2532
2810
|
}
|
|
2533
2811
|
hideAllObjects() {
|
|
@@ -2536,20 +2814,20 @@ class ModelImpl {
|
|
|
2536
2814
|
isolateObjects(objects) {
|
|
2537
2815
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2538
2816
|
const visibleSet = new Set(objects);
|
|
2539
|
-
this.getOwnObjects(objects).forEach(
|
|
2540
|
-
this.scene.traverse(
|
|
2817
|
+
this.getOwnObjects(objects).forEach(object => object.traverseAncestors(parent => visibleSet.add(parent)));
|
|
2818
|
+
this.scene.traverse(object => object.visible = visibleSet.has(object));
|
|
2541
2819
|
return this;
|
|
2542
2820
|
}
|
|
2543
2821
|
showObjects(objects) {
|
|
2544
2822
|
if (!Array.isArray(objects)) objects = [ objects ];
|
|
2545
|
-
this.getOwnObjects(objects).forEach(
|
|
2823
|
+
this.getOwnObjects(objects).forEach(object => {
|
|
2546
2824
|
object.visible = true;
|
|
2547
|
-
object.traverseAncestors(
|
|
2548
|
-
})
|
|
2825
|
+
object.traverseAncestors(parent => parent.visible = true);
|
|
2826
|
+
});
|
|
2549
2827
|
return this;
|
|
2550
2828
|
}
|
|
2551
2829
|
showAllObjects() {
|
|
2552
|
-
this.scene.traverse(
|
|
2830
|
+
this.scene.traverse(object => object.visible = true);
|
|
2553
2831
|
return this;
|
|
2554
2832
|
}
|
|
2555
2833
|
showOriginalObjects(objects) {
|
|
@@ -2561,10 +2839,10 @@ class ModelImpl {
|
|
|
2561
2839
|
explode(scale = 0, coeff = 4) {
|
|
2562
2840
|
function calcExplodeDepth(object, depth) {
|
|
2563
2841
|
let res = depth;
|
|
2564
|
-
object.children.forEach(
|
|
2842
|
+
object.children.forEach(x => {
|
|
2565
2843
|
const objectDepth = calcExplodeDepth(x, depth + 1);
|
|
2566
2844
|
if (res < objectDepth) res = objectDepth;
|
|
2567
|
-
})
|
|
2845
|
+
});
|
|
2568
2846
|
object.userData.originalPosition = object.position.clone();
|
|
2569
2847
|
object.userData.originalCenter = (new Box3).setFromObject(object).getCenter(new Vector3);
|
|
2570
2848
|
object.userData.isExplodeLocked = depth > 2 && object.children.length === 0;
|
|
@@ -2586,7 +2864,7 @@ class ModelImpl {
|
|
|
2586
2864
|
const objectOffset = objectCenter.clone().sub(parentCenter).multiplyScalar(objectScale);
|
|
2587
2865
|
object.position.add(objectOffset);
|
|
2588
2866
|
}
|
|
2589
|
-
object.children.forEach(
|
|
2867
|
+
object.children.forEach(x => explodeObject(x, depth + 1));
|
|
2590
2868
|
}
|
|
2591
2869
|
explodeObject(this.scene, 0);
|
|
2592
2870
|
this.scene.updateMatrixWorld();
|
|
@@ -2642,9 +2920,9 @@ class DynamicModelImpl extends ModelImpl {
|
|
|
2642
2920
|
}
|
|
2643
2921
|
getObjects() {
|
|
2644
2922
|
const objects = [];
|
|
2645
|
-
this.gltfLoader.originalObjects.forEach(
|
|
2923
|
+
this.gltfLoader.originalObjects.forEach(object => {
|
|
2646
2924
|
objects.push(object);
|
|
2647
|
-
})
|
|
2925
|
+
});
|
|
2648
2926
|
return objects;
|
|
2649
2927
|
}
|
|
2650
2928
|
getVisibleObjects() {
|
|
@@ -2656,16 +2934,16 @@ class DynamicModelImpl extends ModelImpl {
|
|
|
2656
2934
|
getObjectsByHandles(handles) {
|
|
2657
2935
|
const handlesSet = new Set(handles);
|
|
2658
2936
|
const objects = [];
|
|
2659
|
-
handlesSet.forEach(
|
|
2937
|
+
handlesSet.forEach(handle => {
|
|
2660
2938
|
const handle2 = `${this.modelId}_${handle}`;
|
|
2661
2939
|
const handles = this.gltfLoader.handleToObjects.get(handle2) || [];
|
|
2662
2940
|
objects.push(...Array.from(handles));
|
|
2663
|
-
})
|
|
2941
|
+
});
|
|
2664
2942
|
return objects;
|
|
2665
2943
|
}
|
|
2666
2944
|
getHandlesByObjects(objects) {
|
|
2667
2945
|
const handles = super.getHandlesByObjects(objects);
|
|
2668
|
-
return handles.map(
|
|
2946
|
+
return handles.map(x => x.split("_").pop());
|
|
2669
2947
|
}
|
|
2670
2948
|
hideObjects(objects) {
|
|
2671
2949
|
const handles = super.getHandlesByObjects(objects);
|
|
@@ -2706,13 +2984,24 @@ const GL_COMPONENT_TYPES = {
|
|
|
2706
2984
|
};
|
|
2707
2985
|
|
|
2708
2986
|
const GL_CONSTANTS = {
|
|
2987
|
+
FLOAT: 5126,
|
|
2988
|
+
FLOAT_MAT3: 35675,
|
|
2989
|
+
FLOAT_MAT4: 35676,
|
|
2990
|
+
FLOAT_VEC2: 35664,
|
|
2991
|
+
FLOAT_VEC3: 35665,
|
|
2992
|
+
FLOAT_VEC4: 35666,
|
|
2993
|
+
LINEAR: 9729,
|
|
2994
|
+
REPEAT: 10497,
|
|
2995
|
+
SAMPLER_2D: 35678,
|
|
2709
2996
|
POINTS: 0,
|
|
2710
2997
|
LINES: 1,
|
|
2711
2998
|
LINE_LOOP: 2,
|
|
2712
2999
|
LINE_STRIP: 3,
|
|
2713
3000
|
TRIANGLES: 4,
|
|
2714
3001
|
TRIANGLE_STRIP: 5,
|
|
2715
|
-
TRIANGLE_FAN: 6
|
|
3002
|
+
TRIANGLE_FAN: 6,
|
|
3003
|
+
UNSIGNED_BYTE: 5121,
|
|
3004
|
+
UNSIGNED_SHORT: 5123
|
|
2716
3005
|
};
|
|
2717
3006
|
|
|
2718
3007
|
const MAX_GAP = 128 * 1024;
|
|
@@ -2760,19 +3049,19 @@ class GltfStructure {
|
|
|
2760
3049
|
return this.json;
|
|
2761
3050
|
}
|
|
2762
3051
|
scheduleRequest(request) {
|
|
2763
|
-
return new Promise((
|
|
3052
|
+
return new Promise((resolve, reject) => {
|
|
2764
3053
|
this.pendingRequests.push({
|
|
2765
3054
|
...request,
|
|
2766
3055
|
_resolve: resolve,
|
|
2767
3056
|
_reject: reject
|
|
2768
3057
|
});
|
|
2769
|
-
})
|
|
3058
|
+
});
|
|
2770
3059
|
}
|
|
2771
3060
|
async flushBufferRequests() {
|
|
2772
3061
|
if (!this.pendingRequests || this.pendingRequests.length === 0) return;
|
|
2773
3062
|
const requests = [ ...this.pendingRequests ];
|
|
2774
3063
|
this.pendingRequests = [];
|
|
2775
|
-
requests.sort((
|
|
3064
|
+
requests.sort((a, b) => a.offset - b.offset);
|
|
2776
3065
|
const mergedRanges = [];
|
|
2777
3066
|
let current = {
|
|
2778
3067
|
start: requests[0].offset,
|
|
@@ -2832,7 +3121,7 @@ class GltfStructure {
|
|
|
2832
3121
|
});
|
|
2833
3122
|
}
|
|
2834
3123
|
}
|
|
2835
|
-
const promises = finalRanges.map(
|
|
3124
|
+
const promises = finalRanges.map(async (range, index) => {
|
|
2836
3125
|
await this.loader.waitForChunkSlot();
|
|
2837
3126
|
try {
|
|
2838
3127
|
const length = range.end - range.start;
|
|
@@ -2860,7 +3149,7 @@ class GltfStructure {
|
|
|
2860
3149
|
} finally {
|
|
2861
3150
|
this.loader.releaseChunkSlot();
|
|
2862
3151
|
}
|
|
2863
|
-
})
|
|
3152
|
+
});
|
|
2864
3153
|
await Promise.all(promises);
|
|
2865
3154
|
this.pendingRequests = [];
|
|
2866
3155
|
}
|
|
@@ -3017,7 +3306,7 @@ class GltfStructure {
|
|
|
3017
3306
|
};
|
|
3018
3307
|
const texturePromises = [];
|
|
3019
3308
|
for (let i = 0; i < this.json.textures.length; i++) {
|
|
3020
|
-
texturePromises.push(loadTexture(this.json.textures[i].source).then(
|
|
3309
|
+
texturePromises.push(loadTexture(this.json.textures[i].source).then(texture => this.textureCache.set(i, texture)));
|
|
3021
3310
|
}
|
|
3022
3311
|
await Promise.all(texturePromises);
|
|
3023
3312
|
}
|
|
@@ -3096,9 +3385,9 @@ class GltfStructure {
|
|
|
3096
3385
|
return null;
|
|
3097
3386
|
}
|
|
3098
3387
|
disposeMaterials() {
|
|
3099
|
-
this.textureCache.forEach(
|
|
3388
|
+
this.textureCache.forEach(texture => texture.dispose());
|
|
3100
3389
|
this.textureCache.clear();
|
|
3101
|
-
this.materials.forEach(
|
|
3390
|
+
this.materials.forEach(material => {
|
|
3102
3391
|
if (material.map) material.map.dispose();
|
|
3103
3392
|
if (material.lightMap) material.lightMap.dispose();
|
|
3104
3393
|
if (material.bumpMap) material.bumpMap.dispose();
|
|
@@ -3110,9 +3399,9 @@ class GltfStructure {
|
|
|
3110
3399
|
if (material.roughnessMap) material.roughnessMap.dispose();
|
|
3111
3400
|
if (material.emissiveMap) material.emissiveMap.dispose();
|
|
3112
3401
|
material.dispose();
|
|
3113
|
-
})
|
|
3402
|
+
});
|
|
3114
3403
|
this.materials.clear();
|
|
3115
|
-
this.materialCache.forEach(
|
|
3404
|
+
this.materialCache.forEach(materialCache => {
|
|
3116
3405
|
if (materialCache.mesh) {
|
|
3117
3406
|
if (materialCache.mesh.map) materialCache.mesh.map.dispose();
|
|
3118
3407
|
if (materialCache.mesh.lightMap) materialCache.mesh.lightMap.dispose();
|
|
@@ -3134,7 +3423,7 @@ class GltfStructure {
|
|
|
3134
3423
|
if (materialCache.lines.map) materialCache.lines.map.dispose();
|
|
3135
3424
|
materialCache.lines.dispose();
|
|
3136
3425
|
}
|
|
3137
|
-
})
|
|
3426
|
+
});
|
|
3138
3427
|
this.materialCache.clear();
|
|
3139
3428
|
}
|
|
3140
3429
|
estimateNodeSize(meshIndex) {
|
|
@@ -3259,29 +3548,29 @@ class DynamicGltfLoader {
|
|
|
3259
3548
|
setMemoryLimit(bytesLimit) {}
|
|
3260
3549
|
estimateGeometrySize(nodeGroup) {
|
|
3261
3550
|
let totalSize = 0;
|
|
3262
|
-
nodeGroup.traverse(
|
|
3551
|
+
nodeGroup.traverse(child => {
|
|
3263
3552
|
if (child.geometry) {
|
|
3264
3553
|
if (this.abortController.signal.aborted) {
|
|
3265
3554
|
throw new DOMException("Loading aborted", "AbortError");
|
|
3266
3555
|
}
|
|
3267
3556
|
const geometry = child.geometry;
|
|
3268
3557
|
if (geometry.attributes) {
|
|
3269
|
-
Object.values(geometry.attributes).forEach(
|
|
3558
|
+
Object.values(geometry.attributes).forEach(attribute => {
|
|
3270
3559
|
if (attribute && attribute.array) {
|
|
3271
3560
|
totalSize += attribute.array.byteLength;
|
|
3272
3561
|
}
|
|
3273
|
-
})
|
|
3562
|
+
});
|
|
3274
3563
|
}
|
|
3275
3564
|
if (geometry.index && geometry.index.array) {
|
|
3276
3565
|
totalSize += geometry.index.array.byteLength;
|
|
3277
3566
|
}
|
|
3278
3567
|
}
|
|
3279
|
-
})
|
|
3568
|
+
});
|
|
3280
3569
|
return totalSize;
|
|
3281
3570
|
}
|
|
3282
3571
|
recalculateScene() {
|
|
3283
3572
|
const geometries = [];
|
|
3284
|
-
this.scene.traverse(
|
|
3573
|
+
this.scene.traverse(object => {
|
|
3285
3574
|
if (this.abortController.signal.aborted) {
|
|
3286
3575
|
throw new DOMException("Loading aborted", "AbortError");
|
|
3287
3576
|
}
|
|
@@ -3294,11 +3583,11 @@ class DynamicGltfLoader {
|
|
|
3294
3583
|
distance: object.position.distanceTo(this.camera.position)
|
|
3295
3584
|
});
|
|
3296
3585
|
}
|
|
3297
|
-
})
|
|
3586
|
+
});
|
|
3298
3587
|
if (this.abortController.signal.aborted) {
|
|
3299
3588
|
throw new DOMException("Loading aborted", "AbortError");
|
|
3300
3589
|
}
|
|
3301
|
-
geometries.sort((
|
|
3590
|
+
geometries.sort((a, b) => b.distance - a.distance);
|
|
3302
3591
|
let currentMemoryUsage = 0;
|
|
3303
3592
|
for (const geo of geometries) {
|
|
3304
3593
|
currentMemoryUsage += geo.size;
|
|
@@ -3410,9 +3699,9 @@ class DynamicGltfLoader {
|
|
|
3410
3699
|
node.loading = false;
|
|
3411
3700
|
return;
|
|
3412
3701
|
}
|
|
3413
|
-
bufferRequests.sort((
|
|
3702
|
+
bufferRequests.sort((a, b) => a.offset - b.offset);
|
|
3414
3703
|
const minOffset = bufferRequests[0].offset;
|
|
3415
|
-
const maxOffset = Math.max(...bufferRequests.map(
|
|
3704
|
+
const maxOffset = Math.max(...bufferRequests.map(r => r.offset + r.length));
|
|
3416
3705
|
const totalLength = maxOffset - minOffset;
|
|
3417
3706
|
const {buffer: buffer, relOffset: baseRelOffset} = await node.structure.scheduleRequest({
|
|
3418
3707
|
offset: minOffset,
|
|
@@ -3428,25 +3717,25 @@ class DynamicGltfLoader {
|
|
|
3428
3717
|
const geometry = new BufferGeometry;
|
|
3429
3718
|
const reqs = primitiveReqMap.get(primIdx);
|
|
3430
3719
|
if (primitive.attributes.POSITION !== undefined) {
|
|
3431
|
-
const req = reqs.find(
|
|
3720
|
+
const req = reqs.find(r => r.type === "position" && r.accessorIndex === primitive.attributes.POSITION);
|
|
3432
3721
|
const accessor = node.structure.json.accessors[primitive.attributes.POSITION];
|
|
3433
3722
|
const components = node.structure.getNumComponents(accessor.type);
|
|
3434
3723
|
geometry.setAttribute("position", new BufferAttribute(req.data, components));
|
|
3435
3724
|
}
|
|
3436
3725
|
if (primitive.attributes.NORMAL !== undefined) {
|
|
3437
|
-
const req = reqs.find(
|
|
3726
|
+
const req = reqs.find(r => r.type === "normal" && r.accessorIndex === primitive.attributes.NORMAL);
|
|
3438
3727
|
const accessor = node.structure.json.accessors[primitive.attributes.NORMAL];
|
|
3439
3728
|
const components = node.structure.getNumComponents(accessor.type);
|
|
3440
3729
|
geometry.setAttribute("normal", new BufferAttribute(req.data, components));
|
|
3441
3730
|
}
|
|
3442
3731
|
if (primitive.attributes.TEXCOORD_0 !== undefined) {
|
|
3443
|
-
const req = reqs.find(
|
|
3732
|
+
const req = reqs.find(r => r.type === "uv" && r.accessorIndex === primitive.attributes.TEXCOORD_0);
|
|
3444
3733
|
const accessor = node.structure.json.accessors[primitive.attributes.TEXCOORD_0];
|
|
3445
3734
|
const components = node.structure.getNumComponents(accessor.type);
|
|
3446
3735
|
geometry.setAttribute("uv", new BufferAttribute(req.data, components));
|
|
3447
3736
|
}
|
|
3448
3737
|
if (primitive.indices !== undefined) {
|
|
3449
|
-
const req = reqs.find(
|
|
3738
|
+
const req = reqs.find(r => r.type === "index" && r.accessorIndex === primitive.indices);
|
|
3450
3739
|
geometry.setIndex(new BufferAttribute(req.data, 1));
|
|
3451
3740
|
}
|
|
3452
3741
|
let material;
|
|
@@ -3545,14 +3834,14 @@ class DynamicGltfLoader {
|
|
|
3545
3834
|
} else {
|
|
3546
3835
|
this.scene.remove(node.object);
|
|
3547
3836
|
}
|
|
3548
|
-
node.object.traverse(
|
|
3837
|
+
node.object.traverse(child => {
|
|
3549
3838
|
if (child.geometry) {
|
|
3550
3839
|
const geometrySize = this.geometryCache.get(child.geometry.uuid) || 0;
|
|
3551
3840
|
this.currentMemoryUsage -= geometrySize;
|
|
3552
3841
|
this.geometryCache.delete(child.geometry.uuid);
|
|
3553
3842
|
child.geometry.dispose();
|
|
3554
3843
|
}
|
|
3555
|
-
})
|
|
3844
|
+
});
|
|
3556
3845
|
node.object = null;
|
|
3557
3846
|
node.loaded = false;
|
|
3558
3847
|
this.updateMemoryIndicator();
|
|
@@ -3561,7 +3850,7 @@ class DynamicGltfLoader {
|
|
|
3561
3850
|
}
|
|
3562
3851
|
checkDistances() {
|
|
3563
3852
|
const cameraPosition = this.camera.position;
|
|
3564
|
-
this.nodes.forEach((
|
|
3853
|
+
this.nodes.forEach((node, nodeId) => {
|
|
3565
3854
|
const distance = cameraPosition.distanceTo(node.position);
|
|
3566
3855
|
if (node.loaded) {
|
|
3567
3856
|
if (distance > this.unloadDistance) {
|
|
@@ -3572,7 +3861,7 @@ class DynamicGltfLoader {
|
|
|
3572
3861
|
this.loadNode(nodeId);
|
|
3573
3862
|
}
|
|
3574
3863
|
}
|
|
3575
|
-
})
|
|
3864
|
+
});
|
|
3576
3865
|
}
|
|
3577
3866
|
async loadStructure(structures) {
|
|
3578
3867
|
this.clear();
|
|
@@ -3615,7 +3904,7 @@ class DynamicGltfLoader {
|
|
|
3615
3904
|
}
|
|
3616
3905
|
}
|
|
3617
3906
|
const ignoreEdges = estimatedSize * 2 > this.memoryLimit;
|
|
3618
|
-
this.nodesToLoad.sort((
|
|
3907
|
+
this.nodesToLoad.sort((a, b) => {
|
|
3619
3908
|
const nodeA = this.nodes.get(a);
|
|
3620
3909
|
const nodeB = this.nodes.get(b);
|
|
3621
3910
|
if (!nodeA?.geometryExtents || !nodeB?.geometryExtents) {
|
|
@@ -3626,16 +3915,16 @@ class DynamicGltfLoader {
|
|
|
3626
3915
|
const volumeA = sizeA.x * sizeA.y * sizeA.z;
|
|
3627
3916
|
const volumeB = sizeB.x * sizeB.y * sizeB.z;
|
|
3628
3917
|
return volumeB - volumeA;
|
|
3629
|
-
})
|
|
3918
|
+
});
|
|
3630
3919
|
if (!ignoreEdges && this.visibleEdges) {
|
|
3631
3920
|
this.nodesToLoad.push(...this.edgeNodes);
|
|
3632
3921
|
}
|
|
3633
3922
|
this.dispatchEvent("databasechunk", {
|
|
3634
3923
|
totalNodes: this.nodesToLoad.length,
|
|
3635
|
-
structures: this.structures.map(
|
|
3924
|
+
structures: this.structures.map(s => ({
|
|
3636
3925
|
id: s.id,
|
|
3637
|
-
nodeCount: this.nodesToLoad.filter(
|
|
3638
|
-
}))
|
|
3926
|
+
nodeCount: this.nodesToLoad.filter(nodeId => nodeId.startsWith(s.id)).length
|
|
3927
|
+
}))
|
|
3639
3928
|
});
|
|
3640
3929
|
}
|
|
3641
3930
|
async processNodeHierarchy(structure, nodeId, parentGroup) {
|
|
@@ -3755,9 +4044,9 @@ class DynamicGltfLoader {
|
|
|
3755
4044
|
this.dispatchEvent("update");
|
|
3756
4045
|
this.lastUpdateTime = currentTime;
|
|
3757
4046
|
}
|
|
3758
|
-
await new Promise(
|
|
4047
|
+
await new Promise(resolve => {
|
|
3759
4048
|
setTimeout(resolve, 0);
|
|
3760
|
-
})
|
|
4049
|
+
});
|
|
3761
4050
|
}
|
|
3762
4051
|
};
|
|
3763
4052
|
try {
|
|
@@ -3802,12 +4091,12 @@ class DynamicGltfLoader {
|
|
|
3802
4091
|
console.timeEnd("optimize scene");
|
|
3803
4092
|
}
|
|
3804
4093
|
cleanupPartialLoad() {
|
|
3805
|
-
this.nodesToLoad.forEach(
|
|
4094
|
+
this.nodesToLoad.forEach(nodeId => {
|
|
3806
4095
|
const node = this.nodes.get(nodeId);
|
|
3807
4096
|
if (node && node.loading) {
|
|
3808
4097
|
this.unloadNode(nodeId);
|
|
3809
4098
|
}
|
|
3810
|
-
})
|
|
4099
|
+
});
|
|
3811
4100
|
}
|
|
3812
4101
|
createDefaultMaterial(primitiveMode = undefined) {
|
|
3813
4102
|
if (primitiveMode === GL_CONSTANTS.POINTS) {
|
|
@@ -3891,7 +4180,7 @@ class DynamicGltfLoader {
|
|
|
3891
4180
|
this.nodesToLoad = [];
|
|
3892
4181
|
}
|
|
3893
4182
|
removeOptimization() {
|
|
3894
|
-
this.originalObjects.forEach(
|
|
4183
|
+
this.originalObjects.forEach(obj => obj.visible = true);
|
|
3895
4184
|
const disposeMerged = obj => {
|
|
3896
4185
|
if (obj.parent) {
|
|
3897
4186
|
obj.parent.remove(obj);
|
|
@@ -3919,13 +4208,13 @@ class DynamicGltfLoader {
|
|
|
3919
4208
|
}
|
|
3920
4209
|
clear() {
|
|
3921
4210
|
this.chunkQueue = [];
|
|
3922
|
-
this.structures.forEach(
|
|
4211
|
+
this.structures.forEach(structure => {
|
|
3923
4212
|
if (structure) {
|
|
3924
4213
|
structure.clear();
|
|
3925
4214
|
}
|
|
3926
|
-
})
|
|
4215
|
+
});
|
|
3927
4216
|
this.structures = [];
|
|
3928
|
-
this.nodes.forEach(
|
|
4217
|
+
this.nodes.forEach(node => {
|
|
3929
4218
|
if (node.object) {
|
|
3930
4219
|
if (node.object.parent) {
|
|
3931
4220
|
node.object.parent.remove(node.object);
|
|
@@ -3935,72 +4224,72 @@ class DynamicGltfLoader {
|
|
|
3935
4224
|
}
|
|
3936
4225
|
if (node.object.material) {
|
|
3937
4226
|
if (Array.isArray(node.object.material)) {
|
|
3938
|
-
node.object.material.forEach(
|
|
4227
|
+
node.object.material.forEach(material => material.dispose());
|
|
3939
4228
|
} else {
|
|
3940
4229
|
node.object.material.dispose();
|
|
3941
4230
|
}
|
|
3942
4231
|
}
|
|
3943
4232
|
}
|
|
3944
|
-
})
|
|
4233
|
+
});
|
|
3945
4234
|
this.nodes.clear();
|
|
3946
|
-
this.loadedMeshes.forEach(
|
|
4235
|
+
this.loadedMeshes.forEach(mesh => {
|
|
3947
4236
|
if (mesh.geometry) mesh.geometry.dispose();
|
|
3948
4237
|
if (mesh.material) {
|
|
3949
4238
|
if (Array.isArray(mesh.material)) {
|
|
3950
|
-
mesh.material.forEach(
|
|
4239
|
+
mesh.material.forEach(material => material.dispose());
|
|
3951
4240
|
} else {
|
|
3952
4241
|
mesh.material.dispose();
|
|
3953
4242
|
}
|
|
3954
4243
|
}
|
|
3955
|
-
})
|
|
4244
|
+
});
|
|
3956
4245
|
this.loadedMeshes.clear();
|
|
3957
|
-
this.structureRoots.forEach(
|
|
4246
|
+
this.structureRoots.forEach(rootGroup => {
|
|
3958
4247
|
if (rootGroup) {
|
|
3959
|
-
rootGroup.traverse(
|
|
4248
|
+
rootGroup.traverse(child => {
|
|
3960
4249
|
if (child.geometry) child.geometry.dispose();
|
|
3961
4250
|
if (child.material) {
|
|
3962
4251
|
if (Array.isArray(child.material)) {
|
|
3963
|
-
child.material.forEach(
|
|
4252
|
+
child.material.forEach(material => material.dispose());
|
|
3964
4253
|
} else {
|
|
3965
4254
|
child.material.dispose();
|
|
3966
4255
|
}
|
|
3967
4256
|
}
|
|
3968
|
-
})
|
|
4257
|
+
});
|
|
3969
4258
|
if (rootGroup.parent) {
|
|
3970
4259
|
rootGroup.parent.remove(rootGroup);
|
|
3971
4260
|
}
|
|
3972
4261
|
}
|
|
3973
|
-
})
|
|
4262
|
+
});
|
|
3974
4263
|
this.structureRoots.clear();
|
|
3975
|
-
this.mergedMesh.forEach(
|
|
4264
|
+
this.mergedMesh.forEach(mesh => {
|
|
3976
4265
|
if (mesh.geometry) mesh.geometry.dispose();
|
|
3977
4266
|
if (mesh.material) {
|
|
3978
4267
|
if (Array.isArray(mesh.material)) {
|
|
3979
|
-
mesh.material.forEach(
|
|
4268
|
+
mesh.material.forEach(material => material.dispose());
|
|
3980
4269
|
} else {
|
|
3981
4270
|
mesh.material.dispose();
|
|
3982
4271
|
}
|
|
3983
4272
|
}
|
|
3984
4273
|
if (mesh.parent) mesh.parent.remove(mesh);
|
|
3985
|
-
})
|
|
4274
|
+
});
|
|
3986
4275
|
this.mergedMesh.clear();
|
|
3987
|
-
this.mergedLines.forEach(
|
|
4276
|
+
this.mergedLines.forEach(line => {
|
|
3988
4277
|
if (line.geometry) line.geometry.dispose();
|
|
3989
4278
|
if (line.material) line.material.dispose();
|
|
3990
4279
|
if (line.parent) line.parent.remove(line);
|
|
3991
|
-
})
|
|
4280
|
+
});
|
|
3992
4281
|
this.mergedLines.clear();
|
|
3993
|
-
this.mergedLineSegments.forEach(
|
|
4282
|
+
this.mergedLineSegments.forEach(lineSegment => {
|
|
3994
4283
|
if (lineSegment.geometry) lineSegment.geometry.dispose();
|
|
3995
4284
|
if (lineSegment.material) lineSegment.material.dispose();
|
|
3996
4285
|
if (lineSegment.parent) lineSegment.parent.remove(lineSegment);
|
|
3997
|
-
})
|
|
4286
|
+
});
|
|
3998
4287
|
this.mergedLineSegments.clear();
|
|
3999
|
-
this.mergedPoints.forEach(
|
|
4288
|
+
this.mergedPoints.forEach(points => {
|
|
4000
4289
|
if (points.geometry) points.geometry.dispose();
|
|
4001
4290
|
if (points.material) points.material.dispose();
|
|
4002
4291
|
if (points.parent) points.parent.remove(points);
|
|
4003
|
-
})
|
|
4292
|
+
});
|
|
4004
4293
|
this.mergedPoints.clear();
|
|
4005
4294
|
this.geometryCache.clear();
|
|
4006
4295
|
this.materialCache.clear();
|
|
@@ -4042,12 +4331,12 @@ class DynamicGltfLoader {
|
|
|
4042
4331
|
}
|
|
4043
4332
|
removeEventListener(event, handler) {
|
|
4044
4333
|
if (this.eventHandlers[event]) {
|
|
4045
|
-
this.eventHandlers[event] = this.eventHandlers[event].filter(
|
|
4334
|
+
this.eventHandlers[event] = this.eventHandlers[event].filter(h => h !== handler);
|
|
4046
4335
|
}
|
|
4047
4336
|
}
|
|
4048
4337
|
dispatchEvent(event, data) {
|
|
4049
4338
|
if (this.eventHandlers[event]) {
|
|
4050
|
-
this.eventHandlers[event].forEach(
|
|
4339
|
+
this.eventHandlers[event].forEach(handler => handler(data));
|
|
4051
4340
|
}
|
|
4052
4341
|
}
|
|
4053
4342
|
registerObjectWithHandle(object, handle) {
|
|
@@ -4066,9 +4355,9 @@ class DynamicGltfLoader {
|
|
|
4066
4355
|
getHandlesByObjects(objects) {
|
|
4067
4356
|
if (!objects.length) return [];
|
|
4068
4357
|
const handles = new Set;
|
|
4069
|
-
objects.forEach(
|
|
4358
|
+
objects.forEach(obj => {
|
|
4070
4359
|
if (this.originalObjects.has(obj)) handles.add(obj.userData.handle);
|
|
4071
|
-
})
|
|
4360
|
+
});
|
|
4072
4361
|
return Array.from(handles);
|
|
4073
4362
|
}
|
|
4074
4363
|
getMaterialId(material, index) {
|
|
@@ -4124,7 +4413,7 @@ class DynamicGltfLoader {
|
|
|
4124
4413
|
this.originalObjects.clear();
|
|
4125
4414
|
this.originalObjectsToSelection.clear();
|
|
4126
4415
|
const structureGroups = new Map;
|
|
4127
|
-
this.scene.traverse(
|
|
4416
|
+
this.scene.traverse(object => {
|
|
4128
4417
|
if (object.userData.structureId) {
|
|
4129
4418
|
const structureId = object.userData.structureId;
|
|
4130
4419
|
if (!structureGroups.has(structureId)) {
|
|
@@ -4151,7 +4440,7 @@ class DynamicGltfLoader {
|
|
|
4151
4440
|
this.addToMaterialGroup(object, group.mapPoints, group.points);
|
|
4152
4441
|
}
|
|
4153
4442
|
}
|
|
4154
|
-
})
|
|
4443
|
+
});
|
|
4155
4444
|
for (const group of structureGroups.values()) {
|
|
4156
4445
|
group.mapMeshes.clear();
|
|
4157
4446
|
group.mapLines.clear();
|
|
@@ -4162,12 +4451,12 @@ class DynamicGltfLoader {
|
|
|
4162
4451
|
this.mergeLineSegmentGroups(group.lineSegments, group.rootGroup);
|
|
4163
4452
|
this.mergePointsGroups(group.points, group.rootGroup);
|
|
4164
4453
|
}
|
|
4165
|
-
this.originalObjects.forEach(
|
|
4454
|
+
this.originalObjects.forEach(obj => {
|
|
4166
4455
|
obj.visible = false;
|
|
4167
4456
|
if (!(obj instanceof Points) && !obj.userData.isEdge) {
|
|
4168
4457
|
this.originalObjectsToSelection.add(obj);
|
|
4169
4458
|
}
|
|
4170
|
-
})
|
|
4459
|
+
});
|
|
4171
4460
|
this.dispatchEvent("update");
|
|
4172
4461
|
}
|
|
4173
4462
|
mergeMeshGroups(materialGroups, rootGroup) {
|
|
@@ -4195,11 +4484,11 @@ class DynamicGltfLoader {
|
|
|
4195
4484
|
this.mergedMesh.add(mergedMesh);
|
|
4196
4485
|
this.optimizedOriginalMap.set(mergedMesh, optimizedObjects);
|
|
4197
4486
|
mergedObjects.push(mergedMesh);
|
|
4198
|
-
geometries.forEach(
|
|
4487
|
+
geometries.forEach(geometry => {
|
|
4199
4488
|
geometry.dispose();
|
|
4200
|
-
})
|
|
4489
|
+
});
|
|
4201
4490
|
}
|
|
4202
|
-
handles.forEach(
|
|
4491
|
+
handles.forEach(handle => {
|
|
4203
4492
|
if (this.handleToOptimizedObjects.has(handle)) {
|
|
4204
4493
|
const existingObjects = this.handleToOptimizedObjects.get(handle);
|
|
4205
4494
|
existingObjects.push(...mergedObjects);
|
|
@@ -4207,12 +4496,12 @@ class DynamicGltfLoader {
|
|
|
4207
4496
|
} else {
|
|
4208
4497
|
this.handleToOptimizedObjects.set(handle, mergedObjects);
|
|
4209
4498
|
}
|
|
4210
|
-
})
|
|
4499
|
+
});
|
|
4211
4500
|
} catch (error) {
|
|
4212
4501
|
console.error("Failed to merge meshes for material:", error);
|
|
4213
|
-
group.objects.forEach(
|
|
4502
|
+
group.objects.forEach(mesh => {
|
|
4214
4503
|
mesh.visible = true;
|
|
4215
|
-
})
|
|
4504
|
+
});
|
|
4216
4505
|
}
|
|
4217
4506
|
}
|
|
4218
4507
|
}
|
|
@@ -4221,15 +4510,15 @@ class DynamicGltfLoader {
|
|
|
4221
4510
|
if (group.objects.length === 0) continue;
|
|
4222
4511
|
const handles = new Set;
|
|
4223
4512
|
let totalVertices = 0;
|
|
4224
|
-
group.objects.map(
|
|
4513
|
+
group.objects.map(line => {
|
|
4225
4514
|
handles.add(line.userData.handle);
|
|
4226
4515
|
totalVertices += line.geometry.attributes.position.count;
|
|
4227
|
-
})
|
|
4516
|
+
});
|
|
4228
4517
|
const positions = new Float32Array(totalVertices * 3);
|
|
4229
4518
|
let posOffset = 0;
|
|
4230
4519
|
const indices = [];
|
|
4231
4520
|
let vertexOffset = 0;
|
|
4232
|
-
group.objects.forEach(
|
|
4521
|
+
group.objects.forEach(line => {
|
|
4233
4522
|
const geometry = line.geometry;
|
|
4234
4523
|
const positionAttr = geometry.attributes.position;
|
|
4235
4524
|
const vertexCount = positionAttr.count;
|
|
@@ -4247,7 +4536,7 @@ class DynamicGltfLoader {
|
|
|
4247
4536
|
indices.push(vertexOffset + i, vertexOffset + i + 1);
|
|
4248
4537
|
}
|
|
4249
4538
|
vertexOffset += vertexCount;
|
|
4250
|
-
})
|
|
4539
|
+
});
|
|
4251
4540
|
const geometry = new BufferGeometry;
|
|
4252
4541
|
geometry.setAttribute("position", new BufferAttribute(positions, 3));
|
|
4253
4542
|
geometry.setIndex(indices);
|
|
@@ -4261,7 +4550,7 @@ class DynamicGltfLoader {
|
|
|
4261
4550
|
rootGroup.add(mergedLine);
|
|
4262
4551
|
this.mergedLines.add(mergedLine);
|
|
4263
4552
|
this.optimizedOriginalMap.set(mergedLine, group.objects);
|
|
4264
|
-
handles.forEach(
|
|
4553
|
+
handles.forEach(handle => {
|
|
4265
4554
|
if (this.handleToOptimizedObjects.has(handle)) {
|
|
4266
4555
|
const existingObjects = this.handleToOptimizedObjects.get(handle);
|
|
4267
4556
|
existingObjects.push(...mergedObjects);
|
|
@@ -4269,7 +4558,7 @@ class DynamicGltfLoader {
|
|
|
4269
4558
|
} else {
|
|
4270
4559
|
this.handleToOptimizedObjects.set(handle, mergedObjects);
|
|
4271
4560
|
}
|
|
4272
|
-
})
|
|
4561
|
+
});
|
|
4273
4562
|
}
|
|
4274
4563
|
}
|
|
4275
4564
|
mergeLineSegmentGroups(materialGroups, rootGroup) {
|
|
@@ -4297,11 +4586,11 @@ class DynamicGltfLoader {
|
|
|
4297
4586
|
this.mergedLineSegments.add(mergedLine);
|
|
4298
4587
|
this.optimizedOriginalMap.set(mergedLine, optimizedObjects);
|
|
4299
4588
|
mergedObjects.push(mergedLine);
|
|
4300
|
-
geometries.forEach(
|
|
4589
|
+
geometries.forEach(geometry => {
|
|
4301
4590
|
geometry.dispose();
|
|
4302
|
-
})
|
|
4591
|
+
});
|
|
4303
4592
|
}
|
|
4304
|
-
handles.forEach(
|
|
4593
|
+
handles.forEach(handle => {
|
|
4305
4594
|
if (this.handleToOptimizedObjects.has(handle)) {
|
|
4306
4595
|
const existingObjects = this.handleToOptimizedObjects.get(handle);
|
|
4307
4596
|
existingObjects.push(...mergedObjects);
|
|
@@ -4309,12 +4598,12 @@ class DynamicGltfLoader {
|
|
|
4309
4598
|
} else {
|
|
4310
4599
|
this.handleToOptimizedObjects.set(handle, mergedObjects);
|
|
4311
4600
|
}
|
|
4312
|
-
})
|
|
4601
|
+
});
|
|
4313
4602
|
} catch (error) {
|
|
4314
4603
|
console.warn("Failed to merge line segments for material:", error);
|
|
4315
|
-
group.objects.forEach(
|
|
4604
|
+
group.objects.forEach(line => {
|
|
4316
4605
|
line.visible = true;
|
|
4317
|
-
})
|
|
4606
|
+
});
|
|
4318
4607
|
}
|
|
4319
4608
|
}
|
|
4320
4609
|
}
|
|
@@ -4343,11 +4632,11 @@ class DynamicGltfLoader {
|
|
|
4343
4632
|
this.mergedPoints.add(mergedPoints);
|
|
4344
4633
|
this.optimizedOriginalMap.set(mergedPoints, optimizedObjects);
|
|
4345
4634
|
mergedObjects.push(mergedPoints);
|
|
4346
|
-
geometries.forEach(
|
|
4635
|
+
geometries.forEach(geometry => {
|
|
4347
4636
|
geometry.dispose();
|
|
4348
|
-
})
|
|
4637
|
+
});
|
|
4349
4638
|
}
|
|
4350
|
-
handles.forEach(
|
|
4639
|
+
handles.forEach(handle => {
|
|
4351
4640
|
if (this.handleToOptimizedObjects.has(handle)) {
|
|
4352
4641
|
const existingObjects = this.handleToOptimizedObjects.get(handle);
|
|
4353
4642
|
existingObjects.push(...mergedObjects);
|
|
@@ -4355,22 +4644,22 @@ class DynamicGltfLoader {
|
|
|
4355
4644
|
} else {
|
|
4356
4645
|
this.handleToOptimizedObjects.set(handle, mergedObjects);
|
|
4357
4646
|
}
|
|
4358
|
-
})
|
|
4647
|
+
});
|
|
4359
4648
|
} catch (error) {
|
|
4360
4649
|
console.warn("Failed to merge points for material:", error);
|
|
4361
|
-
group.objects.forEach(
|
|
4650
|
+
group.objects.forEach(points => {
|
|
4362
4651
|
points.visible = true;
|
|
4363
|
-
})
|
|
4652
|
+
});
|
|
4364
4653
|
}
|
|
4365
4654
|
}
|
|
4366
4655
|
}
|
|
4367
4656
|
mergeInSingleSegment(structureId, rootGroup) {
|
|
4368
|
-
const lineSegmentsArray = [ ...this.mergedLineSegments, ...this.mergedLines ].filter(
|
|
4657
|
+
const lineSegmentsArray = [ ...this.mergedLineSegments, ...this.mergedLines ].filter(obj => obj.userData.structureId === structureId);
|
|
4369
4658
|
if (lineSegmentsArray.length === 0) return;
|
|
4370
4659
|
try {
|
|
4371
4660
|
const geometriesWithIndex = [];
|
|
4372
|
-
const hasNormals = lineSegmentsArray.some(
|
|
4373
|
-
lineSegmentsArray.forEach(
|
|
4661
|
+
const hasNormals = lineSegmentsArray.some(segment => segment.geometry.attributes.normal !== undefined);
|
|
4662
|
+
lineSegmentsArray.forEach(segment => {
|
|
4374
4663
|
const clonedGeometry = segment.geometry.clone();
|
|
4375
4664
|
segment.updateWorldMatrix(true, false);
|
|
4376
4665
|
clonedGeometry.applyMatrix4(segment.matrixWorld);
|
|
@@ -4396,7 +4685,7 @@ class DynamicGltfLoader {
|
|
|
4396
4685
|
clonedGeometry.setIndex(indices);
|
|
4397
4686
|
}
|
|
4398
4687
|
geometriesWithIndex.push(clonedGeometry);
|
|
4399
|
-
})
|
|
4688
|
+
});
|
|
4400
4689
|
const finalGeometry = mergeGeometries(geometriesWithIndex, false);
|
|
4401
4690
|
const material = new LineBasicMaterial({
|
|
4402
4691
|
vertexColors: true
|
|
@@ -4408,33 +4697,33 @@ class DynamicGltfLoader {
|
|
|
4408
4697
|
mergedLine.userData.structureId = structureId;
|
|
4409
4698
|
rootGroup.add(mergedLine);
|
|
4410
4699
|
this.mergedLineSegments.add(mergedLine);
|
|
4411
|
-
lineSegmentsArray.forEach(
|
|
4700
|
+
lineSegmentsArray.forEach(obj => {
|
|
4412
4701
|
if (obj.parent) {
|
|
4413
4702
|
obj.parent.remove(obj);
|
|
4414
4703
|
}
|
|
4415
4704
|
obj.geometry.dispose();
|
|
4416
|
-
})
|
|
4705
|
+
});
|
|
4417
4706
|
} catch (error) {
|
|
4418
4707
|
console.error("Failed to merge geometries:", error);
|
|
4419
|
-
lineSegmentsArray.forEach(
|
|
4708
|
+
lineSegmentsArray.forEach(obj => {
|
|
4420
4709
|
obj.visible = true;
|
|
4421
4710
|
rootGroup.add(obj);
|
|
4422
|
-
})
|
|
4711
|
+
});
|
|
4423
4712
|
}
|
|
4424
4713
|
}
|
|
4425
4714
|
showOriginalObjects(objects) {
|
|
4426
|
-
objects.forEach(
|
|
4715
|
+
objects.forEach(obj => {
|
|
4427
4716
|
if (this.originalObjects.has(obj)) {
|
|
4428
4717
|
obj.visible = true;
|
|
4429
4718
|
}
|
|
4430
|
-
})
|
|
4719
|
+
});
|
|
4431
4720
|
}
|
|
4432
4721
|
hideOriginalObjects(objects) {
|
|
4433
|
-
objects.forEach(
|
|
4722
|
+
objects.forEach(obj => {
|
|
4434
4723
|
if (this.originalObjects.has(obj)) {
|
|
4435
4724
|
obj.visible = false;
|
|
4436
4725
|
}
|
|
4437
|
-
})
|
|
4726
|
+
});
|
|
4438
4727
|
}
|
|
4439
4728
|
createVAO(geometry) {
|
|
4440
4729
|
if (!this.useVAO) {
|
|
@@ -4489,15 +4778,15 @@ class DynamicGltfLoader {
|
|
|
4489
4778
|
this.syncHiddenObjects();
|
|
4490
4779
|
}
|
|
4491
4780
|
hideObjects(handles) {
|
|
4492
|
-
handles.forEach(
|
|
4781
|
+
handles.forEach(handle => {
|
|
4493
4782
|
this.hiddenHandles.add(handle);
|
|
4494
|
-
})
|
|
4783
|
+
});
|
|
4495
4784
|
this.syncHiddenObjects();
|
|
4496
4785
|
}
|
|
4497
4786
|
showObjects(handles) {
|
|
4498
|
-
handles.forEach(
|
|
4787
|
+
handles.forEach(handle => {
|
|
4499
4788
|
this.hiddenHandles.delete(handle);
|
|
4500
|
-
})
|
|
4789
|
+
});
|
|
4501
4790
|
this.syncHiddenObjects();
|
|
4502
4791
|
}
|
|
4503
4792
|
syncHiddenObjects() {
|
|
@@ -4518,47 +4807,47 @@ class DynamicGltfLoader {
|
|
|
4518
4807
|
if (this.hiddenHandles.size === 0) {
|
|
4519
4808
|
return;
|
|
4520
4809
|
}
|
|
4521
|
-
this.hiddenHandles.forEach(
|
|
4810
|
+
this.hiddenHandles.forEach(handle => {
|
|
4522
4811
|
const objects = this.handleToOptimizedObjects.get(handle);
|
|
4523
4812
|
if (objects) {
|
|
4524
|
-
objects.forEach(
|
|
4813
|
+
objects.forEach(x => this.oldOptimizeObjects.add(x));
|
|
4525
4814
|
}
|
|
4526
|
-
})
|
|
4527
|
-
this.oldOptimizeObjects.forEach(
|
|
4815
|
+
});
|
|
4816
|
+
this.oldOptimizeObjects.forEach(optimizedObject => {
|
|
4528
4817
|
optimizedObject.visible = false;
|
|
4529
4818
|
const originObjects = this.optimizedOriginalMap.get(optimizedObject);
|
|
4530
4819
|
const updateListToOptimize = [];
|
|
4531
|
-
originObjects.forEach(
|
|
4820
|
+
originObjects.forEach(obj => {
|
|
4532
4821
|
if (!this.hiddenHandles.has(obj.userData.handle)) {
|
|
4533
4822
|
updateListToOptimize.push(obj);
|
|
4534
4823
|
}
|
|
4535
|
-
})
|
|
4824
|
+
});
|
|
4536
4825
|
const firstObject = updateListToOptimize[0];
|
|
4537
4826
|
if (firstObject instanceof Mesh || firstObject instanceof LineSegments) {
|
|
4538
|
-
const geometries = updateListToOptimize.map(
|
|
4827
|
+
const geometries = updateListToOptimize.map(obj => {
|
|
4539
4828
|
const geometry = obj.geometry.clone();
|
|
4540
4829
|
obj.updateWorldMatrix(true, false);
|
|
4541
4830
|
geometry.applyMatrix4(obj.matrixWorld);
|
|
4542
4831
|
return geometry;
|
|
4543
|
-
})
|
|
4832
|
+
});
|
|
4544
4833
|
const newMergedGeometry = mergeGeometries(geometries);
|
|
4545
4834
|
const mergedObject = firstObject instanceof Mesh ? new Mesh(newMergedGeometry, optimizedObject.material) : new LineSegments(newMergedGeometry, optimizedObject.material);
|
|
4546
4835
|
mergedObject.visible = true;
|
|
4547
4836
|
optimizedObject.parent.add(mergedObject);
|
|
4548
4837
|
this.newOptimizedObjects.add(mergedObject);
|
|
4549
|
-
geometries.forEach(
|
|
4838
|
+
geometries.forEach(geometry => {
|
|
4550
4839
|
geometry.dispose();
|
|
4551
|
-
})
|
|
4840
|
+
});
|
|
4552
4841
|
} else if (firstObject instanceof Line) {
|
|
4553
4842
|
let totalVertices = 0;
|
|
4554
|
-
updateListToOptimize.map(
|
|
4843
|
+
updateListToOptimize.map(line => {
|
|
4555
4844
|
totalVertices += line.geometry.attributes.position.count;
|
|
4556
|
-
})
|
|
4845
|
+
});
|
|
4557
4846
|
const positions = new Float32Array(totalVertices * 3);
|
|
4558
4847
|
let posOffset = 0;
|
|
4559
4848
|
const indices = [];
|
|
4560
4849
|
let vertexOffset = 0;
|
|
4561
|
-
updateListToOptimize.forEach(
|
|
4850
|
+
updateListToOptimize.forEach(line => {
|
|
4562
4851
|
const geometry = line.geometry;
|
|
4563
4852
|
const positionAttr = geometry.attributes.position;
|
|
4564
4853
|
const vertexCount = positionAttr.count;
|
|
@@ -4576,7 +4865,7 @@ class DynamicGltfLoader {
|
|
|
4576
4865
|
indices.push(vertexOffset + i, vertexOffset + i + 1);
|
|
4577
4866
|
}
|
|
4578
4867
|
vertexOffset += vertexCount;
|
|
4579
|
-
})
|
|
4868
|
+
});
|
|
4580
4869
|
const geometry = new BufferGeometry;
|
|
4581
4870
|
geometry.setAttribute("position", new BufferAttribute(positions, 3));
|
|
4582
4871
|
geometry.setIndex(indices);
|
|
@@ -4587,7 +4876,7 @@ class DynamicGltfLoader {
|
|
|
4587
4876
|
optimizedObject.parent.add(mergedLine);
|
|
4588
4877
|
this.newOptimizedObjects.add(mergedLine);
|
|
4589
4878
|
}
|
|
4590
|
-
})
|
|
4879
|
+
});
|
|
4591
4880
|
}
|
|
4592
4881
|
getStructureGeometryExtent(structureId) {
|
|
4593
4882
|
const extent = new Box3;
|
|
@@ -4618,9 +4907,9 @@ class DynamicGltfLoader {
|
|
|
4618
4907
|
this.activeChunkLoads++;
|
|
4619
4908
|
return Promise.resolve();
|
|
4620
4909
|
}
|
|
4621
|
-
return new Promise(
|
|
4910
|
+
return new Promise(resolve => {
|
|
4622
4911
|
this.chunkQueue.push(resolve);
|
|
4623
|
-
})
|
|
4912
|
+
});
|
|
4624
4913
|
}
|
|
4625
4914
|
releaseChunkSlot() {
|
|
4626
4915
|
this.activeChunkLoads--;
|
|
@@ -4648,7 +4937,7 @@ class GLTFCloudDynamicLoader {
|
|
|
4648
4937
|
this.gltfLoader = new DynamicGltfLoader(this.viewer.camera, scene, this.viewer.renderer);
|
|
4649
4938
|
this.gltfLoader.memoryLimit = this.viewer.options.memoryLimit;
|
|
4650
4939
|
this.gltfLoader.setVisibleEdges(this.viewer.options.edgeModel);
|
|
4651
|
-
this.gltfLoader.addEventListener("databasechunk",
|
|
4940
|
+
this.gltfLoader.addEventListener("databasechunk", data => {
|
|
4652
4941
|
const modelImpl = new DynamicModelImpl(scene);
|
|
4653
4942
|
modelImpl.loader = this;
|
|
4654
4943
|
modelImpl.viewer = this.viewer;
|
|
@@ -4665,8 +4954,8 @@ class GLTFCloudDynamicLoader {
|
|
|
4665
4954
|
file: model.file,
|
|
4666
4955
|
model: model
|
|
4667
4956
|
});
|
|
4668
|
-
})
|
|
4669
|
-
this.gltfLoader.addEventListener("geometryprogress",
|
|
4957
|
+
});
|
|
4958
|
+
this.gltfLoader.addEventListener("geometryprogress", data => {
|
|
4670
4959
|
const progress = data.loaded / data.total;
|
|
4671
4960
|
this.viewer.emitEvent({
|
|
4672
4961
|
type: "geometryprogress",
|
|
@@ -4674,18 +4963,18 @@ class GLTFCloudDynamicLoader {
|
|
|
4674
4963
|
file: model.file,
|
|
4675
4964
|
model: model
|
|
4676
4965
|
});
|
|
4677
|
-
})
|
|
4678
|
-
this.gltfLoader.addEventListener("geometryerror",
|
|
4966
|
+
});
|
|
4967
|
+
this.gltfLoader.addEventListener("geometryerror", data => {
|
|
4679
4968
|
this.viewer.emitEvent({
|
|
4680
4969
|
type: "geometryerror",
|
|
4681
4970
|
data: data,
|
|
4682
4971
|
file: model.file,
|
|
4683
4972
|
model: model
|
|
4684
4973
|
});
|
|
4685
|
-
})
|
|
4686
|
-
this.gltfLoader.addEventListener("update",
|
|
4974
|
+
});
|
|
4975
|
+
this.gltfLoader.addEventListener("update", data => {
|
|
4687
4976
|
this.viewer.update();
|
|
4688
|
-
})
|
|
4977
|
+
});
|
|
4689
4978
|
const loadController = {
|
|
4690
4979
|
loadJson: async () => {
|
|
4691
4980
|
const progress = progress => {
|
|
@@ -4701,11 +4990,11 @@ class GLTFCloudDynamicLoader {
|
|
|
4701
4990
|
return json;
|
|
4702
4991
|
},
|
|
4703
4992
|
loadBinaryData: requests => {
|
|
4704
|
-
const ranges = requests.map(
|
|
4993
|
+
const ranges = requests.map(request => ({
|
|
4705
4994
|
begin: request.offset,
|
|
4706
4995
|
end: request.offset + request.length - 1,
|
|
4707
4996
|
requestId: this.requestId++
|
|
4708
|
-
}))
|
|
4997
|
+
}));
|
|
4709
4998
|
return model.downloadResourceRange(model.geometry[0], undefined, ranges, undefined, this.gltfLoader.getAbortController().signal);
|
|
4710
4999
|
},
|
|
4711
5000
|
baseUrl: () => Promise.resolve(`${model.httpClient.serverUrl}${model.path}/`)
|
|
@@ -4722,9 +5011,9 @@ class GLTFCloudDynamicLoader {
|
|
|
4722
5011
|
|
|
4723
5012
|
const loaders = loadersRegistry("threejs");
|
|
4724
5013
|
|
|
4725
|
-
loaders.registerLoader("gltf-file",
|
|
5014
|
+
loaders.registerLoader("gltf-file", viewer => new GLTFFileLoader(viewer));
|
|
4726
5015
|
|
|
4727
|
-
loaders.registerLoader("gltf-cloud",
|
|
5016
|
+
loaders.registerLoader("gltf-cloud", viewer => new GLTFCloudDynamicLoader(viewer));
|
|
4728
5017
|
|
|
4729
5018
|
class SSAARenderPass extends Pass {
|
|
4730
5019
|
constructor(scenes, camera, clearColor = 0, clearAlpha = 0) {
|
|
@@ -4802,7 +5091,7 @@ class SSAARenderPass extends Pass {
|
|
|
4802
5091
|
renderer.setClearColor(this.clearColor, this.clearAlpha);
|
|
4803
5092
|
renderer.setRenderTarget(this._sampleRenderTarget);
|
|
4804
5093
|
renderer.clear();
|
|
4805
|
-
this.scenes.forEach(
|
|
5094
|
+
this.scenes.forEach(scene => renderer.render(scene, this.camera));
|
|
4806
5095
|
renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer);
|
|
4807
5096
|
if (i === 0) {
|
|
4808
5097
|
renderer.setClearColor(0, 0);
|
|
@@ -4872,7 +5161,7 @@ class Viewer extends EventEmitter2 {
|
|
|
4872
5161
|
return this._markup;
|
|
4873
5162
|
}
|
|
4874
5163
|
initialize(canvas, onProgress) {
|
|
4875
|
-
this.addEventListener("optionschange",
|
|
5164
|
+
this.addEventListener("optionschange", event => this.syncOptions(event.data));
|
|
4876
5165
|
this.scene = new Scene;
|
|
4877
5166
|
this.helpers = new Helpers;
|
|
4878
5167
|
this.target = new Vector3(0, 0, 0);
|
|
@@ -4914,7 +5203,7 @@ class Viewer extends EventEmitter2 {
|
|
|
4914
5203
|
this.composer.addPass(this.outputPass);
|
|
4915
5204
|
this.composer.setSize(width, height);
|
|
4916
5205
|
this.canvas = canvas;
|
|
4917
|
-
this.canvasEvents.forEach(
|
|
5206
|
+
this.canvasEvents.forEach(x => canvas.addEventListener(x, this.canvaseventlistener));
|
|
4918
5207
|
this._markup.initialize(this.canvas, this.canvasEvents, this, this);
|
|
4919
5208
|
for (const name of components.getComponents().keys()) {
|
|
4920
5209
|
this._components.push(components.createComponent(name, this));
|
|
@@ -4947,11 +5236,11 @@ class Viewer extends EventEmitter2 {
|
|
|
4947
5236
|
});
|
|
4948
5237
|
this.removeAllListeners();
|
|
4949
5238
|
this.setActiveDragger();
|
|
4950
|
-
this._components.forEach(
|
|
5239
|
+
this._components.forEach(component => component.dispose());
|
|
4951
5240
|
this._components = [];
|
|
4952
5241
|
this._markup.dispose();
|
|
4953
5242
|
if (this.canvas) {
|
|
4954
|
-
this.canvasEvents.forEach(
|
|
5243
|
+
this.canvasEvents.forEach(x => this.canvas.removeEventListener(x, this.canvaseventlistener));
|
|
4955
5244
|
this.canvas = undefined;
|
|
4956
5245
|
}
|
|
4957
5246
|
if (this.composer) this.composer.dispose();
|
|
@@ -5022,7 +5311,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5022
5311
|
} else {
|
|
5023
5312
|
this.composer.render(deltaTime);
|
|
5024
5313
|
}
|
|
5025
|
-
(_b = (_a = this._activeDragger) === null || _a ===
|
|
5314
|
+
(_b = (_a = this._activeDragger) === null || _a === void 0 ? void 0 : _a.updatePreview) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
5026
5315
|
this.emitEvent({
|
|
5027
5316
|
type: "render",
|
|
5028
5317
|
time: time,
|
|
@@ -5045,7 +5334,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5045
5334
|
let model = file;
|
|
5046
5335
|
if (model && typeof model.getModels === "function") {
|
|
5047
5336
|
const models = await model.getModels();
|
|
5048
|
-
model = models.find(
|
|
5337
|
+
model = models.find(model => model.default) || models[0] || file;
|
|
5049
5338
|
}
|
|
5050
5339
|
if (!model) throw new Error(`Format not supported`);
|
|
5051
5340
|
let format = params.format;
|
|
@@ -5097,7 +5386,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5097
5386
|
});
|
|
5098
5387
|
}
|
|
5099
5388
|
cancel() {
|
|
5100
|
-
this.loaders.forEach(
|
|
5389
|
+
this.loaders.forEach(loader => loader.cancel());
|
|
5101
5390
|
this.emitEvent({
|
|
5102
5391
|
type: "cancel"
|
|
5103
5392
|
});
|
|
@@ -5109,9 +5398,9 @@ class Viewer extends EventEmitter2 {
|
|
|
5109
5398
|
this.clearSlices();
|
|
5110
5399
|
this.clearOverlay();
|
|
5111
5400
|
this.clearSelected();
|
|
5112
|
-
this.loaders.forEach(
|
|
5401
|
+
this.loaders.forEach(loader => loader.dispose());
|
|
5113
5402
|
this.loaders = [];
|
|
5114
|
-
this.models.forEach(
|
|
5403
|
+
this.models.forEach(model => model.dispose());
|
|
5115
5404
|
this.models = [];
|
|
5116
5405
|
this.scene.clear();
|
|
5117
5406
|
this.helpers.clear();
|
|
@@ -5187,7 +5476,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5187
5476
|
newDragger = draggers.createDragger(name, this);
|
|
5188
5477
|
if (newDragger) {
|
|
5189
5478
|
this._activeDragger = newDragger;
|
|
5190
|
-
(_b = (_a = this._activeDragger).initialize) === null || _b ===
|
|
5479
|
+
(_b = (_a = this._activeDragger).initialize) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
5191
5480
|
}
|
|
5192
5481
|
}
|
|
5193
5482
|
const canvas = this.canvas;
|
|
@@ -5211,7 +5500,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5211
5500
|
}
|
|
5212
5501
|
}
|
|
5213
5502
|
getComponent(name) {
|
|
5214
|
-
return this._components.find(
|
|
5503
|
+
return this._components.find(component => component.name === name);
|
|
5215
5504
|
}
|
|
5216
5505
|
is3D() {
|
|
5217
5506
|
return true;
|
|
@@ -5308,16 +5597,16 @@ class Viewer extends EventEmitter2 {
|
|
|
5308
5597
|
}
|
|
5309
5598
|
};
|
|
5310
5599
|
const setClippingPlanes = clipping_planes => {
|
|
5311
|
-
clipping_planes === null || clipping_planes ===
|
|
5600
|
+
clipping_planes === null || clipping_planes === void 0 ? void 0 : clipping_planes.forEach(clipping_plane => {
|
|
5312
5601
|
const plane = new Plane;
|
|
5313
5602
|
plane.setFromNormalAndCoplanarPoint(getVector3FromPoint3d(clipping_plane.direction), getVector3FromPoint3d(clipping_plane.location));
|
|
5314
5603
|
this.renderer.clippingPlanes.push(plane);
|
|
5315
|
-
})
|
|
5604
|
+
});
|
|
5316
5605
|
};
|
|
5317
5606
|
const setSelection = selection => {
|
|
5318
|
-
if (selection) this.setSelected(selection.map(
|
|
5607
|
+
if (selection) this.setSelected(selection.map(component => component.handle));
|
|
5319
5608
|
};
|
|
5320
|
-
const draggerName = (_a = this._activeDragger) === null || _a ===
|
|
5609
|
+
const draggerName = (_a = this._activeDragger) === null || _a === void 0 ? void 0 : _a.name;
|
|
5321
5610
|
this.setActiveDragger();
|
|
5322
5611
|
this.clearSlices();
|
|
5323
5612
|
this.clearOverlay();
|
|
@@ -5329,7 +5618,7 @@ class Viewer extends EventEmitter2 {
|
|
|
5329
5618
|
setClippingPlanes(viewpoint.clipping_planes);
|
|
5330
5619
|
setSelection(viewpoint.selection);
|
|
5331
5620
|
this._markup.setViewpoint(viewpoint);
|
|
5332
|
-
this.target = getVector3FromPoint3d((_c = (_b = viewpoint.custom_fields) === null || _b ===
|
|
5621
|
+
this.target = getVector3FromPoint3d((_c = (_b = viewpoint.custom_fields) === null || _b === void 0 ? void 0 : _b.camera_target) !== null && _c !== void 0 ? _c : this.target);
|
|
5333
5622
|
this.setActiveDragger(draggerName);
|
|
5334
5623
|
this.emitEvent({
|
|
5335
5624
|
type: "drawviewpoint",
|
|
@@ -5364,18 +5653,18 @@ class Viewer extends EventEmitter2 {
|
|
|
5364
5653
|
};
|
|
5365
5654
|
const getClippingPlanes = () => {
|
|
5366
5655
|
const clipping_planes = [];
|
|
5367
|
-
this.renderer.clippingPlanes.forEach(
|
|
5656
|
+
this.renderer.clippingPlanes.forEach(plane => {
|
|
5368
5657
|
const clipping_plane = {
|
|
5369
5658
|
location: getPoint3dFromVector3(plane.coplanarPoint(new Vector3)),
|
|
5370
5659
|
direction: getPoint3dFromVector3(plane.normal)
|
|
5371
5660
|
};
|
|
5372
5661
|
clipping_planes.push(clipping_plane);
|
|
5373
|
-
})
|
|
5662
|
+
});
|
|
5374
5663
|
return clipping_planes;
|
|
5375
5664
|
};
|
|
5376
|
-
const getSelection = () => this.getSelected().map(
|
|
5665
|
+
const getSelection = () => this.getSelected().map(handle => ({
|
|
5377
5666
|
handle: handle
|
|
5378
|
-
}))
|
|
5667
|
+
}));
|
|
5379
5668
|
const viewpoint = {
|
|
5380
5669
|
custom_fields: {}
|
|
5381
5670
|
};
|