@zephyr3d/scene 0.9.26 → 0.10.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 (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"pmrem.js","sources":["../../src/utility/pmrem.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube,\r\n TextureSampler,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport { fetchSampler } from './misc';\r\n\r\n// reference: https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/\r\n\r\ntype DistributionType = 'lambertian' | 'ggx' | 'charlie';\r\n\r\nlet vertexLayout: Nullable<VertexLayout> = null;\r\nlet renderStates: Nullable<RenderStateSet> = null;\r\nconst programs: Record<\r\n string,\r\n {\r\n program: GPUProgram;\r\n bindgroup: BindGroup;\r\n }\r\n> = {};\r\n\r\nconst faceDirections = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)],\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)],\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)]\r\n];\r\n\r\nfunction init() {\r\n const device = getDevice();\r\n const vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, -1]);\r\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\r\n vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', vertices)!\r\n }\r\n ],\r\n indexBuffer: device.createIndexBuffer(indices)\r\n });\r\n renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n}\r\n\r\nfunction getProgramInfo(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const hash = `${type}:${numSamples}`;\r\n let ret = programs[hash];\r\n if (!ret) {\r\n const program = createPMREMProgram(type, numSamples);\r\n const bindgroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n programs[hash] = ret = { program, bindgroup };\r\n }\r\n return ret;\r\n}\r\n\r\nfunction createPMREMProgram(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const pb = device;\r\n return pb.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.up = pb.vec3().uniform(0);\r\n this.right = pb.vec3().uniform(0);\r\n this.front = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.direction = pb.mul(\r\n pb.mat3(this.up, this.right, this.front),\r\n pb.vec3(this.$inputs.pos, 1)\r\n );\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.alphaG = pb.float().uniform(0);\r\n }\r\n this.vFilteringInfo = pb.vec3().uniform(0);\r\n this.hdrScale = pb.float().uniform(0);\r\n this.inputTexture = pb.texCube().uniform(0);\r\n this.NUM_SAMPLES_FLOAT = pb.float(numSamples);\r\n this.NUM_SAMPLES_FLOAT_INVERSED = pb.float(1 / numSamples);\r\n this.K = pb.float(4);\r\n this.$outputs.outcolor = pb.vec4();\r\n if (device.type === 'webgl') {\r\n pb.func('radicalInverse_VdC', [pb.int('bits')], function () {\r\n this.$l.rand = pb.float(0);\r\n this.$l.denom = pb.float(1);\r\n this.$l.invBase = pb.float(0.5);\r\n this.$l.n = this.bits;\r\n this.$for(pb.int('i'), 0, 32, function () {\r\n this.denom = pb.mul(this.denom, 2);\r\n this.rand = pb.add(this.rand, pb.div(pb.mod(pb.float(this.n), 2), this.denom));\r\n this.n = pb.div(this.n, 2);\r\n this.$if(pb.equal(this.n, 0), function () {\r\n this.$break();\r\n });\r\n });\r\n this.$return(this.rand);\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(this.i)));\r\n });\r\n } else {\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n }\r\n pb.func('log4', [pb.float('x')], function () {\r\n this.$return(pb.mul(pb.log2(this.x), 0.5));\r\n });\r\n if (type === 'lambertian') {\r\n pb.func('hemisphereCosSample', [pb.vec2('u')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.sub(1, this.u.y);\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('irradiance', [pb.vec3('direction'), pb.vec3('vFilteringInfo')], function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.colorScale = this.vFilteringInfo.z;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n this.$l.Ls = pb.normalize(this.hemisphereCosSample(this.Xi));\r\n this.$l.Ns = pb.vec3(0, 0, 1);\r\n this.$l.NoL = pb.dot(this.Ns, this.Ls);\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.pdf_inversed = pb.div(Math.PI, this.NoL);\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)), this.log4(this.K));\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.Ls),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, this.c);\r\n });\r\n });\r\n this.result = pb.mul(this.result, this.NUM_SAMPLES_FLOAT_INVERSED, this.colorScale);\r\n this.$return(this.result);\r\n });\r\n }\r\n if (type === 'ggx' || type === 'charlie') {\r\n pb.func('hemisphereImportanceSampleDggx', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.div(\r\n pb.sub(1, this.u.y),\r\n pb.add(pb.mul(pb.add(this.a, 1), pb.sub(this.a, 1), this.u.y), 1)\r\n );\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('hemisphereImportanceSampleCharlie', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.sinTheta = pb.pow(this.u.y, pb.div(this.a, pb.add(pb.mul(2, this.a), 1)));\r\n this.$l.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'normalDistributionFunction_TrowbridgeReitzGGX',\r\n [pb.float('NoH'), pb.float('alphaG')],\r\n function () {\r\n this.$l.a2 = pb.mul(this.alphaG, this.alphaG);\r\n this.$l.d = pb.add(pb.mul(this.NoH, this.NoH, pb.sub(this.a2, 1)), 1);\r\n this.$return(pb.div(this.a2, pb.mul(this.d, this.d, Math.PI)));\r\n }\r\n );\r\n pb.func('normalDistributionFunction_Charlie', [pb.float('NoH'), pb.float('roughness')], function () {\r\n this.$l.invR = pb.div(1, pb.max(this.roughness, 0.000001));\r\n this.$l.cos2h = pb.mul(this.NoH, this.NoH);\r\n this.$l.sin2h = pb.max(pb.sub(1, this.cos2h), 0.0078125);\r\n this.$return(\r\n pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), 2 * Math.PI)\r\n );\r\n });\r\n pb.func(\r\n 'radiance',\r\n [pb.float('alphaG'), pb.vec3('direction'), pb.vec3('vFilteringInfo')],\r\n function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$if(pb.equal(this.alphaG, 0), function () {\r\n this.$l.c = pb.textureSampleLevel(this.inputTexture, this.n, 0).rgb;\r\n this.$return(this.c);\r\n }).$else(function () {\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$l.weight = pb.float(0);\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n if (type === 'ggx') {\r\n this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);\r\n } else {\r\n this.$l.H = this.hemisphereImportanceSampleCharlie(this.Xi, this.alphaG);\r\n }\r\n this.$l.NoV = pb.float(1);\r\n this.$l.NoH = this.H.z;\r\n this.$l.NoH2 = pb.mul(this.H.z, this.H.z);\r\n this.$l.NoL = pb.sub(pb.mul(this.NoH2, 2), 1);\r\n this.$l.L = pb.normalize(\r\n pb.vec3(pb.mul(this.NoH, this.H.x, 2), pb.mul(this.NoH, this.H.y, 2), this.NoL)\r\n );\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n if (type === 'ggx') {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG)\r\n );\r\n } else {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_Charlie(this.NoH, this.alphaG)\r\n );\r\n }\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(\r\n pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)),\r\n this.log4(this.K)\r\n );\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.weight = pb.add(this.weight, this.NoL);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.L),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, pb.mul(this.c, this.NoL));\r\n });\r\n });\r\n this.result = pb.div(this.result, this.weight);\r\n this.$return(this.result);\r\n });\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.$l.color = this.radiance(this.alphaG, this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n if (type === 'lambertian') {\r\n this.$l.color = this.irradiance(this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n this.$outputs.outcolor = pb.vec4(pb.mul(this.color, this.hdrScale), 1);\r\n });\r\n }\r\n })!;\r\n}\r\nfunction doPrefilterCubemap(\r\n type: DistributionType,\r\n roughness: number,\r\n miplevel: number,\r\n srcTexture: TextureCube,\r\n sampler: TextureSampler,\r\n dstFramebuffer: FrameBuffer,\r\n filteringInfo: Vector3,\r\n numSamples: number\r\n) {\r\n const device = getDevice();\r\n const framebuffer = dstFramebuffer;\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel);\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n const { program, bindgroup } = getProgramInfo(type, numSamples);\r\n bindgroup.setValue('vFilteringInfo', filteringInfo);\r\n bindgroup.setValue('hdrScale', 1);\r\n bindgroup.setTexture('inputTexture', srcTexture);\r\n if (type === 'ggx' || type === 'charlie') {\r\n bindgroup.setValue('alphaG', roughness);\r\n }\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindgroup);\r\n device.setFramebuffer(framebuffer);\r\n for (let i = 0; i < 6; i++) {\r\n framebuffer.setColorAttachmentCubeFace(0, i);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(renderStates);\r\n bindgroup.setValue('up', faceDirections[i][0]);\r\n bindgroup.setValue('right', faceDirections[i][1]);\r\n bindgroup.setValue('front', faceDirections[i][2]);\r\n device.draw('triangle-list', 0, 6);\r\n }\r\n}\r\n\r\n/**\r\n * Prefilters an environment cubemap\r\n *\r\n * @param tex - The environment cubemap\r\n * @param type - The prefilter type\r\n * @param destTex - The output cubemap\r\n *\r\n * @public\r\n */\r\nexport function prefilterCubemap(\r\n tex: TextureCube,\r\n type: DistributionType,\r\n destTexture: TextureCube | FrameBuffer,\r\n numSamples?: number,\r\n radianceSource?: boolean\r\n) {\r\n if (!tex || !tex.isTextureCube()) {\r\n console.error('prefilterCubemap(): source texture must be cube texture');\r\n return;\r\n }\r\n const device = getDevice();\r\n if (!vertexLayout) {\r\n init();\r\n }\r\n device.pushDeviceStates();\r\n radianceSource = radianceSource ?? true;\r\n const rs = device.getRenderStates();\r\n const srcTex = tex;\r\n const width = tex.width;\r\n const mipmapsCount = tex.mipLevelCount;\r\n const filteringInfo = new Vector3(width, mipmapsCount, radianceSource ? 1 : Math.PI);\r\n const fb = destTexture.isFramebuffer() ? destTexture : device.createFrameBuffer([destTexture], null);\r\n const attachMiplevel = fb.getColorAttachmentMipLevel(0);\r\n const generateMipmap = fb.getColorAttachmentGenerateMipmaps(0);\r\n const destTex = fb.getColorAttachments()[0];\r\n const mips = type === 'ggx' || type === 'charlie' ? destTex.mipLevelCount : 1;\r\n for (let i = 0; i < mips; i++) {\r\n const alpha = i === 0 ? 0 : Math.pow(2, i) / width;\r\n doPrefilterCubemap(\r\n type,\r\n alpha,\r\n i,\r\n srcTex,\r\n fetchSampler(type === 'ggx' || type === 'charlie' ? 'clamp_nearest_nomip' : 'clamp_linear')!,\r\n fb,\r\n filteringInfo,\r\n numSamples ?? 64\r\n );\r\n }\r\n device.popDeviceStates();\r\n device.setRenderStates(rs);\r\n fb.setColorAttachmentMipLevel(0, attachMiplevel);\r\n fb.setColorAttachmentGenerateMipmaps(0, generateMipmap);\r\n if (!destTexture.isFramebuffer()) {\r\n fb.dispose();\r\n }\r\n}\r\n"],"names":["vertexLayout","renderStates","programs","faceDirections","Vector3","init","device","getDevice","vertices","Float32Array","indices","Uint16Array","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","indexBuffer","createIndexBuffer","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getProgramInfo","type","numSamples","hash","ret","program","createPMREMProgram","bindgroup","createBindGroup","bindGroupLayouts","pb","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","up","vec3","uniform","right","front","main","$builtins","position","vec4","$outputs","direction","mul","mat3","y","neg","fragment","alphaG","float","vFilteringInfo","hdrScale","inputTexture","texCube","NUM_SAMPLES_FLOAT","NUM_SAMPLES_FLOAT_INVERSED","K","outcolor","func","int","$l","rand","denom","invBase","n","bits","$for","add","div","mod","$if","equal","$break","$return","i","N","radicalInverse_VdC","uint","compOr","sal","sar","compAnd","log2","x","phi","u","Math","PI","cosTheta2","sub","cosTheta","sqrt","sinTheta","cos","sin","normalize","result","tangent","lessThan","abs","z","$else","cross","bitangent","tbn","maxLevel","dim0","colorScale","omegaP","Xi","hammersley2d","Ls","hemisphereCosSample","Ns","NoL","dot","greaterThan","pdf_inversed","omegaS","l","log4","mipLevel","clamp","c","textureSampleLevel","rgb","a","pow","a2","d","NoH","invR","max","roughness","cos2h","sin2h","weight","H","hemisphereImportanceSampleDggx","hemisphereImportanceSampleCharlie","NoV","NoH2","L","normalDistributionFunction_TrowbridgeReitzGGX","normalDistributionFunction_Charlie","color","radiance","irradiance","doPrefilterCubemap","miplevel","srcTexture","sampler","dstFramebuffer","filteringInfo","framebuffer","setColorAttachmentMipLevel","setColorAttachmentGenerateMipmaps","setValue","setTexture","setProgram","setBindGroup","setFramebuffer","setColorAttachmentCubeFace","setVertexLayout","setRenderStates","draw","prefilterCubemap","tex","destTexture","radianceSource","isTextureCube","console","error","pushDeviceStates","rs","getRenderStates","srcTex","width","mipmapsCount","mipLevelCount","fb","isFramebuffer","createFrameBuffer","attachMiplevel","getColorAttachmentMipLevel","generateMipmap","getColorAttachmentGenerateMipmaps","destTex","getColorAttachments","mips","alpha","fetchSampler","popDeviceStates","dispose"],"mappings":"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"}
1
+ {"version":3,"file":"pmrem.js","sources":["../../src/utility/pmrem.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type {\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube,\r\n TextureSampler,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\nimport { fetchSampler } from './misc';\r\n\r\n// reference: https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/\r\n\r\ntype DistributionType = 'lambertian' | 'ggx' | 'charlie';\r\n\r\nlet vertexLayout: Nullable<VertexLayout> = null;\r\nlet renderStates: Nullable<RenderStateSet> = null;\r\nconst programs: Record<\r\n string,\r\n {\r\n program: GPUProgram;\r\n bindgroup: BindGroup;\r\n }\r\n> = {};\r\n\r\nconst faceDirections = [\r\n [new Vector3(0, 0, -1), new Vector3(0, -1, 0), new Vector3(1, 0, 0)],\r\n [new Vector3(0, 0, 1), new Vector3(0, -1, 0), new Vector3(-1, 0, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, 1), new Vector3(0, 1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, 0, -1), new Vector3(0, -1, 0)],\r\n [new Vector3(1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, 1)],\r\n [new Vector3(-1, 0, 0), new Vector3(0, -1, 0), new Vector3(0, 0, -1)]\r\n];\r\n\r\nfunction init() {\r\n const device = getDevice();\r\n const vertices = new Float32Array([1, 1, -1, 1, -1, -1, 1, -1]);\r\n const indices = new Uint16Array([0, 1, 2, 0, 2, 3]);\r\n vertexLayout = device.createVertexLayout({\r\n vertexBuffers: [\r\n {\r\n buffer: device.createVertexBuffer('position_f32x2', vertices)!\r\n }\r\n ],\r\n indexBuffer: device.createIndexBuffer(indices)\r\n });\r\n renderStates = device.createRenderStateSet();\r\n renderStates.useRasterizerState().setCullMode('none');\r\n renderStates.useDepthState().enableTest(false).enableWrite(false);\r\n}\r\n\r\nfunction getProgramInfo(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const hash = `${type}:${numSamples}`;\r\n let ret = programs[hash];\r\n if (!ret) {\r\n const program = createPMREMProgram(type, numSamples);\r\n const bindgroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n programs[hash] = ret = { program, bindgroup };\r\n }\r\n return ret;\r\n}\r\n\r\nfunction createPMREMProgram(type: DistributionType, numSamples: number) {\r\n const device = getDevice();\r\n const pb = device;\r\n return pb.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.up = pb.vec3().uniform(0);\r\n this.right = pb.vec3().uniform(0);\r\n this.front = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.direction = pb.mul(\r\n pb.mat3(this.up, this.right, this.front),\r\n pb.vec3(this.$inputs.pos, 1)\r\n );\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.alphaG = pb.float().uniform(0);\r\n }\r\n this.vFilteringInfo = pb.vec3().uniform(0);\r\n this.hdrScale = pb.float().uniform(0);\r\n this.inputTexture = pb.texCube().uniform(0);\r\n this.NUM_SAMPLES_FLOAT = pb.float(numSamples);\r\n this.NUM_SAMPLES_FLOAT_INVERSED = pb.float(1 / numSamples);\r\n this.K = pb.float(4);\r\n this.$outputs.outcolor = pb.vec4();\r\n pb.func('radicalInverse_VdC', [pb.uint('bits')], function () {\r\n this.$l.n = this.bits;\r\n this.n = pb.compOr(pb.sal(this.n, 16), pb.sar(this.n, 16));\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x55555555), 1),\r\n pb.sar(pb.compAnd(this.n, 0xaaaaaaaa), 1)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x33333333), 2),\r\n pb.sar(pb.compAnd(this.n, 0xcccccccc), 2)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x0f0f0f0f), 4),\r\n pb.sar(pb.compAnd(this.n, 0xf0f0f0f0), 4)\r\n );\r\n this.n = pb.compOr(\r\n pb.sal(pb.compAnd(this.n, 0x00ff00ff), 8),\r\n pb.sar(pb.compAnd(this.n, 0xff00ff00), 8)\r\n );\r\n this.$return(pb.mul(pb.float(this.n), 2.3283064365386963e-10));\r\n });\r\n pb.func('hammersley2d', [pb.int('i'), pb.int('N')], function () {\r\n this.$return(\r\n pb.vec2(pb.div(pb.float(this.i), pb.float(this.N)), this.radicalInverse_VdC(pb.uint(this.i)))\r\n );\r\n });\r\n pb.func('log4', [pb.float('x')], function () {\r\n this.$return(pb.mul(pb.log2(this.x), 0.5));\r\n });\r\n if (type === 'lambertian') {\r\n pb.func('hemisphereCosSample', [pb.vec2('u')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.sub(1, this.u.y);\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(this.sinTheta, pb.cos(this.phi)),\r\n pb.mul(this.sinTheta, pb.sin(this.phi)),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('irradiance', [pb.vec3('direction'), pb.vec3('vFilteringInfo')], function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.colorScale = this.vFilteringInfo.z;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n this.$l.Ls = pb.normalize(this.hemisphereCosSample(this.Xi));\r\n this.$l.Ns = pb.vec3(0, 0, 1);\r\n this.$l.NoL = pb.dot(this.Ns, this.Ls);\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n this.$l.pdf_inversed = pb.div(Math.PI, this.NoL);\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)), this.log4(this.K));\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.Ls),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, this.c);\r\n });\r\n });\r\n this.result = pb.mul(this.result, this.NUM_SAMPLES_FLOAT_INVERSED, this.colorScale);\r\n this.$return(this.result);\r\n });\r\n }\r\n if (type === 'ggx' || type === 'charlie') {\r\n pb.func('hemisphereImportanceSampleDggx', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.cosTheta2 = pb.div(\r\n pb.sub(1, this.u.y),\r\n pb.add(pb.mul(pb.add(this.a, 1), pb.sub(this.a, 1), this.u.y), 1)\r\n );\r\n this.$l.cosTheta = pb.sqrt(this.cosTheta2);\r\n this.$l.sinTheta = pb.sqrt(pb.sub(1, this.cosTheta2));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func('hemisphereImportanceSampleCharlie', [pb.vec2('u'), pb.float('a')], function () {\r\n this.$l.phi = pb.mul(this.u.x, 2 * Math.PI);\r\n this.$l.sinTheta = pb.pow(this.u.y, pb.div(this.a, pb.add(pb.mul(2, this.a), 1)));\r\n this.$l.cosTheta = pb.sqrt(pb.sub(1, pb.mul(this.sinTheta, this.sinTheta)));\r\n this.$return(\r\n pb.vec3(\r\n pb.mul(pb.cos(this.phi), this.sinTheta),\r\n pb.mul(pb.sin(this.phi), this.sinTheta),\r\n this.cosTheta\r\n )\r\n );\r\n });\r\n pb.func(\r\n 'normalDistributionFunction_TrowbridgeReitzGGX',\r\n [pb.float('NoH'), pb.float('alphaG')],\r\n function () {\r\n this.$l.a2 = pb.mul(this.alphaG, this.alphaG);\r\n this.$l.d = pb.add(pb.mul(this.NoH, this.NoH, pb.sub(this.a2, 1)), 1);\r\n this.$return(pb.div(this.a2, pb.mul(this.d, this.d, Math.PI)));\r\n }\r\n );\r\n pb.func('normalDistributionFunction_Charlie', [pb.float('NoH'), pb.float('roughness')], function () {\r\n this.$l.invR = pb.div(1, pb.max(this.roughness, 0.000001));\r\n this.$l.cos2h = pb.mul(this.NoH, this.NoH);\r\n this.$l.sin2h = pb.max(pb.sub(1, this.cos2h), 0.0078125);\r\n this.$return(\r\n pb.div(pb.mul(pb.add(this.invR, 2), pb.pow(this.sin2h, pb.mul(this.invR, 0.5))), 2 * Math.PI)\r\n );\r\n });\r\n pb.func(\r\n 'radiance',\r\n [pb.float('alphaG'), pb.vec3('direction'), pb.vec3('vFilteringInfo')],\r\n function () {\r\n this.$l.n = pb.normalize(this.direction);\r\n this.$if(pb.equal(this.alphaG, 0), function () {\r\n this.$l.c = pb.textureSampleLevel(this.inputTexture, this.n, 0).rgb;\r\n this.$return(this.c);\r\n }).$else(function () {\r\n this.$l.result = pb.vec3(0);\r\n this.$l.tangent = pb.vec3();\r\n this.$if(pb.lessThan(pb.abs(this.n.z), 0.999), function () {\r\n this.tangent = pb.vec3(0, 0, 1);\r\n }).$else(function () {\r\n this.tangent = pb.vec3(1, 0, 0);\r\n });\r\n this.tangent = pb.normalize(pb.cross(this.tangent, this.n));\r\n this.$l.bitangent = pb.cross(this.n, this.tangent);\r\n this.$l.tbn = pb.mat3(this.tangent, this.bitangent, this.n);\r\n this.$l.maxLevel = this.vFilteringInfo.y;\r\n this.$l.dim0 = this.vFilteringInfo.x;\r\n this.$l.omegaP = pb.div(4 * Math.PI, pb.mul(this.dim0, this.dim0, 6));\r\n this.$l.weight = pb.float(0);\r\n this.$for(pb.int('i'), 0, numSamples, function () {\r\n this.$l.Xi = this.hammersley2d(this.i, numSamples);\r\n if (type === 'ggx') {\r\n this.$l.H = this.hemisphereImportanceSampleDggx(this.Xi, this.alphaG);\r\n } else {\r\n this.$l.H = this.hemisphereImportanceSampleCharlie(this.Xi, this.alphaG);\r\n }\r\n this.$l.NoV = pb.float(1);\r\n this.$l.NoH = this.H.z;\r\n this.$l.NoH2 = pb.mul(this.H.z, this.H.z);\r\n this.$l.NoL = pb.sub(pb.mul(this.NoH2, 2), 1);\r\n this.$l.L = pb.normalize(\r\n pb.vec3(pb.mul(this.NoH, this.H.x, 2), pb.mul(this.NoH, this.H.y, 2), this.NoL)\r\n );\r\n this.$if(pb.greaterThan(this.NoL, 0), function () {\r\n if (type === 'ggx') {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_TrowbridgeReitzGGX(this.NoH, this.alphaG)\r\n );\r\n } else {\r\n this.$l.pdf_inversed = pb.div(\r\n 4,\r\n this.normalDistributionFunction_Charlie(this.NoH, this.alphaG)\r\n );\r\n }\r\n this.$l.omegaS = pb.mul(this.pdf_inversed, this.NUM_SAMPLES_FLOAT_INVERSED);\r\n this.$l.l = pb.add(\r\n pb.sub(this.log4(this.omegaS), this.log4(this.omegaP)),\r\n this.log4(this.K)\r\n );\r\n this.$l.mipLevel = pb.clamp(this.l, 0, this.maxLevel);\r\n this.weight = pb.add(this.weight, this.NoL);\r\n this.$l.c = pb.textureSampleLevel(\r\n this.inputTexture,\r\n pb.mul(this.tbn, this.L),\r\n this.mipLevel\r\n ).rgb;\r\n this.result = pb.add(this.result, pb.mul(this.c, this.NoL));\r\n });\r\n });\r\n this.result = pb.div(this.result, this.weight);\r\n this.$return(this.result);\r\n });\r\n }\r\n );\r\n }\r\n pb.main(function () {\r\n if (type === 'ggx' || type === 'charlie') {\r\n this.$l.color = this.radiance(this.alphaG, this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n if (type === 'lambertian') {\r\n this.$l.color = this.irradiance(this.$inputs.direction, this.vFilteringInfo);\r\n }\r\n this.$outputs.outcolor = pb.vec4(pb.mul(this.color, this.hdrScale), 1);\r\n });\r\n }\r\n })!;\r\n}\r\nfunction doPrefilterCubemap(\r\n type: DistributionType,\r\n roughness: number,\r\n miplevel: number,\r\n srcTexture: TextureCube,\r\n sampler: TextureSampler,\r\n dstFramebuffer: FrameBuffer,\r\n filteringInfo: Vector3,\r\n numSamples: number\r\n) {\r\n const device = getDevice();\r\n const framebuffer = dstFramebuffer;\r\n framebuffer.setColorAttachmentMipLevel(0, miplevel);\r\n framebuffer.setColorAttachmentGenerateMipmaps(0, false);\r\n const { program, bindgroup } = getProgramInfo(type, numSamples);\r\n bindgroup.setValue('vFilteringInfo', filteringInfo);\r\n bindgroup.setValue('hdrScale', 1);\r\n bindgroup.setTexture('inputTexture', srcTexture);\r\n if (type === 'ggx' || type === 'charlie') {\r\n bindgroup.setValue('alphaG', roughness);\r\n }\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindgroup);\r\n device.setFramebuffer(framebuffer);\r\n for (let i = 0; i < 6; i++) {\r\n framebuffer.setColorAttachmentCubeFace(0, i);\r\n device.setVertexLayout(vertexLayout);\r\n device.setRenderStates(renderStates);\r\n bindgroup.setValue('up', faceDirections[i][0]);\r\n bindgroup.setValue('right', faceDirections[i][1]);\r\n bindgroup.setValue('front', faceDirections[i][2]);\r\n device.draw('triangle-list', 0, 6);\r\n }\r\n}\r\n\r\n/**\r\n * Prefilters an environment cubemap\r\n *\r\n * @param tex - The environment cubemap\r\n * @param type - The prefilter type\r\n * @param destTex - The output cubemap\r\n *\r\n * @public\r\n */\r\nexport function prefilterCubemap(\r\n tex: TextureCube,\r\n type: DistributionType,\r\n destTexture: TextureCube | FrameBuffer,\r\n numSamples?: number,\r\n radianceSource?: boolean\r\n) {\r\n if (!tex || !tex.isTextureCube()) {\r\n console.error('prefilterCubemap(): source texture must be cube texture');\r\n return;\r\n }\r\n const device = getDevice();\r\n if (!vertexLayout) {\r\n init();\r\n }\r\n device.pushDeviceStates();\r\n radianceSource = radianceSource ?? true;\r\n const rs = device.getRenderStates();\r\n const srcTex = tex;\r\n const width = tex.width;\r\n const mipmapsCount = tex.mipLevelCount;\r\n const filteringInfo = new Vector3(width, mipmapsCount, radianceSource ? 1 : Math.PI);\r\n const fb = destTexture.isFramebuffer() ? destTexture : device.createFrameBuffer([destTexture], null);\r\n const attachMiplevel = fb.getColorAttachmentMipLevel(0);\r\n const generateMipmap = fb.getColorAttachmentGenerateMipmaps(0);\r\n const destTex = fb.getColorAttachments()[0];\r\n const mips = type === 'ggx' || type === 'charlie' ? destTex.mipLevelCount : 1;\r\n for (let i = 0; i < mips; i++) {\r\n const alpha = i === 0 ? 0 : Math.pow(2, i) / width;\r\n doPrefilterCubemap(\r\n type,\r\n alpha,\r\n i,\r\n srcTex,\r\n fetchSampler(type === 'ggx' || type === 'charlie' ? 'clamp_nearest_nomip' : 'clamp_linear')!,\r\n fb,\r\n filteringInfo,\r\n numSamples ?? 64\r\n );\r\n }\r\n device.popDeviceStates();\r\n device.setRenderStates(rs);\r\n fb.setColorAttachmentMipLevel(0, attachMiplevel);\r\n fb.setColorAttachmentGenerateMipmaps(0, generateMipmap);\r\n if (!destTexture.isFramebuffer()) {\r\n fb.dispose();\r\n }\r\n}\r\n"],"names":["vertexLayout","renderStates","programs","faceDirections","Vector3","init","device","getDevice","vertices","Float32Array","indices","Uint16Array","createVertexLayout","vertexBuffers","buffer","createVertexBuffer","indexBuffer","createIndexBuffer","createRenderStateSet","useRasterizerState","setCullMode","useDepthState","enableTest","enableWrite","getProgramInfo","type","numSamples","hash","ret","program","createPMREMProgram","bindgroup","createBindGroup","bindGroupLayouts","pb","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","up","vec3","uniform","right","front","main","$builtins","position","vec4","$outputs","direction","mul","mat3","y","neg","fragment","alphaG","float","vFilteringInfo","hdrScale","inputTexture","texCube","NUM_SAMPLES_FLOAT","NUM_SAMPLES_FLOAT_INVERSED","K","outcolor","func","uint","$l","n","bits","compOr","sal","sar","compAnd","$return","int","div","i","N","radicalInverse_VdC","log2","x","phi","u","Math","PI","cosTheta2","sub","cosTheta","sqrt","sinTheta","cos","sin","normalize","result","tangent","$if","lessThan","abs","z","$else","cross","bitangent","tbn","maxLevel","dim0","colorScale","omegaP","$for","Xi","hammersley2d","Ls","hemisphereCosSample","Ns","NoL","dot","greaterThan","pdf_inversed","omegaS","l","add","log4","mipLevel","clamp","c","textureSampleLevel","rgb","a","pow","a2","d","NoH","invR","max","roughness","cos2h","sin2h","equal","weight","H","hemisphereImportanceSampleDggx","hemisphereImportanceSampleCharlie","NoV","NoH2","L","normalDistributionFunction_TrowbridgeReitzGGX","normalDistributionFunction_Charlie","color","radiance","irradiance","doPrefilterCubemap","miplevel","srcTexture","sampler","dstFramebuffer","filteringInfo","framebuffer","setColorAttachmentMipLevel","setColorAttachmentGenerateMipmaps","setValue","setTexture","setProgram","setBindGroup","setFramebuffer","setColorAttachmentCubeFace","setVertexLayout","setRenderStates","draw","prefilterCubemap","tex","destTexture","radianceSource","isTextureCube","console","error","pushDeviceStates","rs","getRenderStates","srcTex","width","mipmapsCount","mipLevelCount","fb","isFramebuffer","createFrameBuffer","attachMiplevel","getColorAttachmentMipLevel","generateMipmap","getColorAttachmentGenerateMipmaps","destTex","getColorAttachments","mips","alpha","fetchSampler","popDeviceStates","dispose"],"mappings":";;;;AAkBA,IAAIA,YAAuC,GAAA,IAAA;AAC3C,IAAIC,YAAyC,GAAA,IAAA;AAC7C,MAAMC,WAMF,EAAC;AAEL,MAAMC,cAAiB,GAAA;AACrB,IAAA;QAAC,IAAIC,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,EAAC,EAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AAClE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA;AAAG,KAAA;AACpE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,GAAG,CAAG,EAAA,CAAA;AAAG,KAAA;AACnE,IAAA;QAAC,IAAIA,OAAAA,CAAQ,EAAC,EAAG,CAAG,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,EAAI,EAAA,CAAA,CAAA;QAAI,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,EAAC;AAAG;AACtE,CAAA;AAED,SAASC,IAAAA,GAAAA;AACP,IAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;IACf,MAAMC,QAAAA,GAAW,IAAIC,YAAa,CAAA;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;QAAG,EAAC;AAAG,QAAA,CAAA;QAAG,EAAC;QAAG,EAAC;AAAG,QAAA,CAAA;QAAG;AAAG,KAAA,CAAA;IAC9D,MAAMC,OAAAA,GAAU,IAAIC,WAAY,CAAA;AAAC,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA,CAAA;AAAG,QAAA;AAAE,KAAA,CAAA;IAClDX,YAAeM,GAAAA,MAAAA,CAAOM,kBAAkB,CAAC;QACvCC,aAAe,EAAA;AACb,YAAA;gBACEC,MAAQR,EAAAA,MAAAA,CAAOS,kBAAkB,CAAC,gBAAkBP,EAAAA,QAAAA;AACtD;AACD,SAAA;QACDQ,WAAaV,EAAAA,MAAAA,CAAOW,iBAAiB,CAACP,OAAAA;AACxC,KAAA,CAAA;AACAT,IAAAA,YAAAA,GAAeK,OAAOY,oBAAoB,EAAA;IAC1CjB,YAAakB,CAAAA,kBAAkB,EAAGC,CAAAA,WAAW,CAAC,MAAA,CAAA;AAC9CnB,IAAAA,YAAAA,CAAaoB,aAAa,EAAGC,CAAAA,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AAC7D;AAEA,SAASC,cAAAA,CAAeC,IAAsB,EAAEC,UAAkB,EAAA;AAChE,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAMoB,IAAO,GAAA,CAAA,EAAGF,IAAK,CAAA,CAAC,EAAEC,UAAY,CAAA,CAAA;IACpC,IAAIE,GAAAA,GAAM1B,QAAQ,CAACyB,IAAK,CAAA;AACxB,IAAA,IAAI,CAACC,GAAK,EAAA;QACR,MAAMC,OAAAA,GAAUC,mBAAmBL,IAAMC,EAAAA,UAAAA,CAAAA;AACzC,QAAA,MAAMK,YAAYzB,MAAO0B,CAAAA,eAAe,CAACH,OAAQI,CAAAA,gBAAgB,CAAC,CAAE,CAAA,CAAA;QACpE/B,QAAQ,CAACyB,IAAK,CAAA,GAAGC,GAAM,GAAA;AAAEC,YAAAA,OAAAA;AAASE,YAAAA;AAAU,SAAA;AAC9C;IACA,OAAOH,GAAAA;AACT;AAEA,SAASE,kBAAAA,CAAmBL,IAAsB,EAAEC,UAAkB,EAAA;AACpE,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAM2B,EAAK5B,GAAAA,MAAAA;IACX,OAAO4B,EAAAA,CAAGC,kBAAkB,CAAC;AAC3BC,QAAAA,MAAAA,CAAAA,CAAOF,EAAE,EAAA;YACP,IAAI,CAACG,OAAO,CAACC,GAAG,GAAGJ,EAAGK,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AACpC,YAAA,IAAI,CAACC,EAAE,GAAGP,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC5B,YAAA,IAAI,CAACC,KAAK,GAAGV,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC/B,YAAA,IAAI,CAACE,KAAK,GAAGX,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AAC/BT,YAAAA,EAAAA,CAAGY,IAAI,CAAC,WAAA;AACN,gBAAA,IAAI,CAACC,SAAS,CAACC,QAAQ,GAAGd,EAAGe,CAAAA,IAAI,CAAC,IAAI,CAACZ,OAAO,CAACC,GAAG,EAAE,CAAG,EAAA,CAAA,CAAA;AACvD,gBAAA,IAAI,CAACY,QAAQ,CAACC,SAAS,GAAGjB,EAAAA,CAAGkB,GAAG,CAC9BlB,EAAGmB,CAAAA,IAAI,CAAC,IAAI,CAACZ,EAAE,EAAE,IAAI,CAACG,KAAK,EAAE,IAAI,CAACC,KAAK,CACvCX,EAAAA,EAAAA,CAAGQ,IAAI,CAAC,IAAI,CAACL,OAAO,CAACC,GAAG,EAAE,CAAA,CAAA,CAAA;gBAE5B,IAAIhC,MAAAA,CAAOmB,IAAI,KAAK,QAAU,EAAA;AAC5B,oBAAA,IAAI,CAACsB,SAAS,CAACC,QAAQ,CAACM,CAAC,GAAGpB,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACR,SAAS,CAACC,QAAQ,CAACM,CAAC,CAAA;AAC9D;AACF,aAAA,CAAA;AACF,SAAA;AACAE,QAAAA,QAAAA,CAAAA,CAAStB,EAAE,EAAA;YACT,IAAIT,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;AACxC,gBAAA,IAAI,CAACgC,MAAM,GAAGvB,GAAGwB,KAAK,EAAA,CAAGf,OAAO,CAAC,CAAA,CAAA;AACnC;AACA,YAAA,IAAI,CAACgB,cAAc,GAAGzB,GAAGQ,IAAI,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACxC,YAAA,IAAI,CAACiB,QAAQ,GAAG1B,GAAGwB,KAAK,EAAA,CAAGf,OAAO,CAAC,CAAA,CAAA;AACnC,YAAA,IAAI,CAACkB,YAAY,GAAG3B,GAAG4B,OAAO,EAAA,CAAGnB,OAAO,CAAC,CAAA,CAAA;AACzC,YAAA,IAAI,CAACoB,iBAAiB,GAAG7B,EAAAA,CAAGwB,KAAK,CAAChC,UAAAA,CAAAA;AAClC,YAAA,IAAI,CAACsC,0BAA0B,GAAG9B,EAAGwB,CAAAA,KAAK,CAAC,CAAIhC,GAAAA,UAAAA,CAAAA;AAC/C,YAAA,IAAI,CAACuC,CAAC,GAAG/B,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;AAClB,YAAA,IAAI,CAACR,QAAQ,CAACgB,QAAQ,GAAGhC,GAAGe,IAAI,EAAA;YAChCf,EAAGiC,CAAAA,IAAI,CAAC,oBAAsB,EAAA;AAACjC,gBAAAA,EAAAA,CAAGkC,IAAI,CAAC,MAAA;aAAQ,EAAE,WAAA;AAC/C,gBAAA,IAAI,CAACC,EAAE,CAACC,CAAC,GAAG,IAAI,CAACC,IAAI;gBACrB,IAAI,CAACD,CAAC,GAAGpC,EAAAA,CAAGsC,MAAM,CAACtC,EAAAA,CAAGuC,GAAG,CAAC,IAAI,CAACH,CAAC,EAAE,KAAKpC,EAAGwC,CAAAA,GAAG,CAAC,IAAI,CAACJ,CAAC,EAAE,EAAA,CAAA,CAAA;AACtD,gBAAA,IAAI,CAACA,CAAC,GAAGpC,EAAAA,CAAGsC,MAAM,CAChBtC,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCpC,EAAGwC,CAAAA,GAAG,CAACxC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,gBAAA,IAAI,CAACA,CAAC,GAAGpC,EAAAA,CAAGsC,MAAM,CAChBtC,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCpC,EAAGwC,CAAAA,GAAG,CAACxC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,gBAAA,IAAI,CAACA,CAAC,GAAGpC,EAAAA,CAAGsC,MAAM,CAChBtC,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCpC,EAAGwC,CAAAA,GAAG,CAACxC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,gBAAA,IAAI,CAACA,CAAC,GAAGpC,EAAAA,CAAGsC,MAAM,CAChBtC,EAAGuC,CAAAA,GAAG,CAACvC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,EACvCpC,EAAGwC,CAAAA,GAAG,CAACxC,EAAAA,CAAGyC,OAAO,CAAC,IAAI,CAACL,CAAC,EAAE,UAAa,CAAA,EAAA,CAAA,CAAA,CAAA;AAEzC,gBAAA,IAAI,CAACM,OAAO,CAAC1C,EAAAA,CAAGkB,GAAG,CAAClB,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACY,CAAC,CAAG,EAAA,sBAAA,CAAA,CAAA;AACxC,aAAA,CAAA;YACApC,EAAGiC,CAAAA,IAAI,CAAC,cAAgB,EAAA;AAACjC,gBAAAA,EAAAA,CAAG2C,GAAG,CAAC,GAAA,CAAA;AAAM3C,gBAAAA,EAAAA,CAAG2C,GAAG,CAAC,GAAA;aAAK,EAAE,WAAA;AAClD,gBAAA,IAAI,CAACD,OAAO,CACV1C,EAAAA,CAAGK,IAAI,CAACL,EAAAA,CAAG4C,GAAG,CAAC5C,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACqB,CAAC,CAAA,EAAG7C,EAAGwB,CAAAA,KAAK,CAAC,IAAI,CAACsB,CAAC,IAAI,IAAI,CAACC,kBAAkB,CAAC/C,EAAGkC,CAAAA,IAAI,CAAC,IAAI,CAACW,CAAC,CAAA,CAAA,CAAA,CAAA;AAE9F,aAAA,CAAA;YACA7C,EAAGiC,CAAAA,IAAI,CAAC,MAAQ,EAAA;AAACjC,gBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;aAAK,EAAE,WAAA;AAC/B,gBAAA,IAAI,CAACkB,OAAO,CAAC1C,EAAAA,CAAGkB,GAAG,CAAClB,EAAGgD,CAAAA,IAAI,CAAC,IAAI,CAACC,CAAC,CAAG,EAAA,GAAA,CAAA,CAAA;AACvC,aAAA,CAAA;AACA,YAAA,IAAI1D,SAAS,YAAc,EAAA;gBACzBS,EAAGiC,CAAAA,IAAI,CAAC,qBAAuB,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC7C,oBAAA,IAAI,CAAC8B,EAAE,CAACe,GAAG,GAAGlD,GAAGkB,GAAG,CAAC,IAAI,CAACiC,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;AAC1C,oBAAA,IAAI,CAAClB,EAAE,CAACmB,SAAS,GAAGtD,EAAAA,CAAGuD,GAAG,CAAC,CAAG,EAAA,IAAI,CAACJ,CAAC,CAAC/B,CAAC,CAAA;oBACtC,IAAI,CAACe,EAAE,CAACqB,QAAQ,GAAGxD,GAAGyD,IAAI,CAAC,IAAI,CAACH,SAAS,CAAA;AACzC,oBAAA,IAAI,CAACnB,EAAE,CAACuB,QAAQ,GAAG1D,EAAGyD,CAAAA,IAAI,CAACzD,EAAAA,CAAGuD,GAAG,CAAC,CAAG,EAAA,IAAI,CAACD,SAAS,CAAA,CAAA;AACnD,oBAAA,IAAI,CAACZ,OAAO,CACV1C,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACwC,QAAQ,EAAE1D,EAAG2D,CAAAA,GAAG,CAAC,IAAI,CAACT,GAAG,CAAA,CAAA,EACrClD,GAAGkB,GAAG,CAAC,IAAI,CAACwC,QAAQ,EAAE1D,EAAAA,CAAG4D,GAAG,CAAC,IAAI,CAACV,GAAG,CACrC,CAAA,EAAA,IAAI,CAACM,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAxD,EAAGiC,CAAAA,IAAI,CAAC,YAAc,EAAA;AAACjC,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,WAAA,CAAA;AAAcR,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,gBAAA;iBAAkB,EAAE,WAAA;oBACvE,IAAI,CAAC2B,EAAE,CAACC,CAAC,GAAGpC,GAAG6D,SAAS,CAAC,IAAI,CAAC5C,SAAS,CAAA;AACvC,oBAAA,IAAI,CAACkB,EAAE,CAAC2B,MAAM,GAAG9D,EAAAA,CAAGQ,IAAI,CAAC,CAAA,CAAA;AACzB,oBAAA,IAAI,CAAC2B,EAAE,CAAC4B,OAAO,GAAG/D,GAAGQ,IAAI,EAAA;AACzB,oBAAA,IAAI,CAACwD,GAAG,CAAChE,EAAAA,CAAGiE,QAAQ,CAACjE,EAAAA,CAAGkE,GAAG,CAAC,IAAI,CAAC9B,CAAC,CAAC+B,CAAC,GAAG,KAAQ,CAAA,EAAA,WAAA;AAC7C,wBAAA,IAAI,CAACJ,OAAO,GAAG/D,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,qBAAA,CAAA,CAAG4D,KAAK,CAAC,WAAA;AACP,wBAAA,IAAI,CAACL,OAAO,GAAG/D,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,qBAAA,CAAA;AACA,oBAAA,IAAI,CAACuD,OAAO,GAAG/D,EAAAA,CAAG6D,SAAS,CAAC7D,EAAAA,CAAGqE,KAAK,CAAC,IAAI,CAACN,OAAO,EAAE,IAAI,CAAC3B,CAAC,CAAA,CAAA;AACzD,oBAAA,IAAI,CAACD,EAAE,CAACmC,SAAS,GAAGtE,EAAGqE,CAAAA,KAAK,CAAC,IAAI,CAACjC,CAAC,EAAE,IAAI,CAAC2B,OAAO,CAAA;AACjD,oBAAA,IAAI,CAAC5B,EAAE,CAACoC,GAAG,GAAGvE,EAAAA,CAAGmB,IAAI,CAAC,IAAI,CAAC4C,OAAO,EAAE,IAAI,CAACO,SAAS,EAAE,IAAI,CAAClC,CAAC,CAAA;oBAC1D,IAAI,CAACD,EAAE,CAACqC,QAAQ,GAAG,IAAI,CAAC/C,cAAc,CAACL,CAAC;oBACxC,IAAI,CAACe,EAAE,CAACsC,IAAI,GAAG,IAAI,CAAChD,cAAc,CAACwB,CAAC;oBACpC,IAAI,CAACd,EAAE,CAACuC,UAAU,GAAG,IAAI,CAACjD,cAAc,CAAC0C,CAAC;oBAC1C,IAAI,CAAChC,EAAE,CAACwC,MAAM,GAAG3E,EAAG4C,CAAAA,GAAG,CAAC,CAAA,GAAIQ,IAAKC,CAAAA,EAAE,EAAErD,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACuD,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,CAAA,CAAA,CAAA;oBAClE,IAAI,CAACG,IAAI,CAAC5E,EAAAA,CAAG2C,GAAG,CAAC,GAAA,CAAA,EAAM,GAAGnD,UAAY,EAAA,WAAA;AACpC,wBAAA,IAAI,CAAC2C,EAAE,CAAC0C,EAAE,GAAG,IAAI,CAACC,YAAY,CAAC,IAAI,CAACjC,CAAC,EAAErD,UAAAA,CAAAA;AACvC,wBAAA,IAAI,CAAC2C,EAAE,CAAC4C,EAAE,GAAG/E,EAAG6D,CAAAA,SAAS,CAAC,IAAI,CAACmB,mBAAmB,CAAC,IAAI,CAACH,EAAE,CAAA,CAAA;wBAC1D,IAAI,CAAC1C,EAAE,CAAC8C,EAAE,GAAGjF,EAAGQ,CAAAA,IAAI,CAAC,CAAA,EAAG,CAAG,EAAA,CAAA,CAAA;AAC3B,wBAAA,IAAI,CAAC2B,EAAE,CAAC+C,GAAG,GAAGlF,EAAGmF,CAAAA,GAAG,CAAC,IAAI,CAACF,EAAE,EAAE,IAAI,CAACF,EAAE,CAAA;wBACrC,IAAI,CAACf,GAAG,CAAChE,EAAGoF,CAAAA,WAAW,CAAC,IAAI,CAACF,GAAG,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,4BAAA,IAAI,CAAC/C,EAAE,CAACkD,YAAY,GAAGrF,EAAAA,CAAG4C,GAAG,CAACQ,IAAKC,CAAAA,EAAE,EAAE,IAAI,CAAC6B,GAAG,CAAA;AAC/C,4BAAA,IAAI,CAAC/C,EAAE,CAACmD,MAAM,GAAGtF,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACmE,YAAY,EAAE,IAAI,CAACvD,0BAA0B,CAAA;AAC1E,4BAAA,IAAI,CAACK,EAAE,CAACoD,CAAC,GAAGvF,EAAGwF,CAAAA,GAAG,CAACxF,EAAAA,CAAGuD,GAAG,CAAC,IAAI,CAACkC,IAAI,CAAC,IAAI,CAACH,MAAM,CAAG,EAAA,IAAI,CAACG,IAAI,CAAC,IAAI,CAACd,MAAM,CAAA,CAAA,EAAI,IAAI,CAACc,IAAI,CAAC,IAAI,CAAC1D,CAAC,CAAA,CAAA;AAC3F,4BAAA,IAAI,CAACI,EAAE,CAACuD,QAAQ,GAAG1F,EAAG2F,CAAAA,KAAK,CAAC,IAAI,CAACJ,CAAC,EAAE,CAAG,EAAA,IAAI,CAACf,QAAQ,CAAA;4BACpD,IAAI,CAACrC,EAAE,CAACyD,CAAC,GAAG5F,EAAG6F,CAAAA,kBAAkB,CAC/B,IAAI,CAAClE,YAAY,EACjB3B,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACqD,GAAG,EAAE,IAAI,CAACQ,EAAE,CAAA,EACxB,IAAI,CAACW,QAAQ,CAAA,CACbI,GAAG;AACL,4BAAA,IAAI,CAAChC,MAAM,GAAG9D,EAAAA,CAAGwF,GAAG,CAAC,IAAI,CAAC1B,MAAM,EAAE,IAAI,CAAC8B,CAAC,CAAA;AAC1C,yBAAA,CAAA;AACF,qBAAA,CAAA;AACA,oBAAA,IAAI,CAAC9B,MAAM,GAAG9D,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC4C,MAAM,EAAE,IAAI,CAAChC,0BAA0B,EAAE,IAAI,CAAC4C,UAAU,CAAA;AAClF,oBAAA,IAAI,CAAChC,OAAO,CAAC,IAAI,CAACoB,MAAM,CAAA;AAC1B,iBAAA,CAAA;AACF;YACA,IAAIvE,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;gBACxCS,EAAGiC,CAAAA,IAAI,CAAC,gCAAkC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA,CAAA;AAAML,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;AACvE,oBAAA,IAAI,CAACW,EAAE,CAACe,GAAG,GAAGlD,GAAGkB,GAAG,CAAC,IAAI,CAACiC,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;oBAC1C,IAAI,CAAClB,EAAE,CAACmB,SAAS,GAAGtD,EAAG4C,CAAAA,GAAG,CACxB5C,EAAGuD,CAAAA,GAAG,CAAC,CAAG,EAAA,IAAI,CAACJ,CAAC,CAAC/B,CAAC,CAClBpB,EAAAA,EAAAA,CAAGwF,GAAG,CAACxF,EAAAA,CAAGkB,GAAG,CAAClB,EAAAA,CAAGwF,GAAG,CAAC,IAAI,CAACO,CAAC,EAAE,IAAI/F,EAAGuD,CAAAA,GAAG,CAAC,IAAI,CAACwC,CAAC,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC5C,CAAC,CAAC/B,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA;oBAEjE,IAAI,CAACe,EAAE,CAACqB,QAAQ,GAAGxD,GAAGyD,IAAI,CAAC,IAAI,CAACH,SAAS,CAAA;AACzC,oBAAA,IAAI,CAACnB,EAAE,CAACuB,QAAQ,GAAG1D,EAAGyD,CAAAA,IAAI,CAACzD,EAAAA,CAAGuD,GAAG,CAAC,CAAG,EAAA,IAAI,CAACD,SAAS,CAAA,CAAA;AACnD,oBAAA,IAAI,CAACZ,OAAO,CACV1C,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAClB,EAAAA,CAAG2D,GAAG,CAAC,IAAI,CAACT,GAAG,GAAG,IAAI,CAACQ,QAAQ,CAAA,EACtC1D,GAAGkB,GAAG,CAAClB,EAAG4D,CAAAA,GAAG,CAAC,IAAI,CAACV,GAAG,CAAA,EAAG,IAAI,CAACQ,QAAQ,CACtC,EAAA,IAAI,CAACF,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAxD,EAAGiC,CAAAA,IAAI,CAAC,mCAAqC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGK,IAAI,CAAC,GAAA,CAAA;AAAML,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC1E,oBAAA,IAAI,CAACW,EAAE,CAACe,GAAG,GAAGlD,GAAGkB,GAAG,CAAC,IAAI,CAACiC,CAAC,CAACF,CAAC,EAAE,CAAA,GAAIG,KAAKC,EAAE,CAAA;AAC1C,oBAAA,IAAI,CAAClB,EAAE,CAACuB,QAAQ,GAAG1D,EAAAA,CAAGgG,GAAG,CAAC,IAAI,CAAC7C,CAAC,CAAC/B,CAAC,EAAEpB,EAAAA,CAAG4C,GAAG,CAAC,IAAI,CAACmD,CAAC,EAAE/F,GAAGwF,GAAG,CAACxF,EAAGkB,CAAAA,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC6E,CAAC,CAAG,EAAA,CAAA,CAAA,CAAA,CAAA;oBAC7E,IAAI,CAAC5D,EAAE,CAACqB,QAAQ,GAAGxD,EAAGyD,CAAAA,IAAI,CAACzD,EAAGuD,CAAAA,GAAG,CAAC,CAAGvD,EAAAA,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACwC,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAAA,CAAA,CAAA;AACxE,oBAAA,IAAI,CAAChB,OAAO,CACV1C,EAAGQ,CAAAA,IAAI,CACLR,EAAGkB,CAAAA,GAAG,CAAClB,EAAAA,CAAG2D,GAAG,CAAC,IAAI,CAACT,GAAG,GAAG,IAAI,CAACQ,QAAQ,CAAA,EACtC1D,GAAGkB,GAAG,CAAClB,EAAG4D,CAAAA,GAAG,CAAC,IAAI,CAACV,GAAG,CAAA,EAAG,IAAI,CAACQ,QAAQ,CACtC,EAAA,IAAI,CAACF,QAAQ,CAAA,CAAA;AAGnB,iBAAA,CAAA;gBACAxD,EAAGiC,CAAAA,IAAI,CACL,+CACA,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,QAAA;iBAAU,EACrC,WAAA;AACE,oBAAA,IAAI,CAACW,EAAE,CAAC8D,EAAE,GAAGjG,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACK,MAAM,EAAE,IAAI,CAACA,MAAM,CAAA;oBAC5C,IAAI,CAACY,EAAE,CAAC+D,CAAC,GAAGlG,EAAGwF,CAAAA,GAAG,CAACxF,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACiF,GAAG,EAAE,IAAI,CAACA,GAAG,EAAEnG,EAAAA,CAAGuD,GAAG,CAAC,IAAI,CAAC0C,EAAE,EAAE,CAAK,CAAA,CAAA,EAAA,CAAA,CAAA;oBACnE,IAAI,CAACvD,OAAO,CAAC1C,EAAAA,CAAG4C,GAAG,CAAC,IAAI,CAACqD,EAAE,EAAEjG,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACgF,CAAC,EAAE,IAAI,CAACA,CAAC,EAAE9C,IAAAA,CAAKC,EAAE,CAAA,CAAA,CAAA;AAC7D,iBAAA,CAAA;gBAEFrD,EAAGiC,CAAAA,IAAI,CAAC,oCAAsC,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,KAAA,CAAA;AAAQxB,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,WAAA;iBAAa,EAAE,WAAA;AACtF,oBAAA,IAAI,CAACW,EAAE,CAACiE,IAAI,GAAGpG,EAAG4C,CAAAA,GAAG,CAAC,CAAA,EAAG5C,GAAGqG,GAAG,CAAC,IAAI,CAACC,SAAS,EAAE,QAAA,CAAA,CAAA;AAChD,oBAAA,IAAI,CAACnE,EAAE,CAACoE,KAAK,GAAGvG,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACiF,GAAG,EAAE,IAAI,CAACA,GAAG,CAAA;AACzC,oBAAA,IAAI,CAAChE,EAAE,CAACqE,KAAK,GAAGxG,EAAGqG,CAAAA,GAAG,CAACrG,EAAAA,CAAGuD,GAAG,CAAC,CAAA,EAAG,IAAI,CAACgD,KAAK,CAAG,EAAA,SAAA,CAAA;AAC9C,oBAAA,IAAI,CAAC7D,OAAO,CACV1C,EAAAA,CAAG4C,GAAG,CAAC5C,EAAAA,CAAGkB,GAAG,CAAClB,GAAGwF,GAAG,CAAC,IAAI,CAACY,IAAI,EAAE,CAAA,CAAA,EAAIpG,EAAGgG,CAAAA,GAAG,CAAC,IAAI,CAACQ,KAAK,EAAExG,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACkF,IAAI,EAAE,GAAQ,CAAA,CAAA,CAAA,EAAA,CAAA,GAAIhD,KAAKC,EAAE,CAAA,CAAA;AAEhG,iBAAA,CAAA;gBACArD,EAAGiC,CAAAA,IAAI,CACL,UACA,EAAA;AAACjC,oBAAAA,EAAAA,CAAGwB,KAAK,CAAC,QAAA,CAAA;AAAWxB,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,WAAA,CAAA;AAAcR,oBAAAA,EAAAA,CAAGQ,IAAI,CAAC,gBAAA;iBAAkB,EACrE,WAAA;oBACE,IAAI,CAAC2B,EAAE,CAACC,CAAC,GAAGpC,GAAG6D,SAAS,CAAC,IAAI,CAAC5C,SAAS,CAAA;oBACvC,IAAI,CAAC+C,GAAG,CAAChE,EAAGyG,CAAAA,KAAK,CAAC,IAAI,CAAClF,MAAM,EAAE,CAAI,CAAA,EAAA,WAAA;AACjC,wBAAA,IAAI,CAACY,EAAE,CAACyD,CAAC,GAAG5F,GAAG6F,kBAAkB,CAAC,IAAI,CAAClE,YAAY,EAAE,IAAI,CAACS,CAAC,EAAE,GAAG0D,GAAG;AACnE,wBAAA,IAAI,CAACpD,OAAO,CAAC,IAAI,CAACkD,CAAC,CAAA;AACrB,qBAAA,CAAA,CAAGxB,KAAK,CAAC,WAAA;AACP,wBAAA,IAAI,CAACjC,EAAE,CAAC2B,MAAM,GAAG9D,EAAAA,CAAGQ,IAAI,CAAC,CAAA,CAAA;AACzB,wBAAA,IAAI,CAAC2B,EAAE,CAAC4B,OAAO,GAAG/D,GAAGQ,IAAI,EAAA;AACzB,wBAAA,IAAI,CAACwD,GAAG,CAAChE,EAAAA,CAAGiE,QAAQ,CAACjE,EAAAA,CAAGkE,GAAG,CAAC,IAAI,CAAC9B,CAAC,CAAC+B,CAAC,GAAG,KAAQ,CAAA,EAAA,WAAA;AAC7C,4BAAA,IAAI,CAACJ,OAAO,GAAG/D,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,yBAAA,CAAA,CAAG4D,KAAK,CAAC,WAAA;AACP,4BAAA,IAAI,CAACL,OAAO,GAAG/D,GAAGQ,IAAI,CAAC,GAAG,CAAG,EAAA,CAAA,CAAA;AAC/B,yBAAA,CAAA;AACA,wBAAA,IAAI,CAACuD,OAAO,GAAG/D,EAAAA,CAAG6D,SAAS,CAAC7D,EAAAA,CAAGqE,KAAK,CAAC,IAAI,CAACN,OAAO,EAAE,IAAI,CAAC3B,CAAC,CAAA,CAAA;AACzD,wBAAA,IAAI,CAACD,EAAE,CAACmC,SAAS,GAAGtE,EAAGqE,CAAAA,KAAK,CAAC,IAAI,CAACjC,CAAC,EAAE,IAAI,CAAC2B,OAAO,CAAA;AACjD,wBAAA,IAAI,CAAC5B,EAAE,CAACoC,GAAG,GAAGvE,EAAAA,CAAGmB,IAAI,CAAC,IAAI,CAAC4C,OAAO,EAAE,IAAI,CAACO,SAAS,EAAE,IAAI,CAAClC,CAAC,CAAA;wBAC1D,IAAI,CAACD,EAAE,CAACqC,QAAQ,GAAG,IAAI,CAAC/C,cAAc,CAACL,CAAC;wBACxC,IAAI,CAACe,EAAE,CAACsC,IAAI,GAAG,IAAI,CAAChD,cAAc,CAACwB,CAAC;wBACpC,IAAI,CAACd,EAAE,CAACwC,MAAM,GAAG3E,EAAG4C,CAAAA,GAAG,CAAC,CAAA,GAAIQ,IAAKC,CAAAA,EAAE,EAAErD,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACuD,IAAI,EAAE,IAAI,CAACA,IAAI,EAAE,CAAA,CAAA,CAAA;AAClE,wBAAA,IAAI,CAACtC,EAAE,CAACuE,MAAM,GAAG1G,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;wBAC1B,IAAI,CAACoD,IAAI,CAAC5E,EAAAA,CAAG2C,GAAG,CAAC,GAAA,CAAA,EAAM,GAAGnD,UAAY,EAAA,WAAA;AACpC,4BAAA,IAAI,CAAC2C,EAAE,CAAC0C,EAAE,GAAG,IAAI,CAACC,YAAY,CAAC,IAAI,CAACjC,CAAC,EAAErD,UAAAA,CAAAA;AACvC,4BAAA,IAAID,SAAS,KAAO,EAAA;AAClB,gCAAA,IAAI,CAAC4C,EAAE,CAACwE,CAAC,GAAG,IAAI,CAACC,8BAA8B,CAAC,IAAI,CAAC/B,EAAE,EAAE,IAAI,CAACtD,MAAM,CAAA;6BAC/D,MAAA;AACL,gCAAA,IAAI,CAACY,EAAE,CAACwE,CAAC,GAAG,IAAI,CAACE,iCAAiC,CAAC,IAAI,CAAChC,EAAE,EAAE,IAAI,CAACtD,MAAM,CAAA;AACzE;AACA,4BAAA,IAAI,CAACY,EAAE,CAAC2E,GAAG,GAAG9G,EAAAA,CAAGwB,KAAK,CAAC,CAAA,CAAA;4BACvB,IAAI,CAACW,EAAE,CAACgE,GAAG,GAAG,IAAI,CAACQ,CAAC,CAACxC,CAAC;AACtB,4BAAA,IAAI,CAAChC,EAAE,CAAC4E,IAAI,GAAG/G,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACyF,CAAC,CAACxC,CAAC,EAAE,IAAI,CAACwC,CAAC,CAACxC,CAAC,CAAA;AACxC,4BAAA,IAAI,CAAChC,EAAE,CAAC+C,GAAG,GAAGlF,EAAGuD,CAAAA,GAAG,CAACvD,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAAC6F,IAAI,EAAE,CAAI,CAAA,EAAA,CAAA,CAAA;AAC3C,4BAAA,IAAI,CAAC5E,EAAE,CAAC6E,CAAC,GAAGhH,EAAAA,CAAG6D,SAAS,CACtB7D,EAAAA,CAAGQ,IAAI,CAACR,GAAGkB,GAAG,CAAC,IAAI,CAACiF,GAAG,EAAE,IAAI,CAACQ,CAAC,CAAC1D,CAAC,EAAE,CAAA,CAAA,EAAIjD,GAAGkB,GAAG,CAAC,IAAI,CAACiF,GAAG,EAAE,IAAI,CAACQ,CAAC,CAACvF,CAAC,EAAE,CAAI,CAAA,EAAA,IAAI,CAAC8D,GAAG,CAAA,CAAA;4BAEhF,IAAI,CAAClB,GAAG,CAAChE,EAAGoF,CAAAA,WAAW,CAAC,IAAI,CAACF,GAAG,EAAE,CAAI,CAAA,EAAA,WAAA;AACpC,gCAAA,IAAI3F,SAAS,KAAO,EAAA;AAClB,oCAAA,IAAI,CAAC4C,EAAE,CAACkD,YAAY,GAAGrF,EAAAA,CAAG4C,GAAG,CAC3B,CAAA,EACA,IAAI,CAACqE,6CAA6C,CAAC,IAAI,CAACd,GAAG,EAAE,IAAI,CAAC5E,MAAM,CAAA,CAAA;iCAErE,MAAA;AACL,oCAAA,IAAI,CAACY,EAAE,CAACkD,YAAY,GAAGrF,EAAAA,CAAG4C,GAAG,CAC3B,CAAA,EACA,IAAI,CAACsE,kCAAkC,CAAC,IAAI,CAACf,GAAG,EAAE,IAAI,CAAC5E,MAAM,CAAA,CAAA;AAEjE;AACA,gCAAA,IAAI,CAACY,EAAE,CAACmD,MAAM,GAAGtF,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAACmE,YAAY,EAAE,IAAI,CAACvD,0BAA0B,CAAA;AAC1E,gCAAA,IAAI,CAACK,EAAE,CAACoD,CAAC,GAAGvF,EAAGwF,CAAAA,GAAG,CAChBxF,EAAAA,CAAGuD,GAAG,CAAC,IAAI,CAACkC,IAAI,CAAC,IAAI,CAACH,MAAM,CAAG,EAAA,IAAI,CAACG,IAAI,CAAC,IAAI,CAACd,MAAM,CAAA,CAAA,EACpD,IAAI,CAACc,IAAI,CAAC,IAAI,CAAC1D,CAAC,CAAA,CAAA;AAElB,gCAAA,IAAI,CAACI,EAAE,CAACuD,QAAQ,GAAG1F,EAAG2F,CAAAA,KAAK,CAAC,IAAI,CAACJ,CAAC,EAAE,CAAG,EAAA,IAAI,CAACf,QAAQ,CAAA;AACpD,gCAAA,IAAI,CAACkC,MAAM,GAAG1G,EAAAA,CAAGwF,GAAG,CAAC,IAAI,CAACkB,MAAM,EAAE,IAAI,CAACxB,GAAG,CAAA;gCAC1C,IAAI,CAAC/C,EAAE,CAACyD,CAAC,GAAG5F,EAAG6F,CAAAA,kBAAkB,CAC/B,IAAI,CAAClE,YAAY,EACjB3B,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACqD,GAAG,EAAE,IAAI,CAACyC,CAAC,CAAA,EACvB,IAAI,CAACtB,QAAQ,CAAA,CACbI,GAAG;AACL,gCAAA,IAAI,CAAChC,MAAM,GAAG9D,GAAGwF,GAAG,CAAC,IAAI,CAAC1B,MAAM,EAAE9D,EAAGkB,CAAAA,GAAG,CAAC,IAAI,CAAC0E,CAAC,EAAE,IAAI,CAACV,GAAG,CAAA,CAAA;AAC3D,6BAAA,CAAA;AACF,yBAAA,CAAA;AACA,wBAAA,IAAI,CAACpB,MAAM,GAAG9D,EAAAA,CAAG4C,GAAG,CAAC,IAAI,CAACkB,MAAM,EAAE,IAAI,CAAC4C,MAAM,CAAA;AAC7C,wBAAA,IAAI,CAAChE,OAAO,CAAC,IAAI,CAACoB,MAAM,CAAA;AAC1B,qBAAA,CAAA;AACF,iBAAA,CAAA;AAEJ;AACA9D,YAAAA,EAAAA,CAAGY,IAAI,CAAC,WAAA;gBACN,IAAIrB,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;oBACxC,IAAI,CAAC4C,EAAE,CAACgF,KAAK,GAAG,IAAI,CAACC,QAAQ,CAAC,IAAI,CAAC7F,MAAM,EAAE,IAAI,CAACpB,OAAO,CAACc,SAAS,EAAE,IAAI,CAACQ,cAAc,CAAA;AACxF;AACA,gBAAA,IAAIlC,SAAS,YAAc,EAAA;AACzB,oBAAA,IAAI,CAAC4C,EAAE,CAACgF,KAAK,GAAG,IAAI,CAACE,UAAU,CAAC,IAAI,CAAClH,OAAO,CAACc,SAAS,EAAE,IAAI,CAACQ,cAAc,CAAA;AAC7E;AACA,gBAAA,IAAI,CAACT,QAAQ,CAACgB,QAAQ,GAAGhC,EAAAA,CAAGe,IAAI,CAACf,EAAAA,CAAGkB,GAAG,CAAC,IAAI,CAACiG,KAAK,EAAE,IAAI,CAACzF,QAAQ,CAAG,EAAA,CAAA,CAAA;AACtE,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AACF;AACA,SAAS4F,kBACP/H,CAAAA,IAAsB,EACtB+G,SAAiB,EACjBiB,QAAgB,EAChBC,UAAuB,EACvBC,OAAuB,EACvBC,cAA2B,EAC3BC,aAAsB,EACtBnI,UAAkB,EAAA;AAElB,IAAA,MAAMpB,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,MAAMuJ,WAAcF,GAAAA,cAAAA;IACpBE,WAAYC,CAAAA,0BAA0B,CAAC,CAAGN,EAAAA,QAAAA,CAAAA;IAC1CK,WAAYE,CAAAA,iCAAiC,CAAC,CAAG,EAAA,KAAA,CAAA;AACjD,IAAA,MAAM,EAAEnI,OAAO,EAAEE,SAAS,EAAE,GAAGP,eAAeC,IAAMC,EAAAA,UAAAA,CAAAA;IACpDK,SAAUkI,CAAAA,QAAQ,CAAC,gBAAkBJ,EAAAA,aAAAA,CAAAA;IACrC9H,SAAUkI,CAAAA,QAAQ,CAAC,UAAY,EAAA,CAAA,CAAA;IAC/BlI,SAAUmI,CAAAA,UAAU,CAAC,cAAgBR,EAAAA,UAAAA,CAAAA;IACrC,IAAIjI,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAW,EAAA;QACxCM,SAAUkI,CAAAA,QAAQ,CAAC,QAAUzB,EAAAA,SAAAA,CAAAA;AAC/B;AACAlI,IAAAA,MAAAA,CAAO6J,UAAU,CAACtI,OAAAA,CAAAA;IAClBvB,MAAO8J,CAAAA,YAAY,CAAC,CAAGrI,EAAAA,SAAAA,CAAAA;AACvBzB,IAAAA,MAAAA,CAAO+J,cAAc,CAACP,WAAAA,CAAAA;AACtB,IAAA,IAAK,IAAI/E,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAI,GAAGA,CAAK,EAAA,CAAA;QAC1B+E,WAAYQ,CAAAA,0BAA0B,CAAC,CAAGvF,EAAAA,CAAAA,CAAAA;AAC1CzE,QAAAA,MAAAA,CAAOiK,eAAe,CAACvK,YAAAA,CAAAA;AACvBM,QAAAA,MAAAA,CAAOkK,eAAe,CAACvK,YAAAA,CAAAA;AACvB8B,QAAAA,SAAAA,CAAUkI,QAAQ,CAAC,IAAA,EAAM9J,cAAc,CAAC4E,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAC7ChD,QAAAA,SAAAA,CAAUkI,QAAQ,CAAC,OAAA,EAAS9J,cAAc,CAAC4E,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;AAChDhD,QAAAA,SAAAA,CAAUkI,QAAQ,CAAC,OAAA,EAAS9J,cAAc,CAAC4E,CAAAA,CAAE,CAAC,CAAE,CAAA,CAAA;QAChDzE,MAAOmK,CAAAA,IAAI,CAAC,eAAA,EAAiB,CAAG,EAAA,CAAA,CAAA;AAClC;AACF;AAEA;;;;;;;;IASO,SAASC,gBAAAA,CACdC,GAAgB,EAChBlJ,IAAsB,EACtBmJ,WAAsC,EACtClJ,UAAmB,EACnBmJ,cAAwB,EAAA;AAExB,IAAA,IAAI,CAACF,GAAAA,IAAO,CAACA,GAAAA,CAAIG,aAAa,EAAI,EAAA;AAChCC,QAAAA,OAAAA,CAAQC,KAAK,CAAC,yDAAA,CAAA;AACd,QAAA;AACF;AACA,IAAA,MAAM1K,MAASC,GAAAA,SAAAA,EAAAA;AACf,IAAA,IAAI,CAACP,YAAc,EAAA;AACjBK,QAAAA,IAAAA,EAAAA;AACF;AACAC,IAAAA,MAAAA,CAAO2K,gBAAgB,EAAA;AACvBJ,IAAAA,cAAAA,GAAiBA,cAAkB,IAAA,IAAA;IACnC,MAAMK,EAAAA,GAAK5K,OAAO6K,eAAe,EAAA;AACjC,IAAA,MAAMC,MAAST,GAAAA,GAAAA;IACf,MAAMU,KAAAA,GAAQV,IAAIU,KAAK;IACvB,MAAMC,YAAAA,GAAeX,IAAIY,aAAa;IACtC,MAAM1B,aAAAA,GAAgB,IAAIzJ,OAAQiL,CAAAA,KAAAA,EAAOC,cAAcT,cAAiB,GAAA,CAAA,GAAIvF,KAAKC,EAAE,CAAA;AACnF,IAAA,MAAMiG,KAAKZ,WAAYa,CAAAA,aAAa,KAAKb,WAActK,GAAAA,MAAAA,CAAOoL,iBAAiB,CAAC;AAACd,QAAAA;KAAY,EAAE,IAAA,CAAA;IAC/F,MAAMe,cAAAA,GAAiBH,EAAGI,CAAAA,0BAA0B,CAAC,CAAA,CAAA;IACrD,MAAMC,cAAAA,GAAiBL,EAAGM,CAAAA,iCAAiC,CAAC,CAAA,CAAA;AAC5D,IAAA,MAAMC,OAAUP,GAAAA,EAAAA,CAAGQ,mBAAmB,EAAE,CAAC,CAAE,CAAA;AAC3C,IAAA,MAAMC,OAAOxK,IAAS,KAAA,KAAA,IAASA,SAAS,SAAYsK,GAAAA,OAAAA,CAAQR,aAAa,GAAG,CAAA;AAC5E,IAAA,IAAK,IAAIxG,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIkH,MAAMlH,CAAK,EAAA,CAAA;QAC7B,MAAMmH,KAAAA,GAAQnH,MAAM,CAAI,GAAA,CAAA,GAAIO,KAAK4C,GAAG,CAAC,GAAGnD,CAAKsG,CAAAA,GAAAA,KAAAA;AAC7C7B,QAAAA,kBAAAA,CACE/H,IACAyK,EAAAA,KAAAA,EACAnH,CACAqG,EAAAA,MAAAA,EACAe,YAAa1K,CAAAA,IAAAA,KAAS,KAASA,IAAAA,IAAAA,KAAS,SAAY,GAAA,qBAAA,GAAwB,cAC5E+J,CAAAA,EAAAA,EAAAA,EACA3B,eACAnI,UAAc,IAAA,EAAA,CAAA;AAElB;AACApB,IAAAA,MAAAA,CAAO8L,eAAe,EAAA;AACtB9L,IAAAA,MAAAA,CAAOkK,eAAe,CAACU,EAAAA,CAAAA;IACvBM,EAAGzB,CAAAA,0BAA0B,CAAC,CAAG4B,EAAAA,cAAAA,CAAAA;IACjCH,EAAGxB,CAAAA,iCAAiC,CAAC,CAAG6B,EAAAA,cAAAA,CAAAA;IACxC,IAAI,CAACjB,WAAYa,CAAAA,aAAa,EAAI,EAAA;AAChCD,QAAAA,EAAAA,CAAGa,OAAO,EAAA;AACZ;AACF;;;;"}
@@ -0,0 +1,435 @@
1
+ import { TriangleBVH, closestPointOnTriangle } from './bvh.js';
2
+
3
+ /**
4
+ * Voxels per world unit (metre) of a baked field at resolution scale 1, matching UE5's
5
+ * r.DistanceFields.DefaultVoxelDensity (0.2/cm). Scaled by {@link MeshSDFBakeOptions.unitScale}
6
+ * since meshes keep their authored units.
7
+ * @public
8
+ */ const SDF_VOXELS_PER_UNIT = 20;
9
+ /** Voxels from the surface within which the sign is decided by rays; further voxels take it from their neighbours. */ const SIGN_BAND_VOXELS = 1;
10
+ /** Length of a sign ray in voxel diagonals. */ const SIGN_TRACE_DIAGONALS = 4;
11
+ /** Fraction of the sign rays that must hit a back face for a voxel to count as inside. */ const SIGN_BACK_FRACTION = 0.25;
12
+ /** Voxels around a triangle's bounds seeded with its exact distance. */ const SEED_MARGIN = 1;
13
+ /**
14
+ * Unsigned distance per voxel by closest-triangle propagation: voxels near each triangle are
15
+ * seeded with their exact distance, then fast sweeps in the eight diagonal orders pass each
16
+ * voxel's nearest triangle to its neighbours. Rarely off by a small fraction of a voxel.
17
+ */ function computeUnsignedDistances(positions, indices, boxMin, resolution, h) {
18
+ const [nx, ny, nz] = resolution;
19
+ const count = nx * ny * nz;
20
+ const dist = new Float32Array(count).fill(Infinity);
21
+ const tri = new Int32Array(count).fill(-1);
22
+ const numTris = Math.floor(indices.length / 3);
23
+ const tmp = new Float32Array(3);
24
+ const triDist = (t, x, y, z)=>{
25
+ const ia = indices[t * 3] * 3;
26
+ const ib = indices[t * 3 + 1] * 3;
27
+ const ic = indices[t * 3 + 2] * 3;
28
+ closestPointOnTriangle(x, y, z, positions[ia], positions[ia + 1], positions[ia + 2], positions[ib], positions[ib + 1], positions[ib + 2], positions[ic], positions[ic + 1], positions[ic + 2], tmp);
29
+ const dx = tmp[0] - x;
30
+ const dy = tmp[1] - y;
31
+ const dz = tmp[2] - z;
32
+ return dx * dx + dy * dy + dz * dz;
33
+ };
34
+ // Seed: exact squared distance in each triangle's own neighbourhood
35
+ for(let t = 0; t < numTris; t++){
36
+ const lo = [
37
+ Infinity,
38
+ Infinity,
39
+ Infinity
40
+ ];
41
+ const hi = [
42
+ -Infinity,
43
+ -Infinity,
44
+ -Infinity
45
+ ];
46
+ for(let k = 0; k < 3; k++){
47
+ const v = indices[t * 3 + k] * 3;
48
+ for(let c = 0; c < 3; c++){
49
+ lo[c] = Math.min(lo[c], positions[v + c]);
50
+ hi[c] = Math.max(hi[c], positions[v + c]);
51
+ }
52
+ }
53
+ const i0 = Math.max(0, Math.floor((lo[0] - boxMin[0]) / h - 0.5) - SEED_MARGIN + 1);
54
+ const j0 = Math.max(0, Math.floor((lo[1] - boxMin[1]) / h - 0.5) - SEED_MARGIN + 1);
55
+ const k0 = Math.max(0, Math.floor((lo[2] - boxMin[2]) / h - 0.5) - SEED_MARGIN + 1);
56
+ const i1 = Math.min(nx - 1, Math.ceil((hi[0] - boxMin[0]) / h - 0.5) + SEED_MARGIN - 1);
57
+ const j1 = Math.min(ny - 1, Math.ceil((hi[1] - boxMin[1]) / h - 0.5) + SEED_MARGIN - 1);
58
+ const k1 = Math.min(nz - 1, Math.ceil((hi[2] - boxMin[2]) / h - 0.5) + SEED_MARGIN - 1);
59
+ for(let k = k0; k <= k1; k++){
60
+ const z = boxMin[2] + (k + 0.5) * h;
61
+ for(let j = j0; j <= j1; j++){
62
+ const y = boxMin[1] + (j + 0.5) * h;
63
+ let o = (k * ny + j) * nx + i0;
64
+ for(let i = i0; i <= i1; i++, o++){
65
+ const d = triDist(t, boxMin[0] + (i + 0.5) * h, y, z);
66
+ if (d < dist[o]) {
67
+ dist[o] = d;
68
+ tri[o] = t;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ // Sweeps: each voxel tries the nearest triangles of its three predecessors along the order;
75
+ // one round of eight is as accurate as two
76
+ const strides = [
77
+ 1,
78
+ nx,
79
+ nx * ny
80
+ ];
81
+ for(let order = 0; order < 8; order++){
82
+ const sx = order & 1 ? -1 : 1;
83
+ const sy = order & 2 ? -1 : 1;
84
+ const sz = order & 4 ? -1 : 1;
85
+ for(let kk = 0; kk < nz; kk++){
86
+ const k = sz > 0 ? kk : nz - 1 - kk;
87
+ const z = boxMin[2] + (k + 0.5) * h;
88
+ for(let jj = 0; jj < ny; jj++){
89
+ const j = sy > 0 ? jj : ny - 1 - jj;
90
+ const y = boxMin[1] + (j + 0.5) * h;
91
+ for(let ii = 0; ii < nx; ii++){
92
+ const i = sx > 0 ? ii : nx - 1 - ii;
93
+ const o = (k * ny + j) * nx + i;
94
+ const x = boxMin[0] + (i + 0.5) * h;
95
+ const own = tri[o];
96
+ if (ii > 0) {
97
+ const t = tri[o - sx * strides[0]];
98
+ if (t >= 0 && t !== own) {
99
+ const d = triDist(t, x, y, z);
100
+ if (d < dist[o]) {
101
+ dist[o] = d;
102
+ tri[o] = t;
103
+ }
104
+ }
105
+ }
106
+ if (jj > 0) {
107
+ const t = tri[o - sy * strides[1]];
108
+ if (t >= 0 && t !== tri[o]) {
109
+ const d = triDist(t, x, y, z);
110
+ if (d < dist[o]) {
111
+ dist[o] = d;
112
+ tri[o] = t;
113
+ }
114
+ }
115
+ }
116
+ if (kk > 0) {
117
+ const t = tri[o - sz * strides[2]];
118
+ if (t >= 0 && t !== tri[o]) {
119
+ const d = triDist(t, x, y, z);
120
+ if (d < dist[o]) {
121
+ dist[o] = d;
122
+ tri[o] = t;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ for(let i = 0; i < count; i++){
131
+ dist[i] = Math.sqrt(dist[i]);
132
+ }
133
+ return dist;
134
+ }
135
+ /**
136
+ * Bakes the signed distance field of a triangle mesh on the CPU. Unsigned distance by
137
+ * closest-triangle propagation; sign by back-face ray voting near the surface (as UE5's mesh
138
+ * distance field builder), so open and single-sided meshes work without a closed surface.
139
+ *
140
+ * @param positions - Vertex positions, xyz per vertex.
141
+ * @param indices - Three indices per triangle.
142
+ * @public
143
+ */ function bakeMeshSDF(positions, indices, options) {
144
+ const scale = Math.max(0.01, options?.resolutionScale ?? 1);
145
+ const twoSided = !!options?.twoSided;
146
+ const padding = Math.max(1, Math.floor(options?.padding ?? 2));
147
+ const maxRes = Math.max(4, Math.floor(options?.maxResolution ?? (scale > 1 ? 256 : 128)));
148
+ const minRes = Math.min(maxRes, Math.max(2, Math.floor(options?.minResolution ?? 8)));
149
+ const meshMin = [
150
+ Infinity,
151
+ Infinity,
152
+ Infinity
153
+ ];
154
+ const meshMax = [
155
+ -Infinity,
156
+ -Infinity,
157
+ -Infinity
158
+ ];
159
+ const numVerts = Math.floor(positions.length / 3);
160
+ // Only the vertices triangles use count towards the bounds
161
+ for(let i = 0; i < indices.length; i++){
162
+ const v = indices[i];
163
+ if (v >= numVerts) {
164
+ throw new Error('bakeMeshSDF(): index out of range');
165
+ }
166
+ for(let c = 0; c < 3; c++){
167
+ meshMin[c] = Math.min(meshMin[c], positions[v * 3 + c]);
168
+ meshMax[c] = Math.max(meshMax[c], positions[v * 3 + c]);
169
+ }
170
+ }
171
+ if (indices.length < 3) {
172
+ throw new Error('bakeMeshSDF(): the mesh has no triangles');
173
+ }
174
+ const extent = [
175
+ meshMax[0] - meshMin[0],
176
+ meshMax[1] - meshMin[1],
177
+ meshMax[2] - meshMin[2]
178
+ ];
179
+ const longest = Math.max(extent[0], extent[1], extent[2], 1e-6);
180
+ const unitScale = options?.unitScale && options.unitScale > 0 ? options.unitScale : 1;
181
+ let voxelSize = 1 / (SDF_VOXELS_PER_UNIT * scale * unitScale);
182
+ // Fit the longest side, padding included, under the cap
183
+ voxelSize = Math.max(voxelSize, longest / (maxRes - 2 * padding));
184
+ const resolution = [
185
+ 0,
186
+ 0,
187
+ 0
188
+ ];
189
+ for(let c = 0; c < 3; c++){
190
+ resolution[c] = Math.min(maxRes, Math.max(minRes, Math.ceil(extent[c] / voxelSize) + 2 * padding));
191
+ }
192
+ // Centre the mesh in the volume
193
+ const boxMin = [
194
+ 0,
195
+ 0,
196
+ 0
197
+ ];
198
+ const boxMax = [
199
+ 0,
200
+ 0,
201
+ 0
202
+ ];
203
+ for(let c = 0; c < 3; c++){
204
+ const size = resolution[c] * voxelSize;
205
+ boxMin[c] = (meshMin[c] + meshMax[c]) * 0.5 - size * 0.5;
206
+ boxMax[c] = boxMin[c] + size;
207
+ }
208
+ const bvh = new TriangleBVH(positions, indices);
209
+ const [nx, ny, nz] = resolution;
210
+ const count = nx * ny * nz;
211
+ const distances = computeUnsignedDistances(positions, indices, boxMin, resolution, voxelSize);
212
+ if (twoSided) {
213
+ for(let i = 0; i < count; i++){
214
+ distances[i] -= voxelSize * 0.5;
215
+ }
216
+ } else {
217
+ signDistances(distances, bvh, boxMin, resolution, voxelSize, options?.signSamples);
218
+ }
219
+ let minDistance = Infinity;
220
+ let maxDistance = -Infinity;
221
+ for(let i = 0; i < count; i++){
222
+ minDistance = Math.min(minDistance, distances[i]);
223
+ maxDistance = Math.max(maxDistance, distances[i]);
224
+ }
225
+ return {
226
+ boxMin,
227
+ boxMax,
228
+ resolution,
229
+ voxelSize,
230
+ meshBoxMin: meshMin,
231
+ meshBoxMax: meshMax,
232
+ twoSided,
233
+ minDistance,
234
+ maxDistance,
235
+ distances
236
+ };
237
+ }
238
+ /** Deterministic 32-bit generator (mulberry32), so a mesh bakes the same every time. */ function makeRandom(seed) {
239
+ let a = seed >>> 0;
240
+ return ()=>{
241
+ a = a + 0x6d2b79f5 >>> 0;
242
+ let t = a;
243
+ t = Math.imul(t ^ t >>> 15, t | 1);
244
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
245
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
246
+ };
247
+ }
248
+ /**
249
+ * Stratified directions over the sphere: a square grid of jittered samples on
250
+ * each hemisphere, mapped through the concentric disk [Shirley & Chiu 1997],
251
+ * one hemisphere mirrored in z. xyz per direction.
252
+ */ function sphereDirections(perHemisphere) {
253
+ const dim = Math.max(1, Math.floor(Math.sqrt(perHemisphere)));
254
+ const random = makeRandom(0);
255
+ const dirs = new Float32Array(dim * dim * 2 * 3);
256
+ let n = 0;
257
+ // The two hemispheres interleave, so a prefix of the list covers both sides
258
+ for(let i = 0; i < dim; i++){
259
+ for(let j = 0; j < dim; j++){
260
+ for(let hemi = 0; hemi < 2; hemi++){
261
+ const u = (i + random()) / dim * 2 - 1;
262
+ const v = (j + random()) / dim * 2 - 1;
263
+ let x = 0;
264
+ let y = 0;
265
+ let z = 1;
266
+ if (u !== 0 || v !== 0) {
267
+ let r;
268
+ let theta;
269
+ if (Math.abs(u) > Math.abs(v)) {
270
+ r = u;
271
+ theta = Math.PI / 4 * (v / u);
272
+ } else {
273
+ r = v;
274
+ theta = Math.PI / 2 - Math.PI / 4 * (u / v);
275
+ }
276
+ const r2 = r * r;
277
+ const s = Math.sqrt(2 - r2);
278
+ x = r * Math.cos(theta) * s;
279
+ y = r * Math.sin(theta) * s;
280
+ z = 1 - r2;
281
+ }
282
+ dirs[n++] = x;
283
+ dirs[n++] = y;
284
+ dirs[n++] = hemi === 0 ? z : -z;
285
+ }
286
+ }
287
+ }
288
+ return dirs;
289
+ }
290
+ /**
291
+ * Signs the unsigned distances. Voxels within SIGN_BAND_VOXELS of the surface are inside when
292
+ * they hit anything and more than SIGN_BACK_FRACTION of the rays hit a back face (UE5 mesh
293
+ * distance field criterion). Six-connected regions beyond the band are outside if they reach the
294
+ * volume border, else take the majority sign of their surrounding band voxels.
295
+ */ function signDistances(distances, bvh, boxMin, resolution, h, samples) {
296
+ const [nx, ny, nz] = resolution;
297
+ const count = nx * ny * nz;
298
+ const dirs = sphereDirections(Math.max(1, Math.floor(samples ?? 49)));
299
+ const numDirs = dirs.length / 3;
300
+ const band = SIGN_BAND_VOXELS * h;
301
+ const traceDistance = SIGN_TRACE_DIAGONALS * Math.sqrt(3) * h;
302
+ // Pulled back a little so a ray starting on a triangle still crosses it
303
+ const pullback = 1e-4 * traceDistance;
304
+ const tMax = traceDistance + pullback;
305
+ const needBack = SIGN_BACK_FRACTION * numDirs;
306
+ // 0: beyond the band, 1: outside, 2: inside
307
+ const side = new Uint8Array(count);
308
+ for(let k = 0; k < nz; k++){
309
+ const z = boxMin[2] + (k + 0.5) * h;
310
+ for(let j = 0; j < ny; j++){
311
+ const y = boxMin[1] + (j + 0.5) * h;
312
+ for(let i = 0; i < nx; i++){
313
+ const index = i + j * nx + k * nx * ny;
314
+ if (distances[index] > band) {
315
+ continue;
316
+ }
317
+ const x = boxMin[0] + (i + 0.5) * h;
318
+ let hit = 0;
319
+ let hitBack = 0;
320
+ // Stops once the back faces seen settle it either way
321
+ for(let d = 0; d < numDirs && hitBack <= needBack && hitBack + numDirs - d > needBack; d++){
322
+ const dx = dirs[d * 3];
323
+ const dy = dirs[d * 3 + 1];
324
+ const dz = dirs[d * 3 + 2];
325
+ const t = bvh.rayNearestHit(x - dx * pullback, y - dy * pullback, z - dz * pullback, dx, dy, dz, tMax);
326
+ if (t !== 0) {
327
+ hit++;
328
+ if (t < 0) {
329
+ hitBack++;
330
+ }
331
+ }
332
+ }
333
+ side[index] = hit > 0 && hitBack > needBack ? 2 : 1;
334
+ }
335
+ }
336
+ }
337
+ // Regions beyond the band, six-connected
338
+ const queue = new Int32Array(count);
339
+ const region = new Int32Array(count).fill(-1);
340
+ const strides = [
341
+ 1,
342
+ nx,
343
+ nx * ny
344
+ ];
345
+ for(let seed = 0; seed < count; seed++){
346
+ if (side[seed] !== 0 || region[seed] >= 0) {
347
+ continue;
348
+ }
349
+ let head = 0;
350
+ let tail = 0;
351
+ let border = false;
352
+ let inside = 0;
353
+ let outside = 0;
354
+ queue[tail++] = seed;
355
+ region[seed] = seed;
356
+ while(head < tail){
357
+ const v = queue[head++];
358
+ const vi = v % nx;
359
+ const vj = (v - vi) / nx % ny;
360
+ const vk = (v - vi - vj * nx) / (nx * ny);
361
+ const coord = [
362
+ vi,
363
+ vj,
364
+ vk
365
+ ];
366
+ for(let axis = 0; axis < 3; axis++){
367
+ for(let step = -1; step <= 1; step += 2){
368
+ const c = coord[axis] + step;
369
+ if (c < 0 || c >= resolution[axis]) {
370
+ border = true;
371
+ continue;
372
+ }
373
+ const w = v + step * strides[axis];
374
+ const s = side[w];
375
+ if (s === 0) {
376
+ if (region[w] < 0) {
377
+ region[w] = seed;
378
+ queue[tail++] = w;
379
+ }
380
+ } else if (s === 2) {
381
+ inside++;
382
+ } else {
383
+ outside++;
384
+ }
385
+ }
386
+ }
387
+ }
388
+ if (!border && inside > outside) {
389
+ for(let q = 0; q < tail; q++){
390
+ side[queue[q]] = 2;
391
+ }
392
+ }
393
+ }
394
+ for(let i = 0; i < count; i++){
395
+ if (side[i] === 2) {
396
+ distances[i] = -distances[i];
397
+ }
398
+ }
399
+ }
400
+ /**
401
+ * Trilinear sample of a baked field at a local position; outside the volume, the nearest border
402
+ * sample plus the distance to the volume.
403
+ * @public
404
+ */ function sampleMeshSDF(sdf, x, y, z) {
405
+ const [nx, ny, nz] = sdf.resolution;
406
+ const h = sdf.voxelSize;
407
+ const cx = Math.min(Math.max(x, sdf.boxMin[0]), sdf.boxMax[0]);
408
+ const cy = Math.min(Math.max(y, sdf.boxMin[1]), sdf.boxMax[1]);
409
+ const cz = Math.min(Math.max(z, sdf.boxMin[2]), sdf.boxMax[2]);
410
+ const outside = Math.hypot(x - cx, y - cy, z - cz);
411
+ const fx = Math.min(Math.max((cx - sdf.boxMin[0]) / h - 0.5, 0), nx - 1);
412
+ const fy = Math.min(Math.max((cy - sdf.boxMin[1]) / h - 0.5, 0), ny - 1);
413
+ const fz = Math.min(Math.max((cz - sdf.boxMin[2]) / h - 0.5, 0), nz - 1);
414
+ const i0 = Math.min(Math.floor(fx), nx - 2 < 0 ? 0 : nx - 2);
415
+ const j0 = Math.min(Math.floor(fy), ny - 2 < 0 ? 0 : ny - 2);
416
+ const k0 = Math.min(Math.floor(fz), nz - 2 < 0 ? 0 : nz - 2);
417
+ const i1 = Math.min(i0 + 1, nx - 1);
418
+ const j1 = Math.min(j0 + 1, ny - 1);
419
+ const k1 = Math.min(k0 + 1, nz - 1);
420
+ const tx = fx - i0;
421
+ const ty = fy - j0;
422
+ const tz = fz - k0;
423
+ const d = sdf.distances;
424
+ const at = (i, j, k)=>d[(k * ny + j) * nx + i];
425
+ const c00 = at(i0, j0, k0) * (1 - tx) + at(i1, j0, k0) * tx;
426
+ const c10 = at(i0, j1, k0) * (1 - tx) + at(i1, j1, k0) * tx;
427
+ const c01 = at(i0, j0, k1) * (1 - tx) + at(i1, j0, k1) * tx;
428
+ const c11 = at(i0, j1, k1) * (1 - tx) + at(i1, j1, k1) * tx;
429
+ const c0 = c00 * (1 - ty) + c10 * ty;
430
+ const c1 = c01 * (1 - ty) + c11 * ty;
431
+ return c0 * (1 - tz) + c1 * tz + outside;
432
+ }
433
+
434
+ export { SDF_VOXELS_PER_UNIT, bakeMeshSDF, sampleMeshSDF };
435
+ //# sourceMappingURL=bake.js.map