angular-three-soba 1.12.4 → 1.14.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 (262) hide show
  1. package/abstractions/lib/billboard/billboard.d.ts +1 -1
  2. package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +1 -1
  3. package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +1 -1
  4. package/abstractions/lib/edges/edges.d.ts +2 -2
  5. package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +1 -1
  6. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +1 -1
  7. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +2 -2
  8. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +1 -1
  9. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +1 -1
  10. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +2 -2
  11. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +1 -1
  12. package/abstractions/lib/line/line-input.d.ts +1 -1
  13. package/abstractions/lib/line/line.d.ts +1 -1
  14. package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +1 -1
  15. package/abstractions/lib/text/text.d.ts +1 -1
  16. package/abstractions/lib/text-3d/text-3d.d.ts +1 -1
  17. package/cameras/lib/camera/camera-content.d.ts +1 -1
  18. package/cameras/lib/camera/camera.d.ts +1 -1
  19. package/cameras/lib/cube-camera/cube-camera.d.ts +1 -1
  20. package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +1 -1
  21. package/controls/lib/orbit-controls/orbit-controls.d.ts +1 -1
  22. package/esm2022/abstractions/lib/billboard/billboard.mjs +74 -0
  23. package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +120 -0
  24. package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +99 -0
  25. package/esm2022/abstractions/lib/edges/edges.mjs +96 -0
  26. package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +213 -0
  27. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +92 -0
  28. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +184 -0
  29. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +46 -0
  30. package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +8 -7
  31. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +195 -0
  32. package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +8 -7
  33. package/esm2022/abstractions/lib/line/line-input.mjs +76 -0
  34. package/esm2022/abstractions/lib/line/line.mjs +133 -0
  35. package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +128 -0
  36. package/esm2022/abstractions/lib/text/text.mjs +115 -0
  37. package/esm2022/abstractions/lib/text-3d/text-3d.mjs +145 -0
  38. package/esm2022/cameras/lib/camera/camera-content.mjs +21 -0
  39. package/esm2022/cameras/lib/camera/camera.mjs +75 -0
  40. package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +131 -0
  41. package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +93 -0
  42. package/{esm2020 → esm2022}/cameras/lib/perspective-camera/perspective-camera.mjs +8 -7
  43. package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +147 -0
  44. package/esm2022/loaders/index.mjs +6 -0
  45. package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +10 -0
  46. package/esm2022/loaders/lib/loader/loader.mjs +134 -0
  47. package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +75 -0
  48. package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +328 -0
  49. package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +158 -0
  50. package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +238 -0
  51. package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
  52. package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +26 -0
  53. package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +47 -0
  54. package/esm2022/performance/lib/adaptive/adaptive-events.mjs +37 -0
  55. package/esm2022/performance/lib/detailed/detailed.mjs +54 -0
  56. package/esm2022/performance/lib/stats/stats.mjs +80 -0
  57. package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +61 -0
  58. package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +249 -0
  59. package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +201 -0
  60. package/{esm2020 → esm2022}/staging/lib/bounds/bounds.mjs +8 -7
  61. package/esm2022/staging/lib/camera-shake/camera-shake.mjs +122 -0
  62. package/esm2022/staging/lib/caustics/caustics.mjs +364 -0
  63. package/esm2022/staging/lib/center/center.mjs +143 -0
  64. package/esm2022/staging/lib/cloud/cloud.mjs +160 -0
  65. package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +228 -0
  66. package/esm2022/staging/lib/environment/environment-cube.mjs +41 -0
  67. package/esm2022/staging/lib/environment/environment-ground.mjs +67 -0
  68. package/esm2022/staging/lib/environment/environment-inputs.mjs +87 -0
  69. package/esm2022/staging/lib/environment/environment-map.mjs +39 -0
  70. package/esm2022/staging/lib/environment/environment-portal.mjs +111 -0
  71. package/{esm2020 → esm2022}/staging/lib/environment/environment.mjs +13 -11
  72. package/esm2022/staging/lib/float/float.mjs +77 -0
  73. package/esm2022/staging/lib/sky/sky.mjs +109 -0
  74. package/esm2022/staging/lib/sparkles/sparkles.mjs +210 -0
  75. package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +51 -0
  76. package/esm2022/staging/lib/spot-light/spot-light-input.mjs +62 -0
  77. package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +74 -0
  78. package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +126 -0
  79. package/{esm2020 → esm2022}/staging/lib/spot-light/spot-light-shadow.mjs +8 -7
  80. package/esm2022/staging/lib/spot-light/spot-light.mjs +117 -0
  81. package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +86 -0
  82. package/{esm2020 → esm2022}/staging/lib/stage/stage.mjs +13 -11
  83. package/esm2022/staging/lib/stars/stars.mjs +140 -0
  84. package/{fesm2020 → fesm2022}/angular-three-soba-abstractions.mjs +89 -89
  85. package/{fesm2015 → fesm2022}/angular-three-soba-abstractions.mjs.map +1 -1
  86. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs +21 -21
  87. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs.map +1 -1
  88. package/{fesm2020 → fesm2022}/angular-three-soba-controls.mjs +5 -5
  89. package/fesm2022/angular-three-soba-controls.mjs.map +1 -0
  90. package/{fesm2020 → fesm2022}/angular-three-soba-loaders.mjs +15 -8
  91. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -0
  92. package/{fesm2020 → fesm2022}/angular-three-soba-materials.mjs +25 -25
  93. package/fesm2022/angular-three-soba-materials.mjs.map +1 -0
  94. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs +3 -3
  95. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs.map +1 -1
  96. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs +14 -14
  97. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs.map +1 -1
  98. package/{fesm2020 → fesm2022}/angular-three-soba-shaders.mjs +2 -2
  99. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -0
  100. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs +139 -139
  101. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs.map +1 -1
  102. package/loaders/index.d.ts +1 -0
  103. package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +3 -0
  104. package/loaders/lib/loader/loader.d.ts +1 -1
  105. package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +8 -3
  106. package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +1 -1
  107. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +1 -1
  108. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  109. package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +1 -1
  110. package/package.json +43 -68
  111. package/performance/lib/adaptive/adaptive-dpr.d.ts +1 -1
  112. package/performance/lib/detailed/detailed.d.ts +1 -1
  113. package/performance/lib/stats/stats.d.ts +1 -1
  114. package/plugin/package.json +1 -1
  115. package/plugin/src/generators/init/compat.js +1 -1
  116. package/plugin/src/generators/init/compat.js.map +1 -1
  117. package/plugin/src/generators/init/init.d.ts +1 -1
  118. package/plugin/src/generators/init/init.js +1 -1
  119. package/plugin/src/generators/init/init.js.map +1 -1
  120. package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +2 -2
  121. package/staging/lib/accumulative-shadows/randomized-lights.d.ts +1 -1
  122. package/staging/lib/bounds/bounds.d.ts +1 -1
  123. package/staging/lib/camera-shake/camera-shake.d.ts +1 -1
  124. package/staging/lib/caustics/caustics.d.ts +2 -2
  125. package/staging/lib/center/center.d.ts +1 -1
  126. package/staging/lib/cloud/cloud.d.ts +1 -1
  127. package/staging/lib/contact-shadows/contact-shadows.d.ts +1 -1
  128. package/staging/lib/environment/environment-inputs.d.ts +1 -1
  129. package/staging/lib/float/float.d.ts +1 -1
  130. package/staging/lib/sky/sky.d.ts +1 -1
  131. package/staging/lib/sparkles/sparkles.d.ts +2 -2
  132. package/staging/lib/spot-light/shadow-mesh-input.d.ts +1 -1
  133. package/staging/lib/spot-light/spot-light-input.d.ts +1 -1
  134. package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +1 -1
  135. package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +1 -1
  136. package/staging/lib/spot-light/spot-light.d.ts +1 -1
  137. package/staging/lib/spot-light/volumetric-mesh.d.ts +1 -1
  138. package/staging/lib/stage/stage.d.ts +2 -2
  139. package/staging/lib/stars/stars.d.ts +2 -2
  140. package/esm2020/abstractions/lib/billboard/billboard.mjs +0 -73
  141. package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -119
  142. package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -98
  143. package/esm2020/abstractions/lib/edges/edges.mjs +0 -95
  144. package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -211
  145. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -91
  146. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -182
  147. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -45
  148. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -193
  149. package/esm2020/abstractions/lib/line/line-input.mjs +0 -75
  150. package/esm2020/abstractions/lib/line/line.mjs +0 -132
  151. package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -127
  152. package/esm2020/abstractions/lib/text/text.mjs +0 -114
  153. package/esm2020/abstractions/lib/text-3d/text-3d.mjs +0 -144
  154. package/esm2020/cameras/lib/camera/camera-content.mjs +0 -20
  155. package/esm2020/cameras/lib/camera/camera.mjs +0 -74
  156. package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +0 -130
  157. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -92
  158. package/esm2020/controls/lib/orbit-controls/orbit-controls.mjs +0 -146
  159. package/esm2020/loaders/index.mjs +0 -5
  160. package/esm2020/loaders/lib/loader/loader.mjs +0 -133
  161. package/esm2020/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -74
  162. package/esm2020/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -327
  163. package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -157
  164. package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -237
  165. package/esm2020/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -67
  166. package/esm2020/misc/lib/bake-shadows/bake-shadows.mjs +0 -25
  167. package/esm2020/performance/lib/adaptive/adaptive-dpr.mjs +0 -46
  168. package/esm2020/performance/lib/adaptive/adaptive-events.mjs +0 -36
  169. package/esm2020/performance/lib/detailed/detailed.mjs +0 -53
  170. package/esm2020/performance/lib/stats/stats.mjs +0 -79
  171. package/esm2020/shaders/lib/blur-pass/blur-pass.mjs +0 -61
  172. package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -247
  173. package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -199
  174. package/esm2020/staging/lib/camera-shake/camera-shake.mjs +0 -121
  175. package/esm2020/staging/lib/caustics/caustics.mjs +0 -363
  176. package/esm2020/staging/lib/center/center.mjs +0 -142
  177. package/esm2020/staging/lib/cloud/cloud.mjs +0 -159
  178. package/esm2020/staging/lib/contact-shadows/contact-shadows.mjs +0 -227
  179. package/esm2020/staging/lib/environment/environment-cube.mjs +0 -40
  180. package/esm2020/staging/lib/environment/environment-ground.mjs +0 -66
  181. package/esm2020/staging/lib/environment/environment-inputs.mjs +0 -86
  182. package/esm2020/staging/lib/environment/environment-map.mjs +0 -38
  183. package/esm2020/staging/lib/environment/environment-portal.mjs +0 -110
  184. package/esm2020/staging/lib/float/float.mjs +0 -76
  185. package/esm2020/staging/lib/sky/sky.mjs +0 -108
  186. package/esm2020/staging/lib/sparkles/sparkles.mjs +0 -209
  187. package/esm2020/staging/lib/spot-light/shadow-mesh-input.mjs +0 -50
  188. package/esm2020/staging/lib/spot-light/spot-light-input.mjs +0 -61
  189. package/esm2020/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -73
  190. package/esm2020/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -125
  191. package/esm2020/staging/lib/spot-light/spot-light.mjs +0 -116
  192. package/esm2020/staging/lib/spot-light/volumetric-mesh.mjs +0 -85
  193. package/esm2020/staging/lib/stars/stars.mjs +0 -139
  194. package/fesm2015/angular-three-soba-abstractions.mjs +0 -2048
  195. package/fesm2015/angular-three-soba-controls.mjs +0 -153
  196. package/fesm2015/angular-three-soba-controls.mjs.map +0 -1
  197. package/fesm2015/angular-three-soba-loaders.mjs +0 -222
  198. package/fesm2015/angular-three-soba-loaders.mjs.map +0 -1
  199. package/fesm2015/angular-three-soba-materials.mjs +0 -851
  200. package/fesm2015/angular-three-soba-materials.mjs.map +0 -1
  201. package/fesm2015/angular-three-soba-misc.mjs +0 -148
  202. package/fesm2015/angular-three-soba-misc.mjs.map +0 -1
  203. package/fesm2015/angular-three-soba-performance.mjs +0 -210
  204. package/fesm2015/angular-three-soba-performance.mjs.map +0 -1
  205. package/fesm2015/angular-three-soba-shaders.mjs +0 -1239
  206. package/fesm2015/angular-three-soba-shaders.mjs.map +0 -1
  207. package/fesm2015/angular-three-soba-staging.mjs +0 -3772
  208. package/fesm2015/angular-three-soba-staging.mjs.map +0 -1
  209. package/fesm2020/angular-three-soba-abstractions.mjs.map +0 -1
  210. package/fesm2020/angular-three-soba-cameras.mjs +0 -347
  211. package/fesm2020/angular-three-soba-cameras.mjs.map +0 -1
  212. package/fesm2020/angular-three-soba-controls.mjs.map +0 -1
  213. package/fesm2020/angular-three-soba-loaders.mjs.map +0 -1
  214. package/fesm2020/angular-three-soba-materials.mjs.map +0 -1
  215. package/fesm2020/angular-three-soba-shaders.mjs.map +0 -1
  216. package/fesm2020/angular-three-soba.mjs +0 -6
  217. package/fesm2020/angular-three-soba.mjs.map +0 -1
  218. /package/{esm2020 → esm2022}/abstractions/angular-three-soba-abstractions.mjs +0 -0
  219. /package/{esm2020 → esm2022}/abstractions/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -0
  221. /package/{esm2020 → esm2022}/angular-three-soba.mjs +0 -0
  222. /package/{esm2020 → esm2022}/cameras/angular-three-soba-cameras.mjs +0 -0
  223. /package/{esm2020 → esm2022}/cameras/index.mjs +0 -0
  224. /package/{esm2020 → esm2022}/controls/angular-three-soba-controls.mjs +0 -0
  225. /package/{esm2020 → esm2022}/controls/index.mjs +0 -0
  226. /package/{esm2020 → esm2022}/index.mjs +0 -0
  227. /package/{esm2020 → esm2022}/loaders/angular-three-soba-loaders.mjs +0 -0
  228. /package/{esm2020 → esm2022}/loaders/lib/gltf-loader/gltf-loader.mjs +0 -0
  229. /package/{esm2020 → esm2022}/loaders/lib/progress/progress.mjs +0 -0
  230. /package/{esm2020 → esm2022}/loaders/lib/texture-loader/texture-loader.mjs +0 -0
  231. /package/{esm2020 → esm2022}/materials/angular-three-soba-materials.mjs +0 -0
  232. /package/{esm2020 → esm2022}/materials/index.mjs +0 -0
  233. /package/{esm2020 → esm2022}/misc/angular-three-soba-misc.mjs +0 -0
  234. /package/{esm2020 → esm2022}/misc/index.mjs +0 -0
  235. /package/{esm2020 → esm2022}/misc/lib/animations/animations.mjs +0 -0
  236. /package/{esm2020 → esm2022}/misc/lib/depth-buffer/depth-buffer.mjs +0 -0
  237. /package/{esm2020 → esm2022}/misc/lib/fbo/fbo.mjs +0 -0
  238. /package/{esm2020 → esm2022}/performance/angular-three-soba-performance.mjs +0 -0
  239. /package/{esm2020 → esm2022}/performance/index.mjs +0 -0
  240. /package/{esm2020 → esm2022}/shaders/angular-three-soba-shaders.mjs +0 -0
  241. /package/{esm2020 → esm2022}/shaders/index.mjs +0 -0
  242. /package/{esm2020 → esm2022}/shaders/lib/caustics-material/caustics-material.mjs +0 -0
  243. /package/{esm2020 → esm2022}/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -0
  244. /package/{esm2020 → esm2022}/shaders/lib/convolution-material/convolution-material.mjs +0 -0
  245. /package/{esm2020 → esm2022}/shaders/lib/discard-material/discard-material.mjs +0 -0
  246. /package/{esm2020 → esm2022}/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -0
  247. /package/{esm2020 → esm2022}/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -0
  248. /package/{esm2020 → esm2022}/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -0
  249. /package/{esm2020 → esm2022}/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -0
  250. /package/{esm2020 → esm2022}/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -0
  251. /package/{esm2020 → esm2022}/shaders/lib/shader-material/shader-material.mjs +0 -0
  252. /package/{esm2020 → esm2022}/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -0
  253. /package/{esm2020 → esm2022}/shaders/lib/spot-light-material/spot-light-material.mjs +0 -0
  254. /package/{esm2020 → esm2022}/shaders/lib/star-field-material/star-field-material.mjs +0 -0
  255. /package/{esm2020 → esm2022}/staging/angular-three-soba-staging.mjs +0 -0
  256. /package/{esm2020 → esm2022}/staging/index.mjs +0 -0
  257. /package/{esm2020 → esm2022}/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -0
  258. /package/{esm2020 → esm2022}/staging/lib/environment/assets.mjs +0 -0
  259. /package/{esm2020 → esm2022}/staging/lib/environment/utils.mjs +0 -0
  260. /package/{esm2020 → esm2022}/staging/lib/spot-light/common.mjs +0 -0
  261. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs +0 -0
  262. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs.map +0 -0
@@ -0,0 +1,61 @@
1
+ import { BufferAttribute, BufferGeometry, LinearFilter, Mesh, PerspectiveCamera, Scene, Vector2, WebGLRenderTarget, } from 'three';
2
+ import { ConvolutionMaterial } from '../convolution-material/convolution-material';
3
+ export class BlurPass {
4
+ constructor({ gl, resolution, width = 500, height = 500, minDepthThreshold = 0, maxDepthThreshold = 1, depthScale = 0, depthToBlurRatioBias = 0.25, }) {
5
+ this.renderToScreen = false;
6
+ this.renderTargetA = new WebGLRenderTarget(resolution, resolution, {
7
+ minFilter: LinearFilter,
8
+ magFilter: LinearFilter,
9
+ stencilBuffer: false,
10
+ depthBuffer: false,
11
+ encoding: gl.outputEncoding,
12
+ });
13
+ this.renderTargetB = this.renderTargetA.clone();
14
+ this.convolutionMaterial = new ConvolutionMaterial();
15
+ this.convolutionMaterial.setTexelSize(1.0 / width, 1.0 / height);
16
+ this.convolutionMaterial.setResolution(new Vector2(width, height));
17
+ this.scene = new Scene();
18
+ this.camera = new PerspectiveCamera();
19
+ this.convolutionMaterial.uniforms['minDepthThreshold'].value = minDepthThreshold;
20
+ this.convolutionMaterial.uniforms['maxDepthThreshold'].value = maxDepthThreshold;
21
+ this.convolutionMaterial.uniforms['depthScale'].value = depthScale;
22
+ this.convolutionMaterial.uniforms['depthToBlurRatioBias'].value = depthToBlurRatioBias;
23
+ this.convolutionMaterial.defines['USE_DEPTH'] = depthScale > 0;
24
+ const vertices = new Float32Array([-1, -1, 0, 3, -1, 0, -1, 3, 0]);
25
+ const uvs = new Float32Array([0, 0, 2, 0, 0, 2]);
26
+ const geometry = new BufferGeometry();
27
+ geometry.setAttribute('position', new BufferAttribute(vertices, 3));
28
+ geometry.setAttribute('uv', new BufferAttribute(uvs, 2));
29
+ this.screen = new Mesh(geometry, this.convolutionMaterial);
30
+ this.screen.frustumCulled = false;
31
+ this.scene.add(this.screen);
32
+ }
33
+ render(renderer, inputBuffer, outputBuffer) {
34
+ const scene = this.scene;
35
+ const camera = this.camera;
36
+ const renderTargetA = this.renderTargetA;
37
+ const renderTargetB = this.renderTargetB;
38
+ const material = this.convolutionMaterial;
39
+ const uniforms = material.uniforms;
40
+ uniforms['depthBuffer'].value = inputBuffer.depthTexture;
41
+ const kernel = material.kernel;
42
+ let lastRT = inputBuffer;
43
+ let destRT;
44
+ let i, l;
45
+ // Apply the multi-pass blur.
46
+ for (i = 0, l = kernel.length - 1; i < l; ++i) {
47
+ // Alternate between targets.
48
+ destRT = (i & 1) === 0 ? renderTargetA : renderTargetB;
49
+ uniforms['kernel'].value = kernel[i];
50
+ uniforms['inputBuffer'].value = lastRT.texture;
51
+ renderer.setRenderTarget(destRT);
52
+ renderer.render(scene, camera);
53
+ lastRT = destRT;
54
+ }
55
+ uniforms['kernel'].value = kernel[i];
56
+ uniforms['inputBuffer'].value = lastRT.texture;
57
+ renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);
58
+ renderer.render(scene, camera);
59
+ }
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci1wYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycy9zcmMvbGliL2JsdXItcGFzcy9ibHVyLXBhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZixjQUFjLEVBRWQsWUFBWSxFQUNaLElBQUksRUFDSixpQkFBaUIsRUFDakIsS0FBSyxFQUNMLE9BQU8sRUFFUCxpQkFBaUIsR0FDcEIsTUFBTSxPQUFPLENBQUM7QUFFZixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQWFuRixNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFZLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixLQUFLLEdBQUcsR0FBRyxFQUNYLE1BQU0sR0FBRyxHQUFHLEVBQ1osaUJBQWlCLEdBQUcsQ0FBQyxFQUNyQixpQkFBaUIsR0FBRyxDQUFDLEVBQ3JCLFVBQVUsR0FBRyxDQUFDLEVBQ2Qsb0JBQW9CLEdBQUcsSUFBSSxHQUNmO1FBWGhCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBWW5CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFO1lBQy9ELFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxFQUFFLENBQUMsY0FBYztTQUM5QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxLQUFL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QUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzNDLDZCQUE2QjtZQUM3QixNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztZQUN2RCxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDL0MsUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQixNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ25CO1FBQ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQy9DLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEJ1ZmZlckF0dHJpYnV0ZSxcbiAgICBCdWZmZXJHZW9tZXRyeSxcbiAgICBDYW1lcmEsXG4gICAgTGluZWFyRmlsdGVyLFxuICAgIE1lc2gsXG4gICAgUGVyc3BlY3RpdmVDYW1lcmEsXG4gICAgU2NlbmUsXG4gICAgVmVjdG9yMixcbiAgICBXZWJHTFJlbmRlcmVyLFxuICAgIFdlYkdMUmVuZGVyVGFyZ2V0LFxufSBmcm9tICd0aHJlZSc7XG5cbmltcG9ydCB7IENvbnZvbHV0aW9uTWF0ZXJpYWwgfSBmcm9tICcuLi9jb252b2x1dGlvbi1tYXRlcmlhbC9jb252b2x1dGlvbi1tYXRlcmlhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmx1clBhc3NQcm9wcyB7XG4gICAgZ2w6IFdlYkdMUmVuZGVyZXI7XG4gICAgcmVzb2x1dGlvbjogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICBtaW5EZXB0aFRocmVzaG9sZD86IG51bWJlcjtcbiAgICBtYXhEZXB0aFRocmVzaG9sZD86IG51bWJlcjtcbiAgICBkZXB0aFNjYWxlPzogbnVtYmVyO1xuICAgIGRlcHRoVG9CbHVyUmF0aW9CaWFzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgQmx1clBhc3Mge1xuICAgIHJlYWRvbmx5IHJlbmRlclRhcmdldEE6IFdlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIHJlYWRvbmx5IHJlbmRlclRhcmdldEI6IFdlYkdMUmVuZGVyVGFyZ2V0O1xuICAgIHJlYWRvbmx5IGNvbnZvbHV0aW9uTWF0ZXJpYWw6IENvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgcmVhZG9ubHkgc2NlbmU6IFNjZW5lO1xuICAgIHJlYWRvbmx5IGNhbWVyYTogQ2FtZXJhO1xuICAgIHJlYWRvbmx5IHNjcmVlbjogTWVzaDtcbiAgICByZW5kZXJUb1NjcmVlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBnbCxcbiAgICAgICAgcmVzb2x1dGlvbixcbiAgICAgICAgd2lkdGggPSA1MDAsXG4gICAgICAgIGhlaWdodCA9IDUwMCxcbiAgICAgICAgbWluRGVwdGhUaHJlc2hvbGQgPSAwLFxuICAgICAgICBtYXhEZXB0aFRocmVzaG9sZCA9IDEsXG4gICAgICAgIGRlcHRoU2NhbGUgPSAwLFxuICAgICAgICBkZXB0aFRvQmx1clJhdGlvQmlhcyA9IDAuMjUsXG4gICAgfTogQmx1clBhc3NQcm9wcykge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldEEgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQocmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwge1xuICAgICAgICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgICAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IGdsLm91dHB1dEVuY29kaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRCID0gdGhpcy5yZW5kZXJUYXJnZXRBLmNsb25lKCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5zZXRSZXNvbHV0aW9uKG5ldyBWZWN0b3IyKHdpZHRoLCBoZWlnaHQpKTtcbiAgICAgICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgICAgICB0aGlzLmNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwudW5pZm9ybXNbJ21pbkRlcHRoVGhyZXNob2xkJ10udmFsdWUgPSBtaW5EZXB0aFRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnVuaWZvcm1zWydtYXhEZXB0aFRocmVzaG9sZCddLnZhbHVlID0gbWF4RGVwdGhUaHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC51bmlmb3Jtc1snZGVwdGhTY2FsZSddLnZhbHVlID0gZGVwdGhTY2FsZTtcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnVuaWZvcm1zWydkZXB0aFRvQmx1clJhdGlvQmlhcyddLnZhbHVlID0gZGVwdGhUb0JsdXJSYXRpb0JpYXM7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5kZWZpbmVzWydVU0VfREVQVEgnXSA9IGRlcHRoU2NhbGUgPiAwO1xuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoWy0xLCAtMSwgMCwgMywgLTEsIDAsIC0xLCAzLCAwXSk7XG4gICAgICAgIGNvbnN0IHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoWzAsIDAsIDIsIDAsIDAsIDJdKTtcbiAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcbiAgICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUodmVydGljZXMsIDMpKTtcbiAgICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUodXZzLCAyKSk7XG4gICAgICAgIHRoaXMuc2NyZWVuID0gbmV3IE1lc2goZ2VvbWV0cnksIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbCk7XG4gICAgICAgIHRoaXMuc2NyZWVuLmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQodGhpcy5zY3JlZW4pO1xuICAgIH1cblxuICAgIHJlbmRlcihyZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgaW5wdXRCdWZmZXI6IGFueSwgb3V0cHV0QnVmZmVyOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0QSA9IHRoaXMucmVuZGVyVGFyZ2V0QTtcbiAgICAgICAgY29uc3QgcmVuZGVyVGFyZ2V0QiA9IHRoaXMucmVuZGVyVGFyZ2V0QjtcbiAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgICAgIGNvbnN0IHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICAgIHVuaWZvcm1zWydkZXB0aEJ1ZmZlciddLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xuICAgICAgICBjb25zdCBrZXJuZWwgPSBtYXRlcmlhbC5rZXJuZWw7XG4gICAgICAgIGxldCBsYXN0UlQgPSBpbnB1dEJ1ZmZlcjtcbiAgICAgICAgbGV0IGRlc3RSVDtcbiAgICAgICAgbGV0IGksIGw7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBtdWx0aS1wYXNzIGJsdXIuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXJuZWwubGVuZ3RoIC0gMTsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gQWx0ZXJuYXRlIGJldHdlZW4gdGFyZ2V0cy5cbiAgICAgICAgICAgIGRlc3RSVCA9IChpICYgMSkgPT09IDAgPyByZW5kZXJUYXJnZXRBIDogcmVuZGVyVGFyZ2V0QjtcbiAgICAgICAgICAgIHVuaWZvcm1zWydrZXJuZWwnXS52YWx1ZSA9IGtlcm5lbFtpXTtcbiAgICAgICAgICAgIHVuaWZvcm1zWydpbnB1dEJ1ZmZlciddLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoZGVzdFJUKTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgICAgIGxhc3RSVCA9IGRlc3RSVDtcbiAgICAgICAgfVxuICAgICAgICB1bmlmb3Jtc1sna2VybmVsJ10udmFsdWUgPSBrZXJuZWxbaV07XG4gICAgICAgIHVuaWZvcm1zWydpbnB1dEJ1ZmZlciddLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,249 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, InjectionToken, Input } from '@angular/core';
2
+ import { extend, getLocalState, injectNgtRef, NgtRxStore, NgtStore } from 'angular-three';
3
+ import { SoftShadowMaterial } from 'angular-three-soba/shaders';
4
+ import { combineLatest, Subject } from 'rxjs';
5
+ import { Group, Mesh, PlaneGeometry } from 'three';
6
+ import { ProgressiveLightMap } from './progressive-light-map';
7
+ import * as i0 from "@angular/core";
8
+ extend({ SoftShadowMaterial, Group, Mesh, PlaneGeometry });
9
+ export const NGTS_ACCUMULATIVE_SHADOWS_API = new InjectionToken('NgtsAccumulativeShadows API');
10
+ function accumulativeShadowsApiFactory(accumulativeShadows) {
11
+ const store = inject(NgtStore);
12
+ const api = {
13
+ lights: new Map(),
14
+ count: 0,
15
+ getMesh: () => accumulativeShadows.meshRef.nativeElement,
16
+ reset: () => {
17
+ accumulativeShadows.pLM.clear();
18
+ const material = api.getMesh().material;
19
+ material.opacity = 0;
20
+ material.alphaTest = 0;
21
+ api.count = 0;
22
+ },
23
+ update: (frames = 1) => {
24
+ // adapt the opacity blend ratio to the number of frames
25
+ const material = api.getMesh().material;
26
+ if (!api.temporal) {
27
+ material.opacity = accumulativeShadows.get('opacity');
28
+ material.alphaTest = accumulativeShadows.get('alphaTest');
29
+ }
30
+ else {
31
+ material.opacity = Math.min(accumulativeShadows.get('opacity'), material.opacity + accumulativeShadows.get('opacity') / api.blend);
32
+ material.alphaTest = Math.min(accumulativeShadows.get('alphaTest'), material.alphaTest + accumulativeShadows.get('alphaTest') / api.blend);
33
+ }
34
+ // switch accumulative lights on
35
+ accumulativeShadows.accumulativeShadowsRef.nativeElement.visible = true;
36
+ // collect scene lights and meshes
37
+ accumulativeShadows.pLM.prepare();
38
+ // update the lightmap and the accumulative lights
39
+ for (let i = 0; i < frames; i++) {
40
+ api.lights.forEach((light) => light.update());
41
+ accumulativeShadows.pLM.update(store.get('camera'), api.blend);
42
+ }
43
+ // switch lights off
44
+ accumulativeShadows.accumulativeShadowsRef.nativeElement.visible = false;
45
+ // restore lights and meshes
46
+ accumulativeShadows.pLM.finish();
47
+ },
48
+ };
49
+ Object.defineProperties(api, {
50
+ temporal: {
51
+ get: () => !!accumulativeShadows.get('temporal'),
52
+ },
53
+ frames: {
54
+ get: () => Math.max(2, accumulativeShadows.get('frames')),
55
+ },
56
+ blend: {
57
+ get: () => Math.max(2, accumulativeShadows.get('frames') === Infinity
58
+ ? accumulativeShadows.get('blend')
59
+ : accumulativeShadows.get('frames')),
60
+ },
61
+ });
62
+ const subject = new Subject();
63
+ accumulativeShadows.hold(accumulativeShadows.meshRef.$, (mesh) => {
64
+ accumulativeShadows.pLM.configure(mesh);
65
+ accumulativeShadows.hold(combineLatest([accumulativeShadows.select(), getLocalState(store.get('scene')).objects]), () => {
66
+ // reset internals, buffers, ...
67
+ api.reset();
68
+ // update lightmap
69
+ if (!api.temporal && api.frames !== Infinity)
70
+ api.update(api.blend);
71
+ });
72
+ accumulativeShadows.effect(subject, () => store.get('internal').subscribe(() => {
73
+ const limit = accumulativeShadows.get('limit');
74
+ if ((api.temporal || api.frames === Infinity) && api.count < api.frames && api.count < limit) {
75
+ api.update();
76
+ api.count++;
77
+ }
78
+ }));
79
+ subject.next();
80
+ });
81
+ return api;
82
+ }
83
+ class AccumulativeShadowsConsumer {
84
+ constructor() {
85
+ inject(NGTS_ACCUMULATIVE_SHADOWS_API);
86
+ }
87
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AccumulativeShadowsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
88
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: AccumulativeShadowsConsumer, isStandalone: true, selector: "[ngtsAccumulativeShadowsConsumer]", ngImport: i0 }); }
89
+ }
90
+ export { AccumulativeShadowsConsumer };
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AccumulativeShadowsConsumer, decorators: [{
92
+ type: Directive,
93
+ args: [{ selector: '[ngtsAccumulativeShadowsConsumer]', standalone: true }]
94
+ }], ctorParameters: function () { return []; } });
95
+ class NgtsAccumulativeShadows extends NgtRxStore {
96
+ constructor() {
97
+ super(...arguments);
98
+ this.nullTraverse = () => null;
99
+ this.Math = Math;
100
+ this.store = inject(NgtStore);
101
+ this.pLM = new ProgressiveLightMap(this.store.get('gl'), this.store.get('scene'), this.get('resolution'));
102
+ this.accumulativeShadowsRef = injectNgtRef();
103
+ this.meshRef = injectNgtRef();
104
+ }
105
+ /** How many frames it can render, more yields cleaner results but takes more time, 40 */
106
+ set frames(frames) {
107
+ this.set({ frames });
108
+ }
109
+ /** If frames === Infinity blend controls the refresh ratio, 100 */
110
+ set blend(blend) {
111
+ this.set({ blend });
112
+ }
113
+ /** Can limit the amount of frames rendered if frames === Infinity, usually to get some performance back once a movable scene has settled, Infinity */
114
+ set limit(limit) {
115
+ this.set({ limit });
116
+ }
117
+ /** Scale of the plane, */
118
+ set scale(scale) {
119
+ this.set({ scale });
120
+ }
121
+ /** Temporal accumulates shadows over time which is more performant but has a visual regression over instant results, false */
122
+ set temporal(temporal) {
123
+ this.set({ temporal });
124
+ }
125
+ /** Opacity of the plane, 1 */
126
+ set opacity(opacity) {
127
+ this.set({ opacity });
128
+ }
129
+ /** Discards alpha pixels, 0.65 */
130
+ set alphaTest(alphaTest) {
131
+ this.set({ alphaTest });
132
+ }
133
+ /** Shadow color, black */
134
+ set color(color) {
135
+ this.set({ color });
136
+ }
137
+ /** Colorblend, how much colors turn to black, 0 is black, 2 */
138
+ set colorBlend(colorBlend) {
139
+ this.set({ colorBlend });
140
+ }
141
+ /** Buffer resolution, 1024 */
142
+ set resolution(resolution) {
143
+ this.set({ resolution });
144
+ }
145
+ /** Texture tonemapping */
146
+ set toneMapped(toneMapped) {
147
+ this.set({ toneMapped });
148
+ }
149
+ initialize() {
150
+ super.initialize();
151
+ this.set({
152
+ frames: 40,
153
+ limit: Infinity,
154
+ blend: 20,
155
+ scale: 10,
156
+ opacity: 1,
157
+ alphaTest: 0.75,
158
+ color: 'black',
159
+ colorBlend: 2,
160
+ resolution: 1024,
161
+ toneMapped: true,
162
+ });
163
+ }
164
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsAccumulativeShadows, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
165
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsAccumulativeShadows, isStandalone: true, selector: "ngts-accumulative-shadows", inputs: { frames: "frames", blend: "blend", limit: "limit", scale: "scale", temporal: "temporal", opacity: "opacity", alphaTest: "alphaTest", color: "color", colorBlend: "colorBlend", resolution: "resolution", toneMapped: "toneMapped" }, providers: [
166
+ {
167
+ provide: NGTS_ACCUMULATIVE_SHADOWS_API,
168
+ useFactory: accumulativeShadowsApiFactory,
169
+ deps: [NgtsAccumulativeShadows],
170
+ },
171
+ ], usesInheritance: true, ngImport: i0, template: `
172
+ <ngt-group ngtCompound>
173
+ <ngt-group [ref]="accumulativeShadowsRef" [traverse]="nullTraverse">
174
+ <ng-content />
175
+ <ng-container ngtsAccumulativeShadowsConsumer />
176
+ </ngt-group>
177
+ <ngt-mesh [ref]="meshRef" [receiveShadow]="true" [scale]="get('scale')" [rotation]="[-Math.PI / 2, 0, 0]">
178
+ <ngt-plane-geometry />
179
+ <ngt-soft-shadow-material
180
+ [transparent]="true"
181
+ [depthWrite]="false"
182
+ [color]="get('color')"
183
+ [toneMapped]="get('toneMapped')"
184
+ [blend]="get('colorBlend')"
185
+ [map]="pLM.progressiveLightMap2.texture"
186
+ />
187
+ </ngt-mesh>
188
+ </ngt-group>
189
+ `, isInline: true, dependencies: [{ kind: "directive", type: AccumulativeShadowsConsumer, selector: "[ngtsAccumulativeShadowsConsumer]" }] }); }
190
+ }
191
+ export { NgtsAccumulativeShadows };
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsAccumulativeShadows, decorators: [{
193
+ type: Component,
194
+ args: [{
195
+ selector: 'ngts-accumulative-shadows',
196
+ standalone: true,
197
+ template: `
198
+ <ngt-group ngtCompound>
199
+ <ngt-group [ref]="accumulativeShadowsRef" [traverse]="nullTraverse">
200
+ <ng-content />
201
+ <ng-container ngtsAccumulativeShadowsConsumer />
202
+ </ngt-group>
203
+ <ngt-mesh [ref]="meshRef" [receiveShadow]="true" [scale]="get('scale')" [rotation]="[-Math.PI / 2, 0, 0]">
204
+ <ngt-plane-geometry />
205
+ <ngt-soft-shadow-material
206
+ [transparent]="true"
207
+ [depthWrite]="false"
208
+ [color]="get('color')"
209
+ [toneMapped]="get('toneMapped')"
210
+ [blend]="get('colorBlend')"
211
+ [map]="pLM.progressiveLightMap2.texture"
212
+ />
213
+ </ngt-mesh>
214
+ </ngt-group>
215
+ `,
216
+ imports: [AccumulativeShadowsConsumer],
217
+ providers: [
218
+ {
219
+ provide: NGTS_ACCUMULATIVE_SHADOWS_API,
220
+ useFactory: accumulativeShadowsApiFactory,
221
+ deps: [NgtsAccumulativeShadows],
222
+ },
223
+ ],
224
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
225
+ }]
226
+ }], propDecorators: { frames: [{
227
+ type: Input
228
+ }], blend: [{
229
+ type: Input
230
+ }], limit: [{
231
+ type: Input
232
+ }], scale: [{
233
+ type: Input
234
+ }], temporal: [{
235
+ type: Input
236
+ }], opacity: [{
237
+ type: Input
238
+ }], alphaTest: [{
239
+ type: Input
240
+ }], color: [{
241
+ type: Input
242
+ }], colorBlend: [{
243
+ type: Input
244
+ }], resolution: [{
245
+ type: Input
246
+ }], toneMapped: [{
247
+ type: Input
248
+ }] } });
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjdW11bGF0aXZlLXNoYWRvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvYWNjdW11bGF0aXZlLXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUE0QixNQUFNLDRCQUE0QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFOUQsTUFBTSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBZTNELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLElBQUksY0FBYyxDQUMzRCw2QkFBNkIsQ0FDaEMsQ0FBQztBQUVGLFNBQVMsNkJBQTZCLENBQUMsbUJBQTRDO0lBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvQixNQUFNLEdBQUcsR0FBRztRQUNSLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixt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YWdCLE1BQU07c0JBQWxCLEtBQUs7Z0JBS08sS0FBSztzQkFBakIsS0FBSztnQkFLTyxLQUFLO3NCQUFqQixLQUFLO2dCQUtPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBS08sUUFBUTtzQkFBcEIsS0FBSztnQkFLTyxPQUFPO3NCQUFuQixLQUFLO2dCQUtPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sS0FBSztzQkFBakIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgRGlyZWN0aXZlLCBpbmplY3QsIEluamVjdGlvblRva2VuLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRMb2NhbFN0YXRlLCBpbmplY3ROZ3RSZWYsIE5ndFJ4U3RvcmUsIE5ndFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBTb2Z0U2hhZG93TWF0ZXJpYWwsIFNvZnRTaGFkb3dNYXRlcmlhbElucHV0cyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9zaGFkZXJzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEdyb3VwLCBNZXNoLCBQbGFuZUdlb21ldHJ5IH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NpdmVMaWdodE1hcCB9IGZyb20gJy4vcHJvZ3Jlc3NpdmUtbGlnaHQtbWFwJztcblxuZXh0ZW5kKHsgU29mdFNoYWRvd01hdGVyaWFsLCBHcm91cCwgTWVzaCwgUGxhbmVHZW9tZXRyeSB9KTtcblxuZXhwb3J0IHR5cGUgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSA9IHsgdXBkYXRlOiAoKSA9PiB2b2lkIH07XG5cbmV4cG9ydCB0eXBlIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQXBpID0ge1xuICAgIGxpZ2h0czogTWFwPHN0cmluZywgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaT47XG4gICAgdGVtcG9yYWw6IGJvb2xlYW47XG4gICAgZnJhbWVzOiBudW1iZXI7XG4gICAgYmxlbmQ6IG51bWJlcjtcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIGdldE1lc2g6ICgpID0+IFRIUkVFLk1lc2g8VEhSRUUuUGxhbmVHZW9tZXRyeSwgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzICYgVEhSRUUuU2hhZGVyTWF0ZXJpYWw+O1xuICAgIHJlc2V0OiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZTogKGZyYW1lcz86IG51bWJlcikgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaT4oXG4gICAgJ05ndHNBY2N1bXVsYXRpdmVTaGFkb3dzIEFQSSdcbik7XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGl2ZVNoYWRvd3NBcGlGYWN0b3J5KGFjY3VtdWxhdGl2ZVNoYWRvd3M6IE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgICBsaWdodHM6IG5ldyBNYXAoKSxcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIGdldE1lc2g6ICgpID0+XG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLm1lc2hSZWYubmF0aXZlRWxlbWVudCBhcyBUSFJFRS5NZXNoPFxuICAgICAgICAgICAgICAgIFRIUkVFLlBsYW5lR2VvbWV0cnksXG4gICAgICAgICAgICAgICAgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzICYgVEhSRUUuU2hhZGVyTWF0ZXJpYWxcbiAgICAgICAgICAgID4sXG4gICAgICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLnBMTS5jbGVhcigpO1xuICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBhcGkuZ2V0TWVzaCgpLm1hdGVyaWFsO1xuICAgICAgICAgICAgbWF0ZXJpYWwub3BhY2l0eSA9IDA7XG4gICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgPSAwO1xuICAgICAgICAgICAgYXBpLmNvdW50ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlOiAoZnJhbWVzID0gMSkgPT4ge1xuICAgICAgICAgICAgLy8gYWRhcHQgdGhlIG9wYWNpdHkgYmxlbmQgcmF0aW8gdG8gdGhlIG51bWJlciBvZiBmcmFtZXNcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsID0gYXBpLmdldE1lc2goKS5tYXRlcmlhbDtcbiAgICAgICAgICAgIGlmICghYXBpLnRlbXBvcmFsKSB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwub3BhY2l0eSA9IGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdvcGFjaXR5Jyk7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWwuYWxwaGFUZXN0ID0gYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2FscGhhVGVzdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5vcGFjaXR5ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdvcGFjaXR5JyksXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLm9wYWNpdHkgKyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnb3BhY2l0eScpIC8gYXBpLmJsZW5kXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2FscGhhVGVzdCcpLFxuICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgKyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYWxwaGFUZXN0JykgLyBhcGkuYmxlbmRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzd2l0Y2ggYWNjdW11bGF0aXZlIGxpZ2h0cyBvblxuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5hY2N1bXVsYXRpdmVTaGFkb3dzUmVmLm5hdGl2ZUVsZW1lbnQudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb2xsZWN0IHNjZW5lIGxpZ2h0cyBhbmQgbWVzaGVzXG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLnBMTS5wcmVwYXJlKCk7XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGlnaHRtYXAgYW5kIHRoZSBhY2N1bXVsYXRpdmUgbGlnaHRzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyYW1lczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYXBpLmxpZ2h0cy5mb3JFYWNoKChsaWdodCkgPT4gbGlnaHQudXBkYXRlKCkpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLnVwZGF0ZShzdG9yZS5nZXQoJ2NhbWVyYScpLCBhcGkuYmxlbmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzd2l0Y2ggbGlnaHRzIG9mZlxuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5hY2N1bXVsYXRpdmVTaGFkb3dzUmVmLm5hdGl2ZUVsZW1lbnQudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gcmVzdG9yZSBsaWdodHMgYW5kIG1lc2hlc1xuICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5wTE0uZmluaXNoKCk7XG4gICAgICAgIH0sXG4gICAgfSBhcyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0FwaTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGFwaSwge1xuICAgICAgICB0ZW1wb3JhbDoge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCd0ZW1wb3JhbCcpLFxuICAgICAgICB9LFxuICAgICAgICBmcmFtZXM6IHtcbiAgICAgICAgICAgIGdldDogKCkgPT4gTWF0aC5tYXgoMiwgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2ZyYW1lcycpKSxcbiAgICAgICAgfSxcbiAgICAgICAgYmxlbmQ6IHtcbiAgICAgICAgICAgIGdldDogKCkgPT5cbiAgICAgICAgICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ2ZyYW1lcycpID09PSBJbmZpbml0eVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYmxlbmQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnZnJhbWVzJylcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmhvbGQoYWNjdW11bGF0aXZlU2hhZG93cy5tZXNoUmVmLiQsIChtZXNoKSA9PiB7XG4gICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLmNvbmZpZ3VyZShtZXNoKTtcblxuICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmhvbGQoXG4gICAgICAgICAgICBjb21iaW5lTGF0ZXN0KFthY2N1bXVsYXRpdmVTaGFkb3dzLnNlbGVjdCgpLCBnZXRMb2NhbFN0YXRlKHN0b3JlLmdldCgnc2NlbmUnKSkub2JqZWN0c10pLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHJlc2V0IGludGVybmFscywgYnVmZmVycywgLi4uXG4gICAgICAgICAgICAgICAgYXBpLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxpZ2h0bWFwXG4gICAgICAgICAgICAgICAgaWYgKCFhcGkudGVtcG9yYWwgJiYgYXBpLmZyYW1lcyAhPT0gSW5maW5pdHkpIGFwaS51cGRhdGUoYXBpLmJsZW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmVmZmVjdChzdWJqZWN0LCAoKSA9PlxuICAgICAgICAgICAgc3RvcmUuZ2V0KCdpbnRlcm5hbCcpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnbGltaXQnKTtcbiAgICAgICAgICAgICAgICBpZiAoKGFwaS50ZW1wb3JhbCB8fCBhcGkuZnJhbWVzID09PSBJbmZpbml0eSkgJiYgYXBpLmNvdW50IDwgYXBpLmZyYW1lcyAmJiBhcGkuY291bnQgPCBsaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBhcGkudXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGFwaS5jb3VudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHN1YmplY3QubmV4dCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFwaTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQ29uc3VtZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIEFjY3VtdWxhdGl2ZVNoYWRvd3NDb25zdW1lciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtYWNjdW11bGF0aXZlLXNoYWRvd3MnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZD5cbiAgICAgICAgICAgIDxuZ3QtZ3JvdXAgW3JlZl09XCJhY2N1bXVsYXRpdmVTaGFkb3dzUmVmXCIgW3RyYXZlcnNlXT1cIm51bGxUcmF2ZXJzZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBuZ3RzQWNjdW11bGF0aXZlU2hhZG93c0NvbnN1bWVyIC8+XG4gICAgICAgICAgICA8L25ndC1ncm91cD5cbiAgICAgICAgICAgIDxuZ3QtbWVzaCBbcmVmXT1cIm1lc2hSZWZcIiBbcmVjZWl2ZVNoYWRvd109XCJ0cnVlXCIgW3NjYWxlXT1cImdldCgnc2NhbGUnKVwiIFtyb3RhdGlvbl09XCJbLU1hdGguUEkgLyAyLCAwLCAwXVwiPlxuICAgICAgICAgICAgICAgIDxuZ3QtcGxhbmUtZ2VvbWV0cnkgLz5cbiAgICAgICAgICAgICAgICA8bmd0LXNvZnQtc2hhZG93LW1hdGVyaWFsXG4gICAgICAgICAgICAgICAgICAgIFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlcHRoV3JpdGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiZ2V0KCdjb2xvcicpXCJcbiAgICAgICAgICAgICAgICAgICAgW3RvbmVNYXBwZWRdPVwiZ2V0KCd0b25lTWFwcGVkJylcIlxuICAgICAgICAgICAgICAgICAgICBbYmxlbmRdPVwiZ2V0KCdjb2xvckJsZW5kJylcIlxuICAgICAgICAgICAgICAgICAgICBbbWFwXT1cInBMTS5wcm9ncmVzc2l2ZUxpZ2h0TWFwMi50ZXh0dXJlXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9uZ3QtbWVzaD5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbQWNjdW11bGF0aXZlU2hhZG93c0NvbnN1bWVyXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdUU19BQ0NVTVVMQVRJVkVfU0hBRE9XU19BUEksXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiBhY2N1bXVsYXRpdmVTaGFkb3dzQXBpRmFjdG9yeSxcbiAgICAgICAgICAgIGRlcHM6IFtOZ3RzQWNjdW11bGF0aXZlU2hhZG93c10sXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzIGV4dGVuZHMgTmd0UnhTdG9yZSB7XG4gICAgcmVhZG9ubHkgbnVsbFRyYXZlcnNlID0gKCkgPT4gbnVsbDtcbiAgICByZWFkb25seSBNYXRoID0gTWF0aDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgcmVhZG9ubHkgcExNID0gbmV3IFByb2dyZXNzaXZlTGlnaHRNYXAodGhpcy5zdG9yZS5nZXQoJ2dsJyksIHRoaXMuc3RvcmUuZ2V0KCdzY2VuZScpLCB0aGlzLmdldCgncmVzb2x1dGlvbicpKTtcblxuICAgIHJlYWRvbmx5IGFjY3VtdWxhdGl2ZVNoYWRvd3NSZWYgPSBpbmplY3ROZ3RSZWY8VEhSRUUuR3JvdXA+KCk7XG4gICAgcmVhZG9ubHkgbWVzaFJlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5NZXNoPigpO1xuXG4gICAgLyoqIEhvdyBtYW55IGZyYW1lcyBpdCBjYW4gcmVuZGVyLCBtb3JlIHlpZWxkcyBjbGVhbmVyIHJlc3VsdHMgYnV0IHRha2VzIG1vcmUgdGltZSwgNDAgKi9cbiAgICBASW5wdXQoKSBzZXQgZnJhbWVzKGZyYW1lczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZnJhbWVzIH0pO1xuICAgIH1cblxuICAgIC8qKiBJZiBmcmFtZXMgPT09IEluZmluaXR5IGJsZW5kIGNvbnRyb2xzIHRoZSByZWZyZXNoIHJhdGlvLCAxMDAgKi9cbiAgICBASW5wdXQoKSBzZXQgYmxlbmQoYmxlbmQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJsZW5kIH0pO1xuICAgIH1cblxuICAgIC8qKiBDYW4gbGltaXQgdGhlIGFtb3VudCBvZiBmcmFtZXMgcmVuZGVyZWQgaWYgZnJhbWVzID09PSBJbmZpbml0eSwgdXN1YWxseSB0byBnZXQgc29tZSBwZXJmb3JtYW5jZSBiYWNrIG9uY2UgYSBtb3ZhYmxlIHNjZW5lIGhhcyBzZXR0bGVkLCBJbmZpbml0eSAqL1xuICAgIEBJbnB1dCgpIHNldCBsaW1pdChsaW1pdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbGltaXQgfSk7XG4gICAgfVxuXG4gICAgLyoqIFNjYWxlIG9mIHRoZSBwbGFuZSwgICovXG4gICAgQElucHV0KCkgc2V0IHNjYWxlKHNjYWxlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzY2FsZSB9KTtcbiAgICB9XG5cbiAgICAvKiogVGVtcG9yYWwgYWNjdW11bGF0ZXMgc2hhZG93cyBvdmVyIHRpbWUgd2hpY2ggaXMgbW9yZSBwZXJmb3JtYW50IGJ1dCBoYXMgYSB2aXN1YWwgcmVncmVzc2lvbiBvdmVyIGluc3RhbnQgcmVzdWx0cywgZmFsc2UgICovXG4gICAgQElucHV0KCkgc2V0IHRlbXBvcmFsKHRlbXBvcmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgdGVtcG9yYWwgfSk7XG4gICAgfVxuXG4gICAgLyoqIE9wYWNpdHkgb2YgdGhlIHBsYW5lLCAxICovXG4gICAgQElucHV0KCkgc2V0IG9wYWNpdHkob3BhY2l0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgb3BhY2l0eSB9KTtcbiAgICB9XG5cbiAgICAvKiogRGlzY2FyZHMgYWxwaGEgcGl4ZWxzLCAwLjY1ICovXG4gICAgQElucHV0KCkgc2V0IGFscGhhVGVzdChhbHBoYVRlc3Q6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGFscGhhVGVzdCB9KTtcbiAgICB9XG5cbiAgICAvKiogU2hhZG93IGNvbG9yLCBibGFjayAqL1xuICAgIEBJbnB1dCgpIHNldCBjb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29sb3IgfSk7XG4gICAgfVxuXG4gICAgLyoqIENvbG9yYmxlbmQsIGhvdyBtdWNoIGNvbG9ycyB0dXJuIHRvIGJsYWNrLCAwIGlzIGJsYWNrLCAyICovXG4gICAgQElucHV0KCkgc2V0IGNvbG9yQmxlbmQoY29sb3JCbGVuZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY29sb3JCbGVuZCB9KTtcbiAgICB9XG5cbiAgICAvKiogQnVmZmVyIHJlc29sdXRpb24sIDEwMjQgKi9cbiAgICBASW5wdXQoKSBzZXQgcmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByZXNvbHV0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKiBUZXh0dXJlIHRvbmVtYXBwaW5nICovXG4gICAgQElucHV0KCkgc2V0IHRvbmVNYXBwZWQodG9uZU1hcHBlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IHRvbmVNYXBwZWQgfSk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgICB0aGlzLnNldCh7XG4gICAgICAgICAgICBmcmFtZXM6IDQwLFxuICAgICAgICAgICAgbGltaXQ6IEluZmluaXR5LFxuICAgICAgICAgICAgYmxlbmQ6IDIwLFxuICAgICAgICAgICAgc2NhbGU6IDEwLFxuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIGFscGhhVGVzdDogMC43NSxcbiAgICAgICAgICAgIGNvbG9yOiAnYmxhY2snLFxuICAgICAgICAgICAgY29sb3JCbGVuZDogMixcbiAgICAgICAgICAgIHJlc29sdXRpb246IDEwMjQsXG4gICAgICAgICAgICB0b25lTWFwcGVkOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,201 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, InjectionToken, Input } from '@angular/core';
2
+ import { extend, injectNgtRef, NgtArgs, NgtRepeat, NgtRxStore } from 'angular-three';
3
+ import { combineLatest } from 'rxjs';
4
+ import * as THREE from 'three';
5
+ import { DirectionalLight, Group, OrthographicCamera, Vector2 } from 'three';
6
+ import { NGTS_ACCUMULATIVE_SHADOWS_API } from './accumulative-shadows';
7
+ import * as i0 from "@angular/core";
8
+ extend({ Group, DirectionalLight, OrthographicCamera, Vector2 });
9
+ export const NGTS_RANDOMIZED_LIGHTS_API = new InjectionToken('NgtsRandomizedLights API');
10
+ function randomizedLightsApiFactory(randomizedLights) {
11
+ const accumulativeApi = inject(NGTS_ACCUMULATIVE_SHADOWS_API);
12
+ const update = () => {
13
+ let light;
14
+ if (randomizedLights.lightsRef.nativeElement) {
15
+ for (let l = 0; l < randomizedLights.lightsRef.nativeElement.children.length; l++) {
16
+ light = randomizedLights.lightsRef.nativeElement.children[l];
17
+ if (Math.random() > randomizedLights.get('ambient')) {
18
+ const position = randomizedLights.get('position');
19
+ const radius = randomizedLights.get('radius');
20
+ light.position.set(position[0] + THREE.MathUtils.randFloatSpread(radius), position[1] + THREE.MathUtils.randFloatSpread(radius), position[2] + THREE.MathUtils.randFloatSpread(radius));
21
+ }
22
+ else {
23
+ const lambda = Math.acos(2 * Math.random() - 1) - Math.PI / 2.0;
24
+ const phi = 2 * Math.PI * Math.random();
25
+ const length = randomizedLights.get('length');
26
+ light.position.set(Math.cos(lambda) * Math.cos(phi) * length, Math.abs(Math.cos(lambda) * Math.sin(phi) * length), Math.sin(lambda) * length);
27
+ }
28
+ }
29
+ }
30
+ };
31
+ const api = { update };
32
+ randomizedLights.effect(combineLatest([
33
+ randomizedLights.lightsRef.$,
34
+ randomizedLights.select('position'),
35
+ randomizedLights.select('radius'),
36
+ randomizedLights.select('length'),
37
+ randomizedLights.select('ambient'),
38
+ ]), ([group]) => {
39
+ if (accumulativeApi)
40
+ accumulativeApi.lights.set(group.uuid, api);
41
+ return () => accumulativeApi.lights.delete(group.uuid);
42
+ });
43
+ return api;
44
+ }
45
+ class RandomizedLightsConsumer {
46
+ constructor() {
47
+ inject(NGTS_RANDOMIZED_LIGHTS_API);
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
50
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: RandomizedLightsConsumer, isStandalone: true, selector: "[ngtsRandomizedLightsConsumer]", ngImport: i0 }); }
51
+ }
52
+ export { RandomizedLightsConsumer };
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, decorators: [{
54
+ type: Directive,
55
+ args: [{ selector: '[ngtsRandomizedLightsConsumer]', standalone: true }]
56
+ }], ctorParameters: function () { return []; } });
57
+ class NgtsRandomizedLights extends NgtRxStore {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.lightsRef = injectNgtRef();
61
+ }
62
+ /** How many frames it will jiggle the lights, 1.
63
+ * Frames is context aware, if a provider like AccumulativeShadows exists, frames will be taken from there! */
64
+ set frames(frames) {
65
+ this.set({ frames });
66
+ }
67
+ /** Light position, [0, 0, 0] */
68
+ set position(position) {
69
+ this.set({ position });
70
+ }
71
+ /** Radius of the jiggle, higher values make softer light, 5 */
72
+ set radius(radius) {
73
+ this.set({ radius });
74
+ }
75
+ /** Amount of lights, 8 */
76
+ set amount(amount) {
77
+ this.set({ amount });
78
+ }
79
+ /** Light intensity, 1 */
80
+ set intensity(intensity) {
81
+ this.set({ intensity });
82
+ }
83
+ /** Ambient occlusion, lower values mean less AO, hight more, you can mix AO and directional light, 0.5 */
84
+ set ambient(ambient) {
85
+ this.set({ ambient });
86
+ }
87
+ /** If the lights cast shadows, this is true by default */
88
+ set castShadow(castShadow) {
89
+ this.set({ castShadow });
90
+ }
91
+ /** Default shadow bias, 0 */
92
+ set bias(bias) {
93
+ this.set({ bias });
94
+ }
95
+ /** Default map size, 512 */
96
+ set mapSize(mapSize) {
97
+ this.set({ mapSize });
98
+ }
99
+ /** Default size of the shadow camera, 10 */
100
+ set size(size) {
101
+ this.set({ size });
102
+ }
103
+ /** Default shadow camera near, 0.5 */
104
+ set near(near) {
105
+ this.set({ near });
106
+ }
107
+ /** Default shadow camera far, 500 */
108
+ set far(far) {
109
+ this.set({ far });
110
+ }
111
+ initialize() {
112
+ super.initialize();
113
+ this.set({
114
+ castShadow: true,
115
+ bias: 0.001,
116
+ mapSize: 512,
117
+ size: 5,
118
+ near: 0.5,
119
+ far: 500,
120
+ frames: 1,
121
+ position: [0, 0, 0],
122
+ radius: 1,
123
+ amount: 8,
124
+ intensity: 1,
125
+ ambient: 0.5,
126
+ });
127
+ this.connect('cameraArgs', this.select(['size', 'near', 'far'], ({ size, near, far }) => [-size, size, size, -size, near, far]));
128
+ this.connect('length', this.select(['position'], ({ position }) => new THREE.Vector3(...position).length()));
129
+ }
130
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
131
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsRandomizedLights, isStandalone: true, selector: "ngts-randomized-lights", inputs: { lightsRef: "lightsRef", frames: "frames", position: "position", radius: "radius", amount: "amount", intensity: "intensity", ambient: "ambient", castShadow: "castShadow", bias: "bias", mapSize: "mapSize", size: "size", near: "near", far: "far" }, providers: [
132
+ { provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
133
+ ], usesInheritance: true, ngImport: i0, template: `
134
+ <ngt-group ngtCompound [ref]="lightsRef">
135
+ <ngt-directional-light
136
+ *ngFor="let i; repeat: get('amount')"
137
+ [castShadow]="get('castShadow')"
138
+ [intensity]="get('intensity') / get('amount')"
139
+ >
140
+ <ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
141
+ <ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
142
+ <ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
143
+ </ngt-directional-light>
144
+ <ng-container ngtsRandomizedLightsConsumer />
145
+ </ngt-group>
146
+ `, isInline: true, dependencies: [{ kind: "directive", type: RandomizedLightsConsumer, selector: "[ngtsRandomizedLightsConsumer]" }, { kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }, { kind: "directive", type: NgtRepeat, selector: "[ngFor][ngForRepeat]", inputs: ["ngForRepeat"] }] }); }
147
+ }
148
+ export { NgtsRandomizedLights };
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, decorators: [{
150
+ type: Component,
151
+ args: [{
152
+ selector: 'ngts-randomized-lights',
153
+ standalone: true,
154
+ template: `
155
+ <ngt-group ngtCompound [ref]="lightsRef">
156
+ <ngt-directional-light
157
+ *ngFor="let i; repeat: get('amount')"
158
+ [castShadow]="get('castShadow')"
159
+ [intensity]="get('intensity') / get('amount')"
160
+ >
161
+ <ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
162
+ <ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
163
+ <ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
164
+ </ngt-directional-light>
165
+ <ng-container ngtsRandomizedLightsConsumer />
166
+ </ngt-group>
167
+ `,
168
+ imports: [RandomizedLightsConsumer, NgtArgs, NgtRepeat],
169
+ providers: [
170
+ { provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
171
+ ],
172
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
173
+ }]
174
+ }], propDecorators: { lightsRef: [{
175
+ type: Input
176
+ }], frames: [{
177
+ type: Input
178
+ }], position: [{
179
+ type: Input
180
+ }], radius: [{
181
+ type: Input
182
+ }], amount: [{
183
+ type: Input
184
+ }], intensity: [{
185
+ type: Input
186
+ }], ambient: [{
187
+ type: Input
188
+ }], castShadow: [{
189
+ type: Input
190
+ }], bias: [{
191
+ type: Input
192
+ }], mapSize: [{
193
+ type: Input
194
+ }], size: [{
195
+ type: Input
196
+ }], near: [{
197
+ type: Input
198
+ }], far: [{
199
+ type: Input
200
+ }] } });
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9taXplZC1saWdodHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RSxPQUFPLEVBQW1DLDZCQUE2QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRXhHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDN0IsQ0FBQztBQUVGLFNBQVMsMEJBQTBCLENBQUMsZ0JBQXNDO0lBQ3RFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLEtBQXlDLENBQUM7UUFDOUMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzFDLEtBQUssSUFB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S0FBSztnQkFHTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBS08sTUFBTTtzQkFBbEIsS0FBSztnQkFLTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxJQUFJO3NCQUFoQixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sR0FBRztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEaXJlY3RpdmUsIGluamVjdCwgSW5qZWN0aW9uVG9rZW4sIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGluamVjdE5ndFJlZiwgTmd0QXJncywgTmd0UmVwZWF0LCBOZ3RSeFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0LCBHcm91cCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBWZWN0b3IyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSwgTkdUU19BQ0NVTVVMQVRJVkVfU0hBRE9XU19BUEkgfSBmcm9tICcuL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcblxuZXh0ZW5kKHsgR3JvdXAsIERpcmVjdGlvbmFsTGlnaHQsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgVmVjdG9yMiB9KTtcblxuZXhwb3J0IGNvbnN0IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJID0gbmV3IEluamVjdGlvblRva2VuPE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk+KFxuICAgICdOZ3RzUmFuZG9taXplZExpZ2h0cyBBUEknXG4pO1xuXG5mdW5jdGlvbiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeShyYW5kb21pemVkTGlnaHRzOiBOZ3RzUmFuZG9taXplZExpZ2h0cykge1xuICAgIGNvbnN0IGFjY3VtdWxhdGl2ZUFwaSA9IGluamVjdChOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIGxldCBsaWdodDogVEhSRUUuRGlyZWN0aW9uYWxMaWdodCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJhbmRvbWl6ZWRMaWdodHMubGlnaHRzUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgICAgIGxpZ2h0ID0gcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbltsXSBhcyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gcmFuZG9taXplZExpZ2h0cy5nZXQoJ2FtYmllbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJhbmRvbWl6ZWRMaWdodHMuZ2V0KCdwb3NpdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSByYW5kb21pemVkTGlnaHRzLmdldCgncmFkaXVzJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWzBdICsgVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZChyYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25bMV0gKyBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKHJhZGl1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblsyXSArIFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQocmFkaXVzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhbWJkYSA9IE1hdGguYWNvcygyICogTWF0aC5yYW5kb20oKSAtIDEpIC0gTWF0aC5QSSAvIDIuMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGhpID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSByYW5kb21pemVkTGlnaHRzLmdldCgnbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKGxhbWJkYSkgKiBNYXRoLmNvcyhwaGkpICogbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MobGFtYmRhKSAqIE1hdGguc2luKHBoaSkgKiBsZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4obGFtYmRhKSAqIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhcGkgPSB7IHVwZGF0ZSB9IGFzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk7XG5cbiAgICByYW5kb21pemVkTGlnaHRzLmVmZmVjdChcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLmxpZ2h0c1JlZi4kLFxuICAgICAgICAgICAgcmFuZG9taXplZExpZ2h0cy5zZWxlY3QoJ3Bvc2l0aW9uJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgncmFkaXVzJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnbGVuZ3RoJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnYW1iaWVudCcpLFxuICAgICAgICBdKSxcbiAgICAgICAgKFtncm91cF0pID0+IHtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRpdmVBcGkpIGFjY3VtdWxhdGl2ZUFwaS5saWdodHMuc2V0KGdyb3VwLnV1aWQsIGFwaSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gYWNjdW11bGF0aXZlQXBpLmxpZ2h0cy5kZWxldGUoZ3JvdXAudXVpZCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIGFwaTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIFJhbmRvbWl6ZWRMaWdodHNDb25zdW1lciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChOR1RTX1JBTkRPTUlaRURfTElHSFRTX0FQSSk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtcmFuZG9taXplZC1saWdodHMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZCBbcmVmXT1cImxpZ2h0c1JlZlwiPlxuICAgICAgICAgICAgPG5ndC1kaXJlY3Rpb25hbC1saWdodFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpOyByZXBlYXQ6IGdldCgnYW1vdW50JylcIlxuICAgICAgICAgICAgICAgIFtjYXN0U2hhZG93XT1cImdldCgnY2FzdFNoYWRvdycpXCJcbiAgICAgICAgICAgICAgICBbaW50ZW5zaXR5XT1cImdldCgnaW50ZW5zaXR5JykgLyBnZXQoJ2Ftb3VudCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmd0LXZhbHVlIFtyYXdWYWx1ZV09XCJnZXQoJ2JpYXMnKVwiIGF0dGFjaD1cInNoYWRvdy5iaWFzXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LXZlY3RvcjIgKmFyZ3M9XCJbZ2V0KCdtYXBTaXplJyksIGdldCgnbWFwU2l6ZScpXVwiIGF0dGFjaD1cInNoYWRvdy5tYXBTaXplXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LW9ydGhvZ3JhcGhpYy1jYW1lcmEgKmFyZ3M9XCJnZXQoJ2NhbWVyYUFyZ3MnKVwiIGF0dGFjaD1cInNoYWRvdy5jYW1lcmFcIiAvPlxuICAgICAgICAgICAgPC9uZ3QtZGlyZWN0aW9uYWwtbGlnaHQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG5ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXIgLz5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbUmFuZG9taXplZExpZ2h0c0NvbnN1bWVyLCBOZ3RBcmdzLCBOZ3RSZXBlYXRdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJLCB1c2VGYWN0b3J5OiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeSwgZGVwczogW05ndHNSYW5kb21pemVkTGlnaHRzXSB9LFxuICAgIF0sXG4gICAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzUmFuZG9taXplZExpZ2h0cyBleHRlbmRzIE5ndFJ4U3RvcmUge1xuICAgIEBJbnB1dCgpIGxpZ2h0c1JlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcbiAgICAvKiogSG93IG1hbnkgZnJhbWVzIGl0IHdpbGwgamlnZ2xlIHRoZSBsaWdodHMsIDEuXG4gICAgICogIEZyYW1lcyBpcyBjb250ZXh0IGF3YXJlLCBpZiBhIHByb3ZpZGVyIGxpa2UgQWNjdW11bGF0aXZlU2hhZG93cyBleGlzdHMsIGZyYW1lcyB3aWxsIGJlIHRha2VuIGZyb20gdGhlcmUhICAqL1xuICAgIEBJbnB1dCgpIHNldCBmcmFtZXMoZnJhbWVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmcmFtZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIExpZ2h0IHBvc2l0aW9uLCBbMCwgMCwgMF0gKi9cbiAgICBASW5wdXQoKSBzZXQgcG9zaXRpb24ocG9zaXRpb246IFt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyXSkge1xuICAgICAgICB0aGlzLnNldCh7IHBvc2l0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKiBSYWRpdXMgb2YgdGhlIGppZ2dsZSwgaGlnaGVyIHZhbHVlcyBtYWtlIHNvZnRlciBsaWdodCwgNSAqL1xuICAgIEBJbnB1dCgpIHNldCByYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByYWRpdXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEFtb3VudCBvZiBsaWdodHMsIDggKi9cbiAgICBASW5wdXQoKSBzZXQgYW1vdW50KGFtb3VudDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYW1vdW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBMaWdodCBpbnRlbnNpdHksIDEgKi9cbiAgICBASW5wdXQoKSBzZXQgaW50ZW5zaXR5KGludGVuc2l0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgaW50ZW5zaXR5IH0pO1xuICAgIH1cblxuICAgIC8qKiBBbWJpZW50IG9jY2x1c2lvbiwgbG93ZXIgdmFsdWVzIG1lYW4gbGVzcyBBTywgaGlnaHQgbW9yZSwgeW91IGNhbiBtaXggQU8gYW5kIGRpcmVjdGlvbmFsIGxpZ2h0LCAwLjUgKi9cbiAgICBASW5wdXQoKSBzZXQgYW1iaWVudChhbWJpZW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBhbWJpZW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBJZiB0aGUgbGlnaHRzIGNhc3Qgc2hhZG93cywgdGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKSBzZXQgY2FzdFNoYWRvdyhjYXN0U2hhZG93OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY2FzdFNoYWRvdyB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgYmlhcywgMCAqL1xuICAgIEBJbnB1dCgpIHNldCBiaWFzKGJpYXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJpYXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgbWFwIHNpemUsIDUxMiAqL1xuICAgIEBJbnB1dCgpIHNldCBtYXBTaXplKG1hcFNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1hcFNpemUgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgc2l6ZSBvZiB0aGUgc2hhZG93IGNhbWVyYSwgMTAgKi9cbiAgICBASW5wdXQoKSBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzaXplIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IHNoYWRvdyBjYW1lcmEgbmVhciwgMC41ICovXG4gICAgQElucHV0KCkgc2V0IG5lYXIobmVhcjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbmVhciB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgY2FtZXJhIGZhciwgNTAwICovXG4gICAgQElucHV0KCkgc2V0IGZhcihmYXI6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGZhciB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGNhc3RTaGFkb3c6IHRydWUsXG4gICAgICAgICAgICBiaWFzOiAwLjAwMSxcbiAgICAgICAgICAgIG1hcFNpemU6IDUxMixcbiAgICAgICAgICAgIHNpemU6IDUsXG4gICAgICAgICAgICBuZWFyOiAwLjUsXG4gICAgICAgICAgICBmYXI6IDUwMCxcbiAgICAgICAgICAgIGZyYW1lczogMSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICByYWRpdXM6IDEsXG4gICAgICAgICAgICBhbW91bnQ6IDgsXG4gICAgICAgICAgICBpbnRlbnNpdHk6IDEsXG4gICAgICAgICAgICBhbWJpZW50OiAwLjUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3QoXG4gICAgICAgICAgICAnY2FtZXJhQXJncycsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChbJ3NpemUnLCAnbmVhcicsICdmYXInXSwgKHsgc2l6ZSwgbmVhciwgZmFyIH0pID0+IFstc2l6ZSwgc2l6ZSwgc2l6ZSwgLXNpemUsIG5lYXIsIGZhcl0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdsZW5ndGgnLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoWydwb3NpdGlvbiddLCAoeyBwb3NpdGlvbiB9KSA9PiBuZXcgVEhSRUUuVmVjdG9yMyguLi5wb3NpdGlvbikubGVuZ3RoKCkpXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19