@combeenation/3d-viewer 4.0.0-beta5 → 4.0.0-rc1

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 (95) hide show
  1. package/README.md +114 -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 +190 -190
  6. package/dist/lib-cjs/api/classes/element.d.ts +130 -130
  7. package/dist/lib-cjs/api/classes/element.js +743 -743
  8. package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -14
  9. package/dist/lib-cjs/api/classes/elementParameterizable.js +134 -134
  10. package/dist/lib-cjs/api/classes/event.d.ts +326 -326
  11. package/dist/lib-cjs/api/classes/event.js +371 -371
  12. package/dist/lib-cjs/api/classes/eventBroadcaster.d.ts +26 -26
  13. package/dist/lib-cjs/api/classes/eventBroadcaster.js +53 -53
  14. package/dist/lib-cjs/api/classes/parameter.d.ts +259 -259
  15. package/dist/lib-cjs/api/classes/parameter.js +387 -387
  16. package/dist/lib-cjs/api/classes/parameterObservable.d.ts +36 -36
  17. package/dist/lib-cjs/api/classes/parameterObservable.js +101 -101
  18. package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
  19. package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
  20. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +38 -38
  21. package/dist/lib-cjs/api/classes/placementAnimation.js +149 -149
  22. package/dist/lib-cjs/api/classes/variant.d.ts +234 -234
  23. package/dist/lib-cjs/api/classes/variant.js +1147 -1147
  24. package/dist/lib-cjs/api/classes/variantInstance.d.ts +45 -45
  25. package/dist/lib-cjs/api/classes/variantInstance.js +108 -108
  26. package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +17 -17
  27. package/dist/lib-cjs/api/classes/variantParameterizable.js +92 -92
  28. package/dist/lib-cjs/api/classes/viewer.d.ts +131 -131
  29. package/dist/lib-cjs/api/classes/viewer.js +567 -560
  30. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  31. package/dist/lib-cjs/api/classes/viewerLight.d.ts +66 -66
  32. package/dist/lib-cjs/api/classes/viewerLight.js +389 -389
  33. package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
  34. package/dist/lib-cjs/api/internal/debugViewer.js +87 -87
  35. package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
  36. package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
  37. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +10 -10
  38. package/dist/lib-cjs/api/internal/sceneSetup.js +231 -231
  39. package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
  40. package/dist/lib-cjs/api/manager/animationManager.js +121 -121
  41. package/dist/lib-cjs/api/manager/sceneManager.d.ts +32 -32
  42. package/dist/lib-cjs/api/manager/sceneManager.js +132 -132
  43. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +90 -90
  44. package/dist/lib-cjs/api/manager/variantInstanceManager.js +321 -321
  45. package/dist/lib-cjs/api/store/specStorage.d.ts +24 -24
  46. package/dist/lib-cjs/api/store/specStorage.js +51 -51
  47. package/dist/lib-cjs/api/util/babylonHelper.d.ts +175 -175
  48. package/dist/lib-cjs/api/util/babylonHelper.js +520 -520
  49. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  50. package/dist/lib-cjs/api/util/globalTypes.d.ts +333 -333
  51. package/dist/lib-cjs/api/util/globalTypes.js +1 -1
  52. package/dist/lib-cjs/api/util/resourceHelper.d.ts +53 -53
  53. package/dist/lib-cjs/api/util/resourceHelper.js +240 -240
  54. package/dist/lib-cjs/api/util/stringHelper.d.ts +9 -9
  55. package/dist/lib-cjs/api/util/stringHelper.js +25 -25
  56. package/dist/lib-cjs/buildinfo.json +3 -3
  57. package/dist/lib-cjs/index.d.ts +48 -48
  58. package/dist/lib-cjs/index.js +86 -86
  59. package/dist/webpack-stats.json +0 -0
  60. package/package.json +83 -83
  61. package/src/api/classes/animationInterface.ts +11 -11
  62. package/src/api/classes/dottedPath.ts +189 -189
  63. package/src/api/classes/element.ts +644 -644
  64. package/src/api/classes/event.ts +370 -370
  65. package/src/api/classes/eventBroadcaster.ts +54 -54
  66. package/src/api/classes/parameter.ts +408 -408
  67. package/src/api/classes/parameterObservable.ts +99 -99
  68. package/src/api/classes/parameterizable.ts +89 -89
  69. package/src/api/classes/placementAnimation.ts +143 -143
  70. package/src/api/classes/variant.ts +817 -817
  71. package/src/api/classes/variantInstance.ts +88 -88
  72. package/src/api/classes/variantParameterizable.ts +73 -73
  73. package/src/api/classes/viewer.ts +487 -478
  74. package/src/api/classes/viewerLight.ts +330 -330
  75. package/src/api/internal/debugViewer.ts +81 -81
  76. package/src/api/internal/lensRendering.ts +10 -10
  77. package/src/api/internal/sceneSetup.ts +193 -193
  78. package/src/api/manager/animationManager.ts +116 -116
  79. package/src/api/manager/sceneManager.ts +105 -105
  80. package/src/api/manager/variantInstanceManager.ts +236 -236
  81. package/src/api/store/specStorage.ts +53 -53
  82. package/src/api/util/babylonHelper.ts +555 -553
  83. package/src/api/util/globalTypes.ts +379 -379
  84. package/src/api/util/resourceHelper.ts +184 -184
  85. package/src/api/util/stringHelper.ts +25 -25
  86. package/src/buildinfo.json +2 -2
  87. package/src/commonjs.tsconfig.json +13 -13
  88. package/src/declaration.tsconfig.json +10 -10
  89. package/src/dev.ts +42 -42
  90. package/src/es6.tsconfig.json +13 -13
  91. package/src/index.ts +91 -91
  92. package/src/pagesconfig.json +61 -61
  93. package/src/tsconfig.json +43 -43
  94. package/src/tsconfig.types.json +9 -9
  95. package/src/types.d.ts +4 -4
@@ -1,521 +1,521 @@
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.moveTransformNode = exports.rotateTransformNode = 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 _prefix = dottedPath_1.DottedPath.create(prefix).addParts([
115
- 'node',
116
- node.uniqueId.toString()
117
- ]);
118
- node.material = node.material.clone(_prefix.path);
119
- }
120
- if (deep) {
121
- var children = node.getChildTransformNodes(true);
122
- children.forEach(function (child) { return cloneTransformNodeMaterial(child, prefix, deep); });
123
- }
124
- return node;
125
- };
126
- exports.cloneTransformNodeMaterial = cloneTransformNodeMaterial;
127
- /**
128
- * @param node
129
- * @param deep
130
- * @param metadata
131
- */
132
- var injectNodeMetadata = function (node, metadata, deep) {
133
- if (deep === void 0) { deep = true; }
134
- node.metadata = lodash_es_1.merge({}, node.metadata, metadata);
135
- if (deep && node instanceof transformNode_1.TransformNode) {
136
- var children = node.getChildTransformNodes(true);
137
- children.forEach(function (child) { return injectNodeMetadata(child, metadata, deep); });
138
- }
139
- };
140
- exports.injectNodeMetadata = injectNodeMetadata;
141
- /**
142
- * @param node
143
- * @param assertCallable
144
- * @param callableParameters
145
- * @param deep
146
- */
147
- var assertTransformNode = function (node, assertCallable, callableParameters, deep) {
148
- if (callableParameters === void 0) { callableParameters = []; }
149
- if (deep === void 0) { deep = true; }
150
- assertCallable.apply(void 0, tslib_1.__spreadArrays([node], callableParameters));
151
- if (deep) {
152
- var children = node.getChildTransformNodes(true);
153
- children.forEach(function (child) { return assertTransformNode(child, assertCallable, callableParameters, deep); });
154
- }
155
- };
156
- exports.assertTransformNode = assertTransformNode;
157
- /**
158
- * @param node
159
- * @param deep
160
- */
161
- var activateTransformNode = function (node, deep) {
162
- if (deep === void 0) { deep = true; }
163
- node.setEnabled(true);
164
- /*
165
- if( node instanceof AbstractMesh ) {
166
- node.visibility = 1;
167
- node.isPickable = true;
168
- }
169
- */
170
- if (deep) {
171
- node.getChildTransformNodes(true).forEach(function (child) { return activateTransformNode(child, deep); });
172
- }
173
- };
174
- exports.activateTransformNode = activateTransformNode;
175
- /**
176
- * @param node
177
- * @param deep
178
- */
179
- var deactivateTransformNode = function (node, deep) {
180
- if (deep === void 0) { deep = true; }
181
- node.setEnabled(false);
182
- /*
183
- if( node instanceof AbstractMesh ) {
184
- node.visibility = 0;
185
- node.isPickable = false;
186
- }
187
- */
188
- if (deep) {
189
- node.getChildTransformNodes(true).forEach(function (child) { return deactivateTransformNode(child, deep); });
190
- }
191
- };
192
- exports.deactivateTransformNode = deactivateTransformNode;
193
- /**
194
- * @param node
195
- */
196
- var enableNodeWithParents = function (node) {
197
- node.setEnabled(true);
198
- if (node.parent) {
199
- enableNodeWithParents(node.parent);
200
- }
201
- };
202
- exports.enableNodeWithParents = enableNodeWithParents;
203
- /**
204
- * @param node
205
- */
206
- var disableNodeWithParents = function (node) {
207
- node.setEnabled(false);
208
- if (node.parent) {
209
- disableNodeWithParents(node.parent);
210
- }
211
- };
212
- exports.disableNodeWithParents = disableNodeWithParents;
213
- /**
214
- * Attention: this function mutates the position of a node. Keep in mind that there are dependencies to other
215
- * functions moving nodes around.
216
- * @param node
217
- * @param rotation
218
- */
219
- var rotateTransformNode = function (node, rotation) {
220
- var _a;
221
- // remember absolute rotation and reset it before translating
222
- if (!lodash_es_1.has(node.metadata, 'rotation.initial')) {
223
- injectNodeMetadata(node, { 'rotation.initial': (_a = node.rotationQuaternion) === null || _a === void 0 ? void 0 : _a.asArray() }, false);
224
- }
225
- if (!lodash_es_1.has(node.metadata, 'rotation.position') || lodash_es_1.get(node.metadata, 'position.dirty')) {
226
- var rotationPosition = node.absolutePosition.clone();
227
- if (lodash_es_1.has(node.metadata, 'rotation.offset')) {
228
- rotationPosition = rotationPosition.subtract(lodash_es_1.get(node.metadata, 'rotation.offset'));
229
- }
230
- injectNodeMetadata(node, { 'rotation.position': rotationPosition }, false);
231
- injectNodeMetadata(node, { 'position.dirty': false }, false);
232
- }
233
- node.setAbsolutePosition(lodash_es_1.get(node.metadata, 'rotation.position'));
234
- if (node.metadata.rotation) {
235
- node.rotationQuaternion = math_vector_1.Quaternion.FromArray(lodash_es_1.get(node.metadata, 'rotation.initial'));
236
- }
237
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.X, rotation.x);
238
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Y, rotation.y);
239
- node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Z, rotation.z);
240
- node.computeWorldMatrix(true);
241
- injectNodeMetadata(node, {
242
- 'rotation.offset': node.absolutePosition.subtract(lodash_es_1.get(node.metadata, 'rotation.position'))
243
- }, false);
244
- return node;
245
- };
246
- exports.rotateTransformNode = rotateTransformNode;
247
- /**
248
- * Attention: this function mutates the position of a node. Keep in mind that there are dependencies to other
249
- * functions moving nodes around.
250
- * @param node
251
- * @param distance
252
- */
253
- var moveTransformNode = function (node, distance) {
254
- // remember absolute position and reset it before translating
255
- if (!lodash_es_1.has(node.metadata, 'position.initial')) {
256
- injectNodeMetadata(node, { 'position.initial': node.absolutePosition.clone() }, false);
257
- }
258
- var position = lodash_es_1.get(node.metadata, 'position.initial');
259
- if (lodash_es_1.has(node.metadata, 'rotation.offset')) {
260
- position = position.add(lodash_es_1.get(node.metadata, 'rotation.offset'));
261
- }
262
- node.setAbsolutePosition(position.add(distance));
263
- injectNodeMetadata(node, { 'position.dirty': true }, false);
264
- return node;
265
- };
266
- exports.moveTransformNode = moveTransformNode;
267
- /**
268
- * @param node
269
- * @param material
270
- * @param deep
271
- */
272
- var setMaterial = function (node, material, deep) {
273
- if (deep === void 0) { deep = true; }
274
- if (node instanceof abstractMesh_1.AbstractMesh) {
275
- node.material = material;
276
- }
277
- if (deep) {
278
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterial(child, material, deep); });
279
- }
280
- };
281
- exports.setMaterial = setMaterial;
282
- /**
283
- * !!! Warning !!!
284
- * This function is not public API. Whilst it can help solving certain problems, it only works reliably in well defined
285
- * situations and can cause unwanted side effects under some conditions. Use carefully at your own risk!
286
- *
287
- * See https://combeenation.myjetbrains.com/youtrack/issue/CB-5906 for further details regarding this warning.
288
- *
289
- * Set material of an instanced meshes source mesh.
290
- * Changes the material of all instanced meshes which have the same source mesh.
291
- *
292
- * @param node
293
- * @param material
294
- * @param deep
295
- *
296
- * @ignore
297
- */
298
- var setSourceNodeMaterial = function (node, material, deep) {
299
- if (deep === void 0) { deep = true; }
300
- 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!";
301
- console.warn("!!! Warning !!!\n" + warn);
302
- if (node instanceof instancedMesh_1.InstancedMesh) {
303
- node.sourceMesh.material = material;
304
- }
305
- if (deep) {
306
- node.getChildTransformNodes(true).forEach(function (child) { return setSourceNodeMaterial(child, material, deep); });
307
- }
308
- };
309
- exports.setSourceNodeMaterial = setSourceNodeMaterial;
310
- /**
311
- * @param node
312
- * @param color
313
- * @param deep
314
- */
315
- var setMaterialColor = function (node, color, deep) {
316
- if (deep === void 0) { deep = true; }
317
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
318
- var materialCls = node.material.getClassName();
319
- switch (materialCls) {
320
- case 'PBRMaterial':
321
- node.material.albedoColor = color.toLinearSpace();
322
- break;
323
- case 'StandardMaterial':
324
- node.material.diffuseColor = color;
325
- break;
326
- default:
327
- throw new Error("Setting color for material of instance \"" + materialCls + "\" not implemented (yet).");
328
- }
329
- }
330
- if (deep) {
331
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialColor(child, color, deep); });
332
- }
333
- };
334
- exports.setMaterialColor = setMaterialColor;
335
- /**
336
- * @param node
337
- * @param texture
338
- * @param deep
339
- */
340
- var setMaterialTexture = function (node, texture, deep) {
341
- if (deep === void 0) { deep = true; }
342
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
343
- var materialCls = node.material.getClassName();
344
- switch (materialCls) {
345
- case 'PBRMaterial':
346
- node.material.albedoTexture = texture;
347
- break;
348
- case 'StandardMaterial':
349
- node.material.diffuseTexture = texture;
350
- break;
351
- default:
352
- throw new Error("Setting texture for material of instance \"" + materialCls + "\" not implemented (yet).");
353
- }
354
- }
355
- if (deep) {
356
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialTexture(child, texture, deep); });
357
- }
358
- };
359
- exports.setMaterialTexture = setMaterialTexture;
360
- /**
361
- * @param node
362
- * @param metallness
363
- * @param deep
364
- */
365
- var setMaterialMetallness = function (node, metallness, deep) {
366
- if (deep === void 0) { deep = true; }
367
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
368
- var materialCls = node.material.getClassName();
369
- switch (materialCls) {
370
- case 'PBRMaterial':
371
- node.material.metallic = metallness;
372
- break;
373
- default:
374
- throw new Error("Setting metallness for material of instance \"" + materialCls + "\" not implemented (yet).");
375
- }
376
- }
377
- if (deep) {
378
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialMetallness(child, metallness, deep); });
379
- }
380
- };
381
- exports.setMaterialMetallness = setMaterialMetallness;
382
- /**
383
- * @param node
384
- * @param roughness
385
- * @param deep
386
- */
387
- var setMaterialRoughness = function (node, roughness, deep) {
388
- if (deep === void 0) { deep = true; }
389
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
390
- var materialCls = node.material.getClassName();
391
- switch (materialCls) {
392
- case 'PBRMaterial':
393
- node.material.roughness = roughness;
394
- break;
395
- case 'StandardMaterial':
396
- node.material.roughness = roughness;
397
- break;
398
- default:
399
- throw new Error("Setting roughness for material of instance \"" + materialCls + "\" not implemented (yet).");
400
- }
401
- }
402
- if (deep) {
403
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialRoughness(child, roughness, deep); });
404
- }
405
- };
406
- exports.setMaterialRoughness = setMaterialRoughness;
407
- /**
408
- * @param node
409
- * @param layer
410
- * @param color
411
- * @param deep
412
- */
413
- var addToHighlightLayer = function (layer, color, node, deep) {
414
- if (deep === void 0) { deep = true; }
415
- if (node instanceof abstractMesh_1.AbstractMesh) {
416
- layer.addMesh(node, color);
417
- }
418
- if (deep) {
419
- node.getChildTransformNodes(true).forEach(function (child) { return addToHighlightLayer(layer, color, child, deep); });
420
- }
421
- };
422
- exports.addToHighlightLayer = addToHighlightLayer;
423
- /**
424
- * @param node
425
- * @param layer
426
- * @param deep
427
- */
428
- var removeFromHighlightLayer = function (layer, node, deep) {
429
- if (deep === void 0) { deep = true; }
430
- if (node instanceof abstractMesh_1.AbstractMesh) {
431
- layer.removeMesh(node);
432
- }
433
- if (deep) {
434
- node.getChildTransformNodes(true).forEach(function (child) { return removeFromHighlightLayer(layer, child, deep); });
435
- }
436
- };
437
- exports.removeFromHighlightLayer = removeFromHighlightLayer;
438
- /**
439
- * @param node
440
- * @param receiveShadows
441
- * @param deep
442
- */
443
- var setReceiveShadows = function (node, receiveShadows, deep) {
444
- if (deep === void 0) { deep = true; }
445
- if (node instanceof abstractMesh_1.AbstractMesh) {
446
- node.receiveShadows = receiveShadows;
447
- }
448
- if (deep) {
449
- node.getChildTransformNodes(true).forEach(function (child) { return setReceiveShadows(child, receiveShadows, deep); });
450
- }
451
- };
452
- exports.setReceiveShadows = setReceiveShadows;
453
- /**
454
- * @param node
455
- * @param generator
456
- * @param deep
457
- */
458
- var addToShadowGenerator = function (generator, node, deep) {
459
- if (deep === void 0) { deep = true; }
460
- if (node instanceof abstractMesh_1.AbstractMesh) {
461
- // We have to remove the node because there's no duplicate check in babylon
462
- generator.removeShadowCaster(node, false);
463
- generator.addShadowCaster(node, false);
464
- }
465
- if (deep) {
466
- node.getChildTransformNodes(true).forEach(function (child) { return addToShadowGenerator(generator, child, deep); });
467
- }
468
- };
469
- exports.addToShadowGenerator = addToShadowGenerator;
470
- /**
471
- * @param node
472
- * @param generator
473
- * @param deep
474
- */
475
- var removeFromShadowGenerator = function (generator, node, deep) {
476
- if (deep === void 0) { deep = true; }
477
- if (node instanceof abstractMesh_1.AbstractMesh) {
478
- generator.removeShadowCaster(node, false);
479
- }
480
- if (deep) {
481
- node.getChildTransformNodes(true).forEach(function (child) { return removeFromShadowGenerator(generator, child, deep); });
482
- }
483
- };
484
- exports.removeFromShadowGenerator = removeFromShadowGenerator;
485
- /**
486
- * https://forum.babylonjs.com/t/get-mesh-bounding-box-position-and-size-in-2d-screen-coordinates/1058/3
487
- * @param mesh
488
- * @param scene
489
- * @param canvas
490
- */
491
- var getClientRectFromMesh = function (mesh, scene, canvas) {
492
- // get bounding box of the mesh
493
- var meshVectors = mesh.getBoundingInfo().boundingBox.vectors;
494
- // get the matrix and viewport needed to project the vectors onto the screen
495
- var worldMatrix = mesh.getWorldMatrix();
496
- var transformMatrix = scene.getTransformMatrix();
497
- var viewport = scene.activeCamera.viewport;
498
- // loop though all the vectors and project them against the current camera viewport to get a set of coordinates
499
- var coordinates = meshVectors.map(function (vector) {
500
- var projection = math_vector_1.Vector3.Project(vector, worldMatrix, transformMatrix, viewport);
501
- projection.x = projection.x * canvas.clientWidth;
502
- projection.y = projection.y * canvas.clientHeight;
503
- return projection;
504
- });
505
- // get the min and max for all the coordinates so we can calculate the largest possible screen size
506
- var maxX = Math.max.apply(Math, coordinates.map(function (o) { return o.x; }));
507
- var minX = Math.min.apply(Math, coordinates.map(function (o) { return o.x; }));
508
- var maxY = Math.max.apply(Math, coordinates.map(function (o) { return o.y; }));
509
- var minY = Math.min.apply(Math, coordinates.map(function (o) { return o.y; }));
510
- // return a ClientRect from this
511
- return {
512
- width: maxX - minX,
513
- height: maxY - minY,
514
- left: minX,
515
- top: minY,
516
- right: maxX,
517
- bottom: maxY,
518
- };
519
- };
520
- exports.getClientRectFromMesh = getClientRectFromMesh;
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.moveTransformNode = exports.rotateTransformNode = 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 _prefix = dottedPath_1.DottedPath.create(prefix).addParts([
115
+ 'node',
116
+ node.uniqueId.toString()
117
+ ]);
118
+ node.material = node.material.clone(_prefix.path);
119
+ }
120
+ if (deep) {
121
+ var children = node.getChildTransformNodes(true);
122
+ children.forEach(function (child) { return cloneTransformNodeMaterial(child, prefix, deep); });
123
+ }
124
+ return node;
125
+ };
126
+ exports.cloneTransformNodeMaterial = cloneTransformNodeMaterial;
127
+ /**
128
+ * @param node
129
+ * @param deep
130
+ * @param metadata
131
+ */
132
+ var injectNodeMetadata = function (node, metadata, deep) {
133
+ if (deep === void 0) { deep = true; }
134
+ node.metadata = lodash_es_1.merge({}, node.metadata, metadata);
135
+ if (deep && node instanceof transformNode_1.TransformNode) {
136
+ var children = node.getChildTransformNodes(true);
137
+ children.forEach(function (child) { return injectNodeMetadata(child, metadata, deep); });
138
+ }
139
+ };
140
+ exports.injectNodeMetadata = injectNodeMetadata;
141
+ /**
142
+ * @param node
143
+ * @param assertCallable
144
+ * @param callableParameters
145
+ * @param deep
146
+ */
147
+ var assertTransformNode = function (node, assertCallable, callableParameters, deep) {
148
+ if (callableParameters === void 0) { callableParameters = []; }
149
+ if (deep === void 0) { deep = true; }
150
+ assertCallable.apply(void 0, tslib_1.__spreadArrays([node], callableParameters));
151
+ if (deep) {
152
+ var children = node.getChildTransformNodes(true);
153
+ children.forEach(function (child) { return assertTransformNode(child, assertCallable, callableParameters, deep); });
154
+ }
155
+ };
156
+ exports.assertTransformNode = assertTransformNode;
157
+ /**
158
+ * @param node
159
+ * @param deep
160
+ */
161
+ var activateTransformNode = function (node, deep) {
162
+ if (deep === void 0) { deep = true; }
163
+ node.setEnabled(true);
164
+ /*
165
+ if( node instanceof AbstractMesh ) {
166
+ node.visibility = 1;
167
+ node.isPickable = true;
168
+ }
169
+ */
170
+ if (deep) {
171
+ node.getChildTransformNodes(true).forEach(function (child) { return activateTransformNode(child, deep); });
172
+ }
173
+ };
174
+ exports.activateTransformNode = activateTransformNode;
175
+ /**
176
+ * @param node
177
+ * @param deep
178
+ */
179
+ var deactivateTransformNode = function (node, deep) {
180
+ if (deep === void 0) { deep = true; }
181
+ node.setEnabled(false);
182
+ /*
183
+ if( node instanceof AbstractMesh ) {
184
+ node.visibility = 0;
185
+ node.isPickable = false;
186
+ }
187
+ */
188
+ if (deep) {
189
+ node.getChildTransformNodes(true).forEach(function (child) { return deactivateTransformNode(child, deep); });
190
+ }
191
+ };
192
+ exports.deactivateTransformNode = deactivateTransformNode;
193
+ /**
194
+ * @param node
195
+ */
196
+ var enableNodeWithParents = function (node) {
197
+ node.setEnabled(true);
198
+ if (node.parent) {
199
+ enableNodeWithParents(node.parent);
200
+ }
201
+ };
202
+ exports.enableNodeWithParents = enableNodeWithParents;
203
+ /**
204
+ * @param node
205
+ */
206
+ var disableNodeWithParents = function (node) {
207
+ node.setEnabled(false);
208
+ if (node.parent) {
209
+ disableNodeWithParents(node.parent);
210
+ }
211
+ };
212
+ exports.disableNodeWithParents = disableNodeWithParents;
213
+ /**
214
+ * Attention: this function mutates the position of a node. Keep in mind that there are dependencies to other
215
+ * functions moving nodes around.
216
+ * @param node
217
+ * @param rotation
218
+ */
219
+ var rotateTransformNode = function (node, rotation) {
220
+ // remember absolute rotation and reset it before translating
221
+ if (!lodash_es_1.has(node.metadata, 'rotation.initial')) {
222
+ var rotationQuaternion = node.rotationQuaternion;
223
+ if (!rotationQuaternion) {
224
+ rotationQuaternion = math_vector_1.Quaternion.RotationYawPitchRoll(node.rotation.x, node.rotation.y, node.rotation.z);
225
+ }
226
+ injectNodeMetadata(node, { 'rotation.initial': rotationQuaternion.asArray() }, false);
227
+ }
228
+ if (!lodash_es_1.has(node.metadata, 'rotation.position') || lodash_es_1.get(node.metadata, 'position.dirty')) {
229
+ var rotationPosition = node.absolutePosition.clone();
230
+ if (lodash_es_1.has(node.metadata, 'rotation.offset')) {
231
+ rotationPosition = rotationPosition.subtract(lodash_es_1.get(node.metadata, 'rotation.offset'));
232
+ }
233
+ injectNodeMetadata(node, { 'rotation.position': rotationPosition }, false);
234
+ injectNodeMetadata(node, { 'position.dirty': false }, false);
235
+ }
236
+ node.setAbsolutePosition(lodash_es_1.get(node.metadata, 'rotation.position'));
237
+ node.rotationQuaternion = math_vector_1.Quaternion.FromArray(lodash_es_1.get(node.metadata, 'rotation.initial'));
238
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.X, rotation.x);
239
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Y, rotation.y);
240
+ node.rotateAround(math_vector_1.Vector3.Zero(), math_axis_1.Axis.Z, rotation.z);
241
+ node.computeWorldMatrix(true);
242
+ var rotationOffset = node.absolutePosition.subtract(lodash_es_1.get(node.metadata, 'rotation.position'));
243
+ injectNodeMetadata(node, { 'rotation.offset': rotationOffset }, false);
244
+ return node;
245
+ };
246
+ exports.rotateTransformNode = rotateTransformNode;
247
+ /**
248
+ * Attention: this function mutates the position of a node. Keep in mind that there are dependencies to other
249
+ * functions moving nodes around.
250
+ * @param node
251
+ * @param distance
252
+ */
253
+ var moveTransformNode = function (node, distance) {
254
+ // remember absolute position and reset it before translating
255
+ if (!lodash_es_1.has(node.metadata, 'position.initial')) {
256
+ injectNodeMetadata(node, { 'position.initial': node.absolutePosition.clone() }, false);
257
+ }
258
+ var position = lodash_es_1.get(node.metadata, 'position.initial');
259
+ if (lodash_es_1.has(node.metadata, 'rotation.offset')) {
260
+ position = position.add(lodash_es_1.get(node.metadata, 'rotation.offset'));
261
+ }
262
+ node.setAbsolutePosition(position.add(distance));
263
+ injectNodeMetadata(node, { 'position.dirty': true }, false);
264
+ return node;
265
+ };
266
+ exports.moveTransformNode = moveTransformNode;
267
+ /**
268
+ * @param node
269
+ * @param material
270
+ * @param deep
271
+ */
272
+ var setMaterial = function (node, material, deep) {
273
+ if (deep === void 0) { deep = true; }
274
+ if (node instanceof abstractMesh_1.AbstractMesh) {
275
+ node.material = material;
276
+ }
277
+ if (deep) {
278
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterial(child, material, deep); });
279
+ }
280
+ };
281
+ exports.setMaterial = setMaterial;
282
+ /**
283
+ * !!! Warning !!!
284
+ * This function is not public API. Whilst it can help solving certain problems, it only works reliably in well defined
285
+ * situations and can cause unwanted side effects under some conditions. Use carefully at your own risk!
286
+ *
287
+ * See https://combeenation.myjetbrains.com/youtrack/issue/CB-5906 for further details regarding this warning.
288
+ *
289
+ * Set material of an instanced meshes source mesh.
290
+ * Changes the material of all instanced meshes which have the same source mesh.
291
+ *
292
+ * @param node
293
+ * @param material
294
+ * @param deep
295
+ *
296
+ * @ignore
297
+ */
298
+ var setSourceNodeMaterial = function (node, material, deep) {
299
+ if (deep === void 0) { deep = true; }
300
+ 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!";
301
+ console.warn("!!! Warning !!!\n" + warn);
302
+ if (node instanceof instancedMesh_1.InstancedMesh) {
303
+ node.sourceMesh.material = material;
304
+ }
305
+ if (deep) {
306
+ node.getChildTransformNodes(true).forEach(function (child) { return setSourceNodeMaterial(child, material, deep); });
307
+ }
308
+ };
309
+ exports.setSourceNodeMaterial = setSourceNodeMaterial;
310
+ /**
311
+ * @param node
312
+ * @param color
313
+ * @param deep
314
+ */
315
+ var setMaterialColor = function (node, color, deep) {
316
+ if (deep === void 0) { deep = true; }
317
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
318
+ var materialCls = node.material.getClassName();
319
+ switch (materialCls) {
320
+ case 'PBRMaterial':
321
+ node.material.albedoColor = color.toLinearSpace();
322
+ break;
323
+ case 'StandardMaterial':
324
+ node.material.diffuseColor = color;
325
+ break;
326
+ default:
327
+ throw new Error("Setting color for material of instance \"" + materialCls + "\" not implemented (yet).");
328
+ }
329
+ }
330
+ if (deep) {
331
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialColor(child, color, deep); });
332
+ }
333
+ };
334
+ exports.setMaterialColor = setMaterialColor;
335
+ /**
336
+ * @param node
337
+ * @param texture
338
+ * @param deep
339
+ */
340
+ var setMaterialTexture = function (node, texture, deep) {
341
+ if (deep === void 0) { deep = true; }
342
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
343
+ var materialCls = node.material.getClassName();
344
+ switch (materialCls) {
345
+ case 'PBRMaterial':
346
+ node.material.albedoTexture = texture;
347
+ break;
348
+ case 'StandardMaterial':
349
+ node.material.diffuseTexture = texture;
350
+ break;
351
+ default:
352
+ throw new Error("Setting texture for material of instance \"" + materialCls + "\" not implemented (yet).");
353
+ }
354
+ }
355
+ if (deep) {
356
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialTexture(child, texture, deep); });
357
+ }
358
+ };
359
+ exports.setMaterialTexture = setMaterialTexture;
360
+ /**
361
+ * @param node
362
+ * @param metallness
363
+ * @param deep
364
+ */
365
+ var setMaterialMetallness = function (node, metallness, deep) {
366
+ if (deep === void 0) { deep = true; }
367
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
368
+ var materialCls = node.material.getClassName();
369
+ switch (materialCls) {
370
+ case 'PBRMaterial':
371
+ node.material.metallic = metallness;
372
+ break;
373
+ default:
374
+ throw new Error("Setting metallness for material of instance \"" + materialCls + "\" not implemented (yet).");
375
+ }
376
+ }
377
+ if (deep) {
378
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialMetallness(child, metallness, deep); });
379
+ }
380
+ };
381
+ exports.setMaterialMetallness = setMaterialMetallness;
382
+ /**
383
+ * @param node
384
+ * @param roughness
385
+ * @param deep
386
+ */
387
+ var setMaterialRoughness = function (node, roughness, deep) {
388
+ if (deep === void 0) { deep = true; }
389
+ if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
390
+ var materialCls = node.material.getClassName();
391
+ switch (materialCls) {
392
+ case 'PBRMaterial':
393
+ node.material.roughness = roughness;
394
+ break;
395
+ case 'StandardMaterial':
396
+ node.material.roughness = roughness;
397
+ break;
398
+ default:
399
+ throw new Error("Setting roughness for material of instance \"" + materialCls + "\" not implemented (yet).");
400
+ }
401
+ }
402
+ if (deep) {
403
+ node.getChildTransformNodes(true).forEach(function (child) { return setMaterialRoughness(child, roughness, deep); });
404
+ }
405
+ };
406
+ exports.setMaterialRoughness = setMaterialRoughness;
407
+ /**
408
+ * @param node
409
+ * @param layer
410
+ * @param color
411
+ * @param deep
412
+ */
413
+ var addToHighlightLayer = function (layer, color, node, deep) {
414
+ if (deep === void 0) { deep = true; }
415
+ if (node instanceof abstractMesh_1.AbstractMesh) {
416
+ layer.addMesh(node, color);
417
+ }
418
+ if (deep) {
419
+ node.getChildTransformNodes(true).forEach(function (child) { return addToHighlightLayer(layer, color, child, deep); });
420
+ }
421
+ };
422
+ exports.addToHighlightLayer = addToHighlightLayer;
423
+ /**
424
+ * @param node
425
+ * @param layer
426
+ * @param deep
427
+ */
428
+ var removeFromHighlightLayer = function (layer, node, deep) {
429
+ if (deep === void 0) { deep = true; }
430
+ if (node instanceof abstractMesh_1.AbstractMesh) {
431
+ layer.removeMesh(node);
432
+ }
433
+ if (deep) {
434
+ node.getChildTransformNodes(true).forEach(function (child) { return removeFromHighlightLayer(layer, child, deep); });
435
+ }
436
+ };
437
+ exports.removeFromHighlightLayer = removeFromHighlightLayer;
438
+ /**
439
+ * @param node
440
+ * @param receiveShadows
441
+ * @param deep
442
+ */
443
+ var setReceiveShadows = function (node, receiveShadows, deep) {
444
+ if (deep === void 0) { deep = true; }
445
+ if (node instanceof abstractMesh_1.AbstractMesh) {
446
+ node.receiveShadows = receiveShadows;
447
+ }
448
+ if (deep) {
449
+ node.getChildTransformNodes(true).forEach(function (child) { return setReceiveShadows(child, receiveShadows, deep); });
450
+ }
451
+ };
452
+ exports.setReceiveShadows = setReceiveShadows;
453
+ /**
454
+ * @param node
455
+ * @param generator
456
+ * @param deep
457
+ */
458
+ var addToShadowGenerator = function (generator, node, deep) {
459
+ if (deep === void 0) { deep = true; }
460
+ if (node instanceof abstractMesh_1.AbstractMesh) {
461
+ // We have to remove the node because there's no duplicate check in babylon
462
+ generator.removeShadowCaster(node, false);
463
+ generator.addShadowCaster(node, false);
464
+ }
465
+ if (deep) {
466
+ node.getChildTransformNodes(true).forEach(function (child) { return addToShadowGenerator(generator, child, deep); });
467
+ }
468
+ };
469
+ exports.addToShadowGenerator = addToShadowGenerator;
470
+ /**
471
+ * @param node
472
+ * @param generator
473
+ * @param deep
474
+ */
475
+ var removeFromShadowGenerator = function (generator, node, deep) {
476
+ if (deep === void 0) { deep = true; }
477
+ if (node instanceof abstractMesh_1.AbstractMesh) {
478
+ generator.removeShadowCaster(node, false);
479
+ }
480
+ if (deep) {
481
+ node.getChildTransformNodes(true).forEach(function (child) { return removeFromShadowGenerator(generator, child, deep); });
482
+ }
483
+ };
484
+ exports.removeFromShadowGenerator = removeFromShadowGenerator;
485
+ /**
486
+ * https://forum.babylonjs.com/t/get-mesh-bounding-box-position-and-size-in-2d-screen-coordinates/1058/3
487
+ * @param mesh
488
+ * @param scene
489
+ * @param canvas
490
+ */
491
+ var getClientRectFromMesh = function (mesh, scene, canvas) {
492
+ // get bounding box of the mesh
493
+ var meshVectors = mesh.getBoundingInfo().boundingBox.vectors;
494
+ // get the matrix and viewport needed to project the vectors onto the screen
495
+ var worldMatrix = mesh.getWorldMatrix();
496
+ var transformMatrix = scene.getTransformMatrix();
497
+ var viewport = scene.activeCamera.viewport;
498
+ // loop though all the vectors and project them against the current camera viewport to get a set of coordinates
499
+ var coordinates = meshVectors.map(function (vector) {
500
+ var projection = math_vector_1.Vector3.Project(vector, worldMatrix, transformMatrix, viewport);
501
+ projection.x = projection.x * canvas.clientWidth;
502
+ projection.y = projection.y * canvas.clientHeight;
503
+ return projection;
504
+ });
505
+ // get the min and max for all the coordinates so we can calculate the largest possible screen size
506
+ var maxX = Math.max.apply(Math, coordinates.map(function (o) { return o.x; }));
507
+ var minX = Math.min.apply(Math, coordinates.map(function (o) { return o.x; }));
508
+ var maxY = Math.max.apply(Math, coordinates.map(function (o) { return o.y; }));
509
+ var minY = Math.min.apply(Math, coordinates.map(function (o) { return o.y; }));
510
+ // return a ClientRect from this
511
+ return {
512
+ width: maxX - minX,
513
+ height: maxY - minY,
514
+ left: minX,
515
+ top: minY,
516
+ right: maxX,
517
+ bottom: maxY,
518
+ };
519
+ };
520
+ exports.getClientRectFromMesh = getClientRectFromMesh;
521
521
  //# sourceMappingURL=babylonHelper.js.map