angular-three-soba 2.0.0-beta.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. package/README.md +62 -4
  2. package/abstractions/README.md +279 -2
  3. package/abstractions/index.d.ts +13 -6
  4. package/abstractions/lib/billboard.d.ts +19 -0
  5. package/abstractions/lib/catmull-rom-line.d.ts +617 -0
  6. package/abstractions/lib/cubic-bezier-line.d.ts +19 -0
  7. package/abstractions/lib/edges.d.ts +800 -0
  8. package/abstractions/lib/gradient-texture.d.ts +24 -0
  9. package/abstractions/lib/grid.d.ts +315 -0
  10. package/abstractions/lib/helper.d.ts +25 -0
  11. package/abstractions/lib/line.d.ts +41 -0
  12. package/abstractions/lib/prism-geometry.d.ts +32 -0
  13. package/abstractions/lib/quadratic-bezier-line.d.ts +21 -0
  14. package/abstractions/lib/rounded-box.d.ts +41 -0
  15. package/abstractions/lib/text-3d.d.ts +314 -0
  16. package/abstractions/lib/text.d.ts +54 -0
  17. package/cameras/README.md +91 -2
  18. package/cameras/index.d.ts +4 -4
  19. package/cameras/lib/camera-content.d.ts +10 -0
  20. package/cameras/lib/cube-camera.d.ts +38 -0
  21. package/cameras/lib/orthographic-camera.d.ts +40 -0
  22. package/cameras/lib/perspective-camera.d.ts +36 -0
  23. package/controls/README.md +96 -2
  24. package/controls/index.d.ts +4 -1
  25. package/controls/lib/camera-controls.d.ts +31 -0
  26. package/controls/lib/orbit-controls.d.ts +38 -0
  27. package/controls/lib/pivot-controls/axis-arrow.d.ts +31 -0
  28. package/controls/lib/pivot-controls/axis-rotator.d.ts +30 -0
  29. package/controls/lib/pivot-controls/pivot-controls.d.ts +110 -0
  30. package/controls/lib/pivot-controls/plane-slider.d.ts +32 -0
  31. package/controls/lib/pivot-controls/scaling-sphere.d.ts +32 -0
  32. package/controls/lib/scroll-controls.d.ts +78 -0
  33. package/esm2022/abstractions/index.mjs +14 -7
  34. package/esm2022/abstractions/lib/billboard.mjs +69 -0
  35. package/esm2022/abstractions/lib/catmull-rom-line.mjs +76 -0
  36. package/esm2022/abstractions/lib/cubic-bezier-line.mjs +51 -0
  37. package/esm2022/abstractions/lib/edges.mjs +70 -0
  38. package/esm2022/abstractions/lib/gradient-texture.mjs +91 -0
  39. package/esm2022/abstractions/lib/grid.mjs +103 -0
  40. package/esm2022/abstractions/lib/helper.mjs +76 -0
  41. package/esm2022/abstractions/lib/line.mjs +126 -0
  42. package/esm2022/abstractions/lib/prism-geometry.mjs +46 -0
  43. package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +73 -0
  44. package/esm2022/abstractions/lib/rounded-box.mjs +111 -0
  45. package/esm2022/abstractions/lib/text-3d.mjs +98 -0
  46. package/esm2022/abstractions/lib/text.mjs +91 -0
  47. package/esm2022/cameras/index.mjs +5 -5
  48. package/esm2022/cameras/lib/camera-content.mjs +14 -0
  49. package/esm2022/cameras/lib/cube-camera.mjs +111 -0
  50. package/esm2022/cameras/lib/orthographic-camera.mjs +131 -0
  51. package/esm2022/cameras/lib/perspective-camera.mjs +104 -0
  52. package/esm2022/controls/index.mjs +5 -2
  53. package/esm2022/controls/lib/camera-controls.mjs +127 -0
  54. package/esm2022/controls/lib/orbit-controls.mjs +132 -0
  55. package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +263 -0
  56. package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +264 -0
  57. package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +340 -0
  58. package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +266 -0
  59. package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +232 -0
  60. package/esm2022/controls/lib/scroll-controls.mjs +268 -0
  61. package/esm2022/loaders/index.mjs +6 -5
  62. package/esm2022/loaders/lib/font-loader.mjs +49 -0
  63. package/esm2022/loaders/lib/gltf-loader.mjs +51 -0
  64. package/esm2022/loaders/lib/loader.mjs +109 -0
  65. package/esm2022/loaders/lib/progress.mjs +51 -0
  66. package/esm2022/loaders/lib/texture-loader.mjs +32 -0
  67. package/esm2022/materials/index.mjs +8 -7
  68. package/esm2022/materials/lib/custom-shader-material.mjs +71 -0
  69. package/esm2022/materials/lib/mesh-distort-material.mjs +42 -0
  70. package/esm2022/materials/lib/mesh-reflector-material.mjs +278 -0
  71. package/esm2022/materials/lib/mesh-refraction-material.mjs +144 -0
  72. package/esm2022/materials/lib/mesh-transmission-material.mjs +188 -0
  73. package/esm2022/materials/lib/mesh-wobble-material.mjs +42 -0
  74. package/esm2022/materials/lib/point-material.mjs +33 -0
  75. package/esm2022/misc/index.mjs +14 -14
  76. package/esm2022/misc/lib/animations.mjs +71 -0
  77. package/esm2022/misc/lib/bake-shadows.mjs +26 -0
  78. package/esm2022/misc/lib/computed-attribute.mjs +55 -0
  79. package/esm2022/misc/lib/constants.mjs +5 -0
  80. package/esm2022/misc/lib/decal.mjs +139 -0
  81. package/esm2022/misc/lib/deprecated.mjs +15 -0
  82. package/esm2022/misc/lib/depth-buffer.mjs +39 -0
  83. package/esm2022/misc/lib/fbo.mjs +86 -0
  84. package/esm2022/misc/lib/html/html-content.mjs +327 -0
  85. package/esm2022/misc/lib/html/html.mjs +129 -0
  86. package/esm2022/misc/lib/html/utils.mjs +74 -0
  87. package/esm2022/misc/lib/intersect.mjs +52 -0
  88. package/esm2022/misc/lib/sampler.mjs +122 -0
  89. package/esm2022/misc/lib/scale-factor.mjs +29 -0
  90. package/esm2022/performances/index.mjs +7 -6
  91. package/esm2022/performances/lib/adaptive-dpr.mjs +52 -0
  92. package/esm2022/performances/lib/adaptive-events.mjs +28 -0
  93. package/esm2022/performances/lib/detailed.mjs +57 -0
  94. package/esm2022/performances/lib/instances/instances.mjs +183 -0
  95. package/esm2022/performances/lib/instances/position-mesh.mjs +51 -0
  96. package/esm2022/performances/lib/points/points.mjs +278 -0
  97. package/esm2022/performances/lib/points/position-point.mjs +53 -0
  98. package/esm2022/performances/lib/segments/segment-object.mjs +9 -0
  99. package/esm2022/performances/lib/segments/segments.mjs +129 -0
  100. package/esm2022/shaders/index.mjs +4 -18
  101. package/esm2022/shaders/lib/grid-material.mjs +81 -0
  102. package/esm2022/shaders/lib/mesh-refraction-material.mjs +163 -0
  103. package/esm2022/shaders/lib/point-material.mjs +24 -0
  104. package/esm2022/staging/index.mjs +19 -22
  105. package/esm2022/staging/lib/accumulative-shadows.mjs +182 -0
  106. package/esm2022/staging/lib/backdrop.mjs +73 -0
  107. package/esm2022/staging/lib/bb-anchor.mjs +58 -0
  108. package/esm2022/staging/lib/bounds.mjs +286 -0
  109. package/esm2022/staging/lib/camera-shake.mjs +69 -0
  110. package/esm2022/staging/lib/caustics.mjs +188 -0
  111. package/esm2022/staging/lib/center.mjs +118 -0
  112. package/esm2022/staging/lib/contact-shadows.mjs +214 -0
  113. package/esm2022/staging/lib/environment.mjs +481 -0
  114. package/esm2022/staging/lib/float.mjs +70 -0
  115. package/esm2022/staging/lib/lightformer.mjs +107 -0
  116. package/esm2022/staging/lib/matcap-texture.mjs +81 -0
  117. package/esm2022/staging/lib/normal-texture.mjs +81 -0
  118. package/esm2022/staging/lib/randomized-lights.mjs +104 -0
  119. package/esm2022/staging/lib/render-texture.mjs +203 -0
  120. package/esm2022/staging/lib/sky.mjs +86 -0
  121. package/esm2022/staging/lib/spot-light.mjs +453 -0
  122. package/esm2022/staging/lib/stage.mjs +236 -0
  123. package/esm2022/{utils/angular-three-soba-utils.mjs → stats/angular-three-soba-stats.mjs} +1 -1
  124. package/esm2022/stats/index.mjs +2 -0
  125. package/esm2022/stats/lib/stats.mjs +63 -0
  126. package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
  127. package/esm2022/vanilla-exports/index.mjs +3 -0
  128. package/fesm2022/angular-three-soba-abstractions.mjs +884 -697
  129. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  130. package/fesm2022/angular-three-soba-cameras.mjs +261 -308
  131. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  132. package/fesm2022/angular-three-soba-controls.mjs +1776 -109
  133. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  134. package/fesm2022/angular-three-soba-loaders.mjs +191 -145
  135. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  136. package/fesm2022/angular-three-soba-materials.mjs +527 -748
  137. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  138. package/fesm2022/angular-three-soba-misc.mjs +783 -1935
  139. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  140. package/fesm2022/angular-three-soba-performances.mjs +591 -475
  141. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  142. package/fesm2022/angular-three-soba-shaders.mjs +51 -1369
  143. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  144. package/fesm2022/angular-three-soba-staging.mjs +2350 -3521
  145. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  146. package/fesm2022/angular-three-soba-stats.mjs +70 -0
  147. package/fesm2022/angular-three-soba-stats.mjs.map +1 -0
  148. package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
  149. package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
  150. package/loaders/README.md +130 -2
  151. package/loaders/index.d.ts +5 -4
  152. package/loaders/lib/font-loader.d.ts +27 -0
  153. package/loaders/lib/gltf-loader.d.ts +24 -0
  154. package/loaders/lib/loader.d.ts +29 -0
  155. package/loaders/lib/progress.d.ts +9 -0
  156. package/loaders/lib/texture-loader.d.ts +13 -0
  157. package/materials/README.md +160 -2
  158. package/materials/index.d.ts +7 -6
  159. package/materials/lib/custom-shader-material.d.ts +20 -0
  160. package/materials/lib/mesh-distort-material.d.ts +17 -0
  161. package/materials/lib/mesh-reflector-material.d.ts +51 -0
  162. package/materials/lib/mesh-refraction-material.d.ts +42 -0
  163. package/materials/lib/mesh-transmission-material.d.ts +77 -0
  164. package/materials/lib/mesh-wobble-material.d.ts +15 -0
  165. package/materials/lib/point-material.d.ts +11 -0
  166. package/metadata.json +1 -1
  167. package/misc/README.md +217 -2
  168. package/misc/index.d.ts +13 -13
  169. package/misc/lib/animations.d.ts +17 -0
  170. package/misc/lib/computed-attribute.d.ts +64 -0
  171. package/misc/lib/constants.d.ts +1 -0
  172. package/misc/lib/decal.d.ts +27 -0
  173. package/misc/lib/deprecated.d.ts +14 -0
  174. package/misc/lib/depth-buffer.d.ts +8 -0
  175. package/misc/lib/fbo.d.ts +46 -0
  176. package/misc/lib/html/html-content.d.ts +47 -0
  177. package/misc/lib/html/html.d.ts +30 -0
  178. package/misc/lib/html/utils.d.ts +14 -0
  179. package/misc/lib/intersect.d.ts +13 -0
  180. package/misc/lib/sampler.d.ts +73 -0
  181. package/misc/lib/scale-factor.d.ts +3 -0
  182. package/package.json +89 -48
  183. package/performances/index.d.ts +6 -5
  184. package/performances/lib/adaptive-dpr.d.ts +7 -0
  185. package/performances/{adaptive-events → lib}/adaptive-events.d.ts +0 -3
  186. package/performances/lib/detailed.d.ts +17 -0
  187. package/performances/lib/instances/instances.d.ts +122 -0
  188. package/performances/lib/instances/position-mesh.d.ts +20 -0
  189. package/performances/lib/points/points.d.ts +224 -0
  190. package/performances/lib/points/position-point.d.ts +21 -0
  191. package/performances/lib/segments/segment-object.d.ts +17 -0
  192. package/performances/lib/segments/segments.d.ts +97 -0
  193. package/shaders/index.d.ts +3 -17
  194. package/shaders/lib/grid-material.d.ts +69 -0
  195. package/shaders/lib/mesh-refraction-material.d.ts +11 -0
  196. package/shaders/lib/point-material.d.ts +14 -0
  197. package/staging/README.md +473 -2
  198. package/staging/index.d.ts +18 -21
  199. package/staging/lib/accumulative-shadows.d.ts +75 -0
  200. package/staging/lib/backdrop.d.ts +22 -0
  201. package/staging/lib/bb-anchor.d.ts +17 -0
  202. package/staging/lib/bounds.d.ts +47 -0
  203. package/staging/lib/camera-shake.d.ts +29 -0
  204. package/staging/lib/caustics.d.ts +53 -0
  205. package/staging/lib/center.d.ts +390 -0
  206. package/staging/lib/contact-shadows.d.ts +55 -0
  207. package/staging/lib/environment.d.ts +132 -0
  208. package/staging/lib/float.d.ts +20 -0
  209. package/staging/lib/lightformer.d.ts +310 -0
  210. package/staging/lib/matcap-texture.d.ts +32 -0
  211. package/staging/lib/normal-texture.d.ts +37 -0
  212. package/staging/lib/randomized-lights.d.ts +54 -0
  213. package/staging/lib/render-texture.d.ts +64 -0
  214. package/staging/lib/sky.d.ts +32 -0
  215. package/staging/lib/spot-light.d.ts +119 -0
  216. package/staging/lib/stage.d.ts +352 -0
  217. package/stats/README.md +3 -0
  218. package/stats/index.d.ts +1 -0
  219. package/stats/lib/stats.d.ts +14 -0
  220. package/vanilla-exports/README.md +3 -0
  221. package/vanilla-exports/index.d.ts +27 -0
  222. package/web-types.json +1 -1
  223. package/abstractions/billboard/billboard.d.ts +0 -28
  224. package/abstractions/detailed/detailed.d.ts +0 -26
  225. package/abstractions/edges/edges.d.ts +0 -34
  226. package/abstractions/grid/grid.d.ts +0 -50
  227. package/abstractions/text/text.d.ts +0 -82
  228. package/abstractions/text-3d/text-3d.d.ts +0 -81
  229. package/assets/distort.vert.glsl +0 -1
  230. package/cameras/camera/camera-content.d.ts +0 -13
  231. package/cameras/camera/camera.d.ts +0 -26
  232. package/cameras/cube-camera/cube-camera.d.ts +0 -69
  233. package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
  234. package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
  235. package/controls/orbit-controls/orbit-controls.d.ts +0 -54
  236. package/esm2022/abstractions/billboard/billboard.mjs +0 -74
  237. package/esm2022/abstractions/detailed/detailed.mjs +0 -64
  238. package/esm2022/abstractions/edges/edges.mjs +0 -88
  239. package/esm2022/abstractions/grid/grid.mjs +0 -180
  240. package/esm2022/abstractions/text/text.mjs +0 -274
  241. package/esm2022/abstractions/text-3d/text-3d.mjs +0 -165
  242. package/esm2022/cameras/camera/camera-content.mjs +0 -20
  243. package/esm2022/cameras/camera/camera.mjs +0 -77
  244. package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
  245. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
  246. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
  247. package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -181
  248. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
  249. package/esm2022/loaders/loader/loader.mjs +0 -138
  250. package/esm2022/loaders/progress/progress.mjs +0 -45
  251. package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
  252. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
  253. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
  254. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
  255. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
  256. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  257. package/esm2022/materials/point-material/point-material.mjs +0 -46
  258. package/esm2022/misc/animations/animations.mjs +0 -59
  259. package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
  260. package/esm2022/misc/caustics/caustics.mjs +0 -387
  261. package/esm2022/misc/decal/decal.mjs +0 -187
  262. package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
  263. package/esm2022/misc/example/example.mjs +0 -160
  264. package/esm2022/misc/fbo/fbo.mjs +0 -47
  265. package/esm2022/misc/html/html-wrapper.mjs +0 -478
  266. package/esm2022/misc/html/html.mjs +0 -304
  267. package/esm2022/misc/sampler/sampler.mjs +0 -142
  268. package/esm2022/misc/shadow/shadow.mjs +0 -111
  269. package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
  270. package/esm2022/misc/trail/trail.mjs +0 -209
  271. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
  272. package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
  273. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
  274. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
  275. package/esm2022/modifiers/index.mjs +0 -2
  276. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
  277. package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
  278. package/esm2022/performances/points/points-input.mjs +0 -64
  279. package/esm2022/performances/points/points.mjs +0 -329
  280. package/esm2022/performances/points/position-point.mjs +0 -54
  281. package/esm2022/performances/segments/segment-object.mjs +0 -9
  282. package/esm2022/performances/segments/segments.mjs +0 -182
  283. package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
  284. package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
  285. package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
  286. package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
  287. package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
  288. package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
  289. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
  290. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  291. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
  292. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  293. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  294. package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
  295. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
  296. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
  297. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
  298. package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
  299. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
  300. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
  301. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
  302. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
  303. package/esm2022/staging/backdrop/backdrop.mjs +0 -77
  304. package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -70
  305. package/esm2022/staging/bounds/bounds.mjs +0 -308
  306. package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
  307. package/esm2022/staging/center/center.mjs +0 -163
  308. package/esm2022/staging/cloud/cloud.mjs +0 -158
  309. package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
  310. package/esm2022/staging/environment/assets.mjs +0 -13
  311. package/esm2022/staging/environment/environment-cube.mjs +0 -47
  312. package/esm2022/staging/environment/environment-ground.mjs +0 -41
  313. package/esm2022/staging/environment/environment-input.mjs +0 -119
  314. package/esm2022/staging/environment/environment-map.mjs +0 -53
  315. package/esm2022/staging/environment/environment-portal.mjs +0 -113
  316. package/esm2022/staging/environment/environment.mjs +0 -61
  317. package/esm2022/staging/environment/utils.mjs +0 -105
  318. package/esm2022/staging/float/float.mjs +0 -94
  319. package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
  320. package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
  321. package/esm2022/staging/sky/sky.mjs +0 -119
  322. package/esm2022/staging/sparkles/sparkles.mjs +0 -164
  323. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
  324. package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
  325. package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
  326. package/esm2022/staging/spot-light/spot-light.mjs +0 -81
  327. package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
  328. package/esm2022/staging/stage/stage.mjs +0 -388
  329. package/esm2022/staging/stars/stars.mjs +0 -147
  330. package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
  331. package/esm2022/staging/wireframe/wireframe.mjs +0 -224
  332. package/esm2022/utils/content/content.mjs +0 -15
  333. package/esm2022/utils/index.mjs +0 -2
  334. package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
  335. package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
  336. package/fesm2022/angular-three-soba-utils.mjs +0 -22
  337. package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
  338. package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
  339. package/loaders/loader/loader.d.ts +0 -33
  340. package/loaders/progress/progress.d.ts +0 -9
  341. package/loaders/texture-loader/texture-loader.d.ts +0 -7
  342. package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
  343. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
  344. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
  345. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
  346. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
  347. package/materials/point-material/point-material.d.ts +0 -24
  348. package/misc/animations/animations.d.ts +0 -15
  349. package/misc/caustics/caustics.d.ts +0 -87
  350. package/misc/decal/decal.d.ts +0 -49
  351. package/misc/depth-buffer/depth-buffer.d.ts +0 -9
  352. package/misc/example/example.d.ts +0 -81
  353. package/misc/fbo/fbo.d.ts +0 -17
  354. package/misc/html/html-wrapper.d.ts +0 -559
  355. package/misc/html/html.d.ts +0 -214
  356. package/misc/sampler/sampler.d.ts +0 -67
  357. package/misc/shadow/shadow.d.ts +0 -37
  358. package/misc/stats-gl/stats-gl.d.ts +0 -24
  359. package/misc/trail/trail.d.ts +0 -57
  360. package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
  361. package/misc/trail-texture/trail-texture.d.ts +0 -50
  362. package/modifiers/README.md +0 -3
  363. package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
  364. package/modifiers/index.d.ts +0 -1
  365. package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
  366. package/performances/points/points-input.d.ts +0 -32
  367. package/performances/points/points.d.ts +0 -92
  368. package/performances/points/position-point.d.ts +0 -11
  369. package/performances/segments/segment-object.d.ts +0 -7
  370. package/performances/segments/segments.d.ts +0 -124
  371. package/shaders/blur-pass/blur-pass.d.ts +0 -23
  372. package/shaders/caustics/caustics-material.d.ts +0 -4
  373. package/shaders/caustics/caustics-projection-material.d.ts +0 -4
  374. package/shaders/convolution-material/convolution-material.d.ts +0 -7
  375. package/shaders/discard-material/discard-material.d.ts +0 -3
  376. package/shaders/grid-material/grid-material.d.ts +0 -37
  377. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
  378. package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
  379. package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
  380. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
  381. package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
  382. package/shaders/shader-material/shader-material.d.ts +0 -6
  383. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
  384. package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
  385. package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
  386. package/shaders/star-field-material/star-field-material.d.ts +0 -13
  387. package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
  388. package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
  389. package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
  390. package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
  391. package/staging/backdrop/backdrop.d.ts +0 -30
  392. package/staging/bb-anchor/bb-anchor.d.ts +0 -27
  393. package/staging/bounds/bounds.d.ts +0 -134
  394. package/staging/camera-shake/camera-shake.d.ts +0 -43
  395. package/staging/center/center.d.ts +0 -70
  396. package/staging/cloud/cloud.d.ts +0 -51
  397. package/staging/contact-shadows/contact-shadows.d.ts +0 -70
  398. package/staging/environment/assets.d.ts +0 -13
  399. package/staging/environment/environment-cube.d.ts +0 -15
  400. package/staging/environment/environment-ground.d.ts +0 -13
  401. package/staging/environment/environment-input.d.ts +0 -68
  402. package/staging/environment/environment-map.d.ts +0 -16
  403. package/staging/environment/environment-portal.d.ts +0 -18
  404. package/staging/environment/environment.d.ts +0 -8
  405. package/staging/environment/utils.d.ts +0 -7
  406. package/staging/float/float.d.ts +0 -31
  407. package/staging/matcap-texture/matcap-texture.d.ts +0 -13
  408. package/staging/normal-texture/normal-texture.d.ts +0 -16
  409. package/staging/sky/sky.d.ts +0 -48
  410. package/staging/sparkles/sparkles.d.ts +0 -63
  411. package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
  412. package/staging/spot-light/shadow-mesh.d.ts +0 -37
  413. package/staging/spot-light/spot-light-input.d.ts +0 -38
  414. package/staging/spot-light/spot-light.d.ts +0 -39
  415. package/staging/spot-light/volumetric-mesh.d.ts +0 -24
  416. package/staging/stage/stage.d.ts +0 -130
  417. package/staging/stars/stars.d.ts +0 -45
  418. package/staging/wireframe/wireframe-input.d.ts +0 -65
  419. package/staging/wireframe/wireframe.d.ts +0 -28
  420. package/utils/README.md +0 -3
  421. package/utils/content/content.d.ts +0 -8
  422. package/utils/index.d.ts +0 -1
  423. /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.groupRef = viewChild.required('group');
59
+ this.sceneRef = viewChild.required('scene');
60
+ this.cameraRef = viewChild.required('camera');
61
+ this.planeRef = 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.cameraRef().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.cameraRef().nativeElement,
91
+ scene: this.sceneRef().nativeElement,
92
+ group: this.groupRef().nativeElement,
93
+ plane: this.planeRef().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.groupRef().nativeElement,
104
+ this.sceneRef().nativeElement,
105
+ this.planeRef().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.2.0", ngImport: i0, type: NgtsCaustics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsCaustics, isStandalone: true, selector: "ngts-caustics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "sceneRef", first: true, predicate: ["scene"], descendants: true, isSignal: true }, { propertyName: "cameraRef", first: true, predicate: ["camera"], descendants: true, isSignal: true }, { propertyName: "planeRef", 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.2.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+XG5cdFx0XHRcdFx0XHQ8bmd0LWxpbmUtYmFzaWMtbWF0ZXJpYWwgY29sb3I9XCIjZmZmZjAwXCIgW3RvbmVNYXBwZWRdPVwiZmFsc2VcIiAvPlxuXHRcdFx0XHRcdDwvbmd0cy1lZGdlcz5cblx0XHRcdFx0fVxuXHRcdFx0PC9uZ3QtbWVzaD5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0c2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05ndHNFZGdlc10sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNDYXVzdGljcyB7XG5cdHByb3RlY3RlZCByZWFkb25seSBNYXRoID0gTWF0aDtcblx0cHJvdGVjdGVkIHJlYWRvbmx5IEN1c3RvbUJsZW5kaW5nID0gQ3VzdG9tQmxlbmRpbmc7XG5cdHByb3RlY3RlZCByZWFkb25seSBPbmVGYWN0b3IgPSBPbmVGYWN0b3I7XG5cdHByb3RlY3RlZCByZWFkb25seSBTcmNBbHBoYUZhY3RvciA9IFNyY0FscGhhRmFjdG9yO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbXG5cdFx0J2ZyYW1lcycsXG5cdFx0J2RlYnVnJyxcblx0XHQnY2F1c3RpY3NPbmx5Jyxcblx0XHQnYmFja3NpZGUnLFxuXHRcdCdpb3InLFxuXHRcdCdiYWNrc2lkZUlPUicsXG5cdFx0J3dvcmxkUmFkaXVzJyxcblx0XHQnaW50ZW5zaXR5Jyxcblx0XHQnY29sb3InLFxuXHRcdCdyZXNvbHV0aW9uJyxcblx0XHQnbGlnaHRTb3VyY2UnLFxuXHRdKTtcblxuXHRkZWJ1ZyA9IHBpY2sodGhpcy5vcHRpb25zLCAnZGVidWcnKTtcblx0Y29sb3IgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbG9yJyk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXG5cdGdyb3VwUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8R3JvdXA+PignZ3JvdXAnKTtcblx0cHJpdmF0ZSBzY2VuZVJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPFNjZW5lPj4oJ3NjZW5lJyk7XG5cdHByaXZhdGUgY2FtZXJhUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8T3J0aG9ncmFwaGljQ2FtZXJhPj4oJ2NhbWVyYScpO1xuXHRwcml2YXRlIHBsYW5lUmVmID1cblx0XHR2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxNZXNoPFBsYW5lR2VvbWV0cnksIEluc3RhbmNlVHlwZTx0eXBlb2YgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWw+Pj4+KCdwbGFuZScpO1xuXG5cdHByaXZhdGUgbm9ybWFsVGFyZ2V0UGFyYW1zID0gY29tcHV0ZWQoKCkgPT4gKHtcblx0XHR3aWR0aDogdGhpcy5yZXNvbHV0aW9uKCksXG5cdFx0aGVpZ2h0OiB0aGlzLnJlc29sdXRpb24oKSxcblx0XHRzZXR0aW5nczogTk9STUFMX09QVElPTlMsXG5cdH0pKTtcblxuXHQvLyBCdWZmZXJzIGZvciBmcm9udCBhbmQgYmFjayBmYWNlc1xuXHRwcml2YXRlIG5vcm1hbFRhcmdldCA9IGluamVjdEZCTyh0aGlzLm5vcm1hbFRhcmdldFBhcmFtcyk7XG5cdHByaXZhdGUgbm9ybWFsVGFyZ2V0QiA9IGluamVjdEZCTyh0aGlzLm5vcm1hbFRhcmdldFBhcmFtcyk7XG5cblx0cHJpdmF0ZSBjYXVzdGljc1RhcmdldFBhcmFtcyA9IGNvbXB1dGVkKCgpID0+ICh7XG5cdFx0d2lkdGg6IHRoaXMucmVzb2x1dGlvbigpLFxuXHRcdGhlaWdodDogdGhpcy5yZXNvbHV0aW9uKCksXG5cdFx0c2V0dGluZ3M6IENBVVNUSUNfT1BUSU9OUyxcblx0fSkpO1xuXHRjYXVzdGljc1RhcmdldCA9IGluamVjdEZCTyh0aGlzLmNhdXN0aWNzVGFyZ2V0UGFyYW1zKTtcblx0Y2F1c3RpY3NUYXJnZXRCID0gaW5qZWN0RkJPKHRoaXMuY2F1c3RpY3NUYXJnZXRQYXJhbXMpO1xuXG5cdHByaXZhdGUgY2FtZXJhSGVscGVyID0gaW5qZWN0SGVscGVyKFxuXHRcdCgpID0+ICh0aGlzLmRlYnVnKCkgPyB0aGlzLmNhbWVyYVJlZigpLm5hdGl2ZUVsZW1lbnQgOiBudWxsKSxcblx0XHQoKSA9PiBDYW1lcmFIZWxwZXIsXG5cdCk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgQ2F1c3RpY3NQcm9qZWN0aW9uTWF0ZXJpYWwsIEdyb3VwLCBTY2VuZSwgTWVzaCwgUGxhbmVHZW9tZXRyeSwgTGluZUJhc2ljTWF0ZXJpYWwsIE9ydGhvZ3JhcGhpY0NhbWVyYSB9KTtcblxuXHRcdGNvbnN0IGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cblx0XHRjb25zdCB1cGRhdGUgPSBjcmVhdGVDYXVzdGljc1VwZGF0ZSgoKSA9PiB7XG5cdFx0XHRjb25zdCB7IGxpZ2h0U291cmNlLCAuLi5yZXN0IH0gPSB0aGlzLm9wdGlvbnMoKTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cGFyYW1zOiBPYmplY3QuYXNzaWduKHJlc3QsIHtcblx0XHRcdFx0XHRsaWdodFNvdXJjZTogQXJyYXkuaXNBcnJheShsaWdodFNvdXJjZSkgPyBuZXcgVmVjdG9yMyguLi5saWdodFNvdXJjZSkgOiByZXNvbHZlUmVmKGxpZ2h0U291cmNlKSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdG5vcm1hbFRhcmdldDogdGhpcy5ub3JtYWxUYXJnZXQoKSxcblx0XHRcdFx0bm9ybWFsVGFyZ2V0QjogdGhpcy5ub3JtYWxUYXJnZXRCKCksXG5cdFx0XHRcdGNhdXN0aWNzVGFyZ2V0OiB0aGlzLmNhdXN0aWNzVGFyZ2V0KCksXG5cdFx0XHRcdGNhdXN0aWNzVGFyZ2V0QjogdGhpcy5jYXVzdGljc1RhcmdldEIoKSxcblx0XHRcdFx0Y2FtZXJhOiB0aGlzLmNhbWVyYVJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHNjZW5lOiB0aGlzLnNjZW5lUmVmKCkubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0Z3JvdXA6IHRoaXMuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRwbGFuZTogdGhpcy5wbGFuZVJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdGhlbHBlcjogdGhpcy5jYW1lcmFIZWxwZXIoKSxcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRpbmplY3RCZWZvcmVSZW5kZXIoKHsgZ2wgfSkgPT4gdXBkYXRlKGdsKSk7XG5cblx0XHRhZnRlck5leHRSZW5kZXIoKCkgPT4ge1xuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdC8vIHRyYWNrIGFsbCBjaGFuZ2VzXG5cdFx0XHRcdHRoaXMub3B0aW9ucygpO1xuXHRcdFx0XHRjb25zdCBbZ3JvdXAsIHNjZW5lLCBwbGFuZV0gPSBbXG5cdFx0XHRcdFx0dGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdFx0dGhpcy5zY2VuZVJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdFx0dGhpcy5wbGFuZVJlZigpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdF07XG5cdFx0XHRcdGNvbnN0IGdyb3VwTG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoZ3JvdXApO1xuXHRcdFx0XHRjb25zdCBzY2VuZUxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKHNjZW5lKTtcblx0XHRcdFx0Y29uc3QgcGxhbmVMb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShwbGFuZSk7XG5cblx0XHRcdFx0aWYgKCFncm91cExvY2FsU3RhdGUgfHwgIXNjZW5lTG9jYWxTdGF0ZSB8fCAhcGxhbmVMb2NhbFN0YXRlKSByZXR1cm47XG5cblx0XHRcdFx0Z3JvdXBMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0c2NlbmVMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0cGxhbmVMb2NhbFN0YXRlLm9iamVjdHMoKTtcblx0XHRcdFx0cGxhbmVMb2NhbFN0YXRlLm5vbk9iamVjdHMoKTtcblxuXHRcdFx0XHRncm91cC51cGRhdGVXb3JsZE1hdHJpeChmYWxzZSwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,118 @@
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.groupRef = viewChild.required('group');
30
+ this.outerRef = viewChild.required('outer');
31
+ this.innerRef = 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,] = [
51
+ this.centerOptions(),
52
+ this.groupRef().nativeElement,
53
+ this.outerRef().nativeElement,
54
+ this.innerRef().nativeElement,
55
+ ];
56
+ const localState = getLocalState(inner);
57
+ const children = localState?.objects();
58
+ if (!children?.length)
59
+ return;
60
+ outer.matrixWorld.identity();
61
+ const box3 = new Box3().setFromObject(inner, precise);
62
+ const center = new Vector3();
63
+ const sphere = new Sphere();
64
+ const width = box3.max.x - box3.min.x;
65
+ const height = box3.max.y - box3.min.y;
66
+ const depth = box3.max.z - box3.min.z;
67
+ box3.getCenter(center);
68
+ box3.getBoundingSphere(sphere);
69
+ const vAlign = top ? height / 2 : bottom ? -height / 2 : 0;
70
+ const hAlign = left ? -width / 2 : right ? width / 2 : 0;
71
+ const dAlign = front ? depth / 2 : back ? -depth / 2 : 0;
72
+ outer.position.set(disable || disableX ? 0 : -center.x + hAlign, disable || disableY ? 0 : -center.y + vAlign, disable || disableZ ? 0 : -center.z + dAlign);
73
+ this.centered.emit({
74
+ parent: group.parent,
75
+ container: group,
76
+ width,
77
+ height,
78
+ depth,
79
+ boundingBox: box3,
80
+ boundingSphere: sphere,
81
+ center,
82
+ verticalAlignment: vAlign,
83
+ horizontalAlignment: hAlign,
84
+ depthAlignment: dAlign,
85
+ });
86
+ });
87
+ });
88
+ }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsCenter, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.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: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "outerRef", first: true, predicate: ["outer"], descendants: true, isSignal: true }, { propertyName: "innerRef", first: true, predicate: ["inner"], descendants: true, isSignal: true }], ngImport: i0, template: `
91
+ <ngt-group #group [parameters]="parameters()">
92
+ <ngt-group #outer>
93
+ <ngt-group #inner>
94
+ <ng-content />
95
+ </ngt-group>
96
+ </ngt-group>
97
+ </ngt-group>
98
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsCenter, decorators: [{
101
+ type: Component,
102
+ args: [{
103
+ selector: 'ngts-center',
104
+ standalone: true,
105
+ template: `
106
+ <ngt-group #group [parameters]="parameters()">
107
+ <ngt-group #outer>
108
+ <ngt-group #inner>
109
+ <ng-content />
110
+ </ngt-group>
111
+ </ngt-group>
112
+ </ngt-group>
113
+ `,
114
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
115
+ changeDetection: ChangeDetectionStrategy.OnPush,
116
+ }]
117
+ }], ctorParameters: () => [] });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jZW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULHNCQUFzQixFQUV0QixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBWSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQXVDL0QsTUFBTSxjQUFjLEdBQTBDO0lBQzdELE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLENBQUM7Q0FDWCxDQUFDO0FBaUJGLE1BQU0sT0FBTyxVQUFVO0lBc0N0QjtRQXJDQSxZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMvQixLQUFLO1lBQ0wsT0FBTztZQUNQLFFBQVE7WUFDUixNQUFNO1lBQ04sT0FBTztZQUNQLE1BQU07WUFDTixTQUFTO1lBQ1QsVUFBVTtZQUNWLFVBQVU7WUFDVixVQUFVO1lBQ1YsU0FBUztZQUNULFVBQVU7U0FDVixDQUFDLENBQUM7UUFFSCxhQUFRLEdBQUcsTUFBTSxFQUFtQixDQUFDO1FBRXJDLGFBQVEsR0FBRyxTQUFTLENB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OlsiaW1wb3J0IHtcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRFbGVtZW50UmVmLFxuXHRpbnB1dCxcblx0b3V0cHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRMb2NhbFN0YXRlLCBOZ3RHcm91cCwgb21pdCwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgaW5qZWN0QXV0b0VmZmVjdCB9IGZyb20gJ25neHRlbnNpb24vYXV0by1lZmZlY3QnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHsgQm94MywgR3JvdXAsIE9iamVjdDNELCBTcGhlcmUsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0NlbnRlclN0YXRlIHtcblx0LyoqIFRoZSBuZXh0IHBhcmVudCBhYm92ZSA8Q2VudGVyPiAqL1xuXHRwYXJlbnQ6IE9iamVjdDNEO1xuXHQvKiogVGhlIG91dG1vc3QgY29udGFpbmVyIGdyb3VwIG9mIHRoZSA8Q2VudGVyPiBjb21wb25lbnQgKi9cblx0Y29udGFpbmVyOiBPYmplY3QzRDtcblx0d2lkdGg6IG51bWJlcjtcblx0aGVpZ2h0OiBudW1iZXI7XG5cdGRlcHRoOiBudW1iZXI7XG5cdGJvdW5kaW5nQm94OiBCb3gzO1xuXHRib3VuZGluZ1NwaGVyZTogU3BoZXJlO1xuXHRjZW50ZXI6IFZlY3RvcjM7XG5cdHZlcnRpY2FsQWxpZ25tZW50OiBudW1iZXI7XG5cdGhvcml6b250YWxBbGlnbm1lbnQ6IG51bWJlcjtcblx0ZGVwdGhBbGlnbm1lbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzQ2VudGVyT3B0aW9ucyB7XG5cdHRvcD86IGJvb2xlYW47XG5cdHJpZ2h0PzogYm9vbGVhbjtcblx0Ym90dG9tPzogYm9vbGVhbjtcblx0bGVmdD86IGJvb2xlYW47XG5cdGZyb250PzogYm9vbGVhbjtcblx0YmFjaz86IGJvb2xlYW47XG5cdC8qKiBEaXNhYmxlIGFsbCBheGVzICovXG5cdGRpc2FibGU/OiBib29sZWFuO1xuXHQvKiogRGlzYWJsZSB4LWF4aXMgY2VudGVyaW5nICovXG5cdGRpc2FibGVYPzogYm9vbGVhbjtcblx0LyoqIERpc2FibGUgeS1heGlzIGNlbnRlcmluZyAqL1xuXHRkaXNhYmxlWT86IGJvb2xlYW47XG5cdC8qKiBEaXNhYmxlIHotYXhpcyBjZW50ZXJpbmcgKi9cblx0ZGlzYWJsZVo/OiBib29sZWFuO1xuXHQvKiogU2VlIGh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sP3E9Ym94MyNhcGkvZW4vbWF0aC9Cb3gzLnNldEZyb21PYmplY3QgKi9cblx0cHJlY2lzZTogYm9vbGVhbjtcblx0LyoqIE9wdGlvbmFsIGNhY2hlS2V5IHRvIGtlZXAgdGhlIGNvbXBvbmVudCBmcm9tIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgcmVuZGVyICovXG5cdGNhY2hlS2V5OiBhbnk7XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBQYXJ0aWFsPE5ndEdyb3VwPiAmIE5ndHNDZW50ZXJPcHRpb25zID0ge1xuXHRwcmVjaXNlOiB0cnVlLFxuXHRjYWNoZUtleTogMCxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtY2VudGVyJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwICNncm91cCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZ3QtZ3JvdXAgI291dGVyPlxuXHRcdFx0XHQ8bmd0LWdyb3VwICNpbm5lcj5cblx0XHRcdFx0XHQ8bmctY29udGVudCAvPlxuXHRcdFx0XHQ8L25ndC1ncm91cD5cblx0XHRcdDwvbmd0LWdyb3VwPlxuXHRcdDwvbmd0LWdyb3VwPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ2VudGVyIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXHRwYXJhbWV0ZXJzID0gb21pdCh0aGlzLm9wdGlvbnMsIFtcblx0XHQndG9wJyxcblx0XHQncmlnaHQnLFxuXHRcdCdib3R0b20nLFxuXHRcdCdsZWZ0Jyxcblx0XHQnZnJvbnQnLFxuXHRcdCdiYWNrJyxcblx0XHQnZGlzYWJsZScsXG5cdFx0J2Rpc2FibGVYJyxcblx0XHQnZGlzYWJsZVknLFxuXHRcdCdkaXNhYmxlWicsXG5cdFx0J3ByZWNpc2UnLFxuXHRcdCdjYWNoZUtleScsXG5cdF0pO1xuXG5cdGNlbnRlcmVkID0gb3V0cHV0PE5ndHNDZW50ZXJTdGF0ZT4oKTtcblxuXHRncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cdHByaXZhdGUgb3V0ZXJSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdvdXRlcicpO1xuXHRwcml2YXRlIGlubmVyUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8R3JvdXA+PignaW5uZXInKTtcblxuXHRjZW50ZXJPcHRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsIFtcblx0XHQndG9wJyxcblx0XHQncmlnaHQnLFxuXHRcdCdib3R0b20nLFxuXHRcdCdsZWZ0Jyxcblx0XHQnZnJvbnQnLFxuXHRcdCdiYWNrJyxcblx0XHQnZGlzYWJsZScsXG5cdFx0J2Rpc2FibGVYJyxcblx0XHQnZGlzYWJsZVknLFxuXHRcdCdkaXNhYmxlWicsXG5cdFx0J3ByZWNpc2UnLFxuXHRcdCdjYWNoZUtleScsXG5cdF0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IEdyb3VwIH0pO1xuXG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW1xuXHRcdFx0XHRcdHsgcHJlY2lzZSwgdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0LCBmcm9udCwgYmFjaywgZGlzYWJsZSwgZGlzYWJsZVosIGRpc2FibGVZLCBkaXNhYmxlWCB9LFxuXHRcdFx0XHRcdGdyb3VwLFxuXHRcdFx0XHRcdG91dGVyLFxuXHRcdFx0XHRcdGlubmVyLFxuXHRcdFx0XHRdID0gW1xuXHRcdFx0XHRcdHRoaXMuY2VudGVyT3B0aW9ucygpLFxuXHRcdFx0XHRcdHRoaXMuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRcdHRoaXMub3V0ZXJSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRcdHRoaXMuaW5uZXJSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHRdO1xuXG5cdFx0XHRcdGNvbnN0IGxvY2FsU3RhdGUgPSBnZXRMb2NhbFN0YXRlKGlubmVyKTtcblx0XHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBsb2NhbFN0YXRlPy5vYmplY3RzKCk7XG5cdFx0XHRcdGlmICghY2hpbGRyZW4/Lmxlbmd0aCkgcmV0dXJuO1xuXG5cdFx0XHRcdG91dGVyLm1hdHJpeFdvcmxkLmlkZW50aXR5KCk7XG5cdFx0XHRcdGNvbnN0IGJveDMgPSBuZXcgQm94MygpLnNldEZyb21PYmplY3QoaW5uZXIsIHByZWNpc2UpO1xuXHRcdFx0XHRjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2lkdGggPSBib3gzLm1heC54IC0gYm94My5taW4ueDtcblx0XHRcdFx0Y29uc3QgaGVpZ2h0ID0gYm94My5tYXgueSAtIGJveDMubWluLnk7XG5cdFx0XHRcdGNvbnN0IGRlcHRoID0gYm94My5tYXgueiAtIGJveDMubWluLno7XG5cblx0XHRcdFx0Ym94My5nZXRDZW50ZXIoY2VudGVyKTtcblx0XHRcdFx0Ym94My5nZXRCb3VuZGluZ1NwaGVyZShzcGhlcmUpO1xuXG5cdFx0XHRcdGNvbnN0IHZBbGlnbiA9IHRvcCA/IGhlaWdodCAvIDIgOiBib3R0b20gPyAtaGVpZ2h0IC8gMiA6IDA7XG5cdFx0XHRcdGNvbnN0IGhBbGlnbiA9IGxlZnQgPyAtd2lkdGggLyAyIDogcmlnaHQgPyB3aWR0aCAvIDIgOiAwO1xuXHRcdFx0XHRjb25zdCBkQWxpZ24gPSBmcm9udCA/IGRlcHRoIC8gMiA6IGJhY2sgPyAtZGVwdGggLyAyIDogMDtcblxuXHRcdFx0XHRvdXRlci5wb3NpdGlvbi5zZXQoXG5cdFx0XHRcdFx0ZGlzYWJsZSB8fCBkaXNhYmxlWCA/IDAgOiAtY2VudGVyLnggKyBoQWxpZ24sXG5cdFx0XHRcdFx0ZGlzYWJsZSB8fCBkaXNhYmxlWSA/IDAgOiAtY2VudGVyLnkgKyB2QWxpZ24sXG5cdFx0XHRcdFx0ZGlzYWJsZSB8fCBkaXNhYmxlWiA/IDAgOiAtY2VudGVyLnogKyBkQWxpZ24sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0dGhpcy5jZW50ZXJlZC5lbWl0KHtcblx0XHRcdFx0XHRwYXJlbnQ6IGdyb3VwLnBhcmVudCEsXG5cdFx0XHRcdFx0Y29udGFpbmVyOiBncm91cCxcblx0XHRcdFx0XHR3aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQsXG5cdFx0XHRcdFx0ZGVwdGgsXG5cdFx0XHRcdFx0Ym91bmRpbmdCb3g6IGJveDMsXG5cdFx0XHRcdFx0Ym91bmRpbmdTcGhlcmU6IHNwaGVyZSxcblx0XHRcdFx0XHRjZW50ZXIsXG5cdFx0XHRcdFx0dmVydGljYWxBbGlnbm1lbnQ6IHZBbGlnbixcblx0XHRcdFx0XHRob3Jpem9udGFsQWxpZ25tZW50OiBoQWxpZ24sXG5cdFx0XHRcdFx0ZGVwdGhBbGlnbm1lbnQ6IGRBbGlnbixcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxufVxuIl19
@@ -0,0 +1,214 @@
1
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, computed, input, viewChild, } from '@angular/core';
2
+ import { NgtArgs, extend, injectBeforeRender, 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
+ export class NgtsContactShadows {
22
+ constructor() {
23
+ this.Math = Math;
24
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
25
+ this.parameters = omit(this.options, [
26
+ 'scale',
27
+ 'frames',
28
+ 'opacity',
29
+ 'width',
30
+ 'height',
31
+ 'blur',
32
+ 'near',
33
+ 'far',
34
+ 'resolution',
35
+ 'smooth',
36
+ 'color',
37
+ 'depthWrite',
38
+ 'renderOrder',
39
+ ]);
40
+ this.contactShadowsRef = viewChild.required('contactShadows');
41
+ this.shadowsCameraRef = viewChild('shadowsCamera');
42
+ this.store = injectStore();
43
+ this.scene = this.store.select('scene');
44
+ this.gl = this.store.select('gl');
45
+ this.scaledWidth = computed(() => {
46
+ const { width, scale } = this.options();
47
+ return width * (Array.isArray(scale) ? scale[0] : scale);
48
+ });
49
+ this.scaledHeight = computed(() => {
50
+ const { height, scale } = this.options();
51
+ return height * (Array.isArray(scale) ? scale[1] : scale);
52
+ });
53
+ this.resolution = pick(this.options, 'resolution');
54
+ this.color = pick(this.options, 'color');
55
+ this.near = pick(this.options, 'near');
56
+ this.far = pick(this.options, 'far');
57
+ this.smooth = pick(this.options, 'smooth');
58
+ this.frames = pick(this.options, 'frames');
59
+ this.blur = pick(this.options, 'blur');
60
+ this.renderTarget = computed(() => this.createRenderTarget(this.resolution()));
61
+ this.renderTargetBlur = computed(() => this.createRenderTarget(this.resolution()));
62
+ this.planeGeometry = computed(() => new PlaneGeometry(this.scaledWidth(), this.scaledHeight()).rotateX(Math.PI / 2));
63
+ this.blurPlane = computed(() => new Mesh(this.planeGeometry()));
64
+ this.depthMaterial = computed(() => {
65
+ const color = new Color(this.color());
66
+ const material = new MeshDepthMaterial();
67
+ material.depthTest = material.depthWrite = false;
68
+ material.onBeforeCompile = (shader) => {
69
+ shader.uniforms = { ...shader.uniforms, ucolor: { value: color } };
70
+ shader.fragmentShader = shader.fragmentShader.replace(`void main() {`, //
71
+ `uniform vec3 ucolor;
72
+ void main() {
73
+ `);
74
+ shader.fragmentShader = shader.fragmentShader.replace('vec4( vec3( 1.0 - fragCoordZ ), opacity );',
75
+ // Colorize the shadow, multiply by the falloff so that the center can remain darker
76
+ 'vec4( ucolor * fragCoordZ * 2.0, ( 1.0 - fragCoordZ ) * 1.0 );');
77
+ };
78
+ return material;
79
+ });
80
+ this.horizontalBlurMaterial = new ShaderMaterial({ ...HorizontalBlurShader, depthTest: false });
81
+ this.verticalBlurMaterial = new ShaderMaterial({ ...VerticalBlurShader, depthTest: false });
82
+ this.renderOrder = pick(this.options, 'renderOrder');
83
+ this.opacity = pick(this.options, 'opacity');
84
+ this.depthWrite = pick(this.options, 'depthWrite');
85
+ this.texture = pick(this.renderTarget, 'texture');
86
+ this.cameraArgs = computed(() => {
87
+ const [width, height, near, far] = [this.scaledWidth(), this.scaledHeight(), this.near(), this.far()];
88
+ return [-width / 2, width / 2, height / 2, -height / 2, near, far];
89
+ });
90
+ extend({ Group, Mesh, MeshBasicMaterial, OrthographicCamera });
91
+ let count = 0;
92
+ injectBeforeRender(() => {
93
+ const shadowsCamera = this.shadowsCameraRef()?.nativeElement;
94
+ if (!shadowsCamera)
95
+ return;
96
+ const frames = this.frames();
97
+ if (frames === Infinity || count < frames) {
98
+ this.renderShadows();
99
+ count++;
100
+ }
101
+ });
102
+ }
103
+ renderShadows() {
104
+ const shadowsCamera = this.shadowsCameraRef()?.nativeElement;
105
+ if (!shadowsCamera)
106
+ return;
107
+ const [blur, smooth, gl, scene, contactShadows, depthMaterial, renderTarget] = [
108
+ this.blur(),
109
+ this.smooth(),
110
+ this.gl(),
111
+ this.scene(),
112
+ this.contactShadowsRef().nativeElement,
113
+ this.depthMaterial(),
114
+ this.renderTarget(),
115
+ ];
116
+ const initialBackground = scene.background;
117
+ const initialOverrideMaterial = scene.overrideMaterial;
118
+ const initialClearAlpha = gl.getClearAlpha();
119
+ contactShadows.visible = false;
120
+ scene.background = null;
121
+ scene.overrideMaterial = depthMaterial;
122
+ gl.setClearAlpha(0);
123
+ // render to the render target to get the depths
124
+ gl.setRenderTarget(renderTarget);
125
+ gl.render(scene, shadowsCamera);
126
+ this.blurShadows(blur);
127
+ if (smooth)
128
+ this.blurShadows(blur * 0.4);
129
+ // reset
130
+ gl.setRenderTarget(null);
131
+ contactShadows.visible = true;
132
+ scene.overrideMaterial = initialOverrideMaterial;
133
+ scene.background = initialBackground;
134
+ gl.setClearAlpha(initialClearAlpha);
135
+ }
136
+ blurShadows(blur) {
137
+ const shadowsCamera = this.shadowsCameraRef()?.nativeElement;
138
+ if (!shadowsCamera)
139
+ return;
140
+ const [blurPlane, horizontalBlurMaterial, verticalBlurMaterial, renderTargetBlur, renderTarget, gl] = [
141
+ this.blurPlane(),
142
+ this.horizontalBlurMaterial,
143
+ this.verticalBlurMaterial,
144
+ this.renderTargetBlur(),
145
+ this.renderTarget(),
146
+ this.gl(),
147
+ ];
148
+ blurPlane.visible = true;
149
+ blurPlane.material = horizontalBlurMaterial;
150
+ horizontalBlurMaterial.uniforms['tDiffuse'].value = renderTarget.texture;
151
+ horizontalBlurMaterial.uniforms['h'].value = blur / 256;
152
+ gl.setRenderTarget(renderTargetBlur);
153
+ gl.render(blurPlane, shadowsCamera);
154
+ blurPlane.material = verticalBlurMaterial;
155
+ verticalBlurMaterial.uniforms['tDiffuse'].value = renderTargetBlur.texture;
156
+ verticalBlurMaterial.uniforms['v'].value = blur / 256;
157
+ gl.setRenderTarget(renderTarget);
158
+ gl.render(blurPlane, shadowsCamera);
159
+ blurPlane.visible = false;
160
+ }
161
+ createRenderTarget(resolution) {
162
+ const renderTarget = new WebGLRenderTarget(resolution, resolution);
163
+ renderTarget.texture.generateMipmaps = false;
164
+ return renderTarget;
165
+ }
166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsContactShadows, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
167
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.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: `
168
+ <ngt-group #contactShadows [rotation]="[Math.PI / 2, 0, 0]" [parameters]="parameters()">
169
+ <ngt-mesh
170
+ [scale]="[1, -1, 1]"
171
+ [rotation]="[-Math.PI / 2, 0, 0]"
172
+ [renderOrder]="renderOrder() ?? 0"
173
+ [geometry]="planeGeometry()"
174
+ >
175
+ <ngt-mesh-basic-material
176
+ [transparent]="true"
177
+ [opacity]="opacity()"
178
+ [depthWrite]="depthWrite()"
179
+ [map]="texture()"
180
+ />
181
+ </ngt-mesh>
182
+ <ngt-orthographic-camera *args="cameraArgs()" #shadowsCamera />
183
+ </ngt-group>
184
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
185
+ }
186
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsContactShadows, decorators: [{
187
+ type: Component,
188
+ args: [{
189
+ selector: 'ngts-contact-shadows',
190
+ standalone: true,
191
+ template: `
192
+ <ngt-group #contactShadows [rotation]="[Math.PI / 2, 0, 0]" [parameters]="parameters()">
193
+ <ngt-mesh
194
+ [scale]="[1, -1, 1]"
195
+ [rotation]="[-Math.PI / 2, 0, 0]"
196
+ [renderOrder]="renderOrder() ?? 0"
197
+ [geometry]="planeGeometry()"
198
+ >
199
+ <ngt-mesh-basic-material
200
+ [transparent]="true"
201
+ [opacity]="opacity()"
202
+ [depthWrite]="depthWrite()"
203
+ [map]="texture()"
204
+ />
205
+ </ngt-mesh>
206
+ <ngt-orthographic-camera *args="cameraArgs()" #shadowsCamera />
207
+ </ngt-group>
208
+ `,
209
+ imports: [NgtArgs],
210
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
211
+ changeDetection: ChangeDetectionStrategy.OnPush,
212
+ }]
213
+ }], ctorParameters: () => [] });
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1zaGFkb3dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3N0YWdpbmcvc3JjL2xpYi9jb250YWN0LXNoYWRvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQVksTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQ04sS0FBSyxFQUVMLEtBQUssRUFDTCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGNBQWMsRUFDZCxpQkFBaUIsR0FDakIsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBaUJ4RSxNQUFNLGNBQWMsR0FBOEI7SUFDakQsS0FBSyxFQUFFLEVBQUU7SUFDVCxNQUFNLEVBQUUsUUFBUTtJQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUksRUFBRSxDQUFDO0lBQ1AsR0FBRyxFQUFFLEVBQUU7SUFDUCxVQUFVLEVBQUUsR0FBRztJQUNmLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLFNBQVM7SUFDaEIsVUFBVSxFQUFFLEtBQUs7Q0FDakIsQ0FBQztBQTJCRixNQUFNLE9BQU8sa0JBQWtCO0lBZ0Y5QjtRQS9FQSxTQUFJLEdBQUcs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X0VMRU1FTlRTX1NDSEVNQSxcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0Y29tcHV0ZWQsXG5cdGlucHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd0QXJncywgTmd0R3JvdXAsIGV4dGVuZCwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3RTdG9yZSwgb21pdCwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgbWVyZ2VJbnB1dHMgfSBmcm9tICduZ3h0ZW5zaW9uL2luamVjdC1pbnB1dHMnO1xuaW1wb3J0IHtcblx0Q29sb3IsXG5cdENvbG9yUmVwcmVzZW50YXRpb24sXG5cdEdyb3VwLFxuXHRNZXNoLFxuXHRNZXNoQmFzaWNNYXRlcmlhbCxcblx0TWVzaERlcHRoTWF0ZXJpYWwsXG5cdE9ydGhvZ3JhcGhpY0NhbWVyYSxcblx0UGxhbmVHZW9tZXRyeSxcblx0U2hhZGVyTWF0ZXJpYWwsXG5cdFdlYkdMUmVuZGVyVGFyZ2V0LFxufSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBIb3Jpem9udGFsQmx1clNoYWRlciwgVmVydGljYWxCbHVyU2hhZGVyIH0gZnJvbSAndGhyZWUtc3RkbGliJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzQ29udGFjdFNoYWRvd3NPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxPbWl0PE5ndEdyb3VwLCAnc2NhbGUnPj4ge1xuXHRvcGFjaXR5OiBudW1iZXI7XG5cdHdpZHRoOiBudW1iZXI7XG5cdGhlaWdodDogbnVtYmVyO1xuXHRibHVyOiBudW1iZXI7XG5cdG5lYXI6IG51bWJlcjtcblx0ZmFyOiBudW1iZXI7XG5cdHNtb290aDogYm9vbGVhbjtcblx0cmVzb2x1dGlvbjogbnVtYmVyO1xuXHRmcmFtZXM6IG51bWJlcjtcblx0c2NhbGU6IG51bWJlciB8IFt4OiBudW1iZXIsIHk6IG51bWJlcl07XG5cdGNvbG9yOiBDb2xvclJlcHJlc2VudGF0aW9uO1xuXHRkZXB0aFdyaXRlOiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0c0NvbnRhY3RTaGFkb3dzT3B0aW9ucyA9IHtcblx0c2NhbGU6IDEwLFxuXHRmcmFtZXM6IEluZmluaXR5LFxuXHRvcGFjaXR5OiAxLFxuXHR3aWR0aDogMSxcblx0aGVpZ2h0OiAxLFxuXHRibHVyOiAxLFxuXHRuZWFyOiAwLFxuXHRmYXI6IDEwLFxuXHRyZXNvbHV0aW9uOiA1MTIsXG5cdHNtb290aDogdHJ1ZSxcblx0Y29sb3I6ICcjMDAwMDAwJyxcblx0ZGVwdGhXcml0ZTogZmFsc2UsXG59O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLWNvbnRhY3Qtc2hhZG93cycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1ncm91cCAjY29udGFjdFNoYWRvd3MgW3JvdGF0aW9uXT1cIltNYXRoLlBJIC8gMiwgMCwgMF1cIiBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZ3QtbWVzaFxuXHRcdFx0XHRbc2NhbGVdPVwiWzEsIC0xLCAxXVwiXG5cdFx0XHRcdFtyb3RhdGlvbl09XCJbLU1hdGguUEkgLyAyLCAwLCAwXVwiXG5cdFx0XHRcdFtyZW5kZXJPcmRlcl09XCJyZW5kZXJPcmRlcigpID8/IDBcIlxuXHRcdFx0XHRbZ2VvbWV0cnldPVwicGxhbmVHZW9tZXRyeSgpXCJcblx0XHRcdD5cblx0XHRcdFx0PG5ndC1tZXNoLWJhc2ljLW1hdGVyaWFsXG5cdFx0XHRcdFx0W3RyYW5zcGFyZW50XT1cInRydWVcIlxuXHRcdFx0XHRcdFtvcGFjaXR5XT1cIm9wYWNpdHkoKVwiXG5cdFx0XHRcdFx0W2RlcHRoV3JpdGVdPVwiZGVwdGhXcml0ZSgpXCJcblx0XHRcdFx0XHRbbWFwXT1cInRleHR1cmUoKVwiXG5cdFx0XHRcdC8+XG5cdFx0XHQ8L25ndC1tZXNoPlxuXHRcdFx0PG5ndC1vcnRob2dyYXBoaWMtY2FtZXJhICphcmdzPVwiY2FtZXJhQXJncygpXCIgI3NoYWRvd3NDYW1lcmEgLz5cblx0XHQ8L25ndC1ncm91cD5cblx0YCxcblx0aW1wb3J0czogW05ndEFyZ3NdLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzQ29udGFjdFNoYWRvd3Mge1xuXHRNYXRoID0gTWF0aDtcblxuXHRvcHRpb25zID0gaW5wdXQoZGVmYXVsdE9wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0T3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgW1xuXHRcdCdzY2FsZScsXG5cdFx0J2ZyYW1lcycsXG5cdFx0J29wYWNpdHknLFxuXHRcdCd3aWR0aCcsXG5cdFx0J2hlaWdodCcsXG5cdFx0J2JsdXInLFxuXHRcdCduZWFyJyxcblx0XHQnZmFyJyxcblx0XHQncmVzb2x1dGlvbicsXG5cdFx0J3Ntb290aCcsXG5cdFx0J2NvbG9yJyxcblx0XHQnZGVwdGhXcml0ZScsXG5cdFx0J3JlbmRlck9yZGVyJyxcblx0XSk7XG5cblx0Y29udGFjdFNoYWRvd3NSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdjb250YWN0U2hhZG93cycpO1xuXHRzaGFkb3dzQ2FtZXJhUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8T3J0aG9ncmFwaGljQ2FtZXJhPj4oJ3NoYWRvd3NDYW1lcmEnKTtcblxuXHRwcml2YXRlIHN0b3JlID0gaW5qZWN0U3RvcmUoKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cblx0cHJpdmF0ZSBzY2FsZWRXaWR0aCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IHdpZHRoLCBzY2FsZSB9ID0gdGhpcy5vcHRpb25zKCk7XG5cdFx0cmV0dXJuIHdpZHRoICogKEFycmF5LmlzQXJyYXkoc2NhbGUpID8gc2NhbGVbMF0gOiBzY2FsZSk7XG5cdH0pO1xuXHRwcml2YXRlIHNjYWxlZEhlaWdodCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB7IGhlaWdodCwgc2NhbGUgfSA9IHRoaXMub3B0aW9ucygpO1xuXHRcdHJldHVybiBoZWlnaHQgKiAoQXJyYXkuaXNBcnJheShzY2FsZSkgPyBzY2FsZVsxXSA6IHNjYWxlKTtcblx0fSk7XG5cdHByaXZhdGUgcmVzb2x1dGlvbiA9IHBpY2sodGhpcy5vcHRpb25zLCAncmVzb2x1dGlvbicpO1xuXHRwcml2YXRlIGNvbG9yID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xvcicpO1xuXHRwcml2YXRlIG5lYXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ25lYXInKTtcblx0cHJpdmF0ZSBmYXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2ZhcicpO1xuXHRwcml2YXRlIHNtb290aCA9IHBpY2sodGhpcy5vcHRpb25zLCAnc21vb3RoJyk7XG5cdHByaXZhdGUgZnJhbWVzID0gcGljayh0aGlzLm9wdGlvbnMsICdmcmFtZXMnKTtcblx0cHJpdmF0ZSBibHVyID0gcGljayh0aGlzLm9wdGlvbnMsICdibHVyJyk7XG5cblx0cHJpdmF0ZSByZW5kZXJUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNyZWF0ZVJlbmRlclRhcmdldCh0aGlzLnJlc29sdXRpb24oKSkpO1xuXHRwcml2YXRlIHJlbmRlclRhcmdldEJsdXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNyZWF0ZVJlbmRlclRhcmdldCh0aGlzLnJlc29sdXRpb24oKSkpO1xuXHRwbGFuZUdlb21ldHJ5ID0gY29tcHV0ZWQoKCkgPT4gbmV3IFBsYW5lR2VvbWV0cnkodGhpcy5zY2FsZWRXaWR0aCgpLCB0aGlzLnNjYWxlZEhlaWdodCgpKS5yb3RhdGVYKE1hdGguUEkgLyAyKSk7XG5cdHByaXZhdGUgYmx1clBsYW5lID0gY29tcHV0ZWQoKCkgPT4gbmV3IE1lc2godGhpcy5wbGFuZUdlb21ldHJ5KCkpKTtcblx0cHJpdmF0ZSBkZXB0aE1hdGVyaWFsID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGNvbG9yID0gbmV3IENvbG9yKHRoaXMuY29sb3IoKSk7XG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoKTtcblx0XHRtYXRlcmlhbC5kZXB0aFRlc3QgPSBtYXRlcmlhbC5kZXB0aFdyaXRlID0gZmFsc2U7XG5cdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlID0gKHNoYWRlcikgPT4ge1xuXHRcdFx0c2hhZGVyLnVuaWZvcm1zID0geyAuLi5zaGFkZXIudW5pZm9ybXMsIHVjb2xvcjogeyB2YWx1ZTogY29sb3IgfSB9O1xuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG5cdFx0XHRcdGB2b2lkIG1haW4oKSB7YCwgLy9cblx0XHRcdFx0YHVuaWZvcm0gdmVjMyB1Y29sb3I7XG4gICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGAsXG5cdFx0XHQpO1xuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyLnJlcGxhY2UoXG5cdFx0XHRcdCd2ZWM0KCB2ZWMzKCAxLjAgLSBmcmFnQ29vcmRaICksIG9wYWNpdHkgKTsnLFxuXHRcdFx0XHQvLyBDb2xvcml6ZSB0aGUgc2hhZG93LCBtdWx0aXBseSBieSB0aGUgZmFsbG9mZiBzbyB0aGF0IHRoZSBjZW50ZXIgY2FuIHJlbWFpbiBkYXJrZXJcblx0XHRcdFx0J3ZlYzQoIHVjb2xvciAqIGZyYWdDb29yZFogKiAyLjAsICggMS4wIC0gZnJhZ0Nvb3JkWiApICogMS4wICk7Jyxcblx0XHRcdCk7XG5cdFx0fTtcblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cdH0pO1xuXG5cdHByaXZhdGUgaG9yaXpvbnRhbEJsdXJNYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7IC4uLkhvcml6b250YWxCbHVyU2hhZGVyLCBkZXB0aFRlc3Q6IGZhbHNlIH0pO1xuXHRwcml2YXRlIHZlcnRpY2FsQmx1ck1hdGVyaWFsID0gbmV3IFNoYWRlck1hdGVyaWFsKHsgLi4uVmVydGljYWxCbHVyU2hhZGVyLCBkZXB0aFRlc3Q6IGZhbHNlIH0pO1xuXG5cdHJlbmRlck9yZGVyID0gcGljayh0aGlzLm9wdGlvbnMsICdyZW5kZXJPcmRlcicpO1xuXHRvcGFjaXR5ID0gcGljayh0aGlzLm9wdGlvbnMsICdvcGFjaXR5Jyk7XG5cdGRlcHRoV3JpdGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RlcHRoV3JpdGUnKTtcblx0dGV4dHVyZSA9IHBpY2sodGhpcy5yZW5kZXJUYXJnZXQsICd0ZXh0dXJlJyk7XG5cdGNhbWVyYUFyZ3MgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgW3dpZHRoLCBoZWlnaHQsIG5lYXIsIGZhcl0gPSBbdGhpcy5zY2FsZWRXaWR0aCgpLCB0aGlzLnNjYWxlZEhlaWdodCgpLCB0aGlzLm5lYXIoKSwgdGhpcy5mYXIoKV07XG5cdFx0cmV0dXJuIFstd2lkdGggLyAyLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIC1oZWlnaHQgLyAyLCBuZWFyLCBmYXJdO1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRleHRlbmQoeyBHcm91cCwgTWVzaCwgTWVzaEJhc2ljTWF0ZXJpYWwsIE9ydGhvZ3JhcGhpY0NhbWVyYSB9KTtcblxuXHRcdGxldCBjb3VudCA9IDA7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCgpID0+IHtcblx0XHRcdGNvbnN0IHNoYWRvd3NDYW1lcmEgPSB0aGlzLnNoYWRvd3NDYW1lcmFSZWYoKT8ubmF0aXZlRWxlbWVudDtcblx0XHRcdGlmICghc2hhZG93c0NhbWVyYSkgcmV0dXJuO1xuXG5cdFx0XHRjb25zdCBmcmFtZXMgPSB0aGlzLmZyYW1lcygpO1xuXHRcdFx0aWYgKGZyYW1lcyA9PT0gSW5maW5pdHkgfHwgY291bnQgPCBmcmFtZXMpIHtcblx0XHRcdFx0dGhpcy5yZW5kZXJTaGFkb3dzKCk7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlclNoYWRvd3MoKSB7XG5cdFx0Y29uc3Qgc2hhZG93c0NhbWVyYSA9IHRoaXMuc2hhZG93c0NhbWVyYVJlZigpPy5uYXRpdmVFbGVtZW50O1xuXHRcdGlmICghc2hhZG93c0NhbWVyYSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgW2JsdXIsIHNtb290aCwgZ2wsIHNjZW5lLCBjb250YWN0U2hhZG93cywgZGVwdGhNYXRlcmlhbCwgcmVuZGVyVGFyZ2V0XSA9IFtcblx0XHRcdHRoaXMuYmx1cigpLFxuXHRcdFx0dGhpcy5zbW9vdGgoKSxcblx0XHRcdHRoaXMuZ2woKSxcblx0XHRcdHRoaXMuc2NlbmUoKSxcblx0XHRcdHRoaXMuY29udGFjdFNoYWRvd3NSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0dGhpcy5kZXB0aE1hdGVyaWFsKCksXG5cdFx0XHR0aGlzLnJlbmRlclRhcmdldCgpLFxuXHRcdF07XG5cblx0XHRjb25zdCBpbml0aWFsQmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7XG5cdFx0Y29uc3QgaW5pdGlhbE92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXHRcdGNvbnN0IGluaXRpYWxDbGVhckFscGhhID0gZ2wuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdFx0Y29udGFjdFNoYWRvd3MudmlzaWJsZSA9IGZhbHNlO1xuXHRcdHNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xuXHRcdHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBkZXB0aE1hdGVyaWFsO1xuXHRcdGdsLnNldENsZWFyQWxwaGEoMCk7XG5cblx0XHQvLyByZW5kZXIgdG8gdGhlIHJlbmRlciB0YXJnZXQgdG8gZ2V0IHRoZSBkZXB0aHNcblx0XHRnbC5zZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0KTtcblx0XHRnbC5yZW5kZXIoc2NlbmUsIHNoYWRvd3NDYW1lcmEpO1xuXG5cdFx0dGhpcy5ibHVyU2hhZG93cyhibHVyKTtcblx0XHRpZiAoc21vb3RoKSB0aGlzLmJsdXJTaGFkb3dzKGJsdXIgKiAwLjQpO1xuXG5cdFx0Ly8gcmVzZXRcblx0XHRnbC5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG5cblx0XHRjb250YWN0U2hhZG93cy52aXNpYmxlID0gdHJ1ZTtcblx0XHRzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gaW5pdGlhbE92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0c2NlbmUuYmFja2dyb3VuZCA9IGluaXRpYWxCYWNrZ3JvdW5kO1xuXHRcdGdsLnNldENsZWFyQWxwaGEoaW5pdGlhbENsZWFyQWxwaGEpO1xuXHR9XG5cblx0cHJpdmF0ZSBibHVyU2hhZG93cyhibHVyOiBudW1iZXIpIHtcblx0XHRjb25zdCBzaGFkb3dzQ2FtZXJhID0gdGhpcy5zaGFkb3dzQ2FtZXJhUmVmKCk/Lm5hdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKCFzaGFkb3dzQ2FtZXJhKSByZXR1cm47XG5cblx0XHRjb25zdCBbYmx1clBsYW5lLCBob3Jpem9udGFsQmx1ck1hdGVyaWFsLCB2ZXJ0aWNhbEJsdXJNYXRlcmlhbCwgcmVuZGVyVGFyZ2V0Qmx1ciwgcmVuZGVyVGFyZ2V0LCBnbF0gPSBbXG5cdFx0XHR0aGlzLmJsdXJQbGFuZSgpLFxuXHRcdFx0dGhpcy5ob3Jpem9udGFsQmx1ck1hdGVyaWFsLFxuXHRcdFx0dGhpcy52ZXJ0aWNhbEJsdXJNYXRlcmlhbCxcblx0XHRcdHRoaXMucmVuZGVyVGFyZ2V0Qmx1cigpLFxuXHRcdFx0dGhpcy5yZW5kZXJUYXJnZXQoKSxcblx0XHRcdHRoaXMuZ2woKSxcblx0XHRdO1xuXG5cdFx0Ymx1clBsYW5lLnZpc2libGUgPSB0cnVlO1xuXHRcdGJsdXJQbGFuZS5tYXRlcmlhbCA9IGhvcml6b250YWxCbHVyTWF0ZXJpYWw7XG5cdFx0aG9yaXpvbnRhbEJsdXJNYXRlcmlhbC51bmlmb3Jtc1sndERpZmZ1c2UnXS52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdGhvcml6b250YWxCbHVyTWF0ZXJpYWwudW5pZm9ybXNbJ2gnXS52YWx1ZSA9IGJsdXIgLyAyNTY7XG5cdFx0Z2wuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldEJsdXIpO1xuXHRcdGdsLnJlbmRlcihibHVyUGxhbmUsIHNoYWRvd3NDYW1lcmEpO1xuXG5cdFx0Ymx1clBsYW5lLm1hdGVyaWFsID0gdmVydGljYWxCbHVyTWF0ZXJpYWw7XG5cdFx0dmVydGljYWxCbHVyTWF0ZXJpYWwudW5pZm9ybXNbJ3REaWZmdXNlJ10udmFsdWUgPSByZW5kZXJUYXJnZXRCbHVyLnRleHR1cmU7XG5cdFx0dmVydGljYWxCbHVyTWF0ZXJpYWwudW5pZm9ybXNbJ3YnXS52YWx1ZSA9IGJsdXIgLyAyNTY7XG5cdFx0Z2wuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XG5cdFx0Z2wucmVuZGVyKGJsdXJQbGFuZSwgc2hhZG93c0NhbWVyYSk7XG5cdFx0Ymx1clBsYW5lLnZpc2libGUgPSBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUmVuZGVyVGFyZ2V0KHJlc29sdXRpb246IG51bWJlcikge1xuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChyZXNvbHV0aW9uLCByZXNvbHV0aW9uKTtcblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRyZXR1cm4gcmVuZGVyVGFyZ2V0O1xuXHR9XG59XG4iXX0=