@shapediver/viewer.rendering-engine.rendering-engine-threejs 3.0.0

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 (301) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +3 -0
  3. package/dist/RenderingEngine.d.ts +296 -0
  4. package/dist/RenderingEngine.d.ts.map +1 -0
  5. package/dist/RenderingEngine.js +1079 -0
  6. package/dist/RenderingEngine.js.map +1 -0
  7. package/dist/index.d.ts +12 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +47 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts +11 -0
  12. package/dist/injectors/Tag3dGeometryCreationInjector.d.ts.map +1 -0
  13. package/dist/injectors/Tag3dGeometryCreationInjector.js +169 -0
  14. package/dist/injectors/Tag3dGeometryCreationInjector.js.map +1 -0
  15. package/dist/injectors/TextureUnifierInjector.d.ts +14 -0
  16. package/dist/injectors/TextureUnifierInjector.d.ts.map +1 -0
  17. package/dist/injectors/TextureUnifierInjector.js +227 -0
  18. package/dist/injectors/TextureUnifierInjector.js.map +1 -0
  19. package/dist/interfaces/ILoader.d.ts +4 -0
  20. package/dist/interfaces/ILoader.d.ts.map +1 -0
  21. package/dist/interfaces/ILoader.js +3 -0
  22. package/dist/interfaces/ILoader.js.map +1 -0
  23. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts +307 -0
  24. package/dist/interfaces/IPostProcessingEffectDefinitions.d.ts.map +1 -0
  25. package/dist/interfaces/IPostProcessingEffectDefinitions.js +31 -0
  26. package/dist/interfaces/IPostProcessingEffectDefinitions.js.map +1 -0
  27. package/dist/interfaces/IRenderingEngine.d.ts +43 -0
  28. package/dist/interfaces/IRenderingEngine.d.ts.map +1 -0
  29. package/dist/interfaces/IRenderingEngine.js +3 -0
  30. package/dist/interfaces/IRenderingEngine.js.map +1 -0
  31. package/dist/loaders/EnvironmentMapLoader.d.ts +98 -0
  32. package/dist/loaders/EnvironmentMapLoader.d.ts.map +1 -0
  33. package/dist/loaders/EnvironmentMapLoader.js +348 -0
  34. package/dist/loaders/EnvironmentMapLoader.js.map +1 -0
  35. package/dist/loaders/GeometryLoader.d.ts +38 -0
  36. package/dist/loaders/GeometryLoader.d.ts.map +1 -0
  37. package/dist/loaders/GeometryLoader.js +505 -0
  38. package/dist/loaders/GeometryLoader.js.map +1 -0
  39. package/dist/loaders/HTMLElementAnchorLoader.d.ts +17 -0
  40. package/dist/loaders/HTMLElementAnchorLoader.d.ts.map +1 -0
  41. package/dist/loaders/HTMLElementAnchorLoader.js +84 -0
  42. package/dist/loaders/HTMLElementAnchorLoader.js.map +1 -0
  43. package/dist/loaders/LightLoader.d.ts +19 -0
  44. package/dist/loaders/LightLoader.d.ts.map +1 -0
  45. package/dist/loaders/LightLoader.js +152 -0
  46. package/dist/loaders/LightLoader.js.map +1 -0
  47. package/dist/loaders/MaterialLoader.d.ts +99 -0
  48. package/dist/loaders/MaterialLoader.d.ts.map +1 -0
  49. package/dist/loaders/MaterialLoader.js +1175 -0
  50. package/dist/loaders/MaterialLoader.js.map +1 -0
  51. package/dist/managers/CameraManager.d.ts +20 -0
  52. package/dist/managers/CameraManager.d.ts.map +1 -0
  53. package/dist/managers/CameraManager.js +195 -0
  54. package/dist/managers/CameraManager.js.map +1 -0
  55. package/dist/managers/EnvironmentGeometryManager.d.ts +43 -0
  56. package/dist/managers/EnvironmentGeometryManager.d.ts.map +1 -0
  57. package/dist/managers/EnvironmentGeometryManager.js +210 -0
  58. package/dist/managers/EnvironmentGeometryManager.js.map +1 -0
  59. package/dist/managers/PostProcessingManager.d.ts +1014 -0
  60. package/dist/managers/PostProcessingManager.d.ts.map +1 -0
  61. package/dist/managers/PostProcessingManager.js +1013 -0
  62. package/dist/managers/PostProcessingManager.js.map +1 -0
  63. package/dist/managers/RenderingManager.d.ts +83 -0
  64. package/dist/managers/RenderingManager.d.ts.map +1 -0
  65. package/dist/managers/RenderingManager.js +567 -0
  66. package/dist/managers/RenderingManager.js.map +1 -0
  67. package/dist/managers/SceneTracingManager.d.ts +26 -0
  68. package/dist/managers/SceneTracingManager.d.ts.map +1 -0
  69. package/dist/managers/SceneTracingManager.js +122 -0
  70. package/dist/managers/SceneTracingManager.js.map +1 -0
  71. package/dist/managers/SceneTreeManager.d.ts +55 -0
  72. package/dist/managers/SceneTreeManager.d.ts.map +1 -0
  73. package/dist/managers/SceneTreeManager.js +501 -0
  74. package/dist/managers/SceneTreeManager.js.map +1 -0
  75. package/dist/managers/postprocessing/GodRaysManager.d.ts +13 -0
  76. package/dist/managers/postprocessing/GodRaysManager.d.ts.map +1 -0
  77. package/dist/managers/postprocessing/GodRaysManager.js +64 -0
  78. package/dist/managers/postprocessing/GodRaysManager.js.map +1 -0
  79. package/dist/managers/postprocessing/OutlineManager.d.ts +15 -0
  80. package/dist/managers/postprocessing/OutlineManager.d.ts.map +1 -0
  81. package/dist/managers/postprocessing/OutlineManager.js +67 -0
  82. package/dist/managers/postprocessing/OutlineManager.js.map +1 -0
  83. package/dist/managers/postprocessing/SSAARenderPass.d.ts +54 -0
  84. package/dist/managers/postprocessing/SSAARenderPass.d.ts.map +1 -0
  85. package/dist/managers/postprocessing/SSAARenderPass.js +234 -0
  86. package/dist/managers/postprocessing/SSAARenderPass.js.map +1 -0
  87. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts +15 -0
  88. package/dist/managers/postprocessing/SelectiveBloomManager.d.ts.map +1 -0
  89. package/dist/managers/postprocessing/SelectiveBloomManager.js +67 -0
  90. package/dist/managers/postprocessing/SelectiveBloomManager.js.map +1 -0
  91. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts +47 -0
  92. package/dist/managers/postprocessing/ao/ao/AOEffect.d.ts.map +1 -0
  93. package/dist/managers/postprocessing/ao/ao/AOEffect.js +134 -0
  94. package/dist/managers/postprocessing/ao/ao/AOEffect.js.map +1 -0
  95. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts +13 -0
  96. package/dist/managers/postprocessing/ao/ao/AOPass.d.ts.map +1 -0
  97. package/dist/managers/postprocessing/ao/ao/AOPass.js +78 -0
  98. package/dist/managers/postprocessing/ao/ao/AOPass.js.map +1 -0
  99. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts +2 -0
  100. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.d.ts.map +1 -0
  101. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js +23 -0
  102. package/dist/managers/postprocessing/ao/ao/shader/ao_compose.js.map +1 -0
  103. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts +15 -0
  104. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.d.ts.map +1 -0
  105. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js +25 -0
  106. package/dist/managers/postprocessing/ao/hbao/HBAOEffect.js.map +1 -0
  107. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts +2 -0
  108. package/dist/managers/postprocessing/ao/hbao/shader/hbao.d.ts.map +1 -0
  109. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js +102 -0
  110. package/dist/managers/postprocessing/ao/hbao/shader/hbao.js.map +1 -0
  111. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts +2 -0
  112. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.d.ts.map +1 -0
  113. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js +99 -0
  114. package/dist/managers/postprocessing/ao/hbao/shader/hbao_utils.js.map +1 -0
  115. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts +37 -0
  116. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.d.ts.map +1 -0
  117. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js +171 -0
  118. package/dist/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.js.map +1 -0
  119. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts +2 -0
  120. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.d.ts.map +1 -0
  121. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js +131 -0
  122. package/dist/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.js.map +1 -0
  123. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts +15 -0
  124. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.d.ts.map +1 -0
  125. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js +76 -0
  126. package/dist/managers/postprocessing/ao/ssao/SSAOEffect.js.map +1 -0
  127. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts +2 -0
  128. package/dist/managers/postprocessing/ao/ssao/shader/ssao.d.ts.map +1 -0
  129. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js +134 -0
  130. package/dist/managers/postprocessing/ao/ssao/shader/ssao.js.map +1 -0
  131. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts +2 -0
  132. package/dist/managers/postprocessing/ao/utils/shader/basic.d.ts.map +1 -0
  133. package/dist/managers/postprocessing/ao/utils/shader/basic.js +12 -0
  134. package/dist/managers/postprocessing/ao/utils/shader/basic.js.map +1 -0
  135. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts +2 -0
  136. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.d.ts.map +1 -0
  137. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js +42 -0
  138. package/dist/managers/postprocessing/ao/utils/shader/sampleBlueNoise.js.map +1 -0
  139. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts +38 -0
  140. package/dist/managers/postprocessing/utils/CopyMaterial.d.ts.map +1 -0
  141. package/dist/managers/postprocessing/utils/CopyMaterial.js +106 -0
  142. package/dist/managers/postprocessing/utils/CopyMaterial.js.map +1 -0
  143. package/dist/managers/postprocessing/utils/CopyShader.d.ts +14 -0
  144. package/dist/managers/postprocessing/utils/CopyShader.d.ts.map +1 -0
  145. package/dist/managers/postprocessing/utils/CopyShader.js +36 -0
  146. package/dist/managers/postprocessing/utils/CopyShader.js.map +1 -0
  147. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts +10 -0
  148. package/dist/managers/postprocessing/utils/FullScreenQuad.d.ts.map +1 -0
  149. package/dist/managers/postprocessing/utils/FullScreenQuad.js +29 -0
  150. package/dist/managers/postprocessing/utils/FullScreenQuad.js.map +1 -0
  151. package/dist/managers/postprocessing/utils/NormalPass.d.ts +88 -0
  152. package/dist/managers/postprocessing/utils/NormalPass.d.ts.map +1 -0
  153. package/dist/managers/postprocessing/utils/NormalPass.js +157 -0
  154. package/dist/managers/postprocessing/utils/NormalPass.js.map +1 -0
  155. package/dist/managers/postprocessing/utils/RenderPass.d.ts +115 -0
  156. package/dist/managers/postprocessing/utils/RenderPass.d.ts.map +1 -0
  157. package/dist/managers/postprocessing/utils/RenderPass.js +251 -0
  158. package/dist/managers/postprocessing/utils/RenderPass.js.map +1 -0
  159. package/dist/materials/GemMaterial.d.ts +38 -0
  160. package/dist/materials/GemMaterial.d.ts.map +1 -0
  161. package/dist/materials/GemMaterial.js +253 -0
  162. package/dist/materials/GemMaterial.js.map +1 -0
  163. package/dist/materials/MeshUnlitMaterialParameters.d.ts +4 -0
  164. package/dist/materials/MeshUnlitMaterialParameters.d.ts.map +1 -0
  165. package/dist/materials/MeshUnlitMaterialParameters.js +3 -0
  166. package/dist/materials/MeshUnlitMaterialParameters.js.map +1 -0
  167. package/dist/materials/MultiPointsMaterial.d.ts +94 -0
  168. package/dist/materials/MultiPointsMaterial.d.ts.map +1 -0
  169. package/dist/materials/MultiPointsMaterial.js +567 -0
  170. package/dist/materials/MultiPointsMaterial.js.map +1 -0
  171. package/dist/materials/SpecularGlossinessMaterial.d.ts +14 -0
  172. package/dist/materials/SpecularGlossinessMaterial.d.ts.map +1 -0
  173. package/dist/materials/SpecularGlossinessMaterial.js +162 -0
  174. package/dist/materials/SpecularGlossinessMaterial.js.map +1 -0
  175. package/dist/objects/SDBone.d.ts +13 -0
  176. package/dist/objects/SDBone.d.ts.map +1 -0
  177. package/dist/objects/SDBone.js +75 -0
  178. package/dist/objects/SDBone.js.map +1 -0
  179. package/dist/objects/SDColor.d.ts +17 -0
  180. package/dist/objects/SDColor.d.ts.map +1 -0
  181. package/dist/objects/SDColor.js +49 -0
  182. package/dist/objects/SDColor.js.map +1 -0
  183. package/dist/objects/SDData.d.ts +19 -0
  184. package/dist/objects/SDData.d.ts.map +1 -0
  185. package/dist/objects/SDData.js +48 -0
  186. package/dist/objects/SDData.js.map +1 -0
  187. package/dist/objects/SDObject.d.ts +14 -0
  188. package/dist/objects/SDObject.d.ts.map +1 -0
  189. package/dist/objects/SDObject.js +81 -0
  190. package/dist/objects/SDObject.js.map +1 -0
  191. package/dist/shaders/PCSS.d.ts +3 -0
  192. package/dist/shaders/PCSS.d.ts.map +1 -0
  193. package/dist/shaders/PCSS.js +127 -0
  194. package/dist/shaders/PCSS.js.map +1 -0
  195. package/dist/shaders/gem.d.ts +3 -0
  196. package/dist/shaders/gem.d.ts.map +1 -0
  197. package/dist/shaders/gem.js +578 -0
  198. package/dist/shaders/gem.js.map +1 -0
  199. package/dist/shaders/multi_points.d.ts +3 -0
  200. package/dist/shaders/multi_points.d.ts.map +1 -0
  201. package/dist/shaders/multi_points.js +294 -0
  202. package/dist/shaders/multi_points.js.map +1 -0
  203. package/dist/styling/viewport-css.d.ts +2 -0
  204. package/dist/styling/viewport-css.d.ts.map +1 -0
  205. package/dist/styling/viewport-css.js +117 -0
  206. package/dist/styling/viewport-css.js.map +1 -0
  207. package/dist/three/font.d.ts +2365 -0
  208. package/dist/three/font.d.ts.map +1 -0
  209. package/dist/three/font.js +6 -0
  210. package/dist/three/font.js.map +1 -0
  211. package/dist/three/geometries/TextGeometry.d.ts +22 -0
  212. package/dist/three/geometries/TextGeometry.d.ts.map +1 -0
  213. package/dist/three/geometries/TextGeometry.js +45 -0
  214. package/dist/three/geometries/TextGeometry.js.map +1 -0
  215. package/dist/three/loaders/FontLoader.d.ts +15 -0
  216. package/dist/three/loaders/FontLoader.d.ts.map +1 -0
  217. package/dist/three/loaders/FontLoader.js +118 -0
  218. package/dist/three/loaders/FontLoader.js.map +1 -0
  219. package/dist/three/loaders/RGBELoader.d.ts +24 -0
  220. package/dist/three/loaders/RGBELoader.d.ts.map +1 -0
  221. package/dist/three/loaders/RGBELoader.js +299 -0
  222. package/dist/three/loaders/RGBELoader.js.map +1 -0
  223. package/dist/types/IThreejsData.d.ts +7 -0
  224. package/dist/types/IThreejsData.d.ts.map +1 -0
  225. package/dist/types/IThreejsData.js +3 -0
  226. package/dist/types/IThreejsData.js.map +1 -0
  227. package/dist/types/ThreejsData.d.ts +11 -0
  228. package/dist/types/ThreejsData.d.ts.map +1 -0
  229. package/dist/types/ThreejsData.js +42 -0
  230. package/dist/types/ThreejsData.js.map +1 -0
  231. package/package.json +65 -0
  232. package/src/RenderingEngine.ts +1342 -0
  233. package/src/index.ts +23 -0
  234. package/src/injectors/Tag3dGeometryCreationInjector.ts +170 -0
  235. package/src/injectors/TextureUnifierInjector.ts +224 -0
  236. package/src/interfaces/ILoader.ts +3 -0
  237. package/src/interfaces/IPostProcessingEffectDefinitions.ts +402 -0
  238. package/src/interfaces/IRenderingEngine.ts +48 -0
  239. package/src/loaders/EnvironmentMapLoader.ts +355 -0
  240. package/src/loaders/GeometryLoader.ts +565 -0
  241. package/src/loaders/HTMLElementAnchorLoader.ts +107 -0
  242. package/src/loaders/LightLoader.ts +171 -0
  243. package/src/loaders/MaterialLoader.ts +1418 -0
  244. package/src/managers/CameraManager.ts +178 -0
  245. package/src/managers/EnvironmentGeometryManager.ts +224 -0
  246. package/src/managers/PostProcessingManager.ts +1169 -0
  247. package/src/managers/RenderingManager.ts +657 -0
  248. package/src/managers/SceneTracingManager.ts +120 -0
  249. package/src/managers/SceneTreeManager.ts +569 -0
  250. package/src/managers/postprocessing/GodRaysManager.ts +52 -0
  251. package/src/managers/postprocessing/OutlineManager.ts +58 -0
  252. package/src/managers/postprocessing/SSAARenderPass.ts +339 -0
  253. package/src/managers/postprocessing/SelectiveBloomManager.ts +58 -0
  254. package/src/managers/postprocessing/ao/ao/AOEffect.ts +180 -0
  255. package/src/managers/postprocessing/ao/ao/AOPass.ts +128 -0
  256. package/src/managers/postprocessing/ao/ao/shader/ao_compose.glsl +17 -0
  257. package/src/managers/postprocessing/ao/ao/shader/ao_compose.ts +19 -0
  258. package/src/managers/postprocessing/ao/hbao/HBAOEffect.ts +41 -0
  259. package/src/managers/postprocessing/ao/hbao/shader/hbao.glsl +96 -0
  260. package/src/managers/postprocessing/ao/hbao/shader/hbao.ts +98 -0
  261. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.glsl +92 -0
  262. package/src/managers/postprocessing/ao/hbao/shader/hbao_utils.ts +95 -0
  263. package/src/managers/postprocessing/ao/poissionDenoise/PoissionDenoisePass.ts +245 -0
  264. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.glsl +125 -0
  265. package/src/managers/postprocessing/ao/poissionDenoise/shader/poissionDenoise.ts +127 -0
  266. package/src/managers/postprocessing/ao/ssao/SSAOEffect.ts +106 -0
  267. package/src/managers/postprocessing/ao/ssao/shader/ssao.glsl +128 -0
  268. package/src/managers/postprocessing/ao/ssao/shader/ssao.ts +130 -0
  269. package/src/managers/postprocessing/ao/utils/shader/basic.glsl +6 -0
  270. package/src/managers/postprocessing/ao/utils/shader/basic.ts +8 -0
  271. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.glsl +36 -0
  272. package/src/managers/postprocessing/ao/utils/shader/sampleBlueNoise.ts +38 -0
  273. package/src/managers/postprocessing/utils/CopyMaterial.ts +130 -0
  274. package/src/managers/postprocessing/utils/CopyShader.ts +39 -0
  275. package/src/managers/postprocessing/utils/FullScreenQuad.ts +47 -0
  276. package/src/managers/postprocessing/utils/NormalPass.ts +222 -0
  277. package/src/managers/postprocessing/utils/RenderPass.ts +366 -0
  278. package/src/materials/GemMaterial.ts +268 -0
  279. package/src/materials/MeshUnlitMaterialParameters.ts +4 -0
  280. package/src/materials/MultiPointsMaterial.ts +646 -0
  281. package/src/materials/SpecularGlossinessMaterial.ts +182 -0
  282. package/src/objects/SDBone.ts +51 -0
  283. package/src/objects/SDColor.ts +54 -0
  284. package/src/objects/SDData.ts +44 -0
  285. package/src/objects/SDObject.ts +58 -0
  286. package/src/shaders/PCSS.ts +124 -0
  287. package/src/shaders/gem.ts +575 -0
  288. package/src/shaders/gem_frag.glsl +517 -0
  289. package/src/shaders/gem_vert.glsl +53 -0
  290. package/src/shaders/multi_points.ts +291 -0
  291. package/src/shaders/multi_points_frag.glsl +166 -0
  292. package/src/shaders/multi_points_vert.glsl +120 -0
  293. package/src/styling/viewport-css.ts +113 -0
  294. package/src/styling/viewport.css +111 -0
  295. package/src/three/font.ts +2 -0
  296. package/src/three/geometries/TextGeometry.ts +58 -0
  297. package/src/three/loaders/FontLoader.ts +205 -0
  298. package/src/three/loaders/RGBELoader.ts +496 -0
  299. package/src/types/IThreejsData.ts +16 -0
  300. package/src/types/ThreejsData.ts +43 -0
  301. package/tsconfig.json +20 -0
@@ -0,0 +1,120 @@
1
+ import * as THREE from 'three';
2
+ import { AbstractCamera, ORTHOGRAPHIC_CAMERA_DIRECTION, OrthographicCamera } from '@shapediver/viewer.rendering-engine.camera-engine';
3
+ import { IManager } from '@shapediver/viewer.rendering-engine.rendering-engine';
4
+ import { RenderingEngine } from '../RenderingEngine';
5
+ import { ShapeDiverViewerViewportError } from '@shapediver/viewer.shared.services';
6
+ import { vec2, vec3 } from 'gl-matrix';
7
+
8
+ export class SceneTracingManager implements IManager {
9
+ // #region Properties (1)
10
+
11
+ private readonly _raycaster = new THREE.Raycaster();
12
+
13
+ // #endregion Properties (1)
14
+
15
+ // #region Constructors (1)
16
+
17
+ constructor(private readonly _renderingEngine: RenderingEngine) { }
18
+
19
+ // #endregion Constructors (1)
20
+
21
+ // #region Public Methods (3)
22
+
23
+ public convert3Dto2D(p: vec3): {
24
+ container: vec2, client: vec2, page: vec2, hidden: boolean
25
+ } {
26
+ const canvasPageCoordinates = this._renderingEngine.canvas.getBoundingClientRect(),
27
+ width = this._renderingEngine.canvas.width,
28
+ height = this._renderingEngine.canvas.height;
29
+
30
+ const camera = this._renderingEngine.cameraEngine.camera;
31
+ if (!camera)
32
+ throw new ShapeDiverViewerViewportError('SceneTracingManager.convert3Dto2D: No camera is defined for this viewer.');
33
+
34
+ // should be anchor pos
35
+ const screenVector = new THREE.Vector3();
36
+ screenVector.set(p[0], p[1], p[2]);
37
+
38
+ this._raycaster.ray.direction.copy(screenVector);
39
+ this._raycaster.ray.origin.set(0, 0, 0);
40
+ (camera.convertedObject[this._renderingEngine.id] as THREE.Camera).localToWorld(this._raycaster.ray.origin);
41
+ this._raycaster.ray.direction.sub(this._raycaster.ray.origin);
42
+ this._raycaster.ray.direction.normalize();
43
+
44
+ let closestIntersectionDistance = Number.MAX_VALUE;
45
+ this._renderingEngine.sceneTreeManager.scene.traverseVisible((obj: THREE.Object3D) => {
46
+ if (obj instanceof THREE.Mesh) {
47
+ const curIntersections = this._raycaster.intersectObject(obj);
48
+ if (curIntersections.length)
49
+ if (curIntersections[0].distance < closestIntersectionDistance)
50
+ closestIntersectionDistance = curIntersections[0].distance;
51
+ }
52
+ });
53
+
54
+ const pos: vec2 = (<AbstractCamera>camera).project(vec3.clone(p));
55
+
56
+ pos[0] = (pos[0] * (width / 2)) + (width / 2);
57
+ pos[1] = - (pos[1] * (height / 2)) + (height / 2);
58
+
59
+ // take care of correction by device pixel ratio
60
+ pos[0] = pos[0] / devicePixelRatio;
61
+ pos[1] = pos[1] / devicePixelRatio;
62
+
63
+ // epsilon is added as a distance spacer as users tend to put the anchors of html elements directly at the vertices
64
+ // with this we prevent flickering
65
+ const eps = 0.0001;
66
+
67
+ return {
68
+ hidden: closestIntersectionDistance + eps < vec3.distance(camera.position, p),
69
+ container: vec2.clone(pos),
70
+ client: vec2.fromValues(pos[0] + canvasPageCoordinates.left, pos[1] + canvasPageCoordinates.top),
71
+ page: vec2.fromValues(pos[0] + canvasPageCoordinates.left + window.pageXOffset, pos[1] + canvasPageCoordinates.top + window.pageYOffset)
72
+ };
73
+ }
74
+
75
+ public init(): void { }
76
+
77
+ /**
78
+ * Calculate the ray that is created by the mouse event and the camera.
79
+ *
80
+ * @param event
81
+ * @returns
82
+ */
83
+ public pointerEventToRay(event: PointerEvent): {
84
+ origin: vec3,
85
+ direction: vec3
86
+ } {
87
+ const rect = this._renderingEngine.canvas.getBoundingClientRect();
88
+ const camera = this._renderingEngine.cameraEngine.camera;
89
+ if (!camera)
90
+ throw new ShapeDiverViewerViewportError('SceneTracingManager.pointerEventToRay: No camera is defined for this viewer.');
91
+
92
+ const _mouse_x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
93
+ const _mouse_y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;
94
+
95
+ let origin = vec3.clone(camera.position);
96
+ if (camera instanceof OrthographicCamera) {
97
+ if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.TOP) {
98
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(_mouse_x * camera.right, _mouse_y * camera.top, 0));
99
+ } else if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.BOTTOM) {
100
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(_mouse_x * camera.left, _mouse_y * camera.top, 0));
101
+ } else if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.LEFT) {
102
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(0, _mouse_x * camera.left, _mouse_y * camera.top));
103
+ } else if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.RIGHT) {
104
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(0, _mouse_x * camera.right, _mouse_y * camera.top));
105
+ } else if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.FRONT) {
106
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(_mouse_x * camera.right, 0, _mouse_y * camera.top));
107
+ } else if (camera.direction == ORTHOGRAPHIC_CAMERA_DIRECTION.BACK) {
108
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(_mouse_x * camera.left, 0, _mouse_y * camera.top));
109
+ } else {
110
+ origin = vec3.add(vec3.create(), camera.position, vec3.fromValues(0, _mouse_x * camera.left, _mouse_y * camera.top));
111
+ }
112
+ }
113
+
114
+ const direction = vec3.normalize(vec3.create(), vec3.sub(vec3.create(), camera.unproject(vec3.fromValues(_mouse_x, _mouse_y, 0.5)), origin));
115
+
116
+ return { origin, direction };
117
+ }
118
+
119
+ // #endregion Public Methods (3)
120
+ }
@@ -0,0 +1,569 @@
1
+ import * as THREE from 'three';
2
+ import { AbstractCamera } from '@shapediver/viewer.rendering-engine.camera-engine';
3
+ import { AbstractLight, DirectionalLight } from '@shapediver/viewer.rendering-engine.light-engine';
4
+ import {
5
+ AbstractMaterialData,
6
+ AnimationData,
7
+ BoneData,
8
+ GeometryData,
9
+ HTMLElementAnchorData,
10
+ IMaterialAbstractData,
11
+ ISDTFOverview,
12
+ MaterialStandardData,
13
+ SDTFItemData,
14
+ SDTFOverviewData
15
+ } from '@shapediver/viewer.shared.types';
16
+ import { Box, IBox } from '@shapediver/viewer.shared.math';
17
+ import { IManager, RENDERER_TYPE } from '@shapediver/viewer.rendering-engine.rendering-engine';
18
+ import {
19
+ ITree,
20
+ ITreeNode,
21
+ ITreeNodeData,
22
+ Tree
23
+ } from '@shapediver/viewer.shared.node-tree';
24
+ import { mat4, vec3 } from 'gl-matrix';
25
+ import { RenderingEngine } from '../RenderingEngine';
26
+ import { SD_DATA_TYPE, SDData } from '../objects/SDData';
27
+ import { SDBone } from '../objects/SDBone';
28
+ import { SDObject } from '../objects/SDObject';
29
+ import { ThreejsData } from '../types/ThreejsData';
30
+ /* eslint-disable @typescript-eslint/no-empty-function */
31
+ import {
32
+ EventEngine,
33
+ EVENTTYPE,
34
+ InputValidator,
35
+ StateEngine,
36
+ } from '@shapediver/viewer.shared.services';
37
+
38
+ // #region Type aliases (1)
39
+
40
+ type UpdateFilter = {
41
+ transformationOnly: boolean
42
+ }
43
+
44
+ // #endregion Type aliases (1)
45
+
46
+ // #region Classes (1)
47
+
48
+ export class SceneTreeManager implements IManager {
49
+ // #region Properties (12)
50
+
51
+ private readonly _eventEngine: EventEngine = EventEngine.instance;
52
+ private readonly _inputValidator: InputValidator = InputValidator.instance;
53
+ private readonly _scene: THREE.Scene = new THREE.Scene();
54
+ private readonly _stateEngine: StateEngine = StateEngine.instance;
55
+ private readonly _tree: ITree = Tree.instance;
56
+
57
+ private _boundingBox: IBox = new Box();
58
+ private _boundingBoxSensitiveData: {
59
+ data: AbstractLight,
60
+ dataChild: SDData
61
+ }[] = [];
62
+ private _currentSDTFOverview!: ISDTFOverview;
63
+ private _hiddenCamera: THREE.PerspectiveCamera = new THREE.PerspectiveCamera();
64
+ private _lastRendererType: RENDERER_TYPE = RENDERER_TYPE.STANDARD;
65
+ private _lastRootVersion: string = '';
66
+ private _mainNode!: SDObject;
67
+
68
+ // #endregion Properties (12)
69
+
70
+ // #region Constructors (1)
71
+
72
+ constructor(private readonly _renderingEngine: RenderingEngine) {
73
+ this._scene.background = new THREE.Color('#ffffff');
74
+ }
75
+
76
+ // #endregion Constructors (1)
77
+
78
+ // #region Public Getters And Setters (4)
79
+
80
+ public get boundingBox(): IBox {
81
+ return this._boundingBox;
82
+ }
83
+
84
+ public get lastRendererType(): RENDERER_TYPE {
85
+ return this._lastRendererType;
86
+ }
87
+
88
+ public get lastRootVersion(): string {
89
+ return this._lastRootVersion;
90
+ }
91
+
92
+ public get scene() {
93
+ return this._scene;
94
+ }
95
+
96
+ // #endregion Public Getters And Setters (4)
97
+
98
+ // #region Public Methods (6)
99
+
100
+ public init(): void { }
101
+
102
+ public isEmpty() {
103
+ return ((this._boundingBox.min[0] === 0 && this._boundingBox.min[1] === 0 && this._boundingBox.min[2] === 0 &&
104
+ this._boundingBox.max[0] === 0 && this._boundingBox.max[1] === 0 && this._boundingBox.max[2] === 0) || this._boundingBox.isEmpty());
105
+ }
106
+
107
+ /**
108
+ * Convert the data of the scene graph node into the format of the implementation.
109
+ *
110
+ * @param data the data element
111
+ * @param obj the corresponding type node
112
+ */
113
+ public updateData(node: ITreeNode, obj: SDObject, data: ITreeNodeData, filter: UpdateFilter, isVisibleInHierarchy: boolean, skeleton?: THREE.Skeleton): void {
114
+ let dataChild = <SDData>obj.children.find(oc => (<SDData>oc).SDid === data.id && (<SDData>oc).SDversion === data.version);
115
+ let newChild = false;
116
+
117
+ if (!dataChild) {
118
+ newChild = true;
119
+ dataChild = new SDData(data.id, data.version);
120
+ obj.add(dataChild);
121
+ }
122
+
123
+ if (this._renderingEngine.type === RENDERER_TYPE.ATTRIBUTES)
124
+ this.injectAttributeData(node, data);
125
+
126
+ switch (true) {
127
+ case data instanceof GeometryData:
128
+ {
129
+ dataChild.SDtype = SD_DATA_TYPE.GEOMETRY;
130
+
131
+ if (filter.transformationOnly === false)
132
+ this._renderingEngine.geometryLoader.load(<GeometryData>data, dataChild, newChild, skeleton).clone();
133
+
134
+ let bb: IBox = new Box();
135
+ if (skeleton) {
136
+ bb = (<GeometryData>data).primitive.computeBoundingBox(node.worldMatrix);
137
+ } else {
138
+ const clone = dataChild.clone();
139
+ clone.applyTransformation(node.worldMatrix);
140
+ const threeBox = new THREE.Box3().setFromObject(clone, true);
141
+ bb = new Box(vec3.fromValues(threeBox.min.x, threeBox.min.y, threeBox.min.z), vec3.fromValues(threeBox.max.x, threeBox.max.y, threeBox.max.z));
142
+ }
143
+
144
+ // adjust the general BB
145
+ node.boundingBox.union(bb);
146
+
147
+ // create the specific BB if it doesn't exist yet
148
+ if (!node.boundingBoxViewport[this._renderingEngine.id])
149
+ node.boundingBoxViewport[this._renderingEngine.id] = new Box();
150
+
151
+ // adjust the specific BB
152
+ node.boundingBoxViewport[this._renderingEngine.id].union(bb);
153
+ }
154
+ break;
155
+ case data instanceof ThreejsData:
156
+ {
157
+ dataChild.SDtype = SD_DATA_TYPE.THREEJS;
158
+ dataChild.add(<SDData>(<ThreejsData>data).obj);
159
+
160
+ const bbThree = new THREE.Box3().setFromObject((<ThreejsData>data).obj);
161
+
162
+ // adjust the general BB
163
+ node.boundingBox.union(new Box(vec3.fromValues(...bbThree.min.toArray()), vec3.fromValues(...bbThree.max.toArray())));
164
+
165
+ // create the specific BB if it doesn't exist yet
166
+ if (!node.boundingBoxViewport[this._renderingEngine.id])
167
+ node.boundingBoxViewport[this._renderingEngine.id] = new Box();
168
+
169
+ // adjust the specific BB
170
+ node.boundingBoxViewport[this._renderingEngine.id].union(new Box(vec3.fromValues(...bbThree.min.toArray()), vec3.fromValues(...bbThree.max.toArray())));
171
+ }
172
+ break;
173
+ case data instanceof AbstractMaterialData:
174
+ dataChild.SDtype = SD_DATA_TYPE.MATERIAL;
175
+ break;
176
+ case data instanceof AbstractLight:
177
+ dataChild.SDtype = SD_DATA_TYPE.LIGHT;
178
+ if (filter.transformationOnly === false) this._renderingEngine.lightLoader.load(<AbstractLight>data, dataChild);
179
+ if (data instanceof DirectionalLight && (<DirectionalLight>data).useNodeData === false)
180
+ this._boundingBoxSensitiveData.push({ data: <AbstractLight>data, dataChild });
181
+ break;
182
+ case data instanceof AbstractCamera:
183
+ dataChild.SDtype = SD_DATA_TYPE.CAMERA;
184
+ if (filter.transformationOnly === false) this._renderingEngine.cameraManager.load(<AbstractCamera>data, dataChild);
185
+ break;
186
+ case data instanceof HTMLElementAnchorData:
187
+ dataChild.SDtype = SD_DATA_TYPE.HTML_ELEMENT_ANCHOR;
188
+ if (filter.transformationOnly === false) this._renderingEngine.htmlElementAnchorLoader.load(node, <HTMLElementAnchorData>data, isVisibleInHierarchy);
189
+ break;
190
+ case data instanceof AnimationData:
191
+ dataChild.SDtype = SD_DATA_TYPE.ANIMATION;
192
+ break;
193
+ default:
194
+ // if there is no valid conversion here, call the convertData of the implementation
195
+ break;
196
+ }
197
+ }
198
+
199
+ public updateMorphWeights(node: ITreeNode = this._tree.root, obj: SDObject = this._mainNode) {
200
+ if (!node || !obj) return;
201
+
202
+ for (let i = 0, len = node.data.length; i < len; i++) {
203
+ if (node.data[i] instanceof GeometryData) {
204
+ const data: GeometryData = <GeometryData>node.data[i];
205
+ const dataChild = <SDData>obj.children.find(oc => (<SDData>oc).SDid === data.id && (<SDData>oc).SDversion === data.version);
206
+ if (dataChild)
207
+ dataChild.traverse(o => {
208
+ if (o instanceof THREE.Points ||
209
+ o instanceof THREE.LineSegments ||
210
+ o instanceof THREE.LineLoop ||
211
+ o instanceof THREE.Line ||
212
+ o instanceof THREE.Mesh)
213
+ o.morphTargetInfluences = data.morphWeights;
214
+ });
215
+ }
216
+ }
217
+
218
+ for (let i = 0, len = node.children.length; i < len; i++) {
219
+ const nodeChild = node.children[i];
220
+ if (!nodeChild) continue;
221
+ const objChild = <SDObject>obj.children.find(oc => (<SDObject>oc).SDid === nodeChild.id);
222
+ if (objChild) this.updateMorphWeights(nodeChild, objChild);
223
+ }
224
+ }
225
+
226
+ /**
227
+ * Update the current node via the scene graph node.
228
+ * Convert the data if needed.
229
+ *
230
+ * @param node the scene graph node
231
+ * @param obj the current type object
232
+ */
233
+ public updateNode(node: ITreeNode = this._tree.root, obj: THREE.Object3D = this._mainNode, filter: UpdateFilter = { transformationOnly: false }, visibleInHierarchy: boolean = true, skeleton?: THREE.Skeleton) {
234
+ const convertedObject = <SDObject>obj;
235
+
236
+ // reset the general bounding box of the current node
237
+ // it will be recomputed in the following steps
238
+ node.boundingBox.reset();
239
+
240
+ // create the specific BB if it doesn't exist yet
241
+ if (!node.boundingBoxViewport[this._renderingEngine.id])
242
+ node.boundingBoxViewport[this._renderingEngine.id] = new Box();
243
+
244
+ // reset the specific bounding box of the current node
245
+ // it will be recomputed in the following steps
246
+ node.boundingBoxViewport[this._renderingEngine.id].reset();
247
+
248
+ if (filter.transformationOnly === false) {
249
+ // remove all data items that do not exist anymore
250
+ const dataIds = node.data.map(d => d.id);
251
+ const dataToRemove = convertedObject.children.filter(oc => {
252
+ if (oc instanceof SDData) {
253
+ if (dataIds.includes(oc.SDid)) {
254
+ const data = node.data.find(d => d.id === oc.SDid);
255
+ if (data && data.version !== oc.SDversion) {
256
+ // version is different
257
+ return true;
258
+ } else {
259
+ return false;
260
+ }
261
+ } else {
262
+ // id not included anymore
263
+ return true;
264
+ }
265
+ } else {
266
+ return false;
267
+ }
268
+ });
269
+
270
+ dataToRemove.forEach(dTR => {
271
+ this.removeData(<SDData>dTR);
272
+ convertedObject.remove(dTR);
273
+ });
274
+
275
+ // remove all child nodes in the transformed object that do not exist anymore
276
+ // the filter goes also through the data items as they were already added
277
+ const nodeIds = node.children.filter(d => !d.excludeViewports.includes(this._renderingEngine.id)).map(d => d.id);
278
+ const childrenToRemove = convertedObject.children.filter(oc => {
279
+ if (oc instanceof SDObject && !(oc instanceof SDData)) {
280
+ if (nodeIds.includes(oc.SDid)) {
281
+ const child = node.children.find(d => d.id === oc.SDid);
282
+ if (child && child.version !== oc.SDversion) {
283
+ // version is different
284
+ return true;
285
+ } else {
286
+ return false;
287
+ }
288
+ } else {
289
+ // id not included anymore
290
+ return true;
291
+ }
292
+ } else {
293
+ return false;
294
+ }
295
+ });
296
+ childrenToRemove.forEach(cTR => {
297
+ cTR.traverse(o => {
298
+ if (o instanceof SDData)
299
+ this.removeData(o);
300
+ });
301
+ convertedObject.remove(cTR);
302
+ });
303
+ }
304
+
305
+ // create the skeleton if the node is marked as the skin node (root node of the skeleton)
306
+ if (node.skinNode === true) {
307
+ const bones: THREE.Bone[] = [];
308
+ for (let i = 0; i < node.bones.length; i++)
309
+ bones.push(this.getBone(node.bones[i]));
310
+
311
+ const boneInverses: THREE.Matrix4[] = [];
312
+ for (let i = 0; i < node.boneInverses.length; i++)
313
+ boneInverses.push(new THREE.Matrix4().fromArray(node.boneInverses[i]));
314
+
315
+ skeleton = new THREE.Skeleton(bones, boneInverses);
316
+ }
317
+
318
+ const isVisible = node.visible && !node.excludeViewports.includes(this._renderingEngine.id) && !(node.restrictViewports.length > 0 && !node.restrictViewports.includes(this._renderingEngine.id));
319
+ const isVisibleInHierarchy = visibleInHierarchy && isVisible;
320
+
321
+ // convert all data items of the current node
322
+ // old versions will be replaced by new ones
323
+ for (let i = 0, len = node.data.length; i < len; i++)
324
+ this.updateData(node, convertedObject, node.data[i], filter, isVisibleInHierarchy, skeleton);
325
+
326
+ // add new children and update the ones that have a different version
327
+ for (let i = 0, len = node.children.length; i < len; i++) {
328
+ const nodeChild = node.children[i];
329
+ const objChild = <SDObject>convertedObject.children.find(oc => (<SDObject>oc).SDid === nodeChild.id);
330
+
331
+ if (!objChild) {
332
+ const newChild = node.data.find(d => d instanceof BoneData) ? new SDBone(nodeChild.id, nodeChild.version) : new SDObject(nodeChild.id, nodeChild.version);
333
+ const oldChild = nodeChild.convertedObject[this._renderingEngine.id] as THREE.Object3D;
334
+ nodeChild.convertedObject[this._renderingEngine.id] = newChild;
335
+ if (nodeChild.updateCallbackConvertedObject)
336
+ nodeChild.updateCallbackConvertedObject(newChild, oldChild, this._renderingEngine.id);
337
+ convertedObject.add(newChild);
338
+ this.updateNode(nodeChild, newChild, filter, isVisibleInHierarchy, skeleton);
339
+ } else if (objChild.SDversion !== nodeChild.version) {
340
+ // if the version is different, update the child
341
+ this.updateNode(nodeChild, objChild, filter, isVisibleInHierarchy, skeleton);
342
+ objChild.SDversion = nodeChild.version;
343
+ } else {
344
+ this.updateNode(nodeChild, objChild, filter, isVisibleInHierarchy, skeleton);
345
+ }
346
+
347
+ // adjust the general BB
348
+ if (!nodeChild.boundingBox.isEmpty())
349
+ node.boundingBox.union(nodeChild.boundingBox);
350
+
351
+ // adjust the specific BB
352
+ if (nodeChild.boundingBoxViewport[this._renderingEngine.id] && !nodeChild.boundingBoxViewport[this._renderingEngine.id].isEmpty()) {
353
+ // only do this if the node is
354
+ // 1. visible
355
+ // 2. no included in the "excludeViewports"
356
+ // 3. if there are "restrictViewports", it needs to be in them
357
+ if (isVisible)
358
+ node.boundingBoxViewport[this._renderingEngine.id].union(nodeChild.boundingBoxViewport[this._renderingEngine.id]);
359
+ }
360
+ }
361
+
362
+ convertedObject.visible = node.visible && !node.excludeViewports.includes(this._renderingEngine.id) && !(node.restrictViewports.length > 0 && !node.restrictViewports.includes(this._renderingEngine.id));
363
+ convertedObject.applyTransformation(node.nodeMatrix);
364
+ }
365
+
366
+ public updateSceneTree(root: ITreeNode): void {
367
+ if (this._tree.root.version === this._lastRootVersion && this._renderingEngine.type === RENDERER_TYPE.STANDARD) return;
368
+ this._lastRootVersion = this._tree.root.version;
369
+ this._lastRendererType = this._renderingEngine.type;
370
+
371
+ if (this._renderingEngine.closed) return;
372
+ const oldBB = this._boundingBox.clone();
373
+ this._boundingBox = new Box();
374
+ this._renderingEngine.lightLoader.shadowMapCount = 0;
375
+
376
+ if (!this._mainNode) {
377
+ this._mainNode = new SDObject(root.id, root.version);
378
+ const oldObj = root.convertedObject[this._renderingEngine.id] as THREE.Object3D;
379
+ root.convertedObject[this._renderingEngine.id] = this._mainNode;
380
+ if (root.updateCallbackConvertedObject)
381
+ root.updateCallbackConvertedObject!(this._mainNode, oldObj, this._renderingEngine.id);
382
+ this._scene.add(this._mainNode);
383
+ }
384
+
385
+ this._boundingBoxSensitiveData = [];
386
+
387
+ this._currentSDTFOverview = this.createSDTFOverview();
388
+ this.updateNode(root, this._mainNode);
389
+ this._boundingBox = root.boundingBoxViewport[this._renderingEngine.id].clone();
390
+
391
+ for (let i = 0; i < this._boundingBoxSensitiveData.length; i++)
392
+ this._renderingEngine.lightLoader.adjustToBoundingBox(this._boundingBoxSensitiveData[i].data, this._boundingBoxSensitiveData[i].dataChild, this._boundingBox);
393
+
394
+ if (!(this._boundingBox.min[0] === oldBB.min[0] && this._boundingBox.min[1] === oldBB.min[1] && this._boundingBox.min[2] === oldBB.min[2] &&
395
+ this._boundingBox.max[0] === oldBB.max[0] && this._boundingBox.max[1] === oldBB.max[1] && this._boundingBox.max[2] === oldBB.max[2])) {
396
+ if (!this._stateEngine.viewportEngines[this._renderingEngine.id].boundingBoxCreated.resolved && !this._boundingBox.isEmpty())
397
+ this._stateEngine.viewportEngines[this._renderingEngine.id].boundingBoxCreated.resolve(true);
398
+
399
+ this._eventEngine.emitEvent(EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_CHANGE, {
400
+ viewportId: this._renderingEngine.id, boundingBox: {
401
+ min: vec3.clone(this._boundingBox.min),
402
+ max: vec3.clone(this._boundingBox.max),
403
+ }
404
+ });
405
+ }
406
+
407
+ if (this._boundingBox.isEmpty()) {
408
+ // check if all outputs that should be loaded at the start of a session are loaded
409
+ // if the bounding box is empty then, emit the event
410
+ if (Object.values(this._stateEngine.sessionEngines).every(s => s.initialOutputsLoaded.resolved === true)) {
411
+ this._eventEngine.emitEvent(EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_EMPTY, {
412
+ viewportId: this._renderingEngine.id
413
+ });
414
+ }
415
+ }
416
+
417
+ this._renderingEngine.renderingManager.evaluateTextureUnitCount(this._renderingEngine.lightLoader.shadowMapCount + this._renderingEngine.materialLoader.maxMapCount);
418
+
419
+ /**
420
+ *
421
+ * Three.js texture upload and compiling
422
+ * This step is needed as three.js would compile the shaders and initialize the texture on the first render call instead.
423
+ *
424
+ */
425
+
426
+ // we initialize all texture and then clear the cache
427
+ const threeJsTextureCache = this._renderingEngine.materialLoader.threeJsTextureCache;
428
+ for (const key in threeJsTextureCache) {
429
+ if (threeJsTextureCache[key].usage === 0) {
430
+ threeJsTextureCache[key].texture.dispose();
431
+ delete threeJsTextureCache[key];
432
+ } else if (threeJsTextureCache[key].initialized === false) {
433
+ this._renderingEngine.renderer.initTexture(threeJsTextureCache[key].texture);
434
+ threeJsTextureCache[key].initialized = true;
435
+ }
436
+ }
437
+
438
+ // we compile the shaders
439
+ this._renderingEngine.renderer.compile(this._renderingEngine.scene, this._hiddenCamera);
440
+ }
441
+
442
+ // #endregion Public Methods (6)
443
+
444
+ // #region Private Methods (5)
445
+
446
+ private collectSDTFItemData(node: ITreeNode): SDTFItemData | undefined {
447
+ for (let i = 0, len = node.data.length; i < len; i++)
448
+ if (node.data[i] instanceof SDTFItemData)
449
+ return <SDTFItemData>node.data[i];
450
+
451
+ if (!node.parent) return;
452
+ return this.collectSDTFItemData(node.parent);
453
+ }
454
+
455
+ private createSDTFOverview(node: ITreeNode = this._tree.root): ISDTFOverview {
456
+ const out: SDTFOverviewData = new SDTFOverviewData({});
457
+ for (let i = 0, len = node.data.length; i < len; i++)
458
+ if (node.data[i] instanceof SDTFOverviewData)
459
+ out.merge(<SDTFOverviewData>node.data[i]);
460
+
461
+ for (let i = 0, len = node.children.length; i < len; i++)
462
+ out.merge(new SDTFOverviewData(this.createSDTFOverview(node.children[i])));
463
+
464
+ return out.overview;
465
+ }
466
+
467
+ private getBone(node: ITreeNode): SDBone {
468
+ let bone: SDBone;
469
+ this._mainNode.traverse((o) => {
470
+ if ((<SDObject>o).SDid === node.id)
471
+ bone = (<SDBone>o);
472
+ });
473
+ return bone!;
474
+ }
475
+
476
+ private injectAttributeData(node: ITreeNode, data: ITreeNodeData) {
477
+ const itemData = this.collectSDTFItemData(node);
478
+ const visData: {
479
+ material: IMaterialAbstractData,
480
+ matrix: mat4
481
+ } = {
482
+ material: new MaterialStandardData({ color: this._renderingEngine.defaultMaterialColor, opacity: 1 }),
483
+ matrix: mat4.create()
484
+ };
485
+
486
+ if (this._renderingEngine.visualizeAttributes) {
487
+ const userVisData = this._renderingEngine.visualizeAttributes(this._currentSDTFOverview, itemData);
488
+ this._inputValidator.validateAndError('Viewer.visualizeAttributes', userVisData, 'object', true);
489
+ this._inputValidator.validateAndError('Viewer.visualizeAttributes', userVisData.matrix, 'mat4', true);
490
+ visData.material = userVisData.material;
491
+ visData.matrix = userVisData.matrix;
492
+ }
493
+
494
+ node.addTransformation({
495
+ id: 'sdtf',
496
+ matrix: visData.matrix
497
+ });
498
+
499
+ if (data instanceof GeometryData)
500
+ data.attributeMaterial = visData.material;
501
+ }
502
+
503
+ private removeData(dataObject: SDData) {
504
+ if (dataObject.userData.removed === true) return;
505
+ dataObject.userData.removed = true;
506
+
507
+ switch (true) {
508
+ case dataObject.SDtype === SD_DATA_TYPE.GEOMETRY:
509
+ dataObject.traverse((o) => {
510
+ if (dataObject.id !== o.id && o.userData.removed === true) return;
511
+ o.userData.removed = true;
512
+
513
+ if (o instanceof THREE.Mesh) {
514
+ this.scene.remove(o);
515
+ this._renderingEngine.geometryLoader.removeFromGeometryCache(o.geometry.userData.SDid + '_' + o.geometry.userData.SDversion);
516
+ this._renderingEngine.geometryLoader.removeFromPrimitiveCache(o.geometry.userData.primitiveSDid + '_' + o.geometry.userData.primitiveSDversion);
517
+ this._renderingEngine.materialLoader.removeFromMaterialCache(o.material.userData.SDid + '_' + o.material.userData.SDversion);
518
+
519
+ const texturesToRemove: THREE.Texture[] = [];
520
+ for (const t in o.material) {
521
+ if (o.material[t] instanceof THREE.Texture) {
522
+ o.material[t].name = t;
523
+ if (t !== 'envMap') {
524
+ if (!texturesToRemove.includes(o.material[t]))
525
+ texturesToRemove.push(o.material[t]);
526
+ }
527
+ }
528
+ }
529
+
530
+ for (const texture of texturesToRemove) {
531
+ if (texture.userData.cacheKey) {
532
+ this._renderingEngine.materialLoader.threeJsTextureCache[texture.userData.cacheKey].usage--;
533
+ } else {
534
+ if (texture.name === 'sphericalNormalMap') {
535
+ this._renderingEngine.geometryLoader.removeFromGemSphericalMapsCache(o.geometry.userData.primitiveSDid + '_' + o.geometry.userData.primitiveSDversion);
536
+ texture.dispose();
537
+ } else {
538
+ texture.dispose();
539
+ }
540
+ }
541
+ }
542
+ }
543
+ });
544
+ break;
545
+ case dataObject.SDtype === SD_DATA_TYPE.THREEJS:
546
+ break;
547
+ case dataObject.SDtype === SD_DATA_TYPE.MATERIAL:
548
+ break;
549
+ case dataObject.SDtype === SD_DATA_TYPE.LIGHT:
550
+ dataObject.traverse((o) => {
551
+ if (o instanceof THREE.Light)
552
+ o.dispose();
553
+ });
554
+ break;
555
+ case dataObject.SDtype === SD_DATA_TYPE.HTML_ELEMENT_ANCHOR:
556
+ this._renderingEngine.htmlElementAnchorLoader.removeData(dataObject.SDid, dataObject.SDversion);
557
+ break;
558
+ case dataObject.SDtype === SD_DATA_TYPE.ANIMATION:
559
+ break;
560
+ default:
561
+ // if there is no valid conversion here, call the convertData of the implementation
562
+ break;
563
+ }
564
+ }
565
+
566
+ // #endregion Private Methods (5)
567
+ }
568
+
569
+ // #endregion Classes (1)