@combeenation/3d-viewer 12.4.1 → 13.0.1
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 +63 -63
- package/dist/lib-cjs/index.js +81 -114
- package/dist/lib-cjs/index.js.map +1 -1
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.d.ts +10 -0
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js +132 -0
- package/dist/lib-cjs/internal/cbn-custom-babylon-loader-plugin.js.map +1 -0
- package/dist/lib-cjs/internal/cloning-helper.d.ts +19 -0
- package/dist/lib-cjs/internal/cloning-helper.js +164 -0
- package/dist/lib-cjs/internal/cloning-helper.js.map +1 -0
- package/dist/lib-cjs/internal/device-helper.d.ts +9 -0
- package/dist/lib-cjs/{api/util/deviceHelper.js → internal/device-helper.js} +7 -11
- package/dist/lib-cjs/internal/device-helper.js.map +1 -0
- package/dist/lib-cjs/internal/geometry-helper.d.ts +21 -0
- package/dist/lib-cjs/{api/util/geometryHelper.js → internal/geometry-helper.js} +58 -25
- package/dist/lib-cjs/internal/geometry-helper.js.map +1 -0
- package/dist/lib-cjs/internal/metadata-helper.d.ts +26 -0
- package/dist/lib-cjs/internal/metadata-helper.js +51 -0
- package/dist/lib-cjs/internal/metadata-helper.js.map +1 -0
- package/dist/lib-cjs/internal/paintable-helper.d.ts +40 -0
- package/dist/lib-cjs/internal/paintable-helper.js +287 -0
- package/dist/lib-cjs/internal/paintable-helper.js.map +1 -0
- package/dist/lib-cjs/internal/tags-helper.d.ts +12 -0
- package/dist/lib-cjs/internal/tags-helper.js +38 -0
- package/dist/lib-cjs/internal/tags-helper.js.map +1 -0
- package/dist/lib-cjs/manager/camera-manager.d.ts +51 -0
- package/dist/lib-cjs/manager/camera-manager.js +154 -0
- package/dist/lib-cjs/manager/camera-manager.js.map +1 -0
- package/dist/lib-cjs/manager/debug-manager.d.ts +60 -0
- package/dist/lib-cjs/manager/debug-manager.js +218 -0
- package/dist/lib-cjs/manager/debug-manager.js.map +1 -0
- package/dist/lib-cjs/manager/event-manager.d.ts +52 -0
- package/dist/lib-cjs/manager/event-manager.js +72 -0
- package/dist/lib-cjs/manager/event-manager.js.map +1 -0
- package/dist/lib-cjs/{api/manager/gltfExportManager.d.ts → manager/gltf-export-manager.d.ts} +29 -34
- package/dist/lib-cjs/{api/manager/gltfExportManager.js → manager/gltf-export-manager.js} +103 -124
- package/dist/lib-cjs/manager/gltf-export-manager.js.map +1 -0
- package/dist/lib-cjs/manager/material-manager.d.ts +35 -0
- package/dist/lib-cjs/manager/material-manager.js +126 -0
- package/dist/lib-cjs/manager/material-manager.js.map +1 -0
- package/dist/lib-cjs/manager/model-manager.d.ts +145 -0
- package/dist/lib-cjs/manager/model-manager.js +383 -0
- package/dist/lib-cjs/manager/model-manager.js.map +1 -0
- package/dist/lib-cjs/manager/parameter-manager.d.ts +210 -0
- package/dist/lib-cjs/manager/parameter-manager.js +515 -0
- package/dist/lib-cjs/manager/parameter-manager.js.map +1 -0
- package/dist/lib-cjs/manager/scene-manager.d.ts +45 -0
- package/dist/lib-cjs/manager/scene-manager.js +65 -0
- package/dist/lib-cjs/manager/scene-manager.js.map +1 -0
- package/dist/lib-cjs/manager/screenshot-manager.d.ts +36 -0
- package/dist/lib-cjs/manager/screenshot-manager.js +40 -0
- package/dist/lib-cjs/manager/screenshot-manager.js.map +1 -0
- package/dist/lib-cjs/manager/texture-manager.d.ts +12 -0
- package/dist/lib-cjs/manager/texture-manager.js +44 -0
- package/dist/lib-cjs/manager/texture-manager.js.map +1 -0
- package/dist/lib-cjs/{api/classes/viewerError.d.ts → viewer-error.d.ts} +6 -1
- package/dist/lib-cjs/{api/classes/viewerError.js → viewer-error.js} +7 -2
- package/dist/lib-cjs/viewer-error.js.map +1 -0
- package/dist/lib-cjs/viewer.d.ts +117 -0
- package/dist/lib-cjs/viewer.js +222 -0
- package/dist/lib-cjs/viewer.js.map +1 -0
- package/package.json +10 -11
- package/src/dev.ts +14 -37
- package/src/{types.d.ts → global-types.d.ts} +8 -18
- package/src/index.ts +79 -113
- package/src/internal/cbn-custom-babylon-loader-plugin.ts +159 -0
- package/src/internal/cloning-helper.ts +225 -0
- package/src/internal/device-helper.ts +25 -0
- package/src/{api/util/geometryHelper.ts → internal/geometry-helper.ts} +63 -24
- package/src/internal/metadata-helper.ts +63 -0
- package/src/internal/paintable-helper.ts +310 -0
- package/src/internal/tags-helper.ts +41 -0
- package/src/manager/camera-manager.ts +236 -0
- package/src/manager/debug-manager.ts +245 -0
- package/src/manager/event-manager.ts +72 -0
- package/src/{api/manager/gltfExportManager.ts → manager/gltf-export-manager.ts} +132 -125
- package/src/manager/material-manager.ts +135 -0
- package/src/manager/model-manager.ts +458 -0
- package/src/manager/parameter-manager.ts +652 -0
- package/src/manager/scene-manager.ts +101 -0
- package/src/manager/screenshot-manager.ts +59 -0
- package/src/manager/texture-manager.ts +32 -0
- package/src/{api/classes/viewerError.ts → viewer-error.ts} +6 -1
- package/src/viewer.ts +296 -0
- package/dist/lib-cjs/api/classes/animationInterface.d.ts +0 -8
- package/dist/lib-cjs/api/classes/animationInterface.js +0 -3
- package/dist/lib-cjs/api/classes/animationInterface.js.map +0 -1
- package/dist/lib-cjs/api/classes/dottedPath.d.ts +0 -79
- package/dist/lib-cjs/api/classes/dottedPath.js +0 -167
- package/dist/lib-cjs/api/classes/dottedPath.js.map +0 -1
- package/dist/lib-cjs/api/classes/element.d.ts +0 -153
- package/dist/lib-cjs/api/classes/element.js +0 -703
- package/dist/lib-cjs/api/classes/element.js.map +0 -1
- package/dist/lib-cjs/api/classes/event.d.ts +0 -401
- package/dist/lib-cjs/api/classes/event.js +0 -425
- package/dist/lib-cjs/api/classes/event.js.map +0 -1
- package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +0 -26
- package/dist/lib-cjs/api/classes/eventBroadcaster.js +0 -50
- package/dist/lib-cjs/api/classes/eventBroadcaster.js.map +0 -1
- package/dist/lib-cjs/api/classes/fuzzyMap.d.ts +0 -7
- package/dist/lib-cjs/api/classes/fuzzyMap.js +0 -22
- package/dist/lib-cjs/api/classes/fuzzyMap.js.map +0 -1
- package/dist/lib-cjs/api/classes/parameter.d.ts +0 -410
- package/dist/lib-cjs/api/classes/parameter.js +0 -643
- package/dist/lib-cjs/api/classes/parameter.js.map +0 -1
- package/dist/lib-cjs/api/classes/parameterObservable.d.ts +0 -36
- package/dist/lib-cjs/api/classes/parameterObservable.js +0 -73
- package/dist/lib-cjs/api/classes/parameterObservable.js.map +0 -1
- package/dist/lib-cjs/api/classes/parameterizable.d.ts +0 -15
- package/dist/lib-cjs/api/classes/parameterizable.js +0 -103
- package/dist/lib-cjs/api/classes/parameterizable.js.map +0 -1
- package/dist/lib-cjs/api/classes/placementAnimation.d.ts +0 -45
- package/dist/lib-cjs/api/classes/placementAnimation.js +0 -177
- package/dist/lib-cjs/api/classes/placementAnimation.js.map +0 -1
- package/dist/lib-cjs/api/classes/variant.d.ts +0 -261
- package/dist/lib-cjs/api/classes/variant.js +0 -873
- package/dist/lib-cjs/api/classes/variant.js.map +0 -1
- package/dist/lib-cjs/api/classes/variantInstance.d.ts +0 -53
- package/dist/lib-cjs/api/classes/variantInstance.js +0 -126
- package/dist/lib-cjs/api/classes/variantInstance.js.map +0 -1
- package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +0 -17
- package/dist/lib-cjs/api/classes/variantParameterizable.js +0 -87
- package/dist/lib-cjs/api/classes/variantParameterizable.js.map +0 -1
- package/dist/lib-cjs/api/classes/viewer.d.ts +0 -215
- package/dist/lib-cjs/api/classes/viewer.js +0 -709
- package/dist/lib-cjs/api/classes/viewer.js.map +0 -1
- package/dist/lib-cjs/api/classes/viewerError.js.map +0 -1
- package/dist/lib-cjs/api/classes/viewerLight.d.ts +0 -66
- package/dist/lib-cjs/api/classes/viewerLight.js +0 -345
- package/dist/lib-cjs/api/classes/viewerLight.js.map +0 -1
- package/dist/lib-cjs/api/internal/lensRendering.d.ts +0 -8
- package/dist/lib-cjs/api/internal/lensRendering.js +0 -12
- package/dist/lib-cjs/api/internal/lensRendering.js.map +0 -1
- package/dist/lib-cjs/api/internal/sceneSetup.d.ts +0 -13
- package/dist/lib-cjs/api/internal/sceneSetup.js +0 -228
- package/dist/lib-cjs/api/internal/sceneSetup.js.map +0 -1
- package/dist/lib-cjs/api/manager/animationManager.d.ts +0 -30
- package/dist/lib-cjs/api/manager/animationManager.js +0 -127
- package/dist/lib-cjs/api/manager/animationManager.js.map +0 -1
- package/dist/lib-cjs/api/manager/gltfExportManager.js.map +0 -1
- package/dist/lib-cjs/api/manager/sceneManager.d.ts +0 -33
- package/dist/lib-cjs/api/manager/sceneManager.js +0 -129
- package/dist/lib-cjs/api/manager/sceneManager.js.map +0 -1
- package/dist/lib-cjs/api/manager/tagManager.d.ts +0 -118
- package/dist/lib-cjs/api/manager/tagManager.js +0 -531
- package/dist/lib-cjs/api/manager/tagManager.js.map +0 -1
- package/dist/lib-cjs/api/manager/textureLoadManager.d.ts +0 -22
- package/dist/lib-cjs/api/manager/textureLoadManager.js +0 -108
- package/dist/lib-cjs/api/manager/textureLoadManager.js.map +0 -1
- package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +0 -106
- package/dist/lib-cjs/api/manager/variantInstanceManager.js +0 -291
- package/dist/lib-cjs/api/manager/variantInstanceManager.js.map +0 -1
- package/dist/lib-cjs/api/store/specStorage.d.ts +0 -32
- package/dist/lib-cjs/api/store/specStorage.js +0 -66
- package/dist/lib-cjs/api/store/specStorage.js.map +0 -1
- package/dist/lib-cjs/api/util/babylonHelper.d.ts +0 -238
- package/dist/lib-cjs/api/util/babylonHelper.js +0 -826
- package/dist/lib-cjs/api/util/babylonHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/debugHelper.d.ts +0 -9
- package/dist/lib-cjs/api/util/debugHelper.js +0 -94
- package/dist/lib-cjs/api/util/debugHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/deviceHelper.d.ts +0 -9
- package/dist/lib-cjs/api/util/deviceHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/geometryHelper.d.ts +0 -17
- package/dist/lib-cjs/api/util/geometryHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/globalTypes.d.ts +0 -490
- package/dist/lib-cjs/api/util/globalTypes.js +0 -2
- package/dist/lib-cjs/api/util/globalTypes.js.map +0 -1
- package/dist/lib-cjs/api/util/resourceHelper.d.ts +0 -58
- package/dist/lib-cjs/api/util/resourceHelper.js +0 -215
- package/dist/lib-cjs/api/util/resourceHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/sceneLoaderHelper.d.ts +0 -58
- package/dist/lib-cjs/api/util/sceneLoaderHelper.js +0 -229
- package/dist/lib-cjs/api/util/sceneLoaderHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/stringHelper.d.ts +0 -13
- package/dist/lib-cjs/api/util/stringHelper.js +0 -33
- package/dist/lib-cjs/api/util/stringHelper.js.map +0 -1
- package/dist/lib-cjs/api/util/structureHelper.d.ts +0 -9
- package/dist/lib-cjs/api/util/structureHelper.js +0 -58
- package/dist/lib-cjs/api/util/structureHelper.js.map +0 -1
- package/src/api/classes/animationInterface.ts +0 -10
- package/src/api/classes/dottedPath.ts +0 -181
- package/src/api/classes/element.ts +0 -766
- package/src/api/classes/event.ts +0 -457
- package/src/api/classes/eventBroadcaster.ts +0 -52
- package/src/api/classes/fuzzyMap.ts +0 -21
- package/src/api/classes/parameter.ts +0 -686
- package/src/api/classes/parameterObservable.ts +0 -73
- package/src/api/classes/parameterizable.ts +0 -87
- package/src/api/classes/placementAnimation.ts +0 -162
- package/src/api/classes/variant.ts +0 -965
- package/src/api/classes/variantInstance.ts +0 -123
- package/src/api/classes/variantParameterizable.ts +0 -83
- package/src/api/classes/viewer.ts +0 -751
- package/src/api/classes/viewerLight.ts +0 -335
- package/src/api/internal/debugViewer.ts +0 -90
- package/src/api/internal/lensRendering.ts +0 -9
- package/src/api/internal/sceneSetup.ts +0 -208
- package/src/api/manager/animationManager.ts +0 -143
- package/src/api/manager/sceneManager.ts +0 -134
- package/src/api/manager/tagManager.ts +0 -572
- package/src/api/manager/textureLoadManager.ts +0 -107
- package/src/api/manager/variantInstanceManager.ts +0 -306
- package/src/api/store/specStorage.ts +0 -68
- package/src/api/util/babylonHelper.ts +0 -915
- package/src/api/util/debugHelper.ts +0 -121
- package/src/api/util/deviceHelper.ts +0 -31
- package/src/api/util/globalTypes.ts +0 -566
- package/src/api/util/resourceHelper.ts +0 -201
- package/src/api/util/sceneLoaderHelper.ts +0 -247
- package/src/api/util/stringHelper.ts +0 -30
- package/src/api/util/structureHelper.ts +0 -62
|
@@ -10,29 +10,89 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.GltfExportManager = void 0;
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const instancedMesh_1 = require("@babylonjs/core/Meshes/instancedMesh");
|
|
22
|
-
const mesh_1 = require("@babylonjs/core/Meshes/mesh");
|
|
23
|
-
const transformNode_1 = require("@babylonjs/core/Meshes/transformNode");
|
|
24
|
-
require("@babylonjs/serializers/glTF/2.0/Extensions/KHR_texture_transform");
|
|
25
|
-
const glTFSerializer_1 = require("@babylonjs/serializers/glTF/2.0/glTFSerializer");
|
|
13
|
+
const index_1 = require("../index");
|
|
14
|
+
const device_helper_1 = require("../internal/device-helper");
|
|
15
|
+
const geometry_helper_1 = require("../internal/geometry-helper");
|
|
16
|
+
const geometry_helper_2 = require("../internal/geometry-helper");
|
|
17
|
+
const metadata_helper_1 = require("../internal/metadata-helper");
|
|
18
|
+
/**
|
|
19
|
+
* Manager for gltf export and augmented reality features
|
|
20
|
+
*/
|
|
26
21
|
class GltfExportManager {
|
|
22
|
+
/** @internal */
|
|
27
23
|
constructor(viewer) {
|
|
28
24
|
this.viewer = viewer;
|
|
29
25
|
// store initial max texture size, so that we can restore it in the post processing
|
|
30
26
|
this._maxTextureSize = viewer.engine.getCaps().maxTextureSize;
|
|
31
27
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Defines options for the export.
|
|
30
|
+
* We don't allow the user to overwrite certain settings, since we rely on properties like `removeNoopRootNodes` to
|
|
31
|
+
* stay `true` in order to make the AR export work.
|
|
32
|
+
* We could theoretically allow it if AR optimization is not desired, but this may confuse the user.
|
|
33
|
+
*/
|
|
34
|
+
static _gltfExportOptions(optimizeForAR, excluded) {
|
|
35
|
+
return {
|
|
36
|
+
shouldExportNode: function (node) {
|
|
37
|
+
if (optimizeForAR) {
|
|
38
|
+
// we explicitely marked nodes, that should be exported in AR mode
|
|
39
|
+
return (0, metadata_helper_1.getInternalMetadataValue)(node, 'exportNode');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// use the default export node check (enabled state, exclusion list, etc...)
|
|
43
|
+
return GltfExportManager._shouldExportNode(node, excluded);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Checks if a node should be available in the export
|
|
50
|
+
*/
|
|
51
|
+
static _shouldExportNode(node, excluded) {
|
|
52
|
+
if (!(node instanceof index_1.TransformNode)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// TODO WTT: think of adding "BackgroundHelper" and nodes with "infiniteDistance" here as well, at least in AR mode
|
|
56
|
+
if (!node.isEnabled()) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
if (excluded && (0, geometry_helper_2.isNodeExcluded)(node, excluded)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Creates a clone of the material which should be used for the export.
|
|
66
|
+
* This is mostly required for recreating textures with lower sizes.
|
|
67
|
+
* CAUTION: Material exchanging is not supported for materials that contain certain texture types:
|
|
68
|
+
* - Dynamic textures (Paintables): Cloning dynamic textures doesn't clone the canvas context
|
|
69
|
+
* => so the clone is just empty
|
|
70
|
+
* - Render target textures: Disposing the clone will leave the scene in a "not ready" state
|
|
71
|
+
* => this scenario is not fully analyzed yet, but it's not really worth the effort right now, since this kind of
|
|
72
|
+
* of texture is not really used ATM
|
|
73
|
+
*/
|
|
74
|
+
static _exchangeMaterial(material) {
|
|
75
|
+
const baseTextures = material.getActiveTextures();
|
|
76
|
+
const hasDynamicTextures = baseTextures.some(texture => texture instanceof index_1.DynamicTexture);
|
|
77
|
+
const hasRenderTargetTextures = baseTextures.some(texture => texture instanceof index_1.RenderTargetTexture);
|
|
78
|
+
if (hasDynamicTextures || hasRenderTargetTextures) {
|
|
79
|
+
const textureTypesString = [
|
|
80
|
+
hasDynamicTextures ? 'Dynamic Textures' : '',
|
|
81
|
+
hasRenderTargetTextures ? 'Render Target Textures' : '',
|
|
82
|
+
]
|
|
83
|
+
.filter(Boolean)
|
|
84
|
+
.join();
|
|
85
|
+
console.warn(`Couldn't exchange material "${material.name}" in GLB export, as it contains unsupported texture type(s) (${textureTypesString}). The export will still work, but the textures of this material will keep their original size.`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const newName = `${material.name}_clone`;
|
|
89
|
+
const clonedMaterial = material.clone(newName);
|
|
90
|
+
(0, metadata_helper_1.cloneInternalMetadata)(material, clonedMaterial);
|
|
91
|
+
const clonedTextures = clonedMaterial.getActiveTextures();
|
|
92
|
+
// mark all exported textures, so that they will be deleted after the export
|
|
93
|
+
clonedTextures.forEach(texture => (0, metadata_helper_1.setInternalMetadataValue)(texture, 'deleteAfterExport', true));
|
|
94
|
+
(0, metadata_helper_1.setInternalMetadataValue)(material, 'exchangeMaterialWith', clonedMaterial.uniqueId);
|
|
95
|
+
(0, metadata_helper_1.setInternalMetadataValue)(clonedMaterial, 'deleteAfterExport', true);
|
|
36
96
|
}
|
|
37
97
|
/**
|
|
38
98
|
* Exports selected nodes to a file.
|
|
@@ -44,7 +104,7 @@ class GltfExportManager {
|
|
|
44
104
|
exportGlb(filename = 'glb-export.glb', optimizeForAR = false, excluded) {
|
|
45
105
|
return __awaiter(this, void 0, void 0, function* () {
|
|
46
106
|
yield this._exportPreProcess(optimizeForAR, excluded);
|
|
47
|
-
const glbData = yield
|
|
107
|
+
const glbData = yield index_1.GLTF2Export.GLBAsync(this.viewer.scene, 'dummy', GltfExportManager._gltfExportOptions(optimizeForAR, excluded));
|
|
48
108
|
yield this._exportPostProcess(optimizeForAR);
|
|
49
109
|
const resBlob = glbData.glTFFiles['dummy.glb'];
|
|
50
110
|
// check if result is valid, according to the typings this could also be a string
|
|
@@ -70,7 +130,7 @@ class GltfExportManager {
|
|
|
70
130
|
exportGltfToFile(filename, optimizeForAR = false, excluded) {
|
|
71
131
|
return __awaiter(this, void 0, void 0, function* () {
|
|
72
132
|
yield this._exportPreProcess(optimizeForAR, excluded);
|
|
73
|
-
const gltf = yield
|
|
133
|
+
const gltf = yield index_1.GLTF2Export.GLTFAsync(this.viewer.scene, filename, GltfExportManager._gltfExportOptions(optimizeForAR, excluded));
|
|
74
134
|
gltf.downloadFiles();
|
|
75
135
|
this._exportPostProcess(optimizeForAR);
|
|
76
136
|
});
|
|
@@ -85,7 +145,7 @@ class GltfExportManager {
|
|
|
85
145
|
exportGlbToFile(filename, optimizeForAR = false, excluded) {
|
|
86
146
|
return __awaiter(this, void 0, void 0, function* () {
|
|
87
147
|
yield this._exportPreProcess(optimizeForAR, excluded);
|
|
88
|
-
const glb = yield
|
|
148
|
+
const glb = yield index_1.GLTF2Export.GLBAsync(this.viewer.scene, filename, GltfExportManager._gltfExportOptions(optimizeForAR, excluded));
|
|
89
149
|
glb.downloadFiles();
|
|
90
150
|
yield this._exportPostProcess(optimizeForAR);
|
|
91
151
|
});
|
|
@@ -110,14 +170,14 @@ class GltfExportManager {
|
|
|
110
170
|
// we don't have to rescale anything if are already on a downscaled device, since the textures are already <= 1024
|
|
111
171
|
// also we have to be very cautios with copying textures on these devices, since we are potentially very limited
|
|
112
172
|
// with the available memory
|
|
113
|
-
const isScaledDownDevice = (0,
|
|
173
|
+
const isScaledDownDevice = (0, device_helper_1.getIsScaledDownDevice)(this.viewer.viewerSettings.limitTextureSize);
|
|
114
174
|
if (!isScaledDownDevice) {
|
|
115
175
|
// the idea is to re-create all textures with a smaller texture size
|
|
116
176
|
// we have to exchange all materials for this to work
|
|
117
177
|
this.viewer.engine.clearInternalTexturesCache();
|
|
118
178
|
this.viewer.engine.getCaps().maxTextureSize = 1024;
|
|
119
179
|
this.viewer.scene.materials
|
|
120
|
-
.filter(material => material instanceof
|
|
180
|
+
.filter(material => material instanceof index_1.PBRMaterial)
|
|
121
181
|
.forEach(material => GltfExportManager._exchangeMaterial(material));
|
|
122
182
|
}
|
|
123
183
|
// since Babylon.js v6 the conversion to right handed GLB coordinate system is done differently
|
|
@@ -128,12 +188,10 @@ class GltfExportManager {
|
|
|
128
188
|
// the exporter just removes this node as he detects a "noop root node" (implementation details of Babylon.js)
|
|
129
189
|
// everything beneath this node remains untouched
|
|
130
190
|
// TODO BJS Update: Test AR export on iPhones as well and double check if we still need this special logic
|
|
131
|
-
const exportRootNode = new
|
|
132
|
-
exportRootNode.scaling = new
|
|
133
|
-
(0,
|
|
134
|
-
|
|
135
|
-
[GltfExportManager._METADATA_PROPS.deleteAfterExport]: true,
|
|
136
|
-
});
|
|
191
|
+
const exportRootNode = new index_1.TransformNode(GltfExportManager._EXPORT_ROOT_NAME, this.viewer.scene);
|
|
192
|
+
exportRootNode.scaling = new index_1.Vector3(-1, 1, 1);
|
|
193
|
+
(0, metadata_helper_1.setInternalMetadataValue)(exportRootNode, 'exportNode', true);
|
|
194
|
+
(0, metadata_helper_1.setInternalMetadataValue)(exportRootNode, 'deleteAfterExport', true);
|
|
137
195
|
// create clones of each node (recursively), optionally exchange with cloned materials and mark these nodes for the
|
|
138
196
|
// export
|
|
139
197
|
this.viewer.scene.rootNodes
|
|
@@ -141,10 +199,10 @@ class GltfExportManager {
|
|
|
141
199
|
.forEach(rootNode => this._prepareNodeForExport(rootNode, exportRootNode, excluded));
|
|
142
200
|
// bake transformation of all meshes, so that no negative scalings are left
|
|
143
201
|
// it's important that this is done AFTER instanced meshes have been converted (_prepareNodeForExport)
|
|
144
|
-
this._getNodesMarkedForExport(true).forEach(mesh => (0,
|
|
202
|
+
this._getNodesMarkedForExport(true).forEach(mesh => (0, geometry_helper_1.bakeGeometryOfMesh)(mesh));
|
|
145
203
|
// reset transformation of all "TransformNodes", which couldn't be handled by the geometry baking algorithm
|
|
146
204
|
// it's important that this is done AFTER all geometries have been baked
|
|
147
|
-
this._getNodesMarkedForExport().forEach(node => (0,
|
|
205
|
+
this._getNodesMarkedForExport().forEach(node => (0, geometry_helper_1.resetTransformation)(node));
|
|
148
206
|
});
|
|
149
207
|
}
|
|
150
208
|
/**
|
|
@@ -158,13 +216,13 @@ class GltfExportManager {
|
|
|
158
216
|
}
|
|
159
217
|
// dispose all nodes, materials and textures that have only been created for the export
|
|
160
218
|
this.viewer.scene.rootNodes
|
|
161
|
-
.filter(rootNode =>
|
|
219
|
+
.filter(rootNode => (0, metadata_helper_1.getInternalMetadataValue)(rootNode, 'deleteAfterExport'))
|
|
162
220
|
.forEach(rootNode => rootNode.dispose());
|
|
163
221
|
this.viewer.scene.materials
|
|
164
|
-
.filter(mat =>
|
|
222
|
+
.filter(mat => (0, metadata_helper_1.getInternalMetadataValue)(mat, 'deleteAfterExport'))
|
|
165
223
|
.forEach(material => material.dispose(false, false));
|
|
166
224
|
this.viewer.scene.textures
|
|
167
|
-
.filter(texture =>
|
|
225
|
+
.filter(texture => (0, metadata_helper_1.getInternalMetadataValue)(texture, 'deleteAfterExport'))
|
|
168
226
|
.forEach(texture => texture.dispose());
|
|
169
227
|
// reset engines max texture size and resume rendering
|
|
170
228
|
this.viewer.engine.getCaps().maxTextureSize = this._maxTextureSize;
|
|
@@ -176,7 +234,6 @@ class GltfExportManager {
|
|
|
176
234
|
* Also switches to the cloned material if required.
|
|
177
235
|
*/
|
|
178
236
|
_prepareNodeForExport(node, clonedParent, excluded) {
|
|
179
|
-
var _a, _b;
|
|
180
237
|
if (!GltfExportManager._shouldExportNode(node, excluded)) {
|
|
181
238
|
return;
|
|
182
239
|
}
|
|
@@ -184,21 +241,20 @@ class GltfExportManager {
|
|
|
184
241
|
const transformNode = node;
|
|
185
242
|
// clone original node and create unique name (via uniqueId) for the export
|
|
186
243
|
const clonedNodeName = `${transformNode.name}_${transformNode.uniqueId}`;
|
|
187
|
-
const clonedNode = transformNode instanceof
|
|
188
|
-
? (0,
|
|
244
|
+
const clonedNode = transformNode instanceof index_1.InstancedMesh
|
|
245
|
+
? (0, geometry_helper_1.createMeshFromInstancedMesh)(transformNode, clonedNodeName, clonedParent)
|
|
189
246
|
: transformNode.clone(clonedNodeName, clonedParent, true);
|
|
247
|
+
(0, metadata_helper_1.cloneInternalMetadata)(transformNode, clonedNode);
|
|
190
248
|
// exchange material
|
|
191
|
-
if (clonedNode instanceof
|
|
192
|
-
const exchangeWithMaterial =
|
|
249
|
+
if (clonedNode instanceof index_1.Mesh) {
|
|
250
|
+
const exchangeWithMaterial = clonedNode.material && (0, metadata_helper_1.getInternalMetadataValue)(clonedNode.material, 'exchangeMaterialWith');
|
|
193
251
|
if (exchangeWithMaterial) {
|
|
194
252
|
clonedNode.material = this.viewer.scene.getMaterialByUniqueID(exchangeWithMaterial);
|
|
195
253
|
}
|
|
196
254
|
}
|
|
197
255
|
// signalize that this is a cloned node
|
|
198
|
-
(0,
|
|
199
|
-
|
|
200
|
-
[GltfExportManager._METADATA_PROPS.deleteAfterExport]: true,
|
|
201
|
-
});
|
|
256
|
+
(0, metadata_helper_1.setInternalMetadataValue)(clonedNode, 'exportNode', true);
|
|
257
|
+
(0, metadata_helper_1.setInternalMetadataValue)(clonedNode, 'deleteAfterExport', true);
|
|
202
258
|
// handle children
|
|
203
259
|
const childs = transformNode.getChildTransformNodes(true);
|
|
204
260
|
childs.forEach(child => this._prepareNodeForExport(child, clonedNode, excluded));
|
|
@@ -211,90 +267,13 @@ class GltfExportManager {
|
|
|
211
267
|
if (!meshesOnly) {
|
|
212
268
|
nodes.push(...this.viewer.scene.transformNodes);
|
|
213
269
|
}
|
|
214
|
-
const filteredNodes = nodes.filter(node =>
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// maybe add a parameter if we have to include it in certain scenarios in the future
|
|
219
|
-
node.name !== GltfExportManager._EXPORT_ROOT_NAME;
|
|
220
|
-
});
|
|
270
|
+
const filteredNodes = nodes.filter(node => (0, metadata_helper_1.getInternalMetadataValue)(node, 'exportNode') &&
|
|
271
|
+
// in the desired use cases we want to exclude the export root node
|
|
272
|
+
// maybe add a parameter if we have to include it in certain scenarios in the future
|
|
273
|
+
node.name !== GltfExportManager._EXPORT_ROOT_NAME);
|
|
221
274
|
return filteredNodes;
|
|
222
275
|
}
|
|
223
|
-
/**
|
|
224
|
-
* Defines options for the export.
|
|
225
|
-
* We don't allow the user to overwrite certain settings, since we rely on properties like `removeNoopRootNodes` to
|
|
226
|
-
* stay `true` in order to make the AR export work.
|
|
227
|
-
* We could theoretically allow it if AR optimization is not desired, but this may confuse the user.
|
|
228
|
-
*/
|
|
229
|
-
static _gltfExportOptions(optimizeForAR, excluded) {
|
|
230
|
-
return {
|
|
231
|
-
shouldExportNode: function (node) {
|
|
232
|
-
var _a;
|
|
233
|
-
if (optimizeForAR) {
|
|
234
|
-
// we explicitely marked nodes, that should be exported in AR mode
|
|
235
|
-
return !!((_a = node.metadata) === null || _a === void 0 ? void 0 : _a[GltfExportManager._METADATA_PROPS.exportNode]);
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
// use the default export node check (enabled state, exclusion list, etc...)
|
|
239
|
-
return GltfExportManager._shouldExportNode(node, excluded);
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Checks if a node should be available in the export
|
|
246
|
-
*/
|
|
247
|
-
static _shouldExportNode(node, excluded) {
|
|
248
|
-
if (!(node instanceof transformNode_1.TransformNode)) {
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
// TODO: think of adding "BackgroundHelper" and nodes with "infiniteDistance" here as well, at least in AR mode
|
|
252
|
-
if (!node.isEnabled()) {
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
255
|
-
if (excluded && (0, structureHelper_1.isNodeIncludedInExclusionList)(node, excluded)) {
|
|
256
|
-
return false;
|
|
257
|
-
}
|
|
258
|
-
return true;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Creates a clone of the material which should be used for the export.
|
|
262
|
-
* This is mostly required for recreating textures with lower sizes.
|
|
263
|
-
* CAUTION: Material exchanging is not supported for materials that contain certain texture types:
|
|
264
|
-
* - Dynamic textures (Paintables): Cloning dynamic textures doesn't clone the canvas context
|
|
265
|
-
* => so the clone is just empty
|
|
266
|
-
* - Render target textures: Disposing the clone will leave the scene in a "not ready" state
|
|
267
|
-
* => this scenario is not fully analyzed yet, but it's not really worth the effort right now, since this kind of
|
|
268
|
-
* of texture is not really used ATM
|
|
269
|
-
*/
|
|
270
|
-
static _exchangeMaterial(material) {
|
|
271
|
-
const baseTextures = material.getActiveTextures();
|
|
272
|
-
const hasDynamicTextures = baseTextures.some(texture => texture instanceof dynamicTexture_1.DynamicTexture);
|
|
273
|
-
const hasRenderTargetTextures = baseTextures.some(texture => texture instanceof renderTargetTexture_1.RenderTargetTexture);
|
|
274
|
-
if (hasDynamicTextures || hasRenderTargetTextures) {
|
|
275
|
-
const textureTypesString = [
|
|
276
|
-
hasDynamicTextures ? 'Dynamic Textures' : '',
|
|
277
|
-
hasRenderTargetTextures ? 'Render Target Textures' : '',
|
|
278
|
-
]
|
|
279
|
-
.filter(Boolean)
|
|
280
|
-
.join();
|
|
281
|
-
console.warn(`Couldn't exchange material "${material.name}" in GLB export, as it contains unsupported texture type(s) (${textureTypesString}). The export will still work, but the textures of this material will keep their original size.`);
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
const newName = `${material.name}_clone`;
|
|
285
|
-
const clonedMaterial = material.clone(newName);
|
|
286
|
-
const clonedTextures = clonedMaterial.getActiveTextures();
|
|
287
|
-
// mark all exported textures, so that they will be deleted after the export
|
|
288
|
-
clonedTextures.forEach(texture => (0, babylonHelper_1.injectMetadata)(texture, { [GltfExportManager._METADATA_PROPS.deleteAfterExport]: true }));
|
|
289
|
-
(0, babylonHelper_1.injectMetadata)(material, { [GltfExportManager._METADATA_PROPS.exchangeMaterialWith]: clonedMaterial.uniqueId });
|
|
290
|
-
(0, babylonHelper_1.injectMetadata)(clonedMaterial, { [GltfExportManager._METADATA_PROPS.deleteAfterExport]: true });
|
|
291
|
-
}
|
|
292
276
|
}
|
|
293
277
|
exports.GltfExportManager = GltfExportManager;
|
|
294
|
-
GltfExportManager._METADATA_PROPS = {
|
|
295
|
-
exportNode: 'exportNode',
|
|
296
|
-
deleteAfterExport: 'deleteAfterExport',
|
|
297
|
-
exchangeMaterialWith: 'exchangeMaterialWith',
|
|
298
|
-
};
|
|
299
278
|
GltfExportManager._EXPORT_ROOT_NAME = '__export_root__';
|
|
300
|
-
//# sourceMappingURL=
|
|
279
|
+
//# sourceMappingURL=gltf-export-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gltf-export-manager.js","sourceRoot":"","sources":["../../../src/manager/gltf-export-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAckB;AAClB,6DAAkE;AAClE,iEAAmH;AACnH,iEAA6D;AAC7D,iEAAwH;AAExH;;GAEG;AACH,MAAa,iBAAiB;IAmF5B,gBAAgB;IAChB,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACzC,mFAAmF;QACnF,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC;IAChE,CAAC;IAlFD;;;;;OAKG;IACO,MAAM,CAAC,kBAAkB,CAAC,aAAsB,EAAE,QAA+B;QACzF,OAAO;YACL,gBAAgB,EAAE,UAAU,IAAU;gBACpC,IAAI,aAAa,EAAE;oBACjB,kEAAkE;oBAClE,OAAO,IAAA,0CAAwB,EAAC,IAAI,EAAE,YAAY,CAAY,CAAC;iBAChE;qBAAM;oBACL,4EAA4E;oBAC5E,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;iBAC5D;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACO,MAAM,CAAC,iBAAiB,CAAC,IAAU,EAAE,QAA+B;QAC5E,IAAI,CAAC,CAAC,IAAI,YAAY,qBAAa,CAAC,EAAE;YACpC,OAAO,KAAK,CAAC;SACd;QACD,mHAAmH;QACnH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE;YACrB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,QAAQ,IAAI,IAAA,gCAAc,EAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YAC9C,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACO,MAAM,CAAC,iBAAiB,CAAC,QAAkB;QACnD,MAAM,YAAY,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAClD,MAAM,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,sBAAc,CAAC,CAAC;QAC3F,MAAM,uBAAuB,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,YAAY,2BAAmB,CAAC,CAAC;QACrG,IAAI,kBAAkB,IAAI,uBAAuB,EAAE;YACjD,MAAM,kBAAkB,GAAG;gBACzB,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE;gBAC5C,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;aACxD;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CACV,+BAA+B,QAAQ,CAAC,IAAI,gEAAgE,kBAAkB,iGAAiG,CAChO,CAAC;YAEF,OAAO;SACR;QAED,MAAM,OAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC;QACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC;QAChD,IAAA,uCAAqB,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAChD,MAAM,cAAc,GAAG,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAE1D,4EAA4E;QAC5E,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAA,0CAAwB,EAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC;QAEhG,IAAA,0CAAwB,EAAC,QAAQ,EAAE,sBAAsB,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QACpF,IAAA,0CAAwB,EAAC,cAAc,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IAQD;;;;;;OAMG;IACU,SAAS,CACpB,QAAQ,GAAG,gBAAgB,EAC3B,gBAAyB,KAAK,EAC9B,QAA+B;;YAE/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,OAAO,GAAG,MAAM,mBAAW,CAAC,QAAQ,CACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,OAAO,EACP,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAC9D,CAAC;YAEF,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC/C,iFAAiF;YACjF,IAAI,OAAO,YAAY,IAAI,EAAE;gBAC3B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC9B,QAAQ,IAAI,MAAM,CAAC;iBACpB;gBACD,OAAO,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;aACtC;iBAAM;gBACL,8BAA8B;gBAC9B,OAAO,SAAS,CAAC;aAClB;QACH,CAAC;KAAA;IAED;;;;;;OAMG;IACU,gBAAgB,CAC3B,QAAgB,EAChB,gBAAyB,KAAK,EAC9B,QAA+B;;YAE/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,IAAI,GAAG,MAAM,mBAAW,CAAC,SAAS,CACtC,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,QAAQ,EACR,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAC9D,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;YAErB,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;KAAA;IAED;;;;;;OAMG;IACU,eAAe,CAC1B,QAAgB,EAChB,gBAAyB,KAAK,EAC9B,QAA+B;;YAE/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YAEtD,MAAM,GAAG,GAAG,MAAM,mBAAW,CAAC,QAAQ,CACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,QAAQ,EACR,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAC9D,CAAC;YACF,GAAG,CAAC,aAAa,EAAE,CAAC;YAEpB,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC;KAAA;IAED;;;OAGG;IACa,iBAAiB,CAAC,aAAsB,EAAE,QAA+B;;YACvF,IAAI,CAAC,aAAa,EAAE;gBAClB,4DAA4D;gBAC5D,OAAO;aACR;YAED,mGAAmG;YACnG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAE7B,iCAAiC;YACjC,mEAAmE;YACnE,0FAA0F;YAC1F,mEAAmE;YACnE,qEAAqE;YACrE,kHAAkH;YAClH,gHAAgH;YAChH,4BAA4B;YAC5B,MAAM,kBAAkB,GAAG,IAAA,qCAAqB,EAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC9F,IAAI,CAAC,kBAAkB,EAAE;gBACvB,oEAAoE;gBACpE,qDAAqD;gBACrD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC;gBAEnD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;qBACxB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,YAAY,mBAAW,CAAC;qBACnD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,QAAuB,CAAC,CAAC,CAAC;aACtF;YAED,+FAA+F;YAC/F,iGAAiG;YACjG,kHAAkH;YAClH,iBAAiB;YACjB,8EAA8E;YAC9E,8GAA8G;YAC9G,iDAAiD;YACjD,0GAA0G;YAC1G,MAAM,cAAc,GAAG,IAAI,qBAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjG,cAAc,CAAC,OAAO,GAAG,IAAI,eAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/C,IAAA,0CAAwB,EAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAC7D,IAAA,0CAAwB,EAAC,cAAc,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;YAEpE,mHAAmH;YACnH,SAAS;YACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;iBACxB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,CAAC,iBAAiB,CAAC;iBACzE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEvF,2EAA2E;YAC3E,sGAAsG;YACtG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,oCAAkB,EAAC,IAAY,CAAC,CAAC,CAAC;YAEtF,2GAA2G;YAC3G,wEAAwE;YACxE,IAAI,CAAC,wBAAwB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,qCAAmB,EAAC,IAAqB,CAAC,CAAC,CAAC;QAC9F,CAAC;KAAA;IAED;;OAEG;IACa,kBAAkB,CAAC,aAAsB;;YACvD,IAAI,CAAC,aAAa,EAAE;gBAClB,0EAA0E;gBAC1E,OAAO;aACR;YAED,uFAAuF;YACvF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;iBACxB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAA,0CAAwB,EAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;iBAC3E,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAE3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS;iBACxB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAA,0CAAwB,EAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;iBACjE,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAEvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ;iBACvB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,IAAA,0CAAwB,EAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;iBACzE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzC,sDAAsD;YACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;YACnE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC;KAAA;IAED;;;OAGG;IACO,qBAAqB,CAAC,IAAU,EAAE,YAA2B,EAAE,QAA+B;QACtG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YACxD,OAAO;SACR;QAED,2CAA2C;QAC3C,MAAM,aAAa,GAAG,IAAqB,CAAC;QAE5C,2EAA2E;QAC3E,MAAM,cAAc,GAAG,GAAG,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QACzE,MAAM,UAAU,GACd,aAAa,YAAY,qBAAa;YACpC,CAAC,CAAC,IAAA,6CAA2B,EAAC,aAAa,EAAE,cAAc,EAAE,YAAY,CAAC;YAC1E,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,YAAY,EAAE,IAAI,CAAE,CAAC;QAC/D,IAAA,uCAAqB,EAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAEjD,oBAAoB;QACpB,IAAI,UAAU,YAAY,YAAI,EAAE;YAC9B,MAAM,oBAAoB,GACxB,UAAU,CAAC,QAAQ,IAAI,IAAA,0CAAwB,EAAC,UAAU,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;YAC/F,IAAI,oBAAoB,EAAE;gBACxB,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,oBAA8B,CAAC,CAAC;aAC/F;SACF;QAED,uCAAuC;QACvC,IAAA,0CAAwB,EAAC,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QACzD,IAAA,0CAAwB,EAAC,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAEhE,kBAAkB;QAClB,MAAM,MAAM,GAAG,aAAa,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACO,wBAAwB,CAAC,UAAoB;QACrD,MAAM,KAAK,GAAoB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,EAAE;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;SACjD;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAChC,IAAI,CAAC,EAAE,CACL,IAAA,0CAAwB,EAAC,IAAI,EAAE,YAAY,CAAC;YAC5C,mEAAmE;YACnE,oFAAoF;YACpF,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,iBAAiB,CACpD,CAAC;QAEF,OAAO,aAAa,CAAC;IACvB,CAAC;;AA5TH,8CA6TC;AA5T2B,mCAAiB,GAAG,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AbstractMesh, Material, Viewer } from '../index';
|
|
2
|
+
/**
|
|
3
|
+
* Manager for material related tasks
|
|
4
|
+
*/
|
|
5
|
+
export declare class MaterialManager {
|
|
6
|
+
protected viewer: Viewer;
|
|
7
|
+
/**
|
|
8
|
+
* CAUTION: this has to be in sync with the Combeenation backend!
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
static readonly CBN_FALLBACK_MATERIAL_NAME = "$fallback";
|
|
12
|
+
protected _createMaterialPromises: {
|
|
13
|
+
[materialId: string]: Promise<Material | null>;
|
|
14
|
+
};
|
|
15
|
+
/** @internal */
|
|
16
|
+
constructor(viewer: Viewer);
|
|
17
|
+
/**
|
|
18
|
+
* Assigns material with certain id to desired mesh.\
|
|
19
|
+
* Creates the material if not already available (see {@link getOrCreateMaterial}).
|
|
20
|
+
*/
|
|
21
|
+
setMaterialOnMesh(materialId: string, mesh: AbstractMesh): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Returns material with certain id if already available in the scene.\
|
|
24
|
+
* If this is not the case material is created from a
|
|
25
|
+
* "[Material asset](https://docs.combeenation.com/docs/howto-create-and-use-babylon-and-material-asset)"
|
|
26
|
+
* on the Combeenation server.\
|
|
27
|
+
* Waits until textures of material are fully loaded and shader is compiled. In this way "flickering" effects
|
|
28
|
+
* will be avoided, since the material would be incomplete without its loaded textures.
|
|
29
|
+
*
|
|
30
|
+
* @param mesh Required for shader compilation check, can be omitted if this check should not be done.\
|
|
31
|
+
* Use {@link setMaterialOnMesh} instead if the material should be applied on the mesh immediately.
|
|
32
|
+
*/
|
|
33
|
+
getOrCreateMaterial(materialId: string, mesh?: AbstractMesh): Promise<Material>;
|
|
34
|
+
protected _createMaterial(materialId: string, mesh?: AbstractMesh): Promise<Material>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MaterialManager = void 0;
|
|
13
|
+
const index_1 = require("../index");
|
|
14
|
+
const metadata_helper_1 = require("../internal/metadata-helper");
|
|
15
|
+
/**
|
|
16
|
+
* Manager for material related tasks
|
|
17
|
+
*/
|
|
18
|
+
class MaterialManager {
|
|
19
|
+
/** @internal */
|
|
20
|
+
constructor(viewer) {
|
|
21
|
+
this.viewer = viewer;
|
|
22
|
+
this._createMaterialPromises = {};
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Assigns material with certain id to desired mesh.\
|
|
26
|
+
* Creates the material if not already available (see {@link getOrCreateMaterial}).
|
|
27
|
+
*/
|
|
28
|
+
setMaterialOnMesh(materialId, mesh) {
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
(0, metadata_helper_1.setInternalMetadataValue)(mesh, 'materialToBeSet', materialId);
|
|
31
|
+
const material = yield this.getOrCreateMaterial(materialId, mesh);
|
|
32
|
+
// there may have been later "setMaterialOnMesh" calls with faster material creation
|
|
33
|
+
// make sure to assign the latest material!
|
|
34
|
+
if ((0, metadata_helper_1.getInternalMetadataValue)(mesh, 'materialToBeSet') === materialId) {
|
|
35
|
+
mesh.material = material;
|
|
36
|
+
(0, metadata_helper_1.clearInternalMetadataValue)(mesh, 'materialToBeSet');
|
|
37
|
+
(0, metadata_helper_1.clearInternalMetadataValue)(mesh, 'deferredMaterial');
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Returns material with certain id if already available in the scene.\
|
|
43
|
+
* If this is not the case material is created from a
|
|
44
|
+
* "[Material asset](https://docs.combeenation.com/docs/howto-create-and-use-babylon-and-material-asset)"
|
|
45
|
+
* on the Combeenation server.\
|
|
46
|
+
* Waits until textures of material are fully loaded and shader is compiled. In this way "flickering" effects
|
|
47
|
+
* will be avoided, since the material would be incomplete without its loaded textures.
|
|
48
|
+
*
|
|
49
|
+
* @param mesh Required for shader compilation check, can be omitted if this check should not be done.\
|
|
50
|
+
* Use {@link setMaterialOnMesh} instead if the material should be applied on the mesh immediately.
|
|
51
|
+
*/
|
|
52
|
+
getOrCreateMaterial(materialId, mesh) {
|
|
53
|
+
var _a;
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
let chosenMaterial = (_a = this.viewer.scene.materials.find(mat => mat.id === materialId)) !== null && _a !== void 0 ? _a : null;
|
|
56
|
+
if (!chosenMaterial) {
|
|
57
|
+
// material not available yet, request it from Combeenation assets
|
|
58
|
+
const existingCreationProm = this._createMaterialPromises[materialId];
|
|
59
|
+
if (existingCreationProm !== undefined) {
|
|
60
|
+
// request is already pending, just wait for the result
|
|
61
|
+
chosenMaterial = yield existingCreationProm;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.viewer.eventManager.fireEvent(index_1.ViewerEvent.MaterialCreationStart, materialId);
|
|
65
|
+
// request not pending, call the dedicated function
|
|
66
|
+
const newCreationProm = this._createMaterial(materialId, mesh);
|
|
67
|
+
// store the promise in a global map, so that subsequent requests can reference it
|
|
68
|
+
this._createMaterialPromises[materialId] = newCreationProm;
|
|
69
|
+
chosenMaterial = yield newCreationProm;
|
|
70
|
+
delete this._createMaterialPromises[materialId];
|
|
71
|
+
const allMaterialsCreated = !Object.entries(this._createMaterialPromises).length;
|
|
72
|
+
// signalize event system that material is created now
|
|
73
|
+
// also check if there are other material creation processes still pending, as this is an important information
|
|
74
|
+
// e.g. for showing load masks
|
|
75
|
+
this.viewer.eventManager.fireEvent(index_1.ViewerEvent.MaterialCreationEnd, materialId, allMaterialsCreated);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return chosenMaterial;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
_createMaterial(materialId, mesh) {
|
|
82
|
+
var _a;
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
if (materialId === MaterialManager.CBN_FALLBACK_MATERIAL_NAME) {
|
|
85
|
+
const fallbackMaterial = new index_1.StandardMaterial(MaterialManager.CBN_FALLBACK_MATERIAL_NAME, this.viewer.scene);
|
|
86
|
+
fallbackMaterial.disableLighting = true;
|
|
87
|
+
return fallbackMaterial;
|
|
88
|
+
}
|
|
89
|
+
const materialDefinition = yield ((_a = window.Cbn) === null || _a === void 0 ? void 0 : _a.Assets.getMaterial(materialId));
|
|
90
|
+
// The generic `Material.Parse` actually returns a more specific material like `BABYLON.StandardMaterial`,
|
|
91
|
+
// `BABYLON.PBRMaterial` or stuff like `BABYLON.PBRMetallicRoughnessMaterial` etc. based on the given `customType`
|
|
92
|
+
// within the material JSON definition
|
|
93
|
+
const material = materialDefinition && index_1.Material.Parse(materialDefinition, this.viewer.scene, '');
|
|
94
|
+
if (!material) {
|
|
95
|
+
throw new index_1.ViewerError({
|
|
96
|
+
id: index_1.ViewerErrorIds.MaterialCouldNotBeParsed,
|
|
97
|
+
message: `Material with id "${materialId}" could not be parsed`,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
yield this.viewer.parameterManager.applyParameterValuesToMaterial(material);
|
|
101
|
+
const matReadyProms = [
|
|
102
|
+
new Promise(resolve => index_1.BaseTexture.WhenAllReady(material.getActiveTextures(), resolve)),
|
|
103
|
+
];
|
|
104
|
+
if (mesh) {
|
|
105
|
+
// this promise should only take some time on the first call of the corresponding shader (eg: PBRMaterial shader)
|
|
106
|
+
// on each other call of the same material/shader type there should be not be a waiting time, or at maximum one
|
|
107
|
+
// frame
|
|
108
|
+
// https://forum.babylonjs.com/t/mesh-flickering-when-setting-material-initially/37312
|
|
109
|
+
matReadyProms.push(material.forceCompilationAsync(mesh));
|
|
110
|
+
}
|
|
111
|
+
// material needs to fulfill 2 criterias before it's ready to use
|
|
112
|
+
// - textures need to be "ready" => downloaded
|
|
113
|
+
// - dedicated shader needs to be compiled
|
|
114
|
+
// if this would not be the case you can see some "flickering" when setting the material
|
|
115
|
+
yield Promise.all(matReadyProms);
|
|
116
|
+
return material;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.MaterialManager = MaterialManager;
|
|
121
|
+
/**
|
|
122
|
+
* CAUTION: this has to be in sync with the Combeenation backend!
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
MaterialManager.CBN_FALLBACK_MATERIAL_NAME = '$fallback';
|
|
126
|
+
//# sourceMappingURL=material-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-manager.js","sourceRoot":"","sources":["../../../src/manager/material-manager.ts"],"names":[],"mappings":"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"}
|