@combeenation/3d-viewer 12.4.1 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) 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 +63 -63
  4. package/dist/lib-cjs/index.js +81 -114
  5. package/dist/lib-cjs/index.js.map +1 -1
  6. package/dist/lib-cjs/internal/cbnCustomBabylonLoaderPlugin.d.ts +10 -0
  7. package/dist/lib-cjs/internal/cbnCustomBabylonLoaderPlugin.js +124 -0
  8. package/dist/lib-cjs/internal/cbnCustomBabylonLoaderPlugin.js.map +1 -0
  9. package/dist/lib-cjs/internal/cloningHelper.d.ts +19 -0
  10. package/dist/lib-cjs/internal/cloningHelper.js +165 -0
  11. package/dist/lib-cjs/internal/cloningHelper.js.map +1 -0
  12. package/dist/lib-cjs/internal/deviceHelper.d.ts +9 -0
  13. package/dist/lib-cjs/{api/util → internal}/deviceHelper.js +6 -10
  14. package/dist/lib-cjs/internal/deviceHelper.js.map +1 -0
  15. package/dist/lib-cjs/internal/geometryHelper.d.ts +21 -0
  16. package/dist/lib-cjs/{api/util → internal}/geometryHelper.js +57 -24
  17. package/dist/lib-cjs/internal/geometryHelper.js.map +1 -0
  18. package/dist/lib-cjs/internal/metadataHelper.d.ts +26 -0
  19. package/dist/lib-cjs/internal/metadataHelper.js +51 -0
  20. package/dist/lib-cjs/internal/metadataHelper.js.map +1 -0
  21. package/dist/lib-cjs/internal/paintableHelper.d.ts +40 -0
  22. package/dist/lib-cjs/internal/paintableHelper.js +287 -0
  23. package/dist/lib-cjs/internal/paintableHelper.js.map +1 -0
  24. package/dist/lib-cjs/internal/tagsHelper.d.ts +12 -0
  25. package/dist/lib-cjs/internal/tagsHelper.js +38 -0
  26. package/dist/lib-cjs/internal/tagsHelper.js.map +1 -0
  27. package/dist/lib-cjs/manager/cameraManager.d.ts +51 -0
  28. package/dist/lib-cjs/manager/cameraManager.js +154 -0
  29. package/dist/lib-cjs/manager/cameraManager.js.map +1 -0
  30. package/dist/lib-cjs/manager/debugManager.d.ts +60 -0
  31. package/dist/lib-cjs/manager/debugManager.js +218 -0
  32. package/dist/lib-cjs/manager/debugManager.js.map +1 -0
  33. package/dist/lib-cjs/manager/eventManager.d.ts +52 -0
  34. package/dist/lib-cjs/manager/eventManager.js +72 -0
  35. package/dist/lib-cjs/manager/eventManager.js.map +1 -0
  36. package/dist/lib-cjs/{api/manager → manager}/gltfExportManager.d.ts +29 -34
  37. package/dist/lib-cjs/{api/manager → manager}/gltfExportManager.js +99 -120
  38. package/dist/lib-cjs/manager/gltfExportManager.js.map +1 -0
  39. package/dist/lib-cjs/manager/materialManager.d.ts +35 -0
  40. package/dist/lib-cjs/manager/materialManager.js +126 -0
  41. package/dist/lib-cjs/manager/materialManager.js.map +1 -0
  42. package/dist/lib-cjs/manager/modelManager.d.ts +145 -0
  43. package/dist/lib-cjs/manager/modelManager.js +381 -0
  44. package/dist/lib-cjs/manager/modelManager.js.map +1 -0
  45. package/dist/lib-cjs/manager/parameterManager.d.ts +210 -0
  46. package/dist/lib-cjs/manager/parameterManager.js +515 -0
  47. package/dist/lib-cjs/manager/parameterManager.js.map +1 -0
  48. package/dist/lib-cjs/manager/sceneManager.d.ts +45 -0
  49. package/dist/lib-cjs/manager/sceneManager.js +65 -0
  50. package/dist/lib-cjs/manager/sceneManager.js.map +1 -0
  51. package/dist/lib-cjs/manager/screenshotManager.d.ts +36 -0
  52. package/dist/lib-cjs/manager/screenshotManager.js +40 -0
  53. package/dist/lib-cjs/manager/screenshotManager.js.map +1 -0
  54. package/dist/lib-cjs/manager/textureManager.d.ts +12 -0
  55. package/dist/lib-cjs/manager/textureManager.js +44 -0
  56. package/dist/lib-cjs/manager/textureManager.js.map +1 -0
  57. package/dist/lib-cjs/viewer.d.ts +117 -0
  58. package/dist/lib-cjs/viewer.js +222 -0
  59. package/dist/lib-cjs/viewer.js.map +1 -0
  60. package/dist/lib-cjs/{api/classes/viewerError.d.ts → viewerError.d.ts} +6 -1
  61. package/dist/lib-cjs/{api/classes/viewerError.js → viewerError.js} +6 -1
  62. package/dist/lib-cjs/viewerError.js.map +1 -0
  63. package/package.json +10 -11
  64. package/src/dev.ts +14 -37
  65. package/src/{types.d.ts → globalTypes.d.ts} +8 -18
  66. package/src/index.ts +79 -113
  67. package/src/internal/cbnCustomBabylonLoaderPlugin.ts +149 -0
  68. package/src/internal/cloningHelper.ts +225 -0
  69. package/src/internal/deviceHelper.ts +25 -0
  70. package/src/{api/util → internal}/geometryHelper.ts +63 -24
  71. package/src/internal/metadataHelper.ts +63 -0
  72. package/src/internal/paintableHelper.ts +310 -0
  73. package/src/internal/tagsHelper.ts +41 -0
  74. package/src/manager/cameraManager.ts +236 -0
  75. package/src/manager/debugManager.ts +245 -0
  76. package/src/manager/eventManager.ts +72 -0
  77. package/src/{api/manager → manager}/gltfExportManager.ts +132 -125
  78. package/src/manager/materialManager.ts +135 -0
  79. package/src/manager/modelManager.ts +456 -0
  80. package/src/manager/parameterManager.ts +652 -0
  81. package/src/manager/sceneManager.ts +101 -0
  82. package/src/manager/screenshotManager.ts +59 -0
  83. package/src/manager/textureManager.ts +32 -0
  84. package/src/viewer.ts +296 -0
  85. package/src/{api/classes/viewerError.ts → viewerError.ts} +6 -1
  86. package/dist/lib-cjs/api/classes/animationInterface.d.ts +0 -8
  87. package/dist/lib-cjs/api/classes/animationInterface.js +0 -3
  88. package/dist/lib-cjs/api/classes/animationInterface.js.map +0 -1
  89. package/dist/lib-cjs/api/classes/dottedPath.d.ts +0 -79
  90. package/dist/lib-cjs/api/classes/dottedPath.js +0 -167
  91. package/dist/lib-cjs/api/classes/dottedPath.js.map +0 -1
  92. package/dist/lib-cjs/api/classes/element.d.ts +0 -153
  93. package/dist/lib-cjs/api/classes/element.js +0 -703
  94. package/dist/lib-cjs/api/classes/element.js.map +0 -1
  95. package/dist/lib-cjs/api/classes/event.d.ts +0 -401
  96. package/dist/lib-cjs/api/classes/event.js +0 -425
  97. package/dist/lib-cjs/api/classes/event.js.map +0 -1
  98. package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +0 -26
  99. package/dist/lib-cjs/api/classes/eventBroadcaster.js +0 -50
  100. package/dist/lib-cjs/api/classes/eventBroadcaster.js.map +0 -1
  101. package/dist/lib-cjs/api/classes/fuzzyMap.d.ts +0 -7
  102. package/dist/lib-cjs/api/classes/fuzzyMap.js +0 -22
  103. package/dist/lib-cjs/api/classes/fuzzyMap.js.map +0 -1
  104. package/dist/lib-cjs/api/classes/parameter.d.ts +0 -410
  105. package/dist/lib-cjs/api/classes/parameter.js +0 -643
  106. package/dist/lib-cjs/api/classes/parameter.js.map +0 -1
  107. package/dist/lib-cjs/api/classes/parameterObservable.d.ts +0 -36
  108. package/dist/lib-cjs/api/classes/parameterObservable.js +0 -73
  109. package/dist/lib-cjs/api/classes/parameterObservable.js.map +0 -1
  110. package/dist/lib-cjs/api/classes/parameterizable.d.ts +0 -15
  111. package/dist/lib-cjs/api/classes/parameterizable.js +0 -103
  112. package/dist/lib-cjs/api/classes/parameterizable.js.map +0 -1
  113. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +0 -45
  114. package/dist/lib-cjs/api/classes/placementAnimation.js +0 -177
  115. package/dist/lib-cjs/api/classes/placementAnimation.js.map +0 -1
  116. package/dist/lib-cjs/api/classes/variant.d.ts +0 -261
  117. package/dist/lib-cjs/api/classes/variant.js +0 -873
  118. package/dist/lib-cjs/api/classes/variant.js.map +0 -1
  119. package/dist/lib-cjs/api/classes/variantInstance.d.ts +0 -53
  120. package/dist/lib-cjs/api/classes/variantInstance.js +0 -126
  121. package/dist/lib-cjs/api/classes/variantInstance.js.map +0 -1
  122. package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +0 -17
  123. package/dist/lib-cjs/api/classes/variantParameterizable.js +0 -87
  124. package/dist/lib-cjs/api/classes/variantParameterizable.js.map +0 -1
  125. package/dist/lib-cjs/api/classes/viewer.d.ts +0 -215
  126. package/dist/lib-cjs/api/classes/viewer.js +0 -709
  127. package/dist/lib-cjs/api/classes/viewer.js.map +0 -1
  128. package/dist/lib-cjs/api/classes/viewerError.js.map +0 -1
  129. package/dist/lib-cjs/api/classes/viewerLight.d.ts +0 -66
  130. package/dist/lib-cjs/api/classes/viewerLight.js +0 -345
  131. package/dist/lib-cjs/api/classes/viewerLight.js.map +0 -1
  132. package/dist/lib-cjs/api/internal/lensRendering.d.ts +0 -8
  133. package/dist/lib-cjs/api/internal/lensRendering.js +0 -12
  134. package/dist/lib-cjs/api/internal/lensRendering.js.map +0 -1
  135. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +0 -13
  136. package/dist/lib-cjs/api/internal/sceneSetup.js +0 -228
  137. package/dist/lib-cjs/api/internal/sceneSetup.js.map +0 -1
  138. package/dist/lib-cjs/api/manager/animationManager.d.ts +0 -30
  139. package/dist/lib-cjs/api/manager/animationManager.js +0 -127
  140. package/dist/lib-cjs/api/manager/animationManager.js.map +0 -1
  141. package/dist/lib-cjs/api/manager/gltfExportManager.js.map +0 -1
  142. package/dist/lib-cjs/api/manager/sceneManager.d.ts +0 -33
  143. package/dist/lib-cjs/api/manager/sceneManager.js +0 -129
  144. package/dist/lib-cjs/api/manager/sceneManager.js.map +0 -1
  145. package/dist/lib-cjs/api/manager/tagManager.d.ts +0 -118
  146. package/dist/lib-cjs/api/manager/tagManager.js +0 -531
  147. package/dist/lib-cjs/api/manager/tagManager.js.map +0 -1
  148. package/dist/lib-cjs/api/manager/textureLoadManager.d.ts +0 -22
  149. package/dist/lib-cjs/api/manager/textureLoadManager.js +0 -108
  150. package/dist/lib-cjs/api/manager/textureLoadManager.js.map +0 -1
  151. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +0 -106
  152. package/dist/lib-cjs/api/manager/variantInstanceManager.js +0 -291
  153. package/dist/lib-cjs/api/manager/variantInstanceManager.js.map +0 -1
  154. package/dist/lib-cjs/api/store/specStorage.d.ts +0 -32
  155. package/dist/lib-cjs/api/store/specStorage.js +0 -66
  156. package/dist/lib-cjs/api/store/specStorage.js.map +0 -1
  157. package/dist/lib-cjs/api/util/babylonHelper.d.ts +0 -238
  158. package/dist/lib-cjs/api/util/babylonHelper.js +0 -826
  159. package/dist/lib-cjs/api/util/babylonHelper.js.map +0 -1
  160. package/dist/lib-cjs/api/util/debugHelper.d.ts +0 -9
  161. package/dist/lib-cjs/api/util/debugHelper.js +0 -94
  162. package/dist/lib-cjs/api/util/debugHelper.js.map +0 -1
  163. package/dist/lib-cjs/api/util/deviceHelper.d.ts +0 -9
  164. package/dist/lib-cjs/api/util/deviceHelper.js.map +0 -1
  165. package/dist/lib-cjs/api/util/geometryHelper.d.ts +0 -17
  166. package/dist/lib-cjs/api/util/geometryHelper.js.map +0 -1
  167. package/dist/lib-cjs/api/util/globalTypes.d.ts +0 -490
  168. package/dist/lib-cjs/api/util/globalTypes.js +0 -2
  169. package/dist/lib-cjs/api/util/globalTypes.js.map +0 -1
  170. package/dist/lib-cjs/api/util/resourceHelper.d.ts +0 -58
  171. package/dist/lib-cjs/api/util/resourceHelper.js +0 -215
  172. package/dist/lib-cjs/api/util/resourceHelper.js.map +0 -1
  173. package/dist/lib-cjs/api/util/sceneLoaderHelper.d.ts +0 -58
  174. package/dist/lib-cjs/api/util/sceneLoaderHelper.js +0 -229
  175. package/dist/lib-cjs/api/util/sceneLoaderHelper.js.map +0 -1
  176. package/dist/lib-cjs/api/util/stringHelper.d.ts +0 -13
  177. package/dist/lib-cjs/api/util/stringHelper.js +0 -33
  178. package/dist/lib-cjs/api/util/stringHelper.js.map +0 -1
  179. package/dist/lib-cjs/api/util/structureHelper.d.ts +0 -9
  180. package/dist/lib-cjs/api/util/structureHelper.js +0 -58
  181. package/dist/lib-cjs/api/util/structureHelper.js.map +0 -1
  182. package/src/api/classes/animationInterface.ts +0 -10
  183. package/src/api/classes/dottedPath.ts +0 -181
  184. package/src/api/classes/element.ts +0 -766
  185. package/src/api/classes/event.ts +0 -457
  186. package/src/api/classes/eventBroadcaster.ts +0 -52
  187. package/src/api/classes/fuzzyMap.ts +0 -21
  188. package/src/api/classes/parameter.ts +0 -686
  189. package/src/api/classes/parameterObservable.ts +0 -73
  190. package/src/api/classes/parameterizable.ts +0 -87
  191. package/src/api/classes/placementAnimation.ts +0 -162
  192. package/src/api/classes/variant.ts +0 -965
  193. package/src/api/classes/variantInstance.ts +0 -123
  194. package/src/api/classes/variantParameterizable.ts +0 -83
  195. package/src/api/classes/viewer.ts +0 -751
  196. package/src/api/classes/viewerLight.ts +0 -335
  197. package/src/api/internal/debugViewer.ts +0 -90
  198. package/src/api/internal/lensRendering.ts +0 -9
  199. package/src/api/internal/sceneSetup.ts +0 -208
  200. package/src/api/manager/animationManager.ts +0 -143
  201. package/src/api/manager/sceneManager.ts +0 -134
  202. package/src/api/manager/tagManager.ts +0 -572
  203. package/src/api/manager/textureLoadManager.ts +0 -107
  204. package/src/api/manager/variantInstanceManager.ts +0 -306
  205. package/src/api/store/specStorage.ts +0 -68
  206. package/src/api/util/babylonHelper.ts +0 -915
  207. package/src/api/util/debugHelper.ts +0 -121
  208. package/src/api/util/deviceHelper.ts +0 -31
  209. package/src/api/util/globalTypes.ts +0 -566
  210. package/src/api/util/resourceHelper.ts +0 -201
  211. package/src/api/util/sceneLoaderHelper.ts +0 -247
  212. package/src/api/util/stringHelper.ts +0 -30
  213. package/src/api/util/structureHelper.ts +0 -62
@@ -0,0 +1,381 @@
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.ModelManager = void 0;
13
+ const index_1 = require("../index");
14
+ const cloningHelper_1 = require("../internal/cloningHelper");
15
+ const metadataHelper_1 = require("../internal/metadataHelper");
16
+ const lodash_es_1 = require("lodash-es");
17
+ /**
18
+ * Manager for handling 3d models.\
19
+ * Responsible for loading models and handling their visibility.\
20
+ * Also contains advanced features like model cloning.
21
+ */
22
+ class ModelManager {
23
+ constructor(viewer) {
24
+ this.viewer = viewer;
25
+ this._modelAssets = {};
26
+ this._fallbackModelAsset = {
27
+ name: ModelManager.CBN_FALLBACK_MODEL_ASSET_NAME,
28
+ url: '',
29
+ state: 'loaded',
30
+ assetContainer: new index_1.AssetContainer(),
31
+ isClone: false,
32
+ };
33
+ this._loadModelPromises = {};
34
+ }
35
+ get modelNames() {
36
+ return Object.keys(this._modelAssets);
37
+ }
38
+ /**
39
+ * Nested models were targeted with slash notation previously, as Spec couldn't work with dots.
40
+ * Dots were interpreted as inherited model.
41
+ * Now the Hive viewer parameters are returning slash notated asset names, whereas the asset names from the
42
+ * prepacked asset manager are dot notated.
43
+ * This function converts slash to dot notation, so that models can be target with slash and dot notation alike.
44
+ */
45
+ static _replaceSlashes(inputStr) {
46
+ return inputStr.split('/').join('.');
47
+ }
48
+ /**
49
+ * Creates content for the fallback model, which is actually just a black cube.
50
+ * This is used for 3d assets that are linked in a data source but not available (yet).
51
+ * The Combeenation backend exchanges the missing 3d asset name with "$fallback", which indicates that we shouldn't
52
+ * throw an error but just show the fallback model instead.
53
+ *
54
+ * @internal
55
+ */
56
+ createFallbackModel() {
57
+ const fallbackCube = index_1.MeshBuilder.CreateBox('$fallbackCube', { size: 1 }, this.viewer.scene);
58
+ fallbackCube._parentContainer = this._fallbackModelAsset.assetContainer;
59
+ this._fallbackModelAsset.assetContainer.meshes.push(fallbackCube);
60
+ // NOTE: this is theoretically async, but in reality it's not when getting the material description from the CBN
61
+ // server
62
+ // also this is just a fallback that shouldn't be relevant in productive configurators
63
+ this.viewer.materialManager.setMaterialOnMesh(index_1.MaterialManager.CBN_FALLBACK_MATERIAL_NAME, fallbackCube);
64
+ this._fallbackModelAsset.assetContainer.removeFromScene();
65
+ }
66
+ /**
67
+ * Register models for 3d viewer, this is required for each model before it can be loaded/shown.\
68
+ * The "viewer control" inside the Combeenation framework calls this function automatically with all assigned
69
+ * 3d assets.
70
+ */
71
+ registerModels(modelAssets) {
72
+ for (const { name, url } of modelAssets) {
73
+ const existingModel = this._modelAssets[name];
74
+ if (existingModel) {
75
+ console.warn(`Model ${name} is already registered`);
76
+ return;
77
+ }
78
+ const model = { name, url, state: 'notLoaded', assetContainer: new index_1.AssetContainer(), isClone: false };
79
+ this._modelAssets[name] = model;
80
+ }
81
+ }
82
+ /**
83
+ * Loads the model and all it's assigned materials.\
84
+ * This function should be used for "eager loading" of models, so that model switching will be instant in the
85
+ * process.\
86
+ * If you don't plan to do this, just use {@link setModelVisibility} as this function will load the model under the
87
+ * hood the first time the model gets visible.
88
+ */
89
+ loadModel(name) {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ const model = this._getModel(name);
92
+ if (!model) {
93
+ throw new index_1.ViewerError({
94
+ id: index_1.ViewerErrorIds.ModelNotRegistered,
95
+ message: `Can't load model "${name}" as model is not registered`,
96
+ });
97
+ }
98
+ if (model.state !== 'notLoaded') {
99
+ console.warn(`Model ${name} is already loaded or currently loading`);
100
+ return;
101
+ }
102
+ yield this._loadModel(model);
103
+ yield this._prepareModelForScene(model);
104
+ });
105
+ }
106
+ /**
107
+ * Enables/disables multiple one or multiple models simultaniously.\
108
+ * All required models are loaded before adjusting the visibility to avoid flashing in the 3d scene.
109
+ *
110
+ * @returns Array of changed visibility status, combined with the corresponding model name
111
+ */
112
+ setModelVisibility(modelVisibility) {
113
+ var _a;
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ const showModels = [];
116
+ const hideModels = [];
117
+ if (!(0, lodash_es_1.isArray)(modelVisibility)) {
118
+ modelVisibility = [modelVisibility];
119
+ }
120
+ for (const entry of modelVisibility) {
121
+ const model = this._getModel(entry.name);
122
+ if (!model) {
123
+ throw new index_1.ViewerError({
124
+ id: index_1.ViewerErrorIds.ModelNotRegistered,
125
+ message: `Can't set visibility of model "${entry.name}" as model is not registered`,
126
+ });
127
+ }
128
+ // there can be multiple "setModelVisibility" calls while the model is loading
129
+ // loading can be awaited, but it has to be ensured, that the last call of "setModelVisibility" has priority
130
+ // therefore we store the id of the call in the model
131
+ const curVisibilityCallId = ((_a = model.visibilityCallId) !== null && _a !== void 0 ? _a : 0) + 1;
132
+ model.visibilityCallId = curVisibilityCallId;
133
+ if (entry.visible) {
134
+ if (model.state === 'notLoaded') {
135
+ yield this._loadModel(model);
136
+ // check if this is still the latest visibility call
137
+ if (model.visibilityCallId === curVisibilityCallId) {
138
+ showModels.push(model);
139
+ }
140
+ }
141
+ else if (model.state === 'loading') {
142
+ yield this._loadModelPromises[model.name];
143
+ if (model.visibilityCallId === curVisibilityCallId) {
144
+ showModels.push(model);
145
+ }
146
+ }
147
+ else if (model.state === 'loaded') {
148
+ showModels.push(model);
149
+ }
150
+ }
151
+ else {
152
+ if (model.state === 'loading') {
153
+ yield this._loadModelPromises[model.name];
154
+ if (model.visibilityCallId === curVisibilityCallId) {
155
+ hideModels.push(model);
156
+ }
157
+ }
158
+ else if (model.state === 'inScene') {
159
+ hideModels.push(model);
160
+ }
161
+ }
162
+ }
163
+ for (const showModel of showModels) {
164
+ yield this._prepareModelForScene(showModel);
165
+ }
166
+ for (const showModel of showModels) {
167
+ yield this._showModel(showModel, true);
168
+ }
169
+ for (const hideModel of hideModels) {
170
+ this._hideModel(hideModel);
171
+ }
172
+ const returnVal = [];
173
+ showModels.forEach(showModel => returnVal.push({ name: showModel.name, visible: true }));
174
+ hideModels.forEach(hideModel => returnVal.push({ name: hideModel.name, visible: false }));
175
+ return returnVal;
176
+ });
177
+ }
178
+ /**
179
+ * Create a clone of an existing model.\
180
+ * Only the geometry (meshes, transform nodes) gets cloned, as materials are typically shared across the whole scene.
181
+ *
182
+ * @param show show model immediately after cloning
183
+ * @param options additional options for the cloning procedure, like renaming algorithms
184
+ */
185
+ cloneModel(name, newModelName, show = true, options) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ const sourceModel = this._getModel(name);
188
+ if (!sourceModel) {
189
+ throw new index_1.ViewerError({
190
+ id: index_1.ViewerErrorIds.ModelNotRegistered,
191
+ message: `Can't clone model "${name}" as model is not registered`,
192
+ });
193
+ }
194
+ const existingModel = this._getModel(newModelName);
195
+ if (existingModel) {
196
+ throw new index_1.ViewerError({
197
+ id: index_1.ViewerErrorIds.ModelAlreadyExists,
198
+ message: `Can't create clone as model "${newModelName}" already exists`,
199
+ });
200
+ }
201
+ if (sourceModel.state === 'notLoaded') {
202
+ yield this._loadModel(sourceModel);
203
+ }
204
+ else if (sourceModel.state === 'loading') {
205
+ yield this._loadModelPromises[sourceModel.name];
206
+ }
207
+ const clonedModel = {
208
+ name: newModelName,
209
+ url: sourceModel.url,
210
+ state: 'loaded',
211
+ assetContainer: (0, cloningHelper_1.cloneModelAssetContainer)(sourceModel.assetContainer, newModelName, {
212
+ nodeNamingStrategy: options === null || options === void 0 ? void 0 : options.nodeNamingStrategy,
213
+ tagNamingStrategy: options === null || options === void 0 ? void 0 : options.tagNamingStrategy,
214
+ }, this.viewer.scene),
215
+ isClone: true,
216
+ };
217
+ this._modelAssets[newModelName] = clonedModel;
218
+ if (show) {
219
+ yield this._showModel(clonedModel);
220
+ }
221
+ });
222
+ }
223
+ /**
224
+ * Removes a cloned model from the scene and from the internal model storage.\
225
+ * Deleted clones can not be shown again.
226
+ */
227
+ deleteClonedModel(name) {
228
+ const model = this._getModel(name);
229
+ if (!model) {
230
+ throw new index_1.ViewerError({
231
+ id: index_1.ViewerErrorIds.ModelNotRegistered,
232
+ message: `Can't delete cloned model "${name}" as model is not registered`,
233
+ });
234
+ }
235
+ if (!model.isClone) {
236
+ throw new index_1.ViewerError({
237
+ id: index_1.ViewerErrorIds.ModelIsNotAClone,
238
+ message: `Can't delete model "${name}" as model is not a clone`,
239
+ });
240
+ }
241
+ model.assetContainer.dispose();
242
+ delete this._modelAssets[name];
243
+ }
244
+ /**
245
+ * Removes all cloned models from the scene and the internal model storage.
246
+ */
247
+ deleteAllClonedModels() {
248
+ const clonedModelNames = Object.values(this._modelAssets)
249
+ .filter(model => model.isClone)
250
+ .map(model => model.name);
251
+ clonedModelNames.forEach(modelName => this.deleteClonedModel(modelName));
252
+ }
253
+ /**
254
+ * Loads and returns the asset container of a certain model.\
255
+ * This can be used to access the models content without having to add it to the scene.\
256
+ * A typical use case is to clone or instantiate a node from a "library" model.
257
+ */
258
+ getAssetContainerOfModel(name) {
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ const model = this._getModel(name);
261
+ if (!model) {
262
+ throw new index_1.ViewerError({
263
+ id: index_1.ViewerErrorIds.ModelNotRegistered,
264
+ message: `Can't get asset container of model "${name}" as model is not registered`,
265
+ });
266
+ }
267
+ if (model.state === 'notLoaded') {
268
+ yield this._loadModel(model);
269
+ }
270
+ else if (model.state === 'loading') {
271
+ yield this._loadModelPromises[model.name];
272
+ }
273
+ yield this._prepareModelForScene(model);
274
+ return model.assetContainer;
275
+ });
276
+ }
277
+ /**
278
+ * Get model by name
279
+ */
280
+ _getModel(name) {
281
+ if (name === '$fallback') {
282
+ return this._fallbackModelAsset;
283
+ }
284
+ const replacedName = ModelManager._replaceSlashes(name);
285
+ const model = this._modelAssets[replacedName];
286
+ return model;
287
+ }
288
+ /**
289
+ * Load model into scene, but don't show it immediately
290
+ */
291
+ _loadModel(model) {
292
+ return __awaiter(this, void 0, void 0, function* () {
293
+ const loadModelPromise = () => __awaiter(this, void 0, void 0, function* () {
294
+ model.state = 'loading';
295
+ const curEnvTexture = this.viewer.scene.environmentTexture;
296
+ const curEnvIntensity = this.viewer.scene.environmentIntensity;
297
+ let assetContainer;
298
+ try {
299
+ assetContainer = yield index_1.SceneLoader.LoadAssetContainerAsync('', model.url, this.viewer.scene);
300
+ }
301
+ catch (e) {
302
+ throw new index_1.ViewerError({
303
+ id: index_1.ViewerErrorIds.AssetLoadingFailed,
304
+ message: `Error loading model "${model.name}" from url "${model.url}":\n${e.message}`,
305
+ });
306
+ }
307
+ // remove all lights and cameras from the asset, as this data should be handled globally in the scene instead of
308
+ // being in a model context
309
+ [...assetContainer.lights].forEach(light => light.dispose());
310
+ [...assetContainer.cameras].forEach(camera => camera.dispose());
311
+ // environment texture and intensity has been overwritten by load asset container function
312
+ this.viewer.scene.environmentTexture = curEnvTexture;
313
+ this.viewer.scene.environmentIntensity = curEnvIntensity;
314
+ model.assetContainer = assetContainer;
315
+ model.state = 'loaded';
316
+ delete this._loadModelPromises[model.name];
317
+ });
318
+ this._loadModelPromises[model.name] = loadModelPromise();
319
+ return this._loadModelPromises[model.name];
320
+ });
321
+ }
322
+ /**
323
+ * Apply parameter to the model in the asset container.
324
+ * This is typically done before the model is added to the scene to avoid changes on the visible model, which ensures
325
+ * a smooth model switch behaviour.
326
+ */
327
+ _prepareModelForScene(model) {
328
+ return __awaiter(this, void 0, void 0, function* () {
329
+ yield this.viewer.parameterManager.applyAllParameterValuesToModel(model.assetContainer);
330
+ // parameter manager did his job, now apply the deferred materials to all meshes that are not explicitely hidden by
331
+ // the parameter manager
332
+ yield this._applyDeferredMaterialsForAllVisibleMeshes(model);
333
+ });
334
+ }
335
+ /**
336
+ * Add assets of asset container to scene, do the scene preparation if required.
337
+ * CAUTION: model is expected to be in the correct loading state already.
338
+ *
339
+ * @param skipPreparation optionally skip applying parameter values to model before showing it
340
+ * (see {@link _prepareModelForScene})
341
+ */
342
+ _showModel(model, skipPreparation) {
343
+ return __awaiter(this, void 0, void 0, function* () {
344
+ if (!skipPreparation) {
345
+ yield this._prepareModelForScene(model);
346
+ }
347
+ model.assetContainer.addToScene();
348
+ model.state = 'inScene';
349
+ });
350
+ }
351
+ /**
352
+ * Remove assets of asset container from scene
353
+ */
354
+ _hideModel(model) {
355
+ model.assetContainer.removeFromScene();
356
+ model.state = 'loaded';
357
+ }
358
+ /**
359
+ * Creates and assigns each "deferred" material to the corresponding mesh, if the mesh is visible.
360
+ * Model should be ready to use immediately after this function has done it's job.
361
+ */
362
+ _applyDeferredMaterialsForAllVisibleMeshes(model) {
363
+ return __awaiter(this, void 0, void 0, function* () {
364
+ for (const mesh of model.assetContainer.meshes) {
365
+ const deferredMaterial = (0, metadataHelper_1.getInternalMetadataValue)(mesh, 'deferredMaterial');
366
+ const rawVisibleValue = this.viewer.parameterManager.getParameterValueOfNode(mesh, index_1.BuiltInParameter.Visible);
367
+ const visible = rawVisibleValue === undefined || index_1.ParameterManager.parseBoolean(rawVisibleValue) === true;
368
+ if (deferredMaterial && visible) {
369
+ yield this.viewer.materialManager.setMaterialOnMesh(deferredMaterial, mesh);
370
+ }
371
+ }
372
+ });
373
+ }
374
+ }
375
+ exports.ModelManager = ModelManager;
376
+ /**
377
+ * CAUTION: this has to be in sync with the Combeenation backend!
378
+ * @internal
379
+ */
380
+ ModelManager.CBN_FALLBACK_MODEL_ASSET_NAME = '$fallback';
381
+ //# sourceMappingURL=modelManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelManager.js","sourceRoot":"","sources":["../../../src/manager/modelManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ import { AbstractScene, Color3, Material, TransformNode, Vector3, Viewer } from '../index';
2
+ /**
3
+ * Parameters with a built in observer implementation
4
+ */
5
+ export declare const BuiltInParameter: {
6
+ Visible: string;
7
+ Material: string;
8
+ Position: string;
9
+ Rotation: string;
10
+ Scaling: string;
11
+ Color: string;
12
+ Roughness: string;
13
+ Metallic: string;
14
+ Paintable: string;
15
+ };
16
+ export declare type ParameterName = string;
17
+ export declare type ParameterValue = string | number | boolean;
18
+ export declare type TagParameterSubject = {
19
+ tagName: string;
20
+ nodeName?: never;
21
+ materialName?: never;
22
+ };
23
+ export declare type NodeParameterSubject = {
24
+ tagName?: never;
25
+ nodeName: string;
26
+ materialName?: never;
27
+ };
28
+ export declare type MaterialParameterSubject = {
29
+ tagName?: never;
30
+ nodeName?: never;
31
+ materialName: string;
32
+ };
33
+ /**
34
+ * Defines which objects are affected by the parameter.\
35
+ * This can be single nodes and materials or tags, which can be used to apply a parameter to a group of nodes or
36
+ * materials.
37
+ */
38
+ export declare type ParameterSubject = TagParameterSubject | NodeParameterSubject | MaterialParameterSubject;
39
+ /**
40
+ * Bulk of targeted parameter values, mainly used as input for {@link ParameterManager.setParameterValues} function.\
41
+ * E.g.
42
+ * ```
43
+ * [
44
+ * { nodeName: 'someMesh', parameterName: BuiltInParameter.Visible, value: false },
45
+ * { materialName: 'someMaterial', parameterName: BuiltInParameter.Color, value: '#DD0060' }
46
+ * ]
47
+ * ```
48
+ * Each parameter value entry has to set exactly one of the subject keys (`nodeName`, `materialName` or `tagName`)
49
+ */
50
+ export declare type ParameterValues = (ParameterSubject & {
51
+ parameterName: ParameterName;
52
+ value: ParameterValue;
53
+ })[];
54
+ /**
55
+ * Definition of callback function for parameter change
56
+ */
57
+ export declare type ParameterObserver = (payload: ParameterObserverPayload) => Promise<void>;
58
+ /**
59
+ * Payload of parameter observer.\
60
+ * Contains current data of parameter entry, which can be usefull for implementing the dedicated observer
61
+ */
62
+ export declare type ParameterObserverPayload = {
63
+ subject: ParameterSubject;
64
+ nodes: TransformNode[];
65
+ materials: Material[];
66
+ newValue: ParameterValue;
67
+ oldValue: ParameterValue | undefined;
68
+ };
69
+ declare type ParameterEntry = {
70
+ subject: ParameterSubject;
71
+ parameterName: ParameterName;
72
+ value: ParameterValue;
73
+ oldValue: ParameterValue | undefined;
74
+ };
75
+ export declare class ParameterManager {
76
+ protected viewer: Viewer;
77
+ /**
78
+ * Parses and converts input to a boolean value, valid values are:
79
+ * - true / false
80
+ * - 1 / 0
81
+ */
82
+ static parseBoolean(value: ParameterValue): boolean;
83
+ /**
84
+ * Parses and converts input to a number value
85
+ */
86
+ static parseNumber(value: ParameterValue): number;
87
+ /**
88
+ * Parses and converts input to a string value
89
+ */
90
+ static parseString(value: ParameterValue): string;
91
+ /**
92
+ * Parses a string of format "(x,y,z)"" to a "Vector3".
93
+ */
94
+ static parseVector(value: ParameterValue): Vector3;
95
+ /**
96
+ * Parses a string of format `'(x,y,z)'` with angular degrees to a `Vector3` with rotation information in radians.
97
+ */
98
+ static parseRotation(value: ParameterValue): Vector3;
99
+ /**
100
+ * Parses a string of format `'#rrggbb'` or `'(r,g,b)'` to a `Color3`.
101
+ */
102
+ static parseColor(value: ParameterValue): Color3;
103
+ protected _parameterEntries: ParameterEntry[];
104
+ protected _parameterObserver: {
105
+ [parameterName: ParameterName]: ParameterObserver;
106
+ };
107
+ constructor(viewer: Viewer);
108
+ /**
109
+ * Set parameter value for a certain node and calls the corresponding observer if the value has changed
110
+ *
111
+ * @returns "true" if parameter value has changed
112
+ */
113
+ setNodeParameterValue(nodeName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
114
+ /**
115
+ * Set parameter value for a certain material and calls the corresponding observer if the value has changed
116
+ *
117
+ * @returns "true" if parameter value has changed
118
+ */
119
+ setMaterialParameterValue(materialName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
120
+ /**
121
+ * Set parameter value for a certain tag and calls the corresponding observer if the value has changed.\
122
+ * Setting a parameter value on a tag can affect multiple nodes and tags, depending which of these objects contains
123
+ * the desired tag.
124
+ *
125
+ * @returns "true" if parameter value has changed
126
+ */
127
+ setTagParameterValue(tagName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
128
+ /**
129
+ * Set multiple parameter values simultaniously.\
130
+ * Tag parameters are applied before node and material parameters, node and materials are more specific and should
131
+ * have priority.
132
+ *
133
+ * @returns Array of parameters, which have changed values
134
+ */
135
+ setParameterValues(values: ParameterValues): Promise<ParameterValues>;
136
+ /**
137
+ * @returns desired parameter value or "undefined" if parameter entry is not available.
138
+ */
139
+ getParameterValue(subject: ParameterSubject, parameterName: ParameterName): ParameterValue | undefined;
140
+ /**
141
+ * Define observer callback for certain parameter.\
142
+ * There can only be one observer for a certain parameter name.\
143
+ * Parameter observers can not be overwritten once they are defined, this also includes system observers for
144
+ * {@link BuiltInParameter}.
145
+ */
146
+ setParameterObserver(parameterName: ParameterName, observer: ParameterObserver): void;
147
+ /**
148
+ * Print all parameter entries in table format into the console
149
+ */
150
+ printAllParameters(): void;
151
+ /**
152
+ * Applies all existing parameter entries to a certain "model", as defined in the {@link ModelManager}.\
153
+ * This can be usefull when updating the model before showing it in the scene.
154
+ *
155
+ * @internal
156
+ */
157
+ applyAllParameterValuesToModel(model: AbstractScene): Promise<void>;
158
+ /**
159
+ * Applies all parameter values which are targeting a material.\
160
+ * This can be usefull when updating a material definition before creating it.
161
+ *
162
+ * @internal
163
+ */
164
+ applyParameterValuesToMaterial(material: Material): Promise<void>;
165
+ /**
166
+ * @returns Desired parameter value of a certain node.
167
+ * Tags are considered as well but have lower priority than node parameters, as these are more specific.
168
+ *
169
+ * @internal
170
+ */
171
+ getParameterValueOfNode(node: TransformNode, parameterName: string): ParameterValue | undefined;
172
+ /**
173
+ * @returns Desired parameter value of a certain material.
174
+ * Tags are considered as well but have lower priority than material parameters, as these are more specific.
175
+ * Unused ATM, but added for consistency as counter part for {@link getParameterValueOfNode}
176
+ *
177
+ * @internal
178
+ */
179
+ getParameterValueOfMaterial(material: Material, parameterName: string): ParameterValue | undefined;
180
+ /**
181
+ * Parameter observer implementation of default parameters
182
+ */
183
+ protected _addBuiltInParameterObservers(): void;
184
+ /**
185
+ * Change parameter value in array of existing parameter entries or create a new entry
186
+ *
187
+ * @returns "true" if parameter has changed or wasn't available before
188
+ */
189
+ protected _addParameterValue(subject: ParameterSubject, parameterName: ParameterName, value: ParameterValue): boolean;
190
+ /**
191
+ * Call parameter observer of desired parameter which usually apply the new values to the scene.
192
+ *
193
+ * @param assetContainer Asset container in which to look for the paramter entries subjects (e.g. the nodes and
194
+ * materials to which the parameter values should be applied to).\
195
+ * Defaults to `viewer.scene`.
196
+ */
197
+ protected _applyParameterValues(parameterEntries: ParameterEntry[], assetContainer?: AbstractScene): Promise<void>;
198
+ /**
199
+ * Call parameter observer of desired parameter
200
+ *
201
+ * @param assetContainer Optionally add an "asset container", which actually represents a model in the
202
+ * {@link ModelManager}. Viewer scene is used if left empty.
203
+ */
204
+ protected _applyParameterValue(subject: ParameterSubject, parameterName: ParameterName, assetContainer?: AbstractScene): Promise<void>;
205
+ protected _getAffectedMaterials(subject: ParameterSubject, assetContainer?: AbstractScene): Material[];
206
+ protected _getAffectedNodes(subject: ParameterSubject, assetContainer?: AbstractScene): TransformNode[];
207
+ protected _getEntry(subject: ParameterSubject, parameterName: ParameterName): ParameterEntry | undefined;
208
+ protected _getEntriesOfSubject(subject: ParameterSubject): ParameterEntry[];
209
+ }
210
+ export {};