@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.
- package/dist/lib-cjs/buildinfo.json +1 -1
- package/dist/lib-cjs/commonjs.tsconfig.tsbuildinfo +1 -1
- package/dist/lib-cjs/index.d.ts +1 -1
- package/dist/lib-cjs/index.js +1 -1
- package/dist/lib-cjs/index.js.map +1 -1
- package/dist/lib-cjs/internal/animation-helper.d.ts +2 -0
- package/dist/lib-cjs/internal/animation-helper.js +16 -0
- package/dist/lib-cjs/internal/animation-helper.js.map +1 -0
- package/dist/lib-cjs/internal/cloning-helper.js +4 -2
- package/dist/lib-cjs/internal/cloning-helper.js.map +1 -1
- package/dist/lib-cjs/internal/export-helper.js +1 -1
- package/dist/lib-cjs/internal/export-helper.js.map +1 -1
- package/dist/lib-cjs/internal/math-helper.d.ts +9 -0
- package/dist/lib-cjs/internal/math-helper.js +43 -0
- package/dist/lib-cjs/internal/math-helper.js.map +1 -0
- package/dist/lib-cjs/internal/{paintable-helper.d.ts → parameter/paintable-parameter-helper.d.ts} +3 -3
- package/dist/lib-cjs/internal/{paintable-helper.js → parameter/paintable-parameter-helper.js} +26 -26
- package/dist/lib-cjs/internal/parameter/paintable-parameter-helper.js.map +1 -0
- package/dist/lib-cjs/internal/parameter/parameter-helper.d.ts +2 -0
- package/dist/lib-cjs/internal/parameter/parameter-helper.js +214 -0
- package/dist/lib-cjs/internal/parameter/parameter-helper.js.map +1 -0
- package/dist/lib-cjs/internal/{texture-parameter-helper.d.ts → parameter/texture-parameter-helper.d.ts} +1 -2
- package/dist/lib-cjs/internal/{texture-parameter-helper.js → parameter/texture-parameter-helper.js} +15 -16
- package/dist/lib-cjs/internal/parameter/texture-parameter-helper.js.map +1 -0
- package/dist/lib-cjs/manager/camera-manager.js +2 -9
- package/dist/lib-cjs/manager/camera-manager.js.map +1 -1
- package/dist/lib-cjs/manager/debug-manager.d.ts +5 -1
- package/dist/lib-cjs/manager/debug-manager.js +21 -5
- package/dist/lib-cjs/manager/debug-manager.js.map +1 -1
- package/dist/lib-cjs/manager/model-manager.d.ts +35 -4
- package/dist/lib-cjs/manager/model-manager.js +50 -8
- package/dist/lib-cjs/manager/model-manager.js.map +1 -1
- package/dist/lib-cjs/manager/parameter-manager.d.ts +37 -20
- package/dist/lib-cjs/manager/parameter-manager.js +109 -204
- package/dist/lib-cjs/manager/parameter-manager.js.map +1 -1
- package/dist/lib-cjs/utils/viewer-utils.d.ts +35 -0
- package/dist/lib-cjs/utils/viewer-utils.js +112 -0
- package/dist/lib-cjs/utils/viewer-utils.js.map +1 -0
- package/dist/lib-cjs/viewer.d.ts +13 -1
- package/dist/lib-cjs/viewer.js +24 -0
- package/dist/lib-cjs/viewer.js.map +1 -1
- package/package.json +13 -12
- package/src/index.ts +1 -1
- package/src/internal/animation-helper.ts +18 -0
- package/src/internal/cloning-helper.ts +4 -2
- package/src/internal/export-helper.ts +1 -2
- package/src/internal/math-helper.ts +46 -0
- package/src/internal/{paintable-helper.ts → parameter/paintable-parameter-helper.ts} +35 -35
- package/src/internal/parameter/parameter-helper.ts +263 -0
- package/src/internal/{texture-parameter-helper.ts → parameter/texture-parameter-helper.ts} +13 -3
- package/src/manager/camera-manager.ts +2 -10
- package/src/manager/debug-manager.ts +35 -6
- package/src/manager/model-manager.ts +81 -13
- package/src/manager/parameter-manager.ts +138 -232
- package/src/utils/viewer-utils.ts +149 -0
- package/src/viewer.ts +29 -1
- package/dist/lib-cjs/internal/paintable-helper.js.map +0 -1
- package/dist/lib-cjs/internal/texture-parameter-helper.js.map +0 -1
- package/dist/lib-cjs/utils/node-utils.d.ts +0 -17
- package/dist/lib-cjs/utils/node-utils.js +0 -92
- package/dist/lib-cjs/utils/node-utils.js.map +0 -1
- 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
|
|
33
|
-
export declare type
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
15
|
-
const
|
|
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
|
|
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 ((
|
|
177
|
-
return { name:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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
|
-
*
|
|
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
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|