@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.16.8 → 3.16.10

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 (185) hide show
  1. package/dist/RenderingEngine.d.ts +294 -294
  2. package/dist/RenderingEngine.js +987 -977
  3. package/dist/RenderingEngine.js.map +1 -1
  4. package/dist/index.d.ts +16 -16
  5. package/dist/index.js +57 -57
  6. package/dist/injectors/TextureUnifierInjector.d.ts +13 -13
  7. package/dist/injectors/TextureUnifierInjector.js +181 -171
  8. package/dist/injectors/TextureUnifierInjector.js.map +1 -1
  9. package/dist/interfaces/ILoader.d.ts +3 -3
  10. package/dist/interfaces/ILoader.js +2 -2
  11. package/dist/interfaces/IRenderingEngine.d.ts +45 -45
  12. package/dist/interfaces/IRenderingEngine.js +2 -2
  13. package/dist/loaders/EnvironmentMapLoader.d.ts +119 -119
  14. package/dist/loaders/EnvironmentMapLoader.js +512 -502
  15. package/dist/loaders/EnvironmentMapLoader.js.map +1 -1
  16. package/dist/loaders/GeometryLoader.d.ts +39 -39
  17. package/dist/loaders/GeometryLoader.d.ts.map +1 -1
  18. package/dist/loaders/GeometryLoader.js +603 -593
  19. package/dist/loaders/GeometryLoader.js.map +1 -1
  20. package/dist/loaders/HTMLElementAnchorLoader.d.ts +15 -15
  21. package/dist/loaders/HTMLElementAnchorLoader.js +98 -98
  22. package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -1
  23. package/dist/loaders/LightLoader.d.ts +19 -19
  24. package/dist/loaders/LightLoader.js +197 -187
  25. package/dist/loaders/LightLoader.js.map +1 -1
  26. package/dist/loaders/MaterialLoader.d.ts +115 -115
  27. package/dist/loaders/MaterialLoader.d.ts.map +1 -1
  28. package/dist/loaders/MaterialLoader.js +1612 -1602
  29. package/dist/loaders/MaterialLoader.js.map +1 -1
  30. package/dist/managers/ARManager.d.ts +17 -17
  31. package/dist/managers/ARManager.js +128 -128
  32. package/dist/managers/ARManager.js.map +1 -1
  33. package/dist/managers/CameraManager.d.ts +19 -19
  34. package/dist/managers/CameraManager.js +244 -234
  35. package/dist/managers/CameraManager.js.map +1 -1
  36. package/dist/managers/EnvironmentGeometryManager.d.ts +32 -32
  37. package/dist/managers/EnvironmentGeometryManager.js +114 -114
  38. package/dist/managers/EnvironmentGeometryManager.js.map +1 -1
  39. package/dist/managers/FlagManager.d.ts +19 -19
  40. package/dist/managers/FlagManager.js +143 -143
  41. package/dist/managers/FlagManager.js.map +1 -1
  42. package/dist/managers/PostProcessingManager.d.ts +1019 -1019
  43. package/dist/managers/PostProcessingManager.js +1306 -1296
  44. package/dist/managers/PostProcessingManager.js.map +1 -1
  45. package/dist/managers/RenderingManager.d.ts +84 -84
  46. package/dist/managers/RenderingManager.d.ts.map +1 -1
  47. package/dist/managers/RenderingManager.js +679 -669
  48. package/dist/managers/RenderingManager.js.map +1 -1
  49. package/dist/managers/SceneTracingManager.d.ts +28 -28
  50. package/dist/managers/SceneTracingManager.js +160 -150
  51. package/dist/managers/SceneTracingManager.js.map +1 -1
  52. package/dist/managers/SceneTreeManager.d.ts +81 -81
  53. package/dist/managers/SceneTreeManager.d.ts.map +1 -1
  54. package/dist/managers/SceneTreeManager.js +500 -490
  55. package/dist/managers/SceneTreeManager.js.map +1 -1
  56. package/dist/managers/SettingsManager.d.ts +28 -28
  57. package/dist/managers/SettingsManager.js +284 -284
  58. package/dist/managers/SettingsManager.js.map +1 -1
  59. package/dist/managers/environmentGeometry/ContactShadow.d.ts +42 -42
  60. package/dist/managers/environmentGeometry/ContactShadow.js +295 -285
  61. package/dist/managers/environmentGeometry/ContactShadow.js.map +1 -1
  62. package/dist/managers/environmentGeometry/Grid.d.ts +20 -20
  63. package/dist/managers/environmentGeometry/Grid.js +110 -100
  64. package/dist/managers/environmentGeometry/Grid.js.map +1 -1
  65. package/dist/managers/environmentGeometry/GroundPlane.d.ts +21 -21
  66. package/dist/managers/environmentGeometry/GroundPlane.js +105 -95
  67. package/dist/managers/environmentGeometry/GroundPlane.js.map +1 -1
  68. package/dist/managers/environmentGeometry/GroundPlaneShadow.d.ts +21 -21
  69. package/dist/managers/environmentGeometry/GroundPlaneShadow.js +96 -86
  70. package/dist/managers/environmentGeometry/GroundPlaneShadow.js.map +1 -1
  71. package/dist/managers/environmentGeometry/IEnvironmentGeometry.d.ts +8 -8
  72. package/dist/managers/environmentGeometry/IEnvironmentGeometry.js +2 -2
  73. package/dist/managers/postprocessing/GodRaysManager.d.ts +12 -12
  74. package/dist/managers/postprocessing/GodRaysManager.js +73 -63
  75. package/dist/managers/postprocessing/GodRaysManager.js.map +1 -1
  76. package/dist/managers/postprocessing/OutlineManager.d.ts +15 -15
  77. package/dist/managers/postprocessing/OutlineManager.js +86 -76
  78. package/dist/managers/postprocessing/OutlineManager.js.map +1 -1
  79. package/dist/managers/postprocessing/SSAARenderPass.d.ts +53 -53
  80. package/dist/managers/postprocessing/SSAARenderPass.js +281 -281
  81. package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -1
  82. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +14 -14
  83. package/dist/managers/postprocessing/SelectiveBloomManager.js +76 -66
  84. package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -1
  85. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +46 -46
  86. package/dist/managers/postprocessing/ao/ao/AOEffect.js +142 -142
  87. package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -1
  88. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +12 -12
  89. package/dist/managers/postprocessing/ao/ao/AOPass.js +108 -108
  90. package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -1
  91. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +1 -1
  92. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +4 -4
  93. package/dist/managers/postprocessing/ao/ao/shader/ao_utils.d.ts +1 -1
  94. package/dist/managers/postprocessing/ao/ao/shader/ao_utils.js +4 -4
  95. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +14 -14
  96. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +24 -24
  97. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +1 -1
  98. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +4 -4
  99. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +33 -33
  100. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +211 -211
  101. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -1
  102. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +1 -1
  103. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +4 -4
  104. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +14 -14
  105. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +82 -82
  106. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -1
  107. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +1 -1
  108. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +4 -4
  109. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +1 -1
  110. package/dist/managers/postprocessing/ao/utils/shader/basic.js +4 -4
  111. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +1 -1
  112. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +4 -4
  113. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.d.ts +165 -165
  114. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.js +299 -299
  115. package/dist/managers/postprocessing/effects/tone-mapping/ToneMappingEffect.js.map +1 -1
  116. package/dist/managers/postprocessing/effects/tone-mapping/tone-mapping.d.ts +1 -1
  117. package/dist/managers/postprocessing/effects/tone-mapping/tone-mapping.js +4 -4
  118. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +37 -37
  119. package/dist/managers/postprocessing/utils/CopyMaterial.js +69 -69
  120. package/dist/managers/postprocessing/utils/CopyShader.d.ts +13 -13
  121. package/dist/managers/postprocessing/utils/CopyShader.js +12 -12
  122. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +9 -9
  123. package/dist/managers/postprocessing/utils/FullScreenQuad.js +28 -28
  124. package/dist/managers/postprocessing/utils/NormalPass.d.ts +87 -87
  125. package/dist/managers/postprocessing/utils/NormalPass.js +156 -156
  126. package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -1
  127. package/dist/managers/postprocessing/utils/RenderPass.d.ts +114 -114
  128. package/dist/managers/postprocessing/utils/RenderPass.js +259 -259
  129. package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -1
  130. package/dist/managers/sceneTree/SDTFUtils.d.ts +6 -6
  131. package/dist/managers/sceneTree/SDTFUtils.d.ts.map +1 -1
  132. package/dist/managers/sceneTree/SDTFUtils.js +50 -50
  133. package/dist/managers/sceneTree/SDTFUtils.js.map +1 -1
  134. package/dist/managers/sceneTree/SceenTreeManagerUtils.d.ts +7 -7
  135. package/dist/managers/sceneTree/SceenTreeManagerUtils.d.ts.map +1 -1
  136. package/dist/managers/sceneTree/SceenTreeManagerUtils.js +175 -165
  137. package/dist/managers/sceneTree/SceenTreeManagerUtils.js.map +1 -1
  138. package/dist/managers/sceneTree/ThreeJsDataUtils.d.ts +6 -6
  139. package/dist/managers/sceneTree/ThreeJsDataUtils.d.ts.map +1 -1
  140. package/dist/managers/sceneTree/ThreeJsDataUtils.js +80 -70
  141. package/dist/managers/sceneTree/ThreeJsDataUtils.js.map +1 -1
  142. package/dist/materials/GemMaterial.d.ts +37 -37
  143. package/dist/materials/GemMaterial.js +262 -252
  144. package/dist/materials/GemMaterial.js.map +1 -1
  145. package/dist/materials/MeshUnlitMaterialParameters.d.ts +3 -3
  146. package/dist/materials/MeshUnlitMaterialParameters.js +2 -2
  147. package/dist/materials/MultiPointsMaterial.d.ts +93 -93
  148. package/dist/materials/MultiPointsMaterial.js +577 -567
  149. package/dist/materials/MultiPointsMaterial.js.map +1 -1
  150. package/dist/materials/SpecularGlossinessMaterial.d.ts +13 -13
  151. package/dist/materials/SpecularGlossinessMaterial.js +171 -161
  152. package/dist/materials/SpecularGlossinessMaterial.js.map +1 -1
  153. package/dist/objects/SDColor.d.ts +16 -16
  154. package/dist/objects/SDColor.js +52 -52
  155. package/dist/objects/SDColor.js.map +1 -1
  156. package/dist/objects/SDObject.d.ts +27 -27
  157. package/dist/objects/SDObject.js +112 -102
  158. package/dist/objects/SDObject.js.map +1 -1
  159. package/dist/shaders/PCSS.d.ts +2 -2
  160. package/dist/shaders/PCSS.js +5 -5
  161. package/dist/shaders/gem.d.ts +2 -2
  162. package/dist/shaders/gem.js +5 -5
  163. package/dist/shaders/multi_points.d.ts +2 -2
  164. package/dist/shaders/multi_points.js +5 -5
  165. package/dist/styling/viewport-css.d.ts +1 -1
  166. package/dist/styling/viewport-css.js +4 -4
  167. package/dist/three/CSS2DRenderer.d.ts +31 -31
  168. package/dist/three/CSS2DRenderer.d.ts.map +1 -1
  169. package/dist/three/CSS2DRenderer.js +152 -152
  170. package/dist/three/CSS2DRenderer.js.map +1 -1
  171. package/dist/three/geometries/TextGeometry.d.ts +21 -21
  172. package/dist/three/geometries/TextGeometry.js +45 -45
  173. package/dist/three/geometries/TextGeometry.js.map +1 -1
  174. package/dist/three/loaders/RGBELoader.d.ts +23 -23
  175. package/dist/three/loaders/RGBELoader.js +311 -311
  176. package/dist/three/loaders/RGBELoader.js.map +1 -1
  177. package/dist/types/IThreejsData.d.ts +6 -6
  178. package/dist/types/IThreejsData.js +2 -2
  179. package/dist/types/ThreejsData.d.ts +10 -10
  180. package/dist/types/ThreejsData.js +41 -41
  181. package/package.json +18 -18
  182. package/dist/managers/InstanceGroupManager.d.ts +0 -58
  183. package/dist/managers/InstanceGroupManager.d.ts.map +0 -1
  184. package/dist/managers/InstanceGroupManager.js +0 -372
  185. package/dist/managers/InstanceGroupManager.js.map +0 -1
@@ -1,491 +1,501 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.SceneTreeManager = void 0;
27
- const THREE = __importStar(require("three"));
28
- const viewer_rendering_engine_camera_engine_1 = require("@shapediver/viewer.rendering-engine.camera-engine");
29
- const viewer_rendering_engine_light_engine_1 = require("@shapediver/viewer.rendering-engine.light-engine");
30
- const viewer_shared_math_1 = require("@shapediver/viewer.shared.math");
31
- const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
32
- const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
33
- const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
34
- const gl_matrix_1 = require("gl-matrix");
35
- const SDObject_1 = require("../objects/SDObject");
36
- const ThreejsData_1 = require("../types/ThreejsData");
37
- const SceenTreeManagerUtils_1 = require("./sceneTree/SceenTreeManagerUtils");
38
- const SDTFUtils_1 = require("./sceneTree/SDTFUtils");
39
- const ThreeJsDataUtils_1 = require("./sceneTree/ThreeJsDataUtils");
40
- class SceneTreeManager {
41
- constructor(_renderingEngine) {
42
- this._renderingEngine = _renderingEngine;
43
- this._eventEngine = viewer_shared_services_1.EventEngine.instance;
44
- this._performanceEvaluator = viewer_shared_services_1.PerformanceEvaluator.instance;
45
- this._scene = new THREE.Scene();
46
- this._stateEngine = viewer_shared_services_1.StateEngine.instance;
47
- this._tree = viewer_shared_node_tree_1.Tree.instance;
48
- this._boundingBox = new viewer_shared_math_1.Box();
49
- this._directionalLightData = [];
50
- this._hiddenCamera = new THREE.PerspectiveCamera();
51
- this._lastRendererType = viewer_shared_types_1.RENDERER_TYPE.STANDARD;
52
- this._lastRootVersion = "";
53
- this._newRendererType = false;
54
- this._suspendSceneUpdates = false;
55
- this._scene.background = new THREE.Color("#ffffff");
56
- }
57
- get boundingBox() {
58
- return this._boundingBox;
59
- }
60
- get lastRendererType() {
61
- return this._lastRendererType;
62
- }
63
- get lastRootVersion() {
64
- return this._lastRootVersion;
65
- }
66
- get mainNode() {
67
- return this._mainConvertedObject;
68
- }
69
- get scene() {
70
- return this._scene;
71
- }
72
- get suspendSceneUpdates() {
73
- return this._suspendSceneUpdates;
74
- }
75
- set suspendSceneUpdates(value) {
76
- this._suspendSceneUpdates = value;
77
- }
78
- init() { }
79
- /**
80
- * Convert the data of the scene graph node into the format of the implementation.
81
- *
82
- * @param data the data element
83
- * @param obj the corresponding type node
84
- */
85
- updateData(treeNodeData, treeNode, convertedObject, filter = { transformationOnly: false }, isVisibleInHierarchy = true) {
86
- var _a;
87
- let dataChild;
88
- if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
89
- if (treeNodeData instanceof viewer_shared_node_tree_1.GeometryData) {
90
- (0, SDTFUtils_1.injectAttributeData)(this._renderingEngine, this._currentSDTFOverview, treeNode, treeNodeData);
91
- }
92
- }
93
- else {
94
- const sdtfTransform = treeNode.getTransformation("sdtf");
95
- if (sdtfTransform)
96
- treeNode.removeTransformation(sdtfTransform);
97
- if (treeNodeData instanceof viewer_shared_node_tree_1.GeometryData)
98
- treeNodeData.attributeMaterial = null;
99
- }
100
- switch (true) {
101
- case treeNodeData instanceof viewer_shared_node_tree_1.GeometryData:
102
- {
103
- // We search for the instance matrices data in the parent of our current node
104
- // We are currently at the primitive level and the instance matrices are stored at the mesh level
105
- const instanceTransformationData = (_a = treeNode.parent) === null || _a === void 0 ? void 0 : _a.data.find((d) => d instanceof viewer_shared_node_tree_1.InstanceData);
106
- if (filter.transformationOnly === false) {
107
- dataChild = this._renderingEngine.geometryLoader.load(treeNodeData, instanceTransformationData);
108
- // Three.js Object3Ds can only have one parent. If the
109
- // same GeometryData is referenced by multiple tree nodes,
110
- // the cache returns the same mesh each time. Adding it to
111
- // a second node silently removes it from the first. Clone
112
- // only when this would happen (different existing parent).
113
- if (dataChild.parent !== null &&
114
- dataChild.parent !== convertedObject) {
115
- dataChild = dataChild.clone();
116
- }
117
- dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.GEOMETRY;
118
- dataChild.userData.SDid = treeNodeData.id;
119
- dataChild.userData.SDversion = treeNodeData.version;
120
- convertedObject.add(dataChild);
121
- }
122
- }
123
- break;
124
- case treeNodeData instanceof ThreejsData_1.ThreejsData:
125
- {
126
- dataChild = treeNodeData.obj;
127
- treeNodeData.obj.userData.SDtype =
128
- SDObject_1.SD_DATA_TYPE.THREEJS;
129
- treeNodeData.obj.userData.SDid =
130
- treeNodeData.id;
131
- treeNodeData.obj.userData.SDversion =
132
- treeNodeData.version;
133
- convertedObject.add(dataChild);
134
- // set the currently used environment map
135
- (0, ThreeJsDataUtils_1.assignEnvironmentMapForThreeJsDataObject)(treeNodeData, this._renderingEngine.environmentMapLoader
136
- .environmentMap, this._renderingEngine.environmentMapLoader.type, this._renderingEngine.environmentMapIntensity, this._renderingEngine.environmentMapRotation);
137
- }
138
- break;
139
- case treeNodeData instanceof viewer_rendering_engine_light_engine_1.AbstractLight:
140
- if (filter.transformationOnly === false) {
141
- const threeLight = this._renderingEngine.lightLoader.load(treeNodeData, convertedObject);
142
- if (threeLight) {
143
- dataChild = threeLight;
144
- dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.LIGHT;
145
- dataChild.userData.SDid = treeNodeData.id;
146
- dataChild.userData.SDversion = treeNodeData.version;
147
- }
148
- }
149
- if (treeNodeData instanceof viewer_rendering_engine_light_engine_1.DirectionalLight &&
150
- treeNodeData.useNodeData === false)
151
- this._directionalLightData.push(treeNodeData);
152
- break;
153
- case treeNodeData instanceof viewer_rendering_engine_camera_engine_1.AbstractCamera:
154
- if (filter.transformationOnly === false) {
155
- const threeCamera = this._renderingEngine.cameraManager.load(treeNodeData, convertedObject);
156
- if (threeCamera) {
157
- dataChild = threeCamera;
158
- dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.CAMERA;
159
- dataChild.userData.SDid = treeNodeData.id;
160
- dataChild.userData.SDversion = treeNodeData.version;
161
- }
162
- }
163
- break;
164
- case treeNodeData instanceof viewer_shared_node_tree_1.HTMLElementAnchorData:
165
- if (filter.transformationOnly === false) {
166
- this._renderingEngine.htmlElementAnchorLoader.load(treeNode, treeNodeData, isVisibleInHierarchy);
167
- const existingAnchor = convertedObject.children.find((o) => !(o instanceof SDObject_1.SDObject) &&
168
- o.userData.SDtype ===
169
- SDObject_1.SD_DATA_TYPE.HTML_ELEMENT_ANCHOR &&
170
- o.userData.SDid === treeNodeData.id &&
171
- o.userData.SDversion === treeNodeData.version);
172
- if (!existingAnchor) {
173
- const dataChild = new THREE.Object3D();
174
- dataChild.userData.SDtype =
175
- SDObject_1.SD_DATA_TYPE.HTML_ELEMENT_ANCHOR;
176
- dataChild.userData.SDid = treeNodeData.id;
177
- dataChild.userData.SDversion = treeNodeData.version;
178
- convertedObject.add(dataChild);
179
- }
180
- }
181
- break;
182
- default:
183
- break;
184
- }
185
- if (dataChild)
186
- (0, SceenTreeManagerUtils_1.assignBoundingBox)(treeNode, treeNodeData, this._renderingEngine.id, dataChild);
187
- }
188
- /**
189
- * Update the current node via the scene graph node.
190
- * Convert the data if needed.
191
- *
192
- * @param treeNode the scene graph node
193
- * @param obj the current type object
194
- */
195
- updateNode(treeNode = this._tree.root, obj, filter = { transformationOnly: false }, visibleInHierarchy = true) {
196
- // Resolve the converted object if not provided
197
- if (obj === undefined) {
198
- obj = this.resolveConvertedObject(treeNode, filter, visibleInHierarchy);
199
- if (!obj)
200
- return;
201
- }
202
- const convertedObject = obj;
203
- // reset bounding boxes
204
- this.resetBoundingBoxes(treeNode);
205
- // cleanup obsolete data and children
206
- if (filter.transformationOnly === false) {
207
- this.cleanupObsoleteData(treeNode, convertedObject);
208
- this.cleanupObsoleteChildren(treeNode, convertedObject);
209
- }
210
- const isVisible = this.isNodeVisible(treeNode);
211
- const isVisibleInHierarchy = visibleInHierarchy && isVisible;
212
- // convert all data items of the current node
213
- // old versions will be replaced by new ones
214
- // Create a lookup map for efficient access to converted children
215
- const convertedChildrenMap = new Map();
216
- for (const child of convertedObject.children) {
217
- if (child instanceof SDObject_1.SDObject) {
218
- convertedChildrenMap.set(child.SDid, child);
219
- }
220
- }
221
- for (let i = 0, len = treeNode.data.length; i < len; i++) {
222
- const dataItem = treeNode.data[i];
223
- const convertedObjectData = convertedChildrenMap.get(dataItem.id);
224
- if (!convertedObjectData ||
225
- convertedObjectData.SDversion !== dataItem.version ||
226
- this._newRendererType) {
227
- this.updateData(dataItem, treeNode, convertedObject, filter, isVisibleInHierarchy);
228
- }
229
- else {
230
- (0, SceenTreeManagerUtils_1.assignBoundingBox)(treeNode, dataItem, this._renderingEngine.id, convertedObjectData);
231
- }
232
- }
233
- // Update or create child nodes
234
- for (let i = 0, len = treeNode.children.length; i < len; i++) {
235
- const treeNodeChild = treeNode.children[i];
236
- const childConvertedObject = convertedChildrenMap.get(treeNodeChild.id);
237
- this.processChildTreeNode(treeNodeChild, convertedObject, childConvertedObject, filter, isVisibleInHierarchy);
238
- this.unionChildBoundingBoxes(treeNode, treeNodeChild, isVisible);
239
- }
240
- convertedObject.visible = isVisible;
241
- convertedObject.applyTransformation(treeNode.nodeMatrix);
242
- }
243
- updateSceneTree(rootTreeNode) {
244
- var _a, _b;
245
- // check if we currently have the same root version
246
- if (this._tree.root.version === this._lastRootVersion &&
247
- this._renderingEngine.type === this._lastRendererType)
248
- return;
249
- // check if scene tree updates are currently suspended
250
- if (this._suspendSceneUpdates)
251
- return;
252
- this._lastRootVersion = this._tree.root.version;
253
- this._newRendererType =
254
- this._renderingEngine.type !== this._lastRendererType;
255
- this._lastRendererType = this._renderingEngine.type;
256
- if (this._renderingEngine.closed)
257
- return;
258
- this._performanceEvaluator.startSection("sceneTreeUpdate." + this._lastRootVersion);
259
- const oldBB = this._boundingBox.clone();
260
- this._boundingBox = new viewer_shared_math_1.Box();
261
- this._renderingEngine.lightLoader.shadowMapCount = 0;
262
- if (!this._mainConvertedObject) {
263
- this._mainConvertedObject = new SDObject_1.SDObject(rootTreeNode.id, rootTreeNode.version);
264
- const oldObj = rootTreeNode.convertedObject[this._renderingEngine.id];
265
- rootTreeNode.convertedObject[this._renderingEngine.id] =
266
- this._mainConvertedObject;
267
- if (rootTreeNode.updateCallbackConvertedObject)
268
- rootTreeNode.updateCallbackConvertedObject(this._mainConvertedObject, oldObj, this._renderingEngine.id);
269
- this._scene.add(this._mainConvertedObject);
270
- }
271
- this._currentSDTFOverview = (0, SDTFUtils_1.createSDTFOverview)(rootTreeNode);
272
- this.updateNode(rootTreeNode, this._mainConvertedObject);
273
- this._boundingBox =
274
- rootTreeNode.boundingBoxViewport[this._renderingEngine.id].clone();
275
- // directional lights need to be with the bounding box
276
- this._directionalLightData.forEach((dl) => {
277
- var _a;
278
- // check if the data has stored converted object
279
- const convertedObject = ((_a = ((dl.convertedObject[this._renderingEngine.id]))) === null || _a === void 0 ? void 0 : _a.parent);
280
- if (!convertedObject)
281
- return;
282
- this._renderingEngine.lightLoader.adjustToBoundingBox(dl, convertedObject, this._boundingBox);
283
- });
284
- this._directionalLightData = [];
285
- const bbChanged = this._boundingBox.min[0] !== oldBB.min[0] ||
286
- this._boundingBox.min[1] !== oldBB.min[1] ||
287
- this._boundingBox.min[2] !== oldBB.min[2] ||
288
- this._boundingBox.max[0] !== oldBB.max[0] ||
289
- this._boundingBox.max[1] !== oldBB.max[1] ||
290
- this._boundingBox.max[2] !== oldBB.max[2];
291
- if (bbChanged) {
292
- if (!((_a = this._stateEngine.viewportEngines[this._renderingEngine.id]) === null || _a === void 0 ? void 0 : _a.boundingBoxCreated.resolved) &&
293
- !this._boundingBox.isEmpty())
294
- (_b = this._stateEngine.viewportEngines[this._renderingEngine.id]) === null || _b === void 0 ? void 0 : _b.boundingBoxCreated.resolve(true);
295
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_CHANGE, {
296
- viewportId: this._renderingEngine.id,
297
- boundingBox: {
298
- min: gl_matrix_1.vec3.clone(this._boundingBox.min),
299
- max: gl_matrix_1.vec3.clone(this._boundingBox.max),
300
- },
301
- });
302
- }
303
- if (this._boundingBox.isEmpty()) {
304
- // check if all outputs that should be loaded at the start of a session are loaded
305
- // if the bounding box is empty then, emit the event
306
- if (Object.values(this._stateEngine.sessionEngines).every((s) => s && s.initialOutputsLoaded.resolved === true)) {
307
- this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_EMPTY, {
308
- viewportId: this._renderingEngine.id,
309
- });
310
- }
311
- }
312
- this._renderingEngine.renderingManager.evaluateTextureUnitCount(this._renderingEngine.lightLoader.shadowMapCount +
313
- this._renderingEngine.materialLoader.maxMapCount);
314
- /**
315
- *
316
- * Three.js texture upload and compiling
317
- * This step is needed as three.js would compile the shaders and initialize the texture on the first render call instead.
318
- *
319
- */
320
- // we initialize all texture and then clear the cache
321
- const threeJsTextureCache = this._renderingEngine.materialLoader.threeJsTextureCache;
322
- for (const key in threeJsTextureCache) {
323
- if (threeJsTextureCache[key].usage === 0) {
324
- threeJsTextureCache[key].texture.dispose();
325
- delete threeJsTextureCache[key];
326
- }
327
- else if (threeJsTextureCache[key].initialized === false) {
328
- this._renderingEngine.renderer.initTexture(threeJsTextureCache[key].texture);
329
- threeJsTextureCache[key].initialized = true;
330
- }
331
- }
332
- // we compile the shaders
333
- this._renderingEngine.renderer.compile(this._renderingEngine.scene, this._hiddenCamera);
334
- this._performanceEvaluator.endSection("sceneTreeUpdate." + this._lastRootVersion);
335
- }
336
- /**
337
- * Remove obsolete child nodes from the converted object
338
- */
339
- cleanupObsoleteChildren(treeNode, convertedObject) {
340
- // remove all child nodes in the transformed object that do not exist anymore
341
- // the filter goes also through the data items as they were already added
342
- const nodeIds = new Set(treeNode.children
343
- .filter((d) => !d.excludeViewports.includes(this._renderingEngine.id))
344
- .map((d) => d.id));
345
- const childrenToRemove = convertedObject.children.filter((oc) => {
346
- if (oc instanceof SDObject_1.SDObject && oc.SDtype === SDObject_1.SD_DATA_TYPE.OBJECT) {
347
- return !nodeIds.has(oc.SDid);
348
- }
349
- else {
350
- return false;
351
- }
352
- });
353
- childrenToRemove.forEach((cTR) => {
354
- cTR.traverse((o) => {
355
- if (o instanceof SDObject_1.SDObject && o.SDtype !== SDObject_1.SD_DATA_TYPE.OBJECT) {
356
- (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, o);
357
- }
358
- else if (!(o instanceof SDObject_1.SDObject) &&
359
- o.userData.SDtype !== undefined) {
360
- (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, o);
361
- }
362
- });
363
- convertedObject.remove(cTR);
364
- });
365
- }
366
- /**
367
- * Remove obsolete data items from the converted object
368
- */
369
- cleanupObsoleteData(treeNode, convertedObject) {
370
- // remove all data items that do not exist anymore
371
- const dataMap = new Map(treeNode.data.map((d) => [d.id, d.version]));
372
- const dataToRemove = convertedObject.children.filter((oc) => {
373
- if (!(oc instanceof SDObject_1.SDObject)) {
374
- const version = dataMap.get(oc.userData.SDid);
375
- if (version !== undefined) {
376
- if (version !== oc.userData.SDversion) {
377
- // version is different
378
- return true;
379
- }
380
- else {
381
- return false;
382
- }
383
- }
384
- else {
385
- // id not included anymore
386
- return true;
387
- }
388
- }
389
- else {
390
- return false;
391
- }
392
- });
393
- dataToRemove.forEach((dTR) => {
394
- (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, dTR);
395
- convertedObject.remove(dTR);
396
- });
397
- }
398
- /**
399
- * Check if a node is visible in the current viewport
400
- */
401
- isNodeVisible(treeNode) {
402
- return (treeNode.visible &&
403
- !treeNode.excludeViewports.includes(this._renderingEngine.id) &&
404
- !(treeNode.restrictViewports.length > 0 &&
405
- !treeNode.restrictViewports.includes(this._renderingEngine.id)));
406
- }
407
- /**
408
- * Process a child node by creating it if needed, updating it, and syncing bounding boxes
409
- */
410
- processChildTreeNode(treeNodeChild, convertedObject, childConvertedObject, filter, isVisibleInHierarchy) {
411
- if (!childConvertedObject) {
412
- const newChild = new SDObject_1.SDObject(treeNodeChild.id, treeNodeChild.version);
413
- const oldChild = treeNodeChild.convertedObject[this._renderingEngine.id];
414
- treeNodeChild.convertedObject[this._renderingEngine.id] = newChild;
415
- if (treeNodeChild.updateCallbackConvertedObject)
416
- treeNodeChild.updateCallbackConvertedObject(newChild, oldChild, this._renderingEngine.id);
417
- convertedObject.add(newChild);
418
- this.updateNode(treeNodeChild, newChild, filter, isVisibleInHierarchy);
419
- }
420
- else if (childConvertedObject.SDversion !== treeNodeChild.version ||
421
- this._newRendererType) {
422
- // if the version is different, update the child
423
- this.updateNode(treeNodeChild, childConvertedObject, filter, isVisibleInHierarchy);
424
- childConvertedObject.SDversion = treeNodeChild.version;
425
- }
426
- else {
427
- this.updateNode(treeNodeChild, childConvertedObject, filter, isVisibleInHierarchy);
428
- }
429
- }
430
- /**
431
- * Reset and initialize bounding boxes for a node
432
- */
433
- resetBoundingBoxes(treeNode) {
434
- // reset the general bounding box of the current node
435
- // it will be recomputed in the following steps
436
- treeNode.boundingBox.reset();
437
- // create the specific BB if it doesn't exist yet
438
- if (!treeNode.boundingBoxViewport[this._renderingEngine.id])
439
- treeNode.boundingBoxViewport[this._renderingEngine.id] = new viewer_shared_math_1.Box();
440
- // reset the specific bounding box of the current node
441
- // it will be recomputed in the following steps
442
- treeNode.boundingBoxViewport[this._renderingEngine.id].reset();
443
- }
444
- /**
445
- * Resolves the converted object for a node, handling cases where it doesn't exist
446
- */
447
- resolveConvertedObject(treeNode, filter, visibleInHierarchy) {
448
- // check if there is a converted object
449
- if (treeNode.convertedObject[this._renderingEngine.id]) {
450
- return treeNode.convertedObject[this._renderingEngine.id];
451
- }
452
- else {
453
- // the node has not been converted yet
454
- // go up the hierarchy until a converted object is found
455
- let parent = treeNode.parent;
456
- while (parent) {
457
- if (parent.convertedObject[this._renderingEngine.id]) {
458
- this.updateNode(parent, parent.convertedObject[this._renderingEngine.id], filter, visibleInHierarchy);
459
- return;
460
- }
461
- else {
462
- parent = parent.parent;
463
- }
464
- }
465
- // no converted object found in the hierarchy
466
- // update the whole scene tree
467
- this.updateSceneTree(this._tree.root);
468
- return;
469
- }
470
- }
471
- /**
472
- * Union child bounding boxes with parent bounding boxes
473
- */
474
- unionChildBoundingBoxes(treeNode, treeNodeChild, isVisible) {
475
- // adjust the general BB
476
- if (!treeNodeChild.boundingBox.isEmpty())
477
- treeNode.boundingBox.union(treeNodeChild.boundingBox);
478
- // adjust the specific BB
479
- if (treeNodeChild.boundingBoxViewport[this._renderingEngine.id] &&
480
- !treeNodeChild.boundingBoxViewport[this._renderingEngine.id].isEmpty()) {
481
- // only do this if the node is
482
- // 1. visible
483
- // 2. no included in the "excludeViewports"
484
- // 3. if there are "restrictViewports", it needs to be in them
485
- if (isVisible)
486
- treeNode.boundingBoxViewport[this._renderingEngine.id].union(treeNodeChild.boundingBoxViewport[this._renderingEngine.id]);
487
- }
488
- }
489
- }
490
- exports.SceneTreeManager = SceneTreeManager;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SceneTreeManager = void 0;
37
+ const THREE = __importStar(require("three"));
38
+ const viewer_rendering_engine_camera_engine_1 = require("@shapediver/viewer.rendering-engine.camera-engine");
39
+ const viewer_rendering_engine_light_engine_1 = require("@shapediver/viewer.rendering-engine.light-engine");
40
+ const viewer_shared_math_1 = require("@shapediver/viewer.shared.math");
41
+ const viewer_shared_node_tree_1 = require("@shapediver/viewer.shared.node-tree");
42
+ const viewer_shared_types_1 = require("@shapediver/viewer.shared.types");
43
+ const viewer_shared_services_1 = require("@shapediver/viewer.shared.services");
44
+ const gl_matrix_1 = require("gl-matrix");
45
+ const SDObject_1 = require("../objects/SDObject");
46
+ const ThreejsData_1 = require("../types/ThreejsData");
47
+ const SceenTreeManagerUtils_1 = require("./sceneTree/SceenTreeManagerUtils");
48
+ const SDTFUtils_1 = require("./sceneTree/SDTFUtils");
49
+ const ThreeJsDataUtils_1 = require("./sceneTree/ThreeJsDataUtils");
50
+ class SceneTreeManager {
51
+ constructor(_renderingEngine) {
52
+ this._renderingEngine = _renderingEngine;
53
+ this._eventEngine = viewer_shared_services_1.EventEngine.instance;
54
+ this._performanceEvaluator = viewer_shared_services_1.PerformanceEvaluator.instance;
55
+ this._scene = new THREE.Scene();
56
+ this._stateEngine = viewer_shared_services_1.StateEngine.instance;
57
+ this._tree = viewer_shared_node_tree_1.Tree.instance;
58
+ this._boundingBox = new viewer_shared_math_1.Box();
59
+ this._directionalLightData = [];
60
+ this._hiddenCamera = new THREE.PerspectiveCamera();
61
+ this._lastRendererType = viewer_shared_types_1.RENDERER_TYPE.STANDARD;
62
+ this._lastRootVersion = "";
63
+ this._newRendererType = false;
64
+ this._suspendSceneUpdates = false;
65
+ this._scene.background = new THREE.Color("#ffffff");
66
+ }
67
+ get boundingBox() {
68
+ return this._boundingBox;
69
+ }
70
+ get lastRendererType() {
71
+ return this._lastRendererType;
72
+ }
73
+ get lastRootVersion() {
74
+ return this._lastRootVersion;
75
+ }
76
+ get mainNode() {
77
+ return this._mainConvertedObject;
78
+ }
79
+ get scene() {
80
+ return this._scene;
81
+ }
82
+ get suspendSceneUpdates() {
83
+ return this._suspendSceneUpdates;
84
+ }
85
+ set suspendSceneUpdates(value) {
86
+ this._suspendSceneUpdates = value;
87
+ }
88
+ init() { }
89
+ /**
90
+ * Convert the data of the scene graph node into the format of the implementation.
91
+ *
92
+ * @param data the data element
93
+ * @param obj the corresponding type node
94
+ */
95
+ updateData(treeNodeData, treeNode, convertedObject, filter = { transformationOnly: false }, isVisibleInHierarchy = true) {
96
+ var _a;
97
+ let dataChild;
98
+ if (this._renderingEngine.type === viewer_shared_types_1.RENDERER_TYPE.ATTRIBUTES) {
99
+ if (treeNodeData instanceof viewer_shared_node_tree_1.GeometryData) {
100
+ (0, SDTFUtils_1.injectAttributeData)(this._renderingEngine, this._currentSDTFOverview, treeNode, treeNodeData);
101
+ }
102
+ }
103
+ else {
104
+ const sdtfTransform = treeNode.getTransformation("sdtf");
105
+ if (sdtfTransform)
106
+ treeNode.removeTransformation(sdtfTransform);
107
+ if (treeNodeData instanceof viewer_shared_node_tree_1.GeometryData)
108
+ treeNodeData.attributeMaterial = null;
109
+ }
110
+ switch (true) {
111
+ case treeNodeData instanceof viewer_shared_node_tree_1.GeometryData:
112
+ {
113
+ // We search for the instance matrices data in the parent of our current node
114
+ // We are currently at the primitive level and the instance matrices are stored at the mesh level
115
+ const instanceTransformationData = (_a = treeNode.parent) === null || _a === void 0 ? void 0 : _a.data.find((d) => d instanceof viewer_shared_node_tree_1.InstanceData);
116
+ if (filter.transformationOnly === false) {
117
+ dataChild = this._renderingEngine.geometryLoader.load(treeNodeData, instanceTransformationData);
118
+ // Three.js Object3Ds can only have one parent. If the
119
+ // same GeometryData is referenced by multiple tree nodes,
120
+ // the cache returns the same mesh each time. Adding it to
121
+ // a second node silently removes it from the first. Clone
122
+ // only when this would happen (different existing parent).
123
+ if (dataChild.parent !== null &&
124
+ dataChild.parent !== convertedObject) {
125
+ dataChild = dataChild.clone();
126
+ }
127
+ dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.GEOMETRY;
128
+ dataChild.userData.SDid = treeNodeData.id;
129
+ dataChild.userData.SDversion = treeNodeData.version;
130
+ convertedObject.add(dataChild);
131
+ }
132
+ }
133
+ break;
134
+ case treeNodeData instanceof ThreejsData_1.ThreejsData:
135
+ {
136
+ dataChild = treeNodeData.obj;
137
+ treeNodeData.obj.userData.SDtype =
138
+ SDObject_1.SD_DATA_TYPE.THREEJS;
139
+ treeNodeData.obj.userData.SDid =
140
+ treeNodeData.id;
141
+ treeNodeData.obj.userData.SDversion =
142
+ treeNodeData.version;
143
+ convertedObject.add(dataChild);
144
+ // set the currently used environment map
145
+ (0, ThreeJsDataUtils_1.assignEnvironmentMapForThreeJsDataObject)(treeNodeData, this._renderingEngine.environmentMapLoader
146
+ .environmentMap, this._renderingEngine.environmentMapLoader.type, this._renderingEngine.environmentMapIntensity, this._renderingEngine.environmentMapRotation);
147
+ }
148
+ break;
149
+ case treeNodeData instanceof viewer_rendering_engine_light_engine_1.AbstractLight:
150
+ if (filter.transformationOnly === false) {
151
+ const threeLight = this._renderingEngine.lightLoader.load(treeNodeData, convertedObject);
152
+ if (threeLight) {
153
+ dataChild = threeLight;
154
+ dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.LIGHT;
155
+ dataChild.userData.SDid = treeNodeData.id;
156
+ dataChild.userData.SDversion = treeNodeData.version;
157
+ }
158
+ }
159
+ if (treeNodeData instanceof viewer_rendering_engine_light_engine_1.DirectionalLight &&
160
+ treeNodeData.useNodeData === false)
161
+ this._directionalLightData.push(treeNodeData);
162
+ break;
163
+ case treeNodeData instanceof viewer_rendering_engine_camera_engine_1.AbstractCamera:
164
+ if (filter.transformationOnly === false) {
165
+ const threeCamera = this._renderingEngine.cameraManager.load(treeNodeData, convertedObject);
166
+ if (threeCamera) {
167
+ dataChild = threeCamera;
168
+ dataChild.userData.SDtype = SDObject_1.SD_DATA_TYPE.CAMERA;
169
+ dataChild.userData.SDid = treeNodeData.id;
170
+ dataChild.userData.SDversion = treeNodeData.version;
171
+ }
172
+ }
173
+ break;
174
+ case treeNodeData instanceof viewer_shared_node_tree_1.HTMLElementAnchorData:
175
+ if (filter.transformationOnly === false) {
176
+ this._renderingEngine.htmlElementAnchorLoader.load(treeNode, treeNodeData, isVisibleInHierarchy);
177
+ const existingAnchor = convertedObject.children.find((o) => !(o instanceof SDObject_1.SDObject) &&
178
+ o.userData.SDtype ===
179
+ SDObject_1.SD_DATA_TYPE.HTML_ELEMENT_ANCHOR &&
180
+ o.userData.SDid === treeNodeData.id &&
181
+ o.userData.SDversion === treeNodeData.version);
182
+ if (!existingAnchor) {
183
+ const dataChild = new THREE.Object3D();
184
+ dataChild.userData.SDtype =
185
+ SDObject_1.SD_DATA_TYPE.HTML_ELEMENT_ANCHOR;
186
+ dataChild.userData.SDid = treeNodeData.id;
187
+ dataChild.userData.SDversion = treeNodeData.version;
188
+ convertedObject.add(dataChild);
189
+ }
190
+ }
191
+ break;
192
+ default:
193
+ break;
194
+ }
195
+ if (dataChild)
196
+ (0, SceenTreeManagerUtils_1.assignBoundingBox)(treeNode, treeNodeData, this._renderingEngine.id, dataChild);
197
+ }
198
+ /**
199
+ * Update the current node via the scene graph node.
200
+ * Convert the data if needed.
201
+ *
202
+ * @param treeNode the scene graph node
203
+ * @param obj the current type object
204
+ */
205
+ updateNode(treeNode = this._tree.root, obj, filter = { transformationOnly: false }, visibleInHierarchy = true) {
206
+ // Resolve the converted object if not provided
207
+ if (obj === undefined) {
208
+ obj = this.resolveConvertedObject(treeNode, filter, visibleInHierarchy);
209
+ if (!obj)
210
+ return;
211
+ }
212
+ const convertedObject = obj;
213
+ // reset bounding boxes
214
+ this.resetBoundingBoxes(treeNode);
215
+ // cleanup obsolete data and children
216
+ if (filter.transformationOnly === false) {
217
+ this.cleanupObsoleteData(treeNode, convertedObject);
218
+ this.cleanupObsoleteChildren(treeNode, convertedObject);
219
+ }
220
+ const isVisible = this.isNodeVisible(treeNode);
221
+ const isVisibleInHierarchy = visibleInHierarchy && isVisible;
222
+ // convert all data items of the current node
223
+ // old versions will be replaced by new ones
224
+ // Create a lookup map for efficient access to converted children
225
+ const convertedChildrenMap = new Map();
226
+ for (const child of convertedObject.children) {
227
+ if (child instanceof SDObject_1.SDObject) {
228
+ convertedChildrenMap.set(child.SDid, child);
229
+ }
230
+ }
231
+ for (let i = 0, len = treeNode.data.length; i < len; i++) {
232
+ const dataItem = treeNode.data[i];
233
+ const convertedObjectData = convertedChildrenMap.get(dataItem.id);
234
+ if (!convertedObjectData ||
235
+ convertedObjectData.SDversion !== dataItem.version ||
236
+ this._newRendererType) {
237
+ this.updateData(dataItem, treeNode, convertedObject, filter, isVisibleInHierarchy);
238
+ }
239
+ else {
240
+ (0, SceenTreeManagerUtils_1.assignBoundingBox)(treeNode, dataItem, this._renderingEngine.id, convertedObjectData);
241
+ }
242
+ }
243
+ // Update or create child nodes
244
+ for (let i = 0, len = treeNode.children.length; i < len; i++) {
245
+ const treeNodeChild = treeNode.children[i];
246
+ const childConvertedObject = convertedChildrenMap.get(treeNodeChild.id);
247
+ this.processChildTreeNode(treeNodeChild, convertedObject, childConvertedObject, filter, isVisibleInHierarchy);
248
+ this.unionChildBoundingBoxes(treeNode, treeNodeChild, isVisible);
249
+ }
250
+ convertedObject.visible = isVisible;
251
+ convertedObject.applyTransformation(treeNode.nodeMatrix);
252
+ }
253
+ updateSceneTree(rootTreeNode) {
254
+ var _a, _b;
255
+ // check if we currently have the same root version
256
+ if (this._tree.root.version === this._lastRootVersion &&
257
+ this._renderingEngine.type === this._lastRendererType)
258
+ return;
259
+ // check if scene tree updates are currently suspended
260
+ if (this._suspendSceneUpdates)
261
+ return;
262
+ this._lastRootVersion = this._tree.root.version;
263
+ this._newRendererType =
264
+ this._renderingEngine.type !== this._lastRendererType;
265
+ this._lastRendererType = this._renderingEngine.type;
266
+ if (this._renderingEngine.closed)
267
+ return;
268
+ this._performanceEvaluator.startSection("sceneTreeUpdate." + this._lastRootVersion);
269
+ const oldBB = this._boundingBox.clone();
270
+ this._boundingBox = new viewer_shared_math_1.Box();
271
+ this._renderingEngine.lightLoader.shadowMapCount = 0;
272
+ if (!this._mainConvertedObject) {
273
+ this._mainConvertedObject = new SDObject_1.SDObject(rootTreeNode.id, rootTreeNode.version);
274
+ const oldObj = rootTreeNode.convertedObject[this._renderingEngine.id];
275
+ rootTreeNode.convertedObject[this._renderingEngine.id] =
276
+ this._mainConvertedObject;
277
+ if (rootTreeNode.updateCallbackConvertedObject)
278
+ rootTreeNode.updateCallbackConvertedObject(this._mainConvertedObject, oldObj, this._renderingEngine.id);
279
+ this._scene.add(this._mainConvertedObject);
280
+ }
281
+ this._currentSDTFOverview = (0, SDTFUtils_1.createSDTFOverview)(rootTreeNode);
282
+ this.updateNode(rootTreeNode, this._mainConvertedObject);
283
+ this._boundingBox =
284
+ rootTreeNode.boundingBoxViewport[this._renderingEngine.id].clone();
285
+ // directional lights need to be with the bounding box
286
+ this._directionalLightData.forEach((dl) => {
287
+ var _a;
288
+ // check if the data has stored converted object
289
+ const convertedObject = ((_a = ((dl.convertedObject[this._renderingEngine.id]))) === null || _a === void 0 ? void 0 : _a.parent);
290
+ if (!convertedObject)
291
+ return;
292
+ this._renderingEngine.lightLoader.adjustToBoundingBox(dl, convertedObject, this._boundingBox);
293
+ });
294
+ this._directionalLightData = [];
295
+ const bbChanged = this._boundingBox.min[0] !== oldBB.min[0] ||
296
+ this._boundingBox.min[1] !== oldBB.min[1] ||
297
+ this._boundingBox.min[2] !== oldBB.min[2] ||
298
+ this._boundingBox.max[0] !== oldBB.max[0] ||
299
+ this._boundingBox.max[1] !== oldBB.max[1] ||
300
+ this._boundingBox.max[2] !== oldBB.max[2];
301
+ if (bbChanged) {
302
+ if (!((_a = this._stateEngine.viewportEngines[this._renderingEngine.id]) === null || _a === void 0 ? void 0 : _a.boundingBoxCreated.resolved) &&
303
+ !this._boundingBox.isEmpty())
304
+ (_b = this._stateEngine.viewportEngines[this._renderingEngine.id]) === null || _b === void 0 ? void 0 : _b.boundingBoxCreated.resolve(true);
305
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_CHANGE, {
306
+ viewportId: this._renderingEngine.id,
307
+ boundingBox: {
308
+ min: gl_matrix_1.vec3.clone(this._boundingBox.min),
309
+ max: gl_matrix_1.vec3.clone(this._boundingBox.max),
310
+ },
311
+ });
312
+ }
313
+ if (this._boundingBox.isEmpty()) {
314
+ // check if all outputs that should be loaded at the start of a session are loaded
315
+ // if the bounding box is empty then, emit the event
316
+ if (Object.values(this._stateEngine.sessionEngines).every((s) => s && s.initialOutputsLoaded.resolved === true)) {
317
+ this._eventEngine.emitEvent(viewer_shared_services_1.EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_EMPTY, {
318
+ viewportId: this._renderingEngine.id,
319
+ });
320
+ }
321
+ }
322
+ this._renderingEngine.renderingManager.evaluateTextureUnitCount(this._renderingEngine.lightLoader.shadowMapCount +
323
+ this._renderingEngine.materialLoader.maxMapCount);
324
+ /**
325
+ *
326
+ * Three.js texture upload and compiling
327
+ * This step is needed as three.js would compile the shaders and initialize the texture on the first render call instead.
328
+ *
329
+ */
330
+ // we initialize all texture and then clear the cache
331
+ const threeJsTextureCache = this._renderingEngine.materialLoader.threeJsTextureCache;
332
+ for (const key in threeJsTextureCache) {
333
+ if (threeJsTextureCache[key].usage === 0) {
334
+ threeJsTextureCache[key].texture.dispose();
335
+ delete threeJsTextureCache[key];
336
+ }
337
+ else if (threeJsTextureCache[key].initialized === false) {
338
+ this._renderingEngine.renderer.initTexture(threeJsTextureCache[key].texture);
339
+ threeJsTextureCache[key].initialized = true;
340
+ }
341
+ }
342
+ // we compile the shaders
343
+ this._renderingEngine.renderer.compile(this._renderingEngine.scene, this._hiddenCamera);
344
+ this._performanceEvaluator.endSection("sceneTreeUpdate." + this._lastRootVersion);
345
+ }
346
+ /**
347
+ * Remove obsolete child nodes from the converted object
348
+ */
349
+ cleanupObsoleteChildren(treeNode, convertedObject) {
350
+ // remove all child nodes in the transformed object that do not exist anymore
351
+ // the filter goes also through the data items as they were already added
352
+ const nodeIds = new Set(treeNode.children
353
+ .filter((d) => !d.excludeViewports.includes(this._renderingEngine.id))
354
+ .map((d) => d.id));
355
+ const childrenToRemove = convertedObject.children.filter((oc) => {
356
+ if (oc instanceof SDObject_1.SDObject && oc.SDtype === SDObject_1.SD_DATA_TYPE.OBJECT) {
357
+ return !nodeIds.has(oc.SDid);
358
+ }
359
+ else {
360
+ return false;
361
+ }
362
+ });
363
+ childrenToRemove.forEach((cTR) => {
364
+ cTR.traverse((o) => {
365
+ if (o instanceof SDObject_1.SDObject && o.SDtype !== SDObject_1.SD_DATA_TYPE.OBJECT) {
366
+ (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, o);
367
+ }
368
+ else if (!(o instanceof SDObject_1.SDObject) &&
369
+ o.userData.SDtype !== undefined) {
370
+ (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, o);
371
+ }
372
+ });
373
+ convertedObject.remove(cTR);
374
+ });
375
+ }
376
+ /**
377
+ * Remove obsolete data items from the converted object
378
+ */
379
+ cleanupObsoleteData(treeNode, convertedObject) {
380
+ // remove all data items that do not exist anymore
381
+ const dataMap = new Map(treeNode.data.map((d) => [d.id, d.version]));
382
+ const dataToRemove = convertedObject.children.filter((oc) => {
383
+ if (!(oc instanceof SDObject_1.SDObject)) {
384
+ const version = dataMap.get(oc.userData.SDid);
385
+ if (version !== undefined) {
386
+ if (version !== oc.userData.SDversion) {
387
+ // version is different
388
+ return true;
389
+ }
390
+ else {
391
+ return false;
392
+ }
393
+ }
394
+ else {
395
+ // id not included anymore
396
+ return true;
397
+ }
398
+ }
399
+ else {
400
+ return false;
401
+ }
402
+ });
403
+ dataToRemove.forEach((dTR) => {
404
+ (0, SceenTreeManagerUtils_1.removeData)(this._renderingEngine, dTR);
405
+ convertedObject.remove(dTR);
406
+ });
407
+ }
408
+ /**
409
+ * Check if a node is visible in the current viewport
410
+ */
411
+ isNodeVisible(treeNode) {
412
+ return (treeNode.visible &&
413
+ !treeNode.excludeViewports.includes(this._renderingEngine.id) &&
414
+ !(treeNode.restrictViewports.length > 0 &&
415
+ !treeNode.restrictViewports.includes(this._renderingEngine.id)));
416
+ }
417
+ /**
418
+ * Process a child node by creating it if needed, updating it, and syncing bounding boxes
419
+ */
420
+ processChildTreeNode(treeNodeChild, convertedObject, childConvertedObject, filter, isVisibleInHierarchy) {
421
+ if (!childConvertedObject) {
422
+ const newChild = new SDObject_1.SDObject(treeNodeChild.id, treeNodeChild.version);
423
+ const oldChild = treeNodeChild.convertedObject[this._renderingEngine.id];
424
+ treeNodeChild.convertedObject[this._renderingEngine.id] = newChild;
425
+ if (treeNodeChild.updateCallbackConvertedObject)
426
+ treeNodeChild.updateCallbackConvertedObject(newChild, oldChild, this._renderingEngine.id);
427
+ convertedObject.add(newChild);
428
+ this.updateNode(treeNodeChild, newChild, filter, isVisibleInHierarchy);
429
+ }
430
+ else if (childConvertedObject.SDversion !== treeNodeChild.version ||
431
+ this._newRendererType) {
432
+ // if the version is different, update the child
433
+ this.updateNode(treeNodeChild, childConvertedObject, filter, isVisibleInHierarchy);
434
+ childConvertedObject.SDversion = treeNodeChild.version;
435
+ }
436
+ else {
437
+ this.updateNode(treeNodeChild, childConvertedObject, filter, isVisibleInHierarchy);
438
+ }
439
+ }
440
+ /**
441
+ * Reset and initialize bounding boxes for a node
442
+ */
443
+ resetBoundingBoxes(treeNode) {
444
+ // reset the general bounding box of the current node
445
+ // it will be recomputed in the following steps
446
+ treeNode.boundingBox.reset();
447
+ // create the specific BB if it doesn't exist yet
448
+ if (!treeNode.boundingBoxViewport[this._renderingEngine.id])
449
+ treeNode.boundingBoxViewport[this._renderingEngine.id] = new viewer_shared_math_1.Box();
450
+ // reset the specific bounding box of the current node
451
+ // it will be recomputed in the following steps
452
+ treeNode.boundingBoxViewport[this._renderingEngine.id].reset();
453
+ }
454
+ /**
455
+ * Resolves the converted object for a node, handling cases where it doesn't exist
456
+ */
457
+ resolveConvertedObject(treeNode, filter, visibleInHierarchy) {
458
+ // check if there is a converted object
459
+ if (treeNode.convertedObject[this._renderingEngine.id]) {
460
+ return treeNode.convertedObject[this._renderingEngine.id];
461
+ }
462
+ else {
463
+ // the node has not been converted yet
464
+ // go up the hierarchy until a converted object is found
465
+ let parent = treeNode.parent;
466
+ while (parent) {
467
+ if (parent.convertedObject[this._renderingEngine.id]) {
468
+ this.updateNode(parent, parent.convertedObject[this._renderingEngine.id], filter, visibleInHierarchy);
469
+ return;
470
+ }
471
+ else {
472
+ parent = parent.parent;
473
+ }
474
+ }
475
+ // no converted object found in the hierarchy
476
+ // update the whole scene tree
477
+ this.updateSceneTree(this._tree.root);
478
+ return;
479
+ }
480
+ }
481
+ /**
482
+ * Union child bounding boxes with parent bounding boxes
483
+ */
484
+ unionChildBoundingBoxes(treeNode, treeNodeChild, isVisible) {
485
+ // adjust the general BB
486
+ if (!treeNodeChild.boundingBox.isEmpty())
487
+ treeNode.boundingBox.union(treeNodeChild.boundingBox);
488
+ // adjust the specific BB
489
+ if (treeNodeChild.boundingBoxViewport[this._renderingEngine.id] &&
490
+ !treeNodeChild.boundingBoxViewport[this._renderingEngine.id].isEmpty()) {
491
+ // only do this if the node is
492
+ // 1. visible
493
+ // 2. no included in the "excludeViewports"
494
+ // 3. if there are "restrictViewports", it needs to be in them
495
+ if (isVisible)
496
+ treeNode.boundingBoxViewport[this._renderingEngine.id].union(treeNodeChild.boundingBoxViewport[this._renderingEngine.id]);
497
+ }
498
+ }
499
+ }
500
+ exports.SceneTreeManager = SceneTreeManager;
491
501
  //# sourceMappingURL=SceneTreeManager.js.map