angular-three-soba 2.0.0-beta.26 → 2.0.0-beta.261

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 (397) hide show
  1. package/README.md +62 -4
  2. package/abstractions/README.md +278 -2
  3. package/abstractions/index.d.ts +11 -6
  4. package/abstractions/lib/catmull-rom-line.d.ts +648 -0
  5. package/abstractions/lib/cubic-bezier-line.d.ts +19 -0
  6. package/abstractions/lib/edges.d.ts +850 -0
  7. package/abstractions/lib/gradient-texture.d.ts +24 -0
  8. package/abstractions/lib/grid.d.ts +339 -0
  9. package/abstractions/lib/helper.d.ts +25 -0
  10. package/abstractions/lib/line.d.ts +41 -0
  11. package/abstractions/lib/prism-geometry.d.ts +30 -0
  12. package/abstractions/lib/quadratic-bezier-line.d.ts +21 -0
  13. package/abstractions/lib/text-3d.d.ts +338 -0
  14. package/abstractions/lib/text.d.ts +55 -0
  15. package/cameras/README.md +91 -2
  16. package/cameras/index.d.ts +4 -4
  17. package/cameras/lib/camera-content.d.ts +10 -0
  18. package/cameras/lib/cube-camera.d.ts +38 -0
  19. package/cameras/lib/orthographic-camera.d.ts +40 -0
  20. package/cameras/lib/perspective-camera.d.ts +36 -0
  21. package/controls/README.md +95 -2
  22. package/controls/index.d.ts +2 -1
  23. package/controls/lib/camera-controls.d.ts +31 -0
  24. package/controls/lib/orbit-controls.d.ts +38 -0
  25. package/esm2022/abstractions/index.mjs +12 -7
  26. package/esm2022/abstractions/lib/catmull-rom-line.mjs +76 -0
  27. package/esm2022/abstractions/lib/cubic-bezier-line.mjs +51 -0
  28. package/esm2022/abstractions/lib/edges.mjs +70 -0
  29. package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
  30. package/esm2022/abstractions/lib/grid.mjs +103 -0
  31. package/esm2022/abstractions/lib/helper.mjs +80 -0
  32. package/esm2022/abstractions/lib/line.mjs +123 -0
  33. package/esm2022/abstractions/lib/prism-geometry.mjs +55 -0
  34. package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +73 -0
  35. package/esm2022/abstractions/lib/text-3d.mjs +98 -0
  36. package/esm2022/abstractions/lib/text.mjs +92 -0
  37. package/esm2022/cameras/index.mjs +5 -5
  38. package/esm2022/cameras/lib/camera-content.mjs +14 -0
  39. package/esm2022/cameras/lib/cube-camera.mjs +111 -0
  40. package/esm2022/cameras/lib/orthographic-camera.mjs +131 -0
  41. package/esm2022/cameras/lib/perspective-camera.mjs +104 -0
  42. package/esm2022/controls/index.mjs +3 -2
  43. package/esm2022/controls/lib/camera-controls.mjs +127 -0
  44. package/esm2022/controls/lib/orbit-controls.mjs +126 -0
  45. package/esm2022/loaders/index.mjs +6 -5
  46. package/esm2022/loaders/lib/font-loader.mjs +49 -0
  47. package/esm2022/loaders/lib/gltf-loader.mjs +33 -0
  48. package/esm2022/loaders/lib/loader.mjs +109 -0
  49. package/esm2022/loaders/lib/progress.mjs +51 -0
  50. package/esm2022/loaders/lib/texture-loader.mjs +32 -0
  51. package/esm2022/materials/index.mjs +7 -7
  52. package/esm2022/materials/lib/custom-shader-material.mjs +71 -0
  53. package/esm2022/materials/lib/mesh-distort-material.mjs +42 -0
  54. package/esm2022/materials/lib/mesh-reflector-material.mjs +278 -0
  55. package/esm2022/materials/lib/mesh-refraction-material.mjs +144 -0
  56. package/esm2022/materials/lib/mesh-transmission-material.mjs +188 -0
  57. package/esm2022/materials/lib/mesh-wobble-material.mjs +42 -0
  58. package/esm2022/misc/index.mjs +10 -14
  59. package/esm2022/misc/lib/animations.mjs +74 -0
  60. package/esm2022/misc/lib/bake-shadows.mjs +26 -0
  61. package/esm2022/misc/lib/computed-attribute.mjs +56 -0
  62. package/esm2022/misc/lib/constants.mjs +5 -0
  63. package/esm2022/misc/lib/decal.mjs +135 -0
  64. package/esm2022/misc/lib/deprecated.mjs +15 -0
  65. package/esm2022/misc/lib/depth-buffer.mjs +39 -0
  66. package/esm2022/misc/lib/fbo.mjs +89 -0
  67. package/esm2022/misc/lib/sampler.mjs +121 -0
  68. package/esm2022/shaders/index.mjs +3 -18
  69. package/esm2022/shaders/lib/grid-material.mjs +81 -0
  70. package/esm2022/shaders/lib/mesh-refraction-material.mjs +163 -0
  71. package/esm2022/staging/index.mjs +19 -22
  72. package/esm2022/staging/lib/accumulative-shadows.mjs +182 -0
  73. package/esm2022/staging/lib/backdrop.mjs +73 -0
  74. package/esm2022/staging/lib/bb-anchor.mjs +58 -0
  75. package/esm2022/staging/lib/bounds.mjs +286 -0
  76. package/esm2022/staging/lib/camera-shake.mjs +69 -0
  77. package/esm2022/staging/lib/caustics.mjs +188 -0
  78. package/esm2022/staging/lib/center.mjs +113 -0
  79. package/esm2022/staging/lib/contact-shadows.mjs +201 -0
  80. package/esm2022/staging/lib/environment.mjs +465 -0
  81. package/esm2022/staging/lib/float.mjs +60 -0
  82. package/esm2022/staging/lib/lightformer.mjs +107 -0
  83. package/esm2022/staging/lib/matcap-texture.mjs +81 -0
  84. package/esm2022/staging/lib/normal-texture.mjs +85 -0
  85. package/esm2022/staging/lib/randomized-lights.mjs +104 -0
  86. package/esm2022/staging/lib/render-texture.mjs +213 -0
  87. package/esm2022/staging/lib/sky.mjs +86 -0
  88. package/esm2022/staging/lib/spot-light.mjs +450 -0
  89. package/esm2022/staging/lib/stage.mjs +236 -0
  90. package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
  91. package/esm2022/vanilla-exports/index.mjs +3 -0
  92. package/fesm2022/angular-three-soba-abstractions.mjs +739 -718
  93. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  94. package/fesm2022/angular-three-soba-cameras.mjs +260 -307
  95. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  96. package/fesm2022/angular-three-soba-controls.mjs +174 -110
  97. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  98. package/fesm2022/angular-three-soba-loaders.mjs +151 -129
  99. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  100. package/fesm2022/angular-three-soba-materials.mjs +511 -764
  101. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  102. package/fesm2022/angular-three-soba-misc.mjs +405 -2149
  103. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  104. package/fesm2022/angular-three-soba-shaders.mjs +33 -1373
  105. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  106. package/fesm2022/angular-three-soba-staging.mjs +2329 -3538
  107. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  108. package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
  109. package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
  110. package/loaders/README.md +130 -2
  111. package/loaders/index.d.ts +5 -4
  112. package/loaders/lib/font-loader.d.ts +27 -0
  113. package/loaders/lib/gltf-loader.d.ts +21 -0
  114. package/loaders/lib/loader.d.ts +29 -0
  115. package/loaders/lib/progress.d.ts +9 -0
  116. package/loaders/lib/texture-loader.d.ts +13 -0
  117. package/materials/README.md +160 -2
  118. package/materials/index.d.ts +6 -6
  119. package/materials/lib/custom-shader-material.d.ts +19 -0
  120. package/materials/lib/mesh-distort-material.d.ts +18 -0
  121. package/materials/lib/mesh-reflector-material.d.ts +50 -0
  122. package/materials/lib/mesh-refraction-material.d.ts +42 -0
  123. package/materials/lib/mesh-transmission-material.d.ts +77 -0
  124. package/materials/lib/mesh-wobble-material.d.ts +15 -0
  125. package/metadata.json +1 -1
  126. package/misc/README.md +217 -2
  127. package/misc/index.d.ts +9 -13
  128. package/misc/lib/animations.d.ts +14 -0
  129. package/misc/lib/computed-attribute.d.ts +69 -0
  130. package/misc/lib/constants.d.ts +1 -0
  131. package/misc/lib/decal.d.ts +27 -0
  132. package/misc/lib/deprecated.d.ts +14 -0
  133. package/misc/lib/depth-buffer.d.ts +8 -0
  134. package/misc/lib/fbo.d.ts +47 -0
  135. package/misc/lib/sampler.d.ts +73 -0
  136. package/package.json +60 -38
  137. package/shaders/index.d.ts +2 -17
  138. package/shaders/lib/grid-material.d.ts +69 -0
  139. package/shaders/lib/mesh-refraction-material.d.ts +11 -0
  140. package/staging/README.md +472 -2
  141. package/staging/index.d.ts +18 -21
  142. package/staging/lib/accumulative-shadows.d.ts +75 -0
  143. package/staging/lib/backdrop.d.ts +22 -0
  144. package/staging/lib/bb-anchor.d.ts +17 -0
  145. package/staging/lib/bounds.d.ts +47 -0
  146. package/staging/lib/camera-shake.d.ts +29 -0
  147. package/staging/lib/caustics.d.ts +53 -0
  148. package/staging/lib/center.d.ts +422 -0
  149. package/staging/lib/contact-shadows.d.ts +45 -0
  150. package/staging/lib/environment.d.ts +159 -0
  151. package/staging/lib/float.d.ts +19 -0
  152. package/staging/lib/lightformer.d.ts +334 -0
  153. package/staging/lib/matcap-texture.d.ts +32 -0
  154. package/staging/lib/normal-texture.d.ts +37 -0
  155. package/staging/lib/randomized-lights.d.ts +54 -0
  156. package/staging/lib/render-texture.d.ts +64 -0
  157. package/staging/lib/sky.d.ts +32 -0
  158. package/staging/lib/spot-light.d.ts +120 -0
  159. package/staging/lib/stage.d.ts +376 -0
  160. package/vanilla-exports/README.md +3 -0
  161. package/vanilla-exports/index.d.ts +27 -0
  162. package/web-types.json +1 -1
  163. package/abstractions/billboard/billboard.d.ts +0 -28
  164. package/abstractions/detailed/detailed.d.ts +0 -26
  165. package/abstractions/edges/edges.d.ts +0 -34
  166. package/abstractions/grid/grid.d.ts +0 -50
  167. package/abstractions/text/text.d.ts +0 -82
  168. package/abstractions/text-3d/text-3d.d.ts +0 -84
  169. package/assets/distort.vert.glsl +0 -1
  170. package/cameras/camera/camera-content.d.ts +0 -13
  171. package/cameras/camera/camera.d.ts +0 -26
  172. package/cameras/cube-camera/cube-camera.d.ts +0 -69
  173. package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
  174. package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
  175. package/controls/orbit-controls/orbit-controls.d.ts +0 -54
  176. package/esm2022/abstractions/billboard/billboard.mjs +0 -74
  177. package/esm2022/abstractions/detailed/detailed.mjs +0 -64
  178. package/esm2022/abstractions/edges/edges.mjs +0 -88
  179. package/esm2022/abstractions/grid/grid.mjs +0 -180
  180. package/esm2022/abstractions/text/text.mjs +0 -274
  181. package/esm2022/abstractions/text-3d/text-3d.mjs +0 -172
  182. package/esm2022/cameras/camera/camera-content.mjs +0 -21
  183. package/esm2022/cameras/camera/camera.mjs +0 -77
  184. package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
  185. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
  186. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
  187. package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -185
  188. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
  189. package/esm2022/gizmos/gizmo-helper/gizmo-helper.mjs +0 -197
  190. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  191. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -93
  192. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -150
  193. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.mjs +0 -66
  194. package/esm2022/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -71
  195. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
  196. package/esm2022/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -272
  197. package/esm2022/gizmos/index.mjs +0 -4
  198. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
  199. package/esm2022/loaders/loader/loader.mjs +0 -138
  200. package/esm2022/loaders/progress/progress.mjs +0 -52
  201. package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
  202. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
  203. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
  204. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
  205. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
  206. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  207. package/esm2022/materials/point-material/point-material.mjs +0 -50
  208. package/esm2022/misc/animations/animations.mjs +0 -59
  209. package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
  210. package/esm2022/misc/caustics/caustics.mjs +0 -387
  211. package/esm2022/misc/decal/decal.mjs +0 -187
  212. package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
  213. package/esm2022/misc/example/example.mjs +0 -160
  214. package/esm2022/misc/fbo/fbo.mjs +0 -47
  215. package/esm2022/misc/html/html-wrapper.mjs +0 -478
  216. package/esm2022/misc/html/html.mjs +0 -304
  217. package/esm2022/misc/sampler/sampler.mjs +0 -142
  218. package/esm2022/misc/shadow/shadow.mjs +0 -111
  219. package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
  220. package/esm2022/misc/trail/trail.mjs +0 -209
  221. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
  222. package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
  223. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
  224. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
  225. package/esm2022/modifiers/index.mjs +0 -2
  226. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
  227. package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
  228. package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
  229. package/esm2022/performances/index.mjs +0 -8
  230. package/esm2022/performances/instances/instances.mjs +0 -220
  231. package/esm2022/performances/instances/position-mesh.mjs +0 -52
  232. package/esm2022/performances/points/points-input.mjs +0 -64
  233. package/esm2022/performances/points/points.mjs +0 -326
  234. package/esm2022/performances/points/position-point.mjs +0 -54
  235. package/esm2022/performances/segments/segment-object.mjs +0 -9
  236. package/esm2022/performances/segments/segments.mjs +0 -182
  237. package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
  238. package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
  239. package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
  240. package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
  241. package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
  242. package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
  243. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
  244. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  245. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
  246. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  247. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  248. package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
  249. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
  250. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
  251. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
  252. package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
  253. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
  254. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
  255. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
  256. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
  257. package/esm2022/staging/backdrop/backdrop.mjs +0 -77
  258. package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -69
  259. package/esm2022/staging/bounds/bounds.mjs +0 -308
  260. package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
  261. package/esm2022/staging/center/center.mjs +0 -165
  262. package/esm2022/staging/cloud/cloud.mjs +0 -158
  263. package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
  264. package/esm2022/staging/environment/assets.mjs +0 -13
  265. package/esm2022/staging/environment/environment-cube.mjs +0 -47
  266. package/esm2022/staging/environment/environment-ground.mjs +0 -41
  267. package/esm2022/staging/environment/environment-input.mjs +0 -119
  268. package/esm2022/staging/environment/environment-map.mjs +0 -53
  269. package/esm2022/staging/environment/environment-portal.mjs +0 -113
  270. package/esm2022/staging/environment/environment.mjs +0 -61
  271. package/esm2022/staging/environment/utils.mjs +0 -106
  272. package/esm2022/staging/float/float.mjs +0 -94
  273. package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
  274. package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
  275. package/esm2022/staging/sky/sky.mjs +0 -119
  276. package/esm2022/staging/sparkles/sparkles.mjs +0 -164
  277. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
  278. package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
  279. package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
  280. package/esm2022/staging/spot-light/spot-light.mjs +0 -81
  281. package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
  282. package/esm2022/staging/stage/stage.mjs +0 -389
  283. package/esm2022/staging/stars/stars.mjs +0 -147
  284. package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
  285. package/esm2022/staging/wireframe/wireframe.mjs +0 -228
  286. package/esm2022/utils/angular-three-soba-utils.mjs +0 -5
  287. package/esm2022/utils/content/content.mjs +0 -15
  288. package/esm2022/utils/index.mjs +0 -2
  289. package/fesm2022/angular-three-soba-gizmos.mjs +0 -1043
  290. package/fesm2022/angular-three-soba-gizmos.mjs.map +0 -1
  291. package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
  292. package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
  293. package/fesm2022/angular-three-soba-performances.mjs +0 -956
  294. package/fesm2022/angular-three-soba-performances.mjs.map +0 -1
  295. package/fesm2022/angular-three-soba-utils.mjs +0 -22
  296. package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
  297. package/gizmos/README.md +0 -3
  298. package/gizmos/gizmo-helper/gizmo-helper.d.ts +0 -69
  299. package/gizmos/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
  300. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -22
  301. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -29
  302. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube-input.d.ts +0 -33
  303. package/gizmos/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -10
  304. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -40
  305. package/gizmos/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -30
  306. package/gizmos/index.d.ts +0 -3
  307. package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
  308. package/loaders/loader/loader.d.ts +0 -33
  309. package/loaders/progress/progress.d.ts +0 -9
  310. package/loaders/texture-loader/texture-loader.d.ts +0 -7
  311. package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
  312. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
  313. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
  314. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
  315. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
  316. package/materials/point-material/point-material.d.ts +0 -24
  317. package/misc/animations/animations.d.ts +0 -15
  318. package/misc/caustics/caustics.d.ts +0 -87
  319. package/misc/decal/decal.d.ts +0 -49
  320. package/misc/depth-buffer/depth-buffer.d.ts +0 -9
  321. package/misc/example/example.d.ts +0 -81
  322. package/misc/fbo/fbo.d.ts +0 -17
  323. package/misc/html/html-wrapper.d.ts +0 -559
  324. package/misc/html/html.d.ts +0 -214
  325. package/misc/sampler/sampler.d.ts +0 -67
  326. package/misc/shadow/shadow.d.ts +0 -37
  327. package/misc/stats-gl/stats-gl.d.ts +0 -24
  328. package/misc/trail/trail.d.ts +0 -57
  329. package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
  330. package/misc/trail-texture/trail-texture.d.ts +0 -50
  331. package/modifiers/README.md +0 -3
  332. package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
  333. package/modifiers/index.d.ts +0 -1
  334. package/performances/README.md +0 -3
  335. package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
  336. package/performances/adaptive-events/adaptive-events.d.ts +0 -9
  337. package/performances/index.d.ts +0 -7
  338. package/performances/instances/instances.d.ts +0 -79
  339. package/performances/instances/position-mesh.d.ts +0 -10
  340. package/performances/points/points-input.d.ts +0 -32
  341. package/performances/points/points.d.ts +0 -92
  342. package/performances/points/position-point.d.ts +0 -11
  343. package/performances/segments/segment-object.d.ts +0 -7
  344. package/performances/segments/segments.d.ts +0 -124
  345. package/shaders/blur-pass/blur-pass.d.ts +0 -23
  346. package/shaders/caustics/caustics-material.d.ts +0 -4
  347. package/shaders/caustics/caustics-projection-material.d.ts +0 -4
  348. package/shaders/convolution-material/convolution-material.d.ts +0 -7
  349. package/shaders/discard-material/discard-material.d.ts +0 -3
  350. package/shaders/grid-material/grid-material.d.ts +0 -37
  351. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
  352. package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
  353. package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
  354. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
  355. package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
  356. package/shaders/shader-material/shader-material.d.ts +0 -6
  357. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
  358. package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
  359. package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
  360. package/shaders/star-field-material/star-field-material.d.ts +0 -13
  361. package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
  362. package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
  363. package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
  364. package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
  365. package/staging/backdrop/backdrop.d.ts +0 -30
  366. package/staging/bb-anchor/bb-anchor.d.ts +0 -27
  367. package/staging/bounds/bounds.d.ts +0 -134
  368. package/staging/camera-shake/camera-shake.d.ts +0 -43
  369. package/staging/center/center.d.ts +0 -70
  370. package/staging/cloud/cloud.d.ts +0 -51
  371. package/staging/contact-shadows/contact-shadows.d.ts +0 -70
  372. package/staging/environment/assets.d.ts +0 -13
  373. package/staging/environment/environment-cube.d.ts +0 -15
  374. package/staging/environment/environment-ground.d.ts +0 -13
  375. package/staging/environment/environment-input.d.ts +0 -68
  376. package/staging/environment/environment-map.d.ts +0 -16
  377. package/staging/environment/environment-portal.d.ts +0 -18
  378. package/staging/environment/environment.d.ts +0 -8
  379. package/staging/environment/utils.d.ts +0 -7
  380. package/staging/float/float.d.ts +0 -31
  381. package/staging/matcap-texture/matcap-texture.d.ts +0 -13
  382. package/staging/normal-texture/normal-texture.d.ts +0 -16
  383. package/staging/sky/sky.d.ts +0 -48
  384. package/staging/sparkles/sparkles.d.ts +0 -63
  385. package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
  386. package/staging/spot-light/shadow-mesh.d.ts +0 -37
  387. package/staging/spot-light/spot-light-input.d.ts +0 -38
  388. package/staging/spot-light/spot-light.d.ts +0 -39
  389. package/staging/spot-light/volumetric-mesh.d.ts +0 -24
  390. package/staging/stage/stage.d.ts +0 -130
  391. package/staging/stars/stars.d.ts +0 -45
  392. package/staging/wireframe/wireframe-input.d.ts +0 -65
  393. package/staging/wireframe/wireframe.d.ts +0 -28
  394. package/utils/README.md +0 -3
  395. package/utils/content/content.d.ts +0 -8
  396. package/utils/index.d.ts +0 -1
  397. /package/misc/{bake-shadows → lib}/bake-shadows.d.ts +0 -0
@@ -0,0 +1,188 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, viewChild, } from '@angular/core';
2
+ import { extend, getLocalState, injectBeforeRender, omit, pick, resolveRef } from 'angular-three';
3
+ import { injectHelper, NgtsEdges } from 'angular-three-soba/abstractions';
4
+ import { injectFBO } from 'angular-three-soba/misc';
5
+ import { CausticsProjectionMaterial, createCausticsUpdate } from 'angular-three-soba/vanilla-exports';
6
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
7
+ import { mergeInputs } from 'ngxtension/inject-inputs';
8
+ import { CameraHelper, CustomBlending, FloatType, Group, LinearFilter, LinearMipmapLinearFilter, LineBasicMaterial, Mesh, OneFactor, OrthographicCamera, PlaneGeometry, Scene, SrcAlphaFactor, UnsignedByteType, Vector3, } from 'three';
9
+ import * as i0 from "@angular/core";
10
+ const NORMAL_OPTIONS = {
11
+ depth: true,
12
+ minFilter: LinearFilter,
13
+ magFilter: LinearFilter,
14
+ type: UnsignedByteType,
15
+ };
16
+ const CAUSTIC_OPTIONS = {
17
+ minFilter: LinearMipmapLinearFilter,
18
+ magFilter: LinearFilter,
19
+ type: FloatType,
20
+ generateMipmaps: true,
21
+ };
22
+ const defaultOptions = {
23
+ frames: 1,
24
+ debug: false,
25
+ causticsOnly: false,
26
+ backside: false,
27
+ ior: 1.1,
28
+ backsideIOR: 1.1,
29
+ worldRadius: 0.3125,
30
+ intensity: 0.05,
31
+ color: 'white',
32
+ resolution: 2024,
33
+ lightSource: [5, 5, 5],
34
+ };
35
+ export class NgtsCaustics {
36
+ constructor() {
37
+ this.Math = Math;
38
+ this.CustomBlending = CustomBlending;
39
+ this.OneFactor = OneFactor;
40
+ this.SrcAlphaFactor = SrcAlphaFactor;
41
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
42
+ this.parameters = omit(this.options, [
43
+ 'frames',
44
+ 'debug',
45
+ 'causticsOnly',
46
+ 'backside',
47
+ 'ior',
48
+ 'backsideIOR',
49
+ 'worldRadius',
50
+ 'intensity',
51
+ 'color',
52
+ 'resolution',
53
+ 'lightSource',
54
+ ]);
55
+ this.debug = pick(this.options, 'debug');
56
+ this.color = pick(this.options, 'color');
57
+ this.resolution = pick(this.options, 'resolution');
58
+ this.group = viewChild.required('group');
59
+ this.scene = viewChild.required('scene');
60
+ this.camera = viewChild.required('camera');
61
+ this.plane = viewChild.required('plane');
62
+ this.normalTargetParams = computed(() => ({
63
+ width: this.resolution(),
64
+ height: this.resolution(),
65
+ settings: NORMAL_OPTIONS,
66
+ }));
67
+ // Buffers for front and back faces
68
+ this.normalTarget = injectFBO(this.normalTargetParams);
69
+ this.normalTargetB = injectFBO(this.normalTargetParams);
70
+ this.causticsTargetParams = computed(() => ({
71
+ width: this.resolution(),
72
+ height: this.resolution(),
73
+ settings: CAUSTIC_OPTIONS,
74
+ }));
75
+ this.causticsTarget = injectFBO(this.causticsTargetParams);
76
+ this.causticsTargetB = injectFBO(this.causticsTargetParams);
77
+ this.cameraHelper = injectHelper(() => (this.debug() ? this.camera().nativeElement : null), () => CameraHelper);
78
+ extend({ CausticsProjectionMaterial, Group, Scene, Mesh, PlaneGeometry, LineBasicMaterial, OrthographicCamera });
79
+ const autoEffect = injectAutoEffect();
80
+ const update = createCausticsUpdate(() => {
81
+ const { lightSource, ...rest } = this.options();
82
+ return {
83
+ params: Object.assign(rest, {
84
+ lightSource: Array.isArray(lightSource) ? new Vector3(...lightSource) : resolveRef(lightSource),
85
+ }),
86
+ normalTarget: this.normalTarget(),
87
+ normalTargetB: this.normalTargetB(),
88
+ causticsTarget: this.causticsTarget(),
89
+ causticsTargetB: this.causticsTargetB(),
90
+ camera: this.camera().nativeElement,
91
+ scene: this.scene().nativeElement,
92
+ group: this.group().nativeElement,
93
+ plane: this.plane().nativeElement,
94
+ helper: this.cameraHelper(),
95
+ };
96
+ });
97
+ injectBeforeRender(({ gl }) => update(gl));
98
+ afterNextRender(() => {
99
+ autoEffect(() => {
100
+ // track all changes
101
+ this.options();
102
+ const [group, scene, plane] = [
103
+ this.group().nativeElement,
104
+ this.scene().nativeElement,
105
+ this.plane().nativeElement,
106
+ ];
107
+ const groupLocalState = getLocalState(group);
108
+ const sceneLocalState = getLocalState(scene);
109
+ const planeLocalState = getLocalState(plane);
110
+ if (!groupLocalState || !sceneLocalState || !planeLocalState)
111
+ return;
112
+ groupLocalState.objects();
113
+ sceneLocalState.objects();
114
+ planeLocalState.objects();
115
+ planeLocalState.nonObjects();
116
+ group.updateWorldMatrix(false, true);
117
+ });
118
+ });
119
+ }
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCaustics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: NgtsCaustics, isStandalone: true, selector: "ngts-caustics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "group", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "scene", first: true, predicate: ["scene"], descendants: true, isSignal: true }, { propertyName: "camera", first: true, predicate: ["camera"], descendants: true, isSignal: true }, { propertyName: "plane", first: true, predicate: ["plane"], descendants: true, isSignal: true }], ngImport: i0, template: `
122
+ <ngt-group #group [parameters]="parameters()">
123
+ <ngt-scene #scene>
124
+ <ngt-orthographic-camera #camera [up]="[0, 1, 0]" />
125
+ <ng-content />
126
+ </ngt-scene>
127
+
128
+ <ngt-mesh #plane [renderOrder]="2" [rotation]="[-Math.PI / 2, 0, 0]">
129
+ <ngt-plane-geometry />
130
+ <ngt-caustics-projection-material
131
+ [transparent]="true"
132
+ [color]="color()"
133
+ [causticsTexture]="causticsTarget().texture"
134
+ [causticsTextureB]="causticsTargetB().texture"
135
+ [blending]="CustomBlending"
136
+ [blendSrc]="OneFactor"
137
+ [blendDst]="SrcAlphaFactor"
138
+ [depthWrite]="false"
139
+ />
140
+
141
+ @if (debug()) {
142
+ <ngts-edges>
143
+ <ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
144
+ </ngts-edges>
145
+ }
146
+ </ngt-mesh>
147
+ </ngt-group>
148
+ `, isInline: true, dependencies: [{ kind: "component", type: NgtsEdges, selector: "ngts-edges", inputs: ["options"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCaustics, decorators: [{
151
+ type: Component,
152
+ args: [{
153
+ selector: 'ngts-caustics',
154
+ standalone: true,
155
+ template: `
156
+ <ngt-group #group [parameters]="parameters()">
157
+ <ngt-scene #scene>
158
+ <ngt-orthographic-camera #camera [up]="[0, 1, 0]" />
159
+ <ng-content />
160
+ </ngt-scene>
161
+
162
+ <ngt-mesh #plane [renderOrder]="2" [rotation]="[-Math.PI / 2, 0, 0]">
163
+ <ngt-plane-geometry />
164
+ <ngt-caustics-projection-material
165
+ [transparent]="true"
166
+ [color]="color()"
167
+ [causticsTexture]="causticsTarget().texture"
168
+ [causticsTextureB]="causticsTargetB().texture"
169
+ [blending]="CustomBlending"
170
+ [blendSrc]="OneFactor"
171
+ [blendDst]="SrcAlphaFactor"
172
+ [depthWrite]="false"
173
+ />
174
+
175
+ @if (debug()) {
176
+ <ngts-edges>
177
+ <ngt-line-basic-material color="#ffff00" [toneMapped]="false" />
178
+ </ngts-edges>
179
+ }
180
+ </ngt-mesh>
181
+ </ngt-group>
182
+ `,
183
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
184
+ changeDetection: ChangeDetectionStrategy.OnPush,
185
+ imports: [NgtsEdges],
186
+ }]
187
+ }], ctorParameters: () => [] });
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c3RpY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvbGliL2NhdXN0aWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBRXRCLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQVksSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFDTixZQUFZLEVBRVosY0FBYyxFQUNkLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLHdCQUF3QixFQUN4QixpQkFBaUIsRUFDakIsSUFBSSxFQUVKLFNBQVMsRUFDVCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLEtBQUssRUFDTCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLE9BQU8sR0FDUCxNQUFNLE9BQU8sQ0FBQzs7QUFFZixNQUFNLGNBQWMsR0FBRztJQUN0QixLQUFLLEVBQUUsSUFBSTtJQUNYLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLElBQUksRUFBRSxnQkFBZ0I7Q0FDdEIsQ0FBQztBQUVGLE1B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Ozs7Ozs7OztFQTJCVCw0REFHUyxTQUFTOzsyRkFFUCxZQUFZO2tCQW5DeEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMkJUO29CQUNELE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDO29CQUNqQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO2lCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGlucHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRMb2NhbFN0YXRlLCBpbmplY3RCZWZvcmVSZW5kZXIsIE5ndEdyb3VwLCBvbWl0LCBwaWNrLCByZXNvbHZlUmVmIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBpbmplY3RIZWxwZXIsIE5ndHNFZGdlcyB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9hYnN0cmFjdGlvbnMnO1xuaW1wb3J0IHsgaW5qZWN0RkJPIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHsgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWwsIGNyZWF0ZUNhdXN0aWNzVXBkYXRlIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL3ZhbmlsbGEtZXhwb3J0cyc7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQge1xuXHRDYW1lcmFIZWxwZXIsXG5cdENvbG9yUmVwcmVzZW50YXRpb24sXG5cdEN1c3RvbUJsZW5kaW5nLFxuXHRGbG9hdFR5cGUsXG5cdEdyb3VwLFxuXHRMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcblx0TGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1lc2gsXG5cdE9iamVjdDNELFxuXHRPbmVGYWN0b3IsXG5cdE9ydGhvZ3JhcGhpY0NhbWVyYSxcblx0UGxhbmVHZW9tZXRyeSxcblx0U2NlbmUsXG5cdFNyY0FscGhhRmFjdG9yLFxuXHRVbnNpZ25lZEJ5dGVUeXBlLFxuXHRWZWN0b3IzLFxufSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IE5PUk1BTF9PUFRJT05TID0ge1xuXHRkZXB0aDogdHJ1ZSxcblx0bWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxufTtcblxuY29uc3QgQ0FVU1RJQ19PUFRJT05TID0ge1xuXHRtaW5GaWx0ZXI6IExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcblx0bWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG5cdHR5cGU6IEZsb2F0VHlwZSxcblx0Z2VuZXJhdGVNaXBtYXBzOiB0cnVlLFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzQ2F1c3RpY3NPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RHcm91cD4ge1xuXHQvKiogSG93IG1hbnkgZnJhbWVzIGl0IHdpbGwgcmVuZGVyLCBzZXQgaXQgdG8gSW5maW5pdHkgZm9yIHJ1bnRpbWUsIGRlZmF1bHQ6IDEgKi9cblx0ZnJhbWVzOiBudW1iZXI7XG5cdC8qKiBFbmFibGVzIHZpc3VhbCBjdWVzIHRvIGhlbHAgeW91IHN0YWdlIHlvdXIgc2NlbmUsIGRlZmF1bHQ6IGZhbHNlICovXG5cdGRlYnVnOiBib29sZWFuO1xuXHQvKiogV2lsbCBkaXNwbGF5IGNhdXN0aWNzIG9ubHkgYW5kIHNraXAgdGhlIG1vZGVscywgZGVmYXVsdDogZmFsc2UgKi9cblx0Y2F1c3RpY3NPbmx5OiBib29sZWFuO1xuXHQvKiogV2lsbCBpbmNsdWRlIGJhY2sgZmFjZXMgYW5kIGVuYWJsZSB0aGUgYmFja3NpZGVJT1IgcHJvcCwgZGVmYXVsdDogZmFsc2UgKi9cblx0YmFja3NpZGU6IGJvb2xlYW47XG5cdC8qKiBUaGUgSU9SIHJlZnJhY3Rpb24gaW5kZXgsIGRlZmF1bHQ6IDEuMSAqL1xuXHRpb3I6IG51bWJlcjtcblx0LyoqIFRoZSBJT1IgcmVmcmFjdGlvbiBpbmRleCBmb3IgYmFjayBmYWNlcyAob25seSBhdmFpbGFibGUgd2hlbiBiYWNrc2lkZSBpcyBlbmFibGVkKSwgZGVmYXVsdDogMS4xICovXG5cdGJhY2tzaWRlSU9SOiBudW1iZXI7XG5cdC8qKiBUaGUgdGV4ZWwgc2l6ZSwgZGVmYXVsdDogMC4zMTI1ICovXG5cdHdvcmxkUmFkaXVzOiBudW1iZXI7XG5cdC8qKiBJbnRlbnNpdHkgb2YgdGhlIHByamVjdGVkIGNhdXN0aWNzLCBkZWZhdWx0OiAwLjA1ICovXG5cdGludGVuc2l0eTogbnVtYmVyO1xuXHQvKiogQ2F1c3RpY3MgY29sb3IsIGRlZmF1bHQ6IHdoaXRlICovXG5cdGNvbG9yOiBDb2xvclJlcHJlc2VudGF0aW9uO1xuXHQvKiogQnVmZmVyIHJlc29sdXRpb24sIGRlZmF1bHQ6IDIwNDggKi9cblx0cmVzb2x1dGlvbjogbnVtYmVyO1xuXHQvKiogQ2FtZXJhIHBvc2l0aW9uLCBpdCB3aWxsIHBvaW50IHRvd2FyZHMgdGhlIGNvbnRlbnRzIGJvdW5kcyBjZW50ZXIsIGRlZmF1bHQ6IFs1LCA1LCA1XSAqL1xuXHRsaWdodFNvdXJjZTogW3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJdIHwgRWxlbWVudFJlZjxPYmplY3QzRD4gfCBPYmplY3QzRDtcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnM6IE5ndHNDYXVzdGljc09wdGlvbnMgPSB7XG5cdGZyYW1lczogMSxcblx0ZGVidWc6IGZhbHNlLFxuXHRjYXVzdGljc09ubHk6IGZhbHNlLFxuXHRiYWNrc2lkZTogZmFsc2UsXG5cdGlvcjogMS4xLFxuXHRiYWNrc2lkZUlPUjogMS4xLFxuXHR3b3JsZFJhZGl1czogMC4zMTI1LFxuXHRpbnRlbnNpdHk6IDAuMDUsXG5cdGNvbG9yOiAnd2hpdGUnLFxuXHRyZXNvbHV0aW9uOiAyMDI0LFxuXHRsaWdodFNvdXJjZTogWzUsIDUsIDVdLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1jYXVzdGljcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjZ3JvdXAgW3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCI+XG5cdFx0XHQ8bmd0LXNjZW5lICNzY2VuZT5cblx0XHRcdFx0PG5ndC1vcnRob2dyYXBoaWMtY2FtZXJhICNjYW1lcmEgW3VwXT1cIlswLCAxLCAwXVwiIC8+XG5cdFx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0XHQ8L25ndC1zY2VuZT5cblxuXHRcdFx0PG5ndC1tZXNoICNwbGFuZSBbcmVuZGVyT3JkZXJdPVwiMlwiIFtyb3RhdGlvbl09XCJbLU1hdGguUEkgLyAyLCAwLCAwXVwiPlxuXHRcdFx0XHQ8bmd0LXBsYW5lLWdlb21ldHJ5IC8+XG5cdFx0XHRcdDxuZ3QtY2F1c3RpY3MtcHJvamVjdGlvbi1tYXRlcmlhbFxuXHRcdFx0XHRcdFt0cmFuc3BhcmVudF09XCJ0cnVlXCJcblx0XHRcdFx0XHRbY29sb3JdPVwiY29sb3IoKVwiXG5cdFx0XHRcdFx0W2NhdXN0aWNzVGV4dHVyZV09XCJjYXVzdGljc1RhcmdldCgpLnRleHR1cmVcIlxuXHRcdFx0XHRcdFtjYXVzdGljc1RleHR1cmVCXT1cImNhdXN0aWNzVGFyZ2V0QigpLnRleHR1cmVcIlxuXHRcdFx0XHRcdFtibGVuZGluZ109XCJDdXN0b21CbGVuZGluZ1wiXG5cdFx0XHRcdFx0W2JsZW5kU3JjXT1cIk9uZUZhY3RvclwiXG5cdFx0XHRcdFx0W2JsZW5kRHN0XT1cIlNyY0FscGhhRmFjdG9yXCJcblx0XHRcdFx0XHRbZGVwdGhXcml0ZV09XCJmYWxzZVwiXG5cdFx0XHRcdC8+XG5cblx0XHRcdFx0QGlmIChkZWJ1ZygpKSB7XG5cdFx0XHRcdFx0PG5ndHMtZWRnZXM+XG5cdFx0XHRcdFx0XHQ8bmd0LWxpbmUtYmFzaWMtbWF0ZXJpYWwgY29sb3I9XCIjZmZmZjAwXCIgW3RvbmVNYXBwZWRdPVwiZmFsc2VcIiAvPlxuXHRcdFx0XHRcdDwvbmd0cy1lZGdlcz5cblx0XHRcdFx0fVxuXHRcdFx0PC9uZ3QtbWVzaD5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndHNFZGdlc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDYXVzdGljcyB7XG5cdHByb3RlY3RlZCByZWFkb25seSBNYXRoID0gTWF0aDtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IEN1c3RvbUJsZW5kaW5nID0gQ3VzdG9tQmxlbmRpbmc7XG5cdHByb3RlY3RlZCByZWFkb25seSBPbmVGYWN0b3IgPSBPbmVGYWN0b3I7XG5cdHByb3RlY3RlZCByZWFkb25seSBTcmNBbHBoYUZhY3RvciA9IFNyY0FscGhhRmFjdG9yO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbXG5cdFx0J2ZyYW1lcycsXG5cdFx0J2RlYnVnJyxcblx0XHQnY2F1c3RpY3NPbmx5Jyxcblx0XHQnYmFja3NpZGUnLFxuXHRcdCdpb3InLFxuXHRcdCdiYWNrc2lkZUlPUicsXG5cdFx0J3dvcmxkUmFkaXVzJyxcblx0XHQnaW50ZW5zaXR5Jyxcblx0XHQnY29sb3InLFxuXHRcdCdyZXNvbHV0aW9uJyxcblx0XHQnbGlnaHRTb3VyY2UnLFxuXHRdKTtcblxuXHRkZWJ1ZyA9IHBpY2sodGhpcy5vcHRpb25zLCAnZGVidWcnKTtcblx0Y29sb3IgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbG9yJyk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXG5cdGdyb3VwID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8R3JvdXA+PignZ3JvdXAnKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPFNjZW5lPj4oJ3NjZW5lJyk7XG5cdHByaXZhdGUgY2FtZXJhID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8T3J0aG9ncmFwaGljQ2FtZXJhPj4oJ2NhbWVyYScpO1xuXHRwcml2YXRlIHBsYW5lID1cblx0XHR2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxNZXNoPFBsYW5lR2VvbWV0cnksIEluc3RhbmNlVHlwZTx0eXBlb2YgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWw+Pj4+KCdwbGFuZScpO1xuXG5cdHByaXZhdGUgbm9ybWFsVGFyZ2V0UGFyYW1zID0gY29tcHV0ZWQoKCkgPT4gKHtcblx0XHR3aWR0aDogdGhpcy5yZXNvbHV0aW9uKCksXG5cdFx0aGVpZ2h0OiB0aGlzLnJlc29sdXRpb24oKSxcblx0XHRzZXR0aW5nczogTk9STUFMX09QVElPTlMsXG5cdH0pKTtcblxuXHQvLyBCdWZmZXJzIGZvciBmcm9udCBhbmQgYmFjayBmYWNlc1xuXHRwcml2YXRlIG5vcm1hbFRhcmdldCA9IGluamVjdEZCTyh0aGlzLm5vcm1hbFRhcmdldFBhcmFtcyk7XG5cdHByaXZhdGUgbm9ybWFsVGFyZ2V0QiA9IGluamVjdEZCTyh0aGlzLm5vcm1hbFRhcmdldFBhcmFtcyk7XG5cblx0cHJpdmF0ZSBjYXVzdGljc1RhcmdldFBhcmFtcyA9IGNvbXB1dGVkKCgpID0+ICh7XG5cdFx0d2lkdGg6IHRoaXMucmVzb2x1dGlvbigpLFxuXHRcdGhlaWdodDogdGhpcy5yZXNvbHV0aW9uKCksXG5cdFx0c2V0dGluZ3M6IENBVVNUSUNfT1BUSU9OUyxcblx0fSkpO1xuXHRjYXVzdGljc1RhcmdldCA9IGluamVjdEZCTyh0aGlzLmNhdXN0aWNzVGFyZ2V0UGFyYW1zKTtcblx0Y2F1c3RpY3NUYXJnZXRCID0gaW5qZWN0RkJPKHRoaXMuY2F1c3RpY3NUYXJnZXRQYXJhbXMpO1xuXG5cdHByaXZhdGUgY2FtZXJhSGVscGVyID0gaW5qZWN0SGVscGVyKFxuXHRcdCgpID0+ICh0aGlzLmRlYnVnKCkgPyB0aGlzLmNhbWVyYSgpLm5hdGl2ZUVsZW1lbnQgOiBudWxsKSxcblx0XHQoKSA9PiBDYW1lcmFIZWxwZXIsXG5cdCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWwsIEdyb3VwLCBTY2VuZSwgTWVzaCwgUGxhbmVHZW9tZXRyeSwgTGluZUJhc2ljTWF0ZXJpYWwsIE9ydGhvZ3JhcGhpY0NhbWVyYSB9KTtcblxuXHRcdGNvbnN0IGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cblx0XHRjb25zdCB1cGRhdGUgPSBjcmVhdGVDYXVzdGljc1VwZGF0ZSgoKSA9PiB7XG5cdFx0XHRjb25zdCB7IGxpZ2h0U291cmNlLCAuLi5yZXN0IH0gPSB0aGlzLm9wdGlvbnMoKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cGFyYW1zOiBPYmplY3QuYXNzaWduKHJlc3QsIHtcblx0XHRcdFx0XHRsaWdodFNvdXJjZTogQXJyYXkuaXNBcnJheShsaWdodFNvdXJjZSkgPyBuZXcgVmVjdG9yMyguLi5saWdodFNvdXJjZSkgOiByZXNvbHZlUmVmKGxpZ2h0U291cmNlKSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5vcm1hbFRhcmdldDogdGhpcy5ub3JtYWxUYXJnZXQoKSxcblx0XHRcdFx0bm9ybWFsVGFyZ2V0QjogdGhpcy5ub3JtYWxUYXJnZXRCKCksXG5cdFx0XHRcdGNhdXN0aWNzVGFyZ2V0OiB0aGlzLmNhdXN0aWNzVGFyZ2V0KCksXG5cdFx0XHRcdGNhdXN0aWNzVGFyZ2V0QjogdGhpcy5jYXVzdGljc1RhcmdldEIoKSxcblx0XHRcdFx0Y2FtZXJhOiB0aGlzLmNhbWVyYSgpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHNjZW5lOiB0aGlzLnNjZW5lKCkubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0Z3JvdXA6IHRoaXMuZ3JvdXAoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRwbGFuZTogdGhpcy5wbGFuZSgpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdGhlbHBlcjogdGhpcy5jYW1lcmFIZWxwZXIoKSxcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKHsgZ2wgfSkgPT4gdXBkYXRlKGdsKSk7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdC8vIHRyYWNrIGFsbCBjaGFuZ2VzXG5cdFx0XHRcdHRoaXMub3B0aW9ucygpO1xuXHRcdFx0XHRjb25zdCBbZ3JvdXAsIHNjZW5lLCBwbGFuZV0gPSBbXG5cdFx0XHRcdFx0dGhpcy5ncm91cCgpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdFx0dGhpcy5zY2VuZSgpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdFx0dGhpcy5wbGFuZSgpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdF07XG5cdFx0XHRcdGNvbnN0IGdyb3VwTG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoZ3JvdXApO1xuXHRcdFx0XHRjb25zdCBzY2VuZUxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKHNjZW5lKTtcblx0XHRcdFx0Y29uc3QgcGxhbmVMb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwbGFuZSk7XG5cblx0XHRcdFx0aWYgKCFncm91cExvY2FsU3RhdGUgfHwgIXNjZW5lTG9jYWxTdGF0ZSB8fCAhcGxhbmVMb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0Z3JvdXBMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0c2NlbmVMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0cGxhbmVMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0cGxhbmVMb2NhbFN0YXRlLm5vbk9iamVjdHMoKTtcblxuXHRcdFx0XHRncm91cC51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,113 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, CUSTOM_ELEMENTS_SCHEMA, input, output, viewChild, } from '@angular/core';
2
+ import { extend, getLocalState, omit, pick } from 'angular-three';
3
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
4
+ import { mergeInputs } from 'ngxtension/inject-inputs';
5
+ import { Box3, Group, Sphere, Vector3 } from 'three';
6
+ import * as i0 from "@angular/core";
7
+ const defaultOptions = {
8
+ precise: true,
9
+ cacheKey: 0,
10
+ };
11
+ export class NgtsCenter {
12
+ constructor() {
13
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
14
+ this.parameters = omit(this.options, [
15
+ 'top',
16
+ 'right',
17
+ 'bottom',
18
+ 'left',
19
+ 'front',
20
+ 'back',
21
+ 'disable',
22
+ 'disableX',
23
+ 'disableY',
24
+ 'disableZ',
25
+ 'precise',
26
+ 'cacheKey',
27
+ ]);
28
+ this.centered = output();
29
+ this.group = viewChild.required('group');
30
+ this.outer = viewChild.required('outer');
31
+ this.inner = viewChild.required('inner');
32
+ this.centerOptions = pick(this.options, [
33
+ 'top',
34
+ 'right',
35
+ 'bottom',
36
+ 'left',
37
+ 'front',
38
+ 'back',
39
+ 'disable',
40
+ 'disableX',
41
+ 'disableY',
42
+ 'disableZ',
43
+ 'precise',
44
+ 'cacheKey',
45
+ ]);
46
+ extend({ Group });
47
+ const autoEffect = injectAutoEffect();
48
+ afterNextRender(() => {
49
+ autoEffect(() => {
50
+ const [{ precise, top, bottom, right, left, front, back, disable, disableZ, disableY, disableX }, group, outer, inner,] = [this.centerOptions(), this.group().nativeElement, this.outer().nativeElement, this.inner().nativeElement];
51
+ const localState = getLocalState(inner);
52
+ const children = localState?.objects();
53
+ if (!children?.length)
54
+ return;
55
+ outer.matrixWorld.identity();
56
+ const box3 = new Box3().setFromObject(inner, precise);
57
+ const center = new Vector3();
58
+ const sphere = new Sphere();
59
+ const width = box3.max.x - box3.min.x;
60
+ const height = box3.max.y - box3.min.y;
61
+ const depth = box3.max.z - box3.min.z;
62
+ box3.getCenter(center);
63
+ box3.getBoundingSphere(sphere);
64
+ const vAlign = top ? height / 2 : bottom ? -height / 2 : 0;
65
+ const hAlign = left ? -width / 2 : right ? width / 2 : 0;
66
+ const dAlign = front ? depth / 2 : back ? -depth / 2 : 0;
67
+ outer.position.set(disable || disableX ? 0 : -center.x + hAlign, disable || disableY ? 0 : -center.y + vAlign, disable || disableZ ? 0 : -center.z + dAlign);
68
+ this.centered.emit({
69
+ parent: group.parent,
70
+ container: group,
71
+ width,
72
+ height,
73
+ depth,
74
+ boundingBox: box3,
75
+ boundingSphere: sphere,
76
+ center,
77
+ verticalAlignment: vAlign,
78
+ horizontalAlignment: hAlign,
79
+ depthAlignment: dAlign,
80
+ });
81
+ });
82
+ });
83
+ }
84
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCenter, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
85
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.0", type: NgtsCenter, isStandalone: true, selector: "ngts-center", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { centered: "centered" }, viewQueries: [{ propertyName: "group", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "outer", first: true, predicate: ["outer"], descendants: true, isSignal: true }, { propertyName: "inner", first: true, predicate: ["inner"], descendants: true, isSignal: true }], ngImport: i0, template: `
86
+ <ngt-group #group [parameters]="parameters()">
87
+ <ngt-group #outer>
88
+ <ngt-group #inner>
89
+ <ng-content />
90
+ </ngt-group>
91
+ </ngt-group>
92
+ </ngt-group>
93
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
94
+ }
95
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsCenter, decorators: [{
96
+ type: Component,
97
+ args: [{
98
+ selector: 'ngts-center',
99
+ standalone: true,
100
+ template: `
101
+ <ngt-group #group [parameters]="parameters()">
102
+ <ngt-group #outer>
103
+ <ngt-group #inner>
104
+ <ng-content />
105
+ </ngt-group>
106
+ </ngt-group>
107
+ </ngt-group>
108
+ `,
109
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
110
+ changeDetection: ChangeDetectionStrategy.OnPush,
111
+ }]
112
+ }], ctorParameters: () => [] });
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULHNCQUFzQixFQUV0QixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBWSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQXVDL0QsTUFBTSxjQUFjLEdBQTBDO0lBQzdELE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWCxDQUFDO0FBaUJGLE1BQU0sT0FBTyxVQUFVO0lBc0N0QjtRQXJDQSxZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMvQixLQUFLO1lBQ0wsT0FBTztZQUNQLFFBQVE7WUFDUixNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixTQUFTO1lBQ1QsVUFBVTtZQUNWLFVBQVU7WUFDVixVQUFVO1lBQ1YsU0FBUztZQUNULFVBQVU7U0FDVixDQUFDLENBQUM7UUFFSCxhQUFRLEdBQUcsTUFBTSxFQUFtQixDQUFDO1FBRXJDLFVBQUssR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFvQixPQUFPLENBQUMsQ0FBQztRQUN2RCxVQUFLLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBb0IsT0FBTyxDQUFDLENBQUM7UUFDdkQsVUFBSyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQW9CLE9BQU8sQ0FBQyxDQUFDO1FBRXZELGtCQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEMsS0FBSztZQUNMLE9BQU87WUFDUCxRQUFRO1lBQ1IsTUFBTTtZQUNOLE9BQU87WUFDUCxNQUFNO1lBQ04sU0FBUztZQUNULFVBQVU7WUFDVixVQUFVO1lBQ1YsVUFBVTtZQUNWLFNBQVM7WUFDVCxVQUFVO1NBQ1YsQ0FBQyxDQUFDO1FBR0YsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUVsQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXRDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZixNQUFNLENBQ0wsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQ3pGLEtBQUssRUFDTCxLQUFLLEVBQ0wsS0FBSyxFQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFL0csTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTTtvQkFBRSxPQUFPO2dCQUU5QixLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBRTVCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRXRDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFL0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFekQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQ2pCLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFDNUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUM1QyxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQzVDLENBQUM7Z0JBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ2xCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTztvQkFDckIsU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLEtBQUs7b0JBQ0wsTUFBTTtvQkFDTixLQUFLO29CQUNMLFdBQVcsRUFBRSxJQUFJO29CQUNqQixjQUFjLEVBQUUsTUFBTTtvQkFDdEIsTUFBTTtvQkFDTixpQkFBaUIsRUFBRSxNQUFNO29CQUN6QixtQkFBbUIsRUFBRSxNQUFNO29CQUMzQixjQUFjLEVBQUUsTUFBTTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBN0ZXLFVBQVU7a0dBQVYsVUFBVSxzaUJBWlo7Ozs7Ozs7O0VBUVQ7OzJGQUlXLFVBQVU7a0JBZnRCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7O0VBUVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0RWxlbWVudFJlZixcblx0aW5wdXQsXG5cdG91dHB1dCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgZ2V0TG9jYWxTdGF0ZSwgTmd0R3JvdXAsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEJveDMsIEdyb3VwLCBPYmplY3QzRCwgU3BoZXJlLCBWZWN0b3IzIH0gZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNDZW50ZXJTdGF0ZSB7XG5cdC8qKiBUaGUgbmV4dCBwYXJlbnQgYWJvdmUgPENlbnRlcj4gKi9cblx0cGFyZW50OiBPYmplY3QzRDtcblx0LyoqIFRoZSBvdXRtb3N0IGNvbnRhaW5lciBncm91cCBvZiB0aGUgPENlbnRlcj4gY29tcG9uZW50ICovXG5cdGNvbnRhaW5lcjogT2JqZWN0M0Q7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xuXHRkZXB0aDogbnVtYmVyO1xuXHRib3VuZGluZ0JveDogQm94Mztcblx0Ym91bmRpbmdTcGhlcmU6IFNwaGVyZTtcblx0Y2VudGVyOiBWZWN0b3IzO1xuXHR2ZXJ0aWNhbEFsaWdubWVudDogbnVtYmVyO1xuXHRob3Jpem9udGFsQWxpZ25tZW50OiBudW1iZXI7XG5cdGRlcHRoQWxpZ25tZW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0NlbnRlck9wdGlvbnMge1xuXHR0b3A/OiBib29sZWFuO1xuXHRyaWdodD86IGJvb2xlYW47XG5cdGJvdHRvbT86IGJvb2xlYW47XG5cdGxlZnQ/OiBib29sZWFuO1xuXHRmcm9udD86IGJvb2xlYW47XG5cdGJhY2s/OiBib29sZWFuO1xuXHQvKiogRGlzYWJsZSBhbGwgYXhlcyAqL1xuXHRkaXNhYmxlPzogYm9vbGVhbjtcblx0LyoqIERpc2FibGUgeC1heGlzIGNlbnRlcmluZyAqL1xuXHRkaXNhYmxlWD86IGJvb2xlYW47XG5cdC8qKiBEaXNhYmxlIHktYXhpcyBjZW50ZXJpbmcgKi9cblx0ZGlzYWJsZVk/OiBib29sZWFuO1xuXHQvKiogRGlzYWJsZSB6LWF4aXMgY2VudGVyaW5nICovXG5cdGRpc2FibGVaPzogYm9vbGVhbjtcblx0LyoqIFNlZSBodHRwczovL3RocmVlanMub3JnL2RvY3MvaW5kZXguaHRtbD9xPWJveDMjYXBpL2VuL21hdGgvQm94My5zZXRGcm9tT2JqZWN0ICovXG5cdHByZWNpc2U6IGJvb2xlYW47XG5cdC8qKiBPcHRpb25hbCBjYWNoZUtleSB0byBrZWVwIHRoZSBjb21wb25lbnQgZnJvbSByZWNhbGN1bGF0aW5nIG9uIGV2ZXJ5IHJlbmRlciAqL1xuXHRjYWNoZUtleTogYW55O1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogUGFydGlhbDxOZ3RHcm91cD4gJiBOZ3RzQ2VudGVyT3B0aW9ucyA9IHtcblx0cHJlY2lzZTogdHJ1ZSxcblx0Y2FjaGVLZXk6IDAsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWNlbnRlcicsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjZ3JvdXAgW3BhcmFtZXRlcnNdPVwicGFyYW1ldGVycygpXCI+XG5cdFx0XHQ8bmd0LWdyb3VwICNvdXRlcj5cblx0XHRcdFx0PG5ndC1ncm91cCAjaW5uZXI+XG5cdFx0XHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHRcdFx0PC9uZ3QtZ3JvdXA+XG5cdFx0XHQ8L25ndC1ncm91cD5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0NlbnRlciB7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbXG5cdFx0J3RvcCcsXG5cdFx0J3JpZ2h0Jyxcblx0XHQnYm90dG9tJyxcblx0XHQnbGVmdCcsXG5cdFx0J2Zyb250Jyxcblx0XHQnYmFjaycsXG5cdFx0J2Rpc2FibGUnLFxuXHRcdCdkaXNhYmxlWCcsXG5cdFx0J2Rpc2FibGVZJyxcblx0XHQnZGlzYWJsZVonLFxuXHRcdCdwcmVjaXNlJyxcblx0XHQnY2FjaGVLZXknLFxuXHRdKTtcblxuXHRjZW50ZXJlZCA9IG91dHB1dDxOZ3RzQ2VudGVyU3RhdGU+KCk7XG5cblx0Z3JvdXAgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXHRvdXRlciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ291dGVyJyk7XG5cdGlubmVyID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8R3JvdXA+PignaW5uZXInKTtcblxuXHRjZW50ZXJPcHRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsIFtcblx0XHQndG9wJyxcblx0XHQncmlnaHQnLFxuXHRcdCdib3R0b20nLFxuXHRcdCdsZWZ0Jyxcblx0XHQnZnJvbnQnLFxuXHRcdCdiYWNrJyxcblx0XHQnZGlzYWJsZScsXG5cdFx0J2Rpc2FibGVYJyxcblx0XHQnZGlzYWJsZVknLFxuXHRcdCdkaXNhYmxlWicsXG5cdFx0J3ByZWNpc2UnLFxuXHRcdCdjYWNoZUtleScsXG5cdF0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IEdyb3VwIH0pO1xuXG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW1xuXHRcdFx0XHRcdHsgcHJlY2lzZSwgdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0LCBmcm9udCwgYmFjaywgZGlzYWJsZSwgZGlzYWJsZVosIGRpc2FibGVZLCBkaXNhYmxlWCB9LFxuXHRcdFx0XHRcdGdyb3VwLFxuXHRcdFx0XHRcdG91dGVyLFxuXHRcdFx0XHRcdGlubmVyLFxuXHRcdFx0XHRdID0gW3RoaXMuY2VudGVyT3B0aW9ucygpLCB0aGlzLmdyb3VwKCkubmF0aXZlRWxlbWVudCwgdGhpcy5vdXRlcigpLm5hdGl2ZUVsZW1lbnQsIHRoaXMuaW5uZXIoKS5uYXRpdmVFbGVtZW50XTtcblxuXHRcdFx0XHRjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShpbm5lcik7XG5cdFx0XHRcdGNvbnN0IGNoaWxkcmVuID0gbG9jYWxTdGF0ZT8ub2JqZWN0cygpO1xuXHRcdFx0XHRpZiAoIWNoaWxkcmVuPy5sZW5ndGgpIHJldHVybjtcblxuXHRcdFx0XHRvdXRlci5tYXRyaXhXb3JsZC5pZGVudGl0eSgpO1xuXHRcdFx0XHRjb25zdCBib3gzID0gbmV3IEJveDMoKS5zZXRGcm9tT2JqZWN0KGlubmVyLCBwcmVjaXNlKTtcblx0XHRcdFx0Y29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0Y29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0XHRcdGNvbnN0IHdpZHRoID0gYm94My5tYXgueCAtIGJveDMubWluLng7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IGJveDMubWF4LnkgLSBib3gzLm1pbi55O1xuXHRcdFx0XHRjb25zdCBkZXB0aCA9IGJveDMubWF4LnogLSBib3gzLm1pbi56O1xuXG5cdFx0XHRcdGJveDMuZ2V0Q2VudGVyKGNlbnRlcik7XG5cdFx0XHRcdGJveDMuZ2V0Qm91bmRpbmdTcGhlcmUoc3BoZXJlKTtcblxuXHRcdFx0XHRjb25zdCB2QWxpZ24gPSB0b3AgPyBoZWlnaHQgLyAyIDogYm90dG9tID8gLWhlaWdodCAvIDIgOiAwO1xuXHRcdFx0XHRjb25zdCBoQWxpZ24gPSBsZWZ0ID8gLXdpZHRoIC8gMiA6IHJpZ2h0ID8gd2lkdGggLyAyIDogMDtcblx0XHRcdFx0Y29uc3QgZEFsaWduID0gZnJvbnQgPyBkZXB0aCAvIDIgOiBiYWNrID8gLWRlcHRoIC8gMiA6IDA7XG5cblx0XHRcdFx0b3V0ZXIucG9zaXRpb24uc2V0KFxuXHRcdFx0XHRcdGRpc2FibGUgfHwgZGlzYWJsZVggPyAwIDogLWNlbnRlci54ICsgaEFsaWduLFxuXHRcdFx0XHRcdGRpc2FibGUgfHwgZGlzYWJsZVkgPyAwIDogLWNlbnRlci55ICsgdkFsaWduLFxuXHRcdFx0XHRcdGRpc2FibGUgfHwgZGlzYWJsZVogPyAwIDogLWNlbnRlci56ICsgZEFsaWduLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHRoaXMuY2VudGVyZWQuZW1pdCh7XG5cdFx0XHRcdFx0cGFyZW50OiBncm91cC5wYXJlbnQhLFxuXHRcdFx0XHRcdGNvbnRhaW5lcjogZ3JvdXAsXG5cdFx0XHRcdFx0d2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0LFxuXHRcdFx0XHRcdGRlcHRoLFxuXHRcdFx0XHRcdGJvdW5kaW5nQm94OiBib3gzLFxuXHRcdFx0XHRcdGJvdW5kaW5nU3BoZXJlOiBzcGhlcmUsXG5cdFx0XHRcdFx0Y2VudGVyLFxuXHRcdFx0XHRcdHZlcnRpY2FsQWxpZ25tZW50OiB2QWxpZ24sXG5cdFx0XHRcdFx0aG9yaXpvbnRhbEFsaWdubWVudDogaEFsaWduLFxuXHRcdFx0XHRcdGRlcHRoQWxpZ25tZW50OiBkQWxpZ24sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdfQ==
@@ -0,0 +1,201 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, input, viewChild, } from '@angular/core';
2
+ import { NgtArgs, extend, injectNextBeforeRender, injectStore, omit, pick } from 'angular-three';
3
+ import { mergeInputs } from 'ngxtension/inject-inputs';
4
+ import { Color, Group, Mesh, MeshBasicMaterial, MeshDepthMaterial, OrthographicCamera, PlaneGeometry, ShaderMaterial, WebGLRenderTarget, } from 'three';
5
+ import { HorizontalBlurShader, VerticalBlurShader } from 'three-stdlib';
6
+ import * as i0 from "@angular/core";
7
+ const defaultOptions = {
8
+ scale: 10,
9
+ frames: Infinity,
10
+ opacity: 1,
11
+ width: 1,
12
+ height: 1,
13
+ blur: 1,
14
+ near: 0,
15
+ far: 10,
16
+ resolution: 512,
17
+ smooth: true,
18
+ color: '#000000',
19
+ depthWrite: false,
20
+ };
21
+ extend({ Group, Mesh, MeshBasicMaterial, OrthographicCamera });
22
+ export class NgtsContactShadows {
23
+ blurShadows(blur) {
24
+ const { renderTarget, renderTargetBlur, blurPlane, horizontalBlurMaterial, verticalBlurMaterial } = this.shadowsOptions();
25
+ const shadowsCamera = this.shadowsCameraRef()?.nativeElement;
26
+ if (!shadowsCamera)
27
+ return;
28
+ blurPlane.visible = true;
29
+ blurPlane.material = horizontalBlurMaterial;
30
+ horizontalBlurMaterial.uniforms['tDiffuse'].value = renderTarget.texture;
31
+ horizontalBlurMaterial.uniforms['h'].value = (blur * 1) / 256;
32
+ this.gl().setRenderTarget(renderTargetBlur);
33
+ this.gl().render(blurPlane, shadowsCamera);
34
+ blurPlane.material = verticalBlurMaterial;
35
+ verticalBlurMaterial.uniforms['tDiffuse'].value = renderTargetBlur.texture;
36
+ verticalBlurMaterial.uniforms['v'].value = (blur * 1) / 256;
37
+ this.gl().setRenderTarget(renderTarget);
38
+ this.gl().render(blurPlane, shadowsCamera);
39
+ blurPlane.visible = false;
40
+ }
41
+ constructor() {
42
+ this.Math = Math;
43
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
44
+ this.parameters = omit(this.options, [
45
+ 'scale',
46
+ 'frames',
47
+ 'opacity',
48
+ 'width',
49
+ 'height',
50
+ 'blur',
51
+ 'near',
52
+ 'far',
53
+ 'resolution',
54
+ 'smooth',
55
+ 'color',
56
+ 'depthWrite',
57
+ 'renderOrder',
58
+ ]);
59
+ this.contactShadowsRef = viewChild.required('contactShadows');
60
+ this.shadowsCameraRef = viewChild('shadowsCamera');
61
+ this.store = injectStore();
62
+ this.scene = this.store.select('scene');
63
+ this.gl = this.store.select('gl');
64
+ this.scaledWidth = computed(() => {
65
+ const { width, scale } = this.options();
66
+ return width * (Array.isArray(scale) ? scale[0] : scale);
67
+ });
68
+ this.scaledHeight = computed(() => {
69
+ const { height, scale } = this.options();
70
+ return height * (Array.isArray(scale) ? scale[1] : scale);
71
+ });
72
+ this.resolution = pick(this.options, 'resolution');
73
+ this.color = pick(this.options, 'color');
74
+ this.near = pick(this.options, 'near');
75
+ this.far = pick(this.options, 'far');
76
+ this.shadowsOptions = computed(() => {
77
+ const [width, height, resolution, color] = [
78
+ this.scaledWidth(),
79
+ this.scaledHeight(),
80
+ this.resolution(),
81
+ this.color(),
82
+ ];
83
+ const renderTarget = new WebGLRenderTarget(resolution, resolution);
84
+ const renderTargetBlur = new WebGLRenderTarget(resolution, resolution);
85
+ renderTargetBlur.texture.generateMipmaps = renderTarget.texture.generateMipmaps = false;
86
+ const planeGeometry = new PlaneGeometry(width, height).rotateX(Math.PI / 2);
87
+ const blurPlane = new Mesh(planeGeometry);
88
+ const depthMaterial = new MeshDepthMaterial();
89
+ depthMaterial.depthTest = depthMaterial.depthWrite = false;
90
+ depthMaterial.onBeforeCompile = (shader) => {
91
+ shader.uniforms = { ...shader.uniforms, ucolor: { value: new Color(color) } };
92
+ shader.fragmentShader = shader.fragmentShader.replace(`void main() {`, //
93
+ `uniform vec3 ucolor;
94
+ void main() {
95
+ `);
96
+ shader.fragmentShader = shader.fragmentShader.replace('vec4( vec3( 1.0 - fragCoordZ ), opacity );',
97
+ // Colorize the shadow, multiply by the falloff so that the center can remain darker
98
+ 'vec4( ucolor * fragCoordZ * 2.0, ( 1.0 - fragCoordZ ) * 1.0 );');
99
+ };
100
+ const horizontalBlurMaterial = new ShaderMaterial(HorizontalBlurShader);
101
+ const verticalBlurMaterial = new ShaderMaterial(VerticalBlurShader);
102
+ verticalBlurMaterial.depthTest = horizontalBlurMaterial.depthTest = false;
103
+ return {
104
+ renderTarget,
105
+ planeGeometry,
106
+ depthMaterial,
107
+ blurPlane,
108
+ horizontalBlurMaterial,
109
+ verticalBlurMaterial,
110
+ renderTargetBlur,
111
+ };
112
+ });
113
+ this.renderOrder = pick(this.options, 'renderOrder');
114
+ this.opacity = pick(this.options, 'opacity');
115
+ this.depthWrite = pick(this.options, 'depthWrite');
116
+ this.planeGeometry = computed(() => this.shadowsOptions().planeGeometry);
117
+ this.texture = computed(() => this.shadowsOptions().renderTarget.texture);
118
+ this.cameraArgs = computed(() => {
119
+ const [width, height, near, far] = [this.scaledWidth(), this.scaledHeight(), this.near(), this.far()];
120
+ return [-width / 2, width / 2, height / 2, -height / 2, near, far];
121
+ });
122
+ let count = 0;
123
+ let initialBackground;
124
+ let initialOverrideMaterial;
125
+ injectNextBeforeRender(() => {
126
+ const shadowsCamera = this.shadowsCameraRef()?.nativeElement;
127
+ const [{ frames, blur, smooth }, gl, scene, contactShadows, { depthMaterial, renderTarget }] = [
128
+ this.options(),
129
+ this.gl(),
130
+ this.scene(),
131
+ this.contactShadowsRef(),
132
+ this.shadowsOptions(),
133
+ ];
134
+ if (shadowsCamera && (frames === Infinity || count < frames)) {
135
+ count++;
136
+ initialBackground = scene.background;
137
+ initialOverrideMaterial = scene.overrideMaterial;
138
+ contactShadows.nativeElement.visible = false;
139
+ scene.background = null;
140
+ scene.overrideMaterial = depthMaterial;
141
+ gl.setRenderTarget(renderTarget);
142
+ gl.render(scene, shadowsCamera);
143
+ this.blurShadows(blur);
144
+ if (smooth)
145
+ this.blurShadows(blur * 0.4);
146
+ gl.setRenderTarget(null);
147
+ contactShadows.nativeElement.visible = true;
148
+ scene.overrideMaterial = initialOverrideMaterial;
149
+ scene.background = initialBackground;
150
+ }
151
+ });
152
+ }
153
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsContactShadows, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
154
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.1.0", type: NgtsContactShadows, isStandalone: true, selector: "ngts-contact-shadows", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "contactShadowsRef", first: true, predicate: ["contactShadows"], descendants: true, isSignal: true }, { propertyName: "shadowsCameraRef", first: true, predicate: ["shadowsCamera"], descendants: true, isSignal: true }], ngImport: i0, template: `
155
+ <ngt-group #contactShadows [rotation]="[Math.PI / 2, 0, 0]" [parameters]="parameters()">
156
+ <ngt-mesh
157
+ [scale]="[1, -1, 1]"
158
+ [rotation]="[-Math.PI / 2, 0, 0]"
159
+ [renderOrder]="renderOrder() ?? 0"
160
+ [geometry]="planeGeometry()"
161
+ >
162
+ <ngt-mesh-basic-material
163
+ [transparent]="true"
164
+ [opacity]="opacity()"
165
+ [depthWrite]="depthWrite()"
166
+ [map]="texture()"
167
+ />
168
+ </ngt-mesh>
169
+ <ngt-orthographic-camera *args="cameraArgs()" #shadowsCamera />
170
+ </ngt-group>
171
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
172
+ }
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: NgtsContactShadows, decorators: [{
174
+ type: Component,
175
+ args: [{
176
+ selector: 'ngts-contact-shadows',
177
+ standalone: true,
178
+ template: `
179
+ <ngt-group #contactShadows [rotation]="[Math.PI / 2, 0, 0]" [parameters]="parameters()">
180
+ <ngt-mesh
181
+ [scale]="[1, -1, 1]"
182
+ [rotation]="[-Math.PI / 2, 0, 0]"
183
+ [renderOrder]="renderOrder() ?? 0"
184
+ [geometry]="planeGeometry()"
185
+ >
186
+ <ngt-mesh-basic-material
187
+ [transparent]="true"
188
+ [opacity]="opacity()"
189
+ [depthWrite]="depthWrite()"
190
+ [map]="texture()"
191
+ />
192
+ </ngt-mesh>
193
+ <ngt-orthographic-camera *args="cameraArgs()" #shadowsCamera />
194
+ </ngt-group>
195
+ `,
196
+ imports: [NgtArgs],
197
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
198
+ changeDetection: ChangeDetectionStrategy.OnPush,
199
+ }]
200
+ }], ctorParameters: () => [] });
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1zaGFkb3dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jb250YWN0LXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQVksTUFBTSxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQ04sS0FBSyxFQUVMLEtBQUssRUFFTCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGNBQWMsRUFFZCxpQkFBaUIsR0FDakIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBaUJ4RSxNQUFNLGNBQWMsR0FBOEI7SUFDakQsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUksRUFBRSxDQUFDO0lBQ1AsR0FBRyxFQUFFLEVBQUU7SUFDUCxVQUFVLEVBQUUsR0FBRztJQUNmLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLFNBQVM7SUFDaEIsVUFBVSxFQUFFLEtBQUs7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsaUJBQWlC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QUFDLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO2dCQUNqRCxLQUFLLENBQUMsVUFBVSxHQUFHLGlCQUFpQixDQUFDO1lBQ3RDLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBbkpXLGtCQUFrQjtrR0FBbEIsa0JBQWtCLG1kQXRCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUJULDREQUNTLE9BQU87OzJGQUlMLGtCQUFrQjtrQkF6QjlCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQlQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNsQixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0Y29tcHV0ZWQsXG5cdGlucHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgTmd0R3JvdXAsIGV4dGVuZCwgaW5qZWN0TmV4dEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7XG5cdENvbG9yLFxuXHRDb2xvclJlcHJlc2VudGF0aW9uLFxuXHRHcm91cCxcblx0TWF0ZXJpYWwsXG5cdE1lc2gsXG5cdE1lc2hCYXNpY01hdGVyaWFsLFxuXHRNZXNoRGVwdGhNYXRlcmlhbCxcblx0T3J0aG9ncmFwaGljQ2FtZXJhLFxuXHRQbGFuZUdlb21ldHJ5LFxuXHRTaGFkZXJNYXRlcmlhbCxcblx0VGV4dHVyZSxcblx0V2ViR0xSZW5kZXJUYXJnZXQsXG59IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEhvcml6b250YWxCbHVyU2hhZGVyLCBWZXJ0aWNhbEJsdXJTaGFkZXIgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNDb250YWN0U2hhZG93c09wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPE9taXQ8Tmd0R3JvdXAsICdzY2FsZSc+PiB7XG5cdG9wYWNpdHk6IG51bWJlcjtcblx0d2lkdGg6IG51bWJlcjtcblx0aGVpZ2h0OiBudW1iZXI7XG5cdGJsdXI6IG51bWJlcjtcblx0bmVhcjogbnVtYmVyO1xuXHRmYXI6IG51bWJlcjtcblx0c21vb3RoOiBib29sZWFuO1xuXHRyZXNvbHV0aW9uOiBudW1iZXI7XG5cdGZyYW1lczogbnVtYmVyO1xuXHRzY2FsZTogbnVtYmVyIHwgW3g6IG51bWJlciwgeTogbnVtYmVyXTtcblx0Y29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247XG5cdGRlcHRoV3JpdGU6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzQ29udGFjdFNoYWRvd3NPcHRpb25zID0ge1xuXHRzY2FsZTogMTAsXG5cdGZyYW1lczogSW5maW5pdHksXG5cdG9wYWNpdHk6IDEsXG5cdHdpZHRoOiAxLFxuXHRoZWlnaHQ6IDEsXG5cdGJsdXI6IDEsXG5cdG5lYXI6IDAsXG5cdGZhcjogMTAsXG5cdHJlc29sdXRpb246IDUxMixcblx0c21vb3RoOiB0cnVlLFxuXHRjb2xvcjogJyMwMDAwMDAnLFxuXHRkZXB0aFdyaXRlOiBmYWxzZSxcbn07XG5cbmV4dGVuZCh7IEdyb3VwLCBNZXNoLCBNZXNoQmFzaWNNYXRlcmlhbCwgT3J0aG9ncmFwaGljQ2FtZXJhIH0pO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWNvbnRhY3Qtc2hhZG93cycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjY29udGFjdFNoYWRvd3MgW3JvdGF0aW9uXT1cIltNYXRoLlBJIC8gMiwgMCwgMF1cIiBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZ3QtbWVzaFxuXHRcdFx0XHRbc2NhbGVdPVwiWzEsIC0xLCAxXVwiXG5cdFx0XHRcdFtyb3RhdGlvbl09XCJbLU1hdGguUEkgLyAyLCAwLCAwXVwiXG5cdFx0XHRcdFtyZW5kZXJPcmRlcl09XCJyZW5kZXJPcmRlcigpID8/IDBcIlxuXHRcdFx0XHRbZ2VvbWV0cnldPVwicGxhbmVHZW9tZXRyeSgpXCJcblx0XHRcdD5cblx0XHRcdFx0PG5ndC1tZXNoLWJhc2ljLW1hdGVyaWFsXG5cdFx0XHRcdFx0W3RyYW5zcGFyZW50XT1cInRydWVcIlxuXHRcdFx0XHRcdFtvcGFjaXR5XT1cIm9wYWNpdHkoKVwiXG5cdFx0XHRcdFx0W2RlcHRoV3JpdGVdPVwiZGVwdGhXcml0ZSgpXCJcblx0XHRcdFx0XHRbbWFwXT1cInRleHR1cmUoKVwiXG5cdFx0XHRcdC8+XG5cdFx0XHQ8L25ndC1tZXNoPlxuXHRcdFx0PG5ndC1vcnRob2dyYXBoaWMtY2FtZXJhICphcmdzPVwiY2FtZXJhQXJncygpXCIgI3NoYWRvd3NDYW1lcmEgLz5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ29udGFjdFNoYWRvd3Mge1xuXHRNYXRoID0gTWF0aDtcblxuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgW1xuXHRcdCdzY2FsZScsXG5cdFx0J2ZyYW1lcycsXG5cdFx0J29wYWNpdHknLFxuXHRcdCd3aWR0aCcsXG5cdFx0J2hlaWdodCcsXG5cdFx0J2JsdXInLFxuXHRcdCduZWFyJyxcblx0XHQnZmFyJyxcblx0XHQncmVzb2x1dGlvbicsXG5cdFx0J3Ntb290aCcsXG5cdFx0J2NvbG9yJyxcblx0XHQnZGVwdGhXcml0ZScsXG5cdFx0J3JlbmRlck9yZGVyJyxcblx0XSk7XG5cblx0Y29udGFjdFNoYWRvd3NSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdjb250YWN0U2hhZG93cycpO1xuXHRzaGFkb3dzQ2FtZXJhUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8T3J0aG9ncmFwaGljQ2FtZXJhPj4oJ3NoYWRvd3NDYW1lcmEnKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cblx0cHJpdmF0ZSBzY2FsZWRXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IHdpZHRoLCBzY2FsZSB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0cmV0dXJuIHdpZHRoICogKEFycmF5LmlzQXJyYXkoc2NhbGUpID8gc2NhbGVbMF0gOiBzY2FsZSk7XG5cdH0pO1xuXHRwcml2YXRlIHNjYWxlZEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IGhlaWdodCwgc2NhbGUgfSA9IHRoaXMub3B0aW9ucygpO1xuXHRcdHJldHVybiBoZWlnaHQgKiAoQXJyYXkuaXNBcnJheShzY2FsZSkgPyBzY2FsZVsxXSA6IHNjYWxlKTtcblx0fSk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXHRwcml2YXRlIGNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xvcicpO1xuXHRwcml2YXRlIG5lYXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ25lYXInKTtcblx0cHJpdmF0ZSBmYXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2ZhcicpO1xuXG5cdHByaXZhdGUgc2hhZG93c09wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3dpZHRoLCBoZWlnaHQsIHJlc29sdXRpb24sIGNvbG9yXSA9IFtcblx0XHRcdHRoaXMuc2NhbGVkV2lkdGgoKSxcblx0XHRcdHRoaXMuc2NhbGVkSGVpZ2h0KCksXG5cdFx0XHR0aGlzLnJlc29sdXRpb24oKSxcblx0XHRcdHRoaXMuY29sb3IoKSxcblx0XHRdO1xuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChyZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcblx0XHRjb25zdCByZW5kZXJUYXJnZXRCbHVyID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KHJlc29sdXRpb24sIHJlc29sdXRpb24pO1xuXHRcdHJlbmRlclRhcmdldEJsdXIudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdGNvbnN0IHBsYW5lR2VvbWV0cnkgPSBuZXcgUGxhbmVHZW9tZXRyeSh3aWR0aCwgaGVpZ2h0KS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcblx0XHRjb25zdCBibHVyUGxhbmUgPSBuZXcgTWVzaChwbGFuZUdlb21ldHJ5KTtcblx0XHRjb25zdCBkZXB0aE1hdGVyaWFsID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCk7XG5cdFx0ZGVwdGhNYXRlcmlhbC5kZXB0aFRlc3QgPSBkZXB0aE1hdGVyaWFsLmRlcHRoV3JpdGUgPSBmYWxzZTtcblx0XHRkZXB0aE1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZSA9IChzaGFkZXIpID0+IHtcblx0XHRcdHNoYWRlci51bmlmb3JtcyA9IHsgLi4uc2hhZGVyLnVuaWZvcm1zLCB1Y29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvcihjb2xvcikgfSB9O1xuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG5cdFx0XHRcdGB2b2lkIG1haW4oKSB7YCwgLy9cblx0XHRcdFx0YHVuaWZvcm0gdmVjMyB1Y29sb3I7XG4gICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGAsXG5cdFx0XHQpO1xuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG5cdFx0XHRcdCd2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTsnLFxuXHRcdFx0XHQvLyBDb2xvcml6ZSB0aGUgc2hhZG93LCBtdWx0aXBseSBieSB0aGUgZmFsbG9mZiBzbyB0aGF0IHRoZSBjZW50ZXIgY2FuIHJlbWFpbiBkYXJrZXJcblx0XHRcdFx0J3ZlYzQoIHVjb2xvciAqIGZyYWdDb29yZFogKiAyLjAsICggMS4wIC0gZnJhZ0Nvb3JkWiApICogMS4wICk7Jyxcblx0XHRcdCk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGhvcml6b250YWxCbHVyTWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoSG9yaXpvbnRhbEJsdXJTaGFkZXIpO1xuXHRcdGNvbnN0IHZlcnRpY2FsQmx1ck1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKFZlcnRpY2FsQmx1clNoYWRlcik7XG5cdFx0dmVydGljYWxCbHVyTWF0ZXJpYWwuZGVwdGhUZXN0ID0gaG9yaXpvbnRhbEJsdXJNYXRlcmlhbC5kZXB0aFRlc3QgPSBmYWxzZTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRyZW5kZXJUYXJnZXQsXG5cdFx0XHRwbGFuZUdlb21ldHJ5LFxuXHRcdFx0ZGVwdGhNYXRlcmlhbCxcblx0XHRcdGJsdXJQbGFuZSxcblx0XHRcdGhvcml6b250YWxCbHVyTWF0ZXJpYWwsXG5cdFx0XHR2ZXJ0aWNhbEJsdXJNYXRlcmlhbCxcblx0XHRcdHJlbmRlclRhcmdldEJsdXIsXG5cdFx0fTtcblx0fSk7XG5cblx0cmVuZGVyT3JkZXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3JlbmRlck9yZGVyJyk7XG5cdG9wYWNpdHkgPSBwaWNrKHRoaXMub3B0aW9ucywgJ29wYWNpdHknKTtcblx0ZGVwdGhXcml0ZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZGVwdGhXcml0ZScpO1xuXHRwbGFuZUdlb21ldHJ5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zaGFkb3dzT3B0aW9ucygpLnBsYW5lR2VvbWV0cnkpO1xuXHR0ZXh0dXJlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zaGFkb3dzT3B0aW9ucygpLnJlbmRlclRhcmdldC50ZXh0dXJlKTtcblx0Y2FtZXJhQXJncyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbd2lkdGgsIGhlaWdodCwgbmVhciwgZmFyXSA9IFt0aGlzLnNjYWxlZFdpZHRoKCksIHRoaXMuc2NhbGVkSGVpZ2h0KCksIHRoaXMubmVhcigpLCB0aGlzLmZhcigpXTtcblx0XHRyZXR1cm4gWy13aWR0aCAvIDIsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgLWhlaWdodCAvIDIsIG5lYXIsIGZhcl07XG5cdH0pO1xuXG5cdHByaXZhdGUgYmx1clNoYWRvd3MoYmx1cjogbnVtYmVyKSB7XG5cdFx0Y29uc3QgeyByZW5kZXJUYXJnZXQsIHJlbmRlclRhcmdldEJsdXIsIGJsdXJQbGFuZSwgaG9yaXpvbnRhbEJsdXJNYXRlcmlhbCwgdmVydGljYWxCbHVyTWF0ZXJpYWwgfSA9XG5cdFx0XHR0aGlzLnNoYWRvd3NPcHRpb25zKCk7XG5cdFx0Y29uc3Qgc2hhZG93c0NhbWVyYSA9IHRoaXMuc2hhZG93c0NhbWVyYVJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdGlmICghc2hhZG93c0NhbWVyYSkgcmV0dXJuO1xuXG5cdFx0Ymx1clBsYW5lLnZpc2libGUgPSB0cnVlO1xuXHRcdGJsdXJQbGFuZS5tYXRlcmlhbCA9IGhvcml6b250YWxCbHVyTWF0ZXJpYWw7XG5cdFx0aG9yaXpvbnRhbEJsdXJNYXRlcmlhbC51bmlmb3Jtc1sndERpZmZ1c2UnXS52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdGhvcml6b250YWxCbHVyTWF0ZXJpYWwudW5pZm9ybXNbJ2gnXS52YWx1ZSA9IChibHVyICogMSkgLyAyNTY7XG5cdFx0dGhpcy5nbCgpLnNldFJlbmRlclRhcmdldChyZW5kZXJUYXJnZXRCbHVyKTtcblx0XHR0aGlzLmdsKCkucmVuZGVyKGJsdXJQbGFuZSwgc2hhZG93c0NhbWVyYSk7XG5cblx0XHRibHVyUGxhbmUubWF0ZXJpYWwgPSB2ZXJ0aWNhbEJsdXJNYXRlcmlhbDtcblx0XHR2ZXJ0aWNhbEJsdXJNYXRlcmlhbC51bmlmb3Jtc1sndERpZmZ1c2UnXS52YWx1ZSA9IHJlbmRlclRhcmdldEJsdXIudGV4dHVyZTtcblx0XHR2ZXJ0aWNhbEJsdXJNYXRlcmlhbC51bmlmb3Jtc1sndiddLnZhbHVlID0gKGJsdXIgKiAxKSAvIDI1Njtcblx0XHR0aGlzLmdsKCkuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XG5cdFx0dGhpcy5nbCgpLnJlbmRlcihibHVyUGxhbmUsIHNoYWRvd3NDYW1lcmEpO1xuXHRcdGJsdXJQbGFuZS52aXNpYmxlID0gZmFsc2U7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRsZXQgY291bnQgPSAwO1xuXHRcdGxldCBpbml0aWFsQmFja2dyb3VuZDogQ29sb3IgfCBUZXh0dXJlIHwgbnVsbDtcblx0XHRsZXQgaW5pdGlhbE92ZXJyaWRlTWF0ZXJpYWw6IE1hdGVyaWFsIHwgbnVsbDtcblxuXHRcdGluamVjdE5leHRCZWZvcmVSZW5kZXIoKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc2hhZG93c0NhbWVyYSA9IHRoaXMuc2hhZG93c0NhbWVyYVJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdFx0Y29uc3QgW3sgZnJhbWVzLCBibHVyLCBzbW9vdGggfSwgZ2wsIHNjZW5lLCBjb250YWN0U2hhZG93cywgeyBkZXB0aE1hdGVyaWFsLCByZW5kZXJUYXJnZXQgfV0gPSBbXG5cdFx0XHRcdHRoaXMub3B0aW9ucygpLFxuXHRcdFx0XHR0aGlzLmdsKCksXG5cdFx0XHRcdHRoaXMuc2NlbmUoKSxcblx0XHRcdFx0dGhpcy5jb250YWN0U2hhZG93c1JlZigpLFxuXHRcdFx0XHR0aGlzLnNoYWRvd3NPcHRpb25zKCksXG5cdFx0XHRdO1xuXHRcdFx0aWYgKHNoYWRvd3NDYW1lcmEgJiYgKGZyYW1lcyA9PT0gSW5maW5pdHkgfHwgY291bnQgPCBmcmFtZXMpKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdGluaXRpYWxCYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblx0XHRcdFx0aW5pdGlhbE92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXHRcdFx0XHRjb250YWN0U2hhZG93cy5uYXRpdmVFbGVtZW50LnZpc2libGUgPSBmYWxzZTtcblx0XHRcdFx0c2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG5cdFx0XHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBkZXB0aE1hdGVyaWFsO1xuXHRcdFx0XHRnbC5zZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KTtcblx0XHRcdFx0Z2wucmVuZGVyKHNjZW5lLCBzaGFkb3dzQ2FtZXJhKTtcblx0XHRcdFx0dGhpcy5ibHVyU2hhZG93cyhibHVyKTtcblx0XHRcdFx0aWYgKHNtb290aCkgdGhpcy5ibHVyU2hhZG93cyhibHVyICogMC40KTtcblx0XHRcdFx0Z2wuc2V0UmVuZGVyVGFyZ2V0KG51bGwpO1xuXHRcdFx0XHRjb250YWN0U2hhZG93cy5uYXRpdmVFbGVtZW50LnZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gaW5pdGlhbE92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHRcdHNjZW5lLmJhY2tncm91bmQgPSBpbml0aWFsQmFja2dyb3VuZDtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIl19