angular-three-soba 2.0.0-beta.9 → 2.1.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 (425) 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 +20 -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/mask.mjs +78 -0
  117. package/esm2022/staging/lib/matcap-texture.mjs +81 -0
  118. package/esm2022/staging/lib/normal-texture.mjs +81 -0
  119. package/esm2022/staging/lib/randomized-lights.mjs +104 -0
  120. package/esm2022/staging/lib/render-texture.mjs +203 -0
  121. package/esm2022/staging/lib/sky.mjs +86 -0
  122. package/esm2022/staging/lib/spot-light.mjs +453 -0
  123. package/esm2022/staging/lib/stage.mjs +236 -0
  124. package/esm2022/{utils/angular-three-soba-utils.mjs → stats/angular-three-soba-stats.mjs} +1 -1
  125. package/esm2022/stats/index.mjs +2 -0
  126. package/esm2022/stats/lib/stats.mjs +63 -0
  127. package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +5 -0
  128. package/esm2022/vanilla-exports/index.mjs +3 -0
  129. package/fesm2022/angular-three-soba-abstractions.mjs +884 -697
  130. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  131. package/fesm2022/angular-three-soba-cameras.mjs +261 -308
  132. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  133. package/fesm2022/angular-three-soba-controls.mjs +1776 -109
  134. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  135. package/fesm2022/angular-three-soba-loaders.mjs +191 -145
  136. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  137. package/fesm2022/angular-three-soba-materials.mjs +527 -748
  138. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  139. package/fesm2022/angular-three-soba-misc.mjs +783 -1935
  140. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  141. package/fesm2022/angular-three-soba-performances.mjs +591 -475
  142. package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
  143. package/fesm2022/angular-three-soba-shaders.mjs +51 -1369
  144. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  145. package/fesm2022/angular-three-soba-staging.mjs +2421 -3521
  146. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  147. package/fesm2022/angular-three-soba-stats.mjs +70 -0
  148. package/fesm2022/angular-three-soba-stats.mjs.map +1 -0
  149. package/fesm2022/angular-three-soba-vanilla-exports.mjs +6 -0
  150. package/fesm2022/angular-three-soba-vanilla-exports.mjs.map +1 -0
  151. package/loaders/README.md +130 -2
  152. package/loaders/index.d.ts +5 -4
  153. package/loaders/lib/font-loader.d.ts +27 -0
  154. package/loaders/lib/gltf-loader.d.ts +24 -0
  155. package/loaders/lib/loader.d.ts +29 -0
  156. package/loaders/lib/progress.d.ts +9 -0
  157. package/loaders/lib/texture-loader.d.ts +13 -0
  158. package/materials/README.md +160 -2
  159. package/materials/index.d.ts +7 -6
  160. package/materials/lib/custom-shader-material.d.ts +20 -0
  161. package/materials/lib/mesh-distort-material.d.ts +17 -0
  162. package/materials/lib/mesh-reflector-material.d.ts +51 -0
  163. package/materials/lib/mesh-refraction-material.d.ts +42 -0
  164. package/materials/lib/mesh-transmission-material.d.ts +77 -0
  165. package/materials/lib/mesh-wobble-material.d.ts +15 -0
  166. package/materials/lib/point-material.d.ts +11 -0
  167. package/metadata.json +1 -1
  168. package/misc/README.md +217 -2
  169. package/misc/index.d.ts +13 -13
  170. package/misc/lib/animations.d.ts +17 -0
  171. package/misc/lib/computed-attribute.d.ts +64 -0
  172. package/misc/lib/constants.d.ts +1 -0
  173. package/misc/lib/decal.d.ts +27 -0
  174. package/misc/lib/deprecated.d.ts +14 -0
  175. package/misc/lib/depth-buffer.d.ts +8 -0
  176. package/misc/lib/fbo.d.ts +46 -0
  177. package/misc/lib/html/html-content.d.ts +47 -0
  178. package/misc/lib/html/html.d.ts +30 -0
  179. package/misc/lib/html/utils.d.ts +14 -0
  180. package/misc/lib/intersect.d.ts +13 -0
  181. package/misc/lib/sampler.d.ts +73 -0
  182. package/misc/lib/scale-factor.d.ts +3 -0
  183. package/package.json +90 -50
  184. package/performances/index.d.ts +6 -5
  185. package/performances/lib/adaptive-dpr.d.ts +7 -0
  186. package/performances/{adaptive-events → lib}/adaptive-events.d.ts +0 -3
  187. package/performances/lib/detailed.d.ts +17 -0
  188. package/performances/lib/instances/instances.d.ts +122 -0
  189. package/performances/lib/instances/position-mesh.d.ts +20 -0
  190. package/performances/lib/points/points.d.ts +224 -0
  191. package/performances/lib/points/position-point.d.ts +21 -0
  192. package/performances/lib/segments/segment-object.d.ts +17 -0
  193. package/performances/lib/segments/segments.d.ts +97 -0
  194. package/shaders/index.d.ts +3 -17
  195. package/shaders/lib/grid-material.d.ts +69 -0
  196. package/shaders/lib/mesh-refraction-material.d.ts +11 -0
  197. package/shaders/lib/point-material.d.ts +14 -0
  198. package/staging/README.md +473 -2
  199. package/staging/index.d.ts +19 -21
  200. package/staging/lib/accumulative-shadows.d.ts +75 -0
  201. package/staging/lib/backdrop.d.ts +22 -0
  202. package/staging/lib/bb-anchor.d.ts +17 -0
  203. package/staging/lib/bounds.d.ts +47 -0
  204. package/staging/lib/camera-shake.d.ts +29 -0
  205. package/staging/lib/caustics.d.ts +53 -0
  206. package/staging/lib/center.d.ts +390 -0
  207. package/staging/lib/contact-shadows.d.ts +55 -0
  208. package/staging/lib/environment.d.ts +132 -0
  209. package/staging/lib/float.d.ts +20 -0
  210. package/staging/lib/lightformer.d.ts +310 -0
  211. package/staging/lib/mask.d.ts +30 -0
  212. package/staging/lib/matcap-texture.d.ts +32 -0
  213. package/staging/lib/normal-texture.d.ts +37 -0
  214. package/staging/lib/randomized-lights.d.ts +54 -0
  215. package/staging/lib/render-texture.d.ts +64 -0
  216. package/staging/lib/sky.d.ts +32 -0
  217. package/staging/lib/spot-light.d.ts +119 -0
  218. package/staging/lib/stage.d.ts +352 -0
  219. package/stats/README.md +3 -0
  220. package/stats/index.d.ts +1 -0
  221. package/stats/lib/stats.d.ts +14 -0
  222. package/vanilla-exports/README.md +3 -0
  223. package/vanilla-exports/index.d.ts +27 -0
  224. package/web-types.json +1 -1
  225. package/abstractions/billboard/billboard.d.ts +0 -28
  226. package/abstractions/detailed/detailed.d.ts +0 -26
  227. package/abstractions/edges/edges.d.ts +0 -34
  228. package/abstractions/grid/grid.d.ts +0 -50
  229. package/abstractions/text/text.d.ts +0 -82
  230. package/abstractions/text-3d/text-3d.d.ts +0 -81
  231. package/assets/distort.vert.glsl +0 -1
  232. package/cameras/camera/camera-content.d.ts +0 -13
  233. package/cameras/camera/camera.d.ts +0 -26
  234. package/cameras/cube-camera/cube-camera.d.ts +0 -69
  235. package/cameras/orthographic-camera/orthographic-camera.d.ts +0 -37
  236. package/cameras/perspective-camera/perspective-camera.d.ts +0 -18
  237. package/controls/orbit-controls/orbit-controls.d.ts +0 -54
  238. package/esm2022/abstractions/billboard/billboard.mjs +0 -74
  239. package/esm2022/abstractions/detailed/detailed.mjs +0 -64
  240. package/esm2022/abstractions/edges/edges.mjs +0 -88
  241. package/esm2022/abstractions/grid/grid.mjs +0 -180
  242. package/esm2022/abstractions/text/text.mjs +0 -274
  243. package/esm2022/abstractions/text-3d/text-3d.mjs +0 -165
  244. package/esm2022/cameras/camera/camera-content.mjs +0 -20
  245. package/esm2022/cameras/camera/camera.mjs +0 -77
  246. package/esm2022/cameras/cube-camera/cube-camera.mjs +0 -161
  247. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +0 -102
  248. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +0 -46
  249. package/esm2022/controls/orbit-controls/orbit-controls.mjs +0 -181
  250. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +0 -30
  251. package/esm2022/loaders/loader/loader.mjs +0 -138
  252. package/esm2022/loaders/progress/progress.mjs +0 -45
  253. package/esm2022/loaders/texture-loader/texture-loader.mjs +0 -28
  254. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +0 -82
  255. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +0 -367
  256. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +0 -171
  257. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +0 -278
  258. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  259. package/esm2022/materials/point-material/point-material.mjs +0 -46
  260. package/esm2022/misc/animations/animations.mjs +0 -59
  261. package/esm2022/misc/bake-shadows/bake-shadows.mjs +0 -24
  262. package/esm2022/misc/caustics/caustics.mjs +0 -387
  263. package/esm2022/misc/decal/decal.mjs +0 -187
  264. package/esm2022/misc/depth-buffer/depth-buffer.mjs +0 -44
  265. package/esm2022/misc/example/example.mjs +0 -160
  266. package/esm2022/misc/fbo/fbo.mjs +0 -47
  267. package/esm2022/misc/html/html-wrapper.mjs +0 -478
  268. package/esm2022/misc/html/html.mjs +0 -304
  269. package/esm2022/misc/sampler/sampler.mjs +0 -142
  270. package/esm2022/misc/shadow/shadow.mjs +0 -111
  271. package/esm2022/misc/stats-gl/stats-gl.mjs +0 -61
  272. package/esm2022/misc/trail/trail.mjs +0 -209
  273. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +0 -17
  274. package/esm2022/misc/trail-texture/trail-texture.mjs +0 -106
  275. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +0 -5
  276. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +0 -64
  277. package/esm2022/modifiers/index.mjs +0 -2
  278. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +0 -44
  279. package/esm2022/performances/adaptive-events/adaptive-events.mjs +0 -27
  280. package/esm2022/performances/points/points-input.mjs +0 -64
  281. package/esm2022/performances/points/points.mjs +0 -329
  282. package/esm2022/performances/points/position-point.mjs +0 -54
  283. package/esm2022/performances/segments/segment-object.mjs +0 -9
  284. package/esm2022/performances/segments/segments.mjs +0 -182
  285. package/esm2022/shaders/blur-pass/blur-pass.mjs +0 -61
  286. package/esm2022/shaders/caustics/caustics-material.mjs +0 -130
  287. package/esm2022/shaders/caustics/caustics-projection-material.mjs +0 -31
  288. package/esm2022/shaders/convolution-material/convolution-material.mjs +0 -94
  289. package/esm2022/shaders/discard-material/discard-material.mjs +0 -3
  290. package/esm2022/shaders/grid-material/grid-material.mjs +0 -77
  291. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +0 -56
  292. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  293. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +0 -170
  294. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  295. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  296. package/esm2022/shaders/shader-material/shader-material.mjs +0 -34
  297. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +0 -25
  298. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +0 -33
  299. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +0 -86
  300. package/esm2022/shaders/star-field-material/star-field-material.mjs +0 -33
  301. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +0 -247
  302. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +0 -267
  303. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +0 -108
  304. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +0 -206
  305. package/esm2022/staging/backdrop/backdrop.mjs +0 -77
  306. package/esm2022/staging/bb-anchor/bb-anchor.mjs +0 -70
  307. package/esm2022/staging/bounds/bounds.mjs +0 -308
  308. package/esm2022/staging/camera-shake/camera-shake.mjs +0 -123
  309. package/esm2022/staging/center/center.mjs +0 -163
  310. package/esm2022/staging/cloud/cloud.mjs +0 -158
  311. package/esm2022/staging/contact-shadows/contact-shadows.mjs +0 -246
  312. package/esm2022/staging/environment/assets.mjs +0 -13
  313. package/esm2022/staging/environment/environment-cube.mjs +0 -47
  314. package/esm2022/staging/environment/environment-ground.mjs +0 -41
  315. package/esm2022/staging/environment/environment-input.mjs +0 -119
  316. package/esm2022/staging/environment/environment-map.mjs +0 -53
  317. package/esm2022/staging/environment/environment-portal.mjs +0 -113
  318. package/esm2022/staging/environment/environment.mjs +0 -61
  319. package/esm2022/staging/environment/utils.mjs +0 -105
  320. package/esm2022/staging/float/float.mjs +0 -94
  321. package/esm2022/staging/matcap-texture/matcap-texture.mjs +0 -64
  322. package/esm2022/staging/normal-texture/normal-texture.mjs +0 -53
  323. package/esm2022/staging/sky/sky.mjs +0 -119
  324. package/esm2022/staging/sparkles/sparkles.mjs +0 -164
  325. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +0 -63
  326. package/esm2022/staging/spot-light/shadow-mesh.mjs +0 -266
  327. package/esm2022/staging/spot-light/spot-light-input.mjs +0 -84
  328. package/esm2022/staging/spot-light/spot-light.mjs +0 -81
  329. package/esm2022/staging/spot-light/volumetric-mesh.mjs +0 -98
  330. package/esm2022/staging/stage/stage.mjs +0 -388
  331. package/esm2022/staging/stars/stars.mjs +0 -147
  332. package/esm2022/staging/wireframe/wireframe-input.mjs +0 -191
  333. package/esm2022/staging/wireframe/wireframe.mjs +0 -224
  334. package/esm2022/utils/content/content.mjs +0 -15
  335. package/esm2022/utils/index.mjs +0 -2
  336. package/fesm2022/angular-three-soba-modifiers.mjs +0 -71
  337. package/fesm2022/angular-three-soba-modifiers.mjs.map +0 -1
  338. package/fesm2022/angular-three-soba-utils.mjs +0 -22
  339. package/fesm2022/angular-three-soba-utils.mjs.map +0 -1
  340. package/loaders/gltf-loader/gltf-loader.d.ts +0 -10
  341. package/loaders/loader/loader.d.ts +0 -33
  342. package/loaders/progress/progress.d.ts +0 -9
  343. package/loaders/texture-loader/texture-loader.d.ts +0 -7
  344. package/materials/mesh-distort-material/mesh-distort-material.d.ts +0 -40
  345. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +0 -99
  346. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +0 -62
  347. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +0 -107
  348. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +0 -29
  349. package/materials/point-material/point-material.d.ts +0 -24
  350. package/misc/animations/animations.d.ts +0 -15
  351. package/misc/caustics/caustics.d.ts +0 -87
  352. package/misc/decal/decal.d.ts +0 -49
  353. package/misc/depth-buffer/depth-buffer.d.ts +0 -9
  354. package/misc/example/example.d.ts +0 -81
  355. package/misc/fbo/fbo.d.ts +0 -17
  356. package/misc/html/html-wrapper.d.ts +0 -559
  357. package/misc/html/html.d.ts +0 -214
  358. package/misc/sampler/sampler.d.ts +0 -67
  359. package/misc/shadow/shadow.d.ts +0 -37
  360. package/misc/stats-gl/stats-gl.d.ts +0 -24
  361. package/misc/trail/trail.d.ts +0 -57
  362. package/misc/trail-texture/inject-trail-texture.d.ts +0 -9
  363. package/misc/trail-texture/trail-texture.d.ts +0 -50
  364. package/modifiers/README.md +0 -3
  365. package/modifiers/curve-modifier/curve-modifier.d.ts +0 -23
  366. package/modifiers/index.d.ts +0 -1
  367. package/performances/adaptive-dpr/adaptive-dpr.d.ts +0 -14
  368. package/performances/points/points-input.d.ts +0 -32
  369. package/performances/points/points.d.ts +0 -92
  370. package/performances/points/position-point.d.ts +0 -11
  371. package/performances/segments/segment-object.d.ts +0 -7
  372. package/performances/segments/segments.d.ts +0 -124
  373. package/shaders/blur-pass/blur-pass.d.ts +0 -23
  374. package/shaders/caustics/caustics-material.d.ts +0 -4
  375. package/shaders/caustics/caustics-projection-material.d.ts +0 -4
  376. package/shaders/convolution-material/convolution-material.d.ts +0 -7
  377. package/shaders/discard-material/discard-material.d.ts +0 -3
  378. package/shaders/grid-material/grid-material.d.ts +0 -37
  379. package/shaders/mesh-distort-material/mesh-distort-material.d.ts +0 -295
  380. package/shaders/mesh-reflector-material/mesh-reflector-material.d.ts +0 -50
  381. package/shaders/mesh-refraction-material/mesh-refraction-material.d.ts +0 -4
  382. package/shaders/mesh-transmission-material/mesh-transmission-material.d.ts +0 -25
  383. package/shaders/mesh-wobble-material/mesh-wobble-material.d.ts +0 -16
  384. package/shaders/shader-material/shader-material.d.ts +0 -6
  385. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +0 -19
  386. package/shaders/sparkles-material/sparkles-material.d.ts +0 -17
  387. package/shaders/spot-light-material/spot-light-material.d.ts +0 -13
  388. package/shaders/star-field-material/star-field-material.d.ts +0 -13
  389. package/shaders/wireframe-material/wireframe-material.d.ts +0 -58
  390. package/staging/accumulative-shadows/accumulative-shadows.d.ts +0 -146
  391. package/staging/accumulative-shadows/progressive-light-map.d.ts +0 -34
  392. package/staging/accumulative-shadows/randomized-lights.d.ts +0 -90
  393. package/staging/backdrop/backdrop.d.ts +0 -30
  394. package/staging/bb-anchor/bb-anchor.d.ts +0 -27
  395. package/staging/bounds/bounds.d.ts +0 -134
  396. package/staging/camera-shake/camera-shake.d.ts +0 -43
  397. package/staging/center/center.d.ts +0 -70
  398. package/staging/cloud/cloud.d.ts +0 -51
  399. package/staging/contact-shadows/contact-shadows.d.ts +0 -70
  400. package/staging/environment/assets.d.ts +0 -13
  401. package/staging/environment/environment-cube.d.ts +0 -15
  402. package/staging/environment/environment-ground.d.ts +0 -13
  403. package/staging/environment/environment-input.d.ts +0 -68
  404. package/staging/environment/environment-map.d.ts +0 -16
  405. package/staging/environment/environment-portal.d.ts +0 -18
  406. package/staging/environment/environment.d.ts +0 -8
  407. package/staging/environment/utils.d.ts +0 -7
  408. package/staging/float/float.d.ts +0 -31
  409. package/staging/matcap-texture/matcap-texture.d.ts +0 -13
  410. package/staging/normal-texture/normal-texture.d.ts +0 -16
  411. package/staging/sky/sky.d.ts +0 -48
  412. package/staging/sparkles/sparkles.d.ts +0 -63
  413. package/staging/spot-light/shadow-mesh-input.d.ts +0 -29
  414. package/staging/spot-light/shadow-mesh.d.ts +0 -37
  415. package/staging/spot-light/spot-light-input.d.ts +0 -38
  416. package/staging/spot-light/spot-light.d.ts +0 -39
  417. package/staging/spot-light/volumetric-mesh.d.ts +0 -24
  418. package/staging/stage/stage.d.ts +0 -130
  419. package/staging/stars/stars.d.ts +0 -45
  420. package/staging/wireframe/wireframe-input.d.ts +0 -65
  421. package/staging/wireframe/wireframe.d.ts +0 -28
  422. package/utils/README.md +0 -3
  423. package/utils/content/content.d.ts +0 -8
  424. package/utils/index.d.ts +0 -1
  425. /package/misc/{bake-shadows → lib}/bake-shadows.d.ts +0 -0
@@ -0,0 +1,327 @@
1
+ import { NgTemplateOutlet } from '@angular/common';
2
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, inject, input, output, Renderer2, untracked, viewChild, } from '@angular/core';
3
+ import { injectBeforeRender, NgtHTML, pick, resolveRef } from 'angular-three';
4
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
5
+ import { mergeInputs } from 'ngxtension/inject-inputs';
6
+ import { Vector3 } from 'three';
7
+ import { NgtsHTML } from './html';
8
+ import { defaultCalculatePosition, epsilon, getCameraCSSMatrix, getObjectCSSMatrix, isObjectBehindCamera, isObjectVisible, objectScale, objectZIndex, } from './utils';
9
+ import * as i0 from "@angular/core";
10
+ const defaultHtmlContentOptions = {
11
+ eps: 0.001,
12
+ zIndexRange: [16777271, 0],
13
+ pointerEvents: 'auto',
14
+ calculatePosition: defaultCalculatePosition,
15
+ containerClass: '',
16
+ containerStyle: {},
17
+ center: false,
18
+ prepend: false,
19
+ fullscreen: false,
20
+ sprite: false,
21
+ };
22
+ export class NgtsHTMLContent extends NgtHTML {
23
+ constructor() {
24
+ super();
25
+ this.options = input(defaultHtmlContentOptions, {
26
+ transform: mergeInputs(defaultHtmlContentOptions),
27
+ alias: 'ngtsHTMLContent',
28
+ });
29
+ this.occluded = output();
30
+ this.html = inject(NgtsHTML);
31
+ this.transformOuterRef = viewChild('transformOuter');
32
+ this.transformInnerRef = viewChild('transformInner');
33
+ this.containerRef = viewChild('container');
34
+ this.gl = this.store.select('gl');
35
+ this.events = this.store.select('events');
36
+ this.camera = this.store.select('camera');
37
+ this.scene = this.store.select('scene');
38
+ this.size = this.store.select('size');
39
+ this.parent = pick(this.options, 'parent');
40
+ this.zIndexRange = pick(this.options, 'zIndexRange');
41
+ this.calculatePosition = pick(this.options, 'calculatePosition');
42
+ this.prepend = pick(this.options, 'prepend');
43
+ this.center = pick(this.options, 'center');
44
+ this.fullscreen = pick(this.options, 'fullscreen');
45
+ this.pointerEvents = pick(this.options, 'pointerEvents');
46
+ this.containerClass = pick(this.options, 'containerClass');
47
+ this.containerStyle = pick(this.options, 'containerStyle');
48
+ this.target = computed(() => {
49
+ const parent = resolveRef(this.parent());
50
+ if (parent)
51
+ return parent;
52
+ return (this.events().connected || this.gl().domElement.parentNode);
53
+ });
54
+ const autoEffect = injectAutoEffect();
55
+ const renderer = inject(Renderer2);
56
+ let isMeshSizeSet = false;
57
+ afterNextRender(() => {
58
+ autoEffect(() => {
59
+ const [occlude, canvasEl, zIndexRange] = [
60
+ this.html.occlude(),
61
+ untracked(this.gl).domElement,
62
+ untracked(this.zIndexRange),
63
+ ];
64
+ if (occlude && occlude === 'blending') {
65
+ renderer.setStyle(canvasEl, 'z-index', `${Math.floor(zIndexRange[0] / 2)}`);
66
+ renderer.setStyle(canvasEl, 'position', 'absolute');
67
+ renderer.setStyle(canvasEl, 'pointer-events', 'none');
68
+ }
69
+ else {
70
+ renderer.removeStyle(canvasEl, 'z-index');
71
+ renderer.removeStyle(canvasEl, 'position');
72
+ renderer.removeStyle(canvasEl, 'pointer-events');
73
+ }
74
+ });
75
+ autoEffect(() => {
76
+ const [transform, target, hostEl, prepend, scene, calculatePosition, group, size, camera] = [
77
+ this.html.transform(),
78
+ this.target(),
79
+ this.host.nativeElement,
80
+ untracked(this.prepend),
81
+ untracked(this.scene),
82
+ untracked(this.calculatePosition),
83
+ untracked(this.html.groupRef).nativeElement,
84
+ untracked(this.size),
85
+ untracked(this.camera),
86
+ ];
87
+ scene.updateMatrixWorld();
88
+ renderer.setStyle(hostEl, 'position', 'absolute');
89
+ renderer.setStyle(hostEl, 'top', '0');
90
+ renderer.setStyle(hostEl, 'left', '0');
91
+ if (transform) {
92
+ renderer.setStyle(hostEl, 'pointer-events', 'none');
93
+ renderer.setStyle(hostEl, 'overflow', 'hidden');
94
+ renderer.removeStyle(hostEl, 'transform');
95
+ renderer.removeStyle(hostEl, 'transform-origin');
96
+ }
97
+ else {
98
+ const vec = calculatePosition(group, camera, size);
99
+ renderer.setStyle(hostEl, 'transform', `translate3d(${vec[0]}px,${vec[1]}px,0)`);
100
+ renderer.setStyle(hostEl, 'transform-origin', '0 0');
101
+ renderer.removeStyle(hostEl, 'pointer-events');
102
+ renderer.removeStyle(hostEl, 'overflow');
103
+ }
104
+ if (prepend)
105
+ target.prepend(hostEl);
106
+ else
107
+ target.appendChild(hostEl);
108
+ return () => {
109
+ if (target)
110
+ target.removeChild(hostEl);
111
+ };
112
+ });
113
+ autoEffect(() => {
114
+ this.options();
115
+ this.html.options();
116
+ isMeshSizeSet = false;
117
+ });
118
+ });
119
+ let visible = true;
120
+ let oldZoom = 0;
121
+ let oldPosition = [0, 0];
122
+ injectBeforeRender(({ camera: rootCamera }) => {
123
+ const [hostEl, transformOuterEl, transformInnerEl, group, occlusionMesh, occlusionGeometry, isRaycastOcclusion, { camera, size, viewport, raycaster, scene }, { calculatePosition, eps, zIndexRange, sprite, distanceFactor }, { transform, occlude, scale },] = [
124
+ this.host.nativeElement,
125
+ this.transformOuterRef()?.nativeElement,
126
+ this.transformInnerRef()?.nativeElement,
127
+ this.html.groupRef().nativeElement,
128
+ this.html.occlusionMeshRef()?.nativeElement,
129
+ this.html.occlusionGeometryRef()?.nativeElement,
130
+ this.html.isRaycastOcclusion(),
131
+ this.store.snapshot,
132
+ this.options(),
133
+ this.html.options(),
134
+ ];
135
+ if (group) {
136
+ camera.updateMatrixWorld();
137
+ group.updateWorldMatrix(true, false);
138
+ const vec = transform ? oldPosition : calculatePosition(group, camera, size);
139
+ if (transform ||
140
+ Math.abs(oldZoom - camera.zoom) > eps ||
141
+ Math.abs(oldPosition[0] - vec[0]) > eps ||
142
+ Math.abs(oldPosition[1] - vec[1]) > eps) {
143
+ const isBehindCamera = isObjectBehindCamera(group, camera);
144
+ let raytraceTarget = false;
145
+ if (isRaycastOcclusion) {
146
+ if (Array.isArray(occlude)) {
147
+ raytraceTarget = occlude.map((item) => resolveRef(item));
148
+ }
149
+ else if (occlude !== 'blending') {
150
+ raytraceTarget = [scene];
151
+ }
152
+ }
153
+ const previouslyVisible = visible;
154
+ if (raytraceTarget) {
155
+ const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
156
+ visible = isVisible && !isBehindCamera;
157
+ }
158
+ else {
159
+ visible = !isBehindCamera;
160
+ }
161
+ if (previouslyVisible !== visible) {
162
+ if (this.occluded['listeners'])
163
+ this.occluded.emit(!visible);
164
+ else
165
+ renderer.setStyle(hostEl, 'display', visible ? 'block' : 'none');
166
+ }
167
+ const halfRange = Math.floor(zIndexRange[0] / 2);
168
+ const zRange = occlude
169
+ ? isRaycastOcclusion //
170
+ ? [zIndexRange[0], halfRange]
171
+ : [halfRange - 1, 0]
172
+ : zIndexRange;
173
+ renderer.setStyle(hostEl, 'z-index', `${objectZIndex(group, camera, zRange)}`);
174
+ if (transform) {
175
+ const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
176
+ const fov = camera.projectionMatrix.elements[5] * heightHalf;
177
+ const { isOrthographicCamera, top, left, bottom, right } = camera;
178
+ const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
179
+ const cameraTransform = isOrthographicCamera
180
+ ? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
181
+ : `translateZ(${fov}px)`;
182
+ let matrix = group.matrixWorld;
183
+ if (sprite) {
184
+ matrix = camera.matrixWorldInverse.clone().transpose().copyPosition(matrix).scale(group.scale);
185
+ matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
186
+ matrix.elements[15] = 1;
187
+ }
188
+ renderer.setStyle(hostEl, 'width', size.width + 'px');
189
+ renderer.setStyle(hostEl, 'height', size.height + 'px');
190
+ renderer.setStyle(hostEl, 'perspective', isOrthographicCamera ? '' : `${fov}px`);
191
+ if (transformOuterEl && transformInnerEl) {
192
+ renderer.setStyle(transformOuterEl, 'transform', `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`);
193
+ renderer.setStyle(transformInnerEl, 'transform', getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400)));
194
+ }
195
+ }
196
+ else {
197
+ const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
198
+ renderer.setStyle(hostEl, 'transform', `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`);
199
+ }
200
+ oldPosition = vec;
201
+ oldZoom = camera.zoom;
202
+ }
203
+ }
204
+ if (!isRaycastOcclusion && occlusionMesh && !isMeshSizeSet) {
205
+ if (transform) {
206
+ if (transformOuterEl) {
207
+ const el = transformOuterEl.children[0];
208
+ if (el?.clientWidth && el?.clientHeight) {
209
+ const { isOrthographicCamera } = camera;
210
+ if (isOrthographicCamera || occlusionGeometry) {
211
+ if (scale) {
212
+ if (!Array.isArray(scale)) {
213
+ occlusionMesh.scale.setScalar(1 / scale);
214
+ }
215
+ else if (scale instanceof Vector3) {
216
+ occlusionMesh.scale.copy(scale.clone().divideScalar(1));
217
+ }
218
+ else {
219
+ occlusionMesh.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
220
+ }
221
+ }
222
+ }
223
+ else {
224
+ const ratio = (distanceFactor || 10) / 400;
225
+ const w = el.clientWidth * ratio;
226
+ const h = el.clientHeight * ratio;
227
+ occlusionMesh.scale.set(w, h, 1);
228
+ }
229
+ isMeshSizeSet = true;
230
+ }
231
+ }
232
+ }
233
+ else {
234
+ const ele = hostEl.children[0];
235
+ if (ele?.clientWidth && ele?.clientHeight) {
236
+ const ratio = 1 / viewport.factor;
237
+ const w = ele.clientWidth * ratio;
238
+ const h = ele.clientHeight * ratio;
239
+ occlusionMesh.scale.set(w, h, 1);
240
+ isMeshSizeSet = true;
241
+ }
242
+ occlusionMesh.lookAt(rootCamera.position);
243
+ }
244
+ }
245
+ });
246
+ }
247
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsHTMLContent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
248
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsHTMLContent, isStandalone: true, selector: "[ngtsHTMLContent]", inputs: { options: { classPropertyName: "options", publicName: "ngtsHTMLContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { occluded: "occluded" }, host: { attributes: { "data-ngts-html-content": "" } }, viewQueries: [{ propertyName: "transformOuterRef", first: true, predicate: ["transformOuter"], descendants: true, isSignal: true }, { propertyName: "transformInnerRef", first: true, predicate: ["transformInner"], descendants: true, isSignal: true }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
249
+ @if (html.transform()) {
250
+ <div
251
+ #transformOuter
252
+ style="position: absolute; top: 0; left: 0; transform-style: preserve-3d; pointer-events: none;"
253
+ [style.width.px]="size().width"
254
+ [style.height.px]="size().height"
255
+ >
256
+ <div #transformInner style="position: absolute" [style.pointer-events]="pointerEvents()">
257
+ <div #container [class]="containerClass()" [style]="containerStyle()">
258
+ <ng-container [ngTemplateOutlet]="content" />
259
+ </div>
260
+ </div>
261
+ </div>
262
+ } @else {
263
+ <div
264
+ #container
265
+ style="position:absolute"
266
+ [style.transform]="center() ? 'translate3d(-50%,-50%,0)' : 'none'"
267
+ [style.top]="fullscreen() ? -size().height / 2 + 'px' : 'unset'"
268
+ [style.left]="fullscreen() ? -size().width / 2 + 'px' : 'unset'"
269
+ [style.width]="fullscreen() ? size().width : 'unset'"
270
+ [style.height]="fullscreen() ? size().height : 'unset'"
271
+ [class]="containerClass()"
272
+ [style]="containerStyle()"
273
+ >
274
+ <ng-container [ngTemplateOutlet]="content" />
275
+ </div>
276
+ }
277
+
278
+ <ng-template #content>
279
+ <ng-content />
280
+ </ng-template>
281
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
282
+ }
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsHTMLContent, decorators: [{
284
+ type: Component,
285
+ args: [{
286
+ selector: '[ngtsHTMLContent]',
287
+ standalone: true,
288
+ template: `
289
+ @if (html.transform()) {
290
+ <div
291
+ #transformOuter
292
+ style="position: absolute; top: 0; left: 0; transform-style: preserve-3d; pointer-events: none;"
293
+ [style.width.px]="size().width"
294
+ [style.height.px]="size().height"
295
+ >
296
+ <div #transformInner style="position: absolute" [style.pointer-events]="pointerEvents()">
297
+ <div #container [class]="containerClass()" [style]="containerStyle()">
298
+ <ng-container [ngTemplateOutlet]="content" />
299
+ </div>
300
+ </div>
301
+ </div>
302
+ } @else {
303
+ <div
304
+ #container
305
+ style="position:absolute"
306
+ [style.transform]="center() ? 'translate3d(-50%,-50%,0)' : 'none'"
307
+ [style.top]="fullscreen() ? -size().height / 2 + 'px' : 'unset'"
308
+ [style.left]="fullscreen() ? -size().width / 2 + 'px' : 'unset'"
309
+ [style.width]="fullscreen() ? size().width : 'unset'"
310
+ [style.height]="fullscreen() ? size().height : 'unset'"
311
+ [class]="containerClass()"
312
+ [style]="containerStyle()"
313
+ >
314
+ <ng-container [ngTemplateOutlet]="content" />
315
+ </div>
316
+ }
317
+
318
+ <ng-template #content>
319
+ <ng-content />
320
+ </ng-template>
321
+ `,
322
+ changeDetection: ChangeDetectionStrategy.OnPush,
323
+ imports: [NgTemplateOutlet],
324
+ host: { 'data-ngts-html-content': '' },
325
+ }]
326
+ }], ctorParameters: () => [] });
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2xpYi9odG1sL2h0bWwtY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ04sZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUVSLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFnQyxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBRU4sd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsV0FBVyxFQUNYLFlBQVksR0FDWixNQUFNLFNBQVMsQ0FBQzs7QUE4QmpCLE1BQU0seUJBQXlCLEdBQTJCO0lBQ3pELEdBQUcsRUFBRSxLQUFLO0lBQ1YsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQixhQUFhLEVBQUUsTUFBTTtJQUNyQixpQkFBaUIsRUFBRSx3QkFBd0I7SUFDM0MsY0FBYyxFQUFFLEVBQUU7SUFDbEIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxFQUFFLEtBQUs7SUFD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LENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO3dCQUNsQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzt3QkFDbEMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBRW5DLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRWpDLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLENBQUM7b0JBRUQsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOzhHQTNRVyxlQUFlO2tHQUFmLGVBQWUsd3JCQXRDakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDVCw0REFFUyxnQkFBZ0I7OzJGQUdkLGVBQWU7a0JBekMzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLElBQUksRUFBRSxFQUFFLHdCQUF3QixFQUFFLEVBQUUsRUFBRTtpQkFDdEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdGFmdGVyTmV4dFJlbmRlcixcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdG91dHB1dCxcblx0UmVuZGVyZXIyLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIsIE5ndEhUTUwsIHBpY2ssIHJlc29sdmVSZWYgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IE9iamVjdDNELCBPcnRob2dyYXBoaWNDYW1lcmEsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RzSFRNTCB9IGZyb20gJy4vaHRtbCc7XG5pbXBvcnQge1xuXHRDYWxjdWxhdGVQb3NpdGlvbixcblx0ZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uLFxuXHRlcHNpbG9uLFxuXHRnZXRDYW1lcmFDU1NNYXRyaXgsXG5cdGdldE9iamVjdENTU01hdHJpeCxcblx0aXNPYmplY3RCZWhpbmRDYW1lcmEsXG5cdGlzT2JqZWN0VmlzaWJsZSxcblx0b2JqZWN0U2NhbGUsXG5cdG9iamVjdFpJbmRleCxcbn0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgUG9pbnRlckV2ZW50c1Byb3BlcnRpZXMgPVxuXHR8ICdhdXRvJ1xuXHR8ICdub25lJ1xuXHR8ICd2aXNpYmxlUGFpbnRlZCdcblx0fCAndmlzaWJsZUZpbGwnXG5cdHwgJ3Zpc2libGVTdHJva2UnXG5cdHwgJ3Zpc2libGUnXG5cdHwgJ3BhaW50ZWQnXG5cdHwgJ2ZpbGwnXG5cdHwgJ3N0cm9rZSdcblx0fCAnYWxsJ1xuXHR8ICdpbmhlcml0JztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzSFRNTENvbnRlbnRPcHRpb25zIHtcblx0ZXBzOiBudW1iZXI7XG5cdHpJbmRleFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuXHRjZW50ZXI6IGJvb2xlYW47XG5cdHByZXBlbmQ6IGJvb2xlYW47XG5cdGZ1bGxzY3JlZW46IGJvb2xlYW47XG5cdGNvbnRhaW5lckNsYXNzOiBzdHJpbmc7XG5cdGNvbnRhaW5lclN0eWxlOiBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+O1xuXHRwb2ludGVyRXZlbnRzOiBQb2ludGVyRXZlbnRzUHJvcGVydGllcztcblx0Y2FsY3VsYXRlUG9zaXRpb246IENhbGN1bGF0ZVBvc2l0aW9uO1xuXHRzcHJpdGU6IGJvb2xlYW47XG5cdGRpc3RhbmNlRmFjdG9yPzogbnVtYmVyO1xuXHRwYXJlbnQ/OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xufVxuXG5jb25zdCBkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zOiBOZ3RzSFRNTENvbnRlbnRPcHRpb25zID0ge1xuXHRlcHM6IDAuMDAxLFxuXHR6SW5kZXhSYW5nZTogWzE2Nzc3MjcxLCAwXSxcblx0cG9pbnRlckV2ZW50czogJ2F1dG8nLFxuXHRjYWxjdWxhdGVQb3NpdGlvbjogZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uLFxuXHRjb250YWluZXJDbGFzczogJycsXG5cdGNvbnRhaW5lclN0eWxlOiB7fSxcblx0Y2VudGVyOiBmYWxzZSxcblx0cHJlcGVuZDogZmFsc2UsXG5cdGZ1bGxzY3JlZW46IGZhbHNlLFxuXHRzcHJpdGU6IGZhbHNlLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnW25ndHNIVE1MQ29udGVudF0nLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdEBpZiAoaHRtbC50cmFuc2Zvcm0oKSkge1xuXHRcdFx0PGRpdlxuXHRcdFx0XHQjdHJhbnNmb3JtT3V0ZXJcblx0XHRcdFx0c3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDsgcG9pbnRlci1ldmVudHM6IG5vbmU7XCJcblx0XHRcdFx0W3N0eWxlLndpZHRoLnB4XT1cInNpemUoKS53aWR0aFwiXG5cdFx0XHRcdFtzdHlsZS5oZWlnaHQucHhdPVwic2l6ZSgpLmhlaWdodFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxkaXYgI3RyYW5zZm9ybUlubmVyIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cInBvaW50ZXJFdmVudHMoKVwiPlxuXHRcdFx0XHRcdDxkaXYgI2NvbnRhaW5lciBbY2xhc3NdPVwiY29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJjb250YWluZXJTdHlsZSgpXCI+XG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRcIiAvPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdH0gQGVsc2Uge1xuXHRcdFx0PGRpdlxuXHRcdFx0XHQjY29udGFpbmVyXG5cdFx0XHRcdHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGVcIlxuXHRcdFx0XHRbc3R5bGUudHJhbnNmb3JtXT1cImNlbnRlcigpID8gJ3RyYW5zbGF0ZTNkKC01MCUsLTUwJSwwKScgOiAnbm9uZSdcIlxuXHRcdFx0XHRbc3R5bGUudG9wXT1cImZ1bGxzY3JlZW4oKSA/IC1zaXplKCkuaGVpZ2h0IC8gMiArICdweCcgOiAndW5zZXQnXCJcblx0XHRcdFx0W3N0eWxlLmxlZnRdPVwiZnVsbHNjcmVlbigpID8gLXNpemUoKS53aWR0aCAvIDIgKyAncHgnIDogJ3Vuc2V0J1wiXG5cdFx0XHRcdFtzdHlsZS53aWR0aF09XCJmdWxsc2NyZWVuKCkgPyBzaXplKCkud2lkdGggOiAndW5zZXQnXCJcblx0XHRcdFx0W3N0eWxlLmhlaWdodF09XCJmdWxsc2NyZWVuKCkgPyBzaXplKCkuaGVpZ2h0IDogJ3Vuc2V0J1wiXG5cdFx0XHRcdFtjbGFzc109XCJjb250YWluZXJDbGFzcygpXCJcblx0XHRcdFx0W3N0eWxlXT1cImNvbnRhaW5lclN0eWxlKClcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRcIiAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0fVxuXG5cdFx0PG5nLXRlbXBsYXRlICNjb250ZW50PlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXRdLFxuXHRob3N0OiB7ICdkYXRhLW5ndHMtaHRtbC1jb250ZW50JzogJycgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0hUTUxDb250ZW50IGV4dGVuZHMgTmd0SFRNTCB7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zLCB7XG5cdFx0dHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zKSxcblx0XHRhbGlhczogJ25ndHNIVE1MQ29udGVudCcsXG5cdH0pO1xuXHRvY2NsdWRlZCA9IG91dHB1dDxib29sZWFuPigpO1xuXG5cdGh0bWwgPSBpbmplY3QoTmd0c0hUTUwpO1xuXG5cdHRyYW5zZm9ybU91dGVyUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PigndHJhbnNmb3JtT3V0ZXInKTtcblx0dHJhbnNmb3JtSW5uZXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCd0cmFuc2Zvcm1Jbm5lcicpO1xuXHRjb250YWluZXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXInKTtcblxuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cdHByaXZhdGUgZXZlbnRzID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2V2ZW50cycpO1xuXHRwcml2YXRlIGNhbWVyYSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRzaXplID0gdGhpcy5zdG9yZS5zZWxlY3QoJ3NpemUnKTtcblxuXHRwcml2YXRlIHBhcmVudCA9IHBpY2sodGhpcy5vcHRpb25zLCAncGFyZW50Jyk7XG5cdHByaXZhdGUgekluZGV4UmFuZ2UgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3pJbmRleFJhbmdlJyk7XG5cdHByaXZhdGUgY2FsY3VsYXRlUG9zaXRpb24gPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NhbGN1bGF0ZVBvc2l0aW9uJyk7XG5cdHByaXZhdGUgcHJlcGVuZCA9IHBpY2sodGhpcy5vcHRpb25zLCAncHJlcGVuZCcpO1xuXHRjZW50ZXIgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NlbnRlcicpO1xuXHRmdWxsc2NyZWVuID0gcGljayh0aGlzLm9wdGlvbnMsICdmdWxsc2NyZWVuJyk7XG5cdHBvaW50ZXJFdmVudHMgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3BvaW50ZXJFdmVudHMnKTtcblx0Y29udGFpbmVyQ2xhc3MgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NvbnRhaW5lckNsYXNzJyk7XG5cdGNvbnRhaW5lclN0eWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdjb250YWluZXJTdHlsZScpO1xuXG5cdHByaXZhdGUgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHJlc29sdmVSZWYodGhpcy5wYXJlbnQoKSk7XG5cdFx0aWYgKHBhcmVudCkgcmV0dXJuIHBhcmVudDtcblx0XHRyZXR1cm4gKHRoaXMuZXZlbnRzKCkuY29ubmVjdGVkIHx8IHRoaXMuZ2woKS5kb21FbGVtZW50LnBhcmVudE5vZGUpIGFzIEhUTUxFbGVtZW50O1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0Y29uc3QgYXV0b0VmZmVjdCA9IGluamVjdEF1dG9FZmZlY3QoKTtcblx0XHRjb25zdCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG5cdFx0bGV0IGlzTWVzaFNpemVTZXQgPSBmYWxzZTtcblxuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHRhdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdFx0Y29uc3QgW29jY2x1ZGUsIGNhbnZhc0VsLCB6SW5kZXhSYW5nZV0gPSBbXG5cdFx0XHRcdFx0dGhpcy5odG1sLm9jY2x1ZGUoKSxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy5nbCkuZG9tRWxlbWVudCxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy56SW5kZXhSYW5nZSksXG5cdFx0XHRcdF07XG5cblx0XHRcdFx0aWYgKG9jY2x1ZGUgJiYgb2NjbHVkZSA9PT0gJ2JsZW5kaW5nJykge1xuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGNhbnZhc0VsLCAnei1pbmRleCcsIGAke01hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKX1gKTtcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShjYW52YXNFbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoY2FudmFzRWwsICdwb2ludGVyLWV2ZW50cycsICdub25lJyk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVuZGVyZXIucmVtb3ZlU3R5bGUoY2FudmFzRWwsICd6LWluZGV4Jyk7XG5cdFx0XHRcdFx0cmVuZGVyZXIucmVtb3ZlU3R5bGUoY2FudmFzRWwsICdwb3NpdGlvbicpO1xuXHRcdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGNhbnZhc0VsLCAncG9pbnRlci1ldmVudHMnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbdHJhbnNmb3JtLCB0YXJnZXQsIGhvc3RFbCwgcHJlcGVuZCwgc2NlbmUsIGNhbGN1bGF0ZVBvc2l0aW9uLCBncm91cCwgc2l6ZSwgY2FtZXJhXSA9IFtcblx0XHRcdFx0XHR0aGlzLmh0bWwudHJhbnNmb3JtKCksXG5cdFx0XHRcdFx0dGhpcy50YXJnZXQoKSxcblx0XHRcdFx0XHR0aGlzLmhvc3QubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy5wcmVwZW5kKSxcblx0XHRcdFx0XHR1bnRyYWNrZWQodGhpcy5zY2VuZSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuY2FsY3VsYXRlUG9zaXRpb24pLFxuXHRcdFx0XHRcdHVudHJhY2tlZCh0aGlzLmh0bWwuZ3JvdXBSZWYpLm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuc2l6ZSksXG5cdFx0XHRcdFx0dW50cmFja2VkKHRoaXMuY2FtZXJhKSxcblx0XHRcdFx0XTtcblxuXHRcdFx0XHRzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICd0b3AnLCAnMCcpO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdsZWZ0JywgJzAnKTtcblxuXHRcdFx0XHRpZiAodHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ292ZXJmbG93JywgJ2hpZGRlbicpO1xuXHRcdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybScpO1xuXHRcdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybS1vcmlnaW4nKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB2ZWMgPSBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlM2QoJHt2ZWNbMF19cHgsJHt2ZWNbMV19cHgsMClgKTtcblx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgJzAgMCcpO1xuXHRcdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ3BvaW50ZXItZXZlbnRzJyk7XG5cdFx0XHRcdFx0cmVuZGVyZXIucmVtb3ZlU3R5bGUoaG9zdEVsLCAnb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChwcmVwZW5kKSB0YXJnZXQucHJlcGVuZChob3N0RWwpO1xuXHRcdFx0XHRlbHNlIHRhcmdldC5hcHBlbmRDaGlsZChob3N0RWwpO1xuXG5cdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKHRhcmdldCkgdGFyZ2V0LnJlbW92ZUNoaWxkKGhvc3RFbCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblxuXHRcdFx0YXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub3B0aW9ucygpO1xuXHRcdFx0XHR0aGlzLmh0bWwub3B0aW9ucygpO1xuXHRcdFx0XHRpc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGxldCB2aXNpYmxlID0gdHJ1ZTtcblx0XHRsZXQgb2xkWm9vbSA9IDA7XG5cdFx0bGV0IG9sZFBvc2l0aW9uID0gWzAsIDBdO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGNhbWVyYTogcm9vdENhbWVyYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbXG5cdFx0XHRcdGhvc3RFbCxcblx0XHRcdFx0dHJhbnNmb3JtT3V0ZXJFbCxcblx0XHRcdFx0dHJhbnNmb3JtSW5uZXJFbCxcblx0XHRcdFx0Z3JvdXAsXG5cdFx0XHRcdG9jY2x1c2lvbk1lc2gsXG5cdFx0XHRcdG9jY2x1c2lvbkdlb21ldHJ5LFxuXHRcdFx0XHRpc1JheWNhc3RPY2NsdXNpb24sXG5cdFx0XHRcdHsgY2FtZXJhLCBzaXplLCB2aWV3cG9ydCwgcmF5Y2FzdGVyLCBzY2VuZSB9LFxuXHRcdFx0XHR7IGNhbGN1bGF0ZVBvc2l0aW9uLCBlcHMsIHpJbmRleFJhbmdlLCBzcHJpdGUsIGRpc3RhbmNlRmFjdG9yIH0sXG5cdFx0XHRcdHsgdHJhbnNmb3JtLCBvY2NsdWRlLCBzY2FsZSB9LFxuXHRcdFx0XSA9IFtcblx0XHRcdFx0dGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMudHJhbnNmb3JtT3V0ZXJSZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy50cmFuc2Zvcm1Jbm5lclJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwub2NjbHVzaW9uTWVzaFJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwub2NjbHVzaW9uR2VvbWV0cnlSZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5odG1sLmlzUmF5Y2FzdE9jY2x1c2lvbigpLFxuXHRcdFx0XHR0aGlzLnN0b3JlLnNuYXBzaG90LFxuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5odG1sLm9wdGlvbnMoKSxcblx0XHRcdF07XG5cblx0XHRcdGlmIChncm91cCkge1xuXHRcdFx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0Z3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRjb25zdCB2ZWMgPSB0cmFuc2Zvcm0gPyBvbGRQb3NpdGlvbiA6IGNhbGN1bGF0ZVBvc2l0aW9uKGdyb3VwLCBjYW1lcmEsIHNpemUpO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0cmFuc2Zvcm0gfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRab29tIC0gY2FtZXJhLnpvb20pID4gZXBzIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkUG9zaXRpb25bMF0gLSB2ZWNbMF0pID4gZXBzIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkUG9zaXRpb25bMV0gLSB2ZWNbMV0pID4gZXBzXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGlzQmVoaW5kQ2FtZXJhID0gaXNPYmplY3RCZWhpbmRDYW1lcmEoZ3JvdXAsIGNhbWVyYSk7XG5cdFx0XHRcdFx0bGV0IHJheXRyYWNlVGFyZ2V0OiBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IE9iamVjdDNEW10gPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmIChpc1JheWNhc3RPY2NsdXNpb24pIHtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9jY2x1ZGUpKSB7XG5cdFx0XHRcdFx0XHRcdHJheXRyYWNlVGFyZ2V0ID0gb2NjbHVkZS5tYXAoKGl0ZW0pID0+IHJlc29sdmVSZWYoaXRlbSkpIGFzIE9iamVjdDNEW107XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9jY2x1ZGUgIT09ICdibGVuZGluZycpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBbc2NlbmVdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzbHlWaXNpYmxlID0gdmlzaWJsZTtcblx0XHRcdFx0XHRpZiAocmF5dHJhY2VUYXJnZXQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGlzVmlzaWJsZSA9IGlzT2JqZWN0VmlzaWJsZShncm91cCwgY2FtZXJhLCByYXljYXN0ZXIsIHJheXRyYWNlVGFyZ2V0KTtcblx0XHRcdFx0XHRcdHZpc2libGUgPSBpc1Zpc2libGUgJiYgIWlzQmVoaW5kQ2FtZXJhO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2aXNpYmxlID0gIWlzQmVoaW5kQ2FtZXJhO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChwcmV2aW91c2x5VmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub2NjbHVkZWRbJ2xpc3RlbmVycyddKSB0aGlzLm9jY2x1ZGVkLmVtaXQoIXZpc2libGUpO1xuXHRcdFx0XHRcdFx0ZWxzZSByZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdkaXNwbGF5JywgdmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZScpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGhhbGZSYW5nZSA9IE1hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKTtcblx0XHRcdFx0XHRjb25zdCB6UmFuZ2UgPSBvY2NsdWRlXG5cdFx0XHRcdFx0XHQ/IGlzUmF5Y2FzdE9jY2x1c2lvbiAvL1xuXHRcdFx0XHRcdFx0XHQ/IFt6SW5kZXhSYW5nZVswXSwgaGFsZlJhbmdlXVxuXHRcdFx0XHRcdFx0XHQ6IFtoYWxmUmFuZ2UgLSAxLCAwXVxuXHRcdFx0XHRcdFx0OiB6SW5kZXhSYW5nZTtcblxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3otaW5kZXgnLCBgJHtvYmplY3RaSW5kZXgoZ3JvdXAsIGNhbWVyYSwgelJhbmdlKX1gKTtcblxuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IFt3aWR0aEhhbGYsIGhlaWdodEhhbGZdID0gW3NpemUud2lkdGggLyAyLCBzaXplLmhlaWdodCAvIDJdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZm92ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0gKiBoZWlnaHRIYWxmO1xuXHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSBjYW1lcmEgYXMgT3J0aG9ncmFwaGljQ2FtZXJhO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhTWF0cml4ID0gZ2V0Q2FtZXJhQ1NTTWF0cml4KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhVHJhbnNmb3JtID0gaXNPcnRob2dyYXBoaWNDYW1lcmFcblx0XHRcdFx0XHRcdFx0PyBgc2NhbGUoJHtmb3Z9KXRyYW5zbGF0ZSgke2Vwc2lsb24oLShyaWdodCArIGxlZnQpIC8gMil9cHgsJHtlcHNpbG9uKCh0b3AgKyBib3R0b20pIC8gMil9cHgpYFxuXHRcdFx0XHRcdFx0XHQ6IGB0cmFuc2xhdGVaKCR7Zm92fXB4KWA7XG5cdFx0XHRcdFx0XHRsZXQgbWF0cml4ID0gZ3JvdXAubWF0cml4V29ybGQ7XG5cdFx0XHRcdFx0XHRpZiAoc3ByaXRlKSB7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY2xvbmUoKS50cmFuc3Bvc2UoKS5jb3B5UG9zaXRpb24obWF0cml4KS5zY2FsZShncm91cC5zY2FsZSk7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1szXSA9IG1hdHJpeC5lbGVtZW50c1s3XSA9IG1hdHJpeC5lbGVtZW50c1sxMV0gPSAwO1xuXHRcdFx0XHRcdFx0XHRtYXRyaXguZWxlbWVudHNbMTVdID0gMTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAnd2lkdGgnLCBzaXplLndpZHRoICsgJ3B4Jyk7XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdoZWlnaHQnLCBzaXplLmhlaWdodCArICdweCcpO1xuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAncGVyc3BlY3RpdmUnLCBpc09ydGhvZ3JhcGhpY0NhbWVyYSA/ICcnIDogYCR7Zm92fXB4YCk7XG5cblx0XHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1PdXRlckVsICYmIHRyYW5zZm9ybUlubmVyRWwpIHtcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoXG5cdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtT3V0ZXJFbCxcblx0XHRcdFx0XHRcdFx0XHQndHJhbnNmb3JtJyxcblx0XHRcdFx0XHRcdFx0XHRgJHtjYW1lcmFUcmFuc2Zvcm19JHtjYW1lcmFNYXRyaXh9dHJhbnNsYXRlKCR7d2lkdGhIYWxmfXB4LCR7aGVpZ2h0SGFsZn1weClgLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1Jbm5lckVsLFxuXHRcdFx0XHRcdFx0XHRcdCd0cmFuc2Zvcm0nLFxuXHRcdFx0XHRcdFx0XHRcdGdldE9iamVjdENTU01hdHJpeChtYXRyaXgsIDEgLyAoKGRpc3RhbmNlRmFjdG9yIHx8IDEwKSAvIDQwMCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzY2FsZSA9IGRpc3RhbmNlRmFjdG9yID09PSB1bmRlZmluZWQgPyAxIDogb2JqZWN0U2NhbGUoZ3JvdXAsIGNhbWVyYSkgKiBkaXN0YW5jZUZhY3Rvcjtcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKSBzY2FsZSgke3NjYWxlfSlgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2xkUG9zaXRpb24gPSB2ZWM7XG5cdFx0XHRcdFx0b2xkWm9vbSA9IGNhbWVyYS56b29tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNSYXljYXN0T2NjbHVzaW9uICYmIG9jY2x1c2lvbk1lc2ggJiYgIWlzTWVzaFNpemVTZXQpIHtcblx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1PdXRlckVsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBlbCA9IHRyYW5zZm9ybU91dGVyRWwuY2hpbGRyZW5bMF07XG5cblx0XHRcdFx0XHRcdGlmIChlbD8uY2xpZW50V2lkdGggJiYgZWw/LmNsaWVudEhlaWdodCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhIH0gPSBjYW1lcmEgYXMgT3J0aG9ncmFwaGljQ2FtZXJhO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChpc09ydGhvZ3JhcGhpY0NhbWVyYSB8fCBvY2NsdXNpb25HZW9tZXRyeSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoLnNjYWxlLnNldFNjYWxhcigxIC8gKHNjYWxlIGFzIG51bWJlcikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzY2FsZSBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaC5zY2FsZS5jb3B5KHNjYWxlLmNsb25lKCkuZGl2aWRlU2NhbGFyKDEpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2guc2NhbGUuc2V0KDEgLyBzY2FsZVswXSwgMSAvIHNjYWxlWzFdLCAxIC8gc2NhbGVbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IChkaXN0YW5jZUZhY3RvciB8fCAxMCkgLyA0MDA7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdyA9IGVsLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaCA9IGVsLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaC5zY2FsZS5zZXQodywgaCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZWxlID0gaG9zdEVsLmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0aWYgKGVsZT8uY2xpZW50V2lkdGggJiYgZWxlPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJhdGlvID0gMSAvIHZpZXdwb3J0LmZhY3Rvcjtcblx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbGUuY2xpZW50V2lkdGggKiByYXRpbztcblx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbGUuY2xpZW50SGVpZ2h0ICogcmF0aW87XG5cblx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2guc2NhbGUuc2V0KHcsIGgsIDEpO1xuXG5cdFx0XHRcdFx0XHRpc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvY2NsdXNpb25NZXNoLmxvb2tBdChyb290Q2FtZXJhLnBvc2l0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,129 @@
1
+ import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, viewChild, } from '@angular/core';
2
+ import { extend, is, omit, pick } from 'angular-three';
3
+ import { mergeInputs } from 'ngxtension/inject-inputs';
4
+ import { DoubleSide, Group, Mesh, PlaneGeometry, ShaderMaterial } from 'three';
5
+ import * as i0 from "@angular/core";
6
+ const defaultHtmlOptions = {
7
+ occlude: false,
8
+ transform: false,
9
+ castShadow: false,
10
+ receiveShadow: false,
11
+ };
12
+ export class NgtsHTML {
13
+ constructor() {
14
+ this.options = input(defaultHtmlOptions, { transform: mergeInputs(defaultHtmlOptions) });
15
+ this.parameters = omit(this.options, ['occlude', 'castShadow', 'receiveShadow', 'transform']);
16
+ this.groupRef = viewChild.required('group');
17
+ this.occlusionMeshRef = viewChild('occlusionMesh');
18
+ this.occlusionGeometryRef = viewChild('occlusionGeometry');
19
+ this.occlude = pick(this.options, 'occlude');
20
+ this.transform = pick(this.options, 'transform');
21
+ this.castShadow = pick(this.options, 'castShadow');
22
+ this.receiveShadow = pick(this.options, 'receiveShadow');
23
+ this.scale = pick(this.options, 'scale');
24
+ this.isRaycastOcclusion = computed(() => {
25
+ const occlude = this.occlude();
26
+ return (occlude && occlude !== 'blending') || (Array.isArray(occlude) && occlude.length && is.ref(occlude[0]));
27
+ });
28
+ this.shaders = computed(() => {
29
+ const transform = this.transform();
30
+ const vertexShader = !transform
31
+ ? /* language=glsl glsl */ `
32
+ /*
33
+ This shader is from the THREE's SpriteMaterial.
34
+ We need to turn the backing plane into a Sprite
35
+ (make it always face the camera) if "transfrom"
36
+ is false.
37
+ */
38
+ #include <common>
39
+
40
+ void main() {
41
+ vec2 center = vec2(0., 1.);
42
+ float rotation = 0.0;
43
+
44
+ // This is somewhat arbitrary, but it seems to work well
45
+ // Need to figure out how to derive this dynamically if it even matters
46
+ float size = 0.03;
47
+
48
+ vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
49
+ vec2 scale;
50
+ scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );
51
+ scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );
52
+
53
+ bool isPerspective = isPerspectiveMatrix( projectionMatrix );
54
+ if ( isPerspective ) scale *= - mvPosition.z;
55
+
56
+ vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale * size;
57
+ vec2 rotatedPosition;
58
+ rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;
59
+ rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;
60
+ mvPosition.xy += rotatedPosition;
61
+
62
+ gl_Position = projectionMatrix * mvPosition;
63
+ }
64
+ `
65
+ : undefined;
66
+ const fragmentShader = /* language=glsl glsl */ `
67
+ void main() {
68
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
69
+ }
70
+ `;
71
+ return { vertexShader, fragmentShader };
72
+ });
73
+ this.vertexShader = pick(this.shaders, 'vertexShader');
74
+ this.fragmentShader = pick(this.shaders, 'fragmentShader');
75
+ this.DoubleSide = DoubleSide;
76
+ extend({ Group, Mesh, PlaneGeometry, ShaderMaterial });
77
+ }
78
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsHTML, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
79
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: NgtsHTML, isStandalone: true, selector: "ngts-html", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "occlusionMeshRef", first: true, predicate: ["occlusionMesh"], descendants: true, isSignal: true }, { propertyName: "occlusionGeometryRef", first: true, predicate: ["occlusionGeometry"], descendants: true, isSignal: true }], ngImport: i0, template: `
80
+ <ngt-group #group [parameters]="parameters()">
81
+ @if (occlude() && !isRaycastOcclusion()) {
82
+ <ngt-mesh #occlusionMesh [castShadow]="castShadow()" [receiveShadow]="receiveShadow()">
83
+ <ng-content select="[data-occlusion-geometry]">
84
+ <ngt-plane-geometry #occlusionGeometry />
85
+ </ng-content>
86
+ <ng-content select="[data-occlusion-material]">
87
+ <ngt-shader-material
88
+ [side]="DoubleSide"
89
+ [vertexShader]="vertexShader()"
90
+ [fragmentShader]="fragmentShader()"
91
+ />
92
+ </ng-content>
93
+ </ngt-mesh>
94
+ }
95
+ </ngt-group>
96
+
97
+ <ng-content />
98
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsHTML, decorators: [{
101
+ type: Component,
102
+ args: [{
103
+ selector: 'ngts-html',
104
+ standalone: true,
105
+ template: `
106
+ <ngt-group #group [parameters]="parameters()">
107
+ @if (occlude() && !isRaycastOcclusion()) {
108
+ <ngt-mesh #occlusionMesh [castShadow]="castShadow()" [receiveShadow]="receiveShadow()">
109
+ <ng-content select="[data-occlusion-geometry]">
110
+ <ngt-plane-geometry #occlusionGeometry />
111
+ </ng-content>
112
+ <ng-content select="[data-occlusion-material]">
113
+ <ngt-shader-material
114
+ [side]="DoubleSide"
115
+ [vertexShader]="vertexShader()"
116
+ [fragmentShader]="fragmentShader()"
117
+ />
118
+ </ng-content>
119
+ </ngt-mesh>
120
+ }
121
+ </ngt-group>
122
+
123
+ <ng-content />
124
+ `,
125
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
126
+ changeDetection: ChangeDetectionStrategy.OnPush,
127
+ }]
128
+ }], ctorParameters: () => [] });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9taXNjL3NyYy9saWIvaHRtbC9odG1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFFdEIsS0FBSyxFQUNMLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVksYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFTekYsTUFBTSxrQkFBa0IsR0FBb0I7SUFDM0MsT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsS0FBSztJQUNoQixVQUFVLEVBQUUsS0FBSztJQUNqQixhQUFhLEVBQUUsS0FBSztDQUNwQixDQUFDO0FBNEJGLE1BQU0sT0FBTyxRQUFRO0lBc0VwQjtRQXJFQSxZQUFPLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRixlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXpGLGFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFvQixPQUFPLENBQUMsQ0FBQztRQUMxRCxxQkFBZ0IsR0FBRyxTQUFTLENBQW1CLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLHlCQUFvQixHQUFHLFNBQVMsQ0FBNEIsbUJBQW1CLENBQUMsQ0FBQztRQUVqRixZQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELFVBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwQyx1QkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7UUFFSyxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUFTO2dCQUM5QixDQUFDLENBQUMsd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWlDdkI7Z0JBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUViLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDOzs7O0tBSTdDLENBQUM7WUFFSixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFNbkMsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUgxQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7OEdBeEVXLFFBQVE7a0dBQVIsUUFBUSxrakJBdkJWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbUJUOzsyRkFJVyxRQUFRO2tCQTFCcEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsV0FBVztvQkFDckIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGlucHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpcywgTmd0R3JvdXAsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IERvdWJsZVNpZGUsIEdyb3VwLCBNZXNoLCBPYmplY3QzRCwgUGxhbmVHZW9tZXRyeSwgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0hUTUxPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RHcm91cD4ge1xuXHRvY2NsdWRlOiBFbGVtZW50UmVmPE9iamVjdDNEPltdIHwgT2JqZWN0M0RbXSB8IGJvb2xlYW4gfCAncmF5Y2FzdCcgfCAnYmxlbmRpbmcnO1xuXHR0cmFuc2Zvcm06IGJvb2xlYW47XG5cdGNhc3RTaGFkb3c6IGJvb2xlYW47XG5cdHJlY2VpdmVTaGFkb3c6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRIdG1sT3B0aW9uczogTmd0c0hUTUxPcHRpb25zID0ge1xuXHRvY2NsdWRlOiBmYWxzZSxcblx0dHJhbnNmb3JtOiBmYWxzZSxcblx0Y2FzdFNoYWRvdzogZmFsc2UsXG5cdHJlY2VpdmVTaGFkb3c6IGZhbHNlLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1odG1sJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwICNncm91cCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdEBpZiAob2NjbHVkZSgpICYmICFpc1JheWNhc3RPY2NsdXNpb24oKSkge1xuXHRcdFx0XHQ8bmd0LW1lc2ggI29jY2x1c2lvbk1lc2ggW2Nhc3RTaGFkb3ddPVwiY2FzdFNoYWRvdygpXCIgW3JlY2VpdmVTaGFkb3ddPVwicmVjZWl2ZVNoYWRvdygpXCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtb2NjbHVzaW9uLWdlb21ldHJ5XVwiPlxuXHRcdFx0XHRcdFx0PG5ndC1wbGFuZS1nZW9tZXRyeSAjb2NjbHVzaW9uR2VvbWV0cnkgLz5cblx0XHRcdFx0XHQ8L25nLWNvbnRlbnQ+XG5cdFx0XHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtb2NjbHVzaW9uLW1hdGVyaWFsXVwiPlxuXHRcdFx0XHRcdFx0PG5ndC1zaGFkZXItbWF0ZXJpYWxcblx0XHRcdFx0XHRcdFx0W3NpZGVdPVwiRG91YmxlU2lkZVwiXG5cdFx0XHRcdFx0XHRcdFt2ZXJ0ZXhTaGFkZXJdPVwidmVydGV4U2hhZGVyKClcIlxuXHRcdFx0XHRcdFx0XHRbZnJhZ21lbnRTaGFkZXJdPVwiZnJhZ21lbnRTaGFkZXIoKVwiXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvbmctY29udGVudD5cblx0XHRcdFx0PC9uZ3QtbWVzaD5cblx0XHRcdH1cblx0XHQ8L25ndC1ncm91cD5cblxuXHRcdDxuZy1jb250ZW50IC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNIVE1MIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRIdG1sT3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRIdG1sT3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydvY2NsdWRlJywgJ2Nhc3RTaGFkb3cnLCAncmVjZWl2ZVNoYWRvdycsICd0cmFuc2Zvcm0nXSk7XG5cblx0Z3JvdXBSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXHRvY2NsdXNpb25NZXNoUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8TWVzaD4+KCdvY2NsdXNpb25NZXNoJyk7XG5cdG9jY2x1c2lvbkdlb21ldHJ5UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8UGxhbmVHZW9tZXRyeT4+KCdvY2NsdXNpb25HZW9tZXRyeScpO1xuXG5cdG9jY2x1ZGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ29jY2x1ZGUnKTtcblx0dHJhbnNmb3JtID0gcGljayh0aGlzLm9wdGlvbnMsICd0cmFuc2Zvcm0nKTtcblx0Y2FzdFNoYWRvdyA9IHBpY2sodGhpcy5vcHRpb25zLCAnY2FzdFNoYWRvdycpO1xuXHRyZWNlaXZlU2hhZG93ID0gcGljayh0aGlzLm9wdGlvbnMsICdyZWNlaXZlU2hhZG93Jyk7XG5cdHNjYWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdzY2FsZScpO1xuXG5cdGlzUmF5Y2FzdE9jY2x1c2lvbiA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBvY2NsdWRlID0gdGhpcy5vY2NsdWRlKCk7XG5cdFx0cmV0dXJuIChvY2NsdWRlICYmIG9jY2x1ZGUgIT09ICdibGVuZGluZycpIHx8IChBcnJheS5pc0FycmF5KG9jY2x1ZGUpICYmIG9jY2x1ZGUubGVuZ3RoICYmIGlzLnJlZihvY2NsdWRlWzBdKSk7XG5cdH0pO1xuXG5cdHByaXZhdGUgc2hhZGVycyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybSgpO1xuXHRcdGNvbnN0IHZlcnRleFNoYWRlciA9ICF0cmFuc2Zvcm1cblx0XHRcdD8gLyogbGFuZ3VhZ2U9Z2xzbCBnbHNsICovIGBcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgVGhpcyBzaGFkZXIgaXMgZnJvbSB0aGUgVEhSRUUncyBTcHJpdGVNYXRlcmlhbC5cbiAgICAgICAgICAgIFdlIG5lZWQgdG8gdHVybiB0aGUgYmFja2luZyBwbGFuZSBpbnRvIGEgU3ByaXRlXG4gICAgICAgICAgICAobWFrZSBpdCBhbHdheXMgZmFjZSB0aGUgY2FtZXJhKSBpZiBcInRyYW5zZnJvbVwiXG4gICAgICAgICAgICBpcyBmYWxzZS5cbiAgICAgICAgICAqL1xuICAgICAgICAgICNpbmNsdWRlIDxjb21tb24+XG5cbiAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICB2ZWMyIGNlbnRlciA9IHZlYzIoMC4sIDEuKTtcbiAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uID0gMC4wO1xuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgd2VsbFxuICAgICAgICAgICAgLy8gTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkZXJpdmUgdGhpcyBkeW5hbWljYWxseSBpZiBpdCBldmVuIG1hdHRlcnNcbiAgICAgICAgICAgIGZsb2F0IHNpemUgPSAwLjAzO1xuXG4gICAgICAgICAgICB2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcbiAgICAgICAgICAgIHZlYzIgc2NhbGU7XG4gICAgICAgICAgICBzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTtcbiAgICAgICAgICAgIHNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXG4gICAgICAgICAgICBib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG4gICAgICAgICAgICBpZiAoIGlzUGVyc3BlY3RpdmUgKSBzY2FsZSAqPSAtIG12UG9zaXRpb24uejtcblxuICAgICAgICAgICAgdmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZSAqIHNpemU7XG4gICAgICAgICAgICB2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcbiAgICAgICAgICAgIHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcbiAgICAgICAgICAgIHJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcbiAgICAgICAgICAgIG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgIGBcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZnJhZ21lbnRTaGFkZXIgPSAvKiBsYW5ndWFnZT1nbHNsIGdsc2wgKi8gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICB9XG4gICAgYDtcblxuXHRcdHJldHVybiB7IHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIgfTtcblx0fSk7XG5cblx0dmVydGV4U2hhZGVyID0gcGljayh0aGlzLnNoYWRlcnMsICd2ZXJ0ZXhTaGFkZXInKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSBwaWNrKHRoaXMuc2hhZGVycywgJ2ZyYWdtZW50U2hhZGVyJyk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAsIE1lc2gsIFBsYW5lR2VvbWV0cnksIFNoYWRlck1hdGVyaWFsIH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlYWRvbmx5IERvdWJsZVNpZGUgPSBEb3VibGVTaWRlO1xufVxuIl19
@@ -0,0 +1,74 @@
1
+ import { OrthographicCamera, PerspectiveCamera, Vector2, Vector3 } from 'three';
2
+ const v1 = new Vector3();
3
+ const v2 = new Vector3();
4
+ const v3 = new Vector3();
5
+ const v4 = new Vector2();
6
+ export function defaultCalculatePosition(el, camera, size) {
7
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
8
+ objectPos.project(camera);
9
+ const widthHalf = size.width / 2;
10
+ const heightHalf = size.height / 2;
11
+ return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
12
+ }
13
+ export function isObjectBehindCamera(el, camera) {
14
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
15
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
16
+ const deltaCamObj = objectPos.sub(cameraPos);
17
+ const camDir = camera.getWorldDirection(v3);
18
+ return deltaCamObj.angleTo(camDir) > Math.PI / 2;
19
+ }
20
+ export function isObjectVisible(el, camera, raycaster, occlude) {
21
+ const elPos = v1.setFromMatrixPosition(el.matrixWorld);
22
+ const screenPos = elPos.clone();
23
+ screenPos.project(camera);
24
+ v4.set(screenPos.x, screenPos.y);
25
+ raycaster.setFromCamera(v4, camera);
26
+ const intersects = raycaster.intersectObjects(occlude, true);
27
+ if (intersects.length) {
28
+ const intersectionDistance = intersects[0].distance;
29
+ const pointDistance = elPos.distanceTo(raycaster.ray.origin);
30
+ return pointDistance < intersectionDistance;
31
+ }
32
+ return true;
33
+ }
34
+ export function objectScale(el, camera) {
35
+ if (camera instanceof OrthographicCamera)
36
+ return camera.zoom;
37
+ if (camera instanceof PerspectiveCamera) {
38
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
39
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
40
+ const vFOV = (camera.fov * Math.PI) / 180;
41
+ const dist = objectPos.distanceTo(cameraPos);
42
+ const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
43
+ return 1 / scaleFOV;
44
+ }
45
+ return 1;
46
+ }
47
+ export function objectZIndex(el, camera, zIndexRange) {
48
+ if (camera instanceof PerspectiveCamera || camera instanceof OrthographicCamera) {
49
+ const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
50
+ const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
51
+ const dist = objectPos.distanceTo(cameraPos);
52
+ const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
53
+ const B = zIndexRange[1] - A * camera.far;
54
+ return Math.round(A * dist + B);
55
+ }
56
+ return undefined;
57
+ }
58
+ export function epsilon(value) {
59
+ return Math.abs(value) < 1e-10 ? 0 : value;
60
+ }
61
+ export function getCSSMatrix(matrix, multipliers, prepend = '') {
62
+ let matrix3d = 'matrix3d(';
63
+ for (let i = 0; i !== 16; i++) {
64
+ matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
65
+ }
66
+ return prepend + matrix3d;
67
+ }
68
+ export const getCameraCSSMatrix = ((multipliers) => {
69
+ return (matrix) => getCSSMatrix(matrix, multipliers);
70
+ })([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
71
+ export const getObjectCSSMatrix = ((scaleMultipliers) => {
72
+ return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
73
+ })((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWlzYy9zcmMvbGliL2h0bWwvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE2QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBYSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRXRILE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFFekIsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEVBQVksRUFBRSxNQUFjLEVBQUUsSUFBdUM7SUFDN0csTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUlELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxFQUFZLEVBQUUsTUFBYztJQUNoRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxH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WUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsZ0JBQXlDLEVBQUUsRUFBRTtJQUNoRixPQUFPLENBQUMsTUFBZSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3BILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVyYSwgTWF0cml4NCwgT2JqZWN0M0QsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgUGVyc3BlY3RpdmVDYW1lcmEsIFJheWNhc3RlciwgVmVjdG9yMiwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuY29uc3QgdjEgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjMgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjQgPSBuZXcgVmVjdG9yMigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uKGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEsIHNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSkge1xuXHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRvYmplY3RQb3MucHJvamVjdChjYW1lcmEpO1xuXHRjb25zdCB3aWR0aEhhbGYgPSBzaXplLndpZHRoIC8gMjtcblx0Y29uc3QgaGVpZ2h0SGFsZiA9IHNpemUuaGVpZ2h0IC8gMjtcblx0cmV0dXJuIFtvYmplY3RQb3MueCAqIHdpZHRoSGFsZiArIHdpZHRoSGFsZiwgLShvYmplY3RQb3MueSAqIGhlaWdodEhhbGYpICsgaGVpZ2h0SGFsZl07XG59XG5cbmV4cG9ydCB0eXBlIENhbGN1bGF0ZVBvc2l0aW9uID0gdHlwZW9mIGRlZmF1bHRDYWxjdWxhdGVQb3NpdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0QmVoaW5kQ2FtZXJhKGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEpIHtcblx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IGRlbHRhQ2FtT2JqID0gb2JqZWN0UG9zLnN1YihjYW1lcmFQb3MpO1xuXHRjb25zdCBjYW1EaXIgPSBjYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odjMpO1xuXHRyZXR1cm4gZGVsdGFDYW1PYmouYW5nbGVUbyhjYW1EaXIpID4gTWF0aC5QSSAvIDI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFZpc2libGUoZWw6IE9iamVjdDNELCBjYW1lcmE6IENhbWVyYSwgcmF5Y2FzdGVyOiBSYXljYXN0ZXIsIG9jY2x1ZGU6IE9iamVjdDNEW10pIHtcblx0Y29uc3QgZWxQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRjb25zdCBzY3JlZW5Qb3MgPSBlbFBvcy5jbG9uZSgpO1xuXHRzY3JlZW5Qb3MucHJvamVjdChjYW1lcmEpO1xuXHR2NC5zZXQoc2NyZWVuUG9zLngsIHNjcmVlblBvcy55KTtcblx0cmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodjQsIGNhbWVyYSk7XG5cdGNvbnN0IGludGVyc2VjdHMgPSByYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvY2NsdWRlLCB0cnVlKTtcblx0aWYgKGludGVyc2VjdHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRGlzdGFuY2UgPSBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlO1xuXHRcdGNvbnN0IHBvaW50RGlzdGFuY2UgPSBlbFBvcy5kaXN0YW5jZVRvKHJheWNhc3Rlci5yYXkub3JpZ2luKTtcblx0XHRyZXR1cm4gcG9pbnREaXN0YW5jZSA8IGludGVyc2VjdGlvbkRpc3RhbmNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0U2NhbGUoZWw6IE9iamVjdDNELCBjYW1lcmE6IENhbWVyYSkge1xuXHRpZiAoY2FtZXJhIGluc3RhbmNlb2YgT3J0aG9ncmFwaGljQ2FtZXJhKSByZXR1cm4gY2FtZXJhLnpvb207XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgdkZPViA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3Qgc2NhbGVGT1YgPSAyICogTWF0aC50YW4odkZPViAvIDIpICogZGlzdDtcblx0XHRyZXR1cm4gMSAvIHNjYWxlRk9WO1xuXHR9XG5cdHJldHVybiAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0WkluZGV4KGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEsIHpJbmRleFJhbmdlOiBBcnJheTxudW1iZXI+KSB7XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSB8fCBjYW1lcmEgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcblx0XHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGRpc3QgPSBvYmplY3RQb3MuZGlzdGFuY2VUbyhjYW1lcmFQb3MpO1xuXHRcdGNvbnN0IEEgPSAoekluZGV4UmFuZ2VbMV0gLSB6SW5kZXhSYW5nZVswXSkgLyAoY2FtZXJhLmZhciAtIGNhbWVyYS5uZWFyKTtcblx0XHRjb25zdCBCID0gekluZGV4UmFuZ2VbMV0gLSBBICogY2FtZXJhLmZhcjtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZChBICogZGlzdCArIEIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcblx0cmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IDFlLTEwID8gMCA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTTWF0cml4KG1hdHJpeDogTWF0cml4NCwgbXVsdGlwbGllcnM6IG51bWJlcltdLCBwcmVwZW5kID0gJycpIHtcblx0bGV0IG1hdHJpeDNkID0gJ21hdHJpeDNkKCc7XG5cdGZvciAobGV0IGkgPSAwOyBpICE9PSAxNjsgaSsrKSB7XG5cdFx0bWF0cml4M2QgKz0gZXBzaWxvbihtdWx0aXBsaWVyc1tpXSAqIG1hdHJpeC5lbGVtZW50c1tpXSkgKyAoaSAhPT0gMTUgPyAnLCcgOiAnKScpO1xuXHR9XG5cdHJldHVybiBwcmVwZW5kICsgbWF0cml4M2Q7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDYW1lcmFDU1NNYXRyaXggPSAoKG11bHRpcGxpZXJzOiBudW1iZXJbXSkgPT4ge1xuXHRyZXR1cm4gKG1hdHJpeDogTWF0cml4NCkgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgbXVsdGlwbGllcnMpO1xufSkoWzEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRPYmplY3RDU1NNYXRyaXggPSAoKHNjYWxlTXVsdGlwbGllcnM6IChuOiBudW1iZXIpID0+IG51bWJlcltdKSA9PiB7XG5cdHJldHVybiAobWF0cml4OiBNYXRyaXg0LCBmYWN0b3I6IG51bWJlcikgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgc2NhbGVNdWx0aXBsaWVycyhmYWN0b3IpLCAndHJhbnNsYXRlKC01MCUsLTUwJSknKTtcbn0pKChmOiBudW1iZXIpID0+IFsxIC8gZiwgMSAvIGYsIDEgLyBmLCAxLCAtMSAvIGYsIC0xIC8gZiwgLTEgLyBmLCAtMSwgMSAvIGYsIDEgLyBmLCAxIC8gZiwgMSwgMSwgMSwgMSwgMV0pO1xuIl19