@combeenation/3d-viewer 5.1.0-rc3 → 5.1.0-rc4
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/api/classes/element.js +4 -18
- package/dist/lib-cjs/api/classes/element.js.map +1 -1
- package/dist/lib-cjs/api/classes/variant.js +37 -26
- package/dist/lib-cjs/api/classes/variant.js.map +1 -1
- package/dist/lib-cjs/api/util/babylonHelper.d.ts +2 -2
- package/dist/lib-cjs/api/util/babylonHelper.js +17 -6
- package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
- package/dist/lib-cjs/api/util/sceneLoaderHelper.d.ts +8 -1
- package/dist/lib-cjs/api/util/sceneLoaderHelper.js +39 -2
- package/dist/lib-cjs/api/util/sceneLoaderHelper.js.map +1 -1
- package/dist/lib-cjs/buildinfo.json +1 -1
- package/dist/lib-es6/api/classes/animationInterface.d.ts +8 -0
- package/dist/lib-es6/api/classes/animationInterface.js +2 -0
- package/dist/lib-es6/api/classes/animationInterface.js.map +1 -0
- package/dist/lib-es6/api/classes/dottedPath.d.ts +79 -0
- package/dist/lib-es6/api/classes/dottedPath.js +185 -0
- package/dist/lib-es6/api/classes/dottedPath.js.map +1 -0
- package/dist/lib-es6/api/classes/element.d.ts +149 -0
- package/dist/lib-es6/api/classes/element.js +821 -0
- package/dist/lib-es6/api/classes/element.js.map +1 -0
- package/dist/lib-es6/api/classes/event.d.ts +326 -0
- package/dist/lib-es6/api/classes/event.js +369 -0
- package/dist/lib-es6/api/classes/event.js.map +1 -0
- package/dist/lib-es6/api/classes/eventBroadcaster.d.ts +26 -0
- package/dist/lib-es6/api/classes/eventBroadcaster.js +51 -0
- package/dist/lib-es6/api/classes/eventBroadcaster.js.map +1 -0
- package/dist/lib-es6/api/classes/parameter.d.ts +336 -0
- package/dist/lib-es6/api/classes/parameter.js +469 -0
- package/dist/lib-es6/api/classes/parameter.js.map +1 -0
- package/dist/lib-es6/api/classes/parameterObservable.d.ts +36 -0
- package/dist/lib-es6/api/classes/parameterObservable.js +99 -0
- package/dist/lib-es6/api/classes/parameterObservable.js.map +1 -0
- package/dist/lib-es6/api/classes/parameterizable.d.ts +15 -0
- package/dist/lib-es6/api/classes/parameterizable.js +147 -0
- package/dist/lib-es6/api/classes/parameterizable.js.map +1 -0
- package/dist/lib-es6/api/classes/placementAnimation.d.ts +44 -0
- package/dist/lib-es6/api/classes/placementAnimation.js +161 -0
- package/dist/lib-es6/api/classes/placementAnimation.js.map +1 -0
- package/dist/lib-es6/api/classes/variant.d.ts +234 -0
- package/dist/lib-es6/api/classes/variant.js +1199 -0
- package/dist/lib-es6/api/classes/variant.js.map +1 -0
- package/dist/lib-es6/api/classes/variantInstance.d.ts +45 -0
- package/dist/lib-es6/api/classes/variantInstance.js +106 -0
- package/dist/lib-es6/api/classes/variantInstance.js.map +1 -0
- package/dist/lib-es6/api/classes/variantParameterizable.d.ts +17 -0
- package/dist/lib-es6/api/classes/variantParameterizable.js +97 -0
- package/dist/lib-es6/api/classes/variantParameterizable.js.map +1 -0
- package/dist/lib-es6/api/classes/viewer.d.ts +184 -0
- package/dist/lib-es6/api/classes/viewer.js +729 -0
- package/dist/lib-es6/api/classes/viewer.js.map +1 -0
- package/dist/lib-es6/api/classes/viewerLight.d.ts +66 -0
- package/dist/lib-es6/api/classes/viewerLight.js +390 -0
- package/dist/lib-es6/api/classes/viewerLight.js.map +1 -0
- package/dist/lib-es6/api/internal/debugViewer.d.ts +13 -0
- package/dist/lib-es6/api/internal/debugViewer.js +84 -0
- package/dist/lib-es6/api/internal/debugViewer.js.map +1 -0
- package/dist/lib-es6/api/internal/lensRendering.d.ts +8 -0
- package/dist/lib-es6/api/internal/lensRendering.js +9 -0
- package/dist/lib-es6/api/internal/lensRendering.js.map +1 -0
- package/dist/lib-es6/api/internal/sceneSetup.d.ts +13 -0
- package/dist/lib-es6/api/internal/sceneSetup.js +234 -0
- package/dist/lib-es6/api/internal/sceneSetup.js.map +1 -0
- package/dist/lib-es6/api/manager/animationManager.d.ts +29 -0
- package/dist/lib-es6/api/manager/animationManager.js +128 -0
- package/dist/lib-es6/api/manager/animationManager.js.map +1 -0
- package/dist/lib-es6/api/manager/gltfExportManager.d.ts +65 -0
- package/dist/lib-es6/api/manager/gltfExportManager.js +221 -0
- package/dist/lib-es6/api/manager/gltfExportManager.js.map +1 -0
- package/dist/lib-es6/api/manager/sceneManager.d.ts +31 -0
- package/dist/lib-es6/api/manager/sceneManager.js +150 -0
- package/dist/lib-es6/api/manager/sceneManager.js.map +1 -0
- package/dist/lib-es6/api/manager/variantInstanceManager.d.ts +92 -0
- package/dist/lib-es6/api/manager/variantInstanceManager.js +333 -0
- package/dist/lib-es6/api/manager/variantInstanceManager.js.map +1 -0
- package/dist/lib-es6/api/store/specStorage.d.ts +24 -0
- package/dist/lib-es6/api/store/specStorage.js +49 -0
- package/dist/lib-es6/api/store/specStorage.js.map +1 -0
- package/dist/lib-es6/api/util/babylonHelper.d.ts +174 -0
- package/dist/lib-es6/api/util/babylonHelper.js +582 -0
- package/dist/lib-es6/api/util/babylonHelper.js.map +1 -0
- package/dist/lib-es6/api/util/globalTypes.d.ts +366 -0
- package/dist/lib-es6/api/util/globalTypes.js +2 -0
- package/dist/lib-es6/api/util/globalTypes.js.map +1 -0
- package/dist/lib-es6/api/util/resourceHelper.d.ts +58 -0
- package/dist/lib-es6/api/util/resourceHelper.js +248 -0
- package/dist/lib-es6/api/util/resourceHelper.js.map +1 -0
- package/dist/lib-es6/api/util/sceneLoaderHelper.d.ts +35 -0
- package/dist/lib-es6/api/util/sceneLoaderHelper.js +134 -0
- package/dist/lib-es6/api/util/sceneLoaderHelper.js.map +1 -0
- package/dist/lib-es6/api/util/stringHelper.d.ts +9 -0
- package/dist/lib-es6/api/util/stringHelper.js +22 -0
- package/dist/lib-es6/api/util/stringHelper.js.map +1 -0
- package/dist/lib-es6/api/util/structureHelper.d.ts +9 -0
- package/dist/lib-es6/api/util/structureHelper.js +46 -0
- package/dist/lib-es6/api/util/structureHelper.js.map +1 -0
- package/dist/lib-es6/buildinfo.json +3 -0
- package/dist/lib-es6/index.d.ts +49 -0
- package/dist/lib-es6/index.js +51 -0
- package/dist/lib-es6/index.js.map +1 -0
- package/package.json +6 -6
- package/src/api/classes/element.ts +4 -23
- package/src/api/classes/variant.ts +22 -3
- package/src/api/util/babylonHelper.ts +17 -7
- package/src/api/util/sceneLoaderHelper.ts +48 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceHelper.js","sourceRoot":"","sources":["../../../../src/api/util/resourceHelper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Scene } from '@babylonjs/core/scene';
|
|
2
|
+
import { ISceneLoaderPlugin } from '@babylonjs/core/Loading/sceneLoader';
|
|
3
|
+
import { Material } from '@babylonjs/core/Materials/material';
|
|
4
|
+
import { Node as BjsNode } from '@babylonjs/core/node';
|
|
5
|
+
declare const missingMaterialMetadataName = "missingMaterial";
|
|
6
|
+
/**
|
|
7
|
+
* Create and return a custom loader plugin to be registered with SceneLoader, that allows
|
|
8
|
+
* us to run our own code against the input data before using the standard procedure to
|
|
9
|
+
* import.
|
|
10
|
+
* @param previousLoaderPlugin the actual loader that's executed after manipulating the input data
|
|
11
|
+
* @returns Custom loader plugin to be registered with SceneLoader.RegisterPlugin()
|
|
12
|
+
*/
|
|
13
|
+
declare const getCustomCbnBabylonLoaderPlugin: (previousLoaderPlugin: ISceneLoaderPlugin) => ISceneLoaderPlugin;
|
|
14
|
+
/**
|
|
15
|
+
* Return an observer to be applied to meshes in order to post-load missing materials
|
|
16
|
+
* upon set enabled/visible.
|
|
17
|
+
* @param targetMeshOrInstance AbstractMesh the observer will be applied to
|
|
18
|
+
* @param concerningMesh Mesh to look for missing materials on, and create/apply to (when found).
|
|
19
|
+
* @returns observer
|
|
20
|
+
*/
|
|
21
|
+
declare const getMaterialPostLoadObserver: (targetMeshOrInstance: AbstractMesh, concerningMesh: Mesh) => (_eventData: any, _eventState: any) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Adds an "onEnabledStateChanged" observer to the given mesh and all its parents:
|
|
24
|
+
* The added observer (`getMaterialPostLoadObserver`) handles creation of missing materials once the given node is
|
|
25
|
+
* enabled.
|
|
26
|
+
*/
|
|
27
|
+
declare const addMissingMaterialObserver: (node: BjsNode) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Look up the provided materials (see library import) and create and return one if found.
|
|
30
|
+
* @param materialId BabylonJs material-id. E.g. 'concrete".
|
|
31
|
+
* @param scene BabylonJs scene
|
|
32
|
+
* @returns PBRMaterial | null
|
|
33
|
+
*/
|
|
34
|
+
export declare const getMaterialFromCbnAssets: (materialId: string, scene: Scene) => Material | null;
|
|
35
|
+
export { getCustomCbnBabylonLoaderPlugin, getMaterialPostLoadObserver, missingMaterialMetadataName, addMissingMaterialObserver, };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { injectNodeMetadata } from './babylonHelper';
|
|
2
|
+
import has from 'lodash-es/has';
|
|
3
|
+
import { Material } from '@babylonjs/core/Materials/material';
|
|
4
|
+
import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh';
|
|
5
|
+
var missingMaterialMetadataName = 'missingMaterial';
|
|
6
|
+
/**
|
|
7
|
+
* Create and return a custom loader plugin to be registered with SceneLoader, that allows
|
|
8
|
+
* us to run our own code against the input data before using the standard procedure to
|
|
9
|
+
* import.
|
|
10
|
+
* @param previousLoaderPlugin the actual loader that's executed after manipulating the input data
|
|
11
|
+
* @returns Custom loader plugin to be registered with SceneLoader.RegisterPlugin()
|
|
12
|
+
*/
|
|
13
|
+
var getCustomCbnBabylonLoaderPlugin = function (previousLoaderPlugin) {
|
|
14
|
+
var customLoader = {
|
|
15
|
+
name: 'cbnCustomBabylonLoader',
|
|
16
|
+
extensions: '.babylon',
|
|
17
|
+
importMesh: previousLoaderPlugin.importMesh,
|
|
18
|
+
load: previousLoaderPlugin.load,
|
|
19
|
+
loadAssetContainer: function (scene, data, rootUrl, onError) {
|
|
20
|
+
//* 1) --- manipulate ORIGINAL data
|
|
21
|
+
var dataParsed = JSON.parse(data);
|
|
22
|
+
//* 2) --- call default (non-custom) loading method
|
|
23
|
+
var importedContainer = previousLoaderPlugin.loadAssetContainer(scene, data, rootUrl);
|
|
24
|
+
//* 3) --- manipulate IMPORTED data
|
|
25
|
+
addMissingMaterialMetadata(dataParsed, importedContainer);
|
|
26
|
+
//* 4) --- return imported data
|
|
27
|
+
return importedContainer;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
return customLoader;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Return an observer to be applied to meshes in order to post-load missing materials
|
|
34
|
+
* upon set enabled/visible.
|
|
35
|
+
* @param targetMeshOrInstance AbstractMesh the observer will be applied to
|
|
36
|
+
* @param concerningMesh Mesh to look for missing materials on, and create/apply to (when found).
|
|
37
|
+
* @returns observer
|
|
38
|
+
*/
|
|
39
|
+
var getMaterialPostLoadObserver = function (targetMeshOrInstance, concerningMesh) {
|
|
40
|
+
return function (_eventData, _eventState) {
|
|
41
|
+
var hasBeenEnabled = concerningMesh.isEnabled(true);
|
|
42
|
+
var materialMissing = has(concerningMesh.metadata, missingMaterialMetadataName);
|
|
43
|
+
if (!hasBeenEnabled || !materialMissing)
|
|
44
|
+
return;
|
|
45
|
+
// get id of missing material
|
|
46
|
+
var missingMatId = concerningMesh.metadata[missingMaterialMetadataName];
|
|
47
|
+
// try to find material on the scene
|
|
48
|
+
var existingMat = concerningMesh.getScene().getMaterialById(missingMatId);
|
|
49
|
+
// assign either existing material or freshly created one
|
|
50
|
+
concerningMesh.material = existingMat || getMaterialFromCbnAssets(missingMatId, concerningMesh.getScene());
|
|
51
|
+
// since the material is there now, we do not need the related metadata tag anymore
|
|
52
|
+
delete concerningMesh.metadata[missingMaterialMetadataName];
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Internal function that compares the original meshes on a .babylon file with what was loaded,
|
|
57
|
+
* and tags missing materials with respective metadata on respective meshes.
|
|
58
|
+
* @param dataParsed original data
|
|
59
|
+
* @param container loaded data
|
|
60
|
+
*/
|
|
61
|
+
var addMissingMaterialMetadata = function (dataParsed, container) {
|
|
62
|
+
container.meshes.forEach(function (currMeshImported) {
|
|
63
|
+
var _a;
|
|
64
|
+
var _b, _c;
|
|
65
|
+
for (var _i = 0, _d = dataParsed.meshes; _i < _d.length; _i++) {
|
|
66
|
+
var currMeshOriginal = _d[_i];
|
|
67
|
+
if (currMeshOriginal.name !== currMeshImported.name)
|
|
68
|
+
continue;
|
|
69
|
+
// we're dealing with the original version of the current imported mesh now
|
|
70
|
+
var materialOnImportedMesh = (_b = currMeshImported.material) === null || _b === void 0 ? void 0 : _b.id;
|
|
71
|
+
var materialOnOriginalMesh = currMeshOriginal.materialId;
|
|
72
|
+
if (!materialOnOriginalMesh || materialOnImportedMesh === materialOnOriginalMesh)
|
|
73
|
+
continue;
|
|
74
|
+
// TODO: Just for easier debugging. Remove before publishment...
|
|
75
|
+
console.info("Adding \"" + missingMaterialMetadataName + "\" info on mesh \"" + currMeshOriginal.name + "\" with material \"" + currMeshOriginal.materialId + "\"");
|
|
76
|
+
// if we're here, the imported mesh has different material than original one
|
|
77
|
+
(_c = window.Cbn) === null || _c === void 0 ? void 0 : _c.Assets.assertMaterialExists(materialOnOriginalMesh);
|
|
78
|
+
injectNodeMetadata(currMeshImported, (_a = {}, _a[missingMaterialMetadataName] = materialOnOriginalMesh, _a), false);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Adds an "onEnabledStateChanged" observer to the given mesh and all its parents:
|
|
85
|
+
* The added observer (`getMaterialPostLoadObserver`) handles creation of missing materials once the given node is
|
|
86
|
+
* enabled.
|
|
87
|
+
*/
|
|
88
|
+
var addMissingMaterialObserver = function (node) {
|
|
89
|
+
// set the concerning node, i.e. the node the observer should check for missing material.
|
|
90
|
+
// for instanced meshes, we want the sourcemesh here.
|
|
91
|
+
var concerningNode = node instanceof InstancedMesh ? node.sourceMesh : node;
|
|
92
|
+
// observer is pointless if concerning node has no missing material
|
|
93
|
+
if (!has(concerningNode.metadata, missingMaterialMetadataName))
|
|
94
|
+
return;
|
|
95
|
+
// for each of our AbstractMeshes, set an observer on the AbstractMesh itself and all of its parents.
|
|
96
|
+
var currNode = node;
|
|
97
|
+
while (currNode) {
|
|
98
|
+
// Note HAR: Using `addOnce` could be wrong in certain situations.
|
|
99
|
+
// E.g.:
|
|
100
|
+
// * 2 meshes `parentMesh` & `parentMesh.concerningMesh`
|
|
101
|
+
// * `concerningMesh` is having the missing material flag
|
|
102
|
+
// * Both `parentMesh` & `concerningMesh` are disabled
|
|
103
|
+
// * `parentMesh` is enabled -> material should **not** be created as `concerningMesh` is still disabled
|
|
104
|
+
// * `parentMesh` is disabled
|
|
105
|
+
// * `concerningMesh` is enabled -> material should **not** be created as `concerningMesh` is still invisible
|
|
106
|
+
// because its `parentMesh` is ATM disabled
|
|
107
|
+
// * `parentMesh` & `concerningMesh` are both enable
|
|
108
|
+
// -> material should be created as `concerningMesh` is now actually visible but it isn't, as all observers were
|
|
109
|
+
// only fired once 🔥
|
|
110
|
+
//
|
|
111
|
+
// However: Using `add` instead of `addOnce` requires rather complicated manual clean up work...
|
|
112
|
+
// add observer. needed only once per node, hence addOnce()
|
|
113
|
+
node.onEnabledStateChangedObservable.addOnce(getMaterialPostLoadObserver(currNode, concerningNode));
|
|
114
|
+
// console.log('## observer set on: ' + meshOrInstance.name);
|
|
115
|
+
currNode = currNode.parent;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Look up the provided materials (see library import) and create and return one if found.
|
|
120
|
+
* @param materialId BabylonJs material-id. E.g. 'concrete".
|
|
121
|
+
* @param scene BabylonJs scene
|
|
122
|
+
* @returns PBRMaterial | null
|
|
123
|
+
*/
|
|
124
|
+
export var getMaterialFromCbnAssets = function (materialId, scene) {
|
|
125
|
+
var _a;
|
|
126
|
+
var materialDefinition = (_a = window.Cbn) === null || _a === void 0 ? void 0 : _a.Assets.getMaterial(materialId);
|
|
127
|
+
// The generic `Material.Parse` actually returns a more specific material like `BABYLON.StandardMaterial`,
|
|
128
|
+
// `BABYLON.PBRMaterial` or stuff like `BABYLON.PBRMetallicRoughnessMaterial` etc. based on the given `customType`
|
|
129
|
+
// within the material JSON definition
|
|
130
|
+
var material = materialDefinition && Material.Parse(materialDefinition, scene, '');
|
|
131
|
+
return material || null;
|
|
132
|
+
};
|
|
133
|
+
export { getCustomCbnBabylonLoaderPlugin, getMaterialPostLoadObserver, missingMaterialMetadataName, addMissingMaterialObserver, };
|
|
134
|
+
//# sourceMappingURL=sceneLoaderHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneLoaderHelper.js","sourceRoot":"","sources":["../../../../src/api/util/sceneLoaderHelper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a random uuidv4.
|
|
3
|
+
*/
|
|
4
|
+
var uuidv4 = function () {
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) {
|
|
7
|
+
return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16);
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Converts a string from camel case to snake case.
|
|
12
|
+
*/
|
|
13
|
+
var camelToSnakeCase = function (str) {
|
|
14
|
+
return str
|
|
15
|
+
.replace(/([A-Z])/g, ' $1')
|
|
16
|
+
.trim()
|
|
17
|
+
.split(' ')
|
|
18
|
+
.join('_')
|
|
19
|
+
.toLowerCase();
|
|
20
|
+
};
|
|
21
|
+
export { uuidv4, camelToSnakeCase };
|
|
22
|
+
//# sourceMappingURL=stringHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringHelper.js","sourceRoot":"","sources":["../../../../src/api/util/stringHelper.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,IAAM,MAAM,GAAG;IACb,aAAa;IACb,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAA,CAAC;QAC7D,OAAA,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAAnF,CAAmF,CACpF,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,IAAM,gBAAgB,GAAG,UAAU,GAAW;IAC5C,OAAO,GAAG;SACP,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;SAC1B,IAAI,EAAE;SACN,KAAK,CAAC,GAAG,CAAC;SACV,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;AACnB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Mesh } from '@babylonjs/core/Meshes/mesh';
|
|
2
|
+
/**
|
|
3
|
+
* Find out if a mesh is part of a list of excluded geometry
|
|
4
|
+
* @param mesh BJS mesh
|
|
5
|
+
* @param list list of excluded geometry
|
|
6
|
+
* @returns boolean based on whether mesh (or one of its parents) was found in list
|
|
7
|
+
*/
|
|
8
|
+
declare const isMeshIncludedInExclusionList: (mesh: Mesh, list: ExcludedGeometryList) => boolean;
|
|
9
|
+
export { isMeshIncludedInExclusionList };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Mesh } from '@babylonjs/core/Meshes/mesh';
|
|
2
|
+
import { Variant } from '../classes/variant';
|
|
3
|
+
import { VariantInstance } from '../classes/variantInstance';
|
|
4
|
+
import { Element } from '../classes/element';
|
|
5
|
+
/**
|
|
6
|
+
* Find out if a mesh is part of a list of excluded geometry
|
|
7
|
+
* @param mesh BJS mesh
|
|
8
|
+
* @param list list of excluded geometry
|
|
9
|
+
* @returns boolean based on whether mesh (or one of its parents) was found in list
|
|
10
|
+
*/
|
|
11
|
+
var isMeshIncludedInExclusionList = function (mesh, list) {
|
|
12
|
+
var checkMesh = function (inputMesh, meshToCheck) {
|
|
13
|
+
return inputMesh.uniqueId === meshToCheck.uniqueId;
|
|
14
|
+
};
|
|
15
|
+
var checkElement = function (inputEl, meshToCheck) {
|
|
16
|
+
return inputEl.meshesFlat.some(function (m) { return checkMesh(m, meshToCheck); });
|
|
17
|
+
};
|
|
18
|
+
var checkVariant = function (inputVariant, meshToCheck) {
|
|
19
|
+
return inputVariant.elements.some(function (el) { return checkElement(el, meshToCheck); });
|
|
20
|
+
};
|
|
21
|
+
var checkVariantInstance = function (inputVarInst, meshToCheck) {
|
|
22
|
+
return inputVarInst.variant.elements.some(function (el) { return checkElement(el, meshToCheck); });
|
|
23
|
+
};
|
|
24
|
+
var check = function (geometryToExclude, mesh) {
|
|
25
|
+
if (geometryToExclude instanceof VariantInstance) {
|
|
26
|
+
return checkVariantInstance(geometryToExclude, mesh);
|
|
27
|
+
}
|
|
28
|
+
if (geometryToExclude instanceof Variant) {
|
|
29
|
+
return checkVariant(geometryToExclude, mesh);
|
|
30
|
+
}
|
|
31
|
+
if (geometryToExclude instanceof Element) {
|
|
32
|
+
return checkElement(geometryToExclude, mesh);
|
|
33
|
+
}
|
|
34
|
+
if (geometryToExclude instanceof Mesh) {
|
|
35
|
+
return checkMesh(geometryToExclude, mesh);
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
};
|
|
39
|
+
var isExcluded = list.some(function (geometryToExclude) { return check(geometryToExclude, mesh); });
|
|
40
|
+
if (!isExcluded && mesh.parent instanceof Mesh) {
|
|
41
|
+
isExcluded = isMeshIncludedInExclusionList(mesh.parent, list);
|
|
42
|
+
}
|
|
43
|
+
return isExcluded;
|
|
44
|
+
};
|
|
45
|
+
export { isMeshIncludedInExclusionList };
|
|
46
|
+
//# sourceMappingURL=structureHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structureHelper.js","sourceRoot":"","sources":["../../../../src/api/util/structureHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;GAKG;AACH,IAAM,6BAA6B,GAAG,UAAU,IAAU,EAAE,IAA0B;IACpF,IAAM,SAAS,GAAG,UAAC,SAAe,EAAE,WAAiB;QACnD,OAAO,SAAS,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,CAAC;IACrD,CAAC,CAAC;IACF,IAAM,YAAY,GAAG,UAAC,OAAgB,EAAE,WAAiB;QACvD,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAA,CAAC,IAAI,OAAA,SAAS,CAAC,CAAC,EAAE,WAAW,CAAC,EAAzB,CAAyB,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,IAAM,YAAY,GAAG,UAAC,YAAqB,EAAE,WAAiB;QAC5D,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,EAA7B,CAA6B,CAAC,CAAC;IACzE,CAAC,CAAC;IACF,IAAM,oBAAoB,GAAG,UAAC,YAA6B,EAAE,WAAiB;QAC5E,OAAO,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAA,EAAE,IAAI,OAAA,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,EAA7B,CAA6B,CAAC,CAAC;IACjF,CAAC,CAAC;IACF,IAAM,KAAK,GAAG,UAAC,iBAAmC,EAAE,IAAU;QAC5D,IAAI,iBAAiB,YAAY,eAAe,EAAE;YAChD,OAAO,oBAAoB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;SACtD;QACD,IAAI,iBAAiB,YAAY,OAAO,EAAE;YACxC,OAAO,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;SAC9C;QACD,IAAI,iBAAiB,YAAY,OAAO,EAAE;YACxC,OAAO,YAAY,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;SAC9C;QACD,IAAI,iBAAiB,YAAY,IAAI,EAAE;YACrC,OAAO,SAAS,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;SAC3C;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAA,iBAAiB,IAAI,OAAA,KAAK,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAA9B,CAA8B,CAAC,CAAC;IAChF,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,YAAY,IAAI,EAAE;QAC9C,UAAU,GAAG,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;KAC/D;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,OAAO,EAAE,6BAA6B,EAAE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/// <reference path="api/util/globalTypes.d.ts" />
|
|
2
|
+
import { Animation as BabylonAnimation } from '@babylonjs/core/Animations/animation';
|
|
3
|
+
import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera';
|
|
4
|
+
import { Engine } from '@babylonjs/core/Engines/engine';
|
|
5
|
+
import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight';
|
|
6
|
+
import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
|
|
7
|
+
import { Material } from '@babylonjs/core/Materials/material';
|
|
8
|
+
import { PBRMaterial } from '@babylonjs/core/Materials/PBR/pbrMaterial';
|
|
9
|
+
import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
|
|
10
|
+
import { CubeTexture } from '@babylonjs/core/Materials/Textures/cubeTexture';
|
|
11
|
+
import { DynamicTexture } from '@babylonjs/core/Materials/Textures/dynamicTexture';
|
|
12
|
+
import { Texture } from '@babylonjs/core/Materials/Textures/texture';
|
|
13
|
+
import { Color3, Color4 } from '@babylonjs/core/Maths/math.color';
|
|
14
|
+
import { Vector3 } from '@babylonjs/core/Maths/math.vector';
|
|
15
|
+
import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
|
|
16
|
+
import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh';
|
|
17
|
+
import { Mesh } from '@babylonjs/core/Meshes/mesh';
|
|
18
|
+
import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
|
|
19
|
+
import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
|
|
20
|
+
import { Node } from '@babylonjs/core/node';
|
|
21
|
+
/**
|
|
22
|
+
* Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
|
|
23
|
+
* errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
|
|
24
|
+
* version of the viewer (e.g. when pulling it from NPM etc.)...
|
|
25
|
+
*/
|
|
26
|
+
import '@babylonjs/core/Rendering/boundingBoxRenderer';
|
|
27
|
+
import { Scene } from '@babylonjs/core/scene';
|
|
28
|
+
import { Parameterizable } from './api/classes/parameterizable';
|
|
29
|
+
import { VariantParameterizable } from './api/classes/variantParameterizable';
|
|
30
|
+
import { EventEmitter } from 'eventemitter3';
|
|
31
|
+
import { Element } from './api/classes/element';
|
|
32
|
+
import { emitter, Event } from './api/classes/event';
|
|
33
|
+
import { EventBroadcaster } from './api/classes/eventBroadcaster';
|
|
34
|
+
import { Parameter } from './api/classes/parameter';
|
|
35
|
+
import { ParameterObservable } from './api/classes/parameterObservable';
|
|
36
|
+
import { PlacementAnimation } from './api/classes/placementAnimation';
|
|
37
|
+
import { Variant } from './api/classes/variant';
|
|
38
|
+
import { VariantInstance } from './api/classes/variantInstance';
|
|
39
|
+
import { Viewer } from './api/classes/viewer';
|
|
40
|
+
import { ViewerLight } from './api/classes/viewerLight';
|
|
41
|
+
import { AnimationManager } from './api/manager/animationManager';
|
|
42
|
+
import { SceneManager } from './api/manager/sceneManager';
|
|
43
|
+
import { VariantInstanceManager } from './api/manager/variantInstanceManager';
|
|
44
|
+
import { GltfExportManager } from './api/manager/gltfExportManager';
|
|
45
|
+
import * as BabylonHelper from './api/util/babylonHelper';
|
|
46
|
+
/**
|
|
47
|
+
* Expose some frequently used babylon modules by our consumers.
|
|
48
|
+
*/
|
|
49
|
+
export { AnimationManager, Variant, VariantInstanceManager, Viewer, ParameterObservable, Parameterizable, VariantParameterizable, ViewerLight, emitter as Emitter, EventEmitter, Event, Parameter, VariantInstance, Color3, Color4, Vector3, AbstractMesh, InstancedMesh, Mesh, TransformNode, Node, Material, PBRMaterial, StandardMaterial, Scene, Engine, ArcRotateCamera, DynamicTexture, CubeTexture, MeshBuilder, Texture, BabylonAnimation, HemisphericLight, DirectionalLight, Element, EventBroadcaster, SceneManager, PlacementAnimation, BabylonHelper, GltfExportManager, };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference path="api/util/globalTypes.ts" />
|
|
2
|
+
/// <reference types="gsap" />
|
|
3
|
+
import { Animation as BabylonAnimation } from '@babylonjs/core/Animations/animation';
|
|
4
|
+
import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera';
|
|
5
|
+
import { Engine } from '@babylonjs/core/Engines/engine';
|
|
6
|
+
import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight';
|
|
7
|
+
import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
|
|
8
|
+
import { Material } from '@babylonjs/core/Materials/material';
|
|
9
|
+
import { PBRMaterial } from '@babylonjs/core/Materials/PBR/pbrMaterial';
|
|
10
|
+
import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
|
|
11
|
+
import { CubeTexture } from '@babylonjs/core/Materials/Textures/cubeTexture';
|
|
12
|
+
import { DynamicTexture } from '@babylonjs/core/Materials/Textures/dynamicTexture';
|
|
13
|
+
import { Texture } from '@babylonjs/core/Materials/Textures/texture';
|
|
14
|
+
import { Color3, Color4 } from '@babylonjs/core/Maths/math.color';
|
|
15
|
+
import { Vector3 } from '@babylonjs/core/Maths/math.vector';
|
|
16
|
+
import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
|
|
17
|
+
import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh';
|
|
18
|
+
import { Mesh } from '@babylonjs/core/Meshes/mesh';
|
|
19
|
+
import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
|
|
20
|
+
import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
|
|
21
|
+
import { Node } from '@babylonjs/core/node';
|
|
22
|
+
/**
|
|
23
|
+
* Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
|
|
24
|
+
* errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
|
|
25
|
+
* version of the viewer (e.g. when pulling it from NPM etc.)...
|
|
26
|
+
*/
|
|
27
|
+
import '@babylonjs/core/Rendering/boundingBoxRenderer';
|
|
28
|
+
import { Scene } from '@babylonjs/core/scene';
|
|
29
|
+
import { Parameterizable } from './api/classes/parameterizable';
|
|
30
|
+
import { VariantParameterizable } from './api/classes/variantParameterizable';
|
|
31
|
+
import { EventEmitter } from 'eventemitter3';
|
|
32
|
+
import { Element } from './api/classes/element';
|
|
33
|
+
import { emitter, Event } from './api/classes/event';
|
|
34
|
+
import { EventBroadcaster } from './api/classes/eventBroadcaster';
|
|
35
|
+
import { Parameter } from './api/classes/parameter';
|
|
36
|
+
import { ParameterObservable } from './api/classes/parameterObservable';
|
|
37
|
+
import { PlacementAnimation } from './api/classes/placementAnimation';
|
|
38
|
+
import { Variant } from './api/classes/variant';
|
|
39
|
+
import { VariantInstance } from './api/classes/variantInstance';
|
|
40
|
+
import { Viewer } from './api/classes/viewer';
|
|
41
|
+
import { ViewerLight } from './api/classes/viewerLight';
|
|
42
|
+
import { AnimationManager } from './api/manager/animationManager';
|
|
43
|
+
import { SceneManager } from './api/manager/sceneManager';
|
|
44
|
+
import { VariantInstanceManager } from './api/manager/variantInstanceManager';
|
|
45
|
+
import { GltfExportManager } from './api/manager/gltfExportManager';
|
|
46
|
+
import * as BabylonHelper from './api/util/babylonHelper';
|
|
47
|
+
/**
|
|
48
|
+
* Expose some frequently used babylon modules by our consumers.
|
|
49
|
+
*/
|
|
50
|
+
export { AnimationManager, Variant, VariantInstanceManager, Viewer, ParameterObservable, Parameterizable, VariantParameterizable, ViewerLight, emitter as Emitter, EventEmitter, Event, Parameter, VariantInstance, Color3, Color4, Vector3, AbstractMesh, InstancedMesh, Mesh, TransformNode, Node, Material, PBRMaterial, StandardMaterial, Scene, Engine, ArcRotateCamera, DynamicTexture, CubeTexture, MeshBuilder, Texture, BabylonAnimation, HemisphericLight, DirectionalLight, Element, EventBroadcaster, SceneManager, PlacementAnimation, BabylonHelper, GltfExportManager, };
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@combeenation/3d-viewer",
|
|
3
3
|
"description": "Combeenation 3D Viewer",
|
|
4
|
-
"version": "5.1.0-
|
|
4
|
+
"version": "5.1.0-rc4",
|
|
5
5
|
"homepage": "https://github.com/Combeenation/3d-viewer#readme",
|
|
6
6
|
"keywords": [],
|
|
7
7
|
"author": "",
|
|
@@ -39,14 +39,14 @@
|
|
|
39
39
|
"pub-alpha": "npm run dist-cjs && npm publish --tag alpha",
|
|
40
40
|
"pub-beta": "npm run dist-cjs && npm publish --tag beta",
|
|
41
41
|
"pub-rc": "npm run dist-cjs && npm publish --tag rc",
|
|
42
|
-
"pack": "npm run dist-cjs && npm pack",
|
|
42
|
+
"pack": "npm run dist-cjs && npm pack --pack-destination=\"/mnt/c/Data/dev/custom-js/MichaelTest/PbrAssetTest\"",
|
|
43
43
|
"format": "prettier --write ."
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@babylonjs/core": "5.
|
|
47
|
-
"@babylonjs/loaders": "5.
|
|
48
|
-
"@babylonjs/materials": "5.
|
|
49
|
-
"@babylonjs/serializers": "5.
|
|
46
|
+
"@babylonjs/core": "5.21.0",
|
|
47
|
+
"@babylonjs/loaders": "5.21.0",
|
|
48
|
+
"@babylonjs/materials": "5.21.0",
|
|
49
|
+
"@babylonjs/serializers": "5.21.0",
|
|
50
50
|
"eventemitter3": "^4.0.0",
|
|
51
51
|
"gsap": "^3.5.1",
|
|
52
52
|
"lodash-es": "^4.17.15"
|
|
@@ -36,9 +36,7 @@ import { VariantParameterizable } from './../classes/variantParameterizable';
|
|
|
36
36
|
import { DottedPath } from './dottedPath';
|
|
37
37
|
import { Parameter } from './parameter';
|
|
38
38
|
import { Variant } from './variant';
|
|
39
|
-
import {
|
|
40
|
-
import { Nullable } from '@babylonjs/core/types';
|
|
41
|
-
import { Node as BjsNode } from '@babylonjs/core/node'; //! overload DOM API Node due to name-clash with BJS
|
|
39
|
+
import { addMissingMaterialObserver } from '../util/sceneLoaderHelper';
|
|
42
40
|
|
|
43
41
|
/**
|
|
44
42
|
* An {@link Element} of a {@link Variant}. Acts as a container for diverse definitions. Lives only in the context of a
|
|
@@ -374,24 +372,7 @@ export class Element extends VariantParameterizable {
|
|
|
374
372
|
*/
|
|
375
373
|
protected addMissingMaterialObservers() {
|
|
376
374
|
for (const abstractMesh of this.abstractMeshesFlat) {
|
|
377
|
-
|
|
378
|
-
// for instances, we want the sourcemesh here.
|
|
379
|
-
const concerningMesh = abstractMesh instanceof InstancedMesh ? abstractMesh.sourceMesh : (abstractMesh as Mesh);
|
|
380
|
-
|
|
381
|
-
// observer is pointless if concerning mesh has no missing material
|
|
382
|
-
if (!has(concerningMesh.metadata, missingMaterialMetadataName)) continue;
|
|
383
|
-
|
|
384
|
-
// for each of our AbstractMeshes, set an observer on the AbstractMesh itself,
|
|
385
|
-
// but also on all of its parents.
|
|
386
|
-
let currNode: Nullable<BjsNode> = abstractMesh as BjsNode;
|
|
387
|
-
while (currNode) {
|
|
388
|
-
// add observer. needed only once per node, hence addOnce()
|
|
389
|
-
abstractMesh.onEnabledStateChangedObservable.addOnce(
|
|
390
|
-
getMaterialPostLoadObserver(currNode as AbstractMesh, concerningMesh)
|
|
391
|
-
);
|
|
392
|
-
// console.log('## observer set on: ' + meshOrInstance.name);
|
|
393
|
-
currNode = currNode.parent;
|
|
394
|
-
}
|
|
375
|
+
addMissingMaterialObserver(abstractMesh);
|
|
395
376
|
}
|
|
396
377
|
}
|
|
397
378
|
|
|
@@ -458,7 +439,7 @@ export class Element extends VariantParameterizable {
|
|
|
458
439
|
]);
|
|
459
440
|
this._parameterObservers.set(Parameter.MATERIAL, [
|
|
460
441
|
async (element: Element, oldValue: ParameterValue, newValue: ParameterValue) => {
|
|
461
|
-
const
|
|
442
|
+
const materialName = newValue.toString();
|
|
462
443
|
element.nodes.forEach(node => {
|
|
463
444
|
assertTransformNode(node, (node: AbstractMesh) => {
|
|
464
445
|
if (node instanceof InstancedMesh) {
|
|
@@ -469,7 +450,7 @@ export class Element extends VariantParameterizable {
|
|
|
469
450
|
);
|
|
470
451
|
}
|
|
471
452
|
});
|
|
472
|
-
setMaterial(node,
|
|
453
|
+
setMaterial(element.variant, node, materialName);
|
|
473
454
|
});
|
|
474
455
|
},
|
|
475
456
|
]);
|
|
@@ -728,9 +728,9 @@ export class Variant extends Parameterizable {
|
|
|
728
728
|
protected async commitParameterToElements(parameter: string, value: ParameterValue): Promise<Variant> {
|
|
729
729
|
const promises = [];
|
|
730
730
|
for (const element of this.elements) {
|
|
731
|
-
const
|
|
732
|
-
const elementIsHiddenViaParams = this.inheritedParameters[elementVisibleParamPath] === false;
|
|
731
|
+
const paramShowsElement = Parameter.VISIBLE === parameter && value;
|
|
733
732
|
|
|
733
|
+
// Fixes https://combeenation.youtrack.cloud/issue/CB-7773
|
|
734
734
|
// Don't enable/show the variants element if it is explicitly hidden via its element parameters.
|
|
735
735
|
// E.g. via spec:
|
|
736
736
|
// ```
|
|
@@ -747,7 +747,26 @@ export class Variant extends Parameterizable {
|
|
|
747
747
|
// }
|
|
748
748
|
// }
|
|
749
749
|
// ```
|
|
750
|
-
|
|
750
|
+
const elementVisibleParamPath = DottedPath.create([element.name, Parameter.VISIBLE]).toString();
|
|
751
|
+
const elementIsHiddenViaParams = this.inheritedParameters[elementVisibleParamPath] === false;
|
|
752
|
+
if (paramShowsElement && elementIsHiddenViaParams) continue;
|
|
753
|
+
|
|
754
|
+
// To discuss: Is this a viable solution or is it too hacky to apply the elements material param, when the param
|
|
755
|
+
// at hand is actually the visible param?
|
|
756
|
+
// Fixes https://combeenation.youtrack.cloud/issue/CB-7809
|
|
757
|
+
// Apply element material before showing the element to prevent loading of the elements "original" material which
|
|
758
|
+
// is never shown when "overwritten" by elements material param.
|
|
759
|
+
const elementMaterialParamPath = DottedPath.create([element.name, Parameter.MATERIAL]).toString();
|
|
760
|
+
const elementMaterialParamValue = this.inheritedParameters[elementMaterialParamPath];
|
|
761
|
+
if (paramShowsElement && elementMaterialParamValue) {
|
|
762
|
+
// To discuss: Should we rather use `this.commitParametersToElements` here?
|
|
763
|
+
// I'm not really sure about the actual differences, both seem to do the job 🤷♂️
|
|
764
|
+
// To discuss: Should we actively `await` this (as is) or should we also push the resulting promise into the
|
|
765
|
+
// `promises` array as dome some lines below?
|
|
766
|
+
// I wasn't sure whether not awaiting this could result in "not guaranteed application order" of
|
|
767
|
+
// new visibility & material param value...
|
|
768
|
+
await element.commitParameter(Parameter.MATERIAL, elementMaterialParamValue);
|
|
769
|
+
}
|
|
751
770
|
|
|
752
771
|
promises.push(element.commitParameter(parameter, value));
|
|
753
772
|
}
|
|
@@ -21,7 +21,7 @@ import { Nullable } from '@babylonjs/core/types';
|
|
|
21
21
|
import { defaultEnvHelperColor, defaultSceneClearColor } from '../internal/sceneSetup';
|
|
22
22
|
import { cloneDeep, get, has, merge } from 'lodash-es';
|
|
23
23
|
import { DottedPath } from '../classes/dottedPath';
|
|
24
|
-
import { missingMaterialMetadataName } from './sceneLoaderHelper';
|
|
24
|
+
import { addMissingMaterialObserver, missingMaterialMetadataName } from './sceneLoaderHelper';
|
|
25
25
|
|
|
26
26
|
const backgroundDomeName = 'BackgroundDome_ViewerGenerated';
|
|
27
27
|
const envHelperMetadataName = 'viewerEnvHelper';
|
|
@@ -362,18 +362,28 @@ const changeEnvironment = function (scene: Scene, envDef: EnvironmentDefinition)
|
|
|
362
362
|
|
|
363
363
|
/**
|
|
364
364
|
* @param node
|
|
365
|
-
* @param
|
|
365
|
+
* @param materialName
|
|
366
366
|
* @param deep
|
|
367
367
|
*/
|
|
368
|
-
const setMaterial = function (node: TransformNode,
|
|
368
|
+
const setMaterial = function (variant: Variant, node: TransformNode, materialName: string, deep: boolean = true) {
|
|
369
369
|
if (node instanceof AbstractMesh) {
|
|
370
|
-
node.
|
|
371
|
-
if (
|
|
372
|
-
|
|
370
|
+
const hasMissingMaterial = has(node.metadata, missingMaterialMetadataName);
|
|
371
|
+
if (node.isEnabled()) {
|
|
372
|
+
node.material = variant.getMaterial(materialName);
|
|
373
|
+
if (hasMissingMaterial) {
|
|
374
|
+
delete node.metadata[missingMaterialMetadataName];
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
injectNodeMetadata(node, { [missingMaterialMetadataName]: materialName }, false);
|
|
378
|
+
|
|
379
|
+
// If it already had the missing material flag before, there already exists an observer...
|
|
380
|
+
if (!hasMissingMaterial) {
|
|
381
|
+
addMissingMaterialObserver(node);
|
|
382
|
+
}
|
|
373
383
|
}
|
|
374
384
|
}
|
|
375
385
|
if (deep) {
|
|
376
|
-
node.getChildTransformNodes(true).forEach(child => setMaterial(child,
|
|
386
|
+
node.getChildTransformNodes(true).forEach(child => setMaterial(variant, child, materialName, deep));
|
|
377
387
|
}
|
|
378
388
|
};
|
|
379
389
|
|