@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.
Files changed (45) hide show
  1. package/dist/lib-cjs/buildinfo.json +1 -1
  2. package/dist/lib-cjs/commonjs.tsconfig.tsbuildinfo +1 -1
  3. package/dist/lib-cjs/index.d.ts +2 -0
  4. package/dist/lib-cjs/index.js +2 -0
  5. package/dist/lib-cjs/index.js.map +1 -1
  6. package/dist/lib-cjs/internal/asset-helper.d.ts +32 -0
  7. package/dist/lib-cjs/internal/asset-helper.js +105 -0
  8. package/dist/lib-cjs/internal/asset-helper.js.map +1 -0
  9. package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.d.ts +18 -0
  10. package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js +22 -3
  11. package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js.map +1 -1
  12. package/dist/lib-cjs/internal/texture-parameter-helper.js +26 -7
  13. package/dist/lib-cjs/internal/texture-parameter-helper.js.map +1 -1
  14. package/dist/lib-cjs/manager/camera-manager.js +4 -2
  15. package/dist/lib-cjs/manager/camera-manager.js.map +1 -1
  16. package/dist/lib-cjs/manager/debug-manager.js +1 -1
  17. package/dist/lib-cjs/manager/debug-manager.js.map +1 -1
  18. package/dist/lib-cjs/manager/model-manager.d.ts +11 -33
  19. package/dist/lib-cjs/manager/model-manager.js +47 -106
  20. package/dist/lib-cjs/manager/model-manager.js.map +1 -1
  21. package/dist/lib-cjs/manager/parameter-manager.d.ts +16 -11
  22. package/dist/lib-cjs/manager/parameter-manager.js +78 -69
  23. package/dist/lib-cjs/manager/parameter-manager.js.map +1 -1
  24. package/dist/lib-cjs/manager/scene-manager.d.ts +111 -5
  25. package/dist/lib-cjs/manager/scene-manager.js +269 -10
  26. package/dist/lib-cjs/manager/scene-manager.js.map +1 -1
  27. package/dist/lib-cjs/viewer-error.d.ts +1 -0
  28. package/dist/lib-cjs/viewer-error.js +1 -0
  29. package/dist/lib-cjs/viewer-error.js.map +1 -1
  30. package/dist/lib-cjs/viewer.d.ts +4 -13
  31. package/dist/lib-cjs/viewer.js +3 -37
  32. package/dist/lib-cjs/viewer.js.map +1 -1
  33. package/package.json +21 -12
  34. package/src/index.ts +2 -0
  35. package/src/internal/asset-helper.ts +115 -0
  36. package/src/internal/cbn-custom-babylon-loader-plugin.ts +30 -3
  37. package/src/internal/texture-parameter-helper.ts +25 -8
  38. package/src/manager/camera-manager.ts +4 -2
  39. package/src/manager/debug-manager.ts +1 -1
  40. package/src/manager/model-manager.ts +55 -137
  41. package/src/manager/parameter-manager.ts +93 -74
  42. package/src/manager/scene-manager.ts +366 -10
  43. package/src/viewer-error.ts +1 -0
  44. package/src/viewer.ts +13 -55
  45. package/src/dev.ts +0 -47
@@ -1,5 +1,5 @@
1
1
  import * as Index from './index';
2
- import { BoundingInfo, CameraManager, DebugManager, DefaultSceneSettings, Engine, EngineOptions, EventManager, GltfExportManager, MaterialManager, ModelManager, ParameterManager, ParameterSubject, Scene, SceneManager, TextureManager, TransformNode } from './index';
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: HTMLCanvasElement;
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(): 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: HTMLCanvasElement, viewerSettings?: DeepPartial<ViewerSettings>, defaultSceneSettings?: DeepPartial<DefaultSceneSettings>);
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
  */
@@ -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 = new index_1.Engine(this.canvas, this._viewerSettings.antialiasing, (0, lodash_es_1.cloneDeep)(this._viewerSettings.engineOptions), this._viewerSettings.adaptToDeviceRatio);
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":"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"}
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": "17.1.0-beta1",
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.43.0",
49
- "@babylonjs/gui": "7.43.0",
50
- "@babylonjs/loaders": "7.43.0",
51
- "@babylonjs/serializers": "7.43.0",
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.43.0",
82
- "@babylonjs/inspector": "7.43.0",
83
- "@babylonjs/materials": "7.43.0",
84
- "@babylonjs/node-editor": "7.43.0",
85
- "@babylonjs/node-geometry-editor": "7.43.0"
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.43.0 comes with getters for tagged entities in asset containers, as requested by us (see [PR](https://github.com/BabylonJS/Babylon.js/pull/16029))"
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
- ExtendedAssetContainer,
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
- const importedContainer = previousLoaderPlugin.loadAssetContainer(scene, data, rootUrl);
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 store as metadata for the model
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
- // create a clone of the texture, in this way we can load the image before assigning it to the material
77
- // channel
78
- const clonedTexture = texture.clone();
79
- // update texture and await loading time right away
80
- await new Promise<void>(resolve => clonedTexture.updateURL(url, undefined, resolve));
81
-
82
- _assignTextureParameterChannel(clonedTexture, pbrMaterial, channel);
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 ? this.viewer.calculateBoundingInfo(settings.exclude) : undefined;
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