@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,245 @@
1
+ import { Pass } from 'postprocessing';
2
+ import {
3
+ Camera,
4
+ HalfFloatType,
5
+ Matrix4,
6
+ NearestFilter,
7
+ NoColorSpace,
8
+ RepeatWrapping,
9
+ ShaderMaterial,
10
+ Texture,
11
+ TextureLoader,
12
+ Vector2,
13
+ WebGLRenderTarget,
14
+ WebGLRenderer
15
+ } from 'three';
16
+ import { basic as vertexShader } from '../utils/shader/basic';
17
+ import { sampleBlueNoise } from '../utils/shader/sampleBlueNoise';
18
+ import { poissionDenoise as fragmentShader } from './shader/poissionDenoise';
19
+ import { Converter, HttpClient } from '@shapediver/viewer.shared.services';
20
+
21
+ const finalFragmentShader = fragmentShader.replace('#include <sampleBlueNoise>', sampleBlueNoise);
22
+
23
+ const defaultPoissonBlurOptions = {
24
+ iterations: 1,
25
+ radius: 8,
26
+ rings: 5.625,
27
+ lumaPhi: 10,
28
+ depthPhi: 2,
29
+ normalPhi: 3.25,
30
+ samples: 16,
31
+ distance: 1,
32
+ normalTexture: null
33
+ };
34
+
35
+ export class PoissionDenoisePass extends Pass {
36
+ // #region Properties (9)
37
+
38
+ public static DefaultOptions = defaultPoissonBlurOptions;
39
+
40
+ public static blueNoiseTextureImage = HttpClient.instance.loadTexture('https://viewer.shapediver.com/v3/graphics/LDR_RGBA_0.png');
41
+ public static blueNoiseTexture: Texture;
42
+
43
+ public index = 0;
44
+ public inputTexture: Texture;
45
+ public iterations = defaultPoissonBlurOptions.iterations;
46
+ public radius = 8;
47
+ public renderTargetA: WebGLRenderTarget;
48
+ public renderTargetB: WebGLRenderTarget;
49
+ public rings = 5.625;
50
+ public samples = 16;
51
+
52
+ // #endregion Properties (9)
53
+
54
+ // #region Constructors (1)
55
+
56
+ constructor(camera: Camera, inputTexture: Texture, depthTexture: Texture, options: { [key: string]: unknown } = defaultPoissonBlurOptions) {
57
+ super('PoissionBlurPass');
58
+
59
+ if(!PoissionDenoisePass.blueNoiseTexture) {
60
+ PoissionDenoisePass.blueNoiseTextureImage.then((response) => {
61
+ Converter.instance.responseToImage(response).then((image) => {
62
+ PoissionDenoisePass.blueNoiseTexture = new Texture(image);
63
+ PoissionDenoisePass.blueNoiseTexture.minFilter = NearestFilter;
64
+ PoissionDenoisePass.blueNoiseTexture.magFilter = NearestFilter;
65
+ PoissionDenoisePass.blueNoiseTexture.wrapS = RepeatWrapping;
66
+ PoissionDenoisePass.blueNoiseTexture.wrapT = RepeatWrapping;
67
+ PoissionDenoisePass.blueNoiseTexture.colorSpace = NoColorSpace;
68
+ });
69
+ });
70
+ }
71
+
72
+ options = { ...defaultPoissonBlurOptions, ...options };
73
+
74
+ this.inputTexture = inputTexture;
75
+
76
+ this.fullscreenMaterial = new ShaderMaterial({
77
+ fragmentShader: finalFragmentShader,
78
+ vertexShader,
79
+ uniforms: {
80
+ depthTexture: { value: null },
81
+ inputTexture: { value: null },
82
+ projectionMatrixInverse: { value: new Matrix4() },
83
+ cameraMatrixWorld: { value: new Matrix4() },
84
+ lumaPhi: { value: 5.0 },
85
+ depthPhi: { value: 5.0 },
86
+ normalPhi: { value: 5.0 },
87
+ distance: { value: 1.0 },
88
+ resolution: { value: new Vector2() },
89
+ blueNoiseTexture: { value: null },
90
+ index: { value: 0 },
91
+ blueNoiseRepeat: { value: new Vector2() }
92
+ }
93
+ });
94
+
95
+ const renderTargetOptions = {
96
+ type: HalfFloatType,
97
+ depthBuffer: false
98
+ };
99
+
100
+ this.renderTargetA = new WebGLRenderTarget(1, 1, renderTargetOptions);
101
+ this.renderTargetB = new WebGLRenderTarget(1, 1, renderTargetOptions);
102
+
103
+ const { uniforms } = (this.fullscreenMaterial as ShaderMaterial);
104
+
105
+ uniforms['inputTexture'].value = this.inputTexture;
106
+ uniforms['depthTexture'].value = depthTexture;
107
+ uniforms['projectionMatrixInverse'].value = camera.projectionMatrixInverse;
108
+ uniforms['cameraMatrixWorld'].value = camera.matrixWorld;
109
+ uniforms['depthPhi'].value = options.depthPhi;
110
+ uniforms['normalPhi'].value = options.normalPhi;
111
+ uniforms['distance'].value = options.distance;
112
+
113
+ if (options.normalTexture) {
114
+ uniforms['normalTexture'] = { value: options.normalTexture };
115
+ } else {
116
+ (this.fullscreenMaterial as ShaderMaterial).defines.NORMAL_IN_RGB = '';
117
+ }
118
+
119
+ // these properties need the shader to be recompiled
120
+ for (const prop of ['radius', 'rings', 'samples']) {
121
+ Object.defineProperty(this, prop, {
122
+ get: () => options[prop],
123
+ set: value => {
124
+ options[prop] = value;
125
+
126
+ this.setSize(this.renderTargetA.width, this.renderTargetA.height);
127
+ }
128
+ });
129
+ }
130
+
131
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value = PoissionDenoisePass.blueNoiseTexture;
132
+ }
133
+
134
+ // #endregion Constructors (1)
135
+
136
+ // #region Public Accessors (1)
137
+
138
+ public get texture() {
139
+ return this.renderTargetB.texture;
140
+ }
141
+
142
+ // #endregion Public Accessors (1)
143
+
144
+ // #region Public Methods (4)
145
+
146
+ public generateDenoiseSamples(numSamples: number, numRings: number, r: number, texelSize: Vector2) {
147
+ const angleStep = (2 * Math.PI * numRings) / numSamples;
148
+ const invNumSamples = 1.0 / numSamples;
149
+ const radiusStep = invNumSamples;
150
+ const samples = [];
151
+ let radius = invNumSamples;
152
+ let angle = 0;
153
+
154
+ for (let i = 0; i < numSamples; i++) {
155
+ const v = new Vector2(Math.cos(angle), Math.sin(angle))
156
+ .multiplyScalar(Math.pow(radius, 0.75))
157
+ .multiply(texelSize)
158
+ .multiplyScalar(r);
159
+
160
+ if(isNaN(v.x) || v.x === Infinity || v.x === -Infinity)
161
+ v.x = 0;
162
+
163
+ if(isNaN(v.y) || v.y === Infinity || v.y === -Infinity)
164
+ v.y = 0;
165
+
166
+ samples.push(v);
167
+ radius += radiusStep;
168
+ angle += angleStep;
169
+ }
170
+
171
+ return samples;
172
+ }
173
+
174
+ public generatePoissonDiskConstant(poissonDisk: Vector2[]) {
175
+ const samples = poissonDisk.length;
176
+
177
+ let glslCode = 'const vec2 poissonDisk[samples] = vec2[samples](\n';
178
+
179
+ for (let i = 0; i < samples; i++) {
180
+ const sample = poissonDisk[i];
181
+ glslCode += ` vec2(${sample.x}, ${sample.y})`;
182
+
183
+ if (i < samples - 1) {
184
+ glslCode += ',';
185
+ }
186
+
187
+ glslCode += '\n';
188
+ }
189
+
190
+ glslCode += ');';
191
+
192
+ return glslCode;
193
+ }
194
+
195
+ public render(renderer: WebGLRenderer) {
196
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.index.value = 0;
197
+
198
+ const noiseTexture = (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseTexture.value;
199
+ if (noiseTexture) {
200
+ const { width, height } = (noiseTexture as Texture).source.data;
201
+
202
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.blueNoiseRepeat.value.set(
203
+ this.renderTargetA.width / width,
204
+ this.renderTargetA.height / height
205
+ );
206
+ }
207
+
208
+ for (let i = 0; i < 2 * this.iterations; i++) {
209
+ const horizontal = i % 2 === 0;
210
+
211
+ const inputRenderTarget = horizontal ? this.renderTargetB : this.renderTargetA;
212
+ (this.fullscreenMaterial as ShaderMaterial).uniforms['inputTexture'].value = i === 0 ? this.inputTexture : inputRenderTarget.texture;
213
+
214
+ const renderTarget = horizontal ? this.renderTargetA : this.renderTargetB;
215
+
216
+ renderer.setRenderTarget(renderTarget);
217
+ renderer.render(this.scene, this.camera);
218
+
219
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.index.value = ((this.fullscreenMaterial as ShaderMaterial).uniforms.index.value + 1) % 4;
220
+ }
221
+ }
222
+
223
+ public setSize(width: number, height: number) {
224
+ this.renderTargetA.setSize(width, height);
225
+ this.renderTargetB.setSize(width, height);
226
+
227
+ (this.fullscreenMaterial as ShaderMaterial).uniforms.resolution.value.set(width, height);
228
+
229
+ const poissonDisk = this.generateDenoiseSamples(
230
+ this.samples,
231
+ this.rings,
232
+ this.radius,
233
+ new Vector2(1 / width, 1 / height)
234
+ );
235
+
236
+ const sampleDefine = `const int samples = ${this.samples};\n`;
237
+
238
+ const poissonDiskConstant = this.generatePoissonDiskConstant(poissonDisk);
239
+
240
+ (this.fullscreenMaterial as ShaderMaterial).fragmentShader = sampleDefine + poissonDiskConstant + '\n' + finalFragmentShader;
241
+ (this.fullscreenMaterial as ShaderMaterial).needsUpdate = true;
242
+ }
243
+
244
+ // #endregion Public Methods (4)
245
+ }
@@ -0,0 +1,125 @@
1
+ varying vec2 vUv;
2
+
3
+ uniform sampler2D inputTexture;
4
+ uniform sampler2D depthTexture;
5
+ uniform sampler2D normalTexture;
6
+ uniform mat4 projectionMatrixInverse;
7
+ uniform mat4 cameraMatrixWorld;
8
+ uniform float lumaPhi;
9
+ uniform float depthPhi;
10
+ uniform float normalPhi;
11
+ uniform float distance;
12
+ uniform sampler2D blueNoiseTexture;
13
+ uniform vec2 blueNoiseRepeat;
14
+ uniform int index;
15
+ uniform vec2 resolution;
16
+
17
+ #include <common>
18
+ #include <sampleBlueNoise>
19
+
20
+ vec3 getWorldPos(float depth, vec2 coord) {
21
+ float z = depth * 2.0 - 1.0;
22
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
23
+ vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
24
+
25
+ // Perspective division
26
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
27
+ worldSpacePosition.xyz /= worldSpacePosition.w;
28
+ return worldSpacePosition.xyz;
29
+ }
30
+
31
+ #define luminance(a) dot(vec3(0.2125, 0.7154, 0.0721), a)
32
+
33
+ vec3 getNormal(vec2 uv, vec4 texel) {
34
+ #ifdef NORMAL_IN_RGB
35
+ // in case the normal is stored in the RGB channels of the texture
36
+ return texel.rgb;
37
+ #else
38
+ return normalize(textureLod(normalTexture, uv, 0.).xyz * 2.0 - 1.0);
39
+ #endif
40
+ }
41
+
42
+ float distToPlane(const vec3 worldPos, const vec3 neighborWorldPos, const vec3 worldNormal) {
43
+ vec3 toCurrent = worldPos - neighborWorldPos;
44
+ float distToPlane = abs(dot(toCurrent, worldNormal));
45
+
46
+ return distToPlane;
47
+ }
48
+
49
+ void main() {
50
+ vec4 depthTexel = textureLod(depthTexture, vUv, 0.);
51
+
52
+ if (depthTexel.r == 1.0 || dot(depthTexel.rgb, depthTexel.rgb) == 0.) {
53
+ discard;
54
+ return;
55
+ }
56
+
57
+ vec4 texel = textureLod(inputTexture, vUv, 0.0);
58
+
59
+ vec3 normal = getNormal(vUv, texel);
60
+
61
+ #ifdef NORMAL_IN_RGB
62
+ float denoised = texel.a;
63
+ float center = texel.a;
64
+ #else
65
+ vec3 denoised = texel.rgb;
66
+ vec3 center = texel.rgb;
67
+ #endif
68
+
69
+ float depth = depthTexel.x;
70
+ vec3 worldPos = getWorldPos(depth, vUv);
71
+
72
+ float totalWeight = 1.0;
73
+
74
+ vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, 0, blueNoiseRepeat, resolution);
75
+ float angle = blueNoise[index];
76
+
77
+ float s = sin(angle), c = cos(angle);
78
+
79
+ mat2 rotationMatrix = mat2(c, -s, s, c);
80
+
81
+ for (int i = 0; i < samples; i++) {
82
+ vec2 offset = rotationMatrix * poissonDisk[i];
83
+ vec2 neighborUv = vUv + offset;
84
+
85
+ vec4 neighborTexel = textureLod(inputTexture, neighborUv, 0.0);
86
+
87
+ vec3 neighborNormal = getNormal(neighborUv, neighborTexel);
88
+ #ifdef NORMAL_IN_RGB
89
+ float neighborColor = neighborTexel.a;
90
+ #else
91
+ vec3 neighborColor = neighborTexel.rgb;
92
+ #endif
93
+
94
+ float sampleDepth = textureLod(depthTexture, neighborUv, 0.0).x;
95
+
96
+ vec3 worldPosSample = getWorldPos(sampleDepth, neighborUv);
97
+ float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));
98
+
99
+ float normalDiff = dot(normal, neighborNormal);
100
+ float normalSimilarity = pow(max(normalDiff, 0.), normalPhi);
101
+
102
+ #ifdef NORMAL_IN_RGB
103
+ float lumaDiff = abs(neighborColor - center);
104
+ #else
105
+ float lumaDiff = abs(luminance(neighborColor) - luminance(center));
106
+ #endif
107
+ float lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);
108
+
109
+ float depthDiff = 1. - (distToPlane(worldPos, worldPosSample, normal) / distance);
110
+ float depthSimilarity = max(depthDiff / depthPhi, 0.);
111
+
112
+ float w = lumaSimilarity * depthSimilarity * normalSimilarity;
113
+
114
+ denoised += w * neighborColor;
115
+ totalWeight += w;
116
+ }
117
+
118
+ if (totalWeight > 0.) denoised /= totalWeight;
119
+
120
+ #ifdef NORMAL_IN_RGB
121
+ gl_FragColor = vec4(normal, denoised);
122
+ #else
123
+ gl_FragColor = vec4(denoised, 1.);
124
+ #endif
125
+ }
@@ -0,0 +1,127 @@
1
+ export const poissionDenoise = `
2
+ varying vec2 vUv;
3
+
4
+ uniform sampler2D inputTexture;
5
+ uniform highp sampler2D depthTexture;
6
+ uniform sampler2D normalTexture;
7
+ uniform mat4 projectionMatrixInverse;
8
+ uniform mat4 cameraMatrixWorld;
9
+ uniform float lumaPhi;
10
+ uniform float depthPhi;
11
+ uniform float normalPhi;
12
+ uniform float distance;
13
+ uniform sampler2D blueNoiseTexture;
14
+ uniform vec2 blueNoiseRepeat;
15
+ uniform int index;
16
+ uniform vec2 resolution;
17
+
18
+ #include <common>
19
+ #include <sampleBlueNoise>
20
+
21
+ vec3 getWorldPos(float depth, vec2 coord) {
22
+ float z = depth * 2.0 - 1.0;
23
+ vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
24
+ vec4 viewSpacePosition = projectionMatrixInverse * clipSpacePosition;
25
+
26
+ // Perspective division
27
+ vec4 worldSpacePosition = cameraMatrixWorld * viewSpacePosition;
28
+ worldSpacePosition.xyz /= worldSpacePosition.w;
29
+ return worldSpacePosition.xyz;
30
+ }
31
+
32
+ #define luminance(a) dot(vec3(0.2125, 0.7154, 0.0721), a)
33
+
34
+ vec3 getNormal(vec2 uv, vec4 texel) {
35
+ #ifdef NORMAL_IN_RGB
36
+ // in case the normal is stored in the RGB channels of the texture
37
+ return texel.rgb;
38
+ #else
39
+ return normalize(textureLod(normalTexture, uv, 0.).xyz * 2.0 - 1.0);
40
+ #endif
41
+ }
42
+
43
+ float distToPlane(const vec3 worldPos, const vec3 neighborWorldPos, const vec3 worldNormal) {
44
+ vec3 toCurrent = worldPos - neighborWorldPos;
45
+ float distToPlane = abs(dot(toCurrent, worldNormal));
46
+
47
+ return distToPlane;
48
+ }
49
+
50
+ void main() {
51
+ vec4 depthTexel = textureLod(depthTexture, vUv, 0.);
52
+
53
+ if (depthTexel.r == 1.0 || dot(depthTexel.rgb, depthTexel.rgb) == 0.) {
54
+ discard;
55
+ return;
56
+ }
57
+
58
+ vec4 texel = textureLod(inputTexture, vUv, 0.0);
59
+
60
+ vec3 normal = getNormal(vUv, texel);
61
+
62
+ #ifdef NORMAL_IN_RGB
63
+ float denoised = texel.a;
64
+ float center = texel.a;
65
+ #else
66
+ vec3 denoised = texel.rgb;
67
+ vec3 center = texel.rgb;
68
+ #endif
69
+
70
+ float depth = depthTexel.x;
71
+ vec3 worldPos = getWorldPos(depth, vUv);
72
+
73
+ float totalWeight = 1.0;
74
+
75
+ vec4 blueNoise = sampleBlueNoise(blueNoiseTexture, 0, blueNoiseRepeat, resolution);
76
+ float angle = blueNoise[index];
77
+
78
+ float s = sin(angle), c = cos(angle);
79
+
80
+ mat2 rotationMatrix = mat2(c, -s, s, c);
81
+
82
+ for (int i = 0; i < samples; i++) {
83
+ vec2 offset = rotationMatrix * poissonDisk[i];
84
+ vec2 neighborUv = vUv + offset;
85
+
86
+ vec4 neighborTexel = textureLod(inputTexture, neighborUv, 0.0);
87
+
88
+ vec3 neighborNormal = getNormal(neighborUv, neighborTexel);
89
+ #ifdef NORMAL_IN_RGB
90
+ float neighborColor = neighborTexel.a;
91
+ #else
92
+ vec3 neighborColor = neighborTexel.rgb;
93
+ #endif
94
+
95
+ float sampleDepth = textureLod(depthTexture, neighborUv, 0.0).x;
96
+
97
+ vec3 worldPosSample = getWorldPos(sampleDepth, neighborUv);
98
+ float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));
99
+
100
+ float normalDiff = dot(normal, neighborNormal);
101
+ float normalSimilarity = pow(max(normalDiff, 0.), normalPhi);
102
+
103
+ #ifdef NORMAL_IN_RGB
104
+ float lumaDiff = abs(neighborColor - center);
105
+ #else
106
+ float lumaDiff = abs(luminance(neighborColor) - luminance(center));
107
+ #endif
108
+ float lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);
109
+
110
+ float depthDiff = 1. - (distToPlane(worldPos, worldPosSample, normal) / distance);
111
+ float depthSimilarity = max(depthDiff / depthPhi, 0.);
112
+
113
+ float w = lumaSimilarity * depthSimilarity * normalSimilarity;
114
+
115
+ denoised += w * neighborColor;
116
+ totalWeight += w;
117
+ }
118
+
119
+ if (totalWeight > 0.) denoised /= totalWeight;
120
+
121
+ #ifdef NORMAL_IN_RGB
122
+ gl_FragColor = vec4(normal, denoised);
123
+ #else
124
+ gl_FragColor = vec4(denoised, 1.);
125
+ #endif
126
+ }
127
+ `
@@ -0,0 +1,106 @@
1
+ import { EffectComposer } from 'postprocessing';
2
+ import { Camera, Scene, Vector3 } from 'three';
3
+ import { AOEffect } from '../ao/AOEffect';
4
+ import { AOPass } from '../ao/AOPass';
5
+ import { ssao as fragmentShader } from './shader/ssao';
6
+
7
+ class SSAOPass extends AOPass {
8
+ // #region Constructors (1)
9
+
10
+ constructor(camera: Camera, scene: Scene) {
11
+ super(camera, scene, fragmentShader);
12
+ }
13
+
14
+ // #endregion Constructors (1)
15
+ }
16
+
17
+ class SSAOEffect extends AOEffect {
18
+ // #region Properties (1)
19
+
20
+ public spp = 16;
21
+
22
+ // #endregion Properties (1)
23
+
24
+ // #region Constructors (1)
25
+
26
+ constructor(composer: EffectComposer, camera: Camera, scene: Scene, options?: { [key: string]: unknown }) {
27
+ super(composer, camera, scene, new SSAOPass(camera, scene), options);
28
+
29
+ SSAOEffect.DefaultOptions = {
30
+ ...AOEffect.DefaultOptions,
31
+ ...{
32
+ spp: 16,
33
+ distance: 1,
34
+ distancePower: 0.25,
35
+ power: 2
36
+ }
37
+ };
38
+
39
+ options = {
40
+ ...SSAOEffect.DefaultOptions,
41
+ ...options
42
+ };
43
+ }
44
+
45
+ // #endregion Constructors (1)
46
+
47
+ // #region Public Methods (2)
48
+
49
+ public getPointsOnSphere(n: number) {
50
+ const points = [];
51
+ const inc = Math.PI * (3 - Math.sqrt(5));
52
+ const off = 2 / n;
53
+
54
+ for (let k = 0; k < n; k++) {
55
+ const y = k * off - 1 + off / 2;
56
+ const r = Math.sqrt(1 - y * y);
57
+ const phi = k * inc;
58
+ points.push(new Vector3(Math.cos(phi) * r, y, Math.sin(phi) * r));
59
+ }
60
+
61
+ return points;
62
+ }
63
+
64
+ public makeOptionsReactive(options: { [key: string]: unknown }) {
65
+ super.makeOptionsReactive(options);
66
+
67
+ for (const key of ['spp']) {
68
+ Object.defineProperty(this, key, {
69
+ get() {
70
+ return options[key];
71
+ },
72
+ set(value) {
73
+ if (value === null || value === undefined) return;
74
+
75
+ options[key] = value;
76
+
77
+ switch (key) {
78
+ case 'spp': {
79
+ this.aoPass.fullscreenMaterial.defines.spp = value.toFixed(0);
80
+
81
+ const samples = this.getPointsOnSphere(value);
82
+
83
+ const samplesR = [];
84
+ for (let i = 0; i < value; i++) {
85
+ samplesR.push((i + 1) / value);
86
+ }
87
+
88
+ this.aoPass.fullscreenMaterial.uniforms.samples = { value: samples };
89
+ this.aoPass.fullscreenMaterial.uniforms.samplesR = { value: samplesR };
90
+
91
+ this.aoPass.fullscreenMaterial.needsUpdate = true;
92
+ break;
93
+ }
94
+ }
95
+ },
96
+ configurable: true
97
+ });
98
+ }
99
+
100
+ this.spp = options['spp'] as number;
101
+ }
102
+
103
+ // #endregion Public Methods (2)
104
+ }
105
+
106
+ export { SSAOEffect };