@combeenation/3d-viewer 5.1.2 → 5.2.0-alpha4

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