@inweb/viewer-three 26.6.1 → 26.6.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/loaders/IFCXLoader.js +60 -60
- 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 +49 -49
- package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/viewer-three.js +1386 -305
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +2 -2
- package/dist/viewer-three.module.js +191 -50
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/Viewer.d.ts +1 -1
- package/lib/Viewer/components/HighlighterComponent.d.ts +18 -0
- package/lib/Viewer/components/HighlighterUtils.d.ts +6 -0
- package/lib/Viewer/components/SelectionComponent.d.ts +5 -4
- package/lib/Viewer/loaders/{GLTFModelLoader.d.ts → GLTFCloudModelLoader.d.ts} +1 -1
- package/lib/Viewer/loaders/GLTFFileLoader.d.ts +1 -1
- package/package.json +5 -5
- package/plugins/loaders/{IFCXModelLoader.ts → IFCXCloudFileLoader.ts} +6 -6
- package/plugins/loaders/IFCXLoader.ts +2 -2
- package/src/Viewer/Viewer.ts +11 -11
- package/src/Viewer/components/HighlighterComponent.ts +159 -0
- package/src/Viewer/components/HighlighterUtils.ts +116 -0
- package/src/Viewer/components/SelectionComponent.ts +10 -22
- package/src/Viewer/components/index.ts +2 -1
- package/src/Viewer/loaders/{GLTFModelLoader.ts → GLTFCloudModelLoader.ts} +1 -1
- package/src/Viewer/loaders/GLTFFileLoader.ts +4 -4
- package/src/Viewer/loaders/index.ts +2 -2
package/dist/viewer-three.js
CHANGED
|
@@ -18058,8 +18058,8 @@
|
|
|
18058
18058
|
|
|
18059
18059
|
}
|
|
18060
18060
|
|
|
18061
|
-
const _start = /*@__PURE__*/ new Vector3();
|
|
18062
|
-
const _end = /*@__PURE__*/ new Vector3();
|
|
18061
|
+
const _start$1 = /*@__PURE__*/ new Vector3();
|
|
18062
|
+
const _end$1 = /*@__PURE__*/ new Vector3();
|
|
18063
18063
|
|
|
18064
18064
|
class LineSegments extends Line$1 {
|
|
18065
18065
|
|
|
@@ -18086,11 +18086,11 @@
|
|
|
18086
18086
|
|
|
18087
18087
|
for ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {
|
|
18088
18088
|
|
|
18089
|
-
_start.fromBufferAttribute( positionAttribute, i );
|
|
18090
|
-
_end.fromBufferAttribute( positionAttribute, i + 1 );
|
|
18089
|
+
_start$1.fromBufferAttribute( positionAttribute, i );
|
|
18090
|
+
_end$1.fromBufferAttribute( positionAttribute, i + 1 );
|
|
18091
18091
|
|
|
18092
18092
|
lineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];
|
|
18093
|
-
lineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );
|
|
18093
|
+
lineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 );
|
|
18094
18094
|
|
|
18095
18095
|
}
|
|
18096
18096
|
|
|
@@ -36457,7 +36457,7 @@
|
|
|
36457
36457
|
|
|
36458
36458
|
}
|
|
36459
36459
|
|
|
36460
|
-
const _vector$1 = /*@__PURE__*/ new Vector3();
|
|
36460
|
+
const _vector$1$1 = /*@__PURE__*/ new Vector3();
|
|
36461
36461
|
const _color1 = /*@__PURE__*/ new Color();
|
|
36462
36462
|
const _color2 = /*@__PURE__*/ new Color();
|
|
36463
36463
|
|
|
@@ -36529,7 +36529,7 @@
|
|
|
36529
36529
|
|
|
36530
36530
|
this.light.updateWorldMatrix( true, false );
|
|
36531
36531
|
|
|
36532
|
-
mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );
|
|
36532
|
+
mesh.lookAt( _vector$1$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );
|
|
36533
36533
|
|
|
36534
36534
|
}
|
|
36535
36535
|
|
|
@@ -37017,7 +37017,7 @@
|
|
|
37017
37017
|
|
|
37018
37018
|
}
|
|
37019
37019
|
|
|
37020
|
-
const _box = /*@__PURE__*/ new Box3();
|
|
37020
|
+
const _box$5 = /*@__PURE__*/ new Box3();
|
|
37021
37021
|
|
|
37022
37022
|
class BoxHelper extends LineSegments {
|
|
37023
37023
|
|
|
@@ -37051,14 +37051,14 @@
|
|
|
37051
37051
|
|
|
37052
37052
|
if ( this.object !== undefined ) {
|
|
37053
37053
|
|
|
37054
|
-
_box.setFromObject( this.object );
|
|
37054
|
+
_box$5.setFromObject( this.object );
|
|
37055
37055
|
|
|
37056
37056
|
}
|
|
37057
37057
|
|
|
37058
|
-
if ( _box.isEmpty() ) return;
|
|
37058
|
+
if ( _box$5.isEmpty() ) return;
|
|
37059
37059
|
|
|
37060
|
-
const min = _box.min;
|
|
37061
|
-
const max = _box.max;
|
|
37060
|
+
const min = _box$5.min;
|
|
37061
|
+
const max = _box$5.max;
|
|
37062
37062
|
|
|
37063
37063
|
/*
|
|
37064
37064
|
5____4
|
|
@@ -58881,7 +58881,7 @@ void main() {
|
|
|
58881
58881
|
let _heightHalf;
|
|
58882
58882
|
const _viewMatrix = new Matrix4();
|
|
58883
58883
|
const _viewProjectionMatrix = new Matrix4();
|
|
58884
|
-
const _vector = new Vector3();
|
|
58884
|
+
const _vector$1 = new Vector3();
|
|
58885
58885
|
const _vector1 = new Vector4();
|
|
58886
58886
|
const _vector2 = new Vector4();
|
|
58887
58887
|
const point = new Vector2();
|
|
@@ -58900,10 +58900,10 @@ void main() {
|
|
|
58900
58900
|
_viewProjectionMatrix.multiplyMatrices(this.camera.projectionMatrix, _viewMatrix);
|
|
58901
58901
|
}
|
|
58902
58902
|
projectPoint(p) {
|
|
58903
|
-
_vector.copy(p).applyMatrix4(_viewProjectionMatrix);
|
|
58904
|
-
const visible = _vector.z >= -1 && _vector.z <= 1;
|
|
58905
|
-
point.x = (_vector.x + 1) * _widthHalf;
|
|
58906
|
-
point.y = (-_vector.y + 1) * _heightHalf;
|
|
58903
|
+
_vector$1.copy(p).applyMatrix4(_viewProjectionMatrix);
|
|
58904
|
+
const visible = _vector$1.z >= -1 && _vector$1.z <= 1;
|
|
58905
|
+
point.x = (_vector$1.x + 1) * _widthHalf;
|
|
58906
|
+
point.y = (-_vector$1.y + 1) * _heightHalf;
|
|
58907
58907
|
return { point, visible };
|
|
58908
58908
|
}
|
|
58909
58909
|
projectLine(p1, p2) {
|
|
@@ -59740,31 +59740,22 @@ void main() {
|
|
|
59740
59740
|
return;
|
|
59741
59741
|
this.viewer.executeCommand("zoomToSelected");
|
|
59742
59742
|
};
|
|
59743
|
-
this.
|
|
59744
|
-
|
|
59745
|
-
this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);
|
|
59746
|
-
this.facesMaterial.opacity = (255 - facesTransparancy) / 255;
|
|
59747
|
-
this.viewer.update();
|
|
59743
|
+
this.initHighlighter = () => {
|
|
59744
|
+
this.highlighter = this.viewer.getComponent("HighlighterComponent");
|
|
59748
59745
|
};
|
|
59749
59746
|
this.viewer = viewer;
|
|
59750
59747
|
this.raycaster = new Raycaster();
|
|
59751
59748
|
this.downPosition = new Vector2();
|
|
59752
|
-
const { facesColor, facesTransparancy } = this.viewer.options;
|
|
59753
|
-
this.facesMaterial = new MeshBasicMaterial();
|
|
59754
|
-
this.facesMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);
|
|
59755
|
-
this.facesMaterial.opacity = (255 - facesTransparancy) / 255;
|
|
59756
|
-
this.facesMaterial.transparent = true;
|
|
59757
59749
|
this.viewer.addEventListener("pointerdown", this.onPointerDown);
|
|
59758
59750
|
this.viewer.addEventListener("pointerup", this.onPointerUp);
|
|
59759
59751
|
this.viewer.addEventListener("dblclick", this.onDoubleClick);
|
|
59760
|
-
this.viewer.addEventListener("
|
|
59752
|
+
this.viewer.addEventListener("initialize", this.initHighlighter);
|
|
59761
59753
|
}
|
|
59762
59754
|
dispose() {
|
|
59763
|
-
this.facesMaterial.dispose();
|
|
59764
59755
|
this.viewer.removeEventListener("pointerdown", this.onPointerDown);
|
|
59765
59756
|
this.viewer.removeEventListener("pointerup", this.onPointerUp);
|
|
59766
59757
|
this.viewer.removeEventListener("dblclick", this.onDoubleClick);
|
|
59767
|
-
this.viewer.removeEventListener("
|
|
59758
|
+
this.viewer.removeEventListener("initialize", this.initHighlighter);
|
|
59768
59759
|
}
|
|
59769
59760
|
getMousePosition(event, target) {
|
|
59770
59761
|
return target.set(event.clientX, event.clientY);
|
|
@@ -59791,14 +59782,13 @@ void main() {
|
|
|
59791
59782
|
if (object.isSelected)
|
|
59792
59783
|
return;
|
|
59793
59784
|
object.isSelected = true;
|
|
59794
|
-
|
|
59795
|
-
object.material = this.facesMaterial;
|
|
59785
|
+
this.highlighter.highlight(object);
|
|
59796
59786
|
this.viewer.selected.push(object);
|
|
59797
59787
|
}
|
|
59798
59788
|
clearSelection() {
|
|
59799
59789
|
this.viewer.selected.forEach((object) => {
|
|
59800
59790
|
object.isSelected = false;
|
|
59801
|
-
|
|
59791
|
+
this.highlighter.unhighlight(object);
|
|
59802
59792
|
});
|
|
59803
59793
|
this.viewer.selected.length = 0;
|
|
59804
59794
|
}
|
|
@@ -60325,98 +60315,1227 @@ void main() {
|
|
|
60325
60315
|
// By use of this software, its documentation or related materials, you
|
|
60326
60316
|
// acknowledge and accept the above terms.
|
|
60327
60317
|
///////////////////////////////////////////////////////////////////////////////
|
|
60328
|
-
class CameraComponent {
|
|
60329
|
-
constructor(viewer) {
|
|
60330
|
-
this.geometryEnd = () => {
|
|
60331
|
-
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
60332
|
-
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius * 2;
|
|
60333
|
-
const rendererSize = this.viewer.renderer.getSize(new Vector2());
|
|
60334
|
-
const aspect = rendererSize.x / rendererSize.y;
|
|
60335
|
-
// TODO: do not change the camera and target after opening the second model in "append" mode
|
|
60336
|
-
let sceneCamera;
|
|
60337
|
-
this.viewer.scene.traverse((object) => {
|
|
60338
|
-
if (object.isCamera)
|
|
60339
|
-
if (!sceneCamera)
|
|
60340
|
-
sceneCamera = object;
|
|
60341
|
-
else if (object.isPerspectiveCamera && sceneCamera.isOrthographicCamera)
|
|
60342
|
-
sceneCamera = object;
|
|
60343
|
-
});
|
|
60344
|
-
if (sceneCamera) {
|
|
60345
|
-
this.viewer.camera = sceneCamera.clone();
|
|
60346
|
-
this.viewer.camera.up.set(0, 0, 1);
|
|
60347
|
-
this.viewer.camera.scale.set(1, 1, 1); // <- visualize fix
|
|
60348
|
-
}
|
|
60349
|
-
const camera = this.viewer.camera;
|
|
60350
|
-
if (camera.isPerspectiveCamera) {
|
|
60351
|
-
camera.aspect = aspect;
|
|
60352
|
-
camera.near = extentsSize / 100;
|
|
60353
|
-
camera.far = extentsSize * 100;
|
|
60354
|
-
camera.updateProjectionMatrix();
|
|
60318
|
+
class CameraComponent {
|
|
60319
|
+
constructor(viewer) {
|
|
60320
|
+
this.geometryEnd = () => {
|
|
60321
|
+
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
60322
|
+
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius * 2;
|
|
60323
|
+
const rendererSize = this.viewer.renderer.getSize(new Vector2());
|
|
60324
|
+
const aspect = rendererSize.x / rendererSize.y;
|
|
60325
|
+
// TODO: do not change the camera and target after opening the second model in "append" mode
|
|
60326
|
+
let sceneCamera;
|
|
60327
|
+
this.viewer.scene.traverse((object) => {
|
|
60328
|
+
if (object.isCamera)
|
|
60329
|
+
if (!sceneCamera)
|
|
60330
|
+
sceneCamera = object;
|
|
60331
|
+
else if (object.isPerspectiveCamera && sceneCamera.isOrthographicCamera)
|
|
60332
|
+
sceneCamera = object;
|
|
60333
|
+
});
|
|
60334
|
+
if (sceneCamera) {
|
|
60335
|
+
this.viewer.camera = sceneCamera.clone();
|
|
60336
|
+
this.viewer.camera.up.set(0, 0, 1);
|
|
60337
|
+
this.viewer.camera.scale.set(1, 1, 1); // <- visualize fix
|
|
60338
|
+
}
|
|
60339
|
+
const camera = this.viewer.camera;
|
|
60340
|
+
if (camera.isPerspectiveCamera) {
|
|
60341
|
+
camera.aspect = aspect;
|
|
60342
|
+
camera.near = extentsSize / 100;
|
|
60343
|
+
camera.far = extentsSize * 100;
|
|
60344
|
+
camera.updateProjectionMatrix();
|
|
60345
|
+
}
|
|
60346
|
+
if (camera.isOrthographicCamera) {
|
|
60347
|
+
camera.left = camera.bottom * aspect;
|
|
60348
|
+
camera.right = camera.top * aspect;
|
|
60349
|
+
camera.near = 0;
|
|
60350
|
+
camera.far = extentsSize * 100;
|
|
60351
|
+
camera.updateProjectionMatrix();
|
|
60352
|
+
}
|
|
60353
|
+
this.viewer.target.copy(extentsCenter);
|
|
60354
|
+
if (!sceneCamera) {
|
|
60355
|
+
this.viewer.executeCommand("setDefaultViewPosition");
|
|
60356
|
+
}
|
|
60357
|
+
};
|
|
60358
|
+
this.viewer = viewer;
|
|
60359
|
+
this.viewer.addEventListener("databasechunk", this.geometryEnd);
|
|
60360
|
+
}
|
|
60361
|
+
dispose() {
|
|
60362
|
+
this.viewer.removeEventListener("databasechunk", this.geometryEnd);
|
|
60363
|
+
}
|
|
60364
|
+
}
|
|
60365
|
+
|
|
60366
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60367
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60368
|
+
// All rights reserved.
|
|
60369
|
+
//
|
|
60370
|
+
// This software and its documentation and related materials are owned by
|
|
60371
|
+
// the Alliance. The software may only be incorporated into application
|
|
60372
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
60373
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60374
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
60375
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60376
|
+
// protected by copyright law and international treaty provisions. Application
|
|
60377
|
+
// programs incorporating this software must include the following statement
|
|
60378
|
+
// with their copyright notices:
|
|
60379
|
+
//
|
|
60380
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
60381
|
+
// license agreement with Open Design Alliance.
|
|
60382
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60383
|
+
// All rights reserved.
|
|
60384
|
+
//
|
|
60385
|
+
// By use of this software, its documentation or related materials, you
|
|
60386
|
+
// acknowledge and accept the above terms.
|
|
60387
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60388
|
+
class ExtentsComponent {
|
|
60389
|
+
constructor(viewer) {
|
|
60390
|
+
this.syncExtents = () => {
|
|
60391
|
+
const extents = new Box3();
|
|
60392
|
+
this.viewer.scene.traverseVisible((object) => !object.children.length && extents.expandByObject(object));
|
|
60393
|
+
this.viewer.extents.copy(extents);
|
|
60394
|
+
};
|
|
60395
|
+
this.viewer = viewer;
|
|
60396
|
+
this.viewer.addEventListener("databasechunk", this.syncExtents);
|
|
60397
|
+
this.viewer.addEventListener("clear", this.syncExtents);
|
|
60398
|
+
this.viewer.on("explode", this.syncExtents);
|
|
60399
|
+
this.viewer.on("isolate", this.syncExtents);
|
|
60400
|
+
this.viewer.on("hide", this.syncExtents);
|
|
60401
|
+
this.viewer.on("showall", this.syncExtents);
|
|
60402
|
+
}
|
|
60403
|
+
dispose() {
|
|
60404
|
+
this.viewer.removeEventListener("databasechunk", this.syncExtents);
|
|
60405
|
+
this.viewer.removeEventListener("clear", this.syncExtents);
|
|
60406
|
+
this.viewer.off("explode", this.syncExtents);
|
|
60407
|
+
this.viewer.off("isolate", this.syncExtents);
|
|
60408
|
+
this.viewer.off("hide", this.syncExtents);
|
|
60409
|
+
this.viewer.off("showall", this.syncExtents);
|
|
60410
|
+
}
|
|
60411
|
+
}
|
|
60412
|
+
|
|
60413
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60414
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60415
|
+
// All rights reserved.
|
|
60416
|
+
//
|
|
60417
|
+
// This software and its documentation and related materials are owned by
|
|
60418
|
+
// the Alliance. The software may only be incorporated into application
|
|
60419
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
60420
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60421
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
60422
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60423
|
+
// protected by copyright law and international treaty provisions. Application
|
|
60424
|
+
// programs incorporating this software must include the following statement
|
|
60425
|
+
// with their copyright notices:
|
|
60426
|
+
//
|
|
60427
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
60428
|
+
// license agreement with Open Design Alliance.
|
|
60429
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60430
|
+
// All rights reserved.
|
|
60431
|
+
//
|
|
60432
|
+
// By use of this software, its documentation or related materials, you
|
|
60433
|
+
// acknowledge and accept the above terms.
|
|
60434
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60435
|
+
class LightComponent {
|
|
60436
|
+
constructor(viewer) {
|
|
60437
|
+
this.geometryEnd = () => {
|
|
60438
|
+
this.ambientLight.removeFromParent();
|
|
60439
|
+
this.directionalLight.removeFromParent();
|
|
60440
|
+
this.frontLight.removeFromParent();
|
|
60441
|
+
this.hemisphereLight.removeFromParent();
|
|
60442
|
+
if (this.viewer.extents.isEmpty())
|
|
60443
|
+
return;
|
|
60444
|
+
const extentsCenter = this.viewer.extents.getCenter(new Vector3());
|
|
60445
|
+
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius;
|
|
60446
|
+
this.directionalLight.position
|
|
60447
|
+
.set(0.5, 0, 0.866)
|
|
60448
|
+
.multiplyScalar(extentsSize * 2)
|
|
60449
|
+
.add(extentsCenter);
|
|
60450
|
+
this.directionalLight.target.position.copy(extentsCenter);
|
|
60451
|
+
this.frontLight.position.set(0, extentsSize * 2, 0).add(extentsCenter);
|
|
60452
|
+
this.frontLight.target.position.copy(extentsCenter);
|
|
60453
|
+
this.hemisphereLight.position.set(0, extentsSize * 3, 0).add(extentsCenter);
|
|
60454
|
+
this.viewer.scene.add(this.ambientLight);
|
|
60455
|
+
this.viewer.scene.add(this.directionalLight);
|
|
60456
|
+
this.viewer.scene.add(this.frontLight);
|
|
60457
|
+
this.viewer.scene.add(this.hemisphereLight);
|
|
60458
|
+
};
|
|
60459
|
+
this.viewer = viewer;
|
|
60460
|
+
this.ambientLight = new AmbientLight(0xffffff, 1);
|
|
60461
|
+
this.viewer.scene.add(this.ambientLight);
|
|
60462
|
+
this.directionalLight = new DirectionalLight(0xffffff, 1);
|
|
60463
|
+
this.directionalLight.position.set(0.5, 0, 0.866); // ~60º
|
|
60464
|
+
this.viewer.scene.add(this.directionalLight);
|
|
60465
|
+
this.frontLight = new DirectionalLight(0xffffff, 1.25);
|
|
60466
|
+
this.frontLight.position.set(0, 1, 0);
|
|
60467
|
+
this.viewer.scene.add(this.frontLight);
|
|
60468
|
+
this.hemisphereLight = new HemisphereLight(0xffffff, 0x444444, 1.25);
|
|
60469
|
+
this.hemisphereLight.position.set(0, 0, 1);
|
|
60470
|
+
this.viewer.scene.add(this.hemisphereLight);
|
|
60471
|
+
this.viewer.addEventListener("databasechunk", this.geometryEnd);
|
|
60472
|
+
this.viewer.addEventListener("clear", this.geometryEnd);
|
|
60473
|
+
}
|
|
60474
|
+
dispose() {
|
|
60475
|
+
this.ambientLight.removeFromParent();
|
|
60476
|
+
this.ambientLight.dispose();
|
|
60477
|
+
this.directionalLight.removeFromParent();
|
|
60478
|
+
this.directionalLight.dispose();
|
|
60479
|
+
this.frontLight.removeFromParent();
|
|
60480
|
+
this.frontLight.dispose();
|
|
60481
|
+
this.hemisphereLight.removeFromParent();
|
|
60482
|
+
this.hemisphereLight.dispose();
|
|
60483
|
+
this.viewer.removeEventListener("databasechunk", this.geometryEnd);
|
|
60484
|
+
this.viewer.removeEventListener("clear", this.geometryEnd);
|
|
60485
|
+
}
|
|
60486
|
+
}
|
|
60487
|
+
|
|
60488
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60489
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60490
|
+
// All rights reserved.
|
|
60491
|
+
//
|
|
60492
|
+
// This software and its documentation and related materials are owned by
|
|
60493
|
+
// the Alliance. The software may only be incorporated into application
|
|
60494
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
60495
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60496
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
60497
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60498
|
+
// protected by copyright law and international treaty provisions. Application
|
|
60499
|
+
// programs incorporating this software must include the following statement
|
|
60500
|
+
// with their copyright notices:
|
|
60501
|
+
//
|
|
60502
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
60503
|
+
// license agreement with Open Design Alliance.
|
|
60504
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60505
|
+
// All rights reserved.
|
|
60506
|
+
//
|
|
60507
|
+
// By use of this software, its documentation or related materials, you
|
|
60508
|
+
// acknowledge and accept the above terms.
|
|
60509
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60510
|
+
class RenderLoopComponent {
|
|
60511
|
+
constructor(viewer) {
|
|
60512
|
+
this.animate = (time = 0) => {
|
|
60513
|
+
this.requestId = requestAnimationFrame(this.animate);
|
|
60514
|
+
this.viewer.render(time);
|
|
60515
|
+
};
|
|
60516
|
+
this.viewer = viewer;
|
|
60517
|
+
this.animate();
|
|
60518
|
+
}
|
|
60519
|
+
dispose() {
|
|
60520
|
+
cancelAnimationFrame(this.requestId);
|
|
60521
|
+
}
|
|
60522
|
+
}
|
|
60523
|
+
|
|
60524
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60525
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60526
|
+
// All rights reserved.
|
|
60527
|
+
//
|
|
60528
|
+
// This software and its documentation and related materials are owned by
|
|
60529
|
+
// the Alliance. The software may only be incorporated into application
|
|
60530
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
60531
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60532
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
60533
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60534
|
+
// protected by copyright law and international treaty provisions. Application
|
|
60535
|
+
// programs incorporating this software must include the following statement
|
|
60536
|
+
// with their copyright notices:
|
|
60537
|
+
//
|
|
60538
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
60539
|
+
// license agreement with Open Design Alliance.
|
|
60540
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60541
|
+
// All rights reserved.
|
|
60542
|
+
//
|
|
60543
|
+
// By use of this software, its documentation or related materials, you
|
|
60544
|
+
// acknowledge and accept the above terms.
|
|
60545
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
60546
|
+
class ResizeCanvasComponent {
|
|
60547
|
+
constructor(viewer) {
|
|
60548
|
+
this.resizeViewer = (entries) => {
|
|
60549
|
+
const { width, height } = entries[0].contentRect;
|
|
60550
|
+
if (!width || !height)
|
|
60551
|
+
return; // <- invisible viewer, or viewer with parent removed
|
|
60552
|
+
const camera = this.viewer.camera;
|
|
60553
|
+
const aspect = width / height;
|
|
60554
|
+
if (camera.isPerspectiveCamera) {
|
|
60555
|
+
camera.aspect = aspect;
|
|
60556
|
+
camera.updateProjectionMatrix();
|
|
60557
|
+
}
|
|
60558
|
+
if (camera.isOrthographicCamera) {
|
|
60559
|
+
camera.left = camera.bottom * aspect;
|
|
60560
|
+
camera.right = camera.top * aspect;
|
|
60561
|
+
camera.updateProjectionMatrix();
|
|
60562
|
+
}
|
|
60563
|
+
this.viewer.renderer.setSize(width, height, true);
|
|
60564
|
+
this.viewer.update(true);
|
|
60565
|
+
this.viewer.emitEvent({ type: "resize", width, height });
|
|
60566
|
+
};
|
|
60567
|
+
this.viewer = viewer;
|
|
60568
|
+
this.resizeObserver = new ResizeObserver(this.resizeViewer);
|
|
60569
|
+
this.resizeObserver.observe(viewer.canvas.parentElement);
|
|
60570
|
+
}
|
|
60571
|
+
dispose() {
|
|
60572
|
+
this.resizeObserver.disconnect();
|
|
60573
|
+
}
|
|
60574
|
+
}
|
|
60575
|
+
|
|
60576
|
+
const _box = new Box3();
|
|
60577
|
+
const _vector = new Vector3();
|
|
60578
|
+
|
|
60579
|
+
class LineSegmentsGeometry extends InstancedBufferGeometry {
|
|
60580
|
+
|
|
60581
|
+
constructor() {
|
|
60582
|
+
|
|
60583
|
+
super();
|
|
60584
|
+
|
|
60585
|
+
this.isLineSegmentsGeometry = true;
|
|
60586
|
+
|
|
60587
|
+
this.type = 'LineSegmentsGeometry';
|
|
60588
|
+
|
|
60589
|
+
const positions = [ -1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0 ];
|
|
60590
|
+
const uvs = [ -1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2 ];
|
|
60591
|
+
const index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];
|
|
60592
|
+
|
|
60593
|
+
this.setIndex( index );
|
|
60594
|
+
this.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );
|
|
60595
|
+
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
|
60596
|
+
|
|
60597
|
+
}
|
|
60598
|
+
|
|
60599
|
+
applyMatrix4( matrix ) {
|
|
60600
|
+
|
|
60601
|
+
const start = this.attributes.instanceStart;
|
|
60602
|
+
const end = this.attributes.instanceEnd;
|
|
60603
|
+
|
|
60604
|
+
if ( start !== undefined ) {
|
|
60605
|
+
|
|
60606
|
+
start.applyMatrix4( matrix );
|
|
60607
|
+
|
|
60608
|
+
end.applyMatrix4( matrix );
|
|
60609
|
+
|
|
60610
|
+
start.needsUpdate = true;
|
|
60611
|
+
|
|
60612
|
+
}
|
|
60613
|
+
|
|
60614
|
+
if ( this.boundingBox !== null ) {
|
|
60615
|
+
|
|
60616
|
+
this.computeBoundingBox();
|
|
60617
|
+
|
|
60618
|
+
}
|
|
60619
|
+
|
|
60620
|
+
if ( this.boundingSphere !== null ) {
|
|
60621
|
+
|
|
60622
|
+
this.computeBoundingSphere();
|
|
60623
|
+
|
|
60624
|
+
}
|
|
60625
|
+
|
|
60626
|
+
return this;
|
|
60627
|
+
|
|
60628
|
+
}
|
|
60629
|
+
|
|
60630
|
+
setPositions( array ) {
|
|
60631
|
+
|
|
60632
|
+
let lineSegments;
|
|
60633
|
+
|
|
60634
|
+
if ( array instanceof Float32Array ) {
|
|
60635
|
+
|
|
60636
|
+
lineSegments = array;
|
|
60637
|
+
|
|
60638
|
+
} else if ( Array.isArray( array ) ) {
|
|
60639
|
+
|
|
60640
|
+
lineSegments = new Float32Array( array );
|
|
60641
|
+
|
|
60642
|
+
}
|
|
60643
|
+
|
|
60644
|
+
const instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz
|
|
60645
|
+
|
|
60646
|
+
this.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz
|
|
60647
|
+
this.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz
|
|
60648
|
+
|
|
60649
|
+
this.instanceCount = this.attributes.instanceStart.count;
|
|
60650
|
+
|
|
60651
|
+
//
|
|
60652
|
+
|
|
60653
|
+
this.computeBoundingBox();
|
|
60654
|
+
this.computeBoundingSphere();
|
|
60655
|
+
|
|
60656
|
+
return this;
|
|
60657
|
+
|
|
60658
|
+
}
|
|
60659
|
+
|
|
60660
|
+
setColors( array ) {
|
|
60661
|
+
|
|
60662
|
+
let colors;
|
|
60663
|
+
|
|
60664
|
+
if ( array instanceof Float32Array ) {
|
|
60665
|
+
|
|
60666
|
+
colors = array;
|
|
60667
|
+
|
|
60668
|
+
} else if ( Array.isArray( array ) ) {
|
|
60669
|
+
|
|
60670
|
+
colors = new Float32Array( array );
|
|
60671
|
+
|
|
60672
|
+
}
|
|
60673
|
+
|
|
60674
|
+
const instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb
|
|
60675
|
+
|
|
60676
|
+
this.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb
|
|
60677
|
+
this.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb
|
|
60678
|
+
|
|
60679
|
+
return this;
|
|
60680
|
+
|
|
60681
|
+
}
|
|
60682
|
+
|
|
60683
|
+
fromWireframeGeometry( geometry ) {
|
|
60684
|
+
|
|
60685
|
+
this.setPositions( geometry.attributes.position.array );
|
|
60686
|
+
|
|
60687
|
+
return this;
|
|
60688
|
+
|
|
60689
|
+
}
|
|
60690
|
+
|
|
60691
|
+
fromEdgesGeometry( geometry ) {
|
|
60692
|
+
|
|
60693
|
+
this.setPositions( geometry.attributes.position.array );
|
|
60694
|
+
|
|
60695
|
+
return this;
|
|
60696
|
+
|
|
60697
|
+
}
|
|
60698
|
+
|
|
60699
|
+
fromMesh( mesh ) {
|
|
60700
|
+
|
|
60701
|
+
this.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );
|
|
60702
|
+
|
|
60703
|
+
// set colors, maybe
|
|
60704
|
+
|
|
60705
|
+
return this;
|
|
60706
|
+
|
|
60707
|
+
}
|
|
60708
|
+
|
|
60709
|
+
fromLineSegments( lineSegments ) {
|
|
60710
|
+
|
|
60711
|
+
const geometry = lineSegments.geometry;
|
|
60712
|
+
|
|
60713
|
+
this.setPositions( geometry.attributes.position.array ); // assumes non-indexed
|
|
60714
|
+
|
|
60715
|
+
// set colors, maybe
|
|
60716
|
+
|
|
60717
|
+
return this;
|
|
60718
|
+
|
|
60719
|
+
}
|
|
60720
|
+
|
|
60721
|
+
computeBoundingBox() {
|
|
60722
|
+
|
|
60723
|
+
if ( this.boundingBox === null ) {
|
|
60724
|
+
|
|
60725
|
+
this.boundingBox = new Box3();
|
|
60726
|
+
|
|
60727
|
+
}
|
|
60728
|
+
|
|
60729
|
+
const start = this.attributes.instanceStart;
|
|
60730
|
+
const end = this.attributes.instanceEnd;
|
|
60731
|
+
|
|
60732
|
+
if ( start !== undefined && end !== undefined ) {
|
|
60733
|
+
|
|
60734
|
+
this.boundingBox.setFromBufferAttribute( start );
|
|
60735
|
+
|
|
60736
|
+
_box.setFromBufferAttribute( end );
|
|
60737
|
+
|
|
60738
|
+
this.boundingBox.union( _box );
|
|
60739
|
+
|
|
60740
|
+
}
|
|
60741
|
+
|
|
60742
|
+
}
|
|
60743
|
+
|
|
60744
|
+
computeBoundingSphere() {
|
|
60745
|
+
|
|
60746
|
+
if ( this.boundingSphere === null ) {
|
|
60747
|
+
|
|
60748
|
+
this.boundingSphere = new Sphere();
|
|
60749
|
+
|
|
60750
|
+
}
|
|
60751
|
+
|
|
60752
|
+
if ( this.boundingBox === null ) {
|
|
60753
|
+
|
|
60754
|
+
this.computeBoundingBox();
|
|
60755
|
+
|
|
60756
|
+
}
|
|
60757
|
+
|
|
60758
|
+
const start = this.attributes.instanceStart;
|
|
60759
|
+
const end = this.attributes.instanceEnd;
|
|
60760
|
+
|
|
60761
|
+
if ( start !== undefined && end !== undefined ) {
|
|
60762
|
+
|
|
60763
|
+
const center = this.boundingSphere.center;
|
|
60764
|
+
|
|
60765
|
+
this.boundingBox.getCenter( center );
|
|
60766
|
+
|
|
60767
|
+
let maxRadiusSq = 0;
|
|
60768
|
+
|
|
60769
|
+
for ( let i = 0, il = start.count; i < il; i ++ ) {
|
|
60770
|
+
|
|
60771
|
+
_vector.fromBufferAttribute( start, i );
|
|
60772
|
+
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );
|
|
60773
|
+
|
|
60774
|
+
_vector.fromBufferAttribute( end, i );
|
|
60775
|
+
maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );
|
|
60776
|
+
|
|
60777
|
+
}
|
|
60778
|
+
|
|
60779
|
+
this.boundingSphere.radius = Math.sqrt( maxRadiusSq );
|
|
60780
|
+
|
|
60781
|
+
if ( isNaN( this.boundingSphere.radius ) ) {
|
|
60782
|
+
|
|
60783
|
+
console.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );
|
|
60784
|
+
|
|
60785
|
+
}
|
|
60786
|
+
|
|
60787
|
+
}
|
|
60788
|
+
|
|
60789
|
+
}
|
|
60790
|
+
|
|
60791
|
+
toJSON() {
|
|
60792
|
+
|
|
60793
|
+
// todo
|
|
60794
|
+
|
|
60795
|
+
}
|
|
60796
|
+
|
|
60797
|
+
applyMatrix( matrix ) {
|
|
60798
|
+
|
|
60799
|
+
console.warn( 'THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().' );
|
|
60800
|
+
|
|
60801
|
+
return this.applyMatrix4( matrix );
|
|
60802
|
+
|
|
60803
|
+
}
|
|
60804
|
+
|
|
60805
|
+
}
|
|
60806
|
+
|
|
60807
|
+
UniformsLib.line = {
|
|
60808
|
+
|
|
60809
|
+
worldUnits: { value: 1 },
|
|
60810
|
+
linewidth: { value: 1 },
|
|
60811
|
+
resolution: { value: new Vector2( 1, 1 ) },
|
|
60812
|
+
dashOffset: { value: 0 },
|
|
60813
|
+
dashScale: { value: 1 },
|
|
60814
|
+
dashSize: { value: 1 },
|
|
60815
|
+
gapSize: { value: 1 } // todo FIX - maybe change to totalSize
|
|
60816
|
+
|
|
60817
|
+
};
|
|
60818
|
+
|
|
60819
|
+
ShaderLib[ 'line' ] = {
|
|
60820
|
+
|
|
60821
|
+
uniforms: UniformsUtils.merge( [
|
|
60822
|
+
UniformsLib.common,
|
|
60823
|
+
UniformsLib.fog,
|
|
60824
|
+
UniformsLib.line
|
|
60825
|
+
] ),
|
|
60826
|
+
|
|
60827
|
+
vertexShader:
|
|
60828
|
+
/* glsl */`
|
|
60829
|
+
#include <common>
|
|
60830
|
+
#include <color_pars_vertex>
|
|
60831
|
+
#include <fog_pars_vertex>
|
|
60832
|
+
#include <logdepthbuf_pars_vertex>
|
|
60833
|
+
#include <clipping_planes_pars_vertex>
|
|
60834
|
+
|
|
60835
|
+
uniform float linewidth;
|
|
60836
|
+
uniform vec2 resolution;
|
|
60837
|
+
|
|
60838
|
+
attribute vec3 instanceStart;
|
|
60839
|
+
attribute vec3 instanceEnd;
|
|
60840
|
+
|
|
60841
|
+
attribute vec3 instanceColorStart;
|
|
60842
|
+
attribute vec3 instanceColorEnd;
|
|
60843
|
+
|
|
60844
|
+
#ifdef WORLD_UNITS
|
|
60845
|
+
|
|
60846
|
+
varying vec4 worldPos;
|
|
60847
|
+
varying vec3 worldStart;
|
|
60848
|
+
varying vec3 worldEnd;
|
|
60849
|
+
|
|
60850
|
+
#ifdef USE_DASH
|
|
60851
|
+
|
|
60852
|
+
varying vec2 vUv;
|
|
60853
|
+
|
|
60854
|
+
#endif
|
|
60855
|
+
|
|
60856
|
+
#else
|
|
60857
|
+
|
|
60858
|
+
varying vec2 vUv;
|
|
60859
|
+
|
|
60860
|
+
#endif
|
|
60861
|
+
|
|
60862
|
+
#ifdef USE_DASH
|
|
60863
|
+
|
|
60864
|
+
uniform float dashScale;
|
|
60865
|
+
attribute float instanceDistanceStart;
|
|
60866
|
+
attribute float instanceDistanceEnd;
|
|
60867
|
+
varying float vLineDistance;
|
|
60868
|
+
|
|
60869
|
+
#endif
|
|
60870
|
+
|
|
60871
|
+
void trimSegment( const in vec4 start, inout vec4 end ) {
|
|
60872
|
+
|
|
60873
|
+
// trim end segment so it terminates between the camera plane and the near plane
|
|
60874
|
+
|
|
60875
|
+
// conservative estimate of the near plane
|
|
60876
|
+
float a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column
|
|
60877
|
+
float b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column
|
|
60878
|
+
float nearEstimate = - 0.5 * b / a;
|
|
60879
|
+
|
|
60880
|
+
float alpha = ( nearEstimate - start.z ) / ( end.z - start.z );
|
|
60881
|
+
|
|
60882
|
+
end.xyz = mix( start.xyz, end.xyz, alpha );
|
|
60883
|
+
|
|
60884
|
+
}
|
|
60885
|
+
|
|
60886
|
+
void main() {
|
|
60887
|
+
|
|
60888
|
+
#ifdef USE_COLOR
|
|
60889
|
+
|
|
60890
|
+
vColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;
|
|
60891
|
+
|
|
60892
|
+
#endif
|
|
60893
|
+
|
|
60894
|
+
#ifdef USE_DASH
|
|
60895
|
+
|
|
60896
|
+
vLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;
|
|
60897
|
+
vUv = uv;
|
|
60898
|
+
|
|
60899
|
+
#endif
|
|
60900
|
+
|
|
60901
|
+
float aspect = resolution.x / resolution.y;
|
|
60902
|
+
|
|
60903
|
+
// camera space
|
|
60904
|
+
vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );
|
|
60905
|
+
vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );
|
|
60906
|
+
|
|
60907
|
+
#ifdef WORLD_UNITS
|
|
60908
|
+
|
|
60909
|
+
worldStart = start.xyz;
|
|
60910
|
+
worldEnd = end.xyz;
|
|
60911
|
+
|
|
60912
|
+
#else
|
|
60913
|
+
|
|
60914
|
+
vUv = uv;
|
|
60915
|
+
|
|
60916
|
+
#endif
|
|
60917
|
+
|
|
60918
|
+
// special case for perspective projection, and segments that terminate either in, or behind, the camera plane
|
|
60919
|
+
// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space
|
|
60920
|
+
// but we need to perform ndc-space calculations in the shader, so we must address this issue directly
|
|
60921
|
+
// perhaps there is a more elegant solution -- WestLangley
|
|
60922
|
+
|
|
60923
|
+
bool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column
|
|
60924
|
+
|
|
60925
|
+
if ( perspective ) {
|
|
60926
|
+
|
|
60927
|
+
if ( start.z < 0.0 && end.z >= 0.0 ) {
|
|
60928
|
+
|
|
60929
|
+
trimSegment( start, end );
|
|
60930
|
+
|
|
60931
|
+
} else if ( end.z < 0.0 && start.z >= 0.0 ) {
|
|
60932
|
+
|
|
60933
|
+
trimSegment( end, start );
|
|
60934
|
+
|
|
60935
|
+
}
|
|
60936
|
+
|
|
60937
|
+
}
|
|
60938
|
+
|
|
60939
|
+
// clip space
|
|
60940
|
+
vec4 clipStart = projectionMatrix * start;
|
|
60941
|
+
vec4 clipEnd = projectionMatrix * end;
|
|
60942
|
+
|
|
60943
|
+
// ndc space
|
|
60944
|
+
vec3 ndcStart = clipStart.xyz / clipStart.w;
|
|
60945
|
+
vec3 ndcEnd = clipEnd.xyz / clipEnd.w;
|
|
60946
|
+
|
|
60947
|
+
// direction
|
|
60948
|
+
vec2 dir = ndcEnd.xy - ndcStart.xy;
|
|
60949
|
+
|
|
60950
|
+
// account for clip-space aspect ratio
|
|
60951
|
+
dir.x *= aspect;
|
|
60952
|
+
dir = normalize( dir );
|
|
60953
|
+
|
|
60954
|
+
#ifdef WORLD_UNITS
|
|
60955
|
+
|
|
60956
|
+
vec3 worldDir = normalize( end.xyz - start.xyz );
|
|
60957
|
+
vec3 tmpFwd = normalize( mix( start.xyz, end.xyz, 0.5 ) );
|
|
60958
|
+
vec3 worldUp = normalize( cross( worldDir, tmpFwd ) );
|
|
60959
|
+
vec3 worldFwd = cross( worldDir, worldUp );
|
|
60960
|
+
worldPos = position.y < 0.5 ? start: end;
|
|
60961
|
+
|
|
60962
|
+
// height offset
|
|
60963
|
+
float hw = linewidth * 0.5;
|
|
60964
|
+
worldPos.xyz += position.x < 0.0 ? hw * worldUp : - hw * worldUp;
|
|
60965
|
+
|
|
60966
|
+
// don't extend the line if we're rendering dashes because we
|
|
60967
|
+
// won't be rendering the endcaps
|
|
60968
|
+
#ifndef USE_DASH
|
|
60969
|
+
|
|
60970
|
+
// cap extension
|
|
60971
|
+
worldPos.xyz += position.y < 0.5 ? - hw * worldDir : hw * worldDir;
|
|
60972
|
+
|
|
60973
|
+
// add width to the box
|
|
60974
|
+
worldPos.xyz += worldFwd * hw;
|
|
60975
|
+
|
|
60976
|
+
// endcaps
|
|
60977
|
+
if ( position.y > 1.0 || position.y < 0.0 ) {
|
|
60978
|
+
|
|
60979
|
+
worldPos.xyz -= worldFwd * 2.0 * hw;
|
|
60980
|
+
|
|
60981
|
+
}
|
|
60982
|
+
|
|
60983
|
+
#endif
|
|
60984
|
+
|
|
60985
|
+
// project the worldpos
|
|
60986
|
+
vec4 clip = projectionMatrix * worldPos;
|
|
60987
|
+
|
|
60988
|
+
// shift the depth of the projected points so the line
|
|
60989
|
+
// segments overlap neatly
|
|
60990
|
+
vec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;
|
|
60991
|
+
clip.z = clipPose.z * clip.w;
|
|
60992
|
+
|
|
60993
|
+
#else
|
|
60994
|
+
|
|
60995
|
+
vec2 offset = vec2( dir.y, - dir.x );
|
|
60996
|
+
// undo aspect ratio adjustment
|
|
60997
|
+
dir.x /= aspect;
|
|
60998
|
+
offset.x /= aspect;
|
|
60999
|
+
|
|
61000
|
+
// sign flip
|
|
61001
|
+
if ( position.x < 0.0 ) offset *= - 1.0;
|
|
61002
|
+
|
|
61003
|
+
// endcaps
|
|
61004
|
+
if ( position.y < 0.0 ) {
|
|
61005
|
+
|
|
61006
|
+
offset += - dir;
|
|
61007
|
+
|
|
61008
|
+
} else if ( position.y > 1.0 ) {
|
|
61009
|
+
|
|
61010
|
+
offset += dir;
|
|
61011
|
+
|
|
61012
|
+
}
|
|
61013
|
+
|
|
61014
|
+
// adjust for linewidth
|
|
61015
|
+
offset *= linewidth;
|
|
61016
|
+
|
|
61017
|
+
// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...
|
|
61018
|
+
offset /= resolution.y;
|
|
61019
|
+
|
|
61020
|
+
// select end
|
|
61021
|
+
vec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;
|
|
61022
|
+
|
|
61023
|
+
// back to clip space
|
|
61024
|
+
offset *= clip.w;
|
|
61025
|
+
|
|
61026
|
+
clip.xy += offset;
|
|
61027
|
+
|
|
61028
|
+
#endif
|
|
61029
|
+
|
|
61030
|
+
gl_Position = clip;
|
|
61031
|
+
|
|
61032
|
+
vec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation
|
|
61033
|
+
|
|
61034
|
+
#include <logdepthbuf_vertex>
|
|
61035
|
+
#include <clipping_planes_vertex>
|
|
61036
|
+
#include <fog_vertex>
|
|
61037
|
+
|
|
61038
|
+
}
|
|
61039
|
+
`,
|
|
61040
|
+
|
|
61041
|
+
fragmentShader:
|
|
61042
|
+
/* glsl */`
|
|
61043
|
+
uniform vec3 diffuse;
|
|
61044
|
+
uniform float opacity;
|
|
61045
|
+
uniform float linewidth;
|
|
61046
|
+
|
|
61047
|
+
#ifdef USE_DASH
|
|
61048
|
+
|
|
61049
|
+
uniform float dashOffset;
|
|
61050
|
+
uniform float dashSize;
|
|
61051
|
+
uniform float gapSize;
|
|
61052
|
+
|
|
61053
|
+
#endif
|
|
61054
|
+
|
|
61055
|
+
varying float vLineDistance;
|
|
61056
|
+
|
|
61057
|
+
#ifdef WORLD_UNITS
|
|
61058
|
+
|
|
61059
|
+
varying vec4 worldPos;
|
|
61060
|
+
varying vec3 worldStart;
|
|
61061
|
+
varying vec3 worldEnd;
|
|
61062
|
+
|
|
61063
|
+
#ifdef USE_DASH
|
|
61064
|
+
|
|
61065
|
+
varying vec2 vUv;
|
|
61066
|
+
|
|
61067
|
+
#endif
|
|
61068
|
+
|
|
61069
|
+
#else
|
|
61070
|
+
|
|
61071
|
+
varying vec2 vUv;
|
|
61072
|
+
|
|
61073
|
+
#endif
|
|
61074
|
+
|
|
61075
|
+
#include <common>
|
|
61076
|
+
#include <color_pars_fragment>
|
|
61077
|
+
#include <fog_pars_fragment>
|
|
61078
|
+
#include <logdepthbuf_pars_fragment>
|
|
61079
|
+
#include <clipping_planes_pars_fragment>
|
|
61080
|
+
|
|
61081
|
+
vec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {
|
|
61082
|
+
|
|
61083
|
+
float mua;
|
|
61084
|
+
float mub;
|
|
61085
|
+
|
|
61086
|
+
vec3 p13 = p1 - p3;
|
|
61087
|
+
vec3 p43 = p4 - p3;
|
|
61088
|
+
|
|
61089
|
+
vec3 p21 = p2 - p1;
|
|
61090
|
+
|
|
61091
|
+
float d1343 = dot( p13, p43 );
|
|
61092
|
+
float d4321 = dot( p43, p21 );
|
|
61093
|
+
float d1321 = dot( p13, p21 );
|
|
61094
|
+
float d4343 = dot( p43, p43 );
|
|
61095
|
+
float d2121 = dot( p21, p21 );
|
|
61096
|
+
|
|
61097
|
+
float denom = d2121 * d4343 - d4321 * d4321;
|
|
61098
|
+
|
|
61099
|
+
float numer = d1343 * d4321 - d1321 * d4343;
|
|
61100
|
+
|
|
61101
|
+
mua = numer / denom;
|
|
61102
|
+
mua = clamp( mua, 0.0, 1.0 );
|
|
61103
|
+
mub = ( d1343 + d4321 * ( mua ) ) / d4343;
|
|
61104
|
+
mub = clamp( mub, 0.0, 1.0 );
|
|
61105
|
+
|
|
61106
|
+
return vec2( mua, mub );
|
|
61107
|
+
|
|
61108
|
+
}
|
|
61109
|
+
|
|
61110
|
+
void main() {
|
|
61111
|
+
|
|
61112
|
+
#include <clipping_planes_fragment>
|
|
61113
|
+
|
|
61114
|
+
#ifdef USE_DASH
|
|
61115
|
+
|
|
61116
|
+
if ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps
|
|
61117
|
+
|
|
61118
|
+
if ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX
|
|
61119
|
+
|
|
61120
|
+
#endif
|
|
61121
|
+
|
|
61122
|
+
float alpha = opacity;
|
|
61123
|
+
|
|
61124
|
+
#ifdef WORLD_UNITS
|
|
61125
|
+
|
|
61126
|
+
// Find the closest points on the view ray and the line segment
|
|
61127
|
+
vec3 rayEnd = normalize( worldPos.xyz ) * 1e5;
|
|
61128
|
+
vec3 lineDir = worldEnd - worldStart;
|
|
61129
|
+
vec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );
|
|
61130
|
+
|
|
61131
|
+
vec3 p1 = worldStart + lineDir * params.x;
|
|
61132
|
+
vec3 p2 = rayEnd * params.y;
|
|
61133
|
+
vec3 delta = p1 - p2;
|
|
61134
|
+
float len = length( delta );
|
|
61135
|
+
float norm = len / linewidth;
|
|
61136
|
+
|
|
61137
|
+
#ifndef USE_DASH
|
|
61138
|
+
|
|
61139
|
+
#ifdef USE_ALPHA_TO_COVERAGE
|
|
61140
|
+
|
|
61141
|
+
float dnorm = fwidth( norm );
|
|
61142
|
+
alpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );
|
|
61143
|
+
|
|
61144
|
+
#else
|
|
61145
|
+
|
|
61146
|
+
if ( norm > 0.5 ) {
|
|
61147
|
+
|
|
61148
|
+
discard;
|
|
61149
|
+
|
|
61150
|
+
}
|
|
61151
|
+
|
|
61152
|
+
#endif
|
|
61153
|
+
|
|
61154
|
+
#endif
|
|
61155
|
+
|
|
61156
|
+
#else
|
|
61157
|
+
|
|
61158
|
+
#ifdef USE_ALPHA_TO_COVERAGE
|
|
61159
|
+
|
|
61160
|
+
// artifacts appear on some hardware if a derivative is taken within a conditional
|
|
61161
|
+
float a = vUv.x;
|
|
61162
|
+
float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
|
|
61163
|
+
float len2 = a * a + b * b;
|
|
61164
|
+
float dlen = fwidth( len2 );
|
|
61165
|
+
|
|
61166
|
+
if ( abs( vUv.y ) > 1.0 ) {
|
|
61167
|
+
|
|
61168
|
+
alpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );
|
|
61169
|
+
|
|
61170
|
+
}
|
|
61171
|
+
|
|
61172
|
+
#else
|
|
61173
|
+
|
|
61174
|
+
if ( abs( vUv.y ) > 1.0 ) {
|
|
61175
|
+
|
|
61176
|
+
float a = vUv.x;
|
|
61177
|
+
float b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;
|
|
61178
|
+
float len2 = a * a + b * b;
|
|
61179
|
+
|
|
61180
|
+
if ( len2 > 1.0 ) discard;
|
|
61181
|
+
|
|
61182
|
+
}
|
|
61183
|
+
|
|
61184
|
+
#endif
|
|
61185
|
+
|
|
61186
|
+
#endif
|
|
61187
|
+
|
|
61188
|
+
vec4 diffuseColor = vec4( diffuse, alpha );
|
|
61189
|
+
|
|
61190
|
+
#include <logdepthbuf_fragment>
|
|
61191
|
+
#include <color_fragment>
|
|
61192
|
+
|
|
61193
|
+
gl_FragColor = vec4( diffuseColor.rgb, alpha );
|
|
61194
|
+
|
|
61195
|
+
#include <tonemapping_fragment>
|
|
61196
|
+
#include <colorspace_fragment>
|
|
61197
|
+
#include <fog_fragment>
|
|
61198
|
+
#include <premultiplied_alpha_fragment>
|
|
61199
|
+
|
|
61200
|
+
}
|
|
61201
|
+
`
|
|
61202
|
+
};
|
|
61203
|
+
|
|
61204
|
+
class LineMaterial extends ShaderMaterial {
|
|
61205
|
+
|
|
61206
|
+
constructor( parameters ) {
|
|
61207
|
+
|
|
61208
|
+
super( {
|
|
61209
|
+
|
|
61210
|
+
type: 'LineMaterial',
|
|
61211
|
+
uniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),
|
|
61212
|
+
|
|
61213
|
+
vertexShader: ShaderLib[ 'line' ].vertexShader,
|
|
61214
|
+
fragmentShader: ShaderLib[ 'line' ].fragmentShader,
|
|
61215
|
+
|
|
61216
|
+
clipping: true // required for clipping support
|
|
61217
|
+
|
|
61218
|
+
} );
|
|
61219
|
+
|
|
61220
|
+
this.isLineMaterial = true;
|
|
61221
|
+
|
|
61222
|
+
this.setValues( parameters );
|
|
61223
|
+
|
|
61224
|
+
}
|
|
61225
|
+
|
|
61226
|
+
get color() {
|
|
61227
|
+
|
|
61228
|
+
return this.uniforms.diffuse.value;
|
|
61229
|
+
|
|
61230
|
+
}
|
|
61231
|
+
|
|
61232
|
+
set color( value ) {
|
|
61233
|
+
|
|
61234
|
+
this.uniforms.diffuse.value = value;
|
|
61235
|
+
|
|
61236
|
+
}
|
|
61237
|
+
|
|
61238
|
+
get worldUnits() {
|
|
61239
|
+
|
|
61240
|
+
return 'WORLD_UNITS' in this.defines;
|
|
61241
|
+
|
|
61242
|
+
}
|
|
61243
|
+
|
|
61244
|
+
set worldUnits( value ) {
|
|
61245
|
+
|
|
61246
|
+
if ( value === true ) {
|
|
61247
|
+
|
|
61248
|
+
this.defines.WORLD_UNITS = '';
|
|
61249
|
+
|
|
61250
|
+
} else {
|
|
61251
|
+
|
|
61252
|
+
delete this.defines.WORLD_UNITS;
|
|
61253
|
+
|
|
61254
|
+
}
|
|
61255
|
+
|
|
61256
|
+
}
|
|
61257
|
+
|
|
61258
|
+
get linewidth() {
|
|
61259
|
+
|
|
61260
|
+
return this.uniforms.linewidth.value;
|
|
61261
|
+
|
|
61262
|
+
}
|
|
61263
|
+
|
|
61264
|
+
set linewidth( value ) {
|
|
61265
|
+
|
|
61266
|
+
if ( ! this.uniforms.linewidth ) return;
|
|
61267
|
+
this.uniforms.linewidth.value = value;
|
|
61268
|
+
|
|
61269
|
+
}
|
|
61270
|
+
|
|
61271
|
+
get dashed() {
|
|
61272
|
+
|
|
61273
|
+
return 'USE_DASH' in this.defines;
|
|
61274
|
+
|
|
61275
|
+
}
|
|
61276
|
+
|
|
61277
|
+
set dashed( value ) {
|
|
61278
|
+
|
|
61279
|
+
if ( ( value === true ) !== this.dashed ) {
|
|
61280
|
+
|
|
61281
|
+
this.needsUpdate = true;
|
|
61282
|
+
|
|
61283
|
+
}
|
|
61284
|
+
|
|
61285
|
+
if ( value === true ) {
|
|
61286
|
+
|
|
61287
|
+
this.defines.USE_DASH = '';
|
|
61288
|
+
|
|
61289
|
+
} else {
|
|
61290
|
+
|
|
61291
|
+
delete this.defines.USE_DASH;
|
|
61292
|
+
|
|
61293
|
+
}
|
|
61294
|
+
|
|
61295
|
+
}
|
|
61296
|
+
|
|
61297
|
+
get dashScale() {
|
|
61298
|
+
|
|
61299
|
+
return this.uniforms.dashScale.value;
|
|
61300
|
+
|
|
61301
|
+
}
|
|
61302
|
+
|
|
61303
|
+
set dashScale( value ) {
|
|
61304
|
+
|
|
61305
|
+
this.uniforms.dashScale.value = value;
|
|
61306
|
+
|
|
61307
|
+
}
|
|
61308
|
+
|
|
61309
|
+
get dashSize() {
|
|
61310
|
+
|
|
61311
|
+
return this.uniforms.dashSize.value;
|
|
61312
|
+
|
|
61313
|
+
}
|
|
61314
|
+
|
|
61315
|
+
set dashSize( value ) {
|
|
61316
|
+
|
|
61317
|
+
this.uniforms.dashSize.value = value;
|
|
61318
|
+
|
|
61319
|
+
}
|
|
61320
|
+
|
|
61321
|
+
get dashOffset() {
|
|
61322
|
+
|
|
61323
|
+
return this.uniforms.dashOffset.value;
|
|
61324
|
+
|
|
61325
|
+
}
|
|
61326
|
+
|
|
61327
|
+
set dashOffset( value ) {
|
|
61328
|
+
|
|
61329
|
+
this.uniforms.dashOffset.value = value;
|
|
61330
|
+
|
|
61331
|
+
}
|
|
61332
|
+
|
|
61333
|
+
get gapSize() {
|
|
61334
|
+
|
|
61335
|
+
return this.uniforms.gapSize.value;
|
|
61336
|
+
|
|
61337
|
+
}
|
|
61338
|
+
|
|
61339
|
+
set gapSize( value ) {
|
|
61340
|
+
|
|
61341
|
+
this.uniforms.gapSize.value = value;
|
|
61342
|
+
|
|
61343
|
+
}
|
|
61344
|
+
|
|
61345
|
+
get opacity() {
|
|
61346
|
+
|
|
61347
|
+
return this.uniforms.opacity.value;
|
|
61348
|
+
|
|
61349
|
+
}
|
|
61350
|
+
|
|
61351
|
+
set opacity( value ) {
|
|
61352
|
+
|
|
61353
|
+
if ( ! this.uniforms ) return;
|
|
61354
|
+
this.uniforms.opacity.value = value;
|
|
61355
|
+
|
|
61356
|
+
}
|
|
61357
|
+
|
|
61358
|
+
get resolution() {
|
|
61359
|
+
|
|
61360
|
+
return this.uniforms.resolution.value;
|
|
61361
|
+
|
|
61362
|
+
}
|
|
61363
|
+
|
|
61364
|
+
set resolution( value ) {
|
|
61365
|
+
|
|
61366
|
+
this.uniforms.resolution.value.copy( value );
|
|
61367
|
+
|
|
61368
|
+
}
|
|
61369
|
+
|
|
61370
|
+
get alphaToCoverage() {
|
|
61371
|
+
|
|
61372
|
+
return 'USE_ALPHA_TO_COVERAGE' in this.defines;
|
|
61373
|
+
|
|
61374
|
+
}
|
|
61375
|
+
|
|
61376
|
+
set alphaToCoverage( value ) {
|
|
61377
|
+
|
|
61378
|
+
if ( ! this.defines ) return;
|
|
61379
|
+
|
|
61380
|
+
if ( ( value === true ) !== this.alphaToCoverage ) {
|
|
61381
|
+
|
|
61382
|
+
this.needsUpdate = true;
|
|
61383
|
+
|
|
61384
|
+
}
|
|
61385
|
+
|
|
61386
|
+
if ( value === true ) {
|
|
61387
|
+
|
|
61388
|
+
this.defines.USE_ALPHA_TO_COVERAGE = '';
|
|
61389
|
+
|
|
61390
|
+
} else {
|
|
61391
|
+
|
|
61392
|
+
delete this.defines.USE_ALPHA_TO_COVERAGE;
|
|
61393
|
+
|
|
61394
|
+
}
|
|
61395
|
+
|
|
61396
|
+
}
|
|
61397
|
+
|
|
61398
|
+
}
|
|
61399
|
+
|
|
61400
|
+
const _start = new Vector3();
|
|
61401
|
+
const _end = new Vector3();
|
|
61402
|
+
const _viewport = new Vector4();
|
|
61403
|
+
|
|
61404
|
+
class Wireframe extends Mesh {
|
|
61405
|
+
|
|
61406
|
+
constructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {
|
|
61407
|
+
|
|
61408
|
+
super( geometry, material );
|
|
61409
|
+
|
|
61410
|
+
this.isWireframe = true;
|
|
61411
|
+
|
|
61412
|
+
this.type = 'Wireframe';
|
|
61413
|
+
|
|
61414
|
+
}
|
|
61415
|
+
|
|
61416
|
+
// for backwards-compatibility, but could be a method of LineSegmentsGeometry...
|
|
61417
|
+
|
|
61418
|
+
computeLineDistances() {
|
|
61419
|
+
|
|
61420
|
+
const geometry = this.geometry;
|
|
61421
|
+
|
|
61422
|
+
const instanceStart = geometry.attributes.instanceStart;
|
|
61423
|
+
const instanceEnd = geometry.attributes.instanceEnd;
|
|
61424
|
+
const lineDistances = new Float32Array( 2 * instanceStart.count );
|
|
61425
|
+
|
|
61426
|
+
for ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {
|
|
61427
|
+
|
|
61428
|
+
_start.fromBufferAttribute( instanceStart, i );
|
|
61429
|
+
_end.fromBufferAttribute( instanceEnd, i );
|
|
61430
|
+
|
|
61431
|
+
lineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];
|
|
61432
|
+
lineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );
|
|
61433
|
+
|
|
61434
|
+
}
|
|
61435
|
+
|
|
61436
|
+
const instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1
|
|
61437
|
+
|
|
61438
|
+
geometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0
|
|
61439
|
+
geometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1
|
|
61440
|
+
|
|
61441
|
+
return this;
|
|
61442
|
+
|
|
61443
|
+
}
|
|
61444
|
+
|
|
61445
|
+
onBeforeRender( renderer ) {
|
|
61446
|
+
|
|
61447
|
+
const uniforms = this.material.uniforms;
|
|
61448
|
+
|
|
61449
|
+
if ( uniforms && uniforms.resolution ) {
|
|
61450
|
+
|
|
61451
|
+
renderer.getViewport( _viewport );
|
|
61452
|
+
this.material.uniforms.resolution.value.set( _viewport.z, _viewport.w );
|
|
61453
|
+
|
|
61454
|
+
}
|
|
61455
|
+
|
|
61456
|
+
}
|
|
61457
|
+
|
|
61458
|
+
}
|
|
61459
|
+
|
|
61460
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
61461
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
61462
|
+
// All rights reserved.
|
|
61463
|
+
//
|
|
61464
|
+
// This software and its documentation and related materials are owned by
|
|
61465
|
+
// the Alliance. The software may only be incorporated into application
|
|
61466
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
61467
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
61468
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
61469
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
61470
|
+
// protected by copyright law and international treaty provisions. Application
|
|
61471
|
+
// programs incorporating this software must include the following statement
|
|
61472
|
+
// with their copyright notices:
|
|
61473
|
+
//
|
|
61474
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
61475
|
+
// license agreement with Open Design Alliance.
|
|
61476
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
61477
|
+
// All rights reserved.
|
|
61478
|
+
//
|
|
61479
|
+
// By use of this software, its documentation or related materials, you
|
|
61480
|
+
// acknowledge and accept the above terms.
|
|
61481
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
61482
|
+
class HighlighterUtils {
|
|
61483
|
+
static isBreak(positions, i) {
|
|
61484
|
+
return (isNaN(positions[i]) ||
|
|
61485
|
+
isNaN(positions[i + 1]) ||
|
|
61486
|
+
isNaN(positions[i + 2]) ||
|
|
61487
|
+
positions[i] === Infinity ||
|
|
61488
|
+
positions[i] === -Infinity ||
|
|
61489
|
+
positions[i + 1] === Infinity ||
|
|
61490
|
+
positions[i + 1] === -Infinity ||
|
|
61491
|
+
positions[i + 2] === Infinity ||
|
|
61492
|
+
positions[i + 2] === -Infinity);
|
|
61493
|
+
}
|
|
61494
|
+
static fromIndexedLine(positions, indices) {
|
|
61495
|
+
const lineGeometry = new LineSegmentsGeometry();
|
|
61496
|
+
const segments = [];
|
|
61497
|
+
for (let i = 0; i < indices.length; i += 2) {
|
|
61498
|
+
const idx1 = indices[i] * 3;
|
|
61499
|
+
const idx2 = indices[i + 1] * 3;
|
|
61500
|
+
if (indices[i] === -1 || indices[i + 1] === -1) {
|
|
61501
|
+
continue;
|
|
60355
61502
|
}
|
|
60356
|
-
|
|
60357
|
-
|
|
60358
|
-
|
|
60359
|
-
|
|
60360
|
-
|
|
60361
|
-
|
|
61503
|
+
segments.push(positions[idx1], positions[idx1 + 1], positions[idx1 + 2], positions[idx2], positions[idx2 + 1], positions[idx2 + 2]);
|
|
61504
|
+
}
|
|
61505
|
+
if (segments.length === 0)
|
|
61506
|
+
return null;
|
|
61507
|
+
lineGeometry.setPositions(segments);
|
|
61508
|
+
return lineGeometry;
|
|
61509
|
+
}
|
|
61510
|
+
static fromNonIndexedLine(positions, isLineSegments) {
|
|
61511
|
+
const lineGeometry = new LineSegmentsGeometry();
|
|
61512
|
+
const segments = [];
|
|
61513
|
+
if (isLineSegments) {
|
|
61514
|
+
for (let i = 0; i < positions.length; i += 6) {
|
|
61515
|
+
if (i + 5 >= positions.length)
|
|
61516
|
+
break;
|
|
61517
|
+
if (HighlighterUtils.isBreak(positions, i) || HighlighterUtils.isBreak(positions, i + 3))
|
|
61518
|
+
continue;
|
|
61519
|
+
segments.push(positions[i], positions[i + 1], positions[i + 2], positions[i + 3], positions[i + 4], positions[i + 5]);
|
|
60362
61520
|
}
|
|
60363
|
-
|
|
60364
|
-
|
|
60365
|
-
|
|
61521
|
+
}
|
|
61522
|
+
else {
|
|
61523
|
+
let lastValidIndex = -1;
|
|
61524
|
+
for (let i = 0; i < positions.length; i += 3) {
|
|
61525
|
+
if (HighlighterUtils.isBreak(positions, i)) {
|
|
61526
|
+
lastValidIndex = -1;
|
|
61527
|
+
continue;
|
|
61528
|
+
}
|
|
61529
|
+
if (lastValidIndex !== -1) {
|
|
61530
|
+
segments.push(positions[lastValidIndex], positions[lastValidIndex + 1], positions[lastValidIndex + 2], positions[i], positions[i + 1], positions[i + 2]);
|
|
61531
|
+
}
|
|
61532
|
+
lastValidIndex = i;
|
|
60366
61533
|
}
|
|
60367
|
-
}
|
|
60368
|
-
|
|
60369
|
-
|
|
60370
|
-
|
|
60371
|
-
|
|
60372
|
-
this.viewer.removeEventListener("databasechunk", this.geometryEnd);
|
|
60373
|
-
}
|
|
60374
|
-
}
|
|
60375
|
-
|
|
60376
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60377
|
-
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60378
|
-
// All rights reserved.
|
|
60379
|
-
//
|
|
60380
|
-
// This software and its documentation and related materials are owned by
|
|
60381
|
-
// the Alliance. The software may only be incorporated into application
|
|
60382
|
-
// programs owned by members of the Alliance, subject to a signed
|
|
60383
|
-
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60384
|
-
// Alliance. The structure and organization of this software are the valuable
|
|
60385
|
-
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60386
|
-
// protected by copyright law and international treaty provisions. Application
|
|
60387
|
-
// programs incorporating this software must include the following statement
|
|
60388
|
-
// with their copyright notices:
|
|
60389
|
-
//
|
|
60390
|
-
// This application incorporates Open Design Alliance software pursuant to a
|
|
60391
|
-
// license agreement with Open Design Alliance.
|
|
60392
|
-
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60393
|
-
// All rights reserved.
|
|
60394
|
-
//
|
|
60395
|
-
// By use of this software, its documentation or related materials, you
|
|
60396
|
-
// acknowledge and accept the above terms.
|
|
60397
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60398
|
-
class ExtentsComponent {
|
|
60399
|
-
constructor(viewer) {
|
|
60400
|
-
this.syncExtents = () => {
|
|
60401
|
-
const extents = new Box3();
|
|
60402
|
-
this.viewer.scene.traverseVisible((object) => !object.children.length && extents.expandByObject(object));
|
|
60403
|
-
this.viewer.extents.copy(extents);
|
|
60404
|
-
};
|
|
60405
|
-
this.viewer = viewer;
|
|
60406
|
-
this.viewer.addEventListener("databasechunk", this.syncExtents);
|
|
60407
|
-
this.viewer.addEventListener("clear", this.syncExtents);
|
|
60408
|
-
this.viewer.on("explode", this.syncExtents);
|
|
60409
|
-
this.viewer.on("isolate", this.syncExtents);
|
|
60410
|
-
this.viewer.on("hide", this.syncExtents);
|
|
60411
|
-
this.viewer.on("showall", this.syncExtents);
|
|
60412
|
-
}
|
|
60413
|
-
dispose() {
|
|
60414
|
-
this.viewer.removeEventListener("databasechunk", this.syncExtents);
|
|
60415
|
-
this.viewer.removeEventListener("clear", this.syncExtents);
|
|
60416
|
-
this.viewer.off("explode", this.syncExtents);
|
|
60417
|
-
this.viewer.off("isolate", this.syncExtents);
|
|
60418
|
-
this.viewer.off("hide", this.syncExtents);
|
|
60419
|
-
this.viewer.off("showall", this.syncExtents);
|
|
61534
|
+
}
|
|
61535
|
+
if (segments.length === 0)
|
|
61536
|
+
return null;
|
|
61537
|
+
lineGeometry.setPositions(segments);
|
|
61538
|
+
return lineGeometry;
|
|
60420
61539
|
}
|
|
60421
61540
|
}
|
|
60422
61541
|
|
|
@@ -60442,144 +61561,105 @@ void main() {
|
|
|
60442
61561
|
// By use of this software, its documentation or related materials, you
|
|
60443
61562
|
// acknowledge and accept the above terms.
|
|
60444
61563
|
///////////////////////////////////////////////////////////////////////////////
|
|
60445
|
-
class
|
|
61564
|
+
class HighlighterComponent {
|
|
60446
61565
|
constructor(viewer) {
|
|
60447
61566
|
this.geometryEnd = () => {
|
|
60448
|
-
this.
|
|
60449
|
-
this.
|
|
60450
|
-
|
|
60451
|
-
|
|
60452
|
-
|
|
60453
|
-
|
|
60454
|
-
|
|
60455
|
-
|
|
60456
|
-
this.
|
|
60457
|
-
|
|
60458
|
-
.
|
|
60459
|
-
|
|
60460
|
-
|
|
60461
|
-
|
|
60462
|
-
|
|
60463
|
-
this.
|
|
60464
|
-
|
|
60465
|
-
|
|
60466
|
-
|
|
60467
|
-
|
|
61567
|
+
const { facesColor, facesTransparancy, edgesColor } = this.viewer.options;
|
|
61568
|
+
this.highlightMaterial = new MeshBasicMaterial({
|
|
61569
|
+
color: new Color(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255),
|
|
61570
|
+
transparent: true,
|
|
61571
|
+
opacity: (255 - facesTransparancy) / 255,
|
|
61572
|
+
depthTest: false,
|
|
61573
|
+
depthWrite: false,
|
|
61574
|
+
});
|
|
61575
|
+
this.outlineMaterial = new LineMaterial({
|
|
61576
|
+
color: new Color(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255),
|
|
61577
|
+
linewidth: 1.5,
|
|
61578
|
+
depthTest: false,
|
|
61579
|
+
depthWrite: false,
|
|
61580
|
+
resolution: new Vector2(window.innerWidth, window.innerHeight),
|
|
61581
|
+
});
|
|
61582
|
+
this.highlightLineMaterial = new LineBasicMaterial({
|
|
61583
|
+
color: new Color(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255),
|
|
61584
|
+
depthTest: false,
|
|
61585
|
+
depthWrite: false,
|
|
61586
|
+
});
|
|
61587
|
+
this.highlightLineGlowMaterial = new LineMaterial({
|
|
61588
|
+
color: new Color(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255),
|
|
61589
|
+
linewidth: 5,
|
|
61590
|
+
transparent: true,
|
|
61591
|
+
opacity: 0.8,
|
|
61592
|
+
depthTest: true,
|
|
61593
|
+
depthWrite: true,
|
|
61594
|
+
resolution: new Vector2(window.innerWidth, window.innerHeight),
|
|
61595
|
+
});
|
|
61596
|
+
};
|
|
61597
|
+
this.optionsChange = () => {
|
|
61598
|
+
const { facesColor, facesTransparancy, edgesColor } = this.viewer.options;
|
|
61599
|
+
this.highlightMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);
|
|
61600
|
+
this.highlightMaterial.opacity = (255 - facesTransparancy) / 255;
|
|
61601
|
+
this.outlineMaterial.color.setRGB(edgesColor.r / 255, edgesColor.g / 255, edgesColor.b / 255);
|
|
61602
|
+
this.highlightLineMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);
|
|
61603
|
+
this.highlightLineGlowMaterial.color.setRGB(facesColor.r / 255, facesColor.g / 255, facesColor.b / 255);
|
|
61604
|
+
this.viewer.update();
|
|
60468
61605
|
};
|
|
60469
61606
|
this.viewer = viewer;
|
|
60470
|
-
this.ambientLight = new AmbientLight(0xffffff, 1);
|
|
60471
|
-
this.viewer.scene.add(this.ambientLight);
|
|
60472
|
-
this.directionalLight = new DirectionalLight(0xffffff, 1);
|
|
60473
|
-
this.directionalLight.position.set(0.5, 0, 0.866); // ~60º
|
|
60474
|
-
this.viewer.scene.add(this.directionalLight);
|
|
60475
|
-
this.frontLight = new DirectionalLight(0xffffff, 1.25);
|
|
60476
|
-
this.frontLight.position.set(0, 1, 0);
|
|
60477
|
-
this.viewer.scene.add(this.frontLight);
|
|
60478
|
-
this.hemisphereLight = new HemisphereLight(0xffffff, 0x444444, 1.25);
|
|
60479
|
-
this.hemisphereLight.position.set(0, 0, 1);
|
|
60480
|
-
this.viewer.scene.add(this.hemisphereLight);
|
|
60481
61607
|
this.viewer.addEventListener("databasechunk", this.geometryEnd);
|
|
60482
|
-
this.viewer.addEventListener("
|
|
61608
|
+
this.viewer.addEventListener("optionschange", this.optionsChange);
|
|
61609
|
+
this.viewer.addEventListener("resize", this.viewerResize);
|
|
61610
|
+
this.geometryEnd();
|
|
60483
61611
|
}
|
|
60484
61612
|
dispose() {
|
|
60485
|
-
this.ambientLight.removeFromParent();
|
|
60486
|
-
this.ambientLight.dispose();
|
|
60487
|
-
this.directionalLight.removeFromParent();
|
|
60488
|
-
this.directionalLight.dispose();
|
|
60489
|
-
this.frontLight.removeFromParent();
|
|
60490
|
-
this.frontLight.dispose();
|
|
60491
|
-
this.hemisphereLight.removeFromParent();
|
|
60492
|
-
this.hemisphereLight.dispose();
|
|
60493
61613
|
this.viewer.removeEventListener("databasechunk", this.geometryEnd);
|
|
60494
|
-
this.viewer.removeEventListener("
|
|
60495
|
-
|
|
60496
|
-
}
|
|
60497
|
-
|
|
60498
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60499
|
-
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
60500
|
-
// All rights reserved.
|
|
60501
|
-
//
|
|
60502
|
-
// This software and its documentation and related materials are owned by
|
|
60503
|
-
// the Alliance. The software may only be incorporated into application
|
|
60504
|
-
// programs owned by members of the Alliance, subject to a signed
|
|
60505
|
-
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60506
|
-
// Alliance. The structure and organization of this software are the valuable
|
|
60507
|
-
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60508
|
-
// protected by copyright law and international treaty provisions. Application
|
|
60509
|
-
// programs incorporating this software must include the following statement
|
|
60510
|
-
// with their copyright notices:
|
|
60511
|
-
//
|
|
60512
|
-
// This application incorporates Open Design Alliance software pursuant to a
|
|
60513
|
-
// license agreement with Open Design Alliance.
|
|
60514
|
-
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60515
|
-
// All rights reserved.
|
|
60516
|
-
//
|
|
60517
|
-
// By use of this software, its documentation or related materials, you
|
|
60518
|
-
// acknowledge and accept the above terms.
|
|
60519
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60520
|
-
class RenderLoopComponent {
|
|
60521
|
-
constructor(viewer) {
|
|
60522
|
-
this.animate = (time = 0) => {
|
|
60523
|
-
this.requestId = requestAnimationFrame(this.animate);
|
|
60524
|
-
this.viewer.render(time);
|
|
60525
|
-
};
|
|
60526
|
-
this.viewer = viewer;
|
|
60527
|
-
this.animate();
|
|
61614
|
+
this.viewer.removeEventListener("optionschange", this.optionsChange);
|
|
61615
|
+
this.viewer.removeEventListener("resize", this.viewerResize);
|
|
60528
61616
|
}
|
|
60529
|
-
|
|
60530
|
-
|
|
61617
|
+
highlight(object) {
|
|
61618
|
+
if (object.isHighlighted)
|
|
61619
|
+
return;
|
|
61620
|
+
if (object.isLine || object.isLineSegments) {
|
|
61621
|
+
const positions = object.geometry.attributes.position.array;
|
|
61622
|
+
const indices = object.geometry.index ? object.geometry.index.array : null;
|
|
61623
|
+
const lineGeometry = indices
|
|
61624
|
+
? HighlighterUtils.fromIndexedLine(positions, indices)
|
|
61625
|
+
: HighlighterUtils.fromNonIndexedLine(positions, object.isLineSegments);
|
|
61626
|
+
const wireframe = new Wireframe(lineGeometry, this.highlightLineGlowMaterial);
|
|
61627
|
+
wireframe.position.copy(object.position);
|
|
61628
|
+
wireframe.rotation.copy(object.rotation);
|
|
61629
|
+
wireframe.scale.copy(object.scale);
|
|
61630
|
+
object.parent.add(wireframe);
|
|
61631
|
+
object.userData.highlightwireframe = wireframe;
|
|
61632
|
+
object.userData.originalMaterial = object.material;
|
|
61633
|
+
object.material = this.highlightLineMaterial;
|
|
61634
|
+
object.isHighlighted = true;
|
|
61635
|
+
}
|
|
61636
|
+
else if (object.isMesh) {
|
|
61637
|
+
const edgesGeometry = new EdgesGeometry(object.geometry, 30);
|
|
61638
|
+
const lineGeometry = new LineSegmentsGeometry().fromEdgesGeometry(edgesGeometry);
|
|
61639
|
+
const wireframe = new Wireframe(lineGeometry, this.outlineMaterial);
|
|
61640
|
+
wireframe.position.copy(object.position);
|
|
61641
|
+
wireframe.rotation.copy(object.rotation);
|
|
61642
|
+
wireframe.scale.copy(object.scale);
|
|
61643
|
+
object.parent.add(wireframe);
|
|
61644
|
+
object.userData.highlightwireframe = wireframe;
|
|
61645
|
+
object.userData.originalMaterial = object.material;
|
|
61646
|
+
object.material = this.highlightMaterial;
|
|
61647
|
+
object.isHighlighted = true;
|
|
61648
|
+
}
|
|
60531
61649
|
}
|
|
60532
|
-
|
|
60533
|
-
|
|
60534
|
-
|
|
60535
|
-
|
|
60536
|
-
|
|
60537
|
-
|
|
60538
|
-
|
|
60539
|
-
|
|
60540
|
-
// programs owned by members of the Alliance, subject to a signed
|
|
60541
|
-
// Membership Agreement and Supplemental Software License Agreement with the
|
|
60542
|
-
// Alliance. The structure and organization of this software are the valuable
|
|
60543
|
-
// trade secrets of the Alliance and its suppliers. The software is also
|
|
60544
|
-
// protected by copyright law and international treaty provisions. Application
|
|
60545
|
-
// programs incorporating this software must include the following statement
|
|
60546
|
-
// with their copyright notices:
|
|
60547
|
-
//
|
|
60548
|
-
// This application incorporates Open Design Alliance software pursuant to a
|
|
60549
|
-
// license agreement with Open Design Alliance.
|
|
60550
|
-
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
60551
|
-
// All rights reserved.
|
|
60552
|
-
//
|
|
60553
|
-
// By use of this software, its documentation or related materials, you
|
|
60554
|
-
// acknowledge and accept the above terms.
|
|
60555
|
-
///////////////////////////////////////////////////////////////////////////////
|
|
60556
|
-
class ResizeCanvasComponent {
|
|
60557
|
-
constructor(viewer) {
|
|
60558
|
-
this.resizeViewer = (entries) => {
|
|
60559
|
-
const { width, height } = entries[0].contentRect;
|
|
60560
|
-
if (!width || !height)
|
|
60561
|
-
return; // <- invisible viewer, or viewer with parent removed
|
|
60562
|
-
const camera = this.viewer.camera;
|
|
60563
|
-
const aspect = width / height;
|
|
60564
|
-
if (camera.isPerspectiveCamera) {
|
|
60565
|
-
camera.aspect = aspect;
|
|
60566
|
-
camera.updateProjectionMatrix();
|
|
60567
|
-
}
|
|
60568
|
-
if (camera.isOrthographicCamera) {
|
|
60569
|
-
camera.left = camera.bottom * aspect;
|
|
60570
|
-
camera.right = camera.top * aspect;
|
|
60571
|
-
camera.updateProjectionMatrix();
|
|
60572
|
-
}
|
|
60573
|
-
this.viewer.renderer.setSize(width, height, true);
|
|
60574
|
-
this.viewer.update(true);
|
|
60575
|
-
this.viewer.emitEvent({ type: "resize", width, height });
|
|
60576
|
-
};
|
|
60577
|
-
this.viewer = viewer;
|
|
60578
|
-
this.resizeObserver = new ResizeObserver(this.resizeViewer);
|
|
60579
|
-
this.resizeObserver.observe(viewer.canvas.parentElement);
|
|
61650
|
+
unhighlight(object) {
|
|
61651
|
+
if (!object.isHighlighted)
|
|
61652
|
+
return;
|
|
61653
|
+
object.isHighlighted = false;
|
|
61654
|
+
object.material = object.userData.originalMaterial;
|
|
61655
|
+
object.userData.highlightwireframe.removeFromParent();
|
|
61656
|
+
delete object.userData.originalMaterial;
|
|
61657
|
+
delete object.userData.highlightwireframe;
|
|
60580
61658
|
}
|
|
60581
|
-
|
|
60582
|
-
this.
|
|
61659
|
+
viewerResize(event) {
|
|
61660
|
+
if (!this.outlineMaterial)
|
|
61661
|
+
return;
|
|
61662
|
+
this.outlineMaterial.resolution.set(event.width, event.height);
|
|
60583
61663
|
}
|
|
60584
61664
|
}
|
|
60585
61665
|
|
|
@@ -60783,6 +61863,7 @@ void main() {
|
|
|
60783
61863
|
components.registerComponent("LightComponent", (viewer) => new LightComponent(viewer));
|
|
60784
61864
|
components.registerComponent("ResizeCanvasComponent", (viewer) => new ResizeCanvasComponent(viewer));
|
|
60785
61865
|
components.registerComponent("RenderLoopComponent", (viewer) => new RenderLoopComponent(viewer));
|
|
61866
|
+
components.registerComponent("HighlighterComponent", (viewer) => new HighlighterComponent(viewer));
|
|
60786
61867
|
components.registerComponent("SelectionComponent", (viewer) => new SelectionComponent(viewer));
|
|
60787
61868
|
components.registerComponent("WCSHelperComponent", (viewer) => new WCSHelperComponent(viewer));
|
|
60788
61869
|
|
|
@@ -65641,28 +66722,27 @@ void main() {
|
|
|
65641
66722
|
// By use of this software, its documentation or related materials, you
|
|
65642
66723
|
// acknowledge and accept the above terms.
|
|
65643
66724
|
///////////////////////////////////////////////////////////////////////////////
|
|
65644
|
-
class
|
|
66725
|
+
class GLTFFileLoader extends Loader$1 {
|
|
65645
66726
|
constructor(viewer) {
|
|
65646
66727
|
super();
|
|
65647
66728
|
this.viewer = viewer;
|
|
65648
66729
|
}
|
|
65649
|
-
isSupport(
|
|
65650
|
-
return (typeof
|
|
65651
|
-
|
|
65652
|
-
typeof model.downloadResource === "function" &&
|
|
65653
|
-
/.gltf$/i.test(model.database));
|
|
66730
|
+
isSupport(file, format) {
|
|
66731
|
+
return ((typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
|
|
66732
|
+
/(gltf|glb)$/i.test(format));
|
|
65654
66733
|
}
|
|
65655
|
-
async load(
|
|
65656
|
-
const
|
|
65657
|
-
const manager = new GLTFLoadingManager(url);
|
|
66734
|
+
async load(file, format, params) {
|
|
66735
|
+
const manager = new GLTFLoadingManager(file, params);
|
|
65658
66736
|
const loader = new GLTFLoader(manager);
|
|
65659
|
-
loader.
|
|
66737
|
+
loader.setPath(manager.path);
|
|
66738
|
+
loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);
|
|
66739
|
+
loader.setWithCredentials(params.withCredentials || loader.withCredentials);
|
|
65660
66740
|
const progress = (event) => {
|
|
65661
66741
|
const { lengthComputable, loaded, total } = event;
|
|
65662
66742
|
const progress = lengthComputable ? loaded / total : 1;
|
|
65663
|
-
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file
|
|
66743
|
+
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file });
|
|
65664
66744
|
};
|
|
65665
|
-
const gltf = await loader.loadAsync(
|
|
66745
|
+
const gltf = await loader.loadAsync(manager.fileURL, progress);
|
|
65666
66746
|
if (!this.viewer.scene)
|
|
65667
66747
|
return this;
|
|
65668
66748
|
this.viewer.scene.add(gltf.scene);
|
|
@@ -65670,7 +66750,7 @@ void main() {
|
|
|
65670
66750
|
this.viewer.syncOptions();
|
|
65671
66751
|
this.viewer.syncOverlay();
|
|
65672
66752
|
this.viewer.update();
|
|
65673
|
-
this.viewer.emitEvent({ type: "databasechunk", data: gltf.scene, file
|
|
66753
|
+
this.viewer.emitEvent({ type: "databasechunk", data: gltf.scene, file });
|
|
65674
66754
|
return this;
|
|
65675
66755
|
}
|
|
65676
66756
|
}
|
|
@@ -65697,27 +66777,28 @@ void main() {
|
|
|
65697
66777
|
// By use of this software, its documentation or related materials, you
|
|
65698
66778
|
// acknowledge and accept the above terms.
|
|
65699
66779
|
///////////////////////////////////////////////////////////////////////////////
|
|
65700
|
-
class
|
|
66780
|
+
class GLTFCloudModelLoader extends Loader$1 {
|
|
65701
66781
|
constructor(viewer) {
|
|
65702
66782
|
super();
|
|
65703
66783
|
this.viewer = viewer;
|
|
65704
66784
|
}
|
|
65705
|
-
isSupport(
|
|
65706
|
-
return (
|
|
65707
|
-
|
|
66785
|
+
isSupport(model) {
|
|
66786
|
+
return (typeof model === "object" &&
|
|
66787
|
+
typeof model.database === "string" &&
|
|
66788
|
+
typeof model.downloadResource === "function" &&
|
|
66789
|
+
/.gltf$/i.test(model.database));
|
|
65708
66790
|
}
|
|
65709
|
-
async load(
|
|
65710
|
-
const
|
|
66791
|
+
async load(model) {
|
|
66792
|
+
const url = `${model.httpClient.serverUrl}${model.path}/${model.database}`;
|
|
66793
|
+
const manager = new GLTFLoadingManager(url);
|
|
65711
66794
|
const loader = new GLTFLoader(manager);
|
|
65712
|
-
loader.
|
|
65713
|
-
loader.setCrossOrigin(params.crossOrigin || loader.crossOrigin);
|
|
65714
|
-
loader.setWithCredentials(params.withCredentials || loader.withCredentials);
|
|
66795
|
+
loader.setRequestHeader(model.httpClient.headers);
|
|
65715
66796
|
const progress = (event) => {
|
|
65716
66797
|
const { lengthComputable, loaded, total } = event;
|
|
65717
66798
|
const progress = lengthComputable ? loaded / total : 1;
|
|
65718
|
-
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file:
|
|
66799
|
+
this.viewer.emitEvent({ type: "geometryprogress", data: progress, file: model.file, model });
|
|
65719
66800
|
};
|
|
65720
|
-
const gltf = await loader.loadAsync(
|
|
66801
|
+
const gltf = await loader.loadAsync(url, progress);
|
|
65721
66802
|
if (!this.viewer.scene)
|
|
65722
66803
|
return this;
|
|
65723
66804
|
this.viewer.scene.add(gltf.scene);
|
|
@@ -65725,7 +66806,7 @@ void main() {
|
|
|
65725
66806
|
this.viewer.syncOptions();
|
|
65726
66807
|
this.viewer.syncOverlay();
|
|
65727
66808
|
this.viewer.update();
|
|
65728
|
-
this.viewer.emitEvent({ type: "databasechunk", data: gltf.scene, file:
|
|
66809
|
+
this.viewer.emitEvent({ type: "databasechunk", data: gltf.scene, file: model.file, model });
|
|
65729
66810
|
return this;
|
|
65730
66811
|
}
|
|
65731
66812
|
}
|
|
@@ -65819,8 +66900,8 @@ void main() {
|
|
|
65819
66900
|
*/
|
|
65820
66901
|
const loaders = loadersRegistry("threejs");
|
|
65821
66902
|
// build-in loaders
|
|
65822
|
-
loaders.registerLoader("gltf", (viewer) => new GLTFModelLoader(viewer));
|
|
65823
66903
|
loaders.registerLoader("gltf-file", (viewer) => new GLTFFileLoader(viewer));
|
|
66904
|
+
loaders.registerLoader("gltf-cloud-model", (viewer) => new GLTFCloudModelLoader(viewer));
|
|
65824
66905
|
|
|
65825
66906
|
class EventEmitter2 {
|
|
65826
66907
|
constructor() {
|
|
@@ -77816,7 +78897,7 @@ void main() {
|
|
|
77816
78897
|
let wcsPoints = this._ref.getAttr("wcsPoints");
|
|
77817
78898
|
if (!wcsPoints) {
|
|
77818
78899
|
wcsPoints = [];
|
|
77819
|
-
|
|
78900
|
+
const points = this._ref.points();
|
|
77820
78901
|
let wcsPoint;
|
|
77821
78902
|
for (let i = 0; i < points.length; i += 2) {
|
|
77822
78903
|
wcsPoint = this._worldTransformer.screenToWorld({
|
|
@@ -77845,7 +78926,7 @@ void main() {
|
|
|
77845
78926
|
const wcsPoints = [];
|
|
77846
78927
|
params.points.forEach((point => {
|
|
77847
78928
|
konvaPoints.push(point.x, point.y);
|
|
77848
|
-
|
|
78929
|
+
const wcsPoint = this._worldTransformer.screenToWorld({
|
|
77849
78930
|
x: point.x,
|
|
77850
78931
|
y: point.y
|
|
77851
78932
|
});
|
|
@@ -77873,8 +78954,8 @@ void main() {
|
|
|
77873
78954
|
}));
|
|
77874
78955
|
this._ref.on("transformend", (e => {
|
|
77875
78956
|
const absoluteTransform = this._ref.getAbsoluteTransform();
|
|
77876
|
-
|
|
77877
|
-
|
|
78957
|
+
const wcsPoints = [];
|
|
78958
|
+
const points = this._ref.points();
|
|
77878
78959
|
let wcsPoint;
|
|
77879
78960
|
for (let i = 0; i < points.length; i += 2) {
|
|
77880
78961
|
const position = absoluteTransform.point({
|
|
@@ -77895,8 +78976,8 @@ void main() {
|
|
|
77895
78976
|
}));
|
|
77896
78977
|
this._ref.on("dragend", (e => {
|
|
77897
78978
|
const absoluteTransform = this._ref.getAbsoluteTransform();
|
|
77898
|
-
|
|
77899
|
-
|
|
78979
|
+
const wcsPoints = [];
|
|
78980
|
+
const points = this._ref.points();
|
|
77900
78981
|
let wcsPoint;
|
|
77901
78982
|
for (let i = 0; i < points.length; i += 2) {
|
|
77902
78983
|
const position = absoluteTransform.point({
|
|
@@ -77984,17 +79065,17 @@ void main() {
|
|
|
77984
79065
|
}
|
|
77985
79066
|
addPoints(points) {
|
|
77986
79067
|
let newPoints = this._ref.points();
|
|
77987
|
-
|
|
79068
|
+
const wcsPoints = this._ref.getAttr("wcsPoints");
|
|
77988
79069
|
points.forEach((point => {
|
|
77989
79070
|
newPoints = newPoints.concat([ point.x, point.y ]);
|
|
77990
|
-
|
|
79071
|
+
const wcsPoint = this._worldTransformer.screenToWorld(point);
|
|
77991
79072
|
wcsPoints.push(wcsPoint);
|
|
77992
79073
|
}));
|
|
77993
79074
|
this._ref.points(newPoints);
|
|
77994
79075
|
}
|
|
77995
79076
|
updateScreenCoordinates() {
|
|
77996
|
-
|
|
77997
|
-
|
|
79077
|
+
const wcsPoints = this._ref.getAttr("wcsPoints");
|
|
79078
|
+
const points = [];
|
|
77998
79079
|
let invert = this._ref.getAbsoluteTransform().copy();
|
|
77999
79080
|
invert = invert.invert();
|
|
78000
79081
|
wcsPoints.forEach((point => {
|
|
@@ -78153,7 +79234,7 @@ void main() {
|
|
|
78153
79234
|
this._ref.fontSize(size);
|
|
78154
79235
|
}
|
|
78155
79236
|
updateScreenCoordinates() {
|
|
78156
|
-
|
|
79237
|
+
const screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsStart"));
|
|
78157
79238
|
let invert = this._ref.getStage().getAbsoluteTransform().copy();
|
|
78158
79239
|
invert = invert.invert();
|
|
78159
79240
|
const positionStart = invert.point(screenPositionStart);
|
|
@@ -78369,8 +79450,8 @@ void main() {
|
|
|
78369
79450
|
return this._ref.strokeWidth();
|
|
78370
79451
|
}
|
|
78371
79452
|
updateScreenCoordinates() {
|
|
78372
|
-
|
|
78373
|
-
|
|
79453
|
+
const screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsStart"));
|
|
79454
|
+
const screenPositionEnd = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsEnd"));
|
|
78374
79455
|
let invert = this._ref.getStage().getAbsoluteTransform().copy();
|
|
78375
79456
|
invert = invert.invert();
|
|
78376
79457
|
const positionStart = invert.point(screenPositionStart);
|
|
@@ -78608,9 +79689,9 @@ void main() {
|
|
|
78608
79689
|
this._ref = null;
|
|
78609
79690
|
}
|
|
78610
79691
|
updateScreenCoordinates() {
|
|
78611
|
-
|
|
78612
|
-
|
|
78613
|
-
|
|
79692
|
+
const screenPosition = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsPosition"));
|
|
79693
|
+
const radiusX = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsRadiusX"));
|
|
79694
|
+
const radiusY = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsRadiusY"));
|
|
78614
79695
|
let invert = this._ref.getStage().getAbsoluteTransform().copy();
|
|
78615
79696
|
invert = invert.invert();
|
|
78616
79697
|
const position = invert.point({
|
|
@@ -78795,8 +79876,8 @@ void main() {
|
|
|
78795
79876
|
}));
|
|
78796
79877
|
}
|
|
78797
79878
|
updateScreenCoordinates() {
|
|
78798
|
-
|
|
78799
|
-
|
|
79879
|
+
const screenStartPoint = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsStart"));
|
|
79880
|
+
const screenEndPoint = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsEnd"));
|
|
78800
79881
|
let invert = this._ref.getAbsoluteTransform().copy();
|
|
78801
79882
|
invert = invert.invert();
|
|
78802
79883
|
const startPoint = invert.point({
|
|
@@ -79034,8 +80115,8 @@ void main() {
|
|
|
79034
80115
|
this._ref.setAttr("wcsEnd", wcsRightLowerPoint);
|
|
79035
80116
|
}
|
|
79036
80117
|
updateScreenCoordinates() {
|
|
79037
|
-
|
|
79038
|
-
|
|
80118
|
+
const screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsStart"));
|
|
80119
|
+
const screenPositionEnd = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsEnd"));
|
|
79039
80120
|
let invert = this._ref.getStage().getAbsoluteTransform().copy();
|
|
79040
80121
|
invert = invert.invert();
|
|
79041
80122
|
const positionStart = invert.point(screenPositionStart);
|
|
@@ -79333,8 +80414,8 @@ void main() {
|
|
|
79333
80414
|
this._ref.strokeWidth(size);
|
|
79334
80415
|
}
|
|
79335
80416
|
updateScreenCoordinates() {
|
|
79336
|
-
|
|
79337
|
-
|
|
80417
|
+
const screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsStart"));
|
|
80418
|
+
const screenPositionEnd = this._worldTransformer.worldToScreen(this._ref.getAttr("wcsEnd"));
|
|
79338
80419
|
let invert = this._ref.getStage().getAbsoluteTransform().copy();
|
|
79339
80420
|
invert = invert.invert();
|
|
79340
80421
|
const positionStart = invert.point(screenPositionStart);
|
|
@@ -80336,12 +81417,12 @@ void main() {
|
|
|
80336
81417
|
}
|
|
80337
81418
|
dispose() {
|
|
80338
81419
|
this.cancel();
|
|
81420
|
+
this.clear();
|
|
80339
81421
|
this.emitEvent({ type: "dispose" });
|
|
81422
|
+
this.removeAllListeners();
|
|
81423
|
+
this.setActiveDragger();
|
|
80340
81424
|
this._components.forEach((component) => component.dispose());
|
|
80341
81425
|
this._components = [];
|
|
80342
|
-
this.setActiveDragger();
|
|
80343
|
-
this.removeAllListeners();
|
|
80344
|
-
this.clear();
|
|
80345
81426
|
this._markup.dispose();
|
|
80346
81427
|
if (this.canvas) {
|
|
80347
81428
|
this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));
|
|
@@ -80349,10 +81430,10 @@ void main() {
|
|
|
80349
81430
|
}
|
|
80350
81431
|
if (this.renderer)
|
|
80351
81432
|
this.renderer.dispose();
|
|
81433
|
+
this.helpers = undefined;
|
|
81434
|
+
this.scene = undefined;
|
|
80352
81435
|
this.renderer = undefined;
|
|
80353
81436
|
this.camera = undefined;
|
|
80354
|
-
this.scene = undefined;
|
|
80355
|
-
this.helpers = undefined;
|
|
80356
81437
|
return this;
|
|
80357
81438
|
}
|
|
80358
81439
|
isInitialized() {
|
|
@@ -80627,6 +81708,9 @@ void main() {
|
|
|
80627
81708
|
this.setActiveDragger(dragger.name);
|
|
80628
81709
|
}
|
|
80629
81710
|
}
|
|
81711
|
+
getComponent(name) {
|
|
81712
|
+
return this._components.find((component) => component.name === name);
|
|
81713
|
+
}
|
|
80630
81714
|
is3D() {
|
|
80631
81715
|
return true;
|
|
80632
81716
|
}
|
|
@@ -80656,9 +81740,6 @@ void main() {
|
|
|
80656
81740
|
executeCommand(id, ...args) {
|
|
80657
81741
|
return commands.executeCommand(id, this, ...args);
|
|
80658
81742
|
}
|
|
80659
|
-
getComponent(name) {
|
|
80660
|
-
return this._components.find((component) => component.name === name);
|
|
80661
|
-
}
|
|
80662
81743
|
drawViewpoint(viewpoint) {
|
|
80663
81744
|
var _a, _b, _c;
|
|
80664
81745
|
if (!this.renderer)
|