@combeenation/3d-viewer 4.0.0-beta2 → 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 (105) hide show
  1. package/README.md +114 -112
  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 -126
  7. package/dist/lib-cjs/api/classes/element.js +743 -674
  8. package/dist/lib-cjs/api/classes/element.js.map +1 -1
  9. package/dist/lib-cjs/api/classes/elementParameterizable.d.ts +14 -14
  10. package/dist/lib-cjs/api/classes/elementParameterizable.js +134 -134
  11. package/dist/lib-cjs/api/classes/event.d.ts +326 -312
  12. package/dist/lib-cjs/api/classes/event.js +371 -357
  13. package/dist/lib-cjs/api/classes/event.js.map +1 -1
  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 +259 -165
  17. package/dist/lib-cjs/api/classes/parameter.js +387 -267
  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 -126
  21. package/dist/lib-cjs/api/classes/parameterObservable.js.map +1 -1
  22. package/dist/lib-cjs/api/classes/parameterizable.d.ts +15 -15
  23. package/dist/lib-cjs/api/classes/parameterizable.js +149 -149
  24. package/dist/lib-cjs/api/classes/placementAnimation.d.ts +38 -38
  25. package/dist/lib-cjs/api/classes/placementAnimation.js +149 -138
  26. package/dist/lib-cjs/api/classes/placementAnimation.js.map +1 -1
  27. package/dist/lib-cjs/api/classes/variant.d.ts +234 -190
  28. package/dist/lib-cjs/api/classes/variant.js +1147 -873
  29. package/dist/lib-cjs/api/classes/variant.js.map +1 -1
  30. package/dist/lib-cjs/api/classes/variantInstance.d.ts +45 -41
  31. package/dist/lib-cjs/api/classes/variantInstance.js +108 -98
  32. package/dist/lib-cjs/api/classes/variantInstance.js.map +1 -1
  33. package/dist/lib-cjs/api/classes/variantParameterizable.d.ts +17 -17
  34. package/dist/lib-cjs/api/classes/variantParameterizable.js +92 -92
  35. package/dist/lib-cjs/api/classes/viewer.d.ts +131 -128
  36. package/dist/lib-cjs/api/classes/viewer.js +567 -486
  37. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  38. package/dist/lib-cjs/api/classes/viewerLight.d.ts +66 -66
  39. package/dist/lib-cjs/api/classes/viewerLight.js +389 -389
  40. package/dist/lib-cjs/api/internal/debugViewer.d.ts +13 -13
  41. package/dist/lib-cjs/api/internal/debugViewer.js +87 -87
  42. package/dist/lib-cjs/api/internal/lensRendering.d.ts +8 -8
  43. package/dist/lib-cjs/api/internal/lensRendering.js +11 -11
  44. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +10 -6
  45. package/dist/lib-cjs/api/internal/sceneSetup.js +231 -227
  46. package/dist/lib-cjs/api/internal/sceneSetup.js.map +1 -1
  47. package/dist/lib-cjs/api/manager/animationManager.d.ts +29 -29
  48. package/dist/lib-cjs/api/manager/animationManager.js +121 -121
  49. package/dist/lib-cjs/api/manager/sceneManager.d.ts +32 -32
  50. package/dist/lib-cjs/api/manager/sceneManager.js +132 -132
  51. package/dist/lib-cjs/api/manager/variantInstanceManager.d.ts +90 -90
  52. package/dist/lib-cjs/api/manager/variantInstanceManager.js +321 -321
  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 +175 -125
  56. package/dist/lib-cjs/api/util/babylonHelper.js +520 -368
  57. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  58. package/dist/lib-cjs/api/util/globalTypes.d.ts +333 -279
  59. package/dist/lib-cjs/api/util/globalTypes.js +1 -1
  60. package/dist/lib-cjs/api/util/resourceHelper.d.ts +53 -30
  61. package/dist/lib-cjs/api/util/resourceHelper.js +240 -203
  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/buildinfo.json +3 -3
  66. package/dist/lib-cjs/index.d.ts +48 -46
  67. package/dist/lib-cjs/index.js +86 -82
  68. package/dist/lib-cjs/index.js.map +1 -1
  69. package/dist/webpack-stats.json +0 -0
  70. package/package.json +83 -83
  71. package/src/api/classes/animationInterface.ts +11 -11
  72. package/src/api/classes/dottedPath.ts +189 -189
  73. package/src/api/classes/element.ts +644 -606
  74. package/src/api/classes/event.ts +370 -355
  75. package/src/api/classes/eventBroadcaster.ts +54 -54
  76. package/src/api/classes/parameter.ts +408 -277
  77. package/src/api/classes/parameterObservable.ts +99 -121
  78. package/src/api/classes/{elementParameterizable.ts → parameterizable.ts} +89 -78
  79. package/src/api/classes/placementAnimation.ts +143 -133
  80. package/src/api/classes/variant.ts +817 -670
  81. package/src/api/classes/variantInstance.ts +88 -81
  82. package/src/api/classes/variantParameterizable.ts +73 -0
  83. package/src/api/classes/viewer.ts +487 -421
  84. package/src/api/classes/viewerLight.ts +330 -0
  85. package/src/api/internal/debugViewer.ts +81 -81
  86. package/src/api/internal/lensRendering.ts +10 -10
  87. package/src/api/internal/sceneSetup.ts +194 -204
  88. package/src/api/manager/animationManager.ts +116 -116
  89. package/src/api/manager/sceneManager.ts +105 -105
  90. package/src/api/manager/variantInstanceManager.ts +236 -236
  91. package/src/api/store/specStorage.ts +53 -53
  92. package/src/api/util/babylonHelper.ts +555 -392
  93. package/src/api/util/globalTypes.ts +380 -319
  94. package/src/api/util/resourceHelper.ts +184 -155
  95. package/src/api/util/stringHelper.ts +26 -0
  96. package/src/buildinfo.json +2 -2
  97. package/src/commonjs.tsconfig.json +13 -13
  98. package/src/declaration.tsconfig.json +10 -10
  99. package/src/dev.ts +42 -46
  100. package/src/es6.tsconfig.json +13 -13
  101. package/src/index.ts +91 -87
  102. package/src/pagesconfig.json +61 -57
  103. package/src/tsconfig.json +43 -43
  104. package/src/tsconfig.types.json +9 -9
  105. package/src/types.d.ts +4 -4
@@ -1,369 +1,521 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getClientRectFromMesh = exports.removeFromHighlightLayer = exports.addToHighlightLayer = exports.setMaterialRoughness = exports.setMaterialMetallness = exports.setMaterialTexture = exports.setMaterialColor = exports.setSourceNodeMaterial = exports.setMaterial = exports.deactivateTransformNode = exports.activateTransformNode = exports.assertTransformNode = exports.injectTransformNodeMetadata = exports.cloneTransformNodeMaterial = exports.cloneTransformNode = exports.getDottedPathForTransformNode = exports.mapToDottedNodes = void 0;
4
- var tslib_1 = require("tslib");
5
- var math_vector_1 = require("@babylonjs/core/Maths/math.vector");
6
- var abstractMesh_1 = require("@babylonjs/core/Meshes/abstractMesh");
7
- var instancedMesh_1 = require("@babylonjs/core/Meshes/instancedMesh");
8
- var lodash_es_1 = require("lodash-es");
9
- var dottedPath_1 = require("../classes/dottedPath");
10
- /**
11
- * @param nodes
12
- * @param predicate
13
- * @return Map<DottedPath, T>
14
- */
15
- var mapToDottedNodes = function (nodes, predicate) {
16
- var map = new Map();
17
- var addNodes = function (_node) {
18
- if (predicate && predicate(_node)) {
19
- map.set(_node.metadata.dottedPath, _node);
20
- }
21
- _node.getChildren().forEach(function (child) {
22
- addNodes(child);
23
- });
24
- };
25
- nodes.forEach(function (node) {
26
- addNodes(node);
27
- });
28
- return map;
29
- };
30
- exports.mapToDottedNodes = mapToDottedNodes;
31
- /**
32
- * @param node
33
- * @return DottedPath
34
- */
35
- var getDottedPathForTransformNode = function (node) {
36
- var dottedPath = dottedPath_1.DottedPath.create(node.name);
37
- var _parent = node;
38
- while (_parent.parent) {
39
- _parent = _parent.parent;
40
- dottedPath.unshiftPart(_parent.name);
41
- }
42
- return dottedPath;
43
- };
44
- exports.getDottedPathForTransformNode = getDottedPathForTransformNode;
45
- /**
46
- *
47
- * @param node
48
- * @param predicate
49
- * @param deep
50
- * @return TransformNode | null
51
- */
52
- var cloneTransformNode = function (node, predicate, deep) {
53
- if (deep === void 0) { deep = true; }
54
- if (predicate && !predicate(node)) {
55
- return null;
56
- }
57
- var clone = node.clone(node.name, node.parent, true);
58
- if (clone) {
59
- clone.metadata = lodash_es_1.cloneDeep(node.metadata);
60
- }
61
- if (deep) {
62
- var children = node.getChildTransformNodes(true);
63
- children.forEach(function (child) {
64
- var clonedChild = cloneTransformNode(child, predicate, deep);
65
- if (clonedChild) {
66
- clonedChild.parent = clone;
67
- }
68
- });
69
- }
70
- return clone;
71
- };
72
- exports.cloneTransformNode = cloneTransformNode;
73
- /**
74
- * @param node
75
- * @param deep
76
- * @param prefix
77
- * @return TransformNode
78
- */
79
- var cloneTransformNodeMaterial = function (node, prefix, deep) {
80
- if (prefix === void 0) { prefix = ''; }
81
- if (deep === void 0) { deep = true; }
82
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
83
- var _prefix = dottedPath_1.DottedPath.create(prefix).addParts([
84
- 'node',
85
- node.uniqueId.toString()
86
- ]);
87
- node.material = node.material.clone(_prefix.path);
88
- }
89
- if (deep) {
90
- var children = node.getChildTransformNodes(true);
91
- children.forEach(function (child) { return cloneTransformNodeMaterial(child, prefix, deep); });
92
- }
93
- return node;
94
- };
95
- exports.cloneTransformNodeMaterial = cloneTransformNodeMaterial;
96
- /**
97
- * @param node
98
- * @param deep
99
- * @param metadata
100
- */
101
- var injectTransformNodeMetadata = function (node, metadata, deep) {
102
- if (deep === void 0) { deep = true; }
103
- node.metadata = lodash_es_1.merge({}, node.metadata, metadata);
104
- if (deep) {
105
- var children = node.getChildTransformNodes(true);
106
- children.forEach(function (child) { return injectTransformNodeMetadata(child, metadata, deep); });
107
- }
108
- };
109
- exports.injectTransformNodeMetadata = injectTransformNodeMetadata;
110
- /**
111
- * @param node
112
- * @param assertCallable
113
- * @param callableParameters
114
- * @param deep
115
- */
116
- var assertTransformNode = function (node, assertCallable, callableParameters, deep) {
117
- if (callableParameters === void 0) { callableParameters = []; }
118
- if (deep === void 0) { deep = true; }
119
- assertCallable.apply(void 0, tslib_1.__spreadArrays([node], callableParameters));
120
- if (deep) {
121
- var children = node.getChildTransformNodes(true);
122
- children.forEach(function (child) { return assertTransformNode(child, assertCallable, callableParameters, deep); });
123
- }
124
- };
125
- exports.assertTransformNode = assertTransformNode;
126
- /**
127
- * @param node
128
- * @param deep
129
- */
130
- var activateTransformNode = function (node, deep) {
131
- if (deep === void 0) { deep = true; }
132
- node.setEnabled(true);
133
- /*
134
- if( node instanceof AbstractMesh ) {
135
- node.visibility = 1;
136
- node.isPickable = true;
137
- }
138
- */
139
- if (deep) {
140
- node.getChildTransformNodes(true).forEach(function (child) { return activateTransformNode(child, deep); });
141
- }
142
- };
143
- exports.activateTransformNode = activateTransformNode;
144
- /**
145
- * @param node
146
- * @param deep
147
- */
148
- var deactivateTransformNode = function (node, deep) {
149
- if (deep === void 0) { deep = true; }
150
- node.setEnabled(false);
151
- /*
152
- if( node instanceof AbstractMesh ) {
153
- node.visibility = 0;
154
- node.isPickable = false;
155
- }
156
- */
157
- if (deep) {
158
- node.getChildTransformNodes(true).forEach(function (child) { return deactivateTransformNode(child, deep); });
159
- }
160
- };
161
- exports.deactivateTransformNode = deactivateTransformNode;
162
- /**
163
- * @param node
164
- * @param material
165
- * @param deep
166
- */
167
- var setMaterial = function (node, material, deep) {
168
- if (deep === void 0) { deep = true; }
169
- if (node instanceof abstractMesh_1.AbstractMesh) {
170
- node.material = material;
171
- }
172
- if (deep) {
173
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterial(child, material, deep); });
174
- }
175
- };
176
- exports.setMaterial = setMaterial;
177
- /**
178
- * !!! Warning !!!
179
- * This function is not public API. Whilst it can help solving certain problems, it only works reliably in well defined
180
- * situations and can cause unwanted side effects under some conditions. Use carefully at your own risk!
181
- *
182
- * See https://combeenation.myjetbrains.com/youtrack/issue/CB-5906 for further details regarding this warning.
183
- *
184
- * Set material of an instanced meshes source mesh.
185
- * Changes the material of all instanced meshes which have the same source mesh.
186
- *
187
- * @param node
188
- * @param material
189
- * @param deep
190
- *
191
- * @ignore
192
- */
193
- var setSourceNodeMaterial = function (node, material, deep) {
194
- if (deep === void 0) { deep = true; }
195
- 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!";
196
- console.warn("!!! Warning !!!\n" + warn);
197
- if (node instanceof instancedMesh_1.InstancedMesh) {
198
- node.sourceMesh.material = material;
199
- }
200
- if (deep) {
201
- node.getChildTransformNodes(true).forEach(function (child) { return setSourceNodeMaterial(child, material, deep); });
202
- }
203
- };
204
- exports.setSourceNodeMaterial = setSourceNodeMaterial;
205
- /**
206
- * @param node
207
- * @param color
208
- * @param deep
209
- */
210
- var setMaterialColor = function (node, color, deep) {
211
- if (deep === void 0) { deep = true; }
212
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
213
- var materialCls = node.material.getClassName();
214
- switch (materialCls) {
215
- case 'PBRMaterial':
216
- node.material.albedoColor = color.toLinearSpace();
217
- break;
218
- case 'StandardMaterial':
219
- node.material.diffuseColor = color;
220
- break;
221
- default:
222
- throw new Error("Setting color for material of instance \"" + materialCls + "\" not implemented (yet).");
223
- }
224
- }
225
- if (deep) {
226
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialColor(child, color, deep); });
227
- }
228
- };
229
- exports.setMaterialColor = setMaterialColor;
230
- /**
231
- * @param node
232
- * @param texture
233
- * @param deep
234
- */
235
- var setMaterialTexture = function (node, texture, deep) {
236
- if (deep === void 0) { deep = true; }
237
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
238
- var materialCls = node.material.getClassName();
239
- switch (materialCls) {
240
- case 'PBRMaterial':
241
- node.material.albedoTexture = texture;
242
- break;
243
- case 'StandardMaterial':
244
- node.material.diffuseTexture = texture;
245
- break;
246
- default:
247
- throw new Error("Setting texture for material of instance \"" + materialCls + "\" not implemented (yet).");
248
- }
249
- }
250
- if (deep) {
251
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialTexture(child, texture, deep); });
252
- }
253
- };
254
- exports.setMaterialTexture = setMaterialTexture;
255
- /**
256
- * @param node
257
- * @param metallness
258
- * @param deep
259
- */
260
- var setMaterialMetallness = function (node, metallness, deep) {
261
- if (deep === void 0) { deep = true; }
262
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
263
- var materialCls = node.material.getClassName();
264
- switch (materialCls) {
265
- case 'PBRMaterial':
266
- node.material.metallic = metallness;
267
- break;
268
- default:
269
- throw new Error("Setting metallness for material of instance \"" + materialCls + "\" not implemented (yet).");
270
- }
271
- }
272
- if (deep) {
273
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialMetallness(child, metallness, deep); });
274
- }
275
- };
276
- exports.setMaterialMetallness = setMaterialMetallness;
277
- /**
278
- * @param node
279
- * @param roughness
280
- * @param deep
281
- */
282
- var setMaterialRoughness = function (node, roughness, deep) {
283
- if (deep === void 0) { deep = true; }
284
- if (node instanceof abstractMesh_1.AbstractMesh && node.material) {
285
- var materialCls = node.material.getClassName();
286
- switch (materialCls) {
287
- case 'PBRMaterial':
288
- node.material.roughness = roughness;
289
- break;
290
- case 'StandardMaterial':
291
- node.material.roughness = roughness;
292
- break;
293
- default:
294
- throw new Error("Setting roughness for material of instance \"" + materialCls + "\" not implemented (yet).");
295
- }
296
- }
297
- if (deep) {
298
- node.getChildTransformNodes(true).forEach(function (child) { return setMaterialRoughness(child, roughness, deep); });
299
- }
300
- };
301
- exports.setMaterialRoughness = setMaterialRoughness;
302
- /**
303
- * @param node
304
- * @param layer
305
- * @param color
306
- * @param deep
307
- */
308
- var addToHighlightLayer = function (layer, color, node, deep) {
309
- if (deep === void 0) { deep = true; }
310
- if (node instanceof abstractMesh_1.AbstractMesh) {
311
- layer.addMesh(node, color);
312
- }
313
- if (deep) {
314
- node.getChildTransformNodes(true).forEach(function (child) { return addToHighlightLayer(layer, color, child, deep); });
315
- }
316
- };
317
- exports.addToHighlightLayer = addToHighlightLayer;
318
- /**
319
- * @param node
320
- * @param layer
321
- * @param deep
322
- */
323
- var removeFromHighlightLayer = function (layer, node, deep) {
324
- if (deep === void 0) { deep = true; }
325
- if (node instanceof abstractMesh_1.AbstractMesh) {
326
- layer.removeMesh(node);
327
- }
328
- if (deep) {
329
- node.getChildTransformNodes(true).forEach(function (child) { return removeFromHighlightLayer(layer, child, deep); });
330
- }
331
- };
332
- exports.removeFromHighlightLayer = removeFromHighlightLayer;
333
- /**
334
- * https://forum.babylonjs.com/t/get-mesh-bounding-box-position-and-size-in-2d-screen-coordinates/1058/3
335
- * @param mesh
336
- * @param scene
337
- * @param canvas
338
- */
339
- var getClientRectFromMesh = function (mesh, scene, canvas) {
340
- // get bounding box of the mesh
341
- var meshVectors = mesh.getBoundingInfo().boundingBox.vectors;
342
- // get the matrix and viewport needed to project the vectors onto the screen
343
- var worldMatrix = mesh.getWorldMatrix();
344
- var transformMatrix = scene.getTransformMatrix();
345
- var viewport = scene.activeCamera.viewport;
346
- // loop though all the vectors and project them against the current camera viewport to get a set of coordinates
347
- var coordinates = meshVectors.map(function (vector) {
348
- var projection = math_vector_1.Vector3.Project(vector, worldMatrix, transformMatrix, viewport);
349
- projection.x = projection.x * canvas.clientWidth;
350
- projection.y = projection.y * canvas.clientHeight;
351
- return projection;
352
- });
353
- // get the min and max for all the coordinates so we can calculate the largest possible screen size
354
- var maxX = Math.max.apply(Math, coordinates.map(function (o) { return o.x; }));
355
- var minX = Math.min.apply(Math, coordinates.map(function (o) { return o.x; }));
356
- var maxY = Math.max.apply(Math, coordinates.map(function (o) { return o.y; }));
357
- var minY = Math.min.apply(Math, coordinates.map(function (o) { return o.y; }));
358
- // return a ClientRect from this
359
- return {
360
- width: maxX - minX,
361
- height: maxY - minY,
362
- left: minX,
363
- top: minY,
364
- right: maxX,
365
- bottom: maxY,
366
- };
367
- };
368
- 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;
369
521
  //# sourceMappingURL=babylonHelper.js.map