@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,1169 @@
1
+ import * as THREE from 'three';
2
+ import {
3
+ BlendFunction,
4
+ BloomEffect,
5
+ ChromaticAberrationEffect,
6
+ DepthOfFieldEffect,
7
+ DotScreenEffect,
8
+ Effect,
9
+ EffectComposer,
10
+ EffectPass,
11
+ FXAAEffect,
12
+ GodRaysEffect,
13
+ GridEffect,
14
+ HueSaturationEffect,
15
+ KernelSize,
16
+ NoiseEffect,
17
+ OutlineEffect,
18
+ OverrideMaterialManager,
19
+ PixelationEffect,
20
+ RenderPass,
21
+ ScanlineEffect,
22
+ SelectiveBloomEffect,
23
+ SepiaEffect,
24
+ SMAAEffect,
25
+ SMAAPreset,
26
+ TiltShiftEffect,
27
+ VignetteEffect,
28
+ VignetteTechnique
29
+ } from 'postprocessing';
30
+ import {
31
+ Converter,
32
+ EventEngine,
33
+ EVENTTYPE,
34
+ IEvent,
35
+ SettingsEngine,
36
+ SystemInfo,
37
+ UuidGenerator
38
+ } from '@shapediver/viewer.shared.services';
39
+ import { GodRaysManager } from './postprocessing/GodRaysManager';
40
+ import {
41
+ ANTI_ALIASING_TECHNIQUE,
42
+ IBloomEffectDefinition,
43
+ IChromaticAberrationEffectDefinition,
44
+ IDepthOfFieldEffectDefinition,
45
+ IDotScreenEffectDefinition,
46
+ IGodRaysEffectDefinition,
47
+ IGridEffectDefinition,
48
+ IHBAOEffectDefinition,
49
+ IHueSaturationEffectDefinition,
50
+ INoiseEffectDefinition,
51
+ IOutlineEffectDefinition,
52
+ IPixelationEffectDefinition,
53
+ IPostProcessingEffectDefinition,
54
+ IPostProcessingEffectsArray,
55
+ IScanlineEffectDefinition,
56
+ ISelectiveBloomEffectDefinition,
57
+ ISepiaEffectDefinition,
58
+ ISSAOEffectDefinition,
59
+ ITiltShiftEffectDefinition,
60
+ IVignetteEffectDefinition,
61
+ POST_PROCESSING_EFFECT_TYPE
62
+ } from '../interfaces/IPostProcessingEffectDefinitions';
63
+ import { IManager } from '@shapediver/viewer.rendering-engine.rendering-engine';
64
+ import { OutlineManager } from './postprocessing/OutlineManager';
65
+ import { RenderingEngine } from '../RenderingEngine';
66
+ import { SelectiveBloomManager } from './postprocessing/SelectiveBloomManager';
67
+ import { SSAARenderPass } from './postprocessing/SSAARenderPass';
68
+ import { SSAOEffect } from './postprocessing/ao/ssao/SSAOEffect';
69
+ import { HBAOEffect } from './postprocessing/ao/hbao/HBAOEffect';
70
+ import { ISceneEvent } from '@shapediver/viewer.shared.types';
71
+ import { vec3 } from 'gl-matrix';
72
+
73
+
74
+ export class PostProcessingManager implements IManager {
75
+ // #region Properties (19)
76
+
77
+ private readonly _converter: Converter = Converter.instance;
78
+ private readonly _eventEngine: EventEngine = EventEngine.instance;
79
+ private readonly _systemInfo: SystemInfo = SystemInfo.instance;
80
+ private readonly _uuidGenerator: UuidGenerator = UuidGenerator.instance;
81
+
82
+ private _antiAliasingTechnique: ANTI_ALIASING_TECHNIQUE = ANTI_ALIASING_TECHNIQUE.SMAA;
83
+ private _antiAliasingTechniqueMobile: ANTI_ALIASING_TECHNIQUE = ANTI_ALIASING_TECHNIQUE.FXAA;
84
+ private _composer?: EffectComposer;
85
+ private _effectDefinitions: {
86
+ token: string,
87
+ definition: IPostProcessingEffectDefinition
88
+ }[] = [];
89
+ private _effectPass?: EffectPass;
90
+ private _effects: {
91
+ token: string,
92
+ effect: Effect
93
+ }[] = [];
94
+ private _enablePostProcessingOnMobile: boolean = true;
95
+ private _fxaaEffect?: FXAAEffect;
96
+ private _godRaysManagers: {
97
+ [key: string]: GodRaysManager
98
+ } = {};
99
+ private _manualPostProcessing: boolean = false;
100
+ private _outlineManagers: {
101
+ [key: string]: OutlineManager
102
+ } = {};
103
+ private _renderPass?: RenderPass;
104
+ private _selectiveBloomManagers: {
105
+ [key: string]: SelectiveBloomManager
106
+ } = {};
107
+ private _smaaEffect?: SMAAEffect;
108
+ private _ssaaRenderPass?: SSAARenderPass;
109
+ private _sceneExtents = 0;
110
+ private _suspendEffectPassUpdate = false;
111
+ private _currentCameraId: string = '';
112
+
113
+ // #endregion Properties (19)
114
+
115
+ // #region Constructors (1)
116
+
117
+ constructor(private readonly _renderingEngine: RenderingEngine) {
118
+ this._eventEngine.addListener(EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_CHANGE, (e: IEvent) => {
119
+ const viewerEvent = <ISceneEvent>e;
120
+ if (viewerEvent.viewportId === this._renderingEngine.id) {
121
+ this._sceneExtents = vec3.distance(viewerEvent.boundingBox!.min, viewerEvent.boundingBox!.max);
122
+ this.changeEffectPass();
123
+ }
124
+ });
125
+
126
+ // const token = this._uuidGenerator.create();
127
+ // this._effectDefinitions.push({
128
+ // token,
129
+ // definition: {
130
+ // type: POST_PROCESSING_EFFECT_TYPE.SSAO,
131
+ // properties: this.getDefaultEffectProperties(POST_PROCESSING_EFFECT_TYPE.SSAO)
132
+ // }
133
+ // });
134
+ }
135
+
136
+ // #endregion Constructors (1)
137
+
138
+ // #region Public Accessors (15)
139
+
140
+ public get antiAliasingTechnique(): ANTI_ALIASING_TECHNIQUE {
141
+ return this._antiAliasingTechnique;
142
+ }
143
+
144
+ public set antiAliasingTechnique(value: ANTI_ALIASING_TECHNIQUE) {
145
+ this._antiAliasingTechnique = value;
146
+ this.changeEffectPass();
147
+ }
148
+
149
+ public get antiAliasingTechniqueMobile(): ANTI_ALIASING_TECHNIQUE {
150
+ return this._antiAliasingTechniqueMobile;
151
+ }
152
+
153
+ public set antiAliasingTechniqueMobile(value: ANTI_ALIASING_TECHNIQUE) {
154
+ this._antiAliasingTechniqueMobile = value;
155
+
156
+ // we don't allow SSAA on mobile devices anymore as it is too slow
157
+ if(this._antiAliasingTechniqueMobile === ANTI_ALIASING_TECHNIQUE.SSAA)
158
+ this._antiAliasingTechniqueMobile = ANTI_ALIASING_TECHNIQUE.SMAA;
159
+
160
+ this.changeEffectPass();
161
+ }
162
+
163
+ public get effectComposer(): EffectComposer | undefined {
164
+ return this._composer;
165
+ }
166
+
167
+ public get effects(): { token: string, effect: Effect }[] {
168
+ return this._effects;
169
+ }
170
+
171
+ public get enablePostProcessingOnMobile(): boolean {
172
+ return this._enablePostProcessingOnMobile;
173
+ }
174
+
175
+ public set enablePostProcessingOnMobile(value: boolean) {
176
+ this._enablePostProcessingOnMobile = value;
177
+ }
178
+
179
+ public get godRaysManagers(): {
180
+ [key: string]: GodRaysManager
181
+ } {
182
+ return this._godRaysManagers;
183
+ }
184
+
185
+ public get manualPostProcessing(): boolean {
186
+ return this._manualPostProcessing;
187
+ }
188
+
189
+ public set manualPostProcessing(value: boolean) {
190
+ this._manualPostProcessing = value;
191
+ if (this._composer && this._manualPostProcessing === true)
192
+ this._composer.removeAllPasses();
193
+ }
194
+
195
+ public get outlineManagers(): {
196
+ [key: string]: OutlineManager
197
+ } {
198
+ return this._outlineManagers;
199
+ }
200
+
201
+ public get selectiveBloomManagers(): {
202
+ [key: string]: SelectiveBloomManager
203
+ } {
204
+ return this._selectiveBloomManagers;
205
+ }
206
+
207
+ public get ssaaSampleLevel(): number {
208
+ return this._ssaaRenderPass ? this._ssaaRenderPass.sampleLevel : 2;
209
+ }
210
+
211
+ public set ssaaSampleLevel(value: number) {
212
+ if(this._ssaaRenderPass)
213
+ this._ssaaRenderPass.sampleLevel = value;
214
+ }
215
+
216
+ // #endregion Public Accessors (15)
217
+
218
+ // #region Public Methods (10)
219
+
220
+ public addEffect(definition: IPostProcessingEffectDefinition, t?: string): string {
221
+ const token = t || this._uuidGenerator.create();
222
+ this._effectDefinitions.push({ token, definition });
223
+
224
+ switch (definition.type) {
225
+ case POST_PROCESSING_EFFECT_TYPE.GOD_RAYS:
226
+ if(!this._godRaysManagers[token])
227
+ this._godRaysManagers[token] = new GodRaysManager(this._renderingEngine);
228
+ break;
229
+
230
+ case POST_PROCESSING_EFFECT_TYPE.OUTLINE:
231
+ if(!this._outlineManagers[token])
232
+ this._outlineManagers[token] = new OutlineManager(this._renderingEngine);
233
+ break;
234
+
235
+
236
+ case POST_PROCESSING_EFFECT_TYPE.SELECTIVE_BLOOM:
237
+ if(!this._selectiveBloomManagers[token])
238
+ this._selectiveBloomManagers[token] = new SelectiveBloomManager(this._renderingEngine);
239
+ break;
240
+
241
+ default:
242
+ }
243
+
244
+
245
+ this.changeEffectPass();
246
+ return token;
247
+ }
248
+
249
+ public applySettings(settingsEngine: SettingsEngine) {
250
+ this._suspendEffectPassUpdate = true;
251
+
252
+ this.antiAliasingTechnique = settingsEngine.settings.postprocessing.antiAliasingTechnique as ANTI_ALIASING_TECHNIQUE;
253
+ this.antiAliasingTechniqueMobile = settingsEngine.settings.postprocessing.antiAliasingTechniqueMobile as ANTI_ALIASING_TECHNIQUE;
254
+
255
+ // we don't allow SSAA on mobile devices anymore as it is too slow
256
+ if(this._antiAliasingTechniqueMobile === ANTI_ALIASING_TECHNIQUE.SSAA)
257
+ this._antiAliasingTechniqueMobile = ANTI_ALIASING_TECHNIQUE.SMAA;
258
+
259
+ this.enablePostProcessingOnMobile = settingsEngine.settings.postprocessing.enablePostProcessingOnMobile;
260
+ this.ssaaSampleLevel = settingsEngine.settings.postprocessing.ssaaSampleLevel;
261
+
262
+ this._effectDefinitions = [];
263
+ const effects = settingsEngine.settings.postprocessing.effects;
264
+ for(let i = 0; i < effects.length; i++) {
265
+ const token = this._uuidGenerator.create();
266
+
267
+ this._effectDefinitions.push({
268
+ token,
269
+ definition: {
270
+ type: effects[i].type as POST_PROCESSING_EFFECT_TYPE,
271
+ properties: effects[i].properties
272
+ }
273
+ });
274
+ }
275
+ this._suspendEffectPassUpdate = false;
276
+ this.changeEffectPass();
277
+ }
278
+
279
+ public changeEffectPass() {
280
+ if (!this._composer) return;
281
+ if (this._suspendEffectPassUpdate === true) return;
282
+ if (this._systemInfo.isMobile === true && this._enablePostProcessingOnMobile === false) return;
283
+ if (this._manualPostProcessing) return;
284
+
285
+ for(let i = 0; i < this._composer.passes.length; i++)
286
+ this._composer.passes[i].dispose();
287
+ this._composer.removeAllPasses();
288
+
289
+ const antiAliasingTechnique = this._systemInfo.isMobile === true ? this._antiAliasingTechniqueMobile : this._antiAliasingTechnique;
290
+ if (antiAliasingTechnique === ANTI_ALIASING_TECHNIQUE.SSAA) {
291
+ this._composer.addPass(this._ssaaRenderPass!);
292
+ } else {
293
+ this._composer.addPass(this._renderPass!);
294
+ }
295
+
296
+ // remove the effects where the tokens are not in the effectDefinitions
297
+ this._effects.forEach(e => e.effect.dispose());
298
+ this._effects = [];
299
+
300
+ for (let i = 0; i < this._effectDefinitions.length; i++) {
301
+ switch (this._effectDefinitions[i].definition.type) {
302
+ case POST_PROCESSING_EFFECT_TYPE.BLOOM:
303
+ {
304
+ const definition: IBloomEffectDefinition = this._effectDefinitions[i].definition as IBloomEffectDefinition;
305
+ const properties = definition.properties || {};
306
+ this._effects.push({
307
+ token: this._effectDefinitions[i].token,
308
+ effect: new BloomEffect({
309
+ blendFunction: properties.blendFunction,
310
+ luminanceThreshold: properties.luminanceThreshold,
311
+ luminanceSmoothing: properties.luminanceSmoothing,
312
+ mipmapBlur: properties.mipmapBlur,
313
+ intensity: properties.intensity,
314
+ kernelSize: properties.kernelSize
315
+ })
316
+ });
317
+ }
318
+ break;
319
+
320
+ case POST_PROCESSING_EFFECT_TYPE.CHROMATIC_ABERRATION:
321
+ {
322
+ const definition: IChromaticAberrationEffectDefinition = this._effectDefinitions[i].definition as IChromaticAberrationEffectDefinition;
323
+ const properties = definition.properties || {};
324
+ const offsetArray = properties.offset !== undefined ? Array.isArray(properties.offset) ? properties.offset : [(<{x: number}>properties.offset).x, (<{y: number}>properties.offset).y] : undefined;
325
+
326
+ this._effects.push({
327
+ token: this._effectDefinitions[i].token,
328
+ effect: new ChromaticAberrationEffect({
329
+ blendFunction: properties.blendFunction,
330
+ offset: offsetArray ? new THREE.Vector2(...offsetArray) : undefined,
331
+ radialModulation: properties.radialModulation !== undefined ? properties.radialModulation : false,
332
+ modulationOffset: properties.modulationOffset !== undefined ? properties.modulationOffset : 0.15
333
+ })
334
+ });
335
+ }
336
+ break;
337
+
338
+ case POST_PROCESSING_EFFECT_TYPE.DEPTH_OF_FIELD:
339
+ {
340
+ const definition: IDepthOfFieldEffectDefinition = this._effectDefinitions[i].definition as IDepthOfFieldEffectDefinition;
341
+ const properties = definition.properties || {};
342
+
343
+ const depthOfFieldEffect = new DepthOfFieldEffect(this._renderingEngine.camera, {
344
+ blendFunction: properties.blendFunction,
345
+ focusDistance: properties.focusDistance !== undefined ? properties.focusDistance : 0,
346
+ focusRange: properties.focusRange !== undefined ? properties.focusRange : 0.01,
347
+ bokehScale: properties.bokehScale !== undefined ? properties.bokehScale : 5,
348
+ resolutionScale: 1
349
+ });
350
+
351
+ depthOfFieldEffect.resolution.height = 1080;
352
+ depthOfFieldEffect.blurPass.kernelSize = KernelSize.HUGE;
353
+
354
+ this._effects.push({
355
+ token: this._effectDefinitions[i].token,
356
+ effect: depthOfFieldEffect
357
+ });
358
+ }
359
+ break;
360
+
361
+ case POST_PROCESSING_EFFECT_TYPE.DOT_SCREEN:
362
+ {
363
+ const definition: IDotScreenEffectDefinition = this._effectDefinitions[i].definition as IDotScreenEffectDefinition;
364
+ const properties = definition.properties || {};
365
+ this._effects.push({
366
+ token: this._effectDefinitions[i].token,
367
+ effect: new DotScreenEffect({
368
+ blendFunction: properties.blendFunction,
369
+ scale: properties.scale,
370
+ angle: properties.angle
371
+ })
372
+ });
373
+ }
374
+ break;
375
+
376
+ case POST_PROCESSING_EFFECT_TYPE.GOD_RAYS:
377
+ {
378
+ const definition: IGodRaysEffectDefinition = this._effectDefinitions[i].definition as IGodRaysEffectDefinition;
379
+ const properties = definition.properties || {};
380
+ const godRaysEffect = new GodRaysEffect(this._renderingEngine.camera, new THREE.Mesh(), {
381
+ blendFunction: properties.blendFunction,
382
+ density: properties.density,
383
+ decay: properties.decay,
384
+ weight: properties.weight,
385
+ exposure: properties.exposure,
386
+ clampMax: properties.clampMax,
387
+ kernelSize: properties.kernelSize,
388
+ blur: properties.blur
389
+ });
390
+ this._effects.push({
391
+ token: this._effectDefinitions[i].token,
392
+ effect: godRaysEffect
393
+ });
394
+
395
+ this._godRaysManagers[this._effectDefinitions[i].token].setEffect(godRaysEffect);
396
+ }
397
+ break;
398
+
399
+ case POST_PROCESSING_EFFECT_TYPE.GRID:
400
+ {
401
+ const definition: IGridEffectDefinition = this._effectDefinitions[i].definition as IGridEffectDefinition;
402
+ const properties = definition.properties || {};
403
+ this._effects.push({
404
+ token: this._effectDefinitions[i].token,
405
+ effect: new GridEffect({
406
+ blendFunction: properties.blendFunction !== undefined ? properties.blendFunction : BlendFunction.MULTIPLY,
407
+ scale: properties.scale
408
+ })
409
+ });
410
+ }
411
+ break;
412
+
413
+ case POST_PROCESSING_EFFECT_TYPE.HBAO:
414
+ {
415
+ // we currently do not support devices with WebGL 1: https://shapediver.atlassian.net/browse/SS-7069
416
+ if(this._renderingEngine.renderer.capabilities.isWebGL2 === false) break;
417
+
418
+ const definition: IHBAOEffectDefinition = this._effectDefinitions[i].definition as IHBAOEffectDefinition;
419
+ const properties = definition.properties || {};
420
+
421
+ // we adjust the scene size slightly to make the factor fit our requirements
422
+ // with this adjusted factor, a distance value of 1 fits well as a default
423
+ const sceneSizeFactor = this._sceneExtents / 10.0;
424
+
425
+ const hbaoEffect = new HBAOEffect(this._composer, this._renderingEngine.camera, this._renderingEngine.scene, {
426
+ resolutionScale: properties.resolutionScale !== undefined ? properties.resolutionScale : 1,
427
+ spp: properties.spp !== undefined ? properties.spp : 8,
428
+ distance: properties.distance !== undefined ? properties.distance * sceneSizeFactor : sceneSizeFactor,
429
+ distancePower: properties.distanceIntensity !== undefined ? properties.distanceIntensity : 1,
430
+ power: properties.intensity !== undefined ? properties.intensity : 2.5,
431
+ bias: properties.bias !== undefined ? properties.bias : 10,
432
+ thickness: properties.thickness !== undefined ? properties.thickness : 0.5,
433
+ color: properties.color !== undefined ? new THREE.Color(this._converter.toHexColor(properties.color).substring(0, 7)) : new THREE.Color('black'),
434
+ iterations: properties.iterations !== undefined ? properties.iterations : 1,
435
+ radius: properties.radius !== undefined ? properties.radius : 15,
436
+ rings: properties.rings !== undefined ? properties.rings : 4,
437
+ lumaPhi: properties.lumaPhi !== undefined ? properties.lumaPhi : 10,
438
+ depthPhi: properties.depthPhi !== undefined ? properties.depthPhi : 2,
439
+ normalPhi: properties.normalPhi !== undefined ? properties.normalPhi : 3.25,
440
+ samples: properties.samples !== undefined ? properties.samples : 16
441
+ });
442
+ this._effects.push({
443
+ token: this._effectDefinitions[i].token,
444
+ effect: hbaoEffect
445
+ });
446
+ }
447
+ break;
448
+
449
+ case POST_PROCESSING_EFFECT_TYPE.HUE_SATURATION:
450
+ {
451
+ const definition: IHueSaturationEffectDefinition = this._effectDefinitions[i].definition as IHueSaturationEffectDefinition;
452
+ const properties = definition.properties || {};
453
+ this._effects.push({
454
+ token: this._effectDefinitions[i].token,
455
+ effect: new HueSaturationEffect({
456
+ blendFunction: properties.blendFunction,
457
+ hue: properties.hue,
458
+ saturation: properties.saturation
459
+ })
460
+ });
461
+ }
462
+ break;
463
+
464
+ case POST_PROCESSING_EFFECT_TYPE.NOISE:
465
+ {
466
+ const definition: INoiseEffectDefinition = this._effectDefinitions[i].definition as INoiseEffectDefinition;
467
+ const properties = definition.properties || {};
468
+ this._effects.push({
469
+ token: this._effectDefinitions[i].token,
470
+ effect: new NoiseEffect({
471
+ blendFunction: properties.blendFunction,
472
+ premultiply: properties.premultiply
473
+ })
474
+ });
475
+ }
476
+ break;
477
+
478
+ case POST_PROCESSING_EFFECT_TYPE.OUTLINE:
479
+ {
480
+ const definition: IOutlineEffectDefinition = this._effectDefinitions[i].definition as IOutlineEffectDefinition;
481
+ const properties = definition.properties || {};
482
+ const outlineEffect = new OutlineEffect(this._renderingEngine.scene, this._renderingEngine.camera, {
483
+ blendFunction: properties.blendFunction !== undefined ? properties.blendFunction : BlendFunction.SCREEN,
484
+ edgeStrength: properties.edgeStrength,
485
+ pulseSpeed: properties.pulseSpeed,
486
+ visibleEdgeColor: <number><unknown>new THREE.Color(this._converter.toHexColor(properties.visibleEdgeColor).substring(0, 7)),
487
+ hiddenEdgeColor: <number><unknown>new THREE.Color(this._converter.toHexColor(properties.hiddenEdgeColor).substring(0, 7)),
488
+ kernelSize: properties.kernelSize,
489
+ blur: properties.blur,
490
+ xRay: properties.xRay,
491
+ multisampling: properties.multisampling
492
+ });
493
+ this._effects.push({
494
+ token: this._effectDefinitions[i].token,
495
+ effect: outlineEffect
496
+ });
497
+ this._outlineManagers[this._effectDefinitions[i].token].setEffect(outlineEffect);
498
+ }
499
+ break;
500
+
501
+ case POST_PROCESSING_EFFECT_TYPE.PIXELATION:
502
+ {
503
+ const definition: IPixelationEffectDefinition = this._effectDefinitions[i].definition as IPixelationEffectDefinition;
504
+ const properties = definition.properties || {};
505
+ this._effects.push({
506
+ token: this._effectDefinitions[i].token,
507
+ effect: new PixelationEffect(properties.granularity)
508
+ });
509
+ }
510
+ break;
511
+
512
+ case POST_PROCESSING_EFFECT_TYPE.SSAO:
513
+ {
514
+ // we currently do not support devices with WebGL 1: https://shapediver.atlassian.net/browse/SS-7069
515
+ if(this._renderingEngine.renderer.capabilities.isWebGL2 === false) break;
516
+
517
+ const definition: ISSAOEffectDefinition = this._effectDefinitions[i].definition as ISSAOEffectDefinition;
518
+ const properties = definition.properties || {};
519
+
520
+ // we adjust the scene size slightly to make the factor fit our requirements
521
+ // with this adjusted factor, a distance value of 1 fits well as a default
522
+ const sceneSizeFactor = this._sceneExtents / 50.0;
523
+ const ssaoEffect = new SSAOEffect(this._composer, this._renderingEngine.camera, this._renderingEngine.scene, {
524
+ resolutionScale: properties.resolutionScale !== undefined ? properties.resolutionScale : 1,
525
+ spp: properties.spp !== undefined ? properties.spp : 8,
526
+ distance: properties.distance !== undefined ? properties.distance * sceneSizeFactor : sceneSizeFactor,
527
+ distancePower: properties.distanceIntensity !== undefined ? properties.distanceIntensity : 1,
528
+ power: properties.intensity !== undefined ? properties.intensity : 2.5,
529
+ color: properties.color !== undefined ? new THREE.Color(this._converter.toHexColor(properties.color).substring(0, 7)) : new THREE.Color('black'),
530
+ iterations: properties.iterations !== undefined ? properties.iterations : 1,
531
+ radius: properties.radius !== undefined ? properties.radius : 15,
532
+ rings: properties.rings !== undefined ? properties.rings : 4,
533
+ lumaPhi: properties.lumaPhi !== undefined ? properties.lumaPhi : 10,
534
+ depthPhi: properties.depthPhi !== undefined ? properties.depthPhi : 2,
535
+ normalPhi: properties.normalPhi !== undefined ? properties.normalPhi : 3.25,
536
+ samples: properties.samples !== undefined ? properties.samples : 16
537
+ });
538
+
539
+ this._effects.push({
540
+ token: this._effectDefinitions[i].token,
541
+ effect: ssaoEffect
542
+ });
543
+ }
544
+ break;
545
+
546
+ case POST_PROCESSING_EFFECT_TYPE.SCANLINE:
547
+ {
548
+ const definition: IScanlineEffectDefinition = this._effectDefinitions[i].definition as IScanlineEffectDefinition;
549
+ const properties = definition.properties || {};
550
+ this._effects.push({
551
+ token: this._effectDefinitions[i].token,
552
+ effect: new ScanlineEffect({
553
+ blendFunction: properties.blendFunction,
554
+ density: properties.density
555
+ })
556
+ });
557
+ }
558
+ break;
559
+
560
+ case POST_PROCESSING_EFFECT_TYPE.SELECTIVE_BLOOM:
561
+ {
562
+ const definition: ISelectiveBloomEffectDefinition = this._effectDefinitions[i].definition as ISelectiveBloomEffectDefinition;
563
+ const properties = definition.properties || {};
564
+ const selectiveBloomEffect = new SelectiveBloomEffect(this._renderingEngine.scene, this._renderingEngine.camera, {
565
+ blendFunction: properties.blendFunction,
566
+ mipmapBlur: properties.mipmapBlur,
567
+ luminanceThreshold: properties.luminanceThreshold,
568
+ luminanceSmoothing: properties.luminanceSmoothing,
569
+ intensity: properties.intensity,
570
+ kernelSize: properties.kernelSize
571
+ });
572
+ selectiveBloomEffect.ignoreBackground = properties.ignoreBackground !== undefined ? properties.ignoreBackground : true;
573
+ this._effects.push({
574
+ token: this._effectDefinitions[i].token,
575
+ effect: selectiveBloomEffect
576
+ });
577
+
578
+ this._selectiveBloomManagers[this._effectDefinitions[i].token].setEffect(selectiveBloomEffect);
579
+ }
580
+ break;
581
+
582
+ case POST_PROCESSING_EFFECT_TYPE.SEPIA:
583
+ {
584
+ const definition: ISepiaEffectDefinition = this._effectDefinitions[i].definition as ISepiaEffectDefinition;
585
+ const properties = definition.properties || {};
586
+ this._effects.push({
587
+ token: this._effectDefinitions[i].token,
588
+ effect: new SepiaEffect({
589
+ blendFunction: properties.blendFunction
590
+ })
591
+ });
592
+ }
593
+ break;
594
+
595
+ case POST_PROCESSING_EFFECT_TYPE.TILT_SHIFT:
596
+ {
597
+ const definition: ITiltShiftEffectDefinition = this._effectDefinitions[i].definition as ITiltShiftEffectDefinition;
598
+ const properties = definition.properties || {};
599
+ this._effects.push({
600
+ token: this._effectDefinitions[i].token,
601
+ effect: new TiltShiftEffect({
602
+ blendFunction: properties.blendFunction,
603
+ offset: properties.offset,
604
+ rotation: properties.rotation,
605
+ focusArea: properties.focusArea,
606
+ feather: properties.feather,
607
+ kernelSize: properties.kernelSize
608
+ })
609
+ });
610
+ }
611
+ break;
612
+
613
+ case POST_PROCESSING_EFFECT_TYPE.VIGNETTE:
614
+ {
615
+ const definition: IVignetteEffectDefinition = this._effectDefinitions[i].definition as IVignetteEffectDefinition;
616
+ const properties = definition.properties || {};
617
+ this._effects.push({
618
+ token: this._effectDefinitions[i].token,
619
+ effect: new VignetteEffect({
620
+ blendFunction: properties.blendFunction,
621
+ technique: properties.technique,
622
+ offset: properties.offset,
623
+ darkness: properties.darkness,
624
+ })
625
+ });
626
+ }
627
+ break;
628
+
629
+ default:
630
+ }
631
+ }
632
+
633
+ // sort effects by order in effectDefinitions
634
+ this._effects.sort((a, b) => this._effectDefinitions.indexOf(this._effectDefinitions.find(e => e.token === a.token)!) - this._effectDefinitions.indexOf(this._effectDefinitions.find(e => e.token === b.token)!));
635
+
636
+ const effectArray = this._effects.map(v => v.effect);
637
+ if (antiAliasingTechnique === ANTI_ALIASING_TECHNIQUE.FXAA) {
638
+ effectArray.unshift(this._fxaaEffect!);
639
+ } else if (antiAliasingTechnique === ANTI_ALIASING_TECHNIQUE.SMAA) {
640
+ effectArray.unshift(this._smaaEffect!);
641
+ }
642
+
643
+ this._effectPass = new EffectPass(this._renderingEngine.camera, ...this._effects.map(v => v.effect));
644
+ this._composer.addPass(this._effectPass);
645
+
646
+ // for the AO effects we need to add a separate AA pass at the end that anti-aliases the AO effect
647
+ if (this._effectDefinitions.find(e => e.definition.type === POST_PROCESSING_EFFECT_TYPE.HBAO || e.definition.type === POST_PROCESSING_EFFECT_TYPE.SSAO)) {
648
+ // respect the AA choice if one of the effects was selected, use SMAA otherwise
649
+ this._composer.addPass(new EffectPass(this._renderingEngine.camera, antiAliasingTechnique === ANTI_ALIASING_TECHNIQUE.FXAA ? this._fxaaEffect! : this._smaaEffect!));
650
+ }
651
+ }
652
+
653
+ public getDefaultEffectProperties(type: POST_PROCESSING_EFFECT_TYPE) {
654
+ switch (type) {
655
+ case POST_PROCESSING_EFFECT_TYPE.BLOOM:
656
+ return {
657
+ blendFunction: BlendFunction.ADD,
658
+ intensity: 1.0,
659
+ kernelSize: KernelSize.LARGE,
660
+ luminanceSmoothing: 0.025,
661
+ luminanceThreshold: 0.9,
662
+ mipmapBlur: false,
663
+ };
664
+ case POST_PROCESSING_EFFECT_TYPE.CHROMATIC_ABERRATION:
665
+ return {
666
+ blendFunction: BlendFunction.NORMAL,
667
+ modulationOffset: 0.15,
668
+ offset: { x: 0.001, y: 0.0005 },
669
+ radialModulation: false,
670
+ };
671
+
672
+ case POST_PROCESSING_EFFECT_TYPE.DEPTH_OF_FIELD:
673
+ return {
674
+ blendFunction: BlendFunction.NORMAL,
675
+ bokehScale: 5.0,
676
+ focusDistance: 0.0,
677
+ focusRange: 0.01,
678
+ };
679
+ case POST_PROCESSING_EFFECT_TYPE.DOT_SCREEN:
680
+ return {
681
+ angle: 1.57,
682
+ blendFunction: BlendFunction.NORMAL,
683
+ scale: 1.0,
684
+ };
685
+ case POST_PROCESSING_EFFECT_TYPE.GOD_RAYS:
686
+ return {
687
+ blendFunction: BlendFunction.SCREEN,
688
+ blur: true,
689
+ clampMax: 1.0,
690
+ decay: 0.9,
691
+ density: 0.96,
692
+ exposure: 0.6,
693
+ kernelSize: KernelSize.SMALL,
694
+ weight: 0.4,
695
+ };
696
+ case POST_PROCESSING_EFFECT_TYPE.GRID:
697
+ return {
698
+ blendFunction: BlendFunction.MULTIPLY,
699
+ scale: 1.0,
700
+ };
701
+ case POST_PROCESSING_EFFECT_TYPE.HBAO:
702
+ return {
703
+ resolutionScale: 1,
704
+ spp: 8,
705
+ distance: 1,
706
+ distanceIntensity: 1,
707
+ intensity: 2.5,
708
+ color: '#000000',
709
+ bias: 10,
710
+ thickness: 0.5,
711
+
712
+ iterations: 1,
713
+ radius: 15,
714
+ rings: 4,
715
+ lumaPhi: 10,
716
+ depthPhi: 2,
717
+ normalPhi: 3.25,
718
+ samples: 16,
719
+ };
720
+
721
+ case POST_PROCESSING_EFFECT_TYPE.HUE_SATURATION:
722
+ return {
723
+ blendFunction: BlendFunction.NORMAL,
724
+ hue: 0.0,
725
+ saturation: 0.0,
726
+ };
727
+ case POST_PROCESSING_EFFECT_TYPE.NOISE:
728
+ return {
729
+ blendFunction: BlendFunction.SCREEN,
730
+ premultiply: false,
731
+ };
732
+ case POST_PROCESSING_EFFECT_TYPE.OUTLINE:
733
+ return {
734
+ blendFunction: BlendFunction.SCREEN,
735
+ blur: false,
736
+ edgeStrength: 1.0,
737
+ hiddenEdgeColor: '#22090a',
738
+ kernelSize: KernelSize.VERY_SMALL,
739
+ multisampling: 0,
740
+ pulseSpeed: 0.0,
741
+ resolution: 480,
742
+ visibleEdgeColor: '#ffffff',
743
+ xRay: true,
744
+ };
745
+ case POST_PROCESSING_EFFECT_TYPE.PIXELATION:
746
+ return {
747
+ granularity: 30.0,
748
+ };
749
+ case POST_PROCESSING_EFFECT_TYPE.SSAO:
750
+ return {
751
+ resolutionScale: 1,
752
+ spp: 8,
753
+ distance: 1,
754
+ distanceIntensity: 1,
755
+ intensity: 2.5,
756
+ color: '#000000',
757
+
758
+ iterations: 1,
759
+ radius: 15,
760
+ rings: 4,
761
+ lumaPhi: 10,
762
+ depthPhi: 2,
763
+ normalPhi: 3.25,
764
+ samples: 16,
765
+ };
766
+ case POST_PROCESSING_EFFECT_TYPE.SCANLINE:
767
+ return {
768
+ blendFunction: BlendFunction.OVERLAY,
769
+ density: 1.25,
770
+ };
771
+ case POST_PROCESSING_EFFECT_TYPE.SELECTIVE_BLOOM:
772
+ return {
773
+ blendFunction: BlendFunction.ADD,
774
+ intensity: 1.0,
775
+ kernelSize: KernelSize.LARGE,
776
+ luminanceSmoothing: 0.025,
777
+ luminanceThreshold: 0.9,
778
+ mipmapBlur: false,
779
+ ignoreBackground: true,
780
+ };
781
+ case POST_PROCESSING_EFFECT_TYPE.SEPIA:
782
+ return {
783
+ blendFunction: BlendFunction.NORMAL,
784
+ };
785
+ case POST_PROCESSING_EFFECT_TYPE.TILT_SHIFT:
786
+ return {
787
+ blendFunction: BlendFunction.NORMAL,
788
+ feather: 0.3,
789
+ focusArea: 0.4,
790
+ kernelSize: KernelSize.MEDIUM,
791
+ offset: 0.0,
792
+ rotation: 0.0,
793
+ };
794
+ case POST_PROCESSING_EFFECT_TYPE.VIGNETTE:
795
+ return {
796
+ blendFunction: BlendFunction.NORMAL,
797
+ darkness: 0.5,
798
+ offset: 0.5,
799
+ technique: VignetteTechnique.DEFAULT,
800
+ };
801
+ default:
802
+ return {};
803
+ }
804
+ }
805
+
806
+ public getEffect(token: string): Effect {
807
+ return this._effects.find(e => e.token === token)!.effect;
808
+ }
809
+
810
+ public getEffectTokens(): { [key: string]: POST_PROCESSING_EFFECT_TYPE} {
811
+ return Object.assign({}, ...this._effectDefinitions.map((e) => ({[e.token]: e.definition.type})));
812
+ }
813
+
814
+ public getPostProcessingEffectsArray(): IPostProcessingEffectsArray {
815
+ const effects: IPostProcessingEffectsArray = [];
816
+
817
+ for (let i = 0; i < this._effectDefinitions.length; i++) {
818
+ switch (this._effectDefinitions[i].definition.type) {
819
+ case POST_PROCESSING_EFFECT_TYPE.BLOOM:
820
+ {
821
+ const definition: IBloomEffectDefinition = this._effectDefinitions[i].definition as IBloomEffectDefinition;
822
+ const properties = definition.properties || {};
823
+ effects.push({
824
+ type: POST_PROCESSING_EFFECT_TYPE.BLOOM,
825
+ token: this._effectDefinitions[i].token,
826
+ properties: {
827
+ blendFunction: properties.blendFunction,
828
+ luminanceThreshold: properties.luminanceThreshold,
829
+ luminanceSmoothing: properties.luminanceSmoothing,
830
+ mipmapBlur: properties.mipmapBlur,
831
+ intensity: properties.intensity,
832
+ kernelSize: properties.kernelSize
833
+ }
834
+ });
835
+ }
836
+ break;
837
+
838
+ case POST_PROCESSING_EFFECT_TYPE.CHROMATIC_ABERRATION:
839
+ {
840
+ const definition: IChromaticAberrationEffectDefinition = this._effectDefinitions[i].definition as IChromaticAberrationEffectDefinition;
841
+ const properties = definition.properties || {};
842
+ effects.push({
843
+ type: POST_PROCESSING_EFFECT_TYPE.CHROMATIC_ABERRATION,
844
+ token: this._effectDefinitions[i].token,
845
+ properties: {
846
+ blendFunction: properties.blendFunction,
847
+ offset: properties.offset ? Array.isArray(properties.offset) ? { x: properties.offset[0], y: properties.offset[1] } : properties.offset : undefined,
848
+ radialModulation: properties.radialModulation,
849
+ modulationOffset: properties.modulationOffset
850
+ }
851
+ });
852
+ }
853
+ break;
854
+
855
+ case POST_PROCESSING_EFFECT_TYPE.DEPTH_OF_FIELD:
856
+ {
857
+ const definition: IDepthOfFieldEffectDefinition = this._effectDefinitions[i].definition as IDepthOfFieldEffectDefinition;
858
+ const properties = definition.properties || {};
859
+ effects.push({
860
+ type: POST_PROCESSING_EFFECT_TYPE.DEPTH_OF_FIELD,
861
+ token: this._effectDefinitions[i].token,
862
+ properties: {
863
+ blendFunction: properties.blendFunction,
864
+ focusDistance: properties.focusDistance,
865
+ focusRange: properties.focusRange,
866
+ bokehScale: properties.bokehScale
867
+ }
868
+ });
869
+ }
870
+ break;
871
+
872
+ case POST_PROCESSING_EFFECT_TYPE.DOT_SCREEN:
873
+ {
874
+ const definition: IDotScreenEffectDefinition = this._effectDefinitions[i].definition as IDotScreenEffectDefinition;
875
+ const properties = definition.properties || {};
876
+ effects.push({
877
+ type: POST_PROCESSING_EFFECT_TYPE.DOT_SCREEN,
878
+ token: this._effectDefinitions[i].token,
879
+ properties: {
880
+ blendFunction: properties.blendFunction,
881
+ scale: properties.scale,
882
+ angle: properties.angle
883
+ }
884
+ });
885
+ }
886
+ break;
887
+
888
+ case POST_PROCESSING_EFFECT_TYPE.GRID:
889
+ {
890
+ const definition: IGridEffectDefinition = this._effectDefinitions[i].definition as IGridEffectDefinition;
891
+ const properties = definition.properties || {};
892
+ effects.push({
893
+ type: POST_PROCESSING_EFFECT_TYPE.GRID,
894
+ token: this._effectDefinitions[i].token,
895
+ properties: {
896
+ blendFunction: properties.blendFunction,
897
+ scale: properties.scale
898
+ }
899
+ });
900
+ }
901
+ break;
902
+
903
+ case POST_PROCESSING_EFFECT_TYPE.HBAO:
904
+ {
905
+ const definition: IHBAOEffectDefinition = this._effectDefinitions[i].definition as IHBAOEffectDefinition;
906
+ const properties = definition.properties || {};
907
+ effects.push({
908
+ type: POST_PROCESSING_EFFECT_TYPE.HBAO,
909
+ token: this._effectDefinitions[i].token,
910
+ properties: {
911
+ resolutionScale: properties.resolutionScale,
912
+ spp: properties.spp,
913
+ distance: properties.distance,
914
+ distanceIntensity: properties.distanceIntensity,
915
+ intensity: properties.intensity,
916
+ bias: properties.bias,
917
+ thickness: properties.thickness,
918
+ color: properties.color !== undefined ? this._converter.toHexColor(properties.color) : undefined,
919
+ iterations: properties.iterations,
920
+ radius: properties.radius,
921
+ rings: properties.rings,
922
+ lumaPhi: properties.lumaPhi,
923
+ depthPhi: properties.depthPhi,
924
+ normalPhi: properties.normalPhi,
925
+ samples: properties.samples
926
+ }
927
+ });
928
+ }
929
+ break;
930
+
931
+ case POST_PROCESSING_EFFECT_TYPE.HUE_SATURATION:
932
+ {
933
+ const definition: IHueSaturationEffectDefinition = this._effectDefinitions[i].definition as IHueSaturationEffectDefinition;
934
+ const properties = definition.properties || {};
935
+ effects.push({
936
+ type: POST_PROCESSING_EFFECT_TYPE.HUE_SATURATION,
937
+ token: this._effectDefinitions[i].token,
938
+ properties: {
939
+ blendFunction: properties.blendFunction,
940
+ hue: properties.hue,
941
+ saturation: properties.saturation
942
+ }
943
+ });
944
+ }
945
+ break;
946
+
947
+ case POST_PROCESSING_EFFECT_TYPE.NOISE:
948
+ {
949
+ const definition: INoiseEffectDefinition = this._effectDefinitions[i].definition as INoiseEffectDefinition;
950
+ const properties = definition.properties || {};
951
+ effects.push({
952
+ type: POST_PROCESSING_EFFECT_TYPE.NOISE,
953
+ token: this._effectDefinitions[i].token,
954
+ properties: {
955
+ blendFunction: properties.blendFunction,
956
+ premultiply: properties.premultiply
957
+ }
958
+ });
959
+ }
960
+ break;
961
+
962
+ case POST_PROCESSING_EFFECT_TYPE.PIXELATION:
963
+ {
964
+ const definition: IPixelationEffectDefinition = this._effectDefinitions[i].definition as IPixelationEffectDefinition;
965
+ const properties = definition.properties || {};
966
+ effects.push({
967
+ type: POST_PROCESSING_EFFECT_TYPE.PIXELATION,
968
+ token: this._effectDefinitions[i].token,
969
+ properties: {
970
+ granularity: properties.granularity
971
+ }
972
+ });
973
+ }
974
+ break;
975
+
976
+ case POST_PROCESSING_EFFECT_TYPE.SSAO:
977
+ {
978
+ const definition: ISSAOEffectDefinition = this._effectDefinitions[i].definition as ISSAOEffectDefinition;
979
+ const properties = definition.properties || {};
980
+ effects.push({
981
+ type: POST_PROCESSING_EFFECT_TYPE.SSAO,
982
+ token: this._effectDefinitions[i].token,
983
+ properties: {
984
+ resolutionScale: properties.resolutionScale,
985
+ spp: properties.spp,
986
+ distance: properties.distance,
987
+ distanceIntensity: properties.distanceIntensity,
988
+ intensity: properties.intensity,
989
+ color: properties.color !== undefined ? this._converter.toHexColor(properties.color) : undefined,
990
+ iterations: properties.iterations,
991
+ radius: properties.radius,
992
+ rings: properties.rings,
993
+ lumaPhi: properties.lumaPhi,
994
+ depthPhi: properties.depthPhi,
995
+ normalPhi: properties.normalPhi,
996
+ samples: properties.samples
997
+ }
998
+ });
999
+ }
1000
+ break;
1001
+
1002
+ case POST_PROCESSING_EFFECT_TYPE.SCANLINE:
1003
+ {
1004
+ const definition: IScanlineEffectDefinition = this._effectDefinitions[i].definition as IScanlineEffectDefinition;
1005
+ const properties = definition.properties || {};
1006
+ effects.push({
1007
+ type: POST_PROCESSING_EFFECT_TYPE.SCANLINE,
1008
+ token: this._effectDefinitions[i].token,
1009
+ properties: {
1010
+ blendFunction: properties.blendFunction,
1011
+ density: properties.density
1012
+ }
1013
+ });
1014
+ }
1015
+ break;
1016
+
1017
+ case POST_PROCESSING_EFFECT_TYPE.SEPIA:
1018
+ {
1019
+ const definition: ISepiaEffectDefinition = this._effectDefinitions[i].definition as ISepiaEffectDefinition;
1020
+ const properties = definition.properties || {};
1021
+ effects.push({
1022
+ type: POST_PROCESSING_EFFECT_TYPE.SEPIA,
1023
+ token: this._effectDefinitions[i].token,
1024
+ properties: {
1025
+ blendFunction: properties.blendFunction
1026
+ }
1027
+ });
1028
+ }
1029
+ break;
1030
+
1031
+ case POST_PROCESSING_EFFECT_TYPE.TILT_SHIFT:
1032
+ {
1033
+ const definition: ITiltShiftEffectDefinition = this._effectDefinitions[i].definition as ITiltShiftEffectDefinition;
1034
+ const properties = definition.properties || {};
1035
+ effects.push({
1036
+ type: POST_PROCESSING_EFFECT_TYPE.TILT_SHIFT,
1037
+ token: this._effectDefinitions[i].token,
1038
+ properties: {
1039
+ blendFunction: properties.blendFunction,
1040
+ offset: properties.offset,
1041
+ rotation: properties.rotation,
1042
+ focusArea: properties.focusArea,
1043
+ feather: properties.feather,
1044
+ kernelSize: properties.kernelSize
1045
+ }
1046
+ });
1047
+ }
1048
+ break;
1049
+
1050
+ case POST_PROCESSING_EFFECT_TYPE.VIGNETTE:
1051
+ {
1052
+ const definition: IVignetteEffectDefinition = this._effectDefinitions[i].definition as IVignetteEffectDefinition;
1053
+ const properties = definition.properties || {};
1054
+ effects.push({
1055
+ type: POST_PROCESSING_EFFECT_TYPE.VIGNETTE,
1056
+ token: this._effectDefinitions[i].token,
1057
+ properties: {
1058
+ blendFunction: properties.blendFunction,
1059
+ technique: properties.technique,
1060
+ offset: properties.offset,
1061
+ darkness: properties.darkness,
1062
+ }
1063
+ });
1064
+ }
1065
+ break;
1066
+
1067
+ default:
1068
+ }
1069
+ }
1070
+
1071
+ return effects;
1072
+ }
1073
+
1074
+ public init(): void {
1075
+ OverrideMaterialManager.workaroundEnabled = true;
1076
+
1077
+ const initComposer = () => {
1078
+ this._composer = new EffectComposer(this._renderingEngine.renderer);
1079
+ // EffectComposer disables autoClear, we enable/disable this in the postprocessing render loop
1080
+ this._renderingEngine.renderer.autoClear = true;
1081
+
1082
+ // create anti-aliasing effects and passes
1083
+ this._fxaaEffect = new FXAAEffect();
1084
+ this._smaaEffect = new SMAAEffect({ preset: SMAAPreset.ULTRA });
1085
+ this._renderPass = new RenderPass(this._renderingEngine.scene, this._renderingEngine.camera);
1086
+ this._ssaaRenderPass = new SSAARenderPass(this._renderingEngine.scene, this._renderingEngine.camera);
1087
+ };
1088
+
1089
+ if(this._sceneExtents === 0) {
1090
+ const token = this._eventEngine.addListener(EVENTTYPE.SCENE.SCENE_BOUNDING_BOX_CHANGE, async (e: IEvent) => {
1091
+ const viewerEvent = <ISceneEvent>e;
1092
+ if (viewerEvent.viewportId === this._renderingEngine.id) {
1093
+ if(vec3.distance(viewerEvent.boundingBox!.min, viewerEvent.boundingBox!.max) > 0) {
1094
+ initComposer();
1095
+ this.changeEffectPass();
1096
+ this._eventEngine.removeListener(token);
1097
+ }
1098
+ }
1099
+ });
1100
+ } else {
1101
+ initComposer();
1102
+ }
1103
+
1104
+ }
1105
+
1106
+ public removeEffect(token: string): boolean {
1107
+ const effectToRemove = this._effectDefinitions.find(e => e.token === token);
1108
+ if (effectToRemove)
1109
+ this._effectDefinitions.splice(this._effectDefinitions.indexOf(effectToRemove), 1);
1110
+ this.changeEffectPass();
1111
+ return true;
1112
+ }
1113
+
1114
+ public render(deltaTime: number, camera: THREE.Camera) {
1115
+ if(!this._composer) return;
1116
+
1117
+ const cameraId = `${camera.id}_${camera.type}${(camera.type === 'PerspectiveCamera' ? '' : '_' + camera.up.toArray().toString())}`;
1118
+ if(cameraId !== this._currentCameraId) {
1119
+ this._currentCameraId = cameraId;
1120
+ this.changeEffectPass();
1121
+ }
1122
+
1123
+ const currentClearColor = this._renderingEngine.renderer.getClearColor(new THREE.Color());
1124
+ const convertedClearColor = currentClearColor.clone().convertSRGBToLinear();
1125
+ this._renderingEngine.renderer.setClearColor(convertedClearColor);
1126
+ this._renderingEngine.renderer.setClearAlpha(this._renderingEngine.clearAlpha);
1127
+ this._renderingEngine.renderer.autoClear = false;
1128
+
1129
+ this._composer.setMainCamera(camera);
1130
+ this._composer.render();
1131
+
1132
+ this._renderingEngine.renderer.autoClear = true;
1133
+ this._renderingEngine.renderer.setClearColor(currentClearColor);
1134
+ }
1135
+
1136
+ public resize(width: number, height: number) {
1137
+ if(!this._composer) return;
1138
+
1139
+ this.effects.forEach(e => {
1140
+ if(e.effect.setSize)
1141
+ e.effect.setSize(width, height);
1142
+ });
1143
+
1144
+ this._renderPass!.setSize(width, height);
1145
+ this._ssaaRenderPass!.setSize(width, height);
1146
+ this._effectPass?.setSize(width, height);
1147
+ this._composer.setSize(width, height);
1148
+ }
1149
+
1150
+ public saveSettings(settingsEngine: SettingsEngine) {
1151
+ settingsEngine.settings.postprocessing.antiAliasingTechnique = this.antiAliasingTechnique;
1152
+ settingsEngine.settings.postprocessing.antiAliasingTechniqueMobile = this.antiAliasingTechniqueMobile;
1153
+ settingsEngine.settings.postprocessing.enablePostProcessingOnMobile = this.enablePostProcessingOnMobile;
1154
+ settingsEngine.settings.postprocessing.ssaaSampleLevel = this.ssaaSampleLevel;
1155
+ const effects = this.getPostProcessingEffectsArray();
1156
+ // delete the tokens as we don't want to save them
1157
+ effects.forEach(e => delete e.token);
1158
+ settingsEngine.settings.postprocessing.effects = effects;
1159
+ }
1160
+
1161
+ public updateEffect(token: string, definition: IPostProcessingEffectDefinition) {
1162
+ const effectDefinition = this._effectDefinitions.find(e => e.token === token);
1163
+ if (!effectDefinition) return;
1164
+ this.removeEffect(token);
1165
+ this.addEffect(definition, token);
1166
+ }
1167
+
1168
+ // #endregion Public Methods (10)
1169
+ }