@combeenation/3d-viewer 5.0.1 → 5.0.3-beta2

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 (109) hide show
  1. package/README.md +111 -114
  2. package/dist/lib-cjs/api/classes/animationInterface.d.ts +8 -8
  3. package/dist/lib-cjs/api/classes/animationInterface.js +1 -1
  4. package/dist/lib-cjs/api/classes/dottedPath.d.ts +79 -79
  5. package/dist/lib-cjs/api/classes/dottedPath.js +187 -187
  6. package/dist/lib-cjs/api/classes/element.d.ts +139 -139
  7. package/dist/lib-cjs/api/classes/element.js +794 -794
  8. package/dist/lib-cjs/api/classes/element.js.map +1 -1
  9. package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -0
  10. package/dist/lib-cjs/api/classes/elementParameterizable.js +135 -0
  11. package/dist/lib-cjs/api/classes/elementParameterizable.js.map +1 -0
  12. package/dist/lib-cjs/api/classes/event.d.ts +326 -326
  13. package/dist/lib-cjs/api/classes/event.js +371 -371
  14. package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +26 -26
  15. package/dist/lib-cjs/api/classes/eventBroadcaster.js +53 -53
  16. package/dist/lib-cjs/api/classes/parameter.d.ts +316 -259
  17. package/dist/lib-cjs/api/classes/parameter.js +451 -388
  18. package/dist/lib-cjs/api/classes/parameter.js.map +1 -1
  19. package/dist/lib-cjs/api/classes/parameterObservable.d.ts +36 -36
  20. package/dist/lib-cjs/api/classes/parameterObservable.js +101 -101
  21. package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
  22. package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
  23. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +44 -44
  24. package/dist/lib-cjs/api/classes/placementAnimation.js +163 -163
  25. package/dist/lib-cjs/api/classes/variant.d.ts +234 -234
  26. package/dist/lib-cjs/api/classes/variant.js +1154 -1154
  27. package/dist/lib-cjs/api/classes/variantInstance.d.ts +45 -45
  28. package/dist/lib-cjs/api/classes/variantInstance.js +108 -108
  29. package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +17 -17
  30. package/dist/lib-cjs/api/classes/variantParameterizable.js +99 -99
  31. package/dist/lib-cjs/api/classes/viewer.d.ts +177 -175
  32. package/dist/lib-cjs/api/classes/viewer.js +717 -701
  33. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  34. package/dist/lib-cjs/api/classes/viewerLight.d.ts +66 -66
  35. package/dist/lib-cjs/api/classes/viewerLight.js +392 -392
  36. package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
  37. package/dist/lib-cjs/api/internal/debugViewer.js +86 -86
  38. package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
  39. package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
  40. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +13 -10
  41. package/dist/lib-cjs/api/internal/sceneSetup.js +238 -234
  42. package/dist/lib-cjs/api/internal/sceneSetup.js.map +1 -1
  43. package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
  44. package/dist/lib-cjs/api/manager/animationManager.js +130 -130
  45. package/dist/lib-cjs/api/manager/gltfExportManager.d.ts +65 -65
  46. package/dist/lib-cjs/api/manager/gltfExportManager.js +223 -222
  47. package/dist/lib-cjs/api/manager/gltfExportManager.js.map +1 -1
  48. package/dist/lib-cjs/api/manager/sceneManager.d.ts +31 -32
  49. package/dist/lib-cjs/api/manager/sceneManager.js +153 -132
  50. package/dist/lib-cjs/api/manager/sceneManager.js.map +1 -1
  51. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +92 -92
  52. package/dist/lib-cjs/api/manager/variantInstanceManager.js +335 -335
  53. package/dist/lib-cjs/api/store/specStorage.d.ts +24 -24
  54. package/dist/lib-cjs/api/store/specStorage.js +51 -51
  55. package/dist/lib-cjs/api/util/babylonHelper.d.ts +174 -166
  56. package/dist/lib-cjs/api/util/babylonHelper.js +575 -497
  57. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  58. package/dist/lib-cjs/api/util/globalTypes.d.ts +366 -356
  59. package/dist/lib-cjs/api/util/globalTypes.js +1 -1
  60. package/dist/lib-cjs/api/util/resourceHelper.d.ts +58 -53
  61. package/dist/lib-cjs/api/util/resourceHelper.js +257 -242
  62. package/dist/lib-cjs/api/util/resourceHelper.js.map +1 -1
  63. package/dist/lib-cjs/api/util/stringHelper.d.ts +9 -9
  64. package/dist/lib-cjs/api/util/stringHelper.js +25 -25
  65. package/dist/lib-cjs/api/util/structureHelper.d.ts +9 -9
  66. package/dist/lib-cjs/api/util/structureHelper.js +48 -44
  67. package/dist/lib-cjs/api/util/structureHelper.js.map +1 -1
  68. package/dist/lib-cjs/buildinfo.json +3 -3
  69. package/dist/lib-cjs/index.d.ts +49 -49
  70. package/dist/lib-cjs/index.js +89 -89
  71. package/dist/webpack-stats.json +0 -0
  72. package/package.json +87 -87
  73. package/src/api/classes/animationInterface.ts +10 -10
  74. package/src/api/classes/dottedPath.ts +181 -181
  75. package/src/api/classes/element.ts +690 -692
  76. package/src/api/classes/event.ts +367 -367
  77. package/src/api/classes/eventBroadcaster.ts +52 -52
  78. package/src/api/classes/parameter.ts +474 -405
  79. package/src/api/classes/parameterObservable.ts +100 -100
  80. package/src/api/classes/parameterizable.ts +87 -87
  81. package/src/api/classes/placementAnimation.ts +160 -160
  82. package/src/api/classes/variant.ts +845 -845
  83. package/src/api/classes/variantInstance.ts +97 -97
  84. package/src/api/classes/variantParameterizable.ts +85 -85
  85. package/src/api/classes/viewer.ts +650 -624
  86. package/src/api/classes/viewerLight.ts +334 -334
  87. package/src/api/internal/debugViewer.ts +90 -90
  88. package/src/api/internal/lensRendering.ts +10 -10
  89. package/src/api/internal/sceneSetup.ts +204 -201
  90. package/src/api/manager/animationManager.ts +142 -142
  91. package/src/api/manager/gltfExportManager.ts +191 -191
  92. package/src/api/manager/sceneManager.ts +128 -102
  93. package/src/api/manager/variantInstanceManager.ts +265 -265
  94. package/src/api/store/specStorage.ts +51 -51
  95. package/src/api/util/babylonHelper.ts +628 -538
  96. package/src/api/util/globalTypes.ts +413 -402
  97. package/src/api/util/resourceHelper.ts +189 -173
  98. package/src/api/util/stringHelper.ts +23 -23
  99. package/src/api/util/structureHelper.ts +49 -43
  100. package/src/buildinfo.json +3 -3
  101. package/src/commonjs.tsconfig.json +10 -10
  102. package/src/declaration.tsconfig.json +8 -8
  103. package/src/dev.ts +42 -42
  104. package/src/es6.tsconfig.json +10 -10
  105. package/src/index.ts +94 -94
  106. package/src/pagesconfig.json +77 -73
  107. package/src/tsconfig.json +32 -32
  108. package/src/tsconfig.types.json +9 -9
  109. package/src/types.d.ts +3 -3
@@ -1,498 +1,576 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getClientRectFromMesh = exports.removeFromShadowGenerator = exports.addToShadowGenerator = exports.setReceiveShadows = exports.removeFromHighlightLayer = exports.addToHighlightLayer = exports.setMaterialRoughness = exports.setMaterialMetallness = exports.setMaterialTexture = exports.setMaterialColor = exports.setSourceNodeMaterial = exports.setMaterial = exports.transformTransformNode = exports.disableNodeWithParents = exports.enableNodeWithParents = exports.deactivateTransformNode = exports.activateTransformNode = exports.assertTransformNode = exports.injectNodeMetadata = exports.cloneTransformNodeMaterial = exports.cloneNodeWithParents = exports.cloneTransformNode = exports.getDottedPathForNode = exports.mapToDottedNodes = exports.getRootNode = void 0;
4
- var tslib_1 = require("tslib");
5
- var light_1 = require("@babylonjs/core/Lights/light");
6
- var math_axis_1 = require("@babylonjs/core/Maths/math.axis");
7
- var math_vector_1 = require("@babylonjs/core/Maths/math.vector");
8
- var abstractMesh_1 = require("@babylonjs/core/Meshes/abstractMesh");
9
- var instancedMesh_1 = require("@babylonjs/core/Meshes/instancedMesh");
10
- var transformNode_1 = require("@babylonjs/core/Meshes/transformNode");
11
- var lodash_es_1 = require("lodash-es");
12
- var dottedPath_1 = require("../classes/dottedPath");
13
- /**
14
- * @param node
15
- * @return Node
16
- */
17
- var getRootNode = function (node) {
18
- var _node = node;
19
- while (_node.parent) {
20
- _node = _node.parent;
21
- }
22
- return _node;
23
- };
24
- exports.getRootNode = getRootNode;
25
- /**
26
- * @param nodes
27
- * @param predicate
28
- * @return Map<DottedPath, T>
29
- */
30
- var mapToDottedNodes = function (nodes, predicate) {
31
- var map = new Map();
32
- var addNodes = function (_node) {
33
- if (predicate && predicate(_node)) {
34
- map.set(_node.metadata.dottedPath, _node);
35
- }
36
- _node.getChildren().forEach(function (child) {
37
- addNodes(child);
38
- });
39
- };
40
- nodes.forEach(function (node) {
41
- addNodes(node);
42
- });
43
- return map;
44
- };
45
- exports.mapToDottedNodes = mapToDottedNodes;
46
- /**
47
- * @param node
48
- * @return DottedPath
49
- */
50
- var getDottedPathForNode = function (node) {
51
- var dottedPath = dottedPath_1.DottedPath.create(node.name);
52
- var _parent = node;
53
- while (_parent.parent) {
54
- _parent = _parent.parent;
55
- dottedPath.unshiftPart(_parent.name);
56
- }
57
- return dottedPath;
58
- };
59
- exports.getDottedPathForNode = getDottedPathForNode;
60
- /**
61
- * @param node
62
- * @param predicate
63
- * @param deep
64
- * @return TransformNode | null
65
- */
66
- var cloneTransformNode = function (node, predicate, deep) {
67
- if (deep === void 0) { deep = true; }
68
- if (predicate && !predicate(node)) {
69
- return null;
70
- }
71
- var clone = node.clone(node.name, node.parent, true);
72
- if (clone) {
73
- clone.metadata = lodash_es_1.cloneDeep(node.metadata);
74
- }
75
- if (deep) {
76
- var children = node.getChildTransformNodes(true);
77
- children.forEach(function (child) {
78
- var clonedChild = cloneTransformNode(child, predicate, deep);
79
- if (clonedChild) {
80
- clonedChild.parent = clone;
81
- }
82
- });
83
- }
84
- return clone;
85
- };
86
- exports.cloneTransformNode = cloneTransformNode;
87
- /**
88
- * @param node
89
- */
90
- var cloneNodeWithParents = function (node) {
91
- var clone = null;
92
- if (node instanceof transformNode_1.TransformNode) {
93
- clone = node.clone(node.name, cloneNodeWithParents(node.parent), true);
94
- }
95
- else if (node instanceof light_1.Light) {
96
- clone = node.clone(node.name, cloneNodeWithParents(node.parent));
97
- }
98
- else if (node) {
99
- throw new Error("Cloning of \"" + (node === null || node === void 0 ? void 0 : node.constructor.name) + "\" is not implemented (yet).");
100
- }
101
- return clone;
102
- };
103
- exports.cloneNodeWithParents = cloneNodeWithParents;
104
- /**
105
- * @param node
106
- * @param deep
107
- * @param prefix
108
- * @return TransformNode
109
- */
110
- var cloneTransformNodeMaterial = function (node, prefix, deep) {
111
- if (prefix === void 0) { prefix = ''; }
112
- if (deep === void 0) { deep = true; }
113
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
114
- var newMatName = dottedPath_1.DottedPath.create(prefix).addParts([node.material.name, 'clone', node.uniqueId.toString()]);
115
- node.material = node.material.clone(newMatName.path);
116
- }
117
- if (deep) {
118
- var children = node.getChildTransformNodes(true);
119
- children.forEach(function (child) { return cloneTransformNodeMaterial(child, prefix, deep); });
120
- }
121
- return node;
122
- };
123
- exports.cloneTransformNodeMaterial = cloneTransformNodeMaterial;
124
- /**
125
- * @param node
126
- * @param deep
127
- * @param metadata
128
- */
129
- var injectNodeMetadata = function (node, metadata, deep) {
130
- if (deep === void 0) { deep = true; }
131
- node.metadata = lodash_es_1.merge({}, node.metadata, metadata);
132
- if (deep && node instanceof transformNode_1.TransformNode) {
133
- var children = node.getChildTransformNodes(true);
134
- children.forEach(function (child) { return injectNodeMetadata(child, metadata, deep); });
135
- }
136
- };
137
- exports.injectNodeMetadata = injectNodeMetadata;
138
- /**
139
- * @param node
140
- * @param assertCallable
141
- * @param callableParameters
142
- * @param deep
143
- */
144
- var assertTransformNode = function (node, assertCallable, callableParameters, deep) {
145
- if (callableParameters === void 0) { callableParameters = []; }
146
- if (deep === void 0) { deep = true; }
147
- assertCallable.apply(void 0, tslib_1.__spreadArrays([node], callableParameters));
148
- if (deep) {
149
- var children = node.getChildTransformNodes(true);
150
- children.forEach(function (child) { return assertTransformNode(child, assertCallable, callableParameters, deep); });
151
- }
152
- };
153
- exports.assertTransformNode = assertTransformNode;
154
- /**
155
- * @param node
156
- * @param deep
157
- */
158
- var activateTransformNode = function (node, deep) {
159
- if (deep === void 0) { deep = true; }
160
- node.setEnabled(true);
161
- /*
162
- if( node instanceof AbstractMesh ) {
163
- node.visibility = 1;
164
- node.isPickable = true;
165
- }
166
- */
167
- if (deep) {
168
- node.getChildTransformNodes(true).forEach(function (child) { return activateTransformNode(child, deep); });
169
- }
170
- };
171
- exports.activateTransformNode = activateTransformNode;
172
- /**
173
- * @param node
174
- * @param deep
175
- */
176
- var deactivateTransformNode = function (node, deep) {
177
- if (deep === void 0) { deep = true; }
178
- node.setEnabled(false);
179
- /*
180
- if( node instanceof AbstractMesh ) {
181
- node.visibility = 0;
182
- node.isPickable = false;
183
- }
184
- */
185
- if (deep) {
186
- node.getChildTransformNodes(true).forEach(function (child) { return deactivateTransformNode(child, deep); });
187
- }
188
- };
189
- exports.deactivateTransformNode = deactivateTransformNode;
190
- /**
191
- * @param node
192
- */
193
- var enableNodeWithParents = function (node) {
194
- node.setEnabled(true);
195
- if (node.parent) {
196
- enableNodeWithParents(node.parent);
197
- }
198
- };
199
- exports.enableNodeWithParents = enableNodeWithParents;
200
- /**
201
- * @param node
202
- */
203
- var disableNodeWithParents = function (node) {
204
- node.setEnabled(false);
205
- if (node.parent) {
206
- disableNodeWithParents(node.parent);
207
- }
208
- };
209
- exports.disableNodeWithParents = disableNodeWithParents;
210
- /**
211
- * Applies a {@link TransformationDefinition} consecutively to ensure dependencies in positioning etc.
212
- * @param node
213
- * @param transformation
214
- */
215
- var transformTransformNode = function (node, transformation) {
216
- // scaling
217
- if (!lodash_es_1.has(node.metadata, 'scaling.initial')) {
218
- injectNodeMetadata(node, { 'scaling.initial': node.scaling }, false);
219
- }
220
- var initialScaling = lodash_es_1.get(node.metadata, 'scaling.initial');
221
- node.scaling = initialScaling.multiply(transformation.scaling);
222
- // position
223
- if (!lodash_es_1.has(node.metadata, 'position.initial')) {
224
- injectNodeMetadata(node, { 'position.initial': node.absolutePosition.clone() }, false);
225
- }
226
- var initialPosition = lodash_es_1.get(node.metadata, 'position.initial');
227
- node.setAbsolutePosition(initialPosition.add(transformation.position).multiply(transformation.scaling));
228
- // rotation
229
- if (!lodash_es_1.has(node.metadata, 'rotation.initial')) {
230
- var rotationQuaternion = node.rotationQuaternion;
231
- if (!rotationQuaternion) {
232
- rotationQuaternion = math_vector_1.Quaternion.RotationYawPitchRoll(node.rotation.x, node.rotation.y, node.rotation.z);
233
- }
234
- injectNodeMetadata(node, { 'rotation.initial': rotationQuaternion.asArray() }, false);
235
- }
236
- var initialRotationQuaternion = math_vector_1.Quaternion.FromArray(lodash_es_1.get(node.metadata, 'rotation.initial'));
237
- node.rotationQuaternion = initialRotationQuaternion;
238
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.X, transformation.rotation.x);
239
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Y, transformation.rotation.y);
240
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Z, transformation.rotation.z);
241
- node.computeWorldMatrix(true);
242
- };
243
- exports.transformTransformNode = transformTransformNode;
244
- /**
245
- * @param node
246
- * @param material
247
- * @param deep
248
- */
249
- var setMaterial = function (node, material, deep) {
250
- if (deep === void 0) { deep = true; }
251
- if (node instanceof abstractMesh_1.AbstractMesh) {
252
- node.material = material;
253
- }
254
- if (deep) {
255
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterial(child, material, deep); });
256
- }
257
- };
258
- exports.setMaterial = setMaterial;
259
- /**
260
- * !!! Warning !!!
261
- * This function is not public API. Whilst it can help solving certain problems, it only works reliably in well defined
262
- * situations and can cause unwanted side effects under some conditions. Use carefully at your own risk!
263
- *
264
- * See https://combeenation.myjetbrains.com/youtrack/issue/CB-5906 for further details regarding this warning.
265
- *
266
- * Set material of an instanced meshes source mesh.
267
- * Changes the material of all instanced meshes which have the same source mesh.
268
- *
269
- * @param node
270
- * @param material
271
- * @param deep
272
- *
273
- * @ignore
274
- */
275
- var setSourceNodeMaterial = function (node, material, deep) {
276
- if (deep === void 0) { deep = true; }
277
- var warn = "\tYou're using \"setSourceNodeMaterial\" which is not public API.\n\tWhilst it can help solving certain problems, it only works reliably in well defined situations and can cause unwanted side effects under some conditions.\n\tUse carefully at your own risk!";
278
- console.warn("!!! Warning !!!\n" + warn);
279
- if (node instanceof instancedMesh_1.InstancedMesh) {
280
- node.sourceMesh.material = material;
281
- }
282
- if (deep) {
283
- node.getChildTransformNodes(true).forEach(function (child) { return setSourceNodeMaterial(child, material, deep); });
284
- }
285
- };
286
- exports.setSourceNodeMaterial = setSourceNodeMaterial;
287
- /**
288
- * @param node
289
- * @param color
290
- * @param deep
291
- */
292
- var setMaterialColor = function (node, color, deep) {
293
- if (deep === void 0) { deep = true; }
294
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
295
- var materialCls = node.material.getClassName();
296
- switch (materialCls) {
297
- case 'PBRMaterial':
298
- node.material.albedoColor = color.toLinearSpace();
299
- break;
300
- case 'StandardMaterial':
301
- node.material.diffuseColor = color;
302
- break;
303
- default:
304
- throw new Error("Setting color for material of instance \"" + materialCls + "\" not implemented (yet).");
305
- }
306
- }
307
- if (deep) {
308
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialColor(child, color, deep); });
309
- }
310
- };
311
- exports.setMaterialColor = setMaterialColor;
312
- /**
313
- * @param node
314
- * @param texture
315
- * @param deep
316
- */
317
- var setMaterialTexture = function (node, texture, deep) {
318
- if (deep === void 0) { deep = true; }
319
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
320
- var materialCls = node.material.getClassName();
321
- switch (materialCls) {
322
- case 'PBRMaterial':
323
- node.material.albedoTexture = texture;
324
- break;
325
- case 'StandardMaterial':
326
- node.material.diffuseTexture = texture;
327
- break;
328
- default:
329
- throw new Error("Setting texture for material of instance \"" + materialCls + "\" not implemented (yet).");
330
- }
331
- }
332
- if (deep) {
333
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialTexture(child, texture, deep); });
334
- }
335
- };
336
- exports.setMaterialTexture = setMaterialTexture;
337
- /**
338
- * @param node
339
- * @param metallness
340
- * @param deep
341
- */
342
- var setMaterialMetallness = function (node, metallness, deep) {
343
- if (deep === void 0) { deep = true; }
344
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
345
- var materialCls = node.material.getClassName();
346
- switch (materialCls) {
347
- case 'PBRMaterial':
348
- node.material.metallic = metallness;
349
- break;
350
- default:
351
- throw new Error("Setting metallness for material of instance \"" + materialCls + "\" not implemented (yet).");
352
- }
353
- }
354
- if (deep) {
355
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialMetallness(child, metallness, deep); });
356
- }
357
- };
358
- exports.setMaterialMetallness = setMaterialMetallness;
359
- /**
360
- * @param node
361
- * @param roughness
362
- * @param deep
363
- */
364
- var setMaterialRoughness = function (node, roughness, deep) {
365
- if (deep === void 0) { deep = true; }
366
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
367
- var materialCls = node.material.getClassName();
368
- switch (materialCls) {
369
- case 'PBRMaterial':
370
- node.material.roughness = roughness;
371
- break;
372
- case 'StandardMaterial':
373
- node.material.roughness = roughness;
374
- break;
375
- default:
376
- throw new Error("Setting roughness for material of instance \"" + materialCls + "\" not implemented (yet).");
377
- }
378
- }
379
- if (deep) {
380
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialRoughness(child, roughness, deep); });
381
- }
382
- };
383
- exports.setMaterialRoughness = setMaterialRoughness;
384
- /**
385
- * @param node
386
- * @param layer
387
- * @param color
388
- * @param deep
389
- */
390
- var addToHighlightLayer = function (layer, color, node, deep) {
391
- if (deep === void 0) { deep = true; }
392
- if (node instanceof abstractMesh_1.AbstractMesh) {
393
- layer.addMesh(node, color);
394
- }
395
- if (deep) {
396
- node.getChildTransformNodes(true).forEach(function (child) { return addToHighlightLayer(layer, color, child, deep); });
397
- }
398
- };
399
- exports.addToHighlightLayer = addToHighlightLayer;
400
- /**
401
- * @param node
402
- * @param layer
403
- * @param deep
404
- */
405
- var removeFromHighlightLayer = function (layer, node, deep) {
406
- if (deep === void 0) { deep = true; }
407
- if (node instanceof abstractMesh_1.AbstractMesh) {
408
- layer.removeMesh(node);
409
- }
410
- if (deep) {
411
- node.getChildTransformNodes(true).forEach(function (child) { return removeFromHighlightLayer(layer, child, deep); });
412
- }
413
- };
414
- exports.removeFromHighlightLayer = removeFromHighlightLayer;
415
- /**
416
- * @param node
417
- * @param receiveShadows
418
- * @param deep
419
- */
420
- var setReceiveShadows = function (node, receiveShadows, deep) {
421
- if (deep === void 0) { deep = true; }
422
- if (node instanceof abstractMesh_1.AbstractMesh) {
423
- node.receiveShadows = receiveShadows;
424
- }
425
- if (deep) {
426
- node.getChildTransformNodes(true).forEach(function (child) { return setReceiveShadows(child, receiveShadows, deep); });
427
- }
428
- };
429
- exports.setReceiveShadows = setReceiveShadows;
430
- /**
431
- * @param node
432
- * @param generator
433
- * @param deep
434
- */
435
- var addToShadowGenerator = function (generator, node, deep) {
436
- if (deep === void 0) { deep = true; }
437
- if (node instanceof abstractMesh_1.AbstractMesh) {
438
- // We have to remove the node because there's no duplicate check in babylon
439
- generator.removeShadowCaster(node, false);
440
- generator.addShadowCaster(node, false);
441
- }
442
- if (deep) {
443
- node.getChildTransformNodes(true).forEach(function (child) { return addToShadowGenerator(generator, child, deep); });
444
- }
445
- };
446
- exports.addToShadowGenerator = addToShadowGenerator;
447
- /**
448
- * @param node
449
- * @param generator
450
- * @param deep
451
- */
452
- var removeFromShadowGenerator = function (generator, node, deep) {
453
- if (deep === void 0) { deep = true; }
454
- if (node instanceof abstractMesh_1.AbstractMesh) {
455
- generator.removeShadowCaster(node, false);
456
- }
457
- if (deep) {
458
- node.getChildTransformNodes(true).forEach(function (child) { return removeFromShadowGenerator(generator, child, deep); });
459
- }
460
- };
461
- exports.removeFromShadowGenerator = removeFromShadowGenerator;
462
- /**
463
- * https://forum.babylonjs.com/t/get-mesh-bounding-box-position-and-size-in-2d-screen-coordinates/1058/3
464
- * @param mesh
465
- * @param scene
466
- * @param canvas
467
- */
468
- var getClientRectFromMesh = function (mesh, scene, canvas) {
469
- // get bounding box of the mesh
470
- var meshVectors = mesh.getBoundingInfo().boundingBox.vectors;
471
- // get the matrix and viewport needed to project the vectors onto the screen
472
- var worldMatrix = mesh.getWorldMatrix();
473
- var transformMatrix = scene.getTransformMatrix();
474
- var viewport = scene.activeCamera.viewport;
475
- // loop though all the vectors and project them against the current camera viewport to get a set of coordinates
476
- var coordinates = meshVectors.map(function (vector) {
477
- var projection = math_vector_1.Vector3.Project(vector, worldMatrix, transformMatrix, viewport);
478
- projection.x = projection.x * canvas.clientWidth;
479
- projection.y = projection.y * canvas.clientHeight;
480
- return projection;
481
- });
482
- // get the min and max for all the coordinates so we can calculate the largest possible screen size
483
- var maxX = Math.max.apply(Math, coordinates.map(function (o) { return o.x; }));
484
- var minX = Math.min.apply(Math, coordinates.map(function (o) { return o.x; }));
485
- var maxY = Math.max.apply(Math, coordinates.map(function (o) { return o.y; }));
486
- var minY = Math.min.apply(Math, coordinates.map(function (o) { return o.y; }));
487
- // return a ClientRect from this
488
- return {
489
- width: maxX - minX,
490
- height: maxY - minY,
491
- left: minX,
492
- top: minY,
493
- right: maxX,
494
- bottom: maxY,
495
- };
496
- };
497
- exports.getClientRectFromMesh = getClientRectFromMesh;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.envHelperMetadataName = exports.backgroundDomeName = exports.changeEnvironment = exports.getClientRectFromMesh = exports.removeFromShadowGenerator = exports.addToShadowGenerator = exports.setReceiveShadows = exports.removeFromHighlightLayer = exports.addToHighlightLayer = exports.setMaterialRoughness = exports.setMaterialMetallness = exports.setMaterialTexture = exports.setMaterialColor = exports.setSourceNodeMaterial = exports.setMaterial = exports.transformTransformNode = exports.disableNodeWithParents = exports.enableNodeWithParents = exports.deactivateTransformNode = exports.activateTransformNode = exports.assertTransformNode = exports.injectNodeMetadata = exports.cloneTransformNodeMaterial = exports.cloneNodeWithParents = exports.cloneTransformNode = exports.getDottedPathForNode = exports.mapToDottedNodes = exports.getRootNode = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var photoDome_1 = require("@babylonjs/core/Helpers/photoDome");
6
+ var light_1 = require("@babylonjs/core/Lights/light");
7
+ var cubeTexture_1 = require("@babylonjs/core/Materials/Textures/cubeTexture");
8
+ var math_axis_1 = require("@babylonjs/core/Maths/math.axis");
9
+ var math_color_1 = require("@babylonjs/core/Maths/math.color");
10
+ var math_vector_1 = require("@babylonjs/core/Maths/math.vector");
11
+ var abstractMesh_1 = require("@babylonjs/core/Meshes/abstractMesh");
12
+ var instancedMesh_1 = require("@babylonjs/core/Meshes/instancedMesh");
13
+ var transformNode_1 = require("@babylonjs/core/Meshes/transformNode");
14
+ var tools_1 = require("@babylonjs/core/Misc/tools");
15
+ var sceneSetup_1 = require("../internal/sceneSetup");
16
+ var lodash_es_1 = require("lodash-es");
17
+ var dottedPath_1 = require("../classes/dottedPath");
18
+ var backgroundDomeName = 'BackgroundDome_ViewerGenerated';
19
+ exports.backgroundDomeName = backgroundDomeName;
20
+ var envHelperMetadataName = 'viewerEnvHelper';
21
+ exports.envHelperMetadataName = envHelperMetadataName;
22
+ /**
23
+ * @param node
24
+ * @return Node
25
+ */
26
+ var getRootNode = function (node) {
27
+ var _node = node;
28
+ while (_node.parent) {
29
+ _node = _node.parent;
30
+ }
31
+ return _node;
32
+ };
33
+ exports.getRootNode = getRootNode;
34
+ /**
35
+ * @param nodes
36
+ * @param predicate
37
+ * @return Map<DottedPath, T>
38
+ */
39
+ var mapToDottedNodes = function (nodes, predicate) {
40
+ var map = new Map();
41
+ var addNodes = function (_node) {
42
+ if (predicate && predicate(_node)) {
43
+ map.set(_node.metadata.dottedPath, _node);
44
+ }
45
+ _node.getChildren().forEach(function (child) {
46
+ addNodes(child);
47
+ });
48
+ };
49
+ nodes.forEach(function (node) {
50
+ addNodes(node);
51
+ });
52
+ return map;
53
+ };
54
+ exports.mapToDottedNodes = mapToDottedNodes;
55
+ /**
56
+ * @param node
57
+ * @return DottedPath
58
+ */
59
+ var getDottedPathForNode = function (node) {
60
+ var dottedPath = dottedPath_1.DottedPath.create(node.name);
61
+ var _parent = node;
62
+ while (_parent.parent) {
63
+ _parent = _parent.parent;
64
+ dottedPath.unshiftPart(_parent.name);
65
+ }
66
+ return dottedPath;
67
+ };
68
+ exports.getDottedPathForNode = getDottedPathForNode;
69
+ /**
70
+ * @param node
71
+ * @param predicate
72
+ * @param deep
73
+ * @return TransformNode | null
74
+ */
75
+ var cloneTransformNode = function (node, predicate, deep) {
76
+ if (deep === void 0) { deep = true; }
77
+ if (predicate && !predicate(node)) {
78
+ return null;
79
+ }
80
+ var clone = node.clone(node.name, node.parent, true);
81
+ if (clone) {
82
+ clone.metadata = lodash_es_1.cloneDeep(node.metadata);
83
+ }
84
+ if (deep) {
85
+ var children = node.getChildTransformNodes(true);
86
+ children.forEach(function (child) {
87
+ var clonedChild = cloneTransformNode(child, predicate, deep);
88
+ if (clonedChild) {
89
+ clonedChild.parent = clone;
90
+ }
91
+ });
92
+ }
93
+ return clone;
94
+ };
95
+ exports.cloneTransformNode = cloneTransformNode;
96
+ /**
97
+ * @param node
98
+ */
99
+ var cloneNodeWithParents = function (node) {
100
+ var clone = null;
101
+ if (node instanceof transformNode_1.TransformNode) {
102
+ clone = node.clone(node.name, cloneNodeWithParents(node.parent), true);
103
+ }
104
+ else if (node instanceof light_1.Light) {
105
+ clone = node.clone(node.name, cloneNodeWithParents(node.parent));
106
+ }
107
+ else if (node) {
108
+ throw new Error("Cloning of \"" + (node === null || node === void 0 ? void 0 : node.constructor.name) + "\" is not implemented (yet).");
109
+ }
110
+ return clone;
111
+ };
112
+ exports.cloneNodeWithParents = cloneNodeWithParents;
113
+ /**
114
+ * @param node
115
+ * @param deep
116
+ * @param prefix
117
+ * @return TransformNode
118
+ */
119
+ var cloneTransformNodeMaterial = function (node, prefix, deep) {
120
+ if (prefix === void 0) { prefix = ''; }
121
+ if (deep === void 0) { deep = true; }
122
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
123
+ var newMatName = dottedPath_1.DottedPath.create(prefix).addParts([node.material.name, 'clone', node.uniqueId.toString()]);
124
+ node.material = node.material.clone(newMatName.path);
125
+ }
126
+ if (deep) {
127
+ var children = node.getChildTransformNodes(true);
128
+ children.forEach(function (child) { return cloneTransformNodeMaterial(child, prefix, deep); });
129
+ }
130
+ return node;
131
+ };
132
+ exports.cloneTransformNodeMaterial = cloneTransformNodeMaterial;
133
+ /**
134
+ * @param node
135
+ * @param deep
136
+ * @param metadata
137
+ */
138
+ var injectNodeMetadata = function (node, metadata, deep) {
139
+ if (deep === void 0) { deep = true; }
140
+ node.metadata = lodash_es_1.merge({}, node.metadata, metadata);
141
+ if (deep && node instanceof transformNode_1.TransformNode) {
142
+ var children = node.getChildTransformNodes(true);
143
+ children.forEach(function (child) { return injectNodeMetadata(child, metadata, deep); });
144
+ }
145
+ };
146
+ exports.injectNodeMetadata = injectNodeMetadata;
147
+ /**
148
+ * @param node
149
+ * @param assertCallable
150
+ * @param callableParameters
151
+ * @param deep
152
+ */
153
+ var assertTransformNode = function (node, assertCallable, callableParameters, deep) {
154
+ if (callableParameters === void 0) { callableParameters = []; }
155
+ if (deep === void 0) { deep = true; }
156
+ assertCallable.apply(void 0, tslib_1.__spreadArrays([node], callableParameters));
157
+ if (deep) {
158
+ var children = node.getChildTransformNodes(true);
159
+ children.forEach(function (child) { return assertTransformNode(child, assertCallable, callableParameters, deep); });
160
+ }
161
+ };
162
+ exports.assertTransformNode = assertTransformNode;
163
+ /**
164
+ * @param node
165
+ * @param deep
166
+ */
167
+ var activateTransformNode = function (node, deep) {
168
+ if (deep === void 0) { deep = true; }
169
+ node.setEnabled(true);
170
+ /*
171
+ if( node instanceof AbstractMesh ) {
172
+ node.visibility = 1;
173
+ node.isPickable = true;
174
+ }
175
+ */
176
+ if (deep) {
177
+ node.getChildTransformNodes(true).forEach(function (child) { return activateTransformNode(child, deep); });
178
+ }
179
+ };
180
+ exports.activateTransformNode = activateTransformNode;
181
+ /**
182
+ * @param node
183
+ * @param deep
184
+ */
185
+ var deactivateTransformNode = function (node, deep) {
186
+ if (deep === void 0) { deep = true; }
187
+ node.setEnabled(false);
188
+ /*
189
+ if( node instanceof AbstractMesh ) {
190
+ node.visibility = 0;
191
+ node.isPickable = false;
192
+ }
193
+ */
194
+ if (deep) {
195
+ node.getChildTransformNodes(true).forEach(function (child) { return deactivateTransformNode(child, deep); });
196
+ }
197
+ };
198
+ exports.deactivateTransformNode = deactivateTransformNode;
199
+ /**
200
+ * @param node
201
+ */
202
+ var enableNodeWithParents = function (node) {
203
+ node.setEnabled(true);
204
+ if (node.parent) {
205
+ enableNodeWithParents(node.parent);
206
+ }
207
+ };
208
+ exports.enableNodeWithParents = enableNodeWithParents;
209
+ /**
210
+ * @param node
211
+ */
212
+ var disableNodeWithParents = function (node) {
213
+ node.setEnabled(false);
214
+ if (node.parent) {
215
+ disableNodeWithParents(node.parent);
216
+ }
217
+ };
218
+ exports.disableNodeWithParents = disableNodeWithParents;
219
+ /**
220
+ * Applies a {@link TransformationDefinition} consecutively to ensure dependencies in positioning etc.
221
+ * @param node
222
+ * @param transformation
223
+ */
224
+ var transformTransformNode = function (node, transformation) {
225
+ // scaling
226
+ if (!lodash_es_1.has(node.metadata, 'scaling.initial')) {
227
+ injectNodeMetadata(node, { 'scaling.initial': node.scaling }, false);
228
+ }
229
+ var initialScaling = lodash_es_1.get(node.metadata, 'scaling.initial');
230
+ node.scaling = initialScaling.multiply(transformation.scaling);
231
+ // position
232
+ if (!lodash_es_1.has(node.metadata, 'position.initial')) {
233
+ injectNodeMetadata(node, { 'position.initial': node.absolutePosition.clone() }, false);
234
+ }
235
+ var initialPosition = lodash_es_1.get(node.metadata, 'position.initial');
236
+ node.setAbsolutePosition(initialPosition.add(transformation.position).multiply(transformation.scaling));
237
+ // rotation
238
+ if (!lodash_es_1.has(node.metadata, 'rotation.initial')) {
239
+ var rotationQuaternion = node.rotationQuaternion;
240
+ if (!rotationQuaternion) {
241
+ rotationQuaternion = math_vector_1.Quaternion.RotationYawPitchRoll(node.rotation.x, node.rotation.y, node.rotation.z);
242
+ }
243
+ injectNodeMetadata(node, { 'rotation.initial': rotationQuaternion.asArray() }, false);
244
+ }
245
+ var initialRotationQuaternion = math_vector_1.Quaternion.FromArray(lodash_es_1.get(node.metadata, 'rotation.initial'));
246
+ node.rotationQuaternion = initialRotationQuaternion;
247
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.X, transformation.rotation.x);
248
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Y, transformation.rotation.y);
249
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Z, transformation.rotation.z);
250
+ node.computeWorldMatrix(true);
251
+ };
252
+ exports.transformTransformNode = transformTransformNode;
253
+ /**
254
+ * Apply changes of environment (background texture, etc.) consecutively in order to avoid dependency related issues.
255
+ * @param scene
256
+ * @param envDef
257
+ */
258
+ var changeEnvironment = function (scene, envDef) {
259
+ var _a;
260
+ var _b;
261
+ // issue warning if both background texture and usedefault are set
262
+ if (envDef.environmentUseDefault && envDef.environmentBackground) {
263
+ console.warn("!!! Warning !!! Spec parameter 'environment.useDefaultEnvironment' is being overruled by 'environment.background'.");
264
+ }
265
+ var useDefaultEnv = envDef.environmentUseDefault && !envDef.environmentBackground;
266
+ // 1) set ENVIRONMENT_COLOR
267
+ scene.clearColor = envDef.environmentColor
268
+ ? math_color_1.Color4.FromColor3(envDef.environmentColor)
269
+ : useDefaultEnv
270
+ ? sceneSetup_1.defaultEnvHelperColor
271
+ : sceneSetup_1.defaultSceneClearColor;
272
+ // 2) dispose existing & set new ENVIRONMENT (==texture)
273
+ var curEnvTexture = scene.environmentTexture;
274
+ var envTextureChanged = envDef.environment !== (curEnvTexture === null || curEnvTexture === void 0 ? void 0 : curEnvTexture.url);
275
+ if (curEnvTexture && (!envDef.environment || envTextureChanged)) {
276
+ curEnvTexture.dispose();
277
+ }
278
+ var rotation = envDef.environmentRotation !== undefined ? tools_1.Tools.ToRadians(envDef.environmentRotation) : 0;
279
+ if (envDef.environment && envTextureChanged) {
280
+ var envTexture = cubeTexture_1.CubeTexture.CreateFromPrefilteredData(envDef.environment, scene);
281
+ envTexture.rotationY = rotation;
282
+ scene.environmentTexture = envTexture;
283
+ }
284
+ else if (curEnvTexture && curEnvTexture.rotationY !== rotation) {
285
+ curEnvTexture.rotationY = rotation;
286
+ }
287
+ // 3) dispose existing & set new ENVIRONMENT_BACKGROUND
288
+ var curDome = scene.getNodeByName(backgroundDomeName);
289
+ var backgroundUrlChanged = envDef.environmentBackground !== (curDome === null || curDome === void 0 ? void 0 : curDome.texture.url);
290
+ if (curDome && (!envDef.environmentBackground || backgroundUrlChanged)) {
291
+ curDome.dispose();
292
+ }
293
+ var rotationPhotoDome = -1 * rotation;
294
+ if (envDef.environmentBackground && backgroundUrlChanged) {
295
+ var textureUrl = envDef.environmentBackground;
296
+ var dome = new photoDome_1.PhotoDome(backgroundDomeName, textureUrl, { resolution: 32, size: 450 }, scene);
297
+ // Rotate submesh to get them in line with environment texture
298
+ dome.getChildMeshes(true)[0].rotation.y = tools_1.Tools.ToRadians(90);
299
+ dome.rotation.y = rotationPhotoDome;
300
+ }
301
+ else if (curDome && curDome.rotation.y !== rotationPhotoDome) {
302
+ curDome.rotation.y = rotationPhotoDome;
303
+ }
304
+ // 4) dispose existing & set new ENVIRONMENT_USEDEFAULT (only if no background is set)
305
+ var curEnvHelper = (_b = scene.metadata) === null || _b === void 0 ? void 0 : _b[envHelperMetadataName];
306
+ if (curEnvHelper && (!envDef.environmentUseDefault || envDef.environmentBackground)) {
307
+ curEnvHelper.dispose();
308
+ }
309
+ if (useDefaultEnv && !curEnvHelper) {
310
+ var envHelper = scene.createDefaultEnvironment({ sizeAuto: true });
311
+ envHelper === null || envHelper === void 0 ? void 0 : envHelper.setMainColor(math_color_1.Color3.FromArray(scene.clearColor.asArray()));
312
+ if (envHelper) {
313
+ scene.metadata = lodash_es_1.merge({}, scene.metadata, (_a = {}, _a[envHelperMetadataName] = envHelper, _a));
314
+ }
315
+ }
316
+ // 5) set ENVIRONMENT_INTENSITY
317
+ if (envDef.environmentIntensity !== undefined) {
318
+ scene.environmentIntensity = envDef.environmentIntensity;
319
+ }
320
+ };
321
+ exports.changeEnvironment = changeEnvironment;
322
+ /**
323
+ * @param node
324
+ * @param material
325
+ * @param deep
326
+ */
327
+ var setMaterial = function (node, material, deep) {
328
+ if (deep === void 0) { deep = true; }
329
+ if (node instanceof abstractMesh_1.AbstractMesh) {
330
+ node.material = material;
331
+ }
332
+ if (deep) {
333
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterial(child, material, deep); });
334
+ }
335
+ };
336
+ exports.setMaterial = setMaterial;
337
+ /**
338
+ * !!! Warning !!!
339
+ * This function is not public API. Whilst it can help solving certain problems, it only works reliably in well defined
340
+ * situations and can cause unwanted side effects under some conditions. Use carefully at your own risk!
341
+ *
342
+ * See https://combeenation.myjetbrains.com/youtrack/issue/CB-5906 for further details regarding this warning.
343
+ *
344
+ * Set material of an instanced meshes source mesh.
345
+ * Changes the material of all instanced meshes which have the same source mesh.
346
+ *
347
+ * @param node
348
+ * @param material
349
+ * @param deep
350
+ *
351
+ * @ignore
352
+ */
353
+ var setSourceNodeMaterial = function (node, material, deep) {
354
+ if (deep === void 0) { deep = true; }
355
+ var warn = "\tYou're using \"setSourceNodeMaterial\" which is not public API.\n\tWhilst it can help solving certain problems, it only works reliably in well defined situations and can cause unwanted side effects under some conditions.\n\tUse carefully at your own risk!";
356
+ console.warn("!!! Warning !!!\n" + warn);
357
+ if (node instanceof instancedMesh_1.InstancedMesh) {
358
+ node.sourceMesh.material = material;
359
+ }
360
+ if (deep) {
361
+ node.getChildTransformNodes(true).forEach(function (child) { return setSourceNodeMaterial(child, material, deep); });
362
+ }
363
+ };
364
+ exports.setSourceNodeMaterial = setSourceNodeMaterial;
365
+ /**
366
+ * @param node
367
+ * @param color
368
+ * @param deep
369
+ */
370
+ var setMaterialColor = function (node, color, deep) {
371
+ if (deep === void 0) { deep = true; }
372
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
373
+ var materialCls = node.material.getClassName();
374
+ switch (materialCls) {
375
+ case 'PBRMaterial':
376
+ node.material.albedoColor = color.toLinearSpace();
377
+ break;
378
+ case 'StandardMaterial':
379
+ node.material.diffuseColor = color;
380
+ break;
381
+ default:
382
+ throw new Error("Setting color for material of instance \"" + materialCls + "\" not implemented (yet).");
383
+ }
384
+ }
385
+ if (deep) {
386
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialColor(child, color, deep); });
387
+ }
388
+ };
389
+ exports.setMaterialColor = setMaterialColor;
390
+ /**
391
+ * @param node
392
+ * @param texture
393
+ * @param deep
394
+ */
395
+ var setMaterialTexture = function (node, texture, deep) {
396
+ if (deep === void 0) { deep = true; }
397
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
398
+ var materialCls = node.material.getClassName();
399
+ switch (materialCls) {
400
+ case 'PBRMaterial':
401
+ node.material.albedoTexture = texture;
402
+ break;
403
+ case 'StandardMaterial':
404
+ node.material.diffuseTexture = texture;
405
+ break;
406
+ default:
407
+ throw new Error("Setting texture for material of instance \"" + materialCls + "\" not implemented (yet).");
408
+ }
409
+ }
410
+ if (deep) {
411
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialTexture(child, texture, deep); });
412
+ }
413
+ };
414
+ exports.setMaterialTexture = setMaterialTexture;
415
+ /**
416
+ * @param node
417
+ * @param metallness
418
+ * @param deep
419
+ */
420
+ var setMaterialMetallness = function (node, metallness, deep) {
421
+ if (deep === void 0) { deep = true; }
422
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
423
+ var materialCls = node.material.getClassName();
424
+ switch (materialCls) {
425
+ case 'PBRMaterial':
426
+ node.material.metallic = metallness;
427
+ break;
428
+ default:
429
+ throw new Error("Setting metallness for material of instance \"" + materialCls + "\" not implemented (yet).");
430
+ }
431
+ }
432
+ if (deep) {
433
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialMetallness(child, metallness, deep); });
434
+ }
435
+ };
436
+ exports.setMaterialMetallness = setMaterialMetallness;
437
+ /**
438
+ * @param node
439
+ * @param roughness
440
+ * @param deep
441
+ */
442
+ var setMaterialRoughness = function (node, roughness, deep) {
443
+ if (deep === void 0) { deep = true; }
444
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
445
+ var materialCls = node.material.getClassName();
446
+ switch (materialCls) {
447
+ case 'PBRMaterial':
448
+ node.material.roughness = roughness;
449
+ break;
450
+ case 'StandardMaterial':
451
+ node.material.roughness = roughness;
452
+ break;
453
+ default:
454
+ throw new Error("Setting roughness for material of instance \"" + materialCls + "\" not implemented (yet).");
455
+ }
456
+ }
457
+ if (deep) {
458
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialRoughness(child, roughness, deep); });
459
+ }
460
+ };
461
+ exports.setMaterialRoughness = setMaterialRoughness;
462
+ /**
463
+ * @param node
464
+ * @param layer
465
+ * @param color
466
+ * @param deep
467
+ */
468
+ var addToHighlightLayer = function (layer, color, node, deep) {
469
+ if (deep === void 0) { deep = true; }
470
+ if (node instanceof abstractMesh_1.AbstractMesh) {
471
+ layer.addMesh(node, color);
472
+ }
473
+ if (deep) {
474
+ node.getChildTransformNodes(true).forEach(function (child) { return addToHighlightLayer(layer, color, child, deep); });
475
+ }
476
+ };
477
+ exports.addToHighlightLayer = addToHighlightLayer;
478
+ /**
479
+ * @param node
480
+ * @param layer
481
+ * @param deep
482
+ */
483
+ var removeFromHighlightLayer = function (layer, node, deep) {
484
+ if (deep === void 0) { deep = true; }
485
+ if (node instanceof abstractMesh_1.AbstractMesh) {
486
+ layer.removeMesh(node);
487
+ }
488
+ if (deep) {
489
+ node.getChildTransformNodes(true).forEach(function (child) { return removeFromHighlightLayer(layer, child, deep); });
490
+ }
491
+ };
492
+ exports.removeFromHighlightLayer = removeFromHighlightLayer;
493
+ /**
494
+ * @param node
495
+ * @param receiveShadows
496
+ * @param deep
497
+ */
498
+ var setReceiveShadows = function (node, receiveShadows, deep) {
499
+ if (deep === void 0) { deep = true; }
500
+ if (node instanceof abstractMesh_1.AbstractMesh) {
501
+ node.receiveShadows = receiveShadows;
502
+ }
503
+ if (deep) {
504
+ node.getChildTransformNodes(true).forEach(function (child) { return setReceiveShadows(child, receiveShadows, deep); });
505
+ }
506
+ };
507
+ exports.setReceiveShadows = setReceiveShadows;
508
+ /**
509
+ * @param node
510
+ * @param generator
511
+ * @param deep
512
+ */
513
+ var addToShadowGenerator = function (generator, node, deep) {
514
+ if (deep === void 0) { deep = true; }
515
+ if (node instanceof abstractMesh_1.AbstractMesh) {
516
+ // We have to remove the node because there's no duplicate check in babylon
517
+ generator.removeShadowCaster(node, false);
518
+ generator.addShadowCaster(node, false);
519
+ }
520
+ if (deep) {
521
+ node.getChildTransformNodes(true).forEach(function (child) { return addToShadowGenerator(generator, child, deep); });
522
+ }
523
+ };
524
+ exports.addToShadowGenerator = addToShadowGenerator;
525
+ /**
526
+ * @param node
527
+ * @param generator
528
+ * @param deep
529
+ */
530
+ var removeFromShadowGenerator = function (generator, node, deep) {
531
+ if (deep === void 0) { deep = true; }
532
+ if (node instanceof abstractMesh_1.AbstractMesh) {
533
+ generator.removeShadowCaster(node, false);
534
+ }
535
+ if (deep) {
536
+ node.getChildTransformNodes(true).forEach(function (child) { return removeFromShadowGenerator(generator, child, deep); });
537
+ }
538
+ };
539
+ exports.removeFromShadowGenerator = removeFromShadowGenerator;
540
+ /**
541
+ * https://forum.babylonjs.com/t/get-mesh-bounding-box-position-and-size-in-2d-screen-coordinates/1058/3
542
+ * @param mesh
543
+ * @param scene
544
+ * @param canvas
545
+ */
546
+ var getClientRectFromMesh = function (mesh, scene, canvas) {
547
+ // get bounding box of the mesh
548
+ var meshVectors = mesh.getBoundingInfo().boundingBox.vectors;
549
+ // get the matrix and viewport needed to project the vectors onto the screen
550
+ var worldMatrix = mesh.getWorldMatrix();
551
+ var transformMatrix = scene.getTransformMatrix();
552
+ var viewport = scene.activeCamera.viewport;
553
+ // loop though all the vectors and project them against the current camera viewport to get a set of coordinates
554
+ var coordinates = meshVectors.map(function (vector) {
555
+ var projection = math_vector_1.Vector3.Project(vector, worldMatrix, transformMatrix, viewport);
556
+ projection.x = projection.x * canvas.clientWidth;
557
+ projection.y = projection.y * canvas.clientHeight;
558
+ return projection;
559
+ });
560
+ // get the min and max for all the coordinates so we can calculate the largest possible screen size
561
+ var maxX = Math.max.apply(Math, coordinates.map(function (o) { return o.x; }));
562
+ var minX = Math.min.apply(Math, coordinates.map(function (o) { return o.x; }));
563
+ var maxY = Math.max.apply(Math, coordinates.map(function (o) { return o.y; }));
564
+ var minY = Math.min.apply(Math, coordinates.map(function (o) { return o.y; }));
565
+ // return a ClientRect from this
566
+ return {
567
+ width: maxX - minX,
568
+ height: maxY - minY,
569
+ left: minX,
570
+ top: minY,
571
+ right: maxX,
572
+ bottom: maxY,
573
+ };
574
+ };
575
+ exports.getClientRectFromMesh = getClientRectFromMesh;
498
576
  //# sourceMappingURL=babylonHelper.js.map