@combeenation/3d-viewer 19.1.0 → 20.0.0-alpha1

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 (62) 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 +1 -1
  4. package/dist/lib-cjs/index.js +1 -1
  5. package/dist/lib-cjs/index.js.map +1 -1
  6. package/dist/lib-cjs/internal/animation-helper.d.ts +2 -0
  7. package/dist/lib-cjs/internal/animation-helper.js +16 -0
  8. package/dist/lib-cjs/internal/animation-helper.js.map +1 -0
  9. package/dist/lib-cjs/internal/cloning-helper.js +4 -2
  10. package/dist/lib-cjs/internal/cloning-helper.js.map +1 -1
  11. package/dist/lib-cjs/internal/export-helper.js +1 -1
  12. package/dist/lib-cjs/internal/export-helper.js.map +1 -1
  13. package/dist/lib-cjs/internal/math-helper.d.ts +9 -0
  14. package/dist/lib-cjs/internal/math-helper.js +43 -0
  15. package/dist/lib-cjs/internal/math-helper.js.map +1 -0
  16. package/dist/lib-cjs/internal/{paintable-helper.d.ts → parameter/paintable-parameter-helper.d.ts} +3 -3
  17. package/dist/lib-cjs/internal/{paintable-helper.js → parameter/paintable-parameter-helper.js} +26 -26
  18. package/dist/lib-cjs/internal/parameter/paintable-parameter-helper.js.map +1 -0
  19. package/dist/lib-cjs/internal/parameter/parameter-helper.d.ts +2 -0
  20. package/dist/lib-cjs/internal/parameter/parameter-helper.js +214 -0
  21. package/dist/lib-cjs/internal/parameter/parameter-helper.js.map +1 -0
  22. package/dist/lib-cjs/internal/{texture-parameter-helper.d.ts → parameter/texture-parameter-helper.d.ts} +1 -2
  23. package/dist/lib-cjs/internal/{texture-parameter-helper.js → parameter/texture-parameter-helper.js} +15 -16
  24. package/dist/lib-cjs/internal/parameter/texture-parameter-helper.js.map +1 -0
  25. package/dist/lib-cjs/manager/camera-manager.js +2 -9
  26. package/dist/lib-cjs/manager/camera-manager.js.map +1 -1
  27. package/dist/lib-cjs/manager/debug-manager.d.ts +5 -1
  28. package/dist/lib-cjs/manager/debug-manager.js +21 -5
  29. package/dist/lib-cjs/manager/debug-manager.js.map +1 -1
  30. package/dist/lib-cjs/manager/model-manager.d.ts +35 -4
  31. package/dist/lib-cjs/manager/model-manager.js +50 -8
  32. package/dist/lib-cjs/manager/model-manager.js.map +1 -1
  33. package/dist/lib-cjs/manager/parameter-manager.d.ts +37 -20
  34. package/dist/lib-cjs/manager/parameter-manager.js +109 -204
  35. package/dist/lib-cjs/manager/parameter-manager.js.map +1 -1
  36. package/dist/lib-cjs/utils/viewer-utils.d.ts +35 -0
  37. package/dist/lib-cjs/utils/viewer-utils.js +112 -0
  38. package/dist/lib-cjs/utils/viewer-utils.js.map +1 -0
  39. package/dist/lib-cjs/viewer.d.ts +13 -1
  40. package/dist/lib-cjs/viewer.js +24 -0
  41. package/dist/lib-cjs/viewer.js.map +1 -1
  42. package/package.json +13 -12
  43. package/src/index.ts +1 -1
  44. package/src/internal/animation-helper.ts +18 -0
  45. package/src/internal/cloning-helper.ts +4 -2
  46. package/src/internal/export-helper.ts +1 -2
  47. package/src/internal/math-helper.ts +46 -0
  48. package/src/internal/{paintable-helper.ts → parameter/paintable-parameter-helper.ts} +35 -35
  49. package/src/internal/parameter/parameter-helper.ts +263 -0
  50. package/src/internal/{texture-parameter-helper.ts → parameter/texture-parameter-helper.ts} +13 -3
  51. package/src/manager/camera-manager.ts +2 -10
  52. package/src/manager/debug-manager.ts +35 -6
  53. package/src/manager/model-manager.ts +81 -13
  54. package/src/manager/parameter-manager.ts +138 -232
  55. package/src/utils/viewer-utils.ts +149 -0
  56. package/src/viewer.ts +29 -1
  57. package/dist/lib-cjs/internal/paintable-helper.js.map +0 -1
  58. package/dist/lib-cjs/internal/texture-parameter-helper.js.map +0 -1
  59. package/dist/lib-cjs/utils/node-utils.d.ts +0 -17
  60. package/dist/lib-cjs/utils/node-utils.js +0 -92
  61. package/dist/lib-cjs/utils/node-utils.js.map +0 -1
  62. package/src/utils/node-utils.ts +0 -112
@@ -1,5 +1,5 @@
1
1
  import { Color3, IAssetContainer, Material, PBRMaterial, TransformNode, Vector3, Viewer } from '../index';
2
- import { BuiltInTextureParameterKeys, ParameterTextureChannelsKeys } from '../internal/texture-parameter-helper';
2
+ import { BuiltInTextureParameterKeys, ParameterTextureChannelsKeys } from '../internal/parameter/texture-parameter-helper';
3
3
  /**
4
4
  * Parameters with a built in observer implementation
5
5
  */
@@ -25,12 +25,13 @@ export declare const BuiltInParameter: {
25
25
  export declare const LegacyParameter: {
26
26
  Paintable: string;
27
27
  };
28
+ export declare type ParameterName = string;
28
29
  export declare type MorphTargetParameterValue = {
29
30
  name: string;
30
31
  value: number;
31
32
  };
32
- export declare type ParameterName = string;
33
- export declare type ParameterValue = string | number | boolean | Vector3 | Color3 | MorphTargetParameterValue;
33
+ export declare type ParameterValue = string | number | boolean | Vector3 | Color3 | MorphTargetParameterValue[];
34
+ export declare type InputParameterValue = Exclude<ParameterValue, MorphTargetParameterValue[]> | MorphTargetParameterValue;
34
35
  export declare type TagParameterSubject = {
35
36
  tagName: string;
36
37
  nodeName?: never;
@@ -65,8 +66,12 @@ export declare type ParameterSubject = TagParameterSubject | NodeParameterSubjec
65
66
  */
66
67
  export declare type ParameterValues = (ParameterSubject & {
67
68
  parameterName: ParameterName;
68
- value: ParameterValue;
69
+ value: InputParameterValue;
70
+ options?: ParameterOptions;
69
71
  })[];
72
+ export declare type ParameterOptions = {
73
+ animationTimeMs?: number;
74
+ };
70
75
  /**
71
76
  * Definition of callback function for parameter change
72
77
  */
@@ -81,15 +86,18 @@ export declare type ParameterObserverPayload = {
81
86
  materials: Material[];
82
87
  newValue: ParameterValue;
83
88
  oldValue: ParameterValue | undefined;
89
+ options?: ParameterOptions;
84
90
  };
85
91
  declare type ParameterEntry = {
86
92
  subject: ParameterSubject;
87
93
  parameterName: ParameterName;
88
94
  value: ParameterValue;
89
95
  oldValue: ParameterValue | undefined;
96
+ options?: ParameterOptions;
90
97
  };
91
98
  export declare class ParameterManager {
92
99
  protected viewer: Viewer;
100
+ static readonly PARAMETER_ANIMATION_NAME = "$parameterAnimation";
93
101
  /**
94
102
  * Parses and converts input to a boolean value, valid values are:
95
103
  * - true / false
@@ -119,7 +127,7 @@ export declare class ParameterManager {
119
127
  * Passing a Color3 object directly is also valid.
120
128
  */
121
129
  static parseColor(value: ParameterValue): Color3;
122
- static parseMorphTarget(value: ParameterValue): MorphTargetParameterValue;
130
+ static parseMorphTargets(value: ParameterValue): MorphTargetParameterValue[];
123
131
  protected _parameterEntries: ParameterEntry[];
124
132
  protected _parameterObserver: {
125
133
  [parameterName: ParameterName]: ParameterObserver;
@@ -131,13 +139,13 @@ export declare class ParameterManager {
131
139
  *
132
140
  * @returns "true" if parameter value has changed
133
141
  */
134
- setNodeParameterValue(nodeName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
142
+ setNodeParameterValue(nodeName: string, parameterName: ParameterName, value: InputParameterValue, options?: ParameterOptions): Promise<boolean>;
135
143
  /**
136
144
  * Set parameter value for a certain material and calls the corresponding observer if the value has changed
137
145
  *
138
146
  * @returns "true" if parameter value has changed
139
147
  */
140
- setMaterialParameterValue(materialName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
148
+ setMaterialParameterValue(materialName: string, parameterName: ParameterName, value: InputParameterValue, options?: ParameterOptions): Promise<boolean>;
141
149
  /**
142
150
  * Set parameter value for a certain tag and calls the corresponding observer if the value has changed.\
143
151
  * Setting a parameter value on a tag can affect multiple nodes and tags, depending which of these objects contains
@@ -145,7 +153,7 @@ export declare class ParameterManager {
145
153
  *
146
154
  * @returns "true" if parameter value has changed
147
155
  */
148
- setTagParameterValue(tagName: string, parameterName: ParameterName, value: ParameterValue): Promise<boolean>;
156
+ setTagParameterValue(tagName: string, parameterName: ParameterName, value: InputParameterValue, options?: ParameterOptions): Promise<boolean>;
149
157
  /**
150
158
  * Set multiple parameter values simultaniously.\
151
159
  * Tag parameters are applied before node and material parameters, node and materials are more specific and should
@@ -190,6 +198,21 @@ export declare class ParameterManager {
190
198
  * @internal
191
199
  */
192
200
  applyTextureSettingsParameter(material: PBRMaterial, channel: ParameterTextureChannelsKeys): Promise<void>;
201
+ /**
202
+ * @returns Desired parameter value of a certain node.\
203
+ * Tags are considered as well but have lower priority than node parameters, as these are more specific.
204
+ *
205
+ * @internal
206
+ */
207
+ getParameterValueOfNode(node: TransformNode, parameterName: string): ParameterValue | undefined;
208
+ /**
209
+ * @returns Desired parameter value of a certain material.\
210
+ * Tags are considered as well but have lower priority than material parameters, as these are more specific.\
211
+ * Unused ATM, but added for consistency as counter part for {@link _getParameterValueOfNode}
212
+ *
213
+ * @internal
214
+ */
215
+ getParameterValueOfMaterial(material: Material, parameterName: string): ParameterValue | undefined;
193
216
  /**
194
217
  * Retrieves visibility state of node, considering pending parameter values and node hierarchy.\
195
218
  * `node.isEnabled()` alone is insufficient here, as visibility observers for the desired node or one of it's parents
@@ -198,6 +221,11 @@ export declare class ParameterManager {
198
221
  * @internal
199
222
  */
200
223
  getNestedVisibilityParameterValueOfNode(node: TransformNode): boolean;
224
+ /**
225
+ * Converts the input parameter value type to the actual internally used parameter type.\
226
+ * ATM this is required for making morph target parameters of a specific node mergeable.
227
+ */
228
+ protected _prepareInputValue(inputValue: InputParameterValue): ParameterValue;
201
229
  /**
202
230
  * Parameter observer implementation of default parameters
203
231
  */
@@ -207,7 +235,7 @@ export declare class ParameterManager {
207
235
  *
208
236
  * @returns "true" if parameter has changed or wasn't available before
209
237
  */
210
- protected _addParameterValue(subject: ParameterSubject, parameterName: ParameterName, value: ParameterValue): boolean;
238
+ protected _addParameterValue(subject: ParameterSubject, parameterName: ParameterName, value: ParameterValue, options?: ParameterOptions): boolean;
211
239
  /**
212
240
  * Call parameter observer of desired parameter which usually apply the new values to the scene.
213
241
  *
@@ -227,16 +255,5 @@ export declare class ParameterManager {
227
255
  protected _getAffectedNodes(subject: ParameterSubject, assetContainer?: IAssetContainer): TransformNode[];
228
256
  protected _getEntry(subject: ParameterSubject, parameterName: ParameterName): ParameterEntry | undefined;
229
257
  protected _getEntriesOfSubject(subject: ParameterSubject): ParameterEntry[];
230
- /**
231
- * @returns Desired parameter value of a certain node.\
232
- * Tags are considered as well but have lower priority than node parameters, as these are more specific.
233
- */
234
- protected _getParameterValueOfNode(node: TransformNode, parameterName: string): ParameterValue | undefined;
235
- /**
236
- * @returns Desired parameter value of a certain material.\
237
- * Tags are considered as well but have lower priority than material parameters, as these are more specific.\
238
- * Unused ATM, but added for consistency as counter part for {@link _getParameterValueOfNode}
239
- */
240
- protected _getParameterValueOfMaterial(material: Material, parameterName: string): ParameterValue | undefined;
241
258
  }
242
259
  export {};
@@ -11,10 +11,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.ParameterManager = exports.LegacyParameter = exports.BuiltInParameter = void 0;
13
13
  const index_1 = require("../index");
14
- const metadata_helper_1 = require("../internal/metadata-helper");
15
- const paintable_helper_1 = require("../internal/paintable-helper");
14
+ const paintable_parameter_helper_1 = require("../internal/parameter/paintable-parameter-helper");
15
+ const parameter_helper_1 = require("../internal/parameter/parameter-helper");
16
+ const texture_parameter_helper_1 = require("../internal/parameter/texture-parameter-helper");
16
17
  const tags_helper_1 = require("../internal/tags-helper");
17
- const texture_parameter_helper_1 = require("../internal/texture-parameter-helper");
18
18
  const lodash_es_1 = require("lodash-es");
19
19
  /**
20
20
  * Parameters with a built in observer implementation
@@ -41,6 +41,8 @@ exports.BuiltInParameter = {
41
41
  exports.LegacyParameter = {
42
42
  Paintable: 'paintable',
43
43
  };
44
+ const isMorphTargetParameterValue = (value) => (0, lodash_es_1.isObject)(value) && 'name' in value && (0, lodash_es_1.isString)(value.name) && 'value' in value && (0, lodash_es_1.isNumber)(value.value);
45
+ const isMorphTargetsParameterValue = (value) => (0, lodash_es_1.isArray)(value) && value.every(mT => isMorphTargetParameterValue(mT));
44
46
  const isTagParameterSubject = (subject) => 'tagName' in subject && !!subject.tagName;
45
47
  const isNodeParameterSubject = (subject) => 'nodeName' in subject && !!subject.nodeName;
46
48
  const isMaterialParameterSubject = (subject) => 'materialName' in subject && !!subject.materialName;
@@ -157,7 +159,7 @@ class ParameterManager {
157
159
  message: `Unable to parse "${value}" to a color: expected "#rrggbb", "(r,g,b)" or any human readable (e.g. Red) property implemented in Color3`,
158
160
  });
159
161
  }
160
- static parseMorphTarget(value) {
162
+ static parseMorphTargets(value) {
161
163
  let objValue;
162
164
  if ((0, lodash_es_1.isString)(value)) {
163
165
  try {
@@ -173,8 +175,8 @@ class ParameterManager {
173
175
  else {
174
176
  objValue = value;
175
177
  }
176
- if ((0, lodash_es_1.isString)(objValue.name) && (0, lodash_es_1.isNumber)(objValue.value)) {
177
- return { name: objValue.name, value: objValue.value };
178
+ if (isMorphTargetsParameterValue(objValue)) {
179
+ return objValue.map(mT => ({ name: mT.name, value: mT.value }));
178
180
  }
179
181
  else {
180
182
  throw new index_1.ViewerError({
@@ -188,9 +190,10 @@ class ParameterManager {
188
190
  *
189
191
  * @returns "true" if parameter value has changed
190
192
  */
191
- setNodeParameterValue(nodeName, parameterName, value) {
193
+ setNodeParameterValue(nodeName, parameterName, value, options) {
192
194
  return __awaiter(this, void 0, void 0, function* () {
193
- const valueChanged = this._addParameterValue({ nodeName }, parameterName, value);
195
+ const internalValue = this._prepareInputValue(value);
196
+ const valueChanged = this._addParameterValue({ nodeName }, parameterName, internalValue, options);
194
197
  if (valueChanged) {
195
198
  yield this._applyParameterValue({ nodeName }, parameterName);
196
199
  }
@@ -202,9 +205,10 @@ class ParameterManager {
202
205
  *
203
206
  * @returns "true" if parameter value has changed
204
207
  */
205
- setMaterialParameterValue(materialName, parameterName, value) {
208
+ setMaterialParameterValue(materialName, parameterName, value, options) {
206
209
  return __awaiter(this, void 0, void 0, function* () {
207
- const valueChanged = this._addParameterValue({ materialName }, parameterName, value);
210
+ const internalValue = this._prepareInputValue(value);
211
+ const valueChanged = this._addParameterValue({ materialName }, parameterName, internalValue, options);
208
212
  if (valueChanged) {
209
213
  yield this._applyParameterValue({ materialName }, parameterName);
210
214
  }
@@ -218,9 +222,10 @@ class ParameterManager {
218
222
  *
219
223
  * @returns "true" if parameter value has changed
220
224
  */
221
- setTagParameterValue(tagName, parameterName, value) {
225
+ setTagParameterValue(tagName, parameterName, value, options) {
222
226
  return __awaiter(this, void 0, void 0, function* () {
223
- const valueChanged = this._addParameterValue({ tagName }, parameterName, value);
227
+ const internalValue = this._prepareInputValue(value);
228
+ const valueChanged = this._addParameterValue({ tagName }, parameterName, internalValue, options);
224
229
  if (valueChanged) {
225
230
  yield this._applyParameterValue({ tagName }, parameterName);
226
231
  }
@@ -242,13 +247,24 @@ class ParameterManager {
242
247
  : isMaterialParameterSubject(valueEntry)
243
248
  ? { materialName: valueEntry.materialName }
244
249
  : { tagName: valueEntry.tagName };
245
- return { subject, parameterName: valueEntry.parameterName, value: valueEntry.value, oldValue: undefined };
250
+ const value = this._prepareInputValue(valueEntry.value);
251
+ return {
252
+ subject,
253
+ parameterName: valueEntry.parameterName,
254
+ value,
255
+ oldValue: undefined,
256
+ options: valueEntry.options,
257
+ };
246
258
  });
247
- const changedParameterEntries = parameterEntries.filter(paramEntry => this._addParameterValue(paramEntry.subject, paramEntry.parameterName, paramEntry.value));
259
+ const changedParameterEntries = parameterEntries.filter(({ subject, parameterName, value, options }) => this._addParameterValue(subject, parameterName, value, options));
248
260
  yield this._applyParameterValues(changedParameterEntries);
249
261
  // convert back to original typing
250
262
  const changedParameterValues = changedParameterEntries.map(paramEntry => {
251
- return Object.assign(Object.assign({}, paramEntry.subject), { parameterName: paramEntry.parameterName, value: paramEntry.value });
263
+ const value = isMorphTargetsParameterValue(paramEntry.value)
264
+ ? // we can be sure that only one morph target was given on the input
265
+ paramEntry.value[0]
266
+ : paramEntry.value;
267
+ return Object.assign(Object.assign({}, paramEntry.subject), { parameterName: paramEntry.parameterName, value });
252
268
  });
253
269
  return changedParameterValues;
254
270
  });
@@ -340,6 +356,46 @@ class ParameterManager {
340
356
  yield this._applyParameterValues(textureParameterEntriesToApply);
341
357
  });
342
358
  }
359
+ /**
360
+ * @returns Desired parameter value of a certain node.\
361
+ * Tags are considered as well but have lower priority than node parameters, as these are more specific.
362
+ *
363
+ * @internal
364
+ */
365
+ getParameterValueOfNode(node, parameterName) {
366
+ const nodeParamValue = this.getParameterValue({ nodeName: node.name }, parameterName);
367
+ if (nodeParamValue !== undefined) {
368
+ return nodeParamValue;
369
+ }
370
+ const tags = (0, tags_helper_1.getTagsAsStrArr)(node);
371
+ const tagParamValue = tags.reduce((accValue, curTag) => {
372
+ // NOTE: it is possible that values are available for multiple tags
373
+ // in this case the resulting parameter value is quite "random" as the last tag in the tag string of the node has
374
+ // priority
375
+ const tagParamValue = this.getParameterValue({ tagName: curTag }, parameterName);
376
+ return accValue !== null && accValue !== void 0 ? accValue : tagParamValue;
377
+ }, undefined);
378
+ return tagParamValue;
379
+ }
380
+ /**
381
+ * @returns Desired parameter value of a certain material.\
382
+ * Tags are considered as well but have lower priority than material parameters, as these are more specific.\
383
+ * Unused ATM, but added for consistency as counter part for {@link _getParameterValueOfNode}
384
+ *
385
+ * @internal
386
+ */
387
+ getParameterValueOfMaterial(material, parameterName) {
388
+ const materialParamValue = this.getParameterValue({ materialName: material.name }, parameterName);
389
+ if (materialParamValue !== undefined) {
390
+ return materialParamValue;
391
+ }
392
+ const tags = (0, tags_helper_1.getTagsAsStrArr)(material);
393
+ const tagParamValue = tags.reduce((accValue, curTag) => {
394
+ const tagParamValue = this.getParameterValue({ tagName: curTag }, parameterName);
395
+ return accValue !== null && accValue !== void 0 ? accValue : tagParamValue;
396
+ }, undefined);
397
+ return tagParamValue;
398
+ }
343
399
  /**
344
400
  * Retrieves visibility state of node, considering pending parameter values and node hierarchy.\
345
401
  * `node.isEnabled()` alone is insufficient here, as visibility observers for the desired node or one of it's parents
@@ -351,7 +407,7 @@ class ParameterManager {
351
407
  let curNode = node;
352
408
  let visibleByParameter = undefined;
353
409
  while (curNode && visibleByParameter !== false) {
354
- const curNodeVisibleByParameter = this._getParameterValueOfNode(curNode, exports.BuiltInParameter.Visible);
410
+ const curNodeVisibleByParameter = this.getParameterValueOfNode(curNode, exports.BuiltInParameter.Visible);
355
411
  if (curNodeVisibleByParameter !== undefined) {
356
412
  visibleByParameter = curNodeVisibleByParameter;
357
413
  }
@@ -362,175 +418,58 @@ class ParameterManager {
362
418
  return visible;
363
419
  }
364
420
  /**
365
- * Parameter observer implementation of default parameters
421
+ * Converts the input parameter value type to the actual internally used parameter type.\
422
+ * ATM this is required for making morph target parameters of a specific node mergeable.
366
423
  */
367
- _addBuiltInParameterObservers() {
368
- this.setParameterObserver(exports.BuiltInParameter.Visible, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
369
- const visible = ParameterManager.parseBoolean(newValue);
370
- const observerProms = nodes.map((node) => __awaiter(this, void 0, void 0, function* () {
371
- const visibleNested = this.getNestedVisibilityParameterValueOfNode(node);
372
- if (visibleNested) {
373
- // if a mesh gets visible by this operation we have to activate the assigned material which is stored in the
374
- // internal metadata
375
- // => consider child meshes as well (CB-10143)
376
- const activatedNodes = [node, ...node.getChildMeshes(false)];
377
- const setMaterialProms = activatedNodes.map((an) => __awaiter(this, void 0, void 0, function* () {
378
- const anVisibleNested = this.getNestedVisibilityParameterValueOfNode(an);
379
- const anDeferredMaterial = (0, metadata_helper_1.getInternalMetadataValue)(an, 'deferredMaterial');
380
- const anMaterialParamValue = this._getParameterValueOfNode(an, exports.BuiltInParameter.Material);
381
- // get latest requested material, either from (new) parameter value or from deferred material
382
- const anRequestedMaterial = anMaterialParamValue !== null && anMaterialParamValue !== void 0 ? anMaterialParamValue : anDeferredMaterial;
383
- // material observer might have been executed before visibility observer
384
- // => skip the material application in this case, as if it would be done twice
385
- const anMaterialToBeSet = (0, metadata_helper_1.getInternalMetadataValue)(an, 'materialToBeSet');
386
- if (anVisibleNested && anRequestedMaterial && !anMaterialToBeSet) {
387
- yield this.viewer.materialManager.setMaterialOnMesh(anRequestedMaterial,
388
- // this cast is fine, as deferred material can only be set on meshes
389
- an);
390
- }
391
- }));
392
- yield Promise.all(setMaterialProms);
393
- }
394
- // set enabled state anyway
395
- node.setEnabled(visible);
396
- }));
397
- yield Promise.all(observerProms);
398
- }));
399
- this.setParameterObserver(exports.BuiltInParameter.Material, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
400
- const material = ParameterManager.parseString(newValue);
401
- const observerProms = nodes.map((node) => __awaiter(this, void 0, void 0, function* () {
402
- if (!(node instanceof index_1.AbstractMesh)) {
403
- throw new index_1.ViewerError({
404
- id: index_1.ViewerErrorIds.InvalidParameterSubject,
405
- message: `Material can't be set, as the target node "${node.name}" is not a mesh`,
406
- });
407
- }
408
- // only set material if the mesh is visible, or gets visible by the parameter update
409
- const visible = this.getNestedVisibilityParameterValueOfNode(node);
410
- if (visible) {
411
- // visibility observer might have been executed before material observer
412
- // => skip the material application in this case, as if it would be done twice
413
- const anMaterialToBeSet = (0, metadata_helper_1.getInternalMetadataValue)(node, 'materialToBeSet');
414
- if (!anMaterialToBeSet) {
415
- yield this.viewer.materialManager.setMaterialOnMesh(material, node);
416
- }
417
- }
418
- else {
419
- (0, metadata_helper_1.setInternalMetadataValue)(node, 'deferredMaterial', material);
420
- }
421
- }));
422
- yield Promise.all(observerProms);
423
- }));
424
- this.setParameterObserver(exports.BuiltInParameter.Position, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
425
- const position = ParameterManager.parseVector(newValue);
426
- for (const node of nodes) {
427
- node.position = position;
428
- }
429
- }));
430
- this.setParameterObserver(exports.BuiltInParameter.Rotation, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
431
- const rotation = ParameterManager.parseRotation(newValue);
432
- for (const node of nodes) {
433
- node.rotation = rotation;
434
- }
435
- }));
436
- this.setParameterObserver(exports.BuiltInParameter.Scaling, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
437
- const scaling = ParameterManager.parseVector(newValue);
438
- for (const node of nodes) {
439
- node.scaling = scaling;
440
- }
441
- }));
442
- this.setParameterObserver(exports.BuiltInParameter.Color, ({ materials, newValue }) => __awaiter(this, void 0, void 0, function* () {
443
- const color = ParameterManager.parseColor(newValue);
444
- for (const material of materials) {
445
- const materialCls = material.getClassName();
446
- switch (materialCls) {
447
- case 'PBRMaterial':
448
- material.albedoColor = color.toLinearSpace();
449
- break;
450
- case 'StandardMaterial':
451
- material.diffuseColor = color;
452
- break;
453
- default:
454
- throw new index_1.ViewerError({
455
- id: index_1.ViewerErrorIds.InvalidParameterSubject,
456
- message: `Setting color for material of instance "${materialCls}" not implemented`,
457
- });
458
- }
459
- }
460
- }));
461
- this.setParameterObserver(exports.BuiltInParameter.Roughness, ({ materials, newValue }) => __awaiter(this, void 0, void 0, function* () {
462
- const roughness = ParameterManager.parseNumber(newValue);
463
- for (const material of materials) {
464
- const materialCls = material.getClassName();
465
- switch (materialCls) {
466
- case 'PBRMaterial':
467
- material.roughness = roughness;
468
- break;
469
- case 'StandardMaterial':
470
- material.roughness = roughness;
471
- break;
472
- default:
473
- throw new index_1.ViewerError({
474
- id: index_1.ViewerErrorIds.InvalidParameterSubject,
475
- message: `Setting rougness for material of instance "${materialCls}" not implemented`,
476
- });
477
- }
478
- }
479
- }));
480
- this.setParameterObserver(exports.BuiltInParameter.Metallic, ({ materials, newValue }) => __awaiter(this, void 0, void 0, function* () {
481
- const metallic = ParameterManager.parseNumber(newValue);
482
- for (const material of materials) {
483
- const materialCls = material.getClassName();
484
- switch (materialCls) {
485
- case 'PBRMaterial':
486
- material.metallic = metallic;
487
- break;
488
- default:
489
- throw new index_1.ViewerError({
490
- id: index_1.ViewerErrorIds.InvalidParameterSubject,
491
- message: `Setting metallic for material of instance "${materialCls}" not implemented`,
492
- });
493
- }
494
- }
495
- }));
496
- this.setParameterObserver(exports.BuiltInParameter.Influence, ({ nodes, newValue }) => __awaiter(this, void 0, void 0, function* () {
497
- var _a;
498
- const morphTargetValue = ParameterManager.parseMorphTarget(newValue);
499
- for (const node of nodes) {
500
- const target = node instanceof index_1.AbstractMesh && ((_a = node.morphTargetManager) === null || _a === void 0 ? void 0 : _a.getTargetByName(morphTargetValue.name));
501
- if (target) {
502
- target.influence = morphTargetValue.value;
503
- }
504
- else {
505
- throw new index_1.ViewerError({
506
- id: index_1.ViewerErrorIds.InvalidParameterSubject,
507
- message: `Morph target couldn't be found, node: ${node.name} / morph target: ${morphTargetValue.name}`,
508
- });
424
+ _prepareInputValue(inputValue) {
425
+ if (isMorphTargetParameterValue(inputValue)) {
426
+ return [inputValue];
427
+ }
428
+ else if ((0, lodash_es_1.isString)(inputValue)) {
429
+ try {
430
+ const objValue = JSON.parse(inputValue);
431
+ if (isMorphTargetParameterValue(objValue)) {
432
+ return [objValue];
509
433
  }
510
434
  }
511
- }));
512
- this.setParameterObserver(exports.LegacyParameter.Paintable, ({ newValue, materials }) => __awaiter(this, void 0, void 0, function* () {
513
- (0, paintable_helper_1.paintableParameterObserver)(newValue, materials, this.viewer.scene);
514
- }));
515
- // texture parameter use a more generic approach (`channel`.`parameter`) and are therefore coded in a dedicated file
435
+ catch (e) { }
436
+ }
437
+ return inputValue;
438
+ }
439
+ /**
440
+ * Parameter observer implementation of default parameters
441
+ */
442
+ _addBuiltInParameterObservers() {
443
+ (0, parameter_helper_1.createBuiltInParameter)(this, this.viewer.materialManager);
516
444
  (0, texture_parameter_helper_1.createBuiltInTextureParameter)(this, this.viewer.scene);
445
+ (0, paintable_parameter_helper_1.createPaintableParameter)(this, this.viewer.scene);
517
446
  }
518
447
  /**
519
448
  * Change parameter value in array of existing parameter entries or create a new entry
520
449
  *
521
450
  * @returns "true" if parameter has changed or wasn't available before
522
451
  */
523
- _addParameterValue(subject, parameterName, value) {
452
+ _addParameterValue(subject, parameterName, value, options) {
524
453
  const existingEntry = this._getEntry(subject, parameterName);
525
- if ((existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.value) === value) {
454
+ let mergedValue = value;
455
+ if (existingEntry && isMorphTargetsParameterValue(existingEntry.value) && isMorphTargetsParameterValue(value)) {
456
+ // morph target values have to be merged instead of completely replaced
457
+ const map = new Map(existingEntry.value.map(e => [e.name, e]));
458
+ for (const item of value) {
459
+ map.set(item.name, item);
460
+ }
461
+ mergedValue = Array.from(map.values());
462
+ }
463
+ if (JSON.stringify(existingEntry === null || existingEntry === void 0 ? void 0 : existingEntry.value) === JSON.stringify(mergedValue)) {
526
464
  return false;
527
465
  }
528
466
  if (existingEntry) {
529
467
  existingEntry.oldValue = existingEntry.value;
530
- existingEntry.value = value;
468
+ existingEntry.value = mergedValue;
469
+ existingEntry.options = options;
531
470
  }
532
471
  else {
533
- this._parameterEntries.push({ subject, parameterName, value, oldValue: undefined });
472
+ this._parameterEntries.push({ subject, parameterName, value: mergedValue, oldValue: undefined, options });
534
473
  }
535
474
  return true;
536
475
  }
@@ -572,6 +511,7 @@ class ParameterManager {
572
511
  oldValue: parameterEntry.oldValue,
573
512
  nodes,
574
513
  materials,
514
+ options: parameterEntry.options,
575
515
  });
576
516
  });
577
517
  }
@@ -626,42 +566,7 @@ class ParameterManager {
626
566
  });
627
567
  return entries;
628
568
  }
629
- /**
630
- * @returns Desired parameter value of a certain node.\
631
- * Tags are considered as well but have lower priority than node parameters, as these are more specific.
632
- */
633
- _getParameterValueOfNode(node, parameterName) {
634
- const nodeParamValue = this.getParameterValue({ nodeName: node.name }, parameterName);
635
- if (nodeParamValue !== undefined) {
636
- return nodeParamValue;
637
- }
638
- const tags = (0, tags_helper_1.getTagsAsStrArr)(node);
639
- const tagParamValue = tags.reduce((accValue, curTag) => {
640
- // NOTE: it is possible that values are available for multiple tags
641
- // in this case the resulting parameter value is quite "random" as the last tag in the tag string of the node has
642
- // priority
643
- const tagParamValue = this.getParameterValue({ tagName: curTag }, parameterName);
644
- return accValue !== null && accValue !== void 0 ? accValue : tagParamValue;
645
- }, undefined);
646
- return tagParamValue;
647
- }
648
- /**
649
- * @returns Desired parameter value of a certain material.\
650
- * Tags are considered as well but have lower priority than material parameters, as these are more specific.\
651
- * Unused ATM, but added for consistency as counter part for {@link _getParameterValueOfNode}
652
- */
653
- _getParameterValueOfMaterial(material, parameterName) {
654
- const materialParamValue = this.getParameterValue({ materialName: material.name }, parameterName);
655
- if (materialParamValue !== undefined) {
656
- return materialParamValue;
657
- }
658
- const tags = (0, tags_helper_1.getTagsAsStrArr)(material);
659
- const tagParamValue = tags.reduce((accValue, curTag) => {
660
- const tagParamValue = this.getParameterValue({ tagName: curTag }, parameterName);
661
- return accValue !== null && accValue !== void 0 ? accValue : tagParamValue;
662
- }, undefined);
663
- return tagParamValue;
664
- }
665
569
  }
666
570
  exports.ParameterManager = ParameterManager;
571
+ ParameterManager.PARAMETER_ANIMATION_NAME = '$parameterAnimation';
667
572
  //# sourceMappingURL=parameter-manager.js.map