@inweb/viewer-three 26.6.6 → 26.7.0
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 +5 -5
- 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 +5 -5
- package/dist/plugins/components/AxesHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/ExtentsHelperComponent.js +15 -7
- 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 +15 -7
- package/dist/plugins/components/ExtentsHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/LightHelperComponent.js +5 -5
- 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 +5 -5
- package/dist/plugins/components/LightHelperComponent.module.js.map +1 -1
- package/dist/plugins/loaders/GLTFCloudLoader.js +4840 -0
- package/dist/plugins/loaders/GLTFCloudLoader.js.map +1 -0
- package/dist/plugins/loaders/GLTFCloudLoader.min.js +1 -0
- package/dist/plugins/loaders/GLTFCloudLoader.module.js +49 -0
- package/dist/plugins/loaders/GLTFCloudLoader.module.js.map +1 -0
- package/dist/plugins/loaders/IFCXLoader.js +12 -6
- 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 +13 -7
- package/dist/plugins/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/viewer-three.js +3131 -459
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +2 -2
- package/dist/viewer-three.module.js +2326 -264
- package/dist/viewer-three.module.js.map +1 -1
- package/lib/Viewer/Viewer.d.ts +6 -5
- package/lib/Viewer/components/HighlighterComponent.d.ts +4 -3
- package/lib/Viewer/components/SelectionComponent.d.ts +8 -5
- package/lib/Viewer/draggers/CuttingPlaneDragger.d.ts +1 -1
- package/lib/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.d.ts +20 -0
- package/lib/Viewer/loaders/GLTFCloudDynamicLoader.d.ts +15 -0
- package/lib/Viewer/model/IModelImpl.d.ts +27 -0
- package/lib/Viewer/model/ModelImpl.d.ts +30 -0
- package/lib/Viewer/model/index.d.ts +2 -0
- package/lib/index.d.ts +1 -0
- package/package.json +11 -7
- package/plugins/components/AxesHelperComponent.ts +5 -5
- package/plugins/components/ExtentsHelperComponent.ts +15 -7
- package/plugins/components/LightHelperComponent.ts +5 -5
- package/{src/Viewer/loaders/GLTFCloudModelLoader.ts → plugins/loaders/GLTFCloudLoader.ts} +15 -12
- package/plugins/loaders/{IFCXCloudFileLoader.ts → IFCXCloudLoader.ts} +8 -4
- package/plugins/loaders/IFCXFileLoader.ts +7 -3
- package/plugins/loaders/IFCXLoader.ts +2 -2
- package/src/Viewer/Viewer.ts +32 -36
- package/src/Viewer/commands/ClearSelected.ts +2 -3
- package/src/Viewer/commands/Explode.ts +1 -47
- package/src/Viewer/commands/GetModels.ts +1 -1
- package/src/Viewer/commands/GetSelected.ts +3 -1
- package/src/Viewer/commands/HideSelected.ts +3 -4
- package/src/Viewer/commands/IsolateSelected.ts +1 -7
- package/src/Viewer/commands/SelectModel.ts +9 -1
- package/src/Viewer/commands/SetSelected.ts +8 -10
- package/src/Viewer/commands/ShowAll.ts +1 -1
- package/src/Viewer/components/BackgroundComponent.ts +1 -0
- package/src/Viewer/components/ExtentsComponent.ts +5 -3
- package/src/Viewer/components/HighlighterComponent.ts +79 -48
- package/src/Viewer/components/SelectionComponent.ts +67 -21
- package/src/Viewer/draggers/CuttingPlaneDragger.ts +7 -3
- package/src/Viewer/draggers/MeasureLineDragger.ts +2 -0
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +1628 -0
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts +102 -0
- package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +450 -0
- package/src/Viewer/loaders/GLTFCloudDynamicLoader.ts +145 -0
- package/src/Viewer/loaders/GLTFFileLoader.ts +7 -2
- package/src/Viewer/loaders/index.ts +2 -2
- package/src/Viewer/model/IModelImpl.ts +67 -0
- package/src/Viewer/model/ModelImpl.ts +215 -0
- package/src/Viewer/model/index.ts +25 -0
- package/src/index.ts +1 -0
- package/lib/Viewer/loaders/GLTFCloudModelLoader.d.ts +0 -8
package/lib/Viewer/Viewer.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { EventEmitter2 } from "@inweb/eventemitter2";
|
|
|
3
3
|
import { Assembly, Client, Model, File } from "@inweb/client";
|
|
4
4
|
import { CanvasEventMap, FileSource, IComponent, IDragger, ILoader, IOptions, IViewer, IViewpoint, Options, OptionsEventMap, ViewerEventMap } from "@inweb/viewer-core";
|
|
5
5
|
import { IMarkup, IWorldTransform } from "@inweb/markup";
|
|
6
|
+
import { IModelImpl } from "./model";
|
|
6
7
|
/**
|
|
7
8
|
* 3D viewer powered by {@link https://threejs.org/ | Three.js}.
|
|
8
9
|
*/
|
|
@@ -16,9 +17,9 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
|
|
|
16
17
|
helpers: Scene | undefined;
|
|
17
18
|
camera: PerspectiveCamera | OrthographicCamera | undefined;
|
|
18
19
|
renderer: WebGLRenderer | undefined;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
selected:
|
|
20
|
+
loaders: ILoader[];
|
|
21
|
+
models: IModelImpl[];
|
|
22
|
+
selected: Object3D[];
|
|
22
23
|
extents: Box3;
|
|
23
24
|
target: Vector3;
|
|
24
25
|
private _activeDragger;
|
|
@@ -44,9 +45,8 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
|
|
|
44
45
|
initialize(canvas: HTMLCanvasElement, onProgress?: (event: ProgressEvent<EventTarget>) => void): Promise<this>;
|
|
45
46
|
dispose(): this;
|
|
46
47
|
isInitialized(): boolean;
|
|
47
|
-
render(time: DOMHighResTimeStamp): void;
|
|
48
48
|
update(force?: boolean): void;
|
|
49
|
-
|
|
49
|
+
render(time: DOMHighResTimeStamp): void;
|
|
50
50
|
loadReferences(model: Model | File | Assembly): Promise<this>;
|
|
51
51
|
/**
|
|
52
52
|
* Loads a file into the viewer.
|
|
@@ -137,6 +137,7 @@ export declare class Viewer extends EventEmitter2<ViewerEventMap & CanvasEventMa
|
|
|
137
137
|
loadGltfFile(file: any, externalFiles: any, params?: any): Promise<this>;
|
|
138
138
|
cancel(): this;
|
|
139
139
|
clear(): this;
|
|
140
|
+
syncOptions(options?: IOptions): void;
|
|
140
141
|
syncOverlay(): void;
|
|
141
142
|
clearOverlay(): void;
|
|
142
143
|
clearSlices(): void;
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import { LineBasicMaterial, MeshBasicMaterial } from "three";
|
|
1
|
+
import { LineBasicMaterial, MeshBasicMaterial, Object3D, WebGLRenderTarget } from "three";
|
|
2
2
|
import { LineMaterial } from "three/examples/jsm/lines/LineMaterial.js";
|
|
3
3
|
import { IComponent, ResizeEvent } from "@inweb/viewer-core";
|
|
4
4
|
import { Viewer } from "../Viewer";
|
|
5
5
|
export declare class HighlighterComponent implements IComponent {
|
|
6
6
|
protected viewer: Viewer;
|
|
7
|
+
renderTarget: WebGLRenderTarget;
|
|
7
8
|
highlightMaterial: MeshBasicMaterial;
|
|
8
9
|
outlineMaterial: LineMaterial;
|
|
9
10
|
highlightLineMaterial: LineBasicMaterial;
|
|
10
11
|
highlightLineGlowMaterial: LineMaterial;
|
|
11
12
|
constructor(viewer: Viewer);
|
|
12
13
|
dispose(): void;
|
|
13
|
-
highlight(
|
|
14
|
-
unhighlight(
|
|
14
|
+
highlight(objects: Object3D | Object3D[]): void;
|
|
15
|
+
unhighlight(objects: Object3D | Object3D[]): void;
|
|
15
16
|
geometryEnd: () => void;
|
|
16
17
|
optionsChange: () => void;
|
|
17
18
|
viewerResize(event: ResizeEvent): void;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Intersection, Object3D, Raycaster, Vector2 } from "three";
|
|
2
|
-
import { IComponent } from "@inweb/viewer-core";
|
|
3
|
-
import { Viewer } from "../Viewer";
|
|
4
|
-
import {
|
|
2
|
+
import type { IComponent } from "@inweb/viewer-core";
|
|
3
|
+
import type { Viewer } from "../Viewer";
|
|
4
|
+
import type { IModelImpl } from "../model";
|
|
5
|
+
import type { HighlighterComponent } from "./HighlighterComponent";
|
|
5
6
|
export declare class SelectionComponent implements IComponent {
|
|
6
7
|
protected viewer: Viewer;
|
|
7
8
|
protected raycaster: Raycaster;
|
|
@@ -13,8 +14,10 @@ export declare class SelectionComponent implements IComponent {
|
|
|
13
14
|
onPointerUp: (event: PointerEvent) => void;
|
|
14
15
|
onDoubleClick: (event: MouseEvent) => void;
|
|
15
16
|
getMousePosition(event: MouseEvent, target: Vector2): Vector2;
|
|
16
|
-
getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>>;
|
|
17
|
-
select(
|
|
17
|
+
getPointerIntersects(mouse: Vector2, objects: Object3D[]): Array<Intersection<Object3D>>;
|
|
18
|
+
select(objects: Object3D | Object3D[], model?: IModelImpl): void;
|
|
19
|
+
deselect(objects: Object3D | Object3D[], model?: IModelImpl): void;
|
|
20
|
+
toggleSelection(objects: Object3D | Object3D[], model?: IModelImpl): void;
|
|
18
21
|
clearSelection(): void;
|
|
19
22
|
initHighlighter: () => void;
|
|
20
23
|
}
|
|
@@ -12,6 +12,6 @@ export declare class CuttingPlaneDragger extends OrbitDragger {
|
|
|
12
12
|
dispose(): void;
|
|
13
13
|
transformChange: () => void;
|
|
14
14
|
transformDrag: (event: any) => void;
|
|
15
|
-
|
|
15
|
+
updatePlaneSize: () => void;
|
|
16
16
|
onDoubleClick: (event: PointerEvent) => void;
|
|
17
17
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Box3, Object3D } from "three";
|
|
2
|
+
import { ModelImpl } from "../../model";
|
|
3
|
+
import { DynamicGltfLoader } from "./DynamicGltfLoader.js";
|
|
4
|
+
/**
|
|
5
|
+
* Dynamic model implementation.
|
|
6
|
+
*/
|
|
7
|
+
export declare class DynamicModelImpl extends ModelImpl {
|
|
8
|
+
gltfLoader: DynamicGltfLoader;
|
|
9
|
+
getExtents(target: Box3): Box3;
|
|
10
|
+
getObjects(): Object3D[];
|
|
11
|
+
getVisibleObjects(): Object3D[];
|
|
12
|
+
hasObject(object: any): boolean;
|
|
13
|
+
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
14
|
+
hideObjects(objects: Object3D | Object3D[]): this;
|
|
15
|
+
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
16
|
+
showObjects(objects: Object3D | Object3D[]): this;
|
|
17
|
+
showAllObjects(): this;
|
|
18
|
+
showOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
19
|
+
hideOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
20
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Group } from "three";
|
|
2
|
+
import { ILoader, LoadParams } from "@inweb/viewer-core";
|
|
3
|
+
import { Viewer } from "../Viewer";
|
|
4
|
+
import { DynamicGltfLoader } from "./DynamicGltfLoader/DynamicGltfLoader.js";
|
|
5
|
+
export declare class GLTFCloudDynamicLoader implements ILoader {
|
|
6
|
+
viewer: Viewer;
|
|
7
|
+
scene: Group;
|
|
8
|
+
gltfLoader: DynamicGltfLoader;
|
|
9
|
+
requestId: number;
|
|
10
|
+
constructor(viewer: Viewer);
|
|
11
|
+
dispose(): void;
|
|
12
|
+
isSupport(file: any): boolean;
|
|
13
|
+
load(model: any, format?: string, params?: LoadParams): Promise<this>;
|
|
14
|
+
cancel(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Box3, Object3D } from "three";
|
|
2
|
+
import { ILoader, IViewer } from "@inweb/viewer-core";
|
|
3
|
+
/**
|
|
4
|
+
* Model interface.
|
|
5
|
+
*/
|
|
6
|
+
export interface IModelImpl {
|
|
7
|
+
handle: string;
|
|
8
|
+
scene: Object3D;
|
|
9
|
+
loader: ILoader;
|
|
10
|
+
viewer: IViewer;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
getExtents(target: Box3): Box3;
|
|
13
|
+
getObjects(): Object3D[];
|
|
14
|
+
getVisibleObjects(): Object3D[];
|
|
15
|
+
hasObject(objects: Object3D): boolean;
|
|
16
|
+
getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
|
|
17
|
+
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
18
|
+
getHandlesByObjects(objects: Object3D | Object3D[]): string[];
|
|
19
|
+
hideObjects(objects: Object3D | Object3D[]): this;
|
|
20
|
+
hideAllObjects(): this;
|
|
21
|
+
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
22
|
+
showObjects(objects: Object3D | Object3D[]): this;
|
|
23
|
+
showAllObjects(): this;
|
|
24
|
+
showOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
25
|
+
hideOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
26
|
+
explode(scale: number, coeff?: number): this;
|
|
27
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Box3, Object3D } from "three";
|
|
2
|
+
import { ILoader } from "@inweb/viewer-core";
|
|
3
|
+
import { IModelImpl } from "./IModelImpl";
|
|
4
|
+
import { Viewer } from "../Viewer";
|
|
5
|
+
/**
|
|
6
|
+
* Basic model implementation.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ModelImpl implements IModelImpl {
|
|
9
|
+
handle: string;
|
|
10
|
+
scene: Object3D;
|
|
11
|
+
loader: ILoader;
|
|
12
|
+
viewer: Viewer;
|
|
13
|
+
constructor(scene: Object3D);
|
|
14
|
+
dispose(): void;
|
|
15
|
+
getExtents(target: Box3): Box3;
|
|
16
|
+
getObjects(): Object3D[];
|
|
17
|
+
getVisibleObjects(): Object3D[];
|
|
18
|
+
hasObject(object: Object3D): boolean;
|
|
19
|
+
getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
|
|
20
|
+
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
21
|
+
getHandlesByObjects(objects: Object3D | Object3D[]): string[];
|
|
22
|
+
hideObjects(objects: Object3D | Object3D[]): this;
|
|
23
|
+
hideAllObjects(): this;
|
|
24
|
+
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
25
|
+
showObjects(objects: Object3D | Object3D[]): this;
|
|
26
|
+
showAllObjects(): this;
|
|
27
|
+
showOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
28
|
+
hideOriginalObjects(objects: Object3D | Object3D[]): this;
|
|
29
|
+
explode(scale?: number, coeff?: number): this;
|
|
30
|
+
}
|
package/lib/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./Viewer/commands";
|
|
|
3
3
|
export * from "./Viewer/components";
|
|
4
4
|
export * from "./Viewer/loaders";
|
|
5
5
|
export * from "./Viewer/loaders/GLTFLoadingManager";
|
|
6
|
+
export * from "./Viewer/model";
|
|
6
7
|
export * from "./Viewer/Viewer";
|
|
7
8
|
export * from "@inweb/viewer-core";
|
|
8
9
|
export * from "@inweb/markup";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inweb/viewer-three",
|
|
3
|
-
"version": "26.
|
|
3
|
+
"version": "26.7.0",
|
|
4
4
|
"description": "JavaScript library for rendering CAD and BIM files in a browser using Three.js",
|
|
5
5
|
"homepage": "https://cloud.opendesign.com/docs/index.html",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -26,15 +26,19 @@
|
|
|
26
26
|
"plugins"
|
|
27
27
|
],
|
|
28
28
|
"scripts": {
|
|
29
|
-
"build": "
|
|
30
|
-
"
|
|
29
|
+
"build": "npm run build:viewer && npm run build:plugins",
|
|
30
|
+
"build:viewer": "rollup -c rollup.config.js",
|
|
31
|
+
"build:plugins": "rollup -c rollup.plugins.config.js",
|
|
32
|
+
"test": "npm run test:viewer && npm run test:plugins",
|
|
33
|
+
"test:viewer": "karma start karma.conf.js",
|
|
34
|
+
"test:plugins": "karma start karma.plugins.conf.js",
|
|
31
35
|
"docs": "typedoc"
|
|
32
36
|
},
|
|
33
37
|
"dependencies": {
|
|
34
|
-
"@inweb/client": "~26.
|
|
35
|
-
"@inweb/eventemitter2": "~26.
|
|
36
|
-
"@inweb/markup": "~26.
|
|
37
|
-
"@inweb/viewer-core": "~26.
|
|
38
|
+
"@inweb/client": "~26.7.0",
|
|
39
|
+
"@inweb/eventemitter2": "~26.7.0",
|
|
40
|
+
"@inweb/markup": "~26.7.0",
|
|
41
|
+
"@inweb/viewer-core": "~26.7.0"
|
|
38
42
|
},
|
|
39
43
|
"devDependencies": {
|
|
40
44
|
"@types/three": "^0.173.0",
|
|
@@ -33,8 +33,8 @@ class AxesHelperComponent implements IComponent {
|
|
|
33
33
|
this.axesHelper1 = new AxesHelper();
|
|
34
34
|
this.axesHelper2 = new AxesHelper();
|
|
35
35
|
this.viewer = viewer;
|
|
36
|
-
this.viewer.addEventListener("geometryend", this.
|
|
37
|
-
this.viewer.addEventListener("clear", this.
|
|
36
|
+
this.viewer.addEventListener("geometryend", this.syncHelper);
|
|
37
|
+
this.viewer.addEventListener("clear", this.syncHelper);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
dispose() {
|
|
@@ -44,11 +44,11 @@ class AxesHelperComponent implements IComponent {
|
|
|
44
44
|
this.axesHelper2.removeFromParent();
|
|
45
45
|
this.axesHelper2.dispose();
|
|
46
46
|
|
|
47
|
-
this.viewer.removeEventListener("geometryend", this.
|
|
48
|
-
this.viewer.removeEventListener("clear", this.
|
|
47
|
+
this.viewer.removeEventListener("geometryend", this.syncHelper);
|
|
48
|
+
this.viewer.removeEventListener("clear", this.syncHelper);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
syncHelper = () => {
|
|
52
52
|
this.axesHelper1.removeFromParent();
|
|
53
53
|
this.axesHelper1.dispose();
|
|
54
54
|
|
|
@@ -31,21 +31,29 @@ class ExtentsHelperComponent implements IComponent {
|
|
|
31
31
|
constructor(viewer: Viewer) {
|
|
32
32
|
this.boxHelper = new Box3Helper(new Box3(), "#ff0000");
|
|
33
33
|
this.viewer = viewer;
|
|
34
|
-
this.viewer.on("geometryend", this.
|
|
35
|
-
this.viewer.on("
|
|
36
|
-
this.viewer.on("
|
|
34
|
+
this.viewer.on("geometryend", this.syncHelper);
|
|
35
|
+
this.viewer.on("clear", this.syncHelper);
|
|
36
|
+
this.viewer.on("explode", this.syncHelper);
|
|
37
|
+
this.viewer.on("hide", this.syncHelper);
|
|
38
|
+
this.viewer.on("isolate", this.syncHelper);
|
|
39
|
+
this.viewer.on("show", this.syncHelper);
|
|
40
|
+
this.viewer.on("showall", this.syncHelper);
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
dispose() {
|
|
40
44
|
this.boxHelper.removeFromParent();
|
|
41
45
|
this.boxHelper.dispose();
|
|
42
46
|
|
|
43
|
-
this.viewer.off("geometryend", this.
|
|
44
|
-
this.viewer.off("
|
|
45
|
-
this.viewer.off("
|
|
47
|
+
this.viewer.off("geometryend", this.syncHelper);
|
|
48
|
+
this.viewer.off("clear", this.syncHelper);
|
|
49
|
+
this.viewer.off("explode", this.syncHelper);
|
|
50
|
+
this.viewer.off("hide", this.syncHelper);
|
|
51
|
+
this.viewer.off("isolate", this.syncHelper);
|
|
52
|
+
this.viewer.off("show", this.syncHelper);
|
|
53
|
+
this.viewer.off("showall", this.syncHelper);
|
|
46
54
|
}
|
|
47
55
|
|
|
48
|
-
|
|
56
|
+
syncHelper = () => {
|
|
49
57
|
this.boxHelper.removeFromParent();
|
|
50
58
|
|
|
51
59
|
if (this.viewer.extents.isEmpty()) return;
|
|
@@ -31,8 +31,8 @@ class LightHelperComponent implements IComponent {
|
|
|
31
31
|
constructor(viewer: Viewer) {
|
|
32
32
|
this.lightHelpers = [];
|
|
33
33
|
this.viewer = viewer;
|
|
34
|
-
this.viewer.addEventListener("geometryend", this.
|
|
35
|
-
this.viewer.addEventListener("clear", this.
|
|
34
|
+
this.viewer.addEventListener("geometryend", this.syncHelper);
|
|
35
|
+
this.viewer.addEventListener("clear", this.syncHelper);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
dispose() {
|
|
@@ -42,11 +42,11 @@ class LightHelperComponent implements IComponent {
|
|
|
42
42
|
});
|
|
43
43
|
this.lightHelpers.length = 0;
|
|
44
44
|
|
|
45
|
-
this.viewer.removeEventListener("geometryend", this.
|
|
46
|
-
this.viewer.removeEventListener("clear", this.
|
|
45
|
+
this.viewer.removeEventListener("geometryend", this.syncHelper);
|
|
46
|
+
this.viewer.removeEventListener("clear", this.syncHelper);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
syncHelper = () => {
|
|
50
50
|
this.lightHelpers.forEach((helper) => {
|
|
51
51
|
helper.removeFromParent();
|
|
52
52
|
helper.dispose();
|
|
@@ -22,12 +22,9 @@
|
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
24
|
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
25
|
-
import { Loader } from "@inweb/viewer-
|
|
25
|
+
import { GLTFLoadingManager, Loader, loaders, ModelImpl, Viewer } from "@inweb/viewer-three";
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
import { GLTFLoadingManager } from "./GLTFLoadingManager";
|
|
29
|
-
|
|
30
|
-
export class GLTFCloudModelLoader extends Loader {
|
|
27
|
+
class GLTFCloudLoader extends Loader {
|
|
31
28
|
public viewer: Viewer;
|
|
32
29
|
|
|
33
30
|
constructor(viewer: Viewer) {
|
|
@@ -35,12 +32,12 @@ export class GLTFCloudModelLoader extends Loader {
|
|
|
35
32
|
this.viewer = viewer;
|
|
36
33
|
}
|
|
37
34
|
|
|
38
|
-
override isSupport(
|
|
35
|
+
override isSupport(file: any): boolean {
|
|
39
36
|
return (
|
|
40
|
-
typeof
|
|
41
|
-
typeof
|
|
42
|
-
typeof
|
|
43
|
-
/.gltf$/i.test(
|
|
37
|
+
typeof file === "object" &&
|
|
38
|
+
typeof file.database === "string" &&
|
|
39
|
+
typeof file.downloadResource === "function" &&
|
|
40
|
+
/.gltf$/i.test(file.database)
|
|
44
41
|
);
|
|
45
42
|
}
|
|
46
43
|
|
|
@@ -60,8 +57,12 @@ export class GLTFCloudModelLoader extends Loader {
|
|
|
60
57
|
const gltf = await loader.loadAsync(url, progress);
|
|
61
58
|
if (!this.viewer.scene) return this;
|
|
62
59
|
|
|
63
|
-
|
|
64
|
-
this
|
|
60
|
+
const modelImpl = new ModelImpl(gltf.scene);
|
|
61
|
+
modelImpl.loader = this;
|
|
62
|
+
modelImpl.viewer = this.viewer;
|
|
63
|
+
|
|
64
|
+
this.viewer.scene.add(modelImpl.scene);
|
|
65
|
+
this.viewer.models.push(modelImpl);
|
|
65
66
|
|
|
66
67
|
this.viewer.syncOptions();
|
|
67
68
|
this.viewer.syncOverlay();
|
|
@@ -72,3 +73,5 @@ export class GLTFCloudModelLoader extends Loader {
|
|
|
72
73
|
return this;
|
|
73
74
|
}
|
|
74
75
|
}
|
|
76
|
+
|
|
77
|
+
loaders.registerLoader("gltf-cloud", (viewer: any) => new GLTFCloudLoader(viewer));
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Loader, Viewer } from "@inweb/viewer-three";
|
|
24
|
+
import { Loader, ModelImpl, Viewer } from "@inweb/viewer-three";
|
|
25
25
|
import { parse, clear } from "./IFCX/render.js";
|
|
26
26
|
|
|
27
|
-
export class
|
|
27
|
+
export class IFCXCloudLoader extends Loader {
|
|
28
28
|
public viewer: Viewer;
|
|
29
29
|
|
|
30
30
|
constructor(viewer: Viewer) {
|
|
@@ -61,8 +61,12 @@ export class IFCXCloudFileLoader extends Loader {
|
|
|
61
61
|
handle++;
|
|
62
62
|
});
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
this
|
|
64
|
+
const modelImpl = new ModelImpl(scene);
|
|
65
|
+
modelImpl.loader = this;
|
|
66
|
+
modelImpl.viewer = this.viewer;
|
|
67
|
+
|
|
68
|
+
this.viewer.scene.add(modelImpl.scene);
|
|
69
|
+
this.viewer.models.push(modelImpl);
|
|
66
70
|
|
|
67
71
|
this.viewer.syncOptions();
|
|
68
72
|
this.viewer.syncOverlay();
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { GLTFLoadingManager, GLTFLoadParams, Loader, Viewer } from "@inweb/viewer-three";
|
|
24
|
+
import { GLTFLoadingManager, GLTFLoadParams, Loader, ModelImpl, Viewer } from "@inweb/viewer-three";
|
|
25
25
|
import { IFCXLoader } from "./IFCX/IFCXLoader";
|
|
26
26
|
|
|
27
27
|
export class IFCXFileLoader extends Loader {
|
|
@@ -62,8 +62,12 @@ export class IFCXFileLoader extends Loader {
|
|
|
62
62
|
handle++;
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
this
|
|
65
|
+
const modelImpl = new ModelImpl(scene);
|
|
66
|
+
modelImpl.loader = this;
|
|
67
|
+
modelImpl.viewer = this.viewer;
|
|
68
|
+
|
|
69
|
+
this.viewer.scene.add(modelImpl.scene);
|
|
70
|
+
this.viewer.models.push(modelImpl);
|
|
67
71
|
|
|
68
72
|
this.viewer.syncOptions();
|
|
69
73
|
this.viewer.syncOverlay();
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
import { loaders } from "@inweb/viewer-three";
|
|
25
25
|
|
|
26
26
|
import { IFCXFileLoader } from "./IFCXFileLoader";
|
|
27
|
-
import {
|
|
27
|
+
import { IFCXCloudLoader } from "./IFCXCloudLoader";
|
|
28
28
|
|
|
29
29
|
loaders.registerLoader("ifcx-file", (viewer: any) => new IFCXFileLoader(viewer));
|
|
30
|
-
loaders.registerLoader("ifcx-cloud
|
|
30
|
+
loaders.registerLoader("ifcx-cloud", (viewer: any) => new IFCXCloudLoader(viewer));
|
package/src/Viewer/Viewer.ts
CHANGED
|
@@ -62,6 +62,7 @@ import { draggers } from "./draggers";
|
|
|
62
62
|
import { commands } from "./commands";
|
|
63
63
|
import { components } from "./components";
|
|
64
64
|
import { loaders } from "./loaders";
|
|
65
|
+
import { IModelImpl } from "./model";
|
|
65
66
|
|
|
66
67
|
/**
|
|
67
68
|
* 3D viewer powered by {@link https://threejs.org/ | Three.js}.
|
|
@@ -82,14 +83,14 @@ export class Viewer
|
|
|
82
83
|
public helpers: Scene | undefined;
|
|
83
84
|
public camera: PerspectiveCamera | OrthographicCamera | undefined;
|
|
84
85
|
public renderer: WebGLRenderer | undefined;
|
|
85
|
-
public
|
|
86
|
-
public
|
|
87
|
-
public selected:
|
|
86
|
+
public loaders: ILoader[];
|
|
87
|
+
public models: IModelImpl[];
|
|
88
|
+
public selected: Object3D[];
|
|
88
89
|
public extents: Box3;
|
|
89
90
|
public target: Vector3;
|
|
90
91
|
|
|
91
92
|
private _activeDragger: IDragger | null;
|
|
92
|
-
private _components:
|
|
93
|
+
private _components: IComponent[];
|
|
93
94
|
|
|
94
95
|
private renderNeeded: boolean;
|
|
95
96
|
private renderTime: DOMHighResTimeStamp;
|
|
@@ -110,8 +111,8 @@ export class Viewer
|
|
|
110
111
|
this.canvasEvents = CANVAS_EVENTS;
|
|
111
112
|
this.canvaseventlistener = (event: Event) => this.emit(event);
|
|
112
113
|
|
|
113
|
-
this.models = [];
|
|
114
114
|
this.loaders = [];
|
|
115
|
+
this.models = [];
|
|
115
116
|
this.selected = [];
|
|
116
117
|
this.extents = new Box3();
|
|
117
118
|
this.target = new Vector3();
|
|
@@ -154,6 +155,7 @@ export class Viewer
|
|
|
154
155
|
this.scene = new Scene();
|
|
155
156
|
this.helpers = new Scene();
|
|
156
157
|
|
|
158
|
+
const pixelRatio = window.devicePixelRatio;
|
|
157
159
|
const rect = canvas.parentElement.getBoundingClientRect();
|
|
158
160
|
const width = rect.width || 1;
|
|
159
161
|
const height = rect.height || 1;
|
|
@@ -161,8 +163,15 @@ export class Viewer
|
|
|
161
163
|
this.camera = new PerspectiveCamera(45, aspect, 0.01, 1000);
|
|
162
164
|
this.camera.up.set(0, 0, 1);
|
|
163
165
|
|
|
164
|
-
this.renderer = new WebGLRenderer({
|
|
165
|
-
|
|
166
|
+
this.renderer = new WebGLRenderer({
|
|
167
|
+
canvas,
|
|
168
|
+
antialias: true,
|
|
169
|
+
alpha: true,
|
|
170
|
+
preserveDrawingBuffer: true,
|
|
171
|
+
powerPreference: "high-performance",
|
|
172
|
+
logarithmicDepthBuffer: false,
|
|
173
|
+
});
|
|
174
|
+
this.renderer.setPixelRatio(pixelRatio);
|
|
166
175
|
this.renderer.setSize(width, height);
|
|
167
176
|
this.renderer.toneMapping = LinearToneMapping;
|
|
168
177
|
|
|
@@ -223,7 +232,13 @@ export class Viewer
|
|
|
223
232
|
return !!this.renderer;
|
|
224
233
|
}
|
|
225
234
|
|
|
226
|
-
|
|
235
|
+
update(force = false): void {
|
|
236
|
+
this.renderNeeded = true;
|
|
237
|
+
if (force) this.render(performance.now());
|
|
238
|
+
this.emitEvent({ type: "update", data: force });
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
render(time: DOMHighResTimeStamp): void {
|
|
227
242
|
if (!this.renderNeeded) return;
|
|
228
243
|
if (!this.renderer) return;
|
|
229
244
|
|
|
@@ -246,16 +261,6 @@ export class Viewer
|
|
|
246
261
|
this.emitEvent({ type: "render", time, deltaTime });
|
|
247
262
|
}
|
|
248
263
|
|
|
249
|
-
public update(force = false): void {
|
|
250
|
-
this.renderNeeded = true;
|
|
251
|
-
if (force) this.render(performance.now());
|
|
252
|
-
this.emitEvent({ type: "update", data: force });
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
public syncOptions(options: IOptions = this.options): void {
|
|
256
|
-
// this.update();
|
|
257
|
-
}
|
|
258
|
-
|
|
259
264
|
loadReferences(model: Model | File | Assembly): Promise<this> {
|
|
260
265
|
// todo: load reference as text fonts
|
|
261
266
|
return Promise.resolve(this);
|
|
@@ -360,7 +365,7 @@ export class Viewer
|
|
|
360
365
|
if (!format && typeof file === "string") format = file.split(".").pop();
|
|
361
366
|
if (!format && file instanceof globalThis.File) format = file.name.split(".").pop();
|
|
362
367
|
|
|
363
|
-
const loader = loaders.createLoader(this, model, format);
|
|
368
|
+
const loader: ILoader = loaders.createLoader(this, model, format);
|
|
364
369
|
if (!loader) throw new Error(`Format not supported`);
|
|
365
370
|
this.loaders.push(loader);
|
|
366
371
|
|
|
@@ -405,33 +410,20 @@ export class Viewer
|
|
|
405
410
|
clear(): this {
|
|
406
411
|
if (!this.renderer) return this;
|
|
407
412
|
|
|
408
|
-
function disposeMaterial(material: any) {
|
|
409
|
-
const materials = Array.isArray(material) ? material : [material];
|
|
410
|
-
materials.forEach((material: any) => material.dispose());
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
function disposeObject(object: any) {
|
|
414
|
-
if (object.geometry) object.geometry.dispose();
|
|
415
|
-
if (object.material) disposeMaterial(object.material);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
413
|
this.setActiveDragger();
|
|
419
414
|
this.clearSlices();
|
|
420
415
|
this.clearOverlay();
|
|
421
416
|
this.clearSelected();
|
|
422
417
|
|
|
423
|
-
this.
|
|
424
|
-
this.
|
|
418
|
+
this.loaders.forEach((loader) => loader.dispose());
|
|
419
|
+
this.loaders = [];
|
|
425
420
|
|
|
426
|
-
this.models.forEach((model) => model.
|
|
427
|
-
this.models.forEach((model) => model.removeFromParent());
|
|
421
|
+
this.models.forEach((model) => model.dispose());
|
|
428
422
|
this.models = [];
|
|
429
423
|
|
|
424
|
+
this.helpers.clear();
|
|
430
425
|
this.scene.clear();
|
|
431
426
|
|
|
432
|
-
this.loaders.forEach((loader) => loader.dispose());
|
|
433
|
-
this.loaders = [];
|
|
434
|
-
|
|
435
427
|
this.syncOptions();
|
|
436
428
|
this.syncOverlay();
|
|
437
429
|
this.update(true);
|
|
@@ -441,6 +433,10 @@ export class Viewer
|
|
|
441
433
|
return this;
|
|
442
434
|
}
|
|
443
435
|
|
|
436
|
+
syncOptions(options: IOptions = this.options): void {
|
|
437
|
+
// this.update();
|
|
438
|
+
}
|
|
439
|
+
|
|
444
440
|
syncOverlay(): void {
|
|
445
441
|
if (!this.renderer) return;
|
|
446
442
|
|
|
@@ -22,11 +22,10 @@
|
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
24
|
import type { Viewer } from "../Viewer";
|
|
25
|
+
import type { SelectionComponent } from "../components/SelectionComponent";
|
|
25
26
|
|
|
26
27
|
export function clearSelected(viewer: Viewer): void {
|
|
27
|
-
const selection
|
|
28
|
-
if (!selection) return;
|
|
29
|
-
|
|
28
|
+
const selection = viewer.getComponent("SelectionComponent") as SelectionComponent;
|
|
30
29
|
selection.clearSelection();
|
|
31
30
|
|
|
32
31
|
viewer.update();
|