@combeenation/3d-viewer 17.1.0-beta1 → 18.0.0-beta1
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/lib-cjs/buildinfo.json +1 -1
- package/dist/lib-cjs/commonjs.tsconfig.tsbuildinfo +1 -1
- package/dist/lib-cjs/index.d.ts +2 -0
- package/dist/lib-cjs/index.js +2 -0
- package/dist/lib-cjs/index.js.map +1 -1
- package/dist/lib-cjs/internal/asset-helper.d.ts +32 -0
- package/dist/lib-cjs/internal/asset-helper.js +105 -0
- package/dist/lib-cjs/internal/asset-helper.js.map +1 -0
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.d.ts +18 -0
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js +22 -3
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js.map +1 -1
- package/dist/lib-cjs/internal/texture-parameter-helper.js +26 -7
- package/dist/lib-cjs/internal/texture-parameter-helper.js.map +1 -1
- package/dist/lib-cjs/manager/camera-manager.js +4 -2
- package/dist/lib-cjs/manager/camera-manager.js.map +1 -1
- package/dist/lib-cjs/manager/debug-manager.js +1 -1
- package/dist/lib-cjs/manager/debug-manager.js.map +1 -1
- package/dist/lib-cjs/manager/model-manager.d.ts +11 -33
- package/dist/lib-cjs/manager/model-manager.js +47 -106
- package/dist/lib-cjs/manager/model-manager.js.map +1 -1
- package/dist/lib-cjs/manager/parameter-manager.d.ts +16 -11
- package/dist/lib-cjs/manager/parameter-manager.js +78 -69
- package/dist/lib-cjs/manager/parameter-manager.js.map +1 -1
- package/dist/lib-cjs/manager/scene-manager.d.ts +111 -5
- package/dist/lib-cjs/manager/scene-manager.js +269 -10
- package/dist/lib-cjs/manager/scene-manager.js.map +1 -1
- package/dist/lib-cjs/viewer-error.d.ts +1 -0
- package/dist/lib-cjs/viewer-error.js +1 -0
- package/dist/lib-cjs/viewer-error.js.map +1 -1
- package/dist/lib-cjs/viewer.d.ts +4 -13
- package/dist/lib-cjs/viewer.js +3 -37
- package/dist/lib-cjs/viewer.js.map +1 -1
- package/package.json +21 -12
- package/src/index.ts +2 -0
- package/src/internal/asset-helper.ts +115 -0
- package/src/internal/cbn-custom-babylon-loader-plugin.ts +30 -3
- package/src/internal/texture-parameter-helper.ts +25 -8
- package/src/manager/camera-manager.ts +4 -2
- package/src/manager/debug-manager.ts +1 -1
- package/src/manager/model-manager.ts +55 -137
- package/src/manager/parameter-manager.ts +93 -74
- package/src/manager/scene-manager.ts +366 -10
- package/src/viewer-error.ts +1 -0
- package/src/viewer.ts +13 -55
- package/src/dev.ts +0 -47
package/dist/lib-cjs/viewer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Index from './index';
|
|
2
|
-
import {
|
|
2
|
+
import { AbstractEngine, CameraManager, DebugManager, DefaultSceneSettings, EngineOptions, EventManager, GltfExportManager, MaterialManager, ModelManager, ParameterManager, ParameterSubject, Scene, SceneManager, TextureManager, TransformNode } from './index';
|
|
3
3
|
/**
|
|
4
4
|
* Use this to define geometry to be excluded from autofocus, GLB export, etc.
|
|
5
5
|
*/
|
|
@@ -46,7 +46,7 @@ export declare type ViewerSettings = {
|
|
|
46
46
|
* (e.g. `modelManager` for loading models into the scene)
|
|
47
47
|
*/
|
|
48
48
|
export declare class Viewer {
|
|
49
|
-
readonly canvas
|
|
49
|
+
readonly canvas?: HTMLCanvasElement | undefined;
|
|
50
50
|
static readonly version: string;
|
|
51
51
|
protected _scene: Scene;
|
|
52
52
|
protected _cameraManager: CameraManager;
|
|
@@ -61,7 +61,7 @@ export declare class Viewer {
|
|
|
61
61
|
protected _viewerSettings: ViewerSettings;
|
|
62
62
|
protected _isRenderLoopPaused: boolean;
|
|
63
63
|
get scene(): Scene;
|
|
64
|
-
get engine():
|
|
64
|
+
get engine(): AbstractEngine;
|
|
65
65
|
get cameraManager(): CameraManager;
|
|
66
66
|
get debugManager(): DebugManager;
|
|
67
67
|
get eventManager(): EventManager;
|
|
@@ -86,7 +86,7 @@ export declare class Viewer {
|
|
|
86
86
|
* @param defaultSceneSettings Can be overwritten to tweak settings for the automatically create Babylon.js scene.\
|
|
87
87
|
* This scene contains a camera and an environment per default.
|
|
88
88
|
*/
|
|
89
|
-
constructor(canvas
|
|
89
|
+
constructor(canvas?: HTMLCanvasElement | undefined, viewerSettings?: DeepPartial<ViewerSettings>, defaultSceneSettings?: DeepPartial<DefaultSceneSettings>);
|
|
90
90
|
/**
|
|
91
91
|
* Pause rendering can be usefull when doing internal scene processings that should not be visible to the user,
|
|
92
92
|
* e.g. cloning meshes for gltf export
|
|
@@ -100,15 +100,6 @@ export declare class Viewer {
|
|
|
100
100
|
* Destroys this viewer instance and disposes Babylon.js engine and all scene content
|
|
101
101
|
*/
|
|
102
102
|
destroy(): void;
|
|
103
|
-
/**
|
|
104
|
-
* Calculates size of the current scene.\
|
|
105
|
-
* Only takes meshes into considerations that:
|
|
106
|
-
* - are visible
|
|
107
|
-
* - are not excluded by "excludeGeometry" parameter
|
|
108
|
-
* - do not have a material of type "BackgroundMaterial"
|
|
109
|
-
* - do not have an infinite distance (like sky boxes)
|
|
110
|
-
*/
|
|
111
|
-
calculateBoundingInfo(excludeGeometry?: ExcludedGeometryList): BoundingInfo;
|
|
112
103
|
/**
|
|
113
104
|
* Set up viewer (engine and scene) and initialize all managers
|
|
114
105
|
*/
|
package/dist/lib-cjs/viewer.js
CHANGED
|
@@ -32,7 +32,6 @@ const Index = __importStar(require("./index"));
|
|
|
32
32
|
const index_1 = require("./index");
|
|
33
33
|
const cbn_custom_babylon_loader_plugin_1 = require("./internal/cbn-custom-babylon-loader-plugin");
|
|
34
34
|
const device_helper_1 = require("./internal/device-helper");
|
|
35
|
-
const geometry_helper_1 = require("./internal/geometry-helper");
|
|
36
35
|
const lodash_es_1 = require("lodash-es");
|
|
37
36
|
/**
|
|
38
37
|
* This is the entry point into the application.\
|
|
@@ -139,41 +138,6 @@ class Viewer {
|
|
|
139
138
|
this.eventManager.removeAllListeners();
|
|
140
139
|
this.engine.dispose();
|
|
141
140
|
}
|
|
142
|
-
/**
|
|
143
|
-
* Calculates size of the current scene.\
|
|
144
|
-
* Only takes meshes into considerations that:
|
|
145
|
-
* - are visible
|
|
146
|
-
* - are not excluded by "excludeGeometry" parameter
|
|
147
|
-
* - do not have a material of type "BackgroundMaterial"
|
|
148
|
-
* - do not have an infinite distance (like sky boxes)
|
|
149
|
-
*/
|
|
150
|
-
calculateBoundingInfo(excludeGeometry) {
|
|
151
|
-
// CB-6062: workaround for BoundingBox not respecting render loop
|
|
152
|
-
this.scene.render();
|
|
153
|
-
const { max, min } = this.scene.meshes
|
|
154
|
-
.filter(mesh => {
|
|
155
|
-
const isEnabled = mesh.isEnabled();
|
|
156
|
-
// ignore meshes with invalid bounding infos
|
|
157
|
-
const hasValidBBoxInfo = mesh.getBoundingInfo().boundingSphere.radius > 0;
|
|
158
|
-
// ignore meshes with infinite distance, typically these are sky boxes
|
|
159
|
-
const hasInfiniteDistance = mesh.infiniteDistance;
|
|
160
|
-
// ignore meshes with "BackgroundMaterial" - usually a ground or skybox
|
|
161
|
-
const hasBackgroundMaterial = mesh.material instanceof index_1.BackgroundMaterial;
|
|
162
|
-
// ignore excluded meshes
|
|
163
|
-
const isExcluded = excludeGeometry ? (0, geometry_helper_1.isNodeExcluded)(mesh, excludeGeometry) : false;
|
|
164
|
-
return isEnabled && hasValidBBoxInfo && !hasInfiniteDistance && !hasBackgroundMaterial && !isExcluded;
|
|
165
|
-
})
|
|
166
|
-
.reduce((accBBoxMinMax, curMesh, idx) => {
|
|
167
|
-
curMesh.refreshBoundingInfo(true, true);
|
|
168
|
-
const bBox = curMesh.getBoundingInfo().boundingBox;
|
|
169
|
-
// use the first entry in the array as default value and get the resulting maximum/minimum values
|
|
170
|
-
const max = idx === 0 ? bBox.maximumWorld : index_1.Vector3.Maximize(accBBoxMinMax.max, bBox.maximumWorld);
|
|
171
|
-
const min = idx === 0 ? bBox.minimumWorld : index_1.Vector3.Minimize(accBBoxMinMax.min, bBox.minimumWorld);
|
|
172
|
-
return { max, min };
|
|
173
|
-
}, { max: new index_1.Vector3(), min: new index_1.Vector3() });
|
|
174
|
-
const boundingInfo = new index_1.BoundingInfo(min, max);
|
|
175
|
-
return boundingInfo;
|
|
176
|
-
}
|
|
177
141
|
/**
|
|
178
142
|
* Set up viewer (engine and scene) and initialize all managers
|
|
179
143
|
*/
|
|
@@ -187,7 +151,9 @@ class Viewer {
|
|
|
187
151
|
// - `DebugManager.showCoordinateSystem`
|
|
188
152
|
// - probably dimensions line handling (not implemented yet)
|
|
189
153
|
index_1.TransformNode.BillboardUseParentOrientation = true;
|
|
190
|
-
const engine =
|
|
154
|
+
const engine = this.canvas
|
|
155
|
+
? new index_1.Engine(this.canvas, this._viewerSettings.antialiasing, (0, lodash_es_1.cloneDeep)(this._viewerSettings.engineOptions), this._viewerSettings.adaptToDeviceRatio)
|
|
156
|
+
: new index_1.NullEngine();
|
|
191
157
|
const isScaledDownDevice = (0, device_helper_1.getIsScaledDownDevice)(this._viewerSettings.limitTextureSize);
|
|
192
158
|
if (this._viewerSettings.limitTextureSize && isScaledDownDevice) {
|
|
193
159
|
engine.getCaps().maxTextureSize = this._viewerSettings.limitTextureSize.size;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/viewer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAAyC;AACzC,+CAAiC;AACjC,
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/viewer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@combeenation/3d-viewer",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "18.0.0-beta1",
|
|
4
4
|
"description": "Combeenation 3D Viewer",
|
|
5
5
|
"homepage": "https://github.com/Combeenation/3d-viewer#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -41,14 +41,18 @@
|
|
|
41
41
|
"pub-beta": "npm run dist-cjs && npm publish --tag beta",
|
|
42
42
|
"pub-final": "npm run dist-cjs && npm publish",
|
|
43
43
|
"pub-rc": "npm run dist-cjs && npm publish --tag rc",
|
|
44
|
-
"replace-version": "cross-env-shell replace \"@VERSION@\" $npm_package_version dist -r"
|
|
44
|
+
"replace-version": "cross-env-shell replace \"@VERSION@\" $npm_package_version dist -r",
|
|
45
|
+
"sleep5s": "node -e \"setTimeout(() => process.exit(0), 5000)\"",
|
|
46
|
+
"start-asset-server": "cross-env NODE_ENV='production' webpack serve --config build/webpack.test.conf.js",
|
|
47
|
+
"test": "vitest",
|
|
48
|
+
"test-delayed": "npm run sleep5s && npm run test"
|
|
45
49
|
},
|
|
46
50
|
"prettier": "@combeenation/prettier-config",
|
|
47
51
|
"dependencies": {
|
|
48
|
-
"@babylonjs/core": "7.
|
|
49
|
-
"@babylonjs/gui": "7.
|
|
50
|
-
"@babylonjs/loaders": "7.
|
|
51
|
-
"@babylonjs/serializers": "7.
|
|
52
|
+
"@babylonjs/core": "7.47.3",
|
|
53
|
+
"@babylonjs/gui": "7.47.3",
|
|
54
|
+
"@babylonjs/loaders": "7.47.3",
|
|
55
|
+
"@babylonjs/serializers": "7.47.3",
|
|
52
56
|
"eventemitter3": "4.0.7",
|
|
53
57
|
"is-svg": "^5.0.0",
|
|
54
58
|
"lodash-es": "4.17.21"
|
|
@@ -63,6 +67,7 @@
|
|
|
63
67
|
"cross-env": "7.0.3",
|
|
64
68
|
"eslint": "8.25.0",
|
|
65
69
|
"html-webpack-plugin": "5.5.0",
|
|
70
|
+
"jsdom": "^26.0.0",
|
|
66
71
|
"prettier": "2.7.1",
|
|
67
72
|
"replace": "1.2.1",
|
|
68
73
|
"rimraf": "3.0.2",
|
|
@@ -71,6 +76,7 @@
|
|
|
71
76
|
"typedoc": "0.23.15",
|
|
72
77
|
"typedoc-plugin-merge-modules": "4.0.1",
|
|
73
78
|
"typescript": "4.8.4",
|
|
79
|
+
"vitest": "2.1.8",
|
|
74
80
|
"webpack": "5.74.0",
|
|
75
81
|
"webpack-bundle-analyzer": "4.6.1",
|
|
76
82
|
"webpack-cli": "4.10.0",
|
|
@@ -78,16 +84,19 @@
|
|
|
78
84
|
"webpack-merge": "5.8.0"
|
|
79
85
|
},
|
|
80
86
|
"optionalDependencies": {
|
|
81
|
-
"@babylonjs/gui-editor": "7.
|
|
82
|
-
"@babylonjs/inspector": "7.
|
|
83
|
-
"@babylonjs/materials": "7.
|
|
84
|
-
"@babylonjs/node-editor": "7.
|
|
85
|
-
"@babylonjs/node-geometry-editor": "7.
|
|
87
|
+
"@babylonjs/gui-editor": "7.47.3",
|
|
88
|
+
"@babylonjs/inspector": "7.47.3",
|
|
89
|
+
"@babylonjs/materials": "7.47.3",
|
|
90
|
+
"@babylonjs/node-editor": "7.47.3",
|
|
91
|
+
"@babylonjs/node-geometry-editor": "7.47.3"
|
|
86
92
|
},
|
|
87
93
|
"dependenciesComments": {
|
|
88
|
-
"@babylonjs": "Latest version 7.
|
|
94
|
+
"@babylonjs": "Latest version 7.47.3 added lower camera target y limit, as requested from us (https://github.com/BabylonJS/Babylon.js/pull/16125)"
|
|
89
95
|
},
|
|
90
96
|
"optionalDependenciesComments": {
|
|
91
97
|
"@babylonjs": "Defining the inspector package (and it's dependencies) as optional is required to omit these packages in the production build of the CBN react-app (see CB-9269)"
|
|
98
|
+
},
|
|
99
|
+
"scriptsComments": {
|
|
100
|
+
"test-delayed": "Didn't manage to wait 5 seconds for starting up the asset server as an individual VS Code task, therefore it's solved as npm script"
|
|
92
101
|
}
|
|
93
102
|
}
|
package/src/index.ts
CHANGED
|
@@ -19,7 +19,9 @@ export * from '@babylonjs/core/Cameras/camera';
|
|
|
19
19
|
export * from '@babylonjs/core/Culling';
|
|
20
20
|
export * from '@babylonjs/core/Debug/axesViewer';
|
|
21
21
|
export * from '@babylonjs/core/Debug/debugLayer';
|
|
22
|
+
export * from '@babylonjs/core/Engines/abstractEngine';
|
|
22
23
|
export * from '@babylonjs/core/Engines/engine';
|
|
24
|
+
export * from '@babylonjs/core/Engines/nullEngine';
|
|
23
25
|
export * from '@babylonjs/core/Engines/thinEngine';
|
|
24
26
|
export * from '@babylonjs/core/Lights';
|
|
25
27
|
export * from '@babylonjs/core/Loading';
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { AssetContainer, SceneAssetSettings, SceneLoader, Viewer, ViewerError, ViewerErrorIds } from '..';
|
|
2
|
+
import { CbnBabylonFileData, ExtendedAssetContainer } from './cbn-custom-babylon-loader-plugin';
|
|
3
|
+
import { getInternalMetadataValue } from './metadata-helper';
|
|
4
|
+
|
|
5
|
+
export type AssetState = 'notLoaded' | 'loading' | 'loaded' | 'inScene';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Common base asset for model and scene asset
|
|
9
|
+
*/
|
|
10
|
+
export type BaseAsset = {
|
|
11
|
+
name: string;
|
|
12
|
+
url: string;
|
|
13
|
+
state: AssetState;
|
|
14
|
+
assetContainer: AssetContainer;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Help function for loading asset as asset container, with some special tweaks and fixes that we need in our CBN
|
|
19
|
+
* environment:
|
|
20
|
+
* - reconstruct current environment texture and intensity, as it get overwritten by Babylon.js basic loading function
|
|
21
|
+
* - explicitely define plugin extension for gzipped babylon files
|
|
22
|
+
* - extract and return cbn custom data from babylon file
|
|
23
|
+
* - crop materials from asset containers and add them to scene directly, as we treat materials as a global entity,
|
|
24
|
+
* which can be used from all models alike
|
|
25
|
+
*
|
|
26
|
+
* This function is used by model and scene asset alike.
|
|
27
|
+
*/
|
|
28
|
+
export async function loadAsset(
|
|
29
|
+
asset: BaseAsset,
|
|
30
|
+
viewer: Viewer
|
|
31
|
+
): Promise<{ cbnData?: CbnBabylonFileData; sceneSettingsData?: SceneAssetSettings }> {
|
|
32
|
+
asset.state = 'loading';
|
|
33
|
+
const curEnvTexture = viewer.scene.environmentTexture;
|
|
34
|
+
const curEnvIntensity = viewer.scene.environmentIntensity;
|
|
35
|
+
|
|
36
|
+
// CB-9240: Babylon.js doesn't recognize gzipped babylon files (`.babylon.gz`) as such, leading to a warning
|
|
37
|
+
// message, therefore we overwrite the plugin extension actively for such files
|
|
38
|
+
let pluginExtension;
|
|
39
|
+
try {
|
|
40
|
+
// URL constructor can throw for "valid" URL, which happened to be the case for the test asset environment where
|
|
41
|
+
// the urls are relative (starting with ".")
|
|
42
|
+
const urlObj = new URL(asset.url);
|
|
43
|
+
if (urlObj.pathname.endsWith('.babylon.gz')) {
|
|
44
|
+
pluginExtension = '.babylon';
|
|
45
|
+
}
|
|
46
|
+
} catch (e) {}
|
|
47
|
+
|
|
48
|
+
let extendedAssetContainer;
|
|
49
|
+
try {
|
|
50
|
+
extendedAssetContainer = (await SceneLoader.LoadAssetContainerAsync(
|
|
51
|
+
'',
|
|
52
|
+
asset.url,
|
|
53
|
+
viewer.scene,
|
|
54
|
+
undefined,
|
|
55
|
+
pluginExtension
|
|
56
|
+
)) as ExtendedAssetContainer;
|
|
57
|
+
} catch (e) {
|
|
58
|
+
throw new ViewerError({
|
|
59
|
+
id: ViewerErrorIds.AssetLoadingFailed,
|
|
60
|
+
message: (e as Error).message,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const { cbnData, sceneSettingsData } = extendedAssetContainer;
|
|
65
|
+
delete extendedAssetContainer.cbnData;
|
|
66
|
+
delete extendedAssetContainer.sceneSettingsData;
|
|
67
|
+
|
|
68
|
+
// from here it's a basic asset container again
|
|
69
|
+
const assetContainer = extendedAssetContainer as AssetContainer;
|
|
70
|
+
|
|
71
|
+
// materials should be a "global" thing and not assigned to an asset container
|
|
72
|
+
// this is not relevant for model assets in most of the cases, since materials are cropped from babylon models on the
|
|
73
|
+
// CBN server anyway
|
|
74
|
+
assetContainer.materials.forEach(material => {
|
|
75
|
+
viewer.scene.addMaterial(material);
|
|
76
|
+
material._parentContainer = null;
|
|
77
|
+
viewer.parameterManager.applyParameterValuesToMaterial(material);
|
|
78
|
+
});
|
|
79
|
+
assetContainer.materials = [];
|
|
80
|
+
|
|
81
|
+
// environment texture and intensity has been overwritten by load asset container function
|
|
82
|
+
viewer.scene.environmentTexture = curEnvTexture;
|
|
83
|
+
viewer.scene.environmentIntensity = curEnvIntensity;
|
|
84
|
+
|
|
85
|
+
asset.assetContainer = assetContainer;
|
|
86
|
+
asset.state = 'loaded';
|
|
87
|
+
|
|
88
|
+
return { cbnData, sceneSettingsData };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Help function for applying parameter values and "deferred" material to asset (model or scene asset), before using it
|
|
93
|
+
* in the scene
|
|
94
|
+
*/
|
|
95
|
+
export async function prepareAssetForScene(asset: BaseAsset, viewer: Viewer): Promise<void> {
|
|
96
|
+
await viewer.parameterManager.applyAllParameterValuesToModel(asset.assetContainer);
|
|
97
|
+
// parameter manager did his job, now apply the deferred materials to all meshes that are not explicitely hidden by
|
|
98
|
+
// the parameter manager
|
|
99
|
+
await _applyDeferredMaterialsForAllVisibleMeshes(asset, viewer);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Creates and assigns each "deferred" material to the corresponding mesh, if the mesh is visible.
|
|
104
|
+
* Model should be ready to use immediately after this function has done it's job.
|
|
105
|
+
*/
|
|
106
|
+
async function _applyDeferredMaterialsForAllVisibleMeshes(asset: BaseAsset, viewer: Viewer): Promise<void> {
|
|
107
|
+
const setMaterialProms = asset.assetContainer.meshes.map(async mesh => {
|
|
108
|
+
const deferredMaterial = getInternalMetadataValue(mesh, 'deferredMaterial');
|
|
109
|
+
const visible = viewer.parameterManager.getNestedVisibilityParameterValueOfNode(mesh);
|
|
110
|
+
if (deferredMaterial && visible) {
|
|
111
|
+
await viewer.materialManager.setMaterialOnMesh(deferredMaterial as string, mesh);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
await Promise.all(setMaterialProms);
|
|
115
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AssetContainer,
|
|
3
|
-
|
|
3
|
+
Color4,
|
|
4
4
|
ISceneLoaderPlugin,
|
|
5
5
|
InstancedMesh,
|
|
6
6
|
ParsedDecalConfiguration,
|
|
7
|
+
SceneAssetSettings,
|
|
7
8
|
SceneLoader,
|
|
8
9
|
ViewerError,
|
|
9
10
|
ViewerErrorIds,
|
|
@@ -13,6 +14,23 @@ import { setInternalMetadataValue } from './metadata-helper';
|
|
|
13
14
|
import { deleteAllTags, getTagsAsStrArr, setTagsAsString } from './tags-helper';
|
|
14
15
|
import { isArray, isString } from 'lodash-es';
|
|
15
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Contains cbn custom data, like decals or scene settings.
|
|
19
|
+
* This is just a temporary type, as the `loadAssetContainer` function only returns an asset container, which can be
|
|
20
|
+
* altered by our file loader plugin.
|
|
21
|
+
* After loading the model, `cbnData` is cropped and a pure asset container is available for further processing.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export class ExtendedAssetContainer extends AssetContainer {
|
|
25
|
+
cbnData?: CbnBabylonFileData;
|
|
26
|
+
sceneSettingsData?: SceneAssetSettings;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export type CbnBabylonFileData = { decals?: ParsedDecalConfiguration[] };
|
|
33
|
+
|
|
16
34
|
type DataWithMeshes = { meshes: unknown[] };
|
|
17
35
|
type DataWithDecalConfigurations = { cbnData: { decals: unknown[] } };
|
|
18
36
|
|
|
@@ -59,7 +77,11 @@ export function registerCustomCbnBabylonLoaderPlugin(): void {
|
|
|
59
77
|
load: previousLoaderPlugin.load,
|
|
60
78
|
loadAssetContainer: (scene, data, rootUrl, onError): ExtendedAssetContainer => {
|
|
61
79
|
const dataParsed = JSON.parse(data as string);
|
|
62
|
-
|
|
80
|
+
// root url parameter is left empty for the following reasons:
|
|
81
|
+
// - cube texture creation (for environment) breaks, as Babylon.js tries to prefix absolute paths (e.g. from
|
|
82
|
+
// Babylon.js server) with the root url
|
|
83
|
+
// - we always have absolute paths anyway => links to 3d model, material & textures assets
|
|
84
|
+
const importedContainer = previousLoaderPlugin.loadAssetContainer(scene, data, '');
|
|
63
85
|
|
|
64
86
|
_addMissingMaterialMetadata(dataParsed, importedContainer);
|
|
65
87
|
_reconstructTagsForInstancedMeshes(dataParsed, importedContainer);
|
|
@@ -73,9 +95,14 @@ export function registerCustomCbnBabylonLoaderPlugin(): void {
|
|
|
73
95
|
onError?.((e as Error).message);
|
|
74
96
|
}
|
|
75
97
|
|
|
76
|
-
// add `cbnData` to output asset container, so that this information can be
|
|
98
|
+
// add `cbnData` to output asset container, so that this information can be stored as metadata for the model
|
|
99
|
+
// same with `sceneSettingsData`, which is used in the scene asset
|
|
77
100
|
const extendedContainer = importedContainer as ExtendedAssetContainer;
|
|
78
101
|
extendedContainer.cbnData = dataParsed.cbnData;
|
|
102
|
+
extendedContainer.sceneSettingsData = {
|
|
103
|
+
environmentIntensity: dataParsed.environmentIntensity,
|
|
104
|
+
clearColor: dataParsed.clearColor && Color4.FromArray(dataParsed.clearColor),
|
|
105
|
+
};
|
|
79
106
|
|
|
80
107
|
return extendedContainer;
|
|
81
108
|
},
|
|
@@ -73,17 +73,21 @@ export function createBuiltInTextureParameter(parameterManager: ParameterManager
|
|
|
73
73
|
const texture = _getTextureFromParameterChannel(pbrMaterial, channel);
|
|
74
74
|
|
|
75
75
|
if (texture) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
if (url) {
|
|
77
|
+
// create a clone of the texture, in this way we can load the image before assigning it to the material
|
|
78
|
+
// channel
|
|
79
|
+
const clonedTexture = texture.clone();
|
|
80
|
+
// update texture and await loading time right away
|
|
81
|
+
await new Promise<void>(resolve => clonedTexture.updateURL(url, undefined, resolve));
|
|
82
|
+
|
|
83
|
+
_assignTextureParameterChannel(clonedTexture, pbrMaterial, channel);
|
|
84
|
+
} else {
|
|
85
|
+
_removeFromTextureParameterChannel(pbrMaterial, channel);
|
|
86
|
+
}
|
|
83
87
|
|
|
84
88
|
// dispose old texture
|
|
85
89
|
texture.dispose();
|
|
86
|
-
} else {
|
|
90
|
+
} else if (url) {
|
|
87
91
|
// no texture, or wrong type => create texture from scratch
|
|
88
92
|
// first we check if some settings were provided in the material definition
|
|
89
93
|
const addMatSettings = await window.Cbn?.Assets.getMaterial(pbrMaterial.id);
|
|
@@ -341,6 +345,19 @@ function _assignTextureParameterChannel(
|
|
|
341
345
|
}
|
|
342
346
|
}
|
|
343
347
|
|
|
348
|
+
/**
|
|
349
|
+
* Remove runtime texture from dedicated channel in the PBR material
|
|
350
|
+
*/
|
|
351
|
+
function _removeFromTextureParameterChannel(pbrMaterial: PBRMaterial, channel: ParameterTextureChannelsKeys): void {
|
|
352
|
+
if (channel === 'metallicRoughnessTexture') {
|
|
353
|
+
pbrMaterial.metallicTexture = null;
|
|
354
|
+
} else if (channel === 'detailmapTexture') {
|
|
355
|
+
pbrMaterial.detailMap.texture = null;
|
|
356
|
+
} else {
|
|
357
|
+
pbrMaterial[channel] = null;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
344
361
|
/**
|
|
345
362
|
* Similar to `_getTextureFromParameterChannel`, whereas the input is a plain JSON object instead of a runtime material
|
|
346
363
|
*/
|
|
@@ -131,7 +131,7 @@ export class CameraManager {
|
|
|
131
131
|
}
|
|
132
132
|
|
|
133
133
|
// get bounding box of all visible meshes, this is the base for the autofocus algorithm
|
|
134
|
-
const boundingInfo = this.viewer.calculateBoundingInfo(settings?.exclude);
|
|
134
|
+
const boundingInfo = this.viewer.sceneManager.calculateBoundingInfo(settings?.exclude);
|
|
135
135
|
// optionally show bounding sphere for debugging purpose
|
|
136
136
|
this.viewer.eventManager.fireEvent(ViewerEvent.AutofocusStart, boundingInfo.boundingSphere);
|
|
137
137
|
|
|
@@ -272,7 +272,9 @@ export class CameraManager {
|
|
|
272
272
|
const screenshotCam = this.viewer.scene.activeCamera?.clone(
|
|
273
273
|
CameraManager._SCREENSHOT_CAMERA_NAME
|
|
274
274
|
) as ArcRotateCamera;
|
|
275
|
-
const boundingInfo = settings?.autofocusScene
|
|
275
|
+
const boundingInfo = settings?.autofocusScene
|
|
276
|
+
? this.viewer.sceneManager.calculateBoundingInfo(settings.exclude)
|
|
277
|
+
: undefined;
|
|
276
278
|
|
|
277
279
|
if (settings?.alpha !== undefined) {
|
|
278
280
|
screenshotCam.alpha = settings.alpha;
|
|
@@ -91,7 +91,7 @@ The inspector can only be used in development builds.`);
|
|
|
91
91
|
public showCoordinateSystem(node?: TransformNode, size?: number): void {
|
|
92
92
|
// calculate the default size of not provided
|
|
93
93
|
if (!size) {
|
|
94
|
-
const sceneBoundingInfo = this.viewer.calculateBoundingInfo();
|
|
94
|
+
const sceneBoundingInfo = this.viewer.sceneManager.calculateBoundingInfo();
|
|
95
95
|
const radius = sceneBoundingInfo.boundingSphere.radius;
|
|
96
96
|
|
|
97
97
|
// takes a third of the radius from scene boundingsphere
|