angular-three-soba 1.13.0 → 1.14.1

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 (257) 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/{esm2020 → esm2022}/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +3 -3
  45. package/esm2022/loaders/lib/loader/loader.mjs +134 -0
  46. package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +75 -0
  47. package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +328 -0
  48. package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +158 -0
  49. package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +238 -0
  50. package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
  51. package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +26 -0
  52. package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +47 -0
  53. package/esm2022/performance/lib/adaptive/adaptive-events.mjs +37 -0
  54. package/esm2022/performance/lib/detailed/detailed.mjs +54 -0
  55. package/esm2022/performance/lib/stats/stats.mjs +80 -0
  56. package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +61 -0
  57. package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +249 -0
  58. package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +201 -0
  59. package/{esm2020 → esm2022}/staging/lib/bounds/bounds.mjs +8 -7
  60. package/esm2022/staging/lib/camera-shake/camera-shake.mjs +122 -0
  61. package/esm2022/staging/lib/caustics/caustics.mjs +364 -0
  62. package/esm2022/staging/lib/center/center.mjs +143 -0
  63. package/esm2022/staging/lib/cloud/cloud.mjs +160 -0
  64. package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +228 -0
  65. package/esm2022/staging/lib/environment/environment-cube.mjs +41 -0
  66. package/esm2022/staging/lib/environment/environment-ground.mjs +67 -0
  67. package/esm2022/staging/lib/environment/environment-inputs.mjs +87 -0
  68. package/esm2022/staging/lib/environment/environment-map.mjs +39 -0
  69. package/esm2022/staging/lib/environment/environment-portal.mjs +111 -0
  70. package/{esm2020 → esm2022}/staging/lib/environment/environment.mjs +13 -11
  71. package/esm2022/staging/lib/float/float.mjs +77 -0
  72. package/esm2022/staging/lib/sky/sky.mjs +109 -0
  73. package/esm2022/staging/lib/sparkles/sparkles.mjs +210 -0
  74. package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +51 -0
  75. package/esm2022/staging/lib/spot-light/spot-light-input.mjs +62 -0
  76. package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +74 -0
  77. package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +126 -0
  78. package/{esm2020 → esm2022}/staging/lib/spot-light/spot-light-shadow.mjs +8 -7
  79. package/esm2022/staging/lib/spot-light/spot-light.mjs +117 -0
  80. package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +86 -0
  81. package/{esm2020 → esm2022}/staging/lib/stage/stage.mjs +13 -11
  82. package/esm2022/staging/lib/stars/stars.mjs +140 -0
  83. package/{fesm2020 → fesm2022}/angular-three-soba-abstractions.mjs +89 -89
  84. package/{fesm2015 → fesm2022}/angular-three-soba-abstractions.mjs.map +1 -1
  85. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs +21 -21
  86. package/{fesm2015 → fesm2022}/angular-three-soba-cameras.mjs.map +1 -1
  87. package/{fesm2020 → fesm2022}/angular-three-soba-controls.mjs +5 -5
  88. package/fesm2022/angular-three-soba-controls.mjs.map +1 -0
  89. package/{fesm2020 → fesm2022}/angular-three-soba-loaders.mjs +7 -7
  90. package/{fesm2020 → fesm2022}/angular-three-soba-loaders.mjs.map +1 -1
  91. package/{fesm2020 → fesm2022}/angular-three-soba-materials.mjs +25 -25
  92. package/{fesm2020 → fesm2022}/angular-three-soba-materials.mjs.map +1 -1
  93. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs +3 -3
  94. package/{fesm2020 → fesm2022}/angular-three-soba-misc.mjs.map +1 -1
  95. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs +14 -14
  96. package/{fesm2020 → fesm2022}/angular-three-soba-performance.mjs.map +1 -1
  97. package/{fesm2020 → fesm2022}/angular-three-soba-shaders.mjs +2 -2
  98. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -0
  99. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs +139 -139
  100. package/{fesm2020 → fesm2022}/angular-three-soba-staging.mjs.map +1 -1
  101. package/loaders/lib/loader/loader.d.ts +1 -1
  102. package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +1 -1
  103. package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +1 -1
  104. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +1 -1
  105. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +1 -1
  106. package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +1 -1
  107. package/package.json +45 -70
  108. package/performance/lib/adaptive/adaptive-dpr.d.ts +1 -1
  109. package/performance/lib/detailed/detailed.d.ts +1 -1
  110. package/performance/lib/stats/stats.d.ts +1 -1
  111. package/plugin/package.json +1 -1
  112. package/plugin/src/generators/init/compat.js +1 -1
  113. package/plugin/src/generators/init/compat.js.map +1 -1
  114. package/plugin/src/generators/init/init.d.ts +1 -1
  115. package/plugin/src/generators/init/init.js +1 -1
  116. package/plugin/src/generators/init/init.js.map +1 -1
  117. package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +2 -2
  118. package/staging/lib/accumulative-shadows/randomized-lights.d.ts +1 -1
  119. package/staging/lib/bounds/bounds.d.ts +1 -1
  120. package/staging/lib/camera-shake/camera-shake.d.ts +1 -1
  121. package/staging/lib/caustics/caustics.d.ts +2 -2
  122. package/staging/lib/center/center.d.ts +1 -1
  123. package/staging/lib/cloud/cloud.d.ts +1 -1
  124. package/staging/lib/contact-shadows/contact-shadows.d.ts +1 -1
  125. package/staging/lib/environment/environment-inputs.d.ts +1 -1
  126. package/staging/lib/float/float.d.ts +1 -1
  127. package/staging/lib/sky/sky.d.ts +1 -1
  128. package/staging/lib/sparkles/sparkles.d.ts +2 -2
  129. package/staging/lib/spot-light/shadow-mesh-input.d.ts +1 -1
  130. package/staging/lib/spot-light/spot-light-input.d.ts +1 -1
  131. package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +1 -1
  132. package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +1 -1
  133. package/staging/lib/spot-light/spot-light.d.ts +1 -1
  134. package/staging/lib/spot-light/volumetric-mesh.d.ts +1 -1
  135. package/staging/lib/stage/stage.d.ts +2 -2
  136. package/staging/lib/stars/stars.d.ts +2 -2
  137. package/esm2020/abstractions/lib/billboard/billboard.mjs +0 -73
  138. package/esm2020/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -119
  139. package/esm2020/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -98
  140. package/esm2020/abstractions/lib/edges/edges.mjs +0 -95
  141. package/esm2020/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -211
  142. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -91
  143. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -182
  144. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -45
  145. package/esm2020/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -193
  146. package/esm2020/abstractions/lib/line/line-input.mjs +0 -75
  147. package/esm2020/abstractions/lib/line/line.mjs +0 -132
  148. package/esm2020/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -127
  149. package/esm2020/abstractions/lib/text/text.mjs +0 -114
  150. package/esm2020/abstractions/lib/text-3d/text-3d.mjs +0 -144
  151. package/esm2020/cameras/lib/camera/camera-content.mjs +0 -20
  152. package/esm2020/cameras/lib/camera/camera.mjs +0 -74
  153. package/esm2020/cameras/lib/cube-camera/cube-camera.mjs +0 -130
  154. package/esm2020/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -92
  155. package/esm2020/controls/lib/orbit-controls/orbit-controls.mjs +0 -146
  156. package/esm2020/loaders/lib/loader/loader.mjs +0 -133
  157. package/esm2020/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -74
  158. package/esm2020/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -327
  159. package/esm2020/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -157
  160. package/esm2020/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -237
  161. package/esm2020/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -67
  162. package/esm2020/misc/lib/bake-shadows/bake-shadows.mjs +0 -25
  163. package/esm2020/performance/lib/adaptive/adaptive-dpr.mjs +0 -46
  164. package/esm2020/performance/lib/adaptive/adaptive-events.mjs +0 -36
  165. package/esm2020/performance/lib/detailed/detailed.mjs +0 -53
  166. package/esm2020/performance/lib/stats/stats.mjs +0 -79
  167. package/esm2020/shaders/lib/blur-pass/blur-pass.mjs +0 -61
  168. package/esm2020/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -247
  169. package/esm2020/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -199
  170. package/esm2020/staging/lib/camera-shake/camera-shake.mjs +0 -121
  171. package/esm2020/staging/lib/caustics/caustics.mjs +0 -363
  172. package/esm2020/staging/lib/center/center.mjs +0 -142
  173. package/esm2020/staging/lib/cloud/cloud.mjs +0 -159
  174. package/esm2020/staging/lib/contact-shadows/contact-shadows.mjs +0 -227
  175. package/esm2020/staging/lib/environment/environment-cube.mjs +0 -40
  176. package/esm2020/staging/lib/environment/environment-ground.mjs +0 -66
  177. package/esm2020/staging/lib/environment/environment-inputs.mjs +0 -86
  178. package/esm2020/staging/lib/environment/environment-map.mjs +0 -38
  179. package/esm2020/staging/lib/environment/environment-portal.mjs +0 -110
  180. package/esm2020/staging/lib/float/float.mjs +0 -76
  181. package/esm2020/staging/lib/sky/sky.mjs +0 -108
  182. package/esm2020/staging/lib/sparkles/sparkles.mjs +0 -209
  183. package/esm2020/staging/lib/spot-light/shadow-mesh-input.mjs +0 -50
  184. package/esm2020/staging/lib/spot-light/spot-light-input.mjs +0 -61
  185. package/esm2020/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -73
  186. package/esm2020/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -125
  187. package/esm2020/staging/lib/spot-light/spot-light.mjs +0 -116
  188. package/esm2020/staging/lib/spot-light/volumetric-mesh.mjs +0 -85
  189. package/esm2020/staging/lib/stars/stars.mjs +0 -139
  190. package/fesm2015/angular-three-soba-abstractions.mjs +0 -2048
  191. package/fesm2015/angular-three-soba-controls.mjs +0 -153
  192. package/fesm2015/angular-three-soba-controls.mjs.map +0 -1
  193. package/fesm2015/angular-three-soba-loaders.mjs +0 -229
  194. package/fesm2015/angular-three-soba-loaders.mjs.map +0 -1
  195. package/fesm2015/angular-three-soba-materials.mjs +0 -851
  196. package/fesm2015/angular-three-soba-materials.mjs.map +0 -1
  197. package/fesm2015/angular-three-soba-misc.mjs +0 -148
  198. package/fesm2015/angular-three-soba-misc.mjs.map +0 -1
  199. package/fesm2015/angular-three-soba-performance.mjs +0 -210
  200. package/fesm2015/angular-three-soba-performance.mjs.map +0 -1
  201. package/fesm2015/angular-three-soba-shaders.mjs +0 -1239
  202. package/fesm2015/angular-three-soba-shaders.mjs.map +0 -1
  203. package/fesm2015/angular-three-soba-staging.mjs +0 -3772
  204. package/fesm2015/angular-three-soba-staging.mjs.map +0 -1
  205. package/fesm2020/angular-three-soba-abstractions.mjs.map +0 -1
  206. package/fesm2020/angular-three-soba-cameras.mjs +0 -347
  207. package/fesm2020/angular-three-soba-cameras.mjs.map +0 -1
  208. package/fesm2020/angular-three-soba-controls.mjs.map +0 -1
  209. package/fesm2020/angular-three-soba-shaders.mjs.map +0 -1
  210. package/fesm2020/angular-three-soba.mjs +0 -6
  211. package/fesm2020/angular-three-soba.mjs.map +0 -1
  212. /package/{esm2020 → esm2022}/abstractions/angular-three-soba-abstractions.mjs +0 -0
  213. /package/{esm2020 → esm2022}/abstractions/index.mjs +0 -0
  214. /package/{esm2020 → esm2022}/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -0
  215. /package/{esm2020 → esm2022}/angular-three-soba.mjs +0 -0
  216. /package/{esm2020 → esm2022}/cameras/angular-three-soba-cameras.mjs +0 -0
  217. /package/{esm2020 → esm2022}/cameras/index.mjs +0 -0
  218. /package/{esm2020 → esm2022}/controls/angular-three-soba-controls.mjs +0 -0
  219. /package/{esm2020 → esm2022}/controls/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/index.mjs +0 -0
  221. /package/{esm2020 → esm2022}/loaders/angular-three-soba-loaders.mjs +0 -0
  222. /package/{esm2020 → esm2022}/loaders/index.mjs +0 -0
  223. /package/{esm2020 → esm2022}/loaders/lib/gltf-loader/gltf-loader.mjs +0 -0
  224. /package/{esm2020 → esm2022}/loaders/lib/progress/progress.mjs +0 -0
  225. /package/{esm2020 → esm2022}/loaders/lib/texture-loader/texture-loader.mjs +0 -0
  226. /package/{esm2020 → esm2022}/materials/angular-three-soba-materials.mjs +0 -0
  227. /package/{esm2020 → esm2022}/materials/index.mjs +0 -0
  228. /package/{esm2020 → esm2022}/misc/angular-three-soba-misc.mjs +0 -0
  229. /package/{esm2020 → esm2022}/misc/index.mjs +0 -0
  230. /package/{esm2020 → esm2022}/misc/lib/animations/animations.mjs +0 -0
  231. /package/{esm2020 → esm2022}/misc/lib/depth-buffer/depth-buffer.mjs +0 -0
  232. /package/{esm2020 → esm2022}/misc/lib/fbo/fbo.mjs +0 -0
  233. /package/{esm2020 → esm2022}/performance/angular-three-soba-performance.mjs +0 -0
  234. /package/{esm2020 → esm2022}/performance/index.mjs +0 -0
  235. /package/{esm2020 → esm2022}/shaders/angular-three-soba-shaders.mjs +0 -0
  236. /package/{esm2020 → esm2022}/shaders/index.mjs +0 -0
  237. /package/{esm2020 → esm2022}/shaders/lib/caustics-material/caustics-material.mjs +0 -0
  238. /package/{esm2020 → esm2022}/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -0
  239. /package/{esm2020 → esm2022}/shaders/lib/convolution-material/convolution-material.mjs +0 -0
  240. /package/{esm2020 → esm2022}/shaders/lib/discard-material/discard-material.mjs +0 -0
  241. /package/{esm2020 → esm2022}/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -0
  242. /package/{esm2020 → esm2022}/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -0
  243. /package/{esm2020 → esm2022}/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -0
  244. /package/{esm2020 → esm2022}/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -0
  245. /package/{esm2020 → esm2022}/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -0
  246. /package/{esm2020 → esm2022}/shaders/lib/shader-material/shader-material.mjs +0 -0
  247. /package/{esm2020 → esm2022}/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -0
  248. /package/{esm2020 → esm2022}/shaders/lib/spot-light-material/spot-light-material.mjs +0 -0
  249. /package/{esm2020 → esm2022}/shaders/lib/star-field-material/star-field-material.mjs +0 -0
  250. /package/{esm2020 → esm2022}/staging/angular-three-soba-staging.mjs +0 -0
  251. /package/{esm2020 → esm2022}/staging/index.mjs +0 -0
  252. /package/{esm2020 → esm2022}/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -0
  253. /package/{esm2020 → esm2022}/staging/lib/environment/assets.mjs +0 -0
  254. /package/{esm2020 → esm2022}/staging/lib/environment/utils.mjs +0 -0
  255. /package/{esm2020 → esm2022}/staging/lib/spot-light/common.mjs +0 -0
  256. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs +0 -0
  257. /package/{fesm2015 → fesm2022}/angular-three-soba.mjs.map +0 -0
@@ -1,61 +0,0 @@
1
- import { BufferAttribute, BufferGeometry, Camera, LinearFilter, Mesh, 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 Camera();
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci1wYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc2hhZGVycy9zcmMvbGliL2JsdXItcGFzcy9ibHVyLXBhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGVBQWUsRUFDZixjQUFjLEVBQ2QsTUFBTSxFQUNOLFlBQVksRUFDWixJQUFJLEVBQ0osS0FBSyxFQUNMLE9BQU8sRUFFUCxpQkFBaUIsR0FDcEIsTUFBTSxPQUFPLENBQUM7QUFFZixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQWFuRixNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFZLEVBQ1IsRUFBRSxFQUNGLFVBQVUsRUFDVixLQUFLLEdBQUcsR0FBRyxFQUNYLE1BQU0sR0FBRyxHQUFHLEVBQ1osaUJBQWlCLEdBQUcsQ0FBQyxFQUNyQixpQkFBaUIsR0FBRyxDQUFDLEVBQ3JCLFVBQVUsR0FBRyxDQUFDLEVBQ2Qsb0JBQW9CLEdBQUcsSUFBSSxHQUNmO1FBWGhCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBWW5CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFO1lBQy9ELFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxFQUFFLENBQUMsY0FBYztTQUM5QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxLQUFLLEVB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QUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUMzQyw2QkFBNkI7WUFDN0IsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDdkQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDL0IsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUNuQjtRQUNELFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMvQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBCdWZmZXJBdHRyaWJ1dGUsXG4gICAgQnVmZmVyR2VvbWV0cnksXG4gICAgQ2FtZXJhLFxuICAgIExpbmVhckZpbHRlcixcbiAgICBNZXNoLFxuICAgIFNjZW5lLFxuICAgIFZlY3RvcjIsXG4gICAgV2ViR0xSZW5kZXJlcixcbiAgICBXZWJHTFJlbmRlclRhcmdldCxcbn0gZnJvbSAndGhyZWUnO1xuXG5pbXBvcnQgeyBDb252b2x1dGlvbk1hdGVyaWFsIH0gZnJvbSAnLi4vY29udm9sdXRpb24tbWF0ZXJpYWwvY29udm9sdXRpb24tbWF0ZXJpYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJsdXJQYXNzUHJvcHMge1xuICAgIGdsOiBXZWJHTFJlbmRlcmVyO1xuICAgIHJlc29sdXRpb246IG51bWJlcjtcbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgbWluRGVwdGhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgbWF4RGVwdGhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gICAgZGVwdGhTY2FsZT86IG51bWJlcjtcbiAgICBkZXB0aFRvQmx1clJhdGlvQmlhcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEJsdXJQYXNzIHtcbiAgICByZWFkb25seSByZW5kZXJUYXJnZXRBOiBXZWJHTFJlbmRlclRhcmdldDtcbiAgICByZWFkb25seSByZW5kZXJUYXJnZXRCOiBXZWJHTFJlbmRlclRhcmdldDtcbiAgICByZWFkb25seSBjb252b2x1dGlvbk1hdGVyaWFsOiBDb252b2x1dGlvbk1hdGVyaWFsO1xuICAgIHJlYWRvbmx5IHNjZW5lOiBTY2VuZTtcbiAgICByZWFkb25seSBjYW1lcmE6IENhbWVyYTtcbiAgICByZWFkb25seSBzY3JlZW46IE1lc2g7XG4gICAgcmVuZGVyVG9TY3JlZW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgZ2wsXG4gICAgICAgIHJlc29sdXRpb24sXG4gICAgICAgIHdpZHRoID0gNTAwLFxuICAgICAgICBoZWlnaHQgPSA1MDAsXG4gICAgICAgIG1pbkRlcHRoVGhyZXNob2xkID0gMCxcbiAgICAgICAgbWF4RGVwdGhUaHJlc2hvbGQgPSAxLFxuICAgICAgICBkZXB0aFNjYWxlID0gMCxcbiAgICAgICAgZGVwdGhUb0JsdXJSYXRpb0JpYXMgPSAwLjI1LFxuICAgIH06IEJsdXJQYXNzUHJvcHMpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRBID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KHJlc29sdXRpb24sIHJlc29sdXRpb24sIHtcbiAgICAgICAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICAgICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZSxcbiAgICAgICAgICAgIGVuY29kaW5nOiBnbC5vdXRwdXRFbmNvZGluZyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0QiA9IHRoaXMucmVuZGVyVGFyZ2V0QS5jbG9uZSgpO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwgPSBuZXcgQ29udm9sdXRpb25NYXRlcmlhbCgpO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0UmVzb2x1dGlvbihuZXcgVmVjdG9yMih3aWR0aCwgaGVpZ2h0KSk7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICAgICAgdGhpcy5jYW1lcmEgPSBuZXcgQ2FtZXJhKCk7XG4gICAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC51bmlmb3Jtc1snbWluRGVwdGhUaHJlc2hvbGQnXS52YWx1ZSA9IG1pbkRlcHRoVGhyZXNob2xkO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwudW5pZm9ybXNbJ21heERlcHRoVGhyZXNob2xkJ10udmFsdWUgPSBtYXhEZXB0aFRocmVzaG9sZDtcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLnVuaWZvcm1zWydkZXB0aFNjYWxlJ10udmFsdWUgPSBkZXB0aFNjYWxlO1xuICAgICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwudW5pZm9ybXNbJ2RlcHRoVG9CbHVyUmF0aW9CaWFzJ10udmFsdWUgPSBkZXB0aFRvQmx1clJhdGlvQmlhcztcbiAgICAgICAgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmRlZmluZXNbJ1VTRV9ERVBUSCddID0gZGVwdGhTY2FsZSA+IDA7XG4gICAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheShbLTEsIC0xLCAwLCAzLCAtMSwgMCwgLTEsIDMsIDBdKTtcbiAgICAgICAgY29uc3QgdXZzID0gbmV3IEZsb2F0MzJBcnJheShbMCwgMCwgMiwgMCwgMCwgMl0pO1xuICAgICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuICAgICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh2ZXJ0aWNlcywgMykpO1xuICAgICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSh1dnMsIDIpKTtcbiAgICAgICAgdGhpcy5zY3JlZW4gPSBuZXcgTWVzaChnZW9tZXRyeSwgdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsKTtcbiAgICAgICAgdGhpcy5zY3JlZW4uZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLnNjcmVlbik7XG4gICAgfVxuXG4gICAgcmVuZGVyKHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBpbnB1dEJ1ZmZlcjogYW55LCBvdXRwdXRCdWZmZXI6IGFueSkge1xuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgICBjb25zdCByZW5kZXJUYXJnZXRBID0gdGhpcy5yZW5kZXJUYXJnZXRBO1xuICAgICAgICBjb25zdCByZW5kZXJUYXJnZXRCID0gdGhpcy5yZW5kZXJUYXJnZXRCO1xuICAgICAgICBjb25zdCBtYXRlcmlhbCA9IHRoaXMuY29udm9sdXRpb25NYXRlcmlhbDtcbiAgICAgICAgY29uc3QgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcbiAgICAgICAgdW5pZm9ybXNbJ2RlcHRoQnVmZmVyJ10udmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XG4gICAgICAgIGNvbnN0IGtlcm5lbCA9IG1hdGVyaWFsLmtlcm5lbDtcbiAgICAgICAgbGV0IGxhc3RSVCA9IGlucHV0QnVmZmVyO1xuICAgICAgICBsZXQgZGVzdFJUO1xuICAgICAgICBsZXQgaSwgbDtcbiAgICAgICAgLy8gQXBwbHkgdGhlIG11bHRpLXBhc3MgYmx1ci5cbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGtlcm5lbC5sZW5ndGggLSAxOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyBBbHRlcm5hdGUgYmV0d2VlbiB0YXJnZXRzLlxuICAgICAgICAgICAgZGVzdFJUID0gKGkgJiAxKSA9PT0gMCA/IHJlbmRlclRhcmdldEEgOiByZW5kZXJUYXJnZXRCO1xuICAgICAgICAgICAgdW5pZm9ybXNbJ2tlcm5lbCddLnZhbHVlID0ga2VybmVsW2ldO1xuICAgICAgICAgICAgdW5pZm9ybXNbJ2lucHV0QnVmZmVyJ10udmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcbiAgICAgICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChkZXN0UlQpO1xuICAgICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICAgICAgICAgICAgbGFzdFJUID0gZGVzdFJUO1xuICAgICAgICB9XG4gICAgICAgIHVuaWZvcm1zWydrZXJuZWwnXS52YWx1ZSA9IGtlcm5lbFtpXTtcbiAgICAgICAgdW5pZm9ybXNbJ2lucHV0QnVmZmVyJ10udmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,247 +0,0 @@
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
- export class AccumulativeShadowsConsumer {
84
- constructor() {
85
- inject(NGTS_ACCUMULATIVE_SHADOWS_API);
86
- }
87
- }
88
- AccumulativeShadowsConsumer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: AccumulativeShadowsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
89
- AccumulativeShadowsConsumer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: AccumulativeShadowsConsumer, isStandalone: true, selector: "[ngtsAccumulativeShadowsConsumer]", ngImport: i0 });
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: AccumulativeShadowsConsumer, decorators: [{
91
- type: Directive,
92
- args: [{ selector: '[ngtsAccumulativeShadowsConsumer]', standalone: true }]
93
- }], ctorParameters: function () { return []; } });
94
- export class NgtsAccumulativeShadows extends NgtRxStore {
95
- constructor() {
96
- super(...arguments);
97
- this.nullTraverse = () => null;
98
- this.Math = Math;
99
- this.store = inject(NgtStore);
100
- this.pLM = new ProgressiveLightMap(this.store.get('gl'), this.store.get('scene'), this.get('resolution'));
101
- this.accumulativeShadowsRef = injectNgtRef();
102
- this.meshRef = injectNgtRef();
103
- }
104
- /** How many frames it can render, more yields cleaner results but takes more time, 40 */
105
- set frames(frames) {
106
- this.set({ frames });
107
- }
108
- /** If frames === Infinity blend controls the refresh ratio, 100 */
109
- set blend(blend) {
110
- this.set({ blend });
111
- }
112
- /** Can limit the amount of frames rendered if frames === Infinity, usually to get some performance back once a movable scene has settled, Infinity */
113
- set limit(limit) {
114
- this.set({ limit });
115
- }
116
- /** Scale of the plane, */
117
- set scale(scale) {
118
- this.set({ scale });
119
- }
120
- /** Temporal accumulates shadows over time which is more performant but has a visual regression over instant results, false */
121
- set temporal(temporal) {
122
- this.set({ temporal });
123
- }
124
- /** Opacity of the plane, 1 */
125
- set opacity(opacity) {
126
- this.set({ opacity });
127
- }
128
- /** Discards alpha pixels, 0.65 */
129
- set alphaTest(alphaTest) {
130
- this.set({ alphaTest });
131
- }
132
- /** Shadow color, black */
133
- set color(color) {
134
- this.set({ color });
135
- }
136
- /** Colorblend, how much colors turn to black, 0 is black, 2 */
137
- set colorBlend(colorBlend) {
138
- this.set({ colorBlend });
139
- }
140
- /** Buffer resolution, 1024 */
141
- set resolution(resolution) {
142
- this.set({ resolution });
143
- }
144
- /** Texture tonemapping */
145
- set toneMapped(toneMapped) {
146
- this.set({ toneMapped });
147
- }
148
- initialize() {
149
- super.initialize();
150
- this.set({
151
- frames: 40,
152
- limit: Infinity,
153
- blend: 20,
154
- scale: 10,
155
- opacity: 1,
156
- alphaTest: 0.75,
157
- color: 'black',
158
- colorBlend: 2,
159
- resolution: 1024,
160
- toneMapped: true,
161
- });
162
- }
163
- }
164
- NgtsAccumulativeShadows.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: NgtsAccumulativeShadows, deps: null, target: i0.ɵɵFactoryTarget.Component });
165
- NgtsAccumulativeShadows.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", 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
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: NgtsAccumulativeShadows, decorators: [{
191
- type: Component,
192
- args: [{
193
- selector: 'ngts-accumulative-shadows',
194
- standalone: true,
195
- template: `
196
- <ngt-group ngtCompound>
197
- <ngt-group [ref]="accumulativeShadowsRef" [traverse]="nullTraverse">
198
- <ng-content />
199
- <ng-container ngtsAccumulativeShadowsConsumer />
200
- </ngt-group>
201
- <ngt-mesh [ref]="meshRef" [receiveShadow]="true" [scale]="get('scale')" [rotation]="[-Math.PI / 2, 0, 0]">
202
- <ngt-plane-geometry />
203
- <ngt-soft-shadow-material
204
- [transparent]="true"
205
- [depthWrite]="false"
206
- [color]="get('color')"
207
- [toneMapped]="get('toneMapped')"
208
- [blend]="get('colorBlend')"
209
- [map]="pLM.progressiveLightMap2.texture"
210
- />
211
- </ngt-mesh>
212
- </ngt-group>
213
- `,
214
- imports: [AccumulativeShadowsConsumer],
215
- providers: [
216
- {
217
- provide: NGTS_ACCUMULATIVE_SHADOWS_API,
218
- useFactory: accumulativeShadowsApiFactory,
219
- deps: [NgtsAccumulativeShadows],
220
- },
221
- ],
222
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
223
- }]
224
- }], propDecorators: { frames: [{
225
- type: Input
226
- }], blend: [{
227
- type: Input
228
- }], limit: [{
229
- type: Input
230
- }], scale: [{
231
- type: Input
232
- }], temporal: [{
233
- type: Input
234
- }], opacity: [{
235
- type: Input
236
- }], alphaTest: [{
237
- type: Input
238
- }], color: [{
239
- type: Input
240
- }], colorBlend: [{
241
- type: Input
242
- }], resolution: [{
243
- type: Input
244
- }], toneMapped: [{
245
- type: Input
246
- }] } });
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjdW11bGF0aXZlLXNoYWRvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvYWNjdW11bGF0aXZlLXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUE0QixNQUFNLDRCQUE0QixDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFOUQsTUFBTSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBZTNELE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLElBQUksY0FBYyxDQUMzRCw2QkFBNkIsQ0FDaEMsQ0FBQztBQUVGLFNBQVMsNkJBQTZCLENBQUMsbUJBQTRDO0lBQy9FLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUUvQixNQUFNLEdBQUcsR0FBRztRQUNSLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDVixt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SztnQkFLTyxLQUFLO3NCQUFqQixLQUFLO2dCQUtPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBS08sS0FBSztzQkFBakIsS0FBSztnQkFLTyxRQUFRO3NCQUFwQixLQUFLO2dCQUtPLE9BQU87c0JBQW5CLEtBQUs7Z0JBS08sU0FBUztzQkFBckIsS0FBSztnQkFLTyxLQUFLO3NCQUFqQixLQUFLO2dCQUtPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBS08sVUFBVTtzQkFBdEIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEaXJlY3RpdmUsIGluamVjdCwgSW5qZWN0aW9uVG9rZW4sIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGdldExvY2FsU3RhdGUsIGluamVjdE5ndFJlZiwgTmd0UnhTdG9yZSwgTmd0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IFNvZnRTaGFkb3dNYXRlcmlhbCwgU29mdFNoYWRvd01hdGVyaWFsSW5wdXRzIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3NoYWRlcnMnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAsIE1lc2gsIFBsYW5lR2VvbWV0cnkgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBQcm9ncmVzc2l2ZUxpZ2h0TWFwIH0gZnJvbSAnLi9wcm9ncmVzc2l2ZS1saWdodC1tYXAnO1xuXG5leHRlbmQoeyBTb2Z0U2hhZG93TWF0ZXJpYWwsIEdyb3VwLCBNZXNoLCBQbGFuZUdlb21ldHJ5IH0pO1xuXG5leHBvcnQgdHlwZSBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0xpZ2h0QXBpID0geyB1cGRhdGU6ICgpID0+IHZvaWQgfTtcblxuZXhwb3J0IHR5cGUgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NBcGkgPSB7XG4gICAgbGlnaHRzOiBNYXA8c3RyaW5nLCBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0xpZ2h0QXBpPjtcbiAgICB0ZW1wb3JhbDogYm9vbGVhbjtcbiAgICBmcmFtZXM6IG51bWJlcjtcbiAgICBibGVuZDogbnVtYmVyO1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgZ2V0TWVzaDogKCkgPT4gVEhSRUUuTWVzaDxUSFJFRS5QbGFuZUdlb21ldHJ5LCBTb2Z0U2hhZG93TWF0ZXJpYWxJbnB1dHMgJiBUSFJFRS5TaGFkZXJNYXRlcmlhbD47XG4gICAgcmVzZXQ6ICgpID0+IHZvaWQ7XG4gICAgdXBkYXRlOiAoZnJhbWVzPzogbnVtYmVyKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IGNvbnN0IE5HVFNfQUNDVU1VTEFUSVZFX1NIQURPV1NfQVBJID0gbmV3IEluamVjdGlvblRva2VuPE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQXBpPihcbiAgICAnTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3MgQVBJJ1xuKTtcblxuZnVuY3Rpb24gYWNjdW11bGF0aXZlU2hhZG93c0FwaUZhY3RvcnkoYWNjdW11bGF0aXZlU2hhZG93czogTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3MpIHtcbiAgICBjb25zdCBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICBjb25zdCBhcGkgPSB7XG4gICAgICAgIGxpZ2h0czogbmV3IE1hcCgpLFxuICAgICAgICBjb3VudDogMCxcbiAgICAgICAgZ2V0TWVzaDogKCkgPT5cbiAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MubWVzaFJlZi5uYXRpdmVFbGVtZW50IGFzIFRIUkVFLk1lc2g8XG4gICAgICAgICAgICAgICAgVEhSRUUuUGxhbmVHZW9tZXRyeSxcbiAgICAgICAgICAgICAgICBTb2Z0U2hhZG93TWF0ZXJpYWxJbnB1dHMgJiBUSFJFRS5TaGFkZXJNYXRlcmlhbFxuICAgICAgICAgICAgPixcbiAgICAgICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLmNsZWFyKCk7XG4gICAgICAgICAgICBjb25zdCBtYXRlcmlhbCA9IGFwaS5nZXRNZXNoKCkubWF0ZXJpYWw7XG4gICAgICAgICAgICBtYXRlcmlhbC5vcGFjaXR5ID0gMDtcbiAgICAgICAgICAgIG1hdGVyaWFsLmFscGhhVGVzdCA9IDA7XG4gICAgICAgICAgICBhcGkuY291bnQgPSAwO1xuICAgICAgICB9LFxuICAgICAgICB1cGRhdGU6IChmcmFtZXMgPSAxKSA9PiB7XG4gICAgICAgICAgICAvLyBhZGFwdCB0aGUgb3BhY2l0eSBibGVuZCByYXRpbyB0byB0aGUgbnVtYmVyIG9mIGZyYW1lc1xuICAgICAgICAgICAgY29uc3QgbWF0ZXJpYWwgPSBhcGkuZ2V0TWVzaCgpLm1hdGVyaWFsO1xuICAgICAgICAgICAgaWYgKCFhcGkudGVtcG9yYWwpIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5vcGFjaXR5ID0gYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ29wYWNpdHknKTtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbC5hbHBoYVRlc3QgPSBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYWxwaGFUZXN0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLm9wYWNpdHkgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ29wYWNpdHknKSxcbiAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwub3BhY2l0eSArIGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdvcGFjaXR5JykgLyBhcGkuYmxlbmRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsLmFscGhhVGVzdCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnYWxwaGFUZXN0JyksXG4gICAgICAgICAgICAgICAgICAgIG1hdGVyaWFsLmFscGhhVGVzdCArIGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdhbHBoYVRlc3QnKSAvIGFwaS5ibGVuZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN3aXRjaCBhY2N1bXVsYXRpdmUgbGlnaHRzIG9uXG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmFjY3VtdWxhdGl2ZVNoYWRvd3NSZWYubmF0aXZlRWxlbWVudC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvbGxlY3Qgc2NlbmUgbGlnaHRzIGFuZCBtZXNoZXNcbiAgICAgICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MucExNLnByZXBhcmUoKTtcblxuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBsaWdodG1hcCBhbmQgdGhlIGFjY3VtdWxhdGl2ZSBsaWdodHNcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJhbWVzOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcGkubGlnaHRzLmZvckVhY2goKGxpZ2h0KSA9PiBsaWdodC51cGRhdGUoKSk7XG4gICAgICAgICAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5wTE0udXBkYXRlKHN0b3JlLmdldCgnY2FtZXJhJyksIGFwaS5ibGVuZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN3aXRjaCBsaWdodHMgb2ZmXG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmFjY3VtdWxhdGl2ZVNoYWRvd3NSZWYubmF0aXZlRWxlbWVudC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyByZXN0b3JlIGxpZ2h0cyBhbmQgbWVzaGVzXG4gICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLnBMTS5maW5pc2goKTtcbiAgICAgICAgfSxcbiAgICB9IGFzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQXBpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYXBpLCB7XG4gICAgICAgIHRlbXBvcmFsOiB7XG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhYWNjdW11bGF0aXZlU2hhZG93cy5nZXQoJ3RlbXBvcmFsJyksXG4gICAgICAgIH0sXG4gICAgICAgIGZyYW1lczoge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiBNYXRoLm1heCgyLCBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnZnJhbWVzJykpLFxuICAgICAgICB9LFxuICAgICAgICBibGVuZDoge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PlxuICAgICAgICAgICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRpdmVTaGFkb3dzLmdldCgnZnJhbWVzJykgPT09IEluZmluaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdibGVuZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdmcmFtZXMnKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MuaG9sZChhY2N1bXVsYXRpdmVTaGFkb3dzLm1lc2hSZWYuJCwgKG1lc2gpID0+IHtcbiAgICAgICAgYWNjdW11bGF0aXZlU2hhZG93cy5wTE0uY29uZmlndXJlKG1lc2gpO1xuXG4gICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MuaG9sZChcbiAgICAgICAgICAgIGNvbWJpbmVMYXRlc3QoW2FjY3VtdWxhdGl2ZVNoYWRvd3Muc2VsZWN0KCksIGdldExvY2FsU3RhdGUoc3RvcmUuZ2V0KCdzY2VuZScpKS5vYmplY3RzXSksXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgaW50ZXJuYWxzLCBidWZmZXJzLCAuLi5cbiAgICAgICAgICAgICAgICBhcGkucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbGlnaHRtYXBcbiAgICAgICAgICAgICAgICBpZiAoIWFwaS50ZW1wb3JhbCAmJiBhcGkuZnJhbWVzICE9PSBJbmZpbml0eSkgYXBpLnVwZGF0ZShhcGkuYmxlbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGFjY3VtdWxhdGl2ZVNoYWRvd3MuZWZmZWN0KHN1YmplY3QsICgpID0+XG4gICAgICAgICAgICBzdG9yZS5nZXQoJ2ludGVybmFsJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IGFjY3VtdWxhdGl2ZVNoYWRvd3MuZ2V0KCdsaW1pdCcpO1xuICAgICAgICAgICAgICAgIGlmICgoYXBpLnRlbXBvcmFsIHx8IGFwaS5mcmFtZXMgPT09IEluZmluaXR5KSAmJiBhcGkuY291bnQgPCBhcGkuZnJhbWVzICYmIGFwaS5jb3VudCA8IGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFwaS51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmNvdW50Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc3ViamVjdC5uZXh0KCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXBpO1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NDb25zdW1lcl0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgQWNjdW11bGF0aXZlU2hhZG93c0NvbnN1bWVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0KE5HVFNfQUNDVU1VTEFUSVZFX1NIQURPV1NfQVBJKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1hY2N1bXVsYXRpdmUtc2hhZG93cycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LWdyb3VwIG5ndENvbXBvdW5kPlxuICAgICAgICAgICAgPG5ndC1ncm91cCBbcmVmXT1cImFjY3VtdWxhdGl2ZVNoYWRvd3NSZWZcIiBbdHJhdmVyc2VdPVwibnVsbFRyYXZlcnNlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzQ29uc3VtZXIgLz5cbiAgICAgICAgICAgIDwvbmd0LWdyb3VwPlxuICAgICAgICAgICAgPG5ndC1tZXNoIFtyZWZdPVwibWVzaFJlZlwiIFtyZWNlaXZlU2hhZG93XT1cInRydWVcIiBbc2NhbGVdPVwiZ2V0KCdzY2FsZScpXCIgW3JvdGF0aW9uXT1cIlstTWF0aC5QSSAvIDIsIDAsIDBdXCI+XG4gICAgICAgICAgICAgICAgPG5ndC1wbGFuZS1nZW9tZXRyeSAvPlxuICAgICAgICAgICAgICAgIDxuZ3Qtc29mdC1zaGFkb3ctbWF0ZXJpYWxcbiAgICAgICAgICAgICAgICAgICAgW3RyYW5zcGFyZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbZGVwdGhXcml0ZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJnZXQoJ2NvbG9yJylcIlxuICAgICAgICAgICAgICAgICAgICBbdG9uZU1hcHBlZF09XCJnZXQoJ3RvbmVNYXBwZWQnKVwiXG4gICAgICAgICAgICAgICAgICAgIFtibGVuZF09XCJnZXQoJ2NvbG9yQmxlbmQnKVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXBdPVwicExNLnByb2dyZXNzaXZlTGlnaHRNYXAyLnRleHR1cmVcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L25ndC1tZXNoPlxuICAgICAgICA8L25ndC1ncm91cD5cbiAgICBgLFxuICAgIGltcG9ydHM6IFtBY2N1bXVsYXRpdmVTaGFkb3dzQ29uc3VtZXJdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGFjY3VtdWxhdGl2ZVNoYWRvd3NBcGlGYWN0b3J5LFxuICAgICAgICAgICAgZGVwczogW05ndHNBY2N1bXVsYXRpdmVTaGFkb3dzXSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3MgZXh0ZW5kcyBOZ3RSeFN0b3JlIHtcbiAgICByZWFkb25seSBudWxsVHJhdmVyc2UgPSAoKSA9PiBudWxsO1xuICAgIHJlYWRvbmx5IE1hdGggPSBNYXRoO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG5cbiAgICByZWFkb25seSBwTE0gPSBuZXcgUHJvZ3Jlc3NpdmVMaWdodE1hcCh0aGlzLnN0b3JlLmdldCgnZ2wnKSwgdGhpcy5zdG9yZS5nZXQoJ3NjZW5lJyksIHRoaXMuZ2V0KCdyZXNvbHV0aW9uJykpO1xuXG4gICAgcmVhZG9ubHkgYWNjdW11bGF0aXZlU2hhZG93c1JlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcbiAgICByZWFkb25seSBtZXNoUmVmID0gaW5qZWN0Tmd0UmVmPFRIUkVFLk1lc2g+KCk7XG5cbiAgICAvKiogSG93IG1hbnkgZnJhbWVzIGl0IGNhbiByZW5kZXIsIG1vcmUgeWllbGRzIGNsZWFuZXIgcmVzdWx0cyBidXQgdGFrZXMgbW9yZSB0aW1lLCA0MCAqL1xuICAgIEBJbnB1dCgpIHNldCBmcmFtZXMoZnJhbWVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmcmFtZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIElmIGZyYW1lcyA9PT0gSW5maW5pdHkgYmxlbmQgY29udHJvbHMgdGhlIHJlZnJlc2ggcmF0aW8sIDEwMCAqL1xuICAgIEBJbnB1dCgpIHNldCBibGVuZChibGVuZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYmxlbmQgfSk7XG4gICAgfVxuXG4gICAgLyoqIENhbiBsaW1pdCB0aGUgYW1vdW50IG9mIGZyYW1lcyByZW5kZXJlZCBpZiBmcmFtZXMgPT09IEluZmluaXR5LCB1c3VhbGx5IHRvIGdldCBzb21lIHBlcmZvcm1hbmNlIGJhY2sgb25jZSBhIG1vdmFibGUgc2NlbmUgaGFzIHNldHRsZWQsIEluZmluaXR5ICovXG4gICAgQElucHV0KCkgc2V0IGxpbWl0KGxpbWl0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBsaW1pdCB9KTtcbiAgICB9XG5cbiAgICAvKiogU2NhbGUgb2YgdGhlIHBsYW5lLCAgKi9cbiAgICBASW5wdXQoKSBzZXQgc2NhbGUoc2NhbGU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHNjYWxlIH0pO1xuICAgIH1cblxuICAgIC8qKiBUZW1wb3JhbCBhY2N1bXVsYXRlcyBzaGFkb3dzIG92ZXIgdGltZSB3aGljaCBpcyBtb3JlIHBlcmZvcm1hbnQgYnV0IGhhcyBhIHZpc3VhbCByZWdyZXNzaW9uIG92ZXIgaW5zdGFudCByZXN1bHRzLCBmYWxzZSAgKi9cbiAgICBASW5wdXQoKSBzZXQgdGVtcG9yYWwodGVtcG9yYWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyB0ZW1wb3JhbCB9KTtcbiAgICB9XG5cbiAgICAvKiogT3BhY2l0eSBvZiB0aGUgcGxhbmUsIDEgKi9cbiAgICBASW5wdXQoKSBzZXQgb3BhY2l0eShvcGFjaXR5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBvcGFjaXR5IH0pO1xuICAgIH1cblxuICAgIC8qKiBEaXNjYXJkcyBhbHBoYSBwaXhlbHMsIDAuNjUgKi9cbiAgICBASW5wdXQoKSBzZXQgYWxwaGFUZXN0KGFscGhhVGVzdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYWxwaGFUZXN0IH0pO1xuICAgIH1cblxuICAgIC8qKiBTaGFkb3cgY29sb3IsIGJsYWNrICovXG4gICAgQElucHV0KCkgc2V0IGNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjb2xvciB9KTtcbiAgICB9XG5cbiAgICAvKiogQ29sb3JibGVuZCwgaG93IG11Y2ggY29sb3JzIHR1cm4gdG8gYmxhY2ssIDAgaXMgYmxhY2ssIDIgKi9cbiAgICBASW5wdXQoKSBzZXQgY29sb3JCbGVuZChjb2xvckJsZW5kOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjb2xvckJsZW5kIH0pO1xuICAgIH1cblxuICAgIC8qKiBCdWZmZXIgcmVzb2x1dGlvbiwgMTAyNCAqL1xuICAgIEBJbnB1dCgpIHNldCByZXNvbHV0aW9uKHJlc29sdXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJlc29sdXRpb24gfSk7XG4gICAgfVxuXG4gICAgLyoqIFRleHR1cmUgdG9uZW1hcHBpbmcgKi9cbiAgICBASW5wdXQoKSBzZXQgdG9uZU1hcHBlZCh0b25lTWFwcGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgdG9uZU1hcHBlZCB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGZyYW1lczogNDAsXG4gICAgICAgICAgICBsaW1pdDogSW5maW5pdHksXG4gICAgICAgICAgICBibGVuZDogMjAsXG4gICAgICAgICAgICBzY2FsZTogMTAsXG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgYWxwaGFUZXN0OiAwLjc1LFxuICAgICAgICAgICAgY29sb3I6ICdibGFjaycsXG4gICAgICAgICAgICBjb2xvckJsZW5kOiAyLFxuICAgICAgICAgICAgcmVzb2x1dGlvbjogMTAyNCxcbiAgICAgICAgICAgIHRvbmVNYXBwZWQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,199 +0,0 @@
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
- export class RandomizedLightsConsumer {
46
- constructor() {
47
- inject(NGTS_RANDOMIZED_LIGHTS_API);
48
- }
49
- }
50
- RandomizedLightsConsumer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RandomizedLightsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive });
51
- RandomizedLightsConsumer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.5", type: RandomizedLightsConsumer, isStandalone: true, selector: "[ngtsRandomizedLightsConsumer]", ngImport: i0 });
52
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: RandomizedLightsConsumer, decorators: [{
53
- type: Directive,
54
- args: [{ selector: '[ngtsRandomizedLightsConsumer]', standalone: true }]
55
- }], ctorParameters: function () { return []; } });
56
- export class NgtsRandomizedLights extends NgtRxStore {
57
- constructor() {
58
- super(...arguments);
59
- this.lightsRef = injectNgtRef();
60
- }
61
- /** How many frames it will jiggle the lights, 1.
62
- * Frames is context aware, if a provider like AccumulativeShadows exists, frames will be taken from there! */
63
- set frames(frames) {
64
- this.set({ frames });
65
- }
66
- /** Light position, [0, 0, 0] */
67
- set position(position) {
68
- this.set({ position });
69
- }
70
- /** Radius of the jiggle, higher values make softer light, 5 */
71
- set radius(radius) {
72
- this.set({ radius });
73
- }
74
- /** Amount of lights, 8 */
75
- set amount(amount) {
76
- this.set({ amount });
77
- }
78
- /** Light intensity, 1 */
79
- set intensity(intensity) {
80
- this.set({ intensity });
81
- }
82
- /** Ambient occlusion, lower values mean less AO, hight more, you can mix AO and directional light, 0.5 */
83
- set ambient(ambient) {
84
- this.set({ ambient });
85
- }
86
- /** If the lights cast shadows, this is true by default */
87
- set castShadow(castShadow) {
88
- this.set({ castShadow });
89
- }
90
- /** Default shadow bias, 0 */
91
- set bias(bias) {
92
- this.set({ bias });
93
- }
94
- /** Default map size, 512 */
95
- set mapSize(mapSize) {
96
- this.set({ mapSize });
97
- }
98
- /** Default size of the shadow camera, 10 */
99
- set size(size) {
100
- this.set({ size });
101
- }
102
- /** Default shadow camera near, 0.5 */
103
- set near(near) {
104
- this.set({ near });
105
- }
106
- /** Default shadow camera far, 500 */
107
- set far(far) {
108
- this.set({ far });
109
- }
110
- initialize() {
111
- super.initialize();
112
- this.set({
113
- castShadow: true,
114
- bias: 0.001,
115
- mapSize: 512,
116
- size: 5,
117
- near: 0.5,
118
- far: 500,
119
- frames: 1,
120
- position: [0, 0, 0],
121
- radius: 1,
122
- amount: 8,
123
- intensity: 1,
124
- ambient: 0.5,
125
- });
126
- this.connect('cameraArgs', this.select(['size', 'near', 'far'], ({ size, near, far }) => [-size, size, size, -size, near, far]));
127
- this.connect('length', this.select(['position'], ({ position }) => new THREE.Vector3(...position).length()));
128
- }
129
- }
130
- NgtsRandomizedLights.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: NgtsRandomizedLights, deps: null, target: i0.ɵɵFactoryTarget.Component });
131
- NgtsRandomizedLights.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", 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
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: NgtsRandomizedLights, decorators: [{
148
- type: Component,
149
- args: [{
150
- selector: 'ngts-randomized-lights',
151
- standalone: true,
152
- template: `
153
- <ngt-group ngtCompound [ref]="lightsRef">
154
- <ngt-directional-light
155
- *ngFor="let i; repeat: get('amount')"
156
- [castShadow]="get('castShadow')"
157
- [intensity]="get('intensity') / get('amount')"
158
- >
159
- <ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
160
- <ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
161
- <ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
162
- </ngt-directional-light>
163
- <ng-container ngtsRandomizedLightsConsumer />
164
- </ngt-group>
165
- `,
166
- imports: [RandomizedLightsConsumer, NgtArgs, NgtRepeat],
167
- providers: [
168
- { provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
169
- ],
170
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
171
- }]
172
- }], propDecorators: { lightsRef: [{
173
- type: Input
174
- }], frames: [{
175
- type: Input
176
- }], position: [{
177
- type: Input
178
- }], radius: [{
179
- type: Input
180
- }], amount: [{
181
- type: Input
182
- }], intensity: [{
183
- type: Input
184
- }], ambient: [{
185
- type: Input
186
- }], castShadow: [{
187
- type: Input
188
- }], bias: [{
189
- type: Input
190
- }], mapSize: [{
191
- type: Input
192
- }], size: [{
193
- type: Input
194
- }], near: [{
195
- type: Input
196
- }], far: [{
197
- type: Input
198
- }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9taXplZC1saWdodHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RSxPQUFPLEVBQW1DLDZCQUE2QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRXhHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDN0IsQ0FBQztBQUVGLFNBQVMsMEJBQTBCLENBQUMsZ0JBQXNDO0lBQ3RFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLEtBQXlDLENBQUM7UUFDOUMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzFDLEtBQUssSUFB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c0JBQWxCLEtBQUs7Z0JBS08sUUFBUTtzQkFBcEIsS0FBSztnQkFLTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLE1BQU07c0JBQWxCLEtBQUs7Z0JBS08sU0FBUztzQkFBckIsS0FBSztnQkFLTyxPQUFPO3NCQUFuQixLQUFLO2dCQUtPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBS08sSUFBSTtzQkFBaEIsS0FBSztnQkFLTyxPQUFPO3NCQUFuQixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sSUFBSTtzQkFBaEIsS0FBSztnQkFLTyxHQUFHO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIERpcmVjdGl2ZSwgaW5qZWN0LCBJbmplY3Rpb25Ub2tlbiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0Tmd0UmVmLCBOZ3RBcmdzLCBOZ3RSZXBlYXQsIE5ndFJ4U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IERpcmVjdGlvbmFsTGlnaHQsIEdyb3VwLCBPcnRob2dyYXBoaWNDYW1lcmEsIFZlY3RvcjIgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RzQWNjdW11bGF0aXZlU2hhZG93c0xpZ2h0QXBpLCBOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSB9IGZyb20gJy4vYWNjdW11bGF0aXZlLXNoYWRvd3MnO1xuXG5leHRlbmQoeyBHcm91cCwgRGlyZWN0aW9uYWxMaWdodCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBWZWN0b3IyIH0pO1xuXG5leHBvcnQgY29uc3QgTkdUU19SQU5ET01JWkVEX0xJR0hUU19BUEkgPSBuZXcgSW5qZWN0aW9uVG9rZW48Tmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaT4oXG4gICAgJ05ndHNSYW5kb21pemVkTGlnaHRzIEFQSSdcbik7XG5cbmZ1bmN0aW9uIHJhbmRvbWl6ZWRMaWdodHNBcGlGYWN0b3J5KHJhbmRvbWl6ZWRMaWdodHM6IE5ndHNSYW5kb21pemVkTGlnaHRzKSB7XG4gICAgY29uc3QgYWNjdW11bGF0aXZlQXBpID0gaW5qZWN0KE5HVFNfQUNDVU1VTEFUSVZFX1NIQURPV1NfQVBJKTtcblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgbGV0IGxpZ2h0OiBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCByYW5kb21pemVkTGlnaHRzLmxpZ2h0c1JlZi5uYXRpdmVFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgbCsrKSB7XG4gICAgICAgICAgICAgICAgbGlnaHQgPSByYW5kb21pemVkTGlnaHRzLmxpZ2h0c1JlZi5uYXRpdmVFbGVtZW50LmNoaWxkcmVuW2xdIGFzIFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQ7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPiByYW5kb21pemVkTGlnaHRzLmdldCgnYW1iaWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcmFuZG9taXplZExpZ2h0cy5nZXQoJ3Bvc2l0aW9uJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGl1cyA9IHJhbmRvbWl6ZWRMaWdodHMuZ2V0KCdyYWRpdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQucG9zaXRpb24uc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25bMF0gKyBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKHJhZGl1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblsxXSArIFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQocmFkaXVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWzJdICsgVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZChyYWRpdXMpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFtYmRhID0gTWF0aC5hY29zKDIgKiBNYXRoLnJhbmRvbSgpIC0gMSkgLSBNYXRoLlBJIC8gMi4wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaGkgPSAyICogTWF0aC5QSSAqIE1hdGgucmFuZG9tKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJhbmRvbWl6ZWRMaWdodHMuZ2V0KCdsZW5ndGgnKTtcbiAgICAgICAgICAgICAgICAgICAgbGlnaHQucG9zaXRpb24uc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jb3MobGFtYmRhKSAqIE1hdGguY29zKHBoaSkgKiBsZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmFicyhNYXRoLmNvcyhsYW1iZGEpICogTWF0aC5zaW4ocGhpKSAqIGxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihsYW1iZGEpICogbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGFwaSA9IHsgdXBkYXRlIH0gYXMgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaTtcblxuICAgIHJhbmRvbWl6ZWRMaWdodHMuZWZmZWN0KFxuICAgICAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgIHJhbmRvbWl6ZWRMaWdodHMubGlnaHRzUmVmLiQsXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgncG9zaXRpb24nKSxcbiAgICAgICAgICAgIHJhbmRvbWl6ZWRMaWdodHMuc2VsZWN0KCdyYWRpdXMnKSxcbiAgICAgICAgICAgIHJhbmRvbWl6ZWRMaWdodHMuc2VsZWN0KCdsZW5ndGgnKSxcbiAgICAgICAgICAgIHJhbmRvbWl6ZWRMaWdodHMuc2VsZWN0KCdhbWJpZW50JyksXG4gICAgICAgIF0pLFxuICAgICAgICAoW2dyb3VwXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGl2ZUFwaSkgYWNjdW11bGF0aXZlQXBpLmxpZ2h0cy5zZXQoZ3JvdXAudXVpZCwgYXBpKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiBhY2N1bXVsYXRpdmVBcGkubGlnaHRzLmRlbGV0ZShncm91cC51dWlkKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gYXBpO1xufVxuXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmd0c1JhbmRvbWl6ZWRMaWdodHNDb25zdW1lcl0nLCBzdGFuZGFsb25lOiB0cnVlIH0pXG5leHBvcnQgY2xhc3MgUmFuZG9taXplZExpZ2h0c0NvbnN1bWVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaW5qZWN0KE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJKTtcbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cy1yYW5kb21pemVkLWxpZ2h0cycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8bmd0LWdyb3VwIG5ndENvbXBvdW5kIFtyZWZdPVwibGlnaHRzUmVmXCI+XG4gICAgICAgICAgICA8bmd0LWRpcmVjdGlvbmFsLWxpZ2h0XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGk7IHJlcGVhdDogZ2V0KCdhbW91bnQnKVwiXG4gICAgICAgICAgICAgICAgW2Nhc3RTaGFkb3ddPVwiZ2V0KCdjYXN0U2hhZG93JylcIlxuICAgICAgICAgICAgICAgIFtpbnRlbnNpdHldPVwiZ2V0KCdpbnRlbnNpdHknKSAvIGdldCgnYW1vdW50JylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZ3QtdmFsdWUgW3Jhd1ZhbHVlXT1cImdldCgnYmlhcycpXCIgYXR0YWNoPVwic2hhZG93LmJpYXNcIiAvPlxuICAgICAgICAgICAgICAgIDxuZ3QtdmVjdG9yMiAqYXJncz1cIltnZXQoJ21hcFNpemUnKSwgZ2V0KCdtYXBTaXplJyldXCIgYXR0YWNoPVwic2hhZG93Lm1hcFNpemVcIiAvPlxuICAgICAgICAgICAgICAgIDxuZ3Qtb3J0aG9ncmFwaGljLWNhbWVyYSAqYXJncz1cImdldCgnY2FtZXJhQXJncycpXCIgYXR0YWNoPVwic2hhZG93LmNhbWVyYVwiIC8+XG4gICAgICAgICAgICA8L25ndC1kaXJlY3Rpb25hbC1saWdodD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgbmd0c1JhbmRvbWl6ZWRMaWdodHNDb25zdW1lciAvPlxuICAgICAgICA8L25ndC1ncm91cD5cbiAgICBgLFxuICAgIGltcG9ydHM6IFtSYW5kb21pemVkTGlnaHRzQ29uc3VtZXIsIE5ndEFyZ3MsIE5ndFJlcGVhdF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogTkdUU19SQU5ET01JWkVEX0xJR0hUU19BUEksIHVzZUZhY3Rvcnk6IHJhbmRvbWl6ZWRMaWdodHNBcGlGYWN0b3J5LCBkZXBzOiBbTmd0c1JhbmRvbWl6ZWRMaWdodHNdIH0sXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNSYW5kb21pemVkTGlnaHRzIGV4dGVuZHMgTmd0UnhTdG9yZSB7XG4gICAgQElucHV0KCkgbGlnaHRzUmVmID0gaW5qZWN0Tmd0UmVmPFRIUkVFLkdyb3VwPigpO1xuICAgIC8qKiBIb3cgbWFueSBmcmFtZXMgaXQgd2lsbCBqaWdnbGUgdGhlIGxpZ2h0cywgMS5cbiAgICAgKiAgRnJhbWVzIGlzIGNvbnRleHQgYXdhcmUsIGlmIGEgcHJvdmlkZXIgbGlrZSBBY2N1bXVsYXRpdmVTaGFkb3dzIGV4aXN0cywgZnJhbWVzIHdpbGwgYmUgdGFrZW4gZnJvbSB0aGVyZSEgICovXG4gICAgQElucHV0KCkgc2V0IGZyYW1lcyhmcmFtZXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGZyYW1lcyB9KTtcbiAgICB9XG5cbiAgICAvKiogTGlnaHQgcG9zaXRpb24sIFswLCAwLCAwXSAqL1xuICAgIEBJbnB1dCgpIHNldCBwb3NpdGlvbihwb3NpdGlvbjogW3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJdKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcG9zaXRpb24gfSk7XG4gICAgfVxuXG4gICAgLyoqIFJhZGl1cyBvZiB0aGUgamlnZ2xlLCBoaWdoZXIgdmFsdWVzIG1ha2Ugc29mdGVyIGxpZ2h0LCA1ICovXG4gICAgQElucHV0KCkgc2V0IHJhZGl1cyhyYWRpdXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJhZGl1cyB9KTtcbiAgICB9XG5cbiAgICAvKiogQW1vdW50IG9mIGxpZ2h0cywgOCAqL1xuICAgIEBJbnB1dCgpIHNldCBhbW91bnQoYW1vdW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBhbW91bnQgfSk7XG4gICAgfVxuXG4gICAgLyoqIExpZ2h0IGludGVuc2l0eSwgMSAqL1xuICAgIEBJbnB1dCgpIHNldCBpbnRlbnNpdHkoaW50ZW5zaXR5OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBpbnRlbnNpdHkgfSk7XG4gICAgfVxuXG4gICAgLyoqIEFtYmllbnQgb2NjbHVzaW9uLCBsb3dlciB2YWx1ZXMgbWVhbiBsZXNzIEFPLCBoaWdodCBtb3JlLCB5b3UgY2FuIG1peCBBTyBhbmQgZGlyZWN0aW9uYWwgbGlnaHQsIDAuNSAqL1xuICAgIEBJbnB1dCgpIHNldCBhbWJpZW50KGFtYmllbnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGFtYmllbnQgfSk7XG4gICAgfVxuXG4gICAgLyoqIElmIHRoZSBsaWdodHMgY2FzdCBzaGFkb3dzLCB0aGlzIGlzIHRydWUgYnkgZGVmYXVsdCAqL1xuICAgIEBJbnB1dCgpIHNldCBjYXN0U2hhZG93KGNhc3RTaGFkb3c6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjYXN0U2hhZG93IH0pO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IHNoYWRvdyBiaWFzLCAwICovXG4gICAgQElucHV0KCkgc2V0IGJpYXMoYmlhczogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYmlhcyB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBtYXAgc2l6ZSwgNTEyICovXG4gICAgQElucHV0KCkgc2V0IG1hcFNpemUobWFwU2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbWFwU2l6ZSB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaXplIG9mIHRoZSBzaGFkb3cgY2FtZXJhLCAxMCAqL1xuICAgIEBJbnB1dCgpIHNldCBzaXplKHNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHNpemUgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgc2hhZG93IGNhbWVyYSBuZWFyLCAwLjUgKi9cbiAgICBASW5wdXQoKSBzZXQgbmVhcihuZWFyOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBuZWFyIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IHNoYWRvdyBjYW1lcmEgZmFyLCA1MDAgKi9cbiAgICBASW5wdXQoKSBzZXQgZmFyKGZhcjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZmFyIH0pO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGluaXRpYWxpemUoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICAgICAgdGhpcy5zZXQoe1xuICAgICAgICAgICAgY2FzdFNoYWRvdzogdHJ1ZSxcbiAgICAgICAgICAgIGJpYXM6IDAuMDAxLFxuICAgICAgICAgICAgbWFwU2l6ZTogNTEyLFxuICAgICAgICAgICAgc2l6ZTogNSxcbiAgICAgICAgICAgIG5lYXI6IDAuNSxcbiAgICAgICAgICAgIGZhcjogNTAwLFxuICAgICAgICAgICAgZnJhbWVzOiAxLFxuICAgICAgICAgICAgcG9zaXRpb246IFswLCAwLCAwXSxcbiAgICAgICAgICAgIHJhZGl1czogMSxcbiAgICAgICAgICAgIGFtb3VudDogOCxcbiAgICAgICAgICAgIGludGVuc2l0eTogMSxcbiAgICAgICAgICAgIGFtYmllbnQ6IDAuNSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdjYW1lcmFBcmdzJyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KFsnc2l6ZScsICduZWFyJywgJ2ZhciddLCAoeyBzaXplLCBuZWFyLCBmYXIgfSkgPT4gWy1zaXplLCBzaXplLCBzaXplLCAtc2l6ZSwgbmVhciwgZmFyXSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jb25uZWN0KFxuICAgICAgICAgICAgJ2xlbmd0aCcsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChbJ3Bvc2l0aW9uJ10sICh7IHBvc2l0aW9uIH0pID0+IG5ldyBUSFJFRS5WZWN0b3IzKC4uLnBvc2l0aW9uKS5sZW5ndGgoKSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=