@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,25 +1,25 @@
1
1
  import { Primitive } from '../render/primitive.js';
2
- import { Disposable, DRef, Vector4 } from '@zephyr3d/base';
2
+ import { Disposable, DRef, Vector4, PRNG } from '@zephyr3d/base';
3
3
  import { fetchSampler } from './misc.js';
4
4
  import { getDevice } from '../app/api.js';
5
5
 
6
- /**
7
- * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.
8
- * This is commonly used for efficient environment lighting approximation in real-time rendering.
9
- *
10
- * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)
11
- * from a cubemap texture, which can then be used for ambient lighting calculations.
12
- *
13
- * @example
14
- * ```typescript
15
- * const projector = new CubemapSHProjector(10000);
16
- * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });
17
- * projector.projectCubemap(environmentCubemap, shBuffer);
18
- * // shBuffer now contains the 9 SH coefficients as RGB values
19
- * projector.dispose();
20
- * ```
21
- *
22
- * @public
6
+ /**
7
+ * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.
8
+ * This is commonly used for efficient environment lighting approximation in real-time rendering.
9
+ *
10
+ * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)
11
+ * from a cubemap texture, which can then be used for ambient lighting calculations.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const projector = new CubemapSHProjector(10000);
16
+ * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });
17
+ * projector.projectCubemap(environmentCubemap, shBuffer);
18
+ * // shBuffer now contains the 9 SH coefficients as RGB values
19
+ * projector.dispose();
20
+ * ```
21
+ *
22
+ * @public
23
23
  */ class CubemapSHProjector extends Disposable {
24
24
  static _programInst = null;
25
25
  static _bindGroupInst = null;
@@ -27,37 +27,37 @@ import { getDevice } from '../app/api.js';
27
27
  _primitive;
28
28
  _renderTarget;
29
29
  _numSamples;
30
- /**
31
- * Creates a new CubemapSHProjector instance.
32
- *
33
- * @param numSamples - Number of Monte Carlo samples to use for SH projection.
34
- * Higher values provide better accuracy but slower computation.
35
- * Default is 10000.
30
+ /**
31
+ * Creates a new CubemapSHProjector instance.
32
+ *
33
+ * @param numSamples - Number of Monte Carlo samples to use for SH projection.
34
+ * Higher values provide better accuracy but slower computation.
35
+ * Default is 10000.
36
36
  */ constructor(numSamples = 10000){
37
37
  super();
38
38
  this._numSamples = numSamples;
39
39
  this._primitive = new DRef();
40
40
  this._renderTarget = new DRef();
41
41
  }
42
- /**
43
- * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.
44
- *
45
- * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
46
- * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
47
- * The layout is:
48
- * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
49
- * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
50
- * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
51
- *
52
- * @param cubemap - The input cubemap texture to project
53
- * @param outBuffer - GPU data buffer to receive the computed SH coefficients.
54
- * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).
55
- *
56
- * @example
57
- * ```typescript
58
- * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes
59
- * projector.projectCubemap(environmentMap, shBuffer);
60
- * ```
42
+ /**
43
+ * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.
44
+ *
45
+ * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
46
+ * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
47
+ * The layout is:
48
+ * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
49
+ * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
50
+ * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
51
+ *
52
+ * @param cubemap - The input cubemap texture to project
53
+ * @param outBuffer - GPU data buffer to receive the computed SH coefficients.
54
+ * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes
59
+ * projector.projectCubemap(environmentMap, shBuffer);
60
+ * ```
61
61
  */ projectCubemap(cubemap, outBuffer, radianceSource = true) {
62
62
  const device = getDevice();
63
63
  if (!this._renderTarget.get()) {
@@ -71,25 +71,25 @@ import { getDevice } from '../app/api.js';
71
71
  this.projectCubemapToTexture(cubemap, this._renderTarget.get(), radianceSource);
72
72
  this._renderTarget.get().getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);
73
73
  }
74
- /**
75
- * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.
76
- *
77
- * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
78
- * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
79
- * The layout is:
80
- * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
81
- * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
82
- * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
83
- *
84
- * @param cubemap - The input cubemap texture to project
85
- * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.
86
- *
87
- * @example
88
- * ```typescript
89
- * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes
90
- * const shFramebuffer = device.createFrameBuffer([shTexture], null);
91
- * projector.projectCubemapToTexture(environmentMap, shFramebuffer);
92
- * ```
74
+ /**
75
+ * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.
76
+ *
77
+ * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.
78
+ * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.
79
+ * The layout is:
80
+ * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀
81
+ * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁
82
+ * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂
83
+ *
84
+ * @param cubemap - The input cubemap texture to project
85
+ * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes
90
+ * const shFramebuffer = device.createFrameBuffer([shTexture], null);
91
+ * projector.projectCubemapToTexture(environmentMap, shFramebuffer);
92
+ * ```
93
93
  */ projectCubemapToTexture(cubemap, framebuffer, radianceSource = true) {
94
94
  const device = getDevice();
95
95
  const clearColor = new Vector4(0, 0, 0, 1);
@@ -106,9 +106,9 @@ import { getDevice } from '../app/api.js';
106
106
  this._primitive.get().drawInstanced(9);
107
107
  device.popDeviceStates();
108
108
  }
109
- /**
110
- * Disposes of all resources allocated by this projector instance.
111
- * Should be called when the projector is no longer needed to prevent memory leaks.
109
+ /**
110
+ * Disposes of all resources allocated by this projector instance.
111
+ * Should be called when the projector is no longer needed to prevent memory leaks.
112
112
  */ onDispose() {
113
113
  super.onDispose();
114
114
  this._primitive.dispose();
@@ -117,24 +117,28 @@ import { getDevice } from '../app/api.js';
117
117
  this._renderTarget.dispose();
118
118
  }
119
119
  }
120
- /**
121
- * Initializes the GPU resources needed for SH projection.
122
- * This method is called automatically by projectCubemap() and sets up:
123
- * - Sample directions primitive (Monte Carlo samples on unit sphere)
124
- * - Render target (3x3 RGBA32F texture)
125
- * - Render states (additive blending, no depth test)
126
- * - GPU program for SH evaluation
127
- *
128
- * @param device - The graphics device to create resources with
129
- * @internal
120
+ /**
121
+ * Initializes the GPU resources needed for SH projection.
122
+ * This method is called automatically by projectCubemap() and sets up:
123
+ * - Sample directions primitive (Monte Carlo samples on unit sphere)
124
+ * - Render target (3x3 RGBA32F texture)
125
+ * - Render states (additive blending, no depth test)
126
+ * - GPU program for SH evaluation
127
+ *
128
+ * @param device - The graphics device to create resources with
129
+ * @internal
130
130
  */ init(device) {
131
131
  if (!this._primitive.get()) {
132
132
  const samples = new Float32Array(this._numSamples * 4);
133
+ // Seeded so the projection is the same on every run: with Math.random()
134
+ // every page load drew different directions, which made all sky-lit
135
+ // lighting differ slightly from run to run.
136
+ const rand = new PRNG(0x5348);
133
137
  for(let i = 0; i < this._numSamples; i++){
134
138
  let x1, x2, s;
135
139
  do {
136
- x1 = Math.random() * 2 - 1;
137
- x2 = Math.random() * 2 - 1;
140
+ x1 = rand.get() * 2 - 1;
141
+ x2 = rand.get() * 2 - 1;
138
142
  s = x1 * x1 + x2 * x2;
139
143
  }while (s >= 1)
140
144
  const sqrtS = Math.sqrt(1 - s);
@@ -145,19 +149,6 @@ import { getDevice } from '../app/api.js';
145
149
  }
146
150
  const primitive = new Primitive();
147
151
  primitive.createAndSetVertexBuffer('position_f32x4', samples);
148
- if (device.type === 'webgl') {
149
- primitive.createAndSetVertexBuffer('tex0_f32', new Float32Array([
150
- 0,
151
- 1,
152
- 2,
153
- 3,
154
- 4,
155
- 5,
156
- 6,
157
- 7,
158
- 8
159
- ]), 'instance');
160
- }
161
152
  primitive.indexCount = this._numSamples;
162
153
  primitive.indexStart = 0;
163
154
  primitive.primitiveType = 'point-list';
@@ -174,33 +165,30 @@ import { getDevice } from '../app/api.js';
174
165
  CubemapSHProjector._bindGroupInst = device.createBindGroup(CubemapSHProjector._programInst.bindGroupLayouts[0]);
175
166
  }
176
167
  }
177
- /**
178
- * Creates the GPU program for spherical harmonics evaluation.
179
- *
180
- * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).
181
- * Each instance renders all sample points, but the vertex shader maps them to different
182
- * pixels in the 3x3 output texture based on the instance ID.
183
- *
184
- * The fragment shader evaluates the appropriate SH basis function based on the pixel location,
185
- * samples the cubemap in the sample direction, and multiplies by the integration weight.
186
- *
187
- * @param device - The graphics device to create the program with
188
- * @returns The compiled GPU program
189
- * @internal
168
+ /**
169
+ * Creates the GPU program for spherical harmonics evaluation.
170
+ *
171
+ * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).
172
+ * Each instance renders all sample points, but the vertex shader maps them to different
173
+ * pixels in the 3x3 output texture based on the instance ID.
174
+ *
175
+ * The fragment shader evaluates the appropriate SH basis function based on the pixel location,
176
+ * samples the cubemap in the sample direction, and multiplies by the integration weight.
177
+ *
178
+ * @param device - The graphics device to create the program with
179
+ * @returns The compiled GPU program
180
+ * @internal
190
181
  */ static _createProgram(device) {
191
182
  const program = device.buildRenderProgram({
192
183
  vertex (pb) {
193
184
  this.$inputs.directionWeight = pb.vec4().attrib('position');
194
- if (device.type === 'webgl') {
195
- this.$inputs.instanceId = pb.float().attrib('texCoord0');
196
- }
197
185
  pb.main(function() {
198
186
  this.$outputs.direction = this.$inputs.directionWeight.xyz;
199
187
  this.$outputs.weight = this.$inputs.directionWeight.w;
200
188
  if (pb.getDevice().type !== 'webgpu') {
201
189
  this.$builtins.pointSize = 1;
202
190
  }
203
- this.$outputs.shIndex = device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);
191
+ this.$outputs.shIndex = pb.int(this.$builtins.instanceIndex);
204
192
  this.$l.x = pb.mod(this.$outputs.shIndex, 3);
205
193
  this.$l.y = pb.div(this.$outputs.shIndex, 3);
206
194
  this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);
@@ -299,8 +287,8 @@ import { getDevice } from '../app/api.js';
299
287
  });
300
288
  pb.main(function() {
301
289
  this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;
302
- this.$l.bandFactor = this.cosineLobeBandFactor(pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex);
303
- this.$l.sh = this.evalBasis(this.$inputs.direction, pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex);
290
+ this.$l.bandFactor = this.cosineLobeBandFactor(this.$inputs.shIndex);
291
+ this.$l.sh = this.evalBasis(this.$inputs.direction, this.$inputs.shIndex);
304
292
  this.$outputs.color = pb.vec4(pb.mul(this.radiance, this.sh, this.$inputs.weight, this.bandFactor, this.scale), 1);
305
293
  });
306
294
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shprojector.js","sources":["../../src/utility/shprojector.ts"],"sourcesContent":["import type {\n AbstractDevice,\n BindGroup,\n FrameBuffer,\n GPUDataBuffer,\n GPUProgram,\n RenderStateSet,\n TextureCube\n} from '@zephyr3d/device';\nimport { Primitive } from '../render/primitive';\nimport type { Nullable } from '@zephyr3d/base';\nimport { Disposable, DRef, Vector4 } from '@zephyr3d/base';\nimport { fetchSampler } from './misc';\nimport { getDevice } from '../app/api';\n\n/**\n * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.\n * This is commonly used for efficient environment lighting approximation in real-time rendering.\n *\n * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)\n * from a cubemap texture, which can then be used for ambient lighting calculations.\n *\n * @example\n * ```typescript\n * const projector = new CubemapSHProjector(10000);\n * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });\n * projector.projectCubemap(environmentCubemap, shBuffer);\n * // shBuffer now contains the 9 SH coefficients as RGB values\n * projector.dispose();\n * ```\n *\n * @public\n */\nexport class CubemapSHProjector extends Disposable {\n private static _programInst: Nullable<GPUProgram> = null;\n private static _bindGroupInst: Nullable<BindGroup> = null;\n private static _renderStats: Nullable<RenderStateSet> = null;\n private readonly _primitive: DRef<Primitive>;\n private readonly _renderTarget: DRef<FrameBuffer>;\n private readonly _numSamples: number;\n /**\n * Creates a new CubemapSHProjector instance.\n *\n * @param numSamples - Number of Monte Carlo samples to use for SH projection.\n * Higher values provide better accuracy but slower computation.\n * Default is 10000.\n */\n constructor(numSamples = 10000) {\n super();\n this._numSamples = numSamples;\n this._primitive = new DRef();\n this._renderTarget = new DRef();\n }\n /**\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.\n *\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\n * The layout is:\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\n *\n * @param cubemap - The input cubemap texture to project\n * @param outBuffer - GPU data buffer to receive the computed SH coefficients.\n * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).\n *\n * @example\n * ```typescript\n * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes\n * projector.projectCubemap(environmentMap, shBuffer);\n * ```\n */\n projectCubemap(cubemap: TextureCube, outBuffer: GPUDataBuffer, radianceSource = true) {\n const device = getDevice();\n if (!this._renderTarget.get()) {\n const texture = device.createTexture2D('rgba32f', 3, 3, {\n mipmapping: false\n })!;\n this._renderTarget.set(device.createFrameBuffer([texture], null));\n }\n this.projectCubemapToTexture(cubemap, this._renderTarget.get()!, radianceSource);\n this._renderTarget.get()!.getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);\n }\n /**\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.\n *\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\n * The layout is:\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\n *\n * @param cubemap - The input cubemap texture to project\n * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.\n *\n * @example\n * ```typescript\n * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes\n * const shFramebuffer = device.createFrameBuffer([shTexture], null);\n * projector.projectCubemapToTexture(environmentMap, shFramebuffer);\n * ```\n */\n projectCubemapToTexture(cubemap: TextureCube, framebuffer: FrameBuffer, radianceSource = true) {\n const device = getDevice();\n const clearColor = new Vector4(0, 0, 0, 1);\n this.init(device);\n device.pushDeviceStates();\n device.setRenderStates(CubemapSHProjector._renderStats);\n device.setProgram(CubemapSHProjector._programInst);\n device.setFramebuffer(framebuffer);\n device.clearFrameBuffer(clearColor, null, null);\n const bindGroup = CubemapSHProjector._bindGroupInst!;\n bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));\n bindGroup.setValue('scale', radianceSource ? 1.0 : Math.PI);\n device.setBindGroup(0, bindGroup);\n this._primitive.get()!.drawInstanced(9);\n device.popDeviceStates();\n }\n /**\n * Disposes of all resources allocated by this projector instance.\n * Should be called when the projector is no longer needed to prevent memory leaks.\n */\n protected onDispose() {\n super.onDispose();\n this._primitive.dispose();\n if (this._renderTarget.get()) {\n this._renderTarget.get()!.getColorAttachments()[0].dispose();\n this._renderTarget.dispose();\n }\n }\n /**\n * Initializes the GPU resources needed for SH projection.\n * This method is called automatically by projectCubemap() and sets up:\n * - Sample directions primitive (Monte Carlo samples on unit sphere)\n * - Render target (3x3 RGBA32F texture)\n * - Render states (additive blending, no depth test)\n * - GPU program for SH evaluation\n *\n * @param device - The graphics device to create resources with\n * @internal\n */\n private init(device: AbstractDevice) {\n if (!this._primitive.get()) {\n const samples = new Float32Array(this._numSamples * 4);\n for (let i = 0; i < this._numSamples; i++) {\n let x1: number, x2: number, s: number;\n do {\n x1 = Math.random() * 2 - 1;\n x2 = Math.random() * 2 - 1;\n s = x1 * x1 + x2 * x2;\n } while (s >= 1);\n const sqrtS = Math.sqrt(1 - s);\n samples[i * 4 + 0] = 2 * x1 * sqrtS;\n samples[i * 4 + 1] = 2 * x2 * sqrtS;\n samples[i * 4 + 2] = 1 - 2 * s;\n samples[i * 4 + 3] = (4 * Math.PI) / this._numSamples;\n }\n const primitive = new Primitive();\n primitive.createAndSetVertexBuffer('position_f32x4', samples);\n if (device.type === 'webgl') {\n primitive.createAndSetVertexBuffer(\n 'tex0_f32',\n new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8]),\n 'instance'\n );\n }\n primitive.indexCount = this._numSamples;\n primitive.indexStart = 0;\n primitive.primitiveType = 'point-list';\n this._primitive.set(primitive);\n }\n\n if (!CubemapSHProjector._renderStats) {\n CubemapSHProjector._renderStats = device.createRenderStateSet();\n CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);\n CubemapSHProjector._renderStats\n .useBlendingState()\n .enable(true)\n .setBlendEquation('add', 'add')\n .setBlendFuncRGB('one', 'one')\n .setBlendFuncAlpha('zero', 'one');\n CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');\n }\n\n if (!CubemapSHProjector._programInst) {\n CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device)!;\n CubemapSHProjector._bindGroupInst = device.createBindGroup(\n CubemapSHProjector._programInst.bindGroupLayouts[0]\n );\n }\n }\n /**\n * Creates the GPU program for spherical harmonics evaluation.\n *\n * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).\n * Each instance renders all sample points, but the vertex shader maps them to different\n * pixels in the 3x3 output texture based on the instance ID.\n *\n * The fragment shader evaluates the appropriate SH basis function based on the pixel location,\n * samples the cubemap in the sample direction, and multiplies by the integration weight.\n *\n * @param device - The graphics device to create the program with\n * @returns The compiled GPU program\n * @internal\n */\n private static _createProgram(device: AbstractDevice) {\n const program = device.buildRenderProgram({\n vertex(pb) {\n this.$inputs.directionWeight = pb.vec4().attrib('position');\n if (device.type === 'webgl') {\n this.$inputs.instanceId = pb.float().attrib('texCoord0');\n }\n pb.main(function () {\n this.$outputs.direction = this.$inputs.directionWeight.xyz;\n this.$outputs.weight = this.$inputs.directionWeight.w;\n if (pb.getDevice().type !== 'webgpu') {\n this.$builtins.pointSize = 1;\n }\n this.$outputs.shIndex =\n device.type === 'webgl' ? this.$inputs.instanceId : pb.int(this.$builtins.instanceIndex);\n this.$l.x = pb.mod(this.$outputs.shIndex, 3);\n this.$l.y = pb.div(this.$outputs.shIndex, 3);\n this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);\n this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);\n this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);\n if (pb.getDevice().type === 'webgpu') {\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\n }\n });\n },\n fragment(pb) {\n this.$outputs.color = pb.vec4();\n this.cubemap = pb.texCube().uniform(0);\n this.scale = pb.float().uniform(0);\n pb.func('cosineLobeBandFactor', [pb.int('l')], function () {\n this.$if(pb.equal(this.l, 0), function () {\n this.$return(pb.float(1));\n });\n this.$if(pb.lessThanEqual(this.l, 3), function () {\n this.$return(2 / 3);\n });\n this.$return(1 / 4);\n });\n pb.func('Y0', [pb.vec3('v')], function () {\n this.$return(0.282094791773878);\n });\n pb.func('Y1', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.y, -0.4886025119));\n });\n pb.func('Y2', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.z, 0.4886025119));\n });\n pb.func('Y3', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.x, -0.4886025119));\n });\n pb.func('Y4', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\n });\n pb.func('Y5', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\n });\n pb.func('Y6', [pb.vec3('v')], function () {\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\n });\n pb.func('Y7', [pb.vec3('v')], function () {\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\n });\n pb.func('Y8', [pb.vec3('v')], function () {\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\n });\n pb.func('evalBasis', [pb.vec3('dir'), pb.int('c')], function () {\n this.$if(pb.equal(this.c, 0), function () {\n this.$return(this.Y0(this.dir));\n })\n .$elseif(pb.equal(this.c, 1), function () {\n this.$return(this.Y1(this.dir));\n })\n .$elseif(pb.equal(this.c, 2), function () {\n this.$return(this.Y2(this.dir));\n })\n .$elseif(pb.equal(this.c, 3), function () {\n this.$return(this.Y3(this.dir));\n })\n .$elseif(pb.equal(this.c, 4), function () {\n this.$return(this.Y4(this.dir));\n })\n .$elseif(pb.equal(this.c, 5), function () {\n this.$return(this.Y5(this.dir));\n })\n .$elseif(pb.equal(this.c, 6), function () {\n this.$return(this.Y6(this.dir));\n })\n .$elseif(pb.equal(this.c, 7), function () {\n this.$return(this.Y7(this.dir));\n })\n .$elseif(pb.equal(this.c, 8), function () {\n this.$return(this.Y8(this.dir));\n })\n .$else(function () {\n this.$return(0);\n });\n });\n pb.main(function () {\n this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;\n this.$l.bandFactor = this.cosineLobeBandFactor(\n pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex\n );\n this.$l.sh = this.evalBasis(\n this.$inputs.direction,\n pb.getDevice().type === 'webgl' ? pb.int(this.$inputs.shIndex) : this.$inputs.shIndex\n );\n this.$outputs.color = pb.vec4(\n pb.mul(this.radiance, this.sh, this.$inputs.weight, this.bandFactor, this.scale),\n 1\n );\n });\n }\n })!;\n program.name = '@CubemapSHProjector_SHProject';\n return program;\n }\n}\n"],"names":["CubemapSHProjector","Disposable","_programInst","_bindGroupInst","_renderStats","_primitive","_renderTarget","_numSamples","numSamples","DRef","projectCubemap","cubemap","outBuffer","radianceSource","device","getDevice","get","texture","createTexture2D","mipmapping","set","createFrameBuffer","projectCubemapToTexture","getColorAttachments","readPixelsToBuffer","framebuffer","clearColor","Vector4","init","pushDeviceStates","setRenderStates","setProgram","setFramebuffer","clearFrameBuffer","bindGroup","setTexture","fetchSampler","setValue","Math","PI","setBindGroup","drawInstanced","popDeviceStates","onDispose","dispose","samples","Float32Array","i","x1","x2","s","random","sqrtS","sqrt","primitive","Primitive","createAndSetVertexBuffer","type","indexCount","indexStart","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","useRasterizerState","setCullMode","_createProgram","createBindGroup","bindGroupLayouts","program","buildRenderProgram","vertex","pb","$inputs","directionWeight","vec4","attrib","instanceId","float","main","$outputs","direction","xyz","weight","w","$builtins","pointSize","shIndex","int","instanceIndex","$l","x","mod","y","div","ndcX","sub","add","ndcY","position","mul","fragment","color","texCube","uniform","scale","func","$if","equal","l","$return","lessThanEqual","vec3","v","z","c","Y0","dir","$elseif","Y1","Y2","Y3","Y4","Y5","Y6","Y7","Y8","$else","radiance","textureSampleLevel","rgb","bandFactor","cosineLobeBandFactor","sh","evalBasis","name"],"mappings":"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"}
1
+ {"version":3,"file":"shprojector.js","sources":["../../src/utility/shprojector.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n RenderStateSet,\r\n TextureCube\r\n} from '@zephyr3d/device';\r\nimport { Primitive } from '../render/primitive';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable, DRef, PRNG, Vector4 } from '@zephyr3d/base';\r\nimport { fetchSampler } from './misc';\r\nimport { getDevice } from '../app/api';\r\n\r\n/**\r\n * CubemapSHProjector is responsible for projecting a cubemap texture into spherical harmonics (SH) coefficients.\r\n * This is commonly used for efficient environment lighting approximation in real-time rendering.\r\n *\r\n * The class uses Monte Carlo sampling to compute the first 9 spherical harmonics coefficients (up to order 2)\r\n * from a cubemap texture, which can then be used for ambient lighting calculations.\r\n *\r\n * @example\r\n * ```typescript\r\n * const projector = new CubemapSHProjector(10000);\r\n * const shBuffer = device.createBuffer(4 * 4 * 9, { usage: 'uniform' });\r\n * projector.projectCubemap(environmentCubemap, shBuffer);\r\n * // shBuffer now contains the 9 SH coefficients as RGB values\r\n * projector.dispose();\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class CubemapSHProjector extends Disposable {\r\n private static _programInst: Nullable<GPUProgram> = null;\r\n private static _bindGroupInst: Nullable<BindGroup> = null;\r\n private static _renderStats: Nullable<RenderStateSet> = null;\r\n private readonly _primitive: DRef<Primitive>;\r\n private readonly _renderTarget: DRef<FrameBuffer>;\r\n private readonly _numSamples: number;\r\n /**\r\n * Creates a new CubemapSHProjector instance.\r\n *\r\n * @param numSamples - Number of Monte Carlo samples to use for SH projection.\r\n * Higher values provide better accuracy but slower computation.\r\n * Default is 10000.\r\n */\r\n constructor(numSamples = 10000) {\r\n super();\r\n this._numSamples = numSamples;\r\n this._primitive = new DRef();\r\n this._renderTarget = new DRef();\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a GPUBuffer.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outBuffer - GPU data buffer to receive the computed SH coefficients.\r\n * Must be large enough to hold 9 RGB values (36 floats for RGBA32F format).\r\n *\r\n * @example\r\n * ```typescript\r\n * const shBuffer = device.createDataBuffer(9 * 4 * 4); // 9 coefficients * 4 components * 4 bytes\r\n * projector.projectCubemap(environmentMap, shBuffer);\r\n * ```\r\n */\r\n projectCubemap(cubemap: TextureCube, outBuffer: GPUDataBuffer, radianceSource = true) {\r\n const device = getDevice();\r\n if (!this._renderTarget.get()) {\r\n const texture = device.createTexture2D('rgba32f', 3, 3, {\r\n mipmapping: false\r\n })!;\r\n this._renderTarget.set(device.createFrameBuffer([texture], null));\r\n }\r\n this.projectCubemapToTexture(cubemap, this._renderTarget.get()!, radianceSource);\r\n this._renderTarget.get()!.getColorAttachments()[0].readPixelsToBuffer(0, 0, 3, 3, 0, 0, outBuffer);\r\n }\r\n /**\r\n * Projects a cubemap texture into spherical harmonics coefficients and stores them in a 3x3 texture.\r\n *\r\n * The method performs Monte Carlo integration over the sphere to compute the first 9 SH coefficients.\r\n * The results are written to a 3x3 render target where each pixel contains RGB values for one SH coefficient.\r\n * The layout is:\r\n * - (0,0): Y₀₀ (0,1): Y₁₋₁ (0,2): Y₁₀\r\n * - (1,0): Y₁₁ (1,1): Y₂₋₂ (1,2): Y₂₋₁\r\n * - (2,0): Y₂₀ (2,1): Y₂₁ (2,2): Y₂₂\r\n *\r\n * @param cubemap - The input cubemap texture to project\r\n * @param outFramebuffer - Framebuffer that contains the 3x3 texture to receive the computed SH coefficients in color attachment slot 0.\r\n *\r\n * @example\r\n * ```typescript\r\n * const shTexture = device.createTexture2D('rgba32f', 3, 3); // 9 coefficients * 4 components * 4 bytes\r\n * const shFramebuffer = device.createFrameBuffer([shTexture], null);\r\n * projector.projectCubemapToTexture(environmentMap, shFramebuffer);\r\n * ```\r\n */\r\n projectCubemapToTexture(cubemap: TextureCube, framebuffer: FrameBuffer, radianceSource = true) {\r\n const device = getDevice();\r\n const clearColor = new Vector4(0, 0, 0, 1);\r\n this.init(device);\r\n device.pushDeviceStates();\r\n device.setRenderStates(CubemapSHProjector._renderStats);\r\n device.setProgram(CubemapSHProjector._programInst);\r\n device.setFramebuffer(framebuffer);\r\n device.clearFrameBuffer(clearColor, null, null);\r\n const bindGroup = CubemapSHProjector._bindGroupInst!;\r\n bindGroup.setTexture('cubemap', cubemap, fetchSampler('clamp_linear_nomip'));\r\n bindGroup.setValue('scale', radianceSource ? 1.0 : Math.PI);\r\n device.setBindGroup(0, bindGroup);\r\n this._primitive.get()!.drawInstanced(9);\r\n device.popDeviceStates();\r\n }\r\n /**\r\n * Disposes of all resources allocated by this projector instance.\r\n * Should be called when the projector is no longer needed to prevent memory leaks.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._primitive.dispose();\r\n if (this._renderTarget.get()) {\r\n this._renderTarget.get()!.getColorAttachments()[0].dispose();\r\n this._renderTarget.dispose();\r\n }\r\n }\r\n /**\r\n * Initializes the GPU resources needed for SH projection.\r\n * This method is called automatically by projectCubemap() and sets up:\r\n * - Sample directions primitive (Monte Carlo samples on unit sphere)\r\n * - Render target (3x3 RGBA32F texture)\r\n * - Render states (additive blending, no depth test)\r\n * - GPU program for SH evaluation\r\n *\r\n * @param device - The graphics device to create resources with\r\n * @internal\r\n */\r\n private init(device: AbstractDevice) {\r\n if (!this._primitive.get()) {\r\n const samples = new Float32Array(this._numSamples * 4);\r\n // Seeded so the projection is the same on every run: with Math.random()\r\n // every page load drew different directions, which made all sky-lit\r\n // lighting differ slightly from run to run.\r\n const rand = new PRNG(0x5348);\r\n for (let i = 0; i < this._numSamples; i++) {\r\n let x1: number, x2: number, s: number;\r\n do {\r\n x1 = rand.get() * 2 - 1;\r\n x2 = rand.get() * 2 - 1;\r\n s = x1 * x1 + x2 * x2;\r\n } while (s >= 1);\r\n const sqrtS = Math.sqrt(1 - s);\r\n samples[i * 4 + 0] = 2 * x1 * sqrtS;\r\n samples[i * 4 + 1] = 2 * x2 * sqrtS;\r\n samples[i * 4 + 2] = 1 - 2 * s;\r\n samples[i * 4 + 3] = (4 * Math.PI) / this._numSamples;\r\n }\r\n const primitive = new Primitive();\r\n primitive.createAndSetVertexBuffer('position_f32x4', samples);\r\n primitive.indexCount = this._numSamples;\r\n primitive.indexStart = 0;\r\n primitive.primitiveType = 'point-list';\r\n this._primitive.set(primitive);\r\n }\r\n\r\n if (!CubemapSHProjector._renderStats) {\r\n CubemapSHProjector._renderStats = device.createRenderStateSet();\r\n CubemapSHProjector._renderStats.useDepthState().enableTest(false).enableWrite(false);\r\n CubemapSHProjector._renderStats\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n CubemapSHProjector._renderStats.useRasterizerState().setCullMode('none');\r\n }\r\n\r\n if (!CubemapSHProjector._programInst) {\r\n CubemapSHProjector._programInst = CubemapSHProjector._createProgram(device)!;\r\n CubemapSHProjector._bindGroupInst = device.createBindGroup(\r\n CubemapSHProjector._programInst.bindGroupLayouts[0]\r\n );\r\n }\r\n }\r\n /**\r\n * Creates the GPU program for spherical harmonics evaluation.\r\n *\r\n * The vertex shader uses instanced rendering to generate 9 instances (one per SH coefficient).\r\n * Each instance renders all sample points, but the vertex shader maps them to different\r\n * pixels in the 3x3 output texture based on the instance ID.\r\n *\r\n * The fragment shader evaluates the appropriate SH basis function based on the pixel location,\r\n * samples the cubemap in the sample direction, and multiplies by the integration weight.\r\n *\r\n * @param device - The graphics device to create the program with\r\n * @returns The compiled GPU program\r\n * @internal\r\n */\r\n private static _createProgram(device: AbstractDevice) {\r\n const program = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.directionWeight = pb.vec4().attrib('position');\r\n pb.main(function () {\r\n this.$outputs.direction = this.$inputs.directionWeight.xyz;\r\n this.$outputs.weight = this.$inputs.directionWeight.w;\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$outputs.shIndex = pb.int(this.$builtins.instanceIndex);\r\n this.$l.x = pb.mod(this.$outputs.shIndex, 3);\r\n this.$l.y = pb.div(this.$outputs.shIndex, 3);\r\n this.$l.ndcX = pb.sub(pb.div(pb.add(pb.float(this.x), 0.5), 1.5), 1);\r\n this.$l.ndcY = pb.sub(pb.div(pb.add(pb.float(this.y), 0.5), 1.5), 1);\r\n this.$l.$builtins.position = pb.vec4(this.ndcX, this.ndcY, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n this.cubemap = pb.texCube().uniform(0);\r\n this.scale = pb.float().uniform(0);\r\n pb.func('cosineLobeBandFactor', [pb.int('l')], function () {\r\n this.$if(pb.equal(this.l, 0), function () {\r\n this.$return(pb.float(1));\r\n });\r\n this.$if(pb.lessThanEqual(this.l, 3), function () {\r\n this.$return(2 / 3);\r\n });\r\n this.$return(1 / 4);\r\n });\r\n pb.func('Y0', [pb.vec3('v')], function () {\r\n this.$return(0.282094791773878);\r\n });\r\n pb.func('Y1', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, -0.4886025119));\r\n });\r\n pb.func('Y2', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.z, 0.4886025119));\r\n });\r\n pb.func('Y3', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, -0.4886025119));\r\n });\r\n pb.func('Y4', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.y, 1.0925484306));\r\n });\r\n pb.func('Y5', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.y, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y6', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.z, this.v.z, 3), 1), 0.3153915652));\r\n });\r\n pb.func('Y7', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(this.v.x, this.v.z, -1.0925484306));\r\n });\r\n pb.func('Y8', [pb.vec3('v')], function () {\r\n this.$return(pb.mul(pb.sub(pb.mul(this.v.x, this.v.x), pb.mul(this.v.y, this.v.y)), 0.5462742153));\r\n });\r\n pb.func('evalBasis', [pb.vec3('dir'), pb.int('c')], function () {\r\n this.$if(pb.equal(this.c, 0), function () {\r\n this.$return(this.Y0(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 1), function () {\r\n this.$return(this.Y1(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 2), function () {\r\n this.$return(this.Y2(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 3), function () {\r\n this.$return(this.Y3(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 4), function () {\r\n this.$return(this.Y4(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 5), function () {\r\n this.$return(this.Y5(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 6), function () {\r\n this.$return(this.Y6(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 7), function () {\r\n this.$return(this.Y7(this.dir));\r\n })\r\n .$elseif(pb.equal(this.c, 8), function () {\r\n this.$return(this.Y8(this.dir));\r\n })\r\n .$else(function () {\r\n this.$return(0);\r\n });\r\n });\r\n pb.main(function () {\r\n this.$l.radiance = pb.textureSampleLevel(this.cubemap, this.$inputs.direction, 0).rgb;\r\n this.$l.bandFactor = this.cosineLobeBandFactor(this.$inputs.shIndex);\r\n this.$l.sh = this.evalBasis(this.$inputs.direction, this.$inputs.shIndex);\r\n this.$outputs.color = pb.vec4(\r\n pb.mul(this.radiance, this.sh, this.$inputs.weight, this.bandFactor, this.scale),\r\n 1\r\n );\r\n });\r\n }\r\n })!;\r\n program.name = '@CubemapSHProjector_SHProject';\r\n return program;\r\n }\r\n}\r\n"],"names":["CubemapSHProjector","Disposable","_programInst","_bindGroupInst","_renderStats","_primitive","_renderTarget","_numSamples","numSamples","DRef","projectCubemap","cubemap","outBuffer","radianceSource","device","getDevice","get","texture","createTexture2D","mipmapping","set","createFrameBuffer","projectCubemapToTexture","getColorAttachments","readPixelsToBuffer","framebuffer","clearColor","Vector4","init","pushDeviceStates","setRenderStates","setProgram","setFramebuffer","clearFrameBuffer","bindGroup","setTexture","fetchSampler","setValue","Math","PI","setBindGroup","drawInstanced","popDeviceStates","onDispose","dispose","samples","Float32Array","rand","PRNG","i","x1","x2","s","sqrtS","sqrt","primitive","Primitive","createAndSetVertexBuffer","indexCount","indexStart","primitiveType","createRenderStateSet","useDepthState","enableTest","enableWrite","useBlendingState","enable","setBlendEquation","setBlendFuncRGB","setBlendFuncAlpha","useRasterizerState","setCullMode","_createProgram","createBindGroup","bindGroupLayouts","program","buildRenderProgram","vertex","pb","$inputs","directionWeight","vec4","attrib","main","$outputs","direction","xyz","weight","w","type","$builtins","pointSize","shIndex","int","instanceIndex","$l","x","mod","y","div","ndcX","sub","add","float","ndcY","position","mul","fragment","color","texCube","uniform","scale","func","$if","equal","l","$return","lessThanEqual","vec3","v","z","c","Y0","dir","$elseif","Y1","Y2","Y3","Y4","Y5","Y6","Y7","Y8","$else","radiance","textureSampleLevel","rgb","bandFactor","cosineLobeBandFactor","sh","evalBasis","name"],"mappings":";;;;;AAeA;;;;;;;;;;;;;;;;;IAkBO,MAAMA,kBAA2BC,SAAAA,UAAAA,CAAAA;AACtC,IAAA,OAAeC,eAAqC,IAAK;AACzD,IAAA,OAAeC,iBAAsC,IAAK;AAC1D,IAAA,OAAeC,eAAyC,IAAK;IAC5CC,UAA4B;IAC5BC,aAAiC;IACjCC,WAAoB;AACrC;;;;;;MAOA,WAAA,CAAYC,UAAa,GAAA,KAAK,CAAE;QAC9B,KAAK,EAAA;QACL,IAAI,CAACD,WAAW,GAAGC,UAAAA;QACnB,IAAI,CAACH,UAAU,GAAG,IAAII,IAAAA,EAAAA;QACtB,IAAI,CAACH,aAAa,GAAG,IAAIG,IAAAA,EAAAA;AAC3B;AACA;;;;;;;;;;;;;;;;;;;AAmBC,MACDC,eAAeC,OAAoB,EAAEC,SAAwB,EAAEC,cAAAA,GAAiB,IAAI,EAAE;AACpF,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAACT,aAAa,CAACU,GAAG,EAAI,EAAA;AAC7B,YAAA,MAAMC,UAAUH,MAAOI,CAAAA,eAAe,CAAC,SAAA,EAAW,GAAG,CAAG,EAAA;gBACtDC,UAAY,EAAA;AACd,aAAA,CAAA;AACA,YAAA,IAAI,CAACb,aAAa,CAACc,GAAG,CAACN,MAAAA,CAAOO,iBAAiB,CAAC;AAACJ,gBAAAA;aAAQ,EAAE,IAAA,CAAA,CAAA;AAC7D;QACA,IAAI,CAACK,uBAAuB,CAACX,OAAAA,EAAS,IAAI,CAACL,aAAa,CAACU,GAAG,EAAKH,EAAAA,cAAAA,CAAAA;AACjE,QAAA,IAAI,CAACP,aAAa,CAACU,GAAG,EAAA,CAAIO,mBAAmB,EAAE,CAAC,CAAE,CAAA,CAACC,kBAAkB,CAAC,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAGZ,EAAAA,SAAAA,CAAAA;AAC1F;AACA;;;;;;;;;;;;;;;;;;;AAmBC,MACDU,wBAAwBX,OAAoB,EAAEc,WAAwB,EAAEZ,cAAAA,GAAiB,IAAI,EAAE;AAC7F,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMW,UAAa,GAAA,IAAIC,OAAQ,CAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAA,CAAA;QACxC,IAAI,CAACC,IAAI,CAACd,MAAAA,CAAAA;AACVA,QAAAA,MAAAA,CAAOe,gBAAgB,EAAA;QACvBf,MAAOgB,CAAAA,eAAe,CAAC9B,kBAAAA,CAAmBI,YAAY,CAAA;QACtDU,MAAOiB,CAAAA,UAAU,CAAC/B,kBAAAA,CAAmBE,YAAY,CAAA;AACjDY,QAAAA,MAAAA,CAAOkB,cAAc,CAACP,WAAAA,CAAAA;QACtBX,MAAOmB,CAAAA,gBAAgB,CAACP,UAAAA,EAAY,IAAM,EAAA,IAAA,CAAA;QAC1C,MAAMQ,SAAAA,GAAYlC,mBAAmBG,cAAc;AACnD+B,QAAAA,SAAAA,CAAUC,UAAU,CAAC,SAAWxB,EAAAA,OAAAA,EAASyB,YAAa,CAAA,oBAAA,CAAA,CAAA;AACtDF,QAAAA,SAAAA,CAAUG,QAAQ,CAAC,OAAA,EAASxB,cAAiB,GAAA,GAAA,GAAMyB,KAAKC,EAAE,CAAA;QAC1DzB,MAAO0B,CAAAA,YAAY,CAAC,CAAGN,EAAAA,SAAAA,CAAAA;AACvB,QAAA,IAAI,CAAC7B,UAAU,CAACW,GAAG,EAAA,CAAIyB,aAAa,CAAC,CAAA,CAAA;AACrC3B,QAAAA,MAAAA,CAAO4B,eAAe,EAAA;AACxB;AACA;;;AAGC,MACD,SAAsB,GAAA;AACpB,QAAA,KAAK,CAACC,SAAAA,EAAAA;QACN,IAAI,CAACtC,UAAU,CAACuC,OAAO,EAAA;AACvB,QAAA,IAAI,IAAI,CAACtC,aAAa,CAACU,GAAG,EAAI,EAAA;YAC5B,IAAI,CAACV,aAAa,CAACU,GAAG,EAAA,CAAIO,mBAAmB,EAAE,CAAC,CAAE,CAAA,CAACqB,OAAO,EAAA;YAC1D,IAAI,CAACtC,aAAa,CAACsC,OAAO,EAAA;AAC5B;AACF;AACA;;;;;;;;;;MAWQhB,IAAKd,CAAAA,MAAsB,EAAE;AACnC,QAAA,IAAI,CAAC,IAAI,CAACT,UAAU,CAACW,GAAG,EAAI,EAAA;AAC1B,YAAA,MAAM6B,UAAU,IAAIC,YAAAA,CAAa,IAAI,CAACvC,WAAW,GAAG,CAAA,CAAA;;;;YAIpD,MAAMwC,IAAAA,GAAO,IAAIC,IAAK,CAAA,MAAA,CAAA;YACtB,IAAK,IAAIC,IAAI,CAAGA,EAAAA,CAAAA,GAAI,IAAI,CAAC1C,WAAW,EAAE0C,CAAK,EAAA,CAAA;AACzC,gBAAA,IAAIC,IAAYC,EAAYC,EAAAA,CAAAA;gBAC5B,GAAG;oBACDF,EAAKH,GAAAA,IAAAA,CAAK/B,GAAG,EAAA,GAAK,CAAI,GAAA,CAAA;oBACtBmC,EAAKJ,GAAAA,IAAAA,CAAK/B,GAAG,EAAA,GAAK,CAAI,GAAA,CAAA;oBACtBoC,CAAIF,GAAAA,EAAAA,GAAKA,KAAKC,EAAKA,GAAAA,EAAAA;AACrB,iBAAA,OAASC,KAAK,CAAG;AACjB,gBAAA,MAAMC,KAAQf,GAAAA,IAAAA,CAAKgB,IAAI,CAAC,CAAIF,GAAAA,CAAAA,CAAAA;AAC5BP,gBAAAA,OAAO,CAACI,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,IAAIC,EAAKG,GAAAA,KAAAA;AAC9BR,gBAAAA,OAAO,CAACI,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,IAAIE,EAAKE,GAAAA,KAAAA;AAC9BR,gBAAAA,OAAO,CAACI,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,GAAG,IAAI,CAAIG,GAAAA,CAAAA;AAC7BP,gBAAAA,OAAO,CAACI,CAAAA,GAAI,CAAI,GAAA,CAAA,CAAE,GAAI,CAAIX,GAAAA,IAAAA,CAAKC,EAAE,GAAI,IAAI,CAAChC,WAAW;AACvD;AACA,YAAA,MAAMgD,YAAY,IAAIC,SAAAA,EAAAA;YACtBD,SAAUE,CAAAA,wBAAwB,CAAC,gBAAkBZ,EAAAA,OAAAA,CAAAA;AACrDU,YAAAA,SAAAA,CAAUG,UAAU,GAAG,IAAI,CAACnD,WAAW;AACvCgD,YAAAA,SAAAA,CAAUI,UAAU,GAAG,CAAA;AACvBJ,YAAAA,SAAAA,CAAUK,aAAa,GAAG,YAAA;AAC1B,YAAA,IAAI,CAACvD,UAAU,CAACe,GAAG,CAACmC,SAAAA,CAAAA;AACtB;QAEA,IAAI,CAACvD,kBAAmBI,CAAAA,YAAY,EAAE;YACpCJ,kBAAmBI,CAAAA,YAAY,GAAGU,MAAAA,CAAO+C,oBAAoB,EAAA;YAC7D7D,kBAAmBI,CAAAA,YAAY,CAAC0D,aAAa,EAAA,CAAGC,UAAU,CAAC,KAAA,CAAA,CAAOC,WAAW,CAAC,KAAA,CAAA;AAC9EhE,YAAAA,kBAAAA,CAAmBI,YAAY,CAC5B6D,gBAAgB,EAChBC,CAAAA,MAAM,CAAC,IACPC,CAAAA,CAAAA,gBAAgB,CAAC,KAAA,EAAO,OACxBC,eAAe,CAAC,OAAO,KACvBC,CAAAA,CAAAA,iBAAiB,CAAC,MAAQ,EAAA,KAAA,CAAA;AAC7BrE,YAAAA,kBAAAA,CAAmBI,YAAY,CAACkE,kBAAkB,EAAA,CAAGC,WAAW,CAAC,MAAA,CAAA;AACnE;QAEA,IAAI,CAACvE,kBAAmBE,CAAAA,YAAY,EAAE;AACpCF,YAAAA,kBAAAA,CAAmBE,YAAY,GAAGF,kBAAmBwE,CAAAA,cAAc,CAAC1D,MAAAA,CAAAA;YACpEd,kBAAmBG,CAAAA,cAAc,GAAGW,MAAAA,CAAO2D,eAAe,CACxDzE,mBAAmBE,YAAY,CAACwE,gBAAgB,CAAC,CAAE,CAAA,CAAA;AAEvD;AACF;AACA;;;;;;;;;;;;;MAcA,OAAeF,cAAe1D,CAAAA,MAAsB,EAAE;QACpD,MAAM6D,OAAAA,GAAU7D,MAAO8D,CAAAA,kBAAkB,CAAC;AACxCC,YAAAA,MAAAA,CAAAA,CAAOC,EAAE,EAAA;gBACP,IAAI,CAACC,OAAO,CAACC,eAAe,GAAGF,EAAGG,CAAAA,IAAI,EAAGC,CAAAA,MAAM,CAAC,UAAA,CAAA;AAChDJ,gBAAAA,EAAAA,CAAGK,IAAI,CAAC,WAAA;oBACN,IAAI,CAACC,QAAQ,CAACC,SAAS,GAAG,IAAI,CAACN,OAAO,CAACC,eAAe,CAACM,GAAG;oBAC1D,IAAI,CAACF,QAAQ,CAACG,MAAM,GAAG,IAAI,CAACR,OAAO,CAACC,eAAe,CAACQ,CAAC;AACrD,oBAAA,IAAIV,EAAG/D,CAAAA,SAAS,EAAG0E,CAAAA,IAAI,KAAK,QAAU,EAAA;AACpC,wBAAA,IAAI,CAACC,SAAS,CAACC,SAAS,GAAG,CAAA;AAC7B;AACA,oBAAA,IAAI,CAACP,QAAQ,CAACQ,OAAO,GAAGd,EAAAA,CAAGe,GAAG,CAAC,IAAI,CAACH,SAAS,CAACI,aAAa,CAAA;AAC3D,oBAAA,IAAI,CAACC,EAAE,CAACC,CAAC,GAAGlB,EAAAA,CAAGmB,GAAG,CAAC,IAAI,CAACb,QAAQ,CAACQ,OAAO,EAAE,CAAA,CAAA;AAC1C,oBAAA,IAAI,CAACG,EAAE,CAACG,CAAC,GAAGpB,EAAAA,CAAGqB,GAAG,CAAC,IAAI,CAACf,QAAQ,CAACQ,OAAO,EAAE,CAAA,CAAA;oBAC1C,IAAI,CAACG,EAAE,CAACK,IAAI,GAAGtB,EAAGuB,CAAAA,GAAG,CAACvB,EAAAA,CAAGqB,GAAG,CAACrB,GAAGwB,GAAG,CAACxB,GAAGyB,KAAK,CAAC,IAAI,CAACP,CAAC,CAAG,EAAA,GAAA,CAAA,EAAM,GAAM,CAAA,EAAA,CAAA,CAAA;oBAClE,IAAI,CAACD,EAAE,CAACS,IAAI,GAAG1B,EAAGuB,CAAAA,GAAG,CAACvB,EAAAA,CAAGqB,GAAG,CAACrB,GAAGwB,GAAG,CAACxB,GAAGyB,KAAK,CAAC,IAAI,CAACL,CAAC,CAAG,EAAA,GAAA,CAAA,EAAM,GAAM,CAAA,EAAA,CAAA,CAAA;AAClE,oBAAA,IAAI,CAACH,EAAE,CAACL,SAAS,CAACe,QAAQ,GAAG3B,EAAGG,CAAAA,IAAI,CAAC,IAAI,CAACmB,IAAI,EAAE,IAAI,CAACI,IAAI,EAAE,CAAG,EAAA,CAAA,CAAA;AAC9D,oBAAA,IAAI1B,EAAG/D,CAAAA,SAAS,EAAG0E,CAAAA,IAAI,KAAK,QAAU,EAAA;wBACpC,IAAI,CAACC,SAAS,CAACe,QAAQ,GAAG3B,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAAChB,SAAS,CAACe,QAAQ,EAAE3B,EAAGG,CAAAA,IAAI,CAAC,CAAG,EAAA,IAAI,CAAG,EAAA,CAAA,CAAA,CAAA;AAC9E;AACF,iBAAA,CAAA;AACF,aAAA;AACA0B,YAAAA,QAAAA,CAAAA,CAAS7B,EAAE,EAAA;AACT,gBAAA,IAAI,CAACM,QAAQ,CAACwB,KAAK,GAAG9B,GAAGG,IAAI,EAAA;AAC7B,gBAAA,IAAI,CAACtE,OAAO,GAAGmE,GAAG+B,OAAO,EAAA,CAAGC,OAAO,CAAC,CAAA,CAAA;AACpC,gBAAA,IAAI,CAACC,KAAK,GAAGjC,GAAGyB,KAAK,EAAA,CAAGO,OAAO,CAAC,CAAA,CAAA;gBAChChC,EAAGkC,CAAAA,IAAI,CAAC,sBAAwB,EAAA;AAAClC,oBAAAA,EAAAA,CAAGe,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;oBAC7C,IAAI,CAACoB,GAAG,CAACnC,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACC,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;AAC5B,wBAAA,IAAI,CAACC,OAAO,CAACtC,EAAAA,CAAGyB,KAAK,CAAC,CAAA,CAAA,CAAA;AACxB,qBAAA,CAAA;oBACA,IAAI,CAACU,GAAG,CAACnC,EAAGuC,CAAAA,aAAa,CAAC,IAAI,CAACF,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBACpC,IAAI,CAACC,OAAO,CAAC,CAAI,GAAA,CAAA,CAAA;AACnB,qBAAA,CAAA;oBACA,IAAI,CAACA,OAAO,CAAC,CAAI,GAAA,CAAA,CAAA;AACnB,iBAAA,CAAA;gBACAtC,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;oBAC5B,IAAI,CAACF,OAAO,CAAC,iBAAA,CAAA;AACf,iBAAA,CAAA;gBACAtC,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACrB,CAAC,EAAE,aAAC,CAAA,CAAA;AACjC,iBAAA,CAAA;gBACApB,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;oBAC5B,IAAI,CAACF,OAAO,CAACtC,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACa,CAAC,CAACC,CAAC,EAAE,YAAA,CAAA,CAAA;AAChC,iBAAA,CAAA;gBACA1C,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACvB,CAAC,EAAE,aAAC,CAAA,CAAA;AACjC,iBAAA,CAAA;gBACAlB,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACa,CAAC,CAACvB,CAAC,EAAE,IAAI,CAACuB,CAAC,CAACrB,CAAC,EAAE,YAAA,CAAA,CAAA;AAC1C,iBAAA,CAAA;gBACApB,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,GAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACrB,CAAC,EAAE,IAAI,CAACqB,CAAC,CAACC,CAAC,EAAE,aAAC,CAAA,CAAA;AAC3C,iBAAA,CAAA;gBACA1C,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;oBAC5B,IAAI,CAACF,OAAO,CAACtC,EAAG4B,CAAAA,GAAG,CAAC5B,EAAGuB,CAAAA,GAAG,CAACvB,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACC,CAAC,EAAE,IAAI,CAACD,CAAC,CAACC,CAAC,EAAE,CAAA,CAAA,EAAI,CAAI,CAAA,EAAA,YAAA,CAAA,CAAA;AAChE,iBAAA,CAAA;gBACA1C,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,GAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACvB,CAAC,EAAE,IAAI,CAACuB,CAAC,CAACC,CAAC,EAAE,aAAC,CAAA,CAAA;AAC3C,iBAAA,CAAA;gBACA1C,EAAGkC,CAAAA,IAAI,CAAC,IAAM,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,GAAA;iBAAK,EAAE,WAAA;AAC5B,oBAAA,IAAI,CAACF,OAAO,CAACtC,EAAG4B,CAAAA,GAAG,CAAC5B,EAAGuB,CAAAA,GAAG,CAACvB,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAACa,CAAC,CAACvB,CAAC,EAAE,IAAI,CAACuB,CAAC,CAACvB,CAAC,CAAA,EAAGlB,EAAG4B,CAAAA,GAAG,CAAC,IAAI,CAACa,CAAC,CAACrB,CAAC,EAAE,IAAI,CAACqB,CAAC,CAACrB,CAAC,CAAI,CAAA,EAAA,YAAA,CAAA,CAAA;AACtF,iBAAA,CAAA;gBACApB,EAAGkC,CAAAA,IAAI,CAAC,WAAa,EAAA;AAAClC,oBAAAA,EAAAA,CAAGwC,IAAI,CAAC,KAAA,CAAA;AAAQxC,oBAAAA,EAAAA,CAAGe,GAAG,CAAC,GAAA;iBAAK,EAAE,WAAA;oBAClD,IAAI,CAACoB,GAAG,CAACnC,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACM,EAAE,CAAC,IAAI,CAACC,GAAG,CAAA,CAAA;qBAE5BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACS,EAAE,CAAC,IAAI,CAACF,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACU,EAAE,CAAC,IAAI,CAACH,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACW,EAAE,CAAC,IAAI,CAACJ,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACY,EAAE,CAAC,IAAI,CAACL,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACa,EAAE,CAAC,IAAI,CAACN,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACc,EAAE,CAAC,IAAI,CAACP,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACe,EAAE,CAAC,IAAI,CAACR,GAAG,CAAA,CAAA;qBAE9BC,CAAAA,CAAAA,OAAO,CAAC9C,EAAGoC,CAAAA,KAAK,CAAC,IAAI,CAACO,CAAC,EAAE,CAAI,CAAA,EAAA,WAAA;wBAC5B,IAAI,CAACL,OAAO,CAAC,IAAI,CAACgB,EAAE,CAAC,IAAI,CAACT,GAAG,CAAA,CAAA;AAC/B,qBAAA,CAAA,CACCU,KAAK,CAAC,WAAA;wBACL,IAAI,CAACjB,OAAO,CAAC,CAAA,CAAA;AACf,qBAAA,CAAA;AACJ,iBAAA,CAAA;AACAtC,gBAAAA,EAAAA,CAAGK,IAAI,CAAC,WAAA;AACN,oBAAA,IAAI,CAACY,EAAE,CAACuC,QAAQ,GAAGxD,EAAAA,CAAGyD,kBAAkB,CAAC,IAAI,CAAC5H,OAAO,EAAE,IAAI,CAACoE,OAAO,CAACM,SAAS,EAAE,GAAGmD,GAAG;AACrF,oBAAA,IAAI,CAACzC,EAAE,CAAC0C,UAAU,GAAG,IAAI,CAACC,oBAAoB,CAAC,IAAI,CAAC3D,OAAO,CAACa,OAAO,CAAA;AACnE,oBAAA,IAAI,CAACG,EAAE,CAAC4C,EAAE,GAAG,IAAI,CAACC,SAAS,CAAC,IAAI,CAAC7D,OAAO,CAACM,SAAS,EAAE,IAAI,CAACN,OAAO,CAACa,OAAO,CAAA;AACxE,oBAAA,IAAI,CAACR,QAAQ,CAACwB,KAAK,GAAG9B,EAAGG,CAAAA,IAAI,CAC3BH,EAAAA,CAAG4B,GAAG,CAAC,IAAI,CAAC4B,QAAQ,EAAE,IAAI,CAACK,EAAE,EAAE,IAAI,CAAC5D,OAAO,CAACQ,MAAM,EAAE,IAAI,CAACkD,UAAU,EAAE,IAAI,CAAC1B,KAAK,CAC/E,EAAA,CAAA,CAAA;AAEJ,iBAAA,CAAA;AACF;AACF,SAAA,CAAA;AACApC,QAAAA,OAAAA,CAAQkE,IAAI,GAAG,+BAAA;QACf,OAAOlE,OAAAA;AACT;AACF;;;;"}
@@ -0,0 +1,170 @@
1
+ import { getDevice } from '../../app/api.js';
2
+
3
+ let foamTexture = null;
4
+ /** Texels along each side of the default foam texture. */ const FOAM_TEXTURE_SIZE = 256;
5
+ /**
6
+ * Bubbles of the default foam texture: cells of a Worley basis across the
7
+ * tile at two scales, the larger the stronger, and the width of their rims
8
+ * in cell spacings.
9
+ */ const FOAM_BUBBLES_COARSE = 12;
10
+ const FOAM_BUBBLES_FINE = 27;
11
+ const FOAM_RIM_WIDTH = 0.18;
12
+ /** Clumps of the default foam texture: value noise cells across the tile, and their share of the value. */ const FOAM_CLUMPS = 4;
13
+ const FOAM_CLUMP_WEIGHT = 0.5;
14
+ /**
15
+ * Grey levels of Crest's default foam texture (Foam2.png, Wave Harmonic, MIT)
16
+ * at every sixteenth of its texels in order, darkest to brightest. The
17
+ * default texture is remapped to them rank for rank, so a foam density
18
+ * uncovers as much of it as of Crest's.
19
+ */ const FOAM_LEVELS = [
20
+ 0.0,
21
+ 0.455,
22
+ 0.51,
23
+ 0.557,
24
+ 0.596,
25
+ 0.631,
26
+ 0.655,
27
+ 0.675,
28
+ 0.694,
29
+ 0.71,
30
+ 0.722,
31
+ 0.737,
32
+ 0.753,
33
+ 0.769,
34
+ 0.796,
35
+ 0.839,
36
+ 0.98
37
+ ];
38
+ /** Deterministic hash of integer lattice coordinates to [0, 1). */ function hash2(x, y, seed) {
39
+ let h = Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9);
40
+ h = Math.imul(h ^ h >>> 15, 0x85ebca6b);
41
+ h = Math.imul(h ^ h >>> 13, 0xc2b2ae35);
42
+ return ((h ^ h >>> 16) >>> 0) / 4294967296;
43
+ }
44
+ /**
45
+ * Worley's cellular basis (Worley, "A Cellular Texture Basis Function",
46
+ * SIGGRAPH 1996) on a lattice of `cells` across a unit tile, wrapping so the
47
+ * tile repeats: the distances F1 and F2 from (u, v) to the nearest and second
48
+ * nearest feature point, one per cell, in cell spacings.
49
+ */ function worley(u, v, cells, seed) {
50
+ const x = u * cells;
51
+ const y = v * cells;
52
+ const cx = Math.floor(x);
53
+ const cy = Math.floor(y);
54
+ let f1 = 1e9;
55
+ let f2 = 1e9;
56
+ for(let j = -1; j <= 1; j++){
57
+ for(let i = -1; i <= 1; i++){
58
+ const gx = cx + i;
59
+ const gy = cy + j;
60
+ const wx = (gx % cells + cells) % cells;
61
+ const wy = (gy % cells + cells) % cells;
62
+ const dx = gx + hash2(wx, wy, seed) - x;
63
+ const dy = gy + hash2(wx, wy, seed + 1) - y;
64
+ const d = Math.sqrt(dx * dx + dy * dy);
65
+ if (d < f1) {
66
+ f2 = f1;
67
+ f1 = d;
68
+ } else if (d < f2) {
69
+ f2 = d;
70
+ }
71
+ }
72
+ }
73
+ return [
74
+ f1,
75
+ f2
76
+ ];
77
+ }
78
+ /** Smoothly interpolated value noise on a lattice of `cells` across a unit tile, wrapping. */ function tiledValueNoise(u, v, cells, seed) {
79
+ const x = u * cells;
80
+ const y = v * cells;
81
+ const cx = Math.floor(x);
82
+ const cy = Math.floor(y);
83
+ const fx = x - cx;
84
+ const fy = y - cy;
85
+ const sx = fx * fx * (3 - 2 * fx);
86
+ const sy = fy * fy * (3 - 2 * fy);
87
+ const at = (i, j)=>hash2(((cx + i) % cells + cells) % cells, ((cy + j) % cells + cells) % cells, seed);
88
+ const a = at(0, 0) + (at(1, 0) - at(0, 0)) * sx;
89
+ const b = at(0, 1) + (at(1, 1) - at(0, 1)) * sx;
90
+ return a + (b - a) * sy;
91
+ }
92
+ /** Smoothstep falloff of a value: 1 at 0, 0 from `width` on. */ function rim(d, width) {
93
+ const t = Math.min(Math.max(d / width, 0), 1);
94
+ return 1 - t * t * (3 - 2 * t);
95
+ }
96
+ /**
97
+ * Default foam texture: a tile of bubbles, cells of Worley's basis at two
98
+ * scales whose walls (where F2 - F1, the distance to the edge between two
99
+ * cells, is small) are bright and whose middles dark, over clumps of value
100
+ * noise, its grey levels those of Crest's default foam texture (see
101
+ * FOAM_LEVELS). Value in the red channel.
102
+ *
103
+ * @internal
104
+ */ function getDefaultFoamTexture() {
105
+ if (!foamTexture) {
106
+ const n = FOAM_TEXTURE_SIZE;
107
+ const values = new Float32Array(n * n);
108
+ for(let y = 0; y < n; y++){
109
+ for(let x = 0; x < n; x++){
110
+ const u = (x + 0.5) / n;
111
+ const v = (y + 0.5) / n;
112
+ const [c1, c2] = worley(u, v, FOAM_BUBBLES_COARSE, 11);
113
+ const [f1, f2] = worley(u, v, FOAM_BUBBLES_FINE, 23);
114
+ const bubbles = 0.65 * rim(c2 - c1, FOAM_RIM_WIDTH) + 0.35 * rim(f2 - f1, FOAM_RIM_WIDTH);
115
+ const clumps = 0.65 * tiledValueNoise(u, v, FOAM_CLUMPS, 37) + 0.35 * tiledValueNoise(u, v, FOAM_CLUMPS * 2, 41);
116
+ values[y * n + x] = FOAM_CLUMP_WEIGHT * clumps + (1 - FOAM_CLUMP_WEIGHT) * bubbles;
117
+ }
118
+ }
119
+ // Rank for rank onto Crest's grey levels
120
+ const order = Array.from(values.keys()).sort((a, b)=>values[a] - values[b]);
121
+ const data = new Uint8Array(n * n * 4);
122
+ const last = FOAM_LEVELS.length - 1;
123
+ order.forEach((texel, rank)=>{
124
+ const t = rank / (order.length - 1) * last;
125
+ const k = Math.min(Math.floor(t), last - 1);
126
+ const level = FOAM_LEVELS[k] + (FOAM_LEVELS[k + 1] - FOAM_LEVELS[k]) * (t - k);
127
+ const o = texel * 4;
128
+ data[o] = data[o + 1] = data[o + 2] = Math.round(level * 255);
129
+ data[o + 3] = 255;
130
+ });
131
+ foamTexture = getDevice().createTexture2D('rgba8unorm', n, n);
132
+ foamTexture.name = '@WaterFoam';
133
+ foamTexture.update(data, 0, 0, n, n);
134
+ foamTexture.generateMipmaps();
135
+ }
136
+ return foamTexture;
137
+ }
138
+ /**
139
+ * Samples a foam texture at `uv`, filtered with the screen gradients of the
140
+ * world XZ it was taken from; its value is the red channel.
141
+ * @param uvScale - uv per metre of world XZ.
142
+ * @param mipScale - Factor on the filter footprint, above 1 to blur.
143
+ * @param withSlope - Also take the slope of the value, by differencing a texel
144
+ * along u and v.
145
+ * @returns (value, its slope along world x, along world z), slopes per metre,
146
+ * 0 without `withSlope`
147
+ * @internal
148
+ */ function sampleFoamTexture(scope, tex, uv, xzGrad, uvScale, mipScale = 1, withSlope = true) {
149
+ const pb = scope.$builder;
150
+ const dx = pb.mul(xzGrad.xy, uvScale, mipScale);
151
+ const dy = pb.mul(xzGrad.zw, uvScale, mipScale);
152
+ const s0 = pb.textureSampleGrad(tex, uv, dx, dy).r;
153
+ if (!withSlope) {
154
+ return pb.vec3(s0, 0, 0);
155
+ }
156
+ const texel = pb.div(pb.vec2(1), pb.vec2(pb.textureDimensions(tex, 0)));
157
+ const su = pb.textureSampleGrad(tex, pb.add(uv, pb.vec2(texel.x, 0)), dx, dy).r;
158
+ const sv = pb.textureSampleGrad(tex, pb.add(uv, pb.vec2(0, texel.y)), dx, dy).r;
159
+ return pb.vec3(s0, pb.mul(pb.div(pb.vec2(pb.sub(su, s0), pb.sub(sv, s0)), texel), uvScale));
160
+ }
161
+ /**
162
+ * Metres of world XZ per texel of a foam texture, at `uvScale` uv per metre.
163
+ * @internal
164
+ */ function foamTexelSize(scope, tex, uvScale) {
165
+ const pb = scope.$builder;
166
+ return pb.div(1, pb.mul(uvScale, pb.float(pb.textureDimensions(tex, 0).x)));
167
+ }
168
+
169
+ export { foamTexelSize, getDefaultFoamTexture, sampleFoamTexture };
170
+ //# sourceMappingURL=foam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foam.js","sources":["../../../src/utility/textures/foam.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, Texture2D } from '@zephyr3d/device';\r\nimport { getDevice } from '../../app/api';\r\n\r\nlet foamTexture: Texture2D | null = null;\r\n\r\n/** Texels along each side of the default foam texture. */\r\nconst FOAM_TEXTURE_SIZE = 256;\r\n/**\r\n * Bubbles of the default foam texture: cells of a Worley basis across the\r\n * tile at two scales, the larger the stronger, and the width of their rims\r\n * in cell spacings.\r\n */\r\nconst FOAM_BUBBLES_COARSE = 12;\r\nconst FOAM_BUBBLES_FINE = 27;\r\nconst FOAM_RIM_WIDTH = 0.18;\r\n/** Clumps of the default foam texture: value noise cells across the tile, and their share of the value. */\r\nconst FOAM_CLUMPS = 4;\r\nconst FOAM_CLUMP_WEIGHT = 0.5;\r\n/**\r\n * Grey levels of Crest's default foam texture (Foam2.png, Wave Harmonic, MIT)\r\n * at every sixteenth of its texels in order, darkest to brightest. The\r\n * default texture is remapped to them rank for rank, so a foam density\r\n * uncovers as much of it as of Crest's.\r\n */\r\nconst FOAM_LEVELS = [\r\n 0.0, 0.455, 0.51, 0.557, 0.596, 0.631, 0.655, 0.675, 0.694, 0.71, 0.722, 0.737, 0.753, 0.769, 0.796, 0.839,\r\n 0.98\r\n];\r\n\r\n/** Deterministic hash of integer lattice coordinates to [0, 1). */\r\nfunction hash2(x: number, y: number, seed: number) {\r\n let h = Math.imul(x, 0x27d4eb2d) ^ Math.imul(y, 0x165667b1) ^ Math.imul(seed, 0x9e3779b9);\r\n h = Math.imul(h ^ (h >>> 15), 0x85ebca6b);\r\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35);\r\n return ((h ^ (h >>> 16)) >>> 0) / 4294967296;\r\n}\r\n\r\n/**\r\n * Worley's cellular basis (Worley, \"A Cellular Texture Basis Function\",\r\n * SIGGRAPH 1996) on a lattice of `cells` across a unit tile, wrapping so the\r\n * tile repeats: the distances F1 and F2 from (u, v) to the nearest and second\r\n * nearest feature point, one per cell, in cell spacings.\r\n */\r\nfunction worley(u: number, v: number, cells: number, seed: number): [number, number] {\r\n const x = u * cells;\r\n const y = v * cells;\r\n const cx = Math.floor(x);\r\n const cy = Math.floor(y);\r\n let f1 = 1e9;\r\n let f2 = 1e9;\r\n for (let j = -1; j <= 1; j++) {\r\n for (let i = -1; i <= 1; i++) {\r\n const gx = cx + i;\r\n const gy = cy + j;\r\n const wx = ((gx % cells) + cells) % cells;\r\n const wy = ((gy % cells) + cells) % cells;\r\n const dx = gx + hash2(wx, wy, seed) - x;\r\n const dy = gy + hash2(wx, wy, seed + 1) - y;\r\n const d = Math.sqrt(dx * dx + dy * dy);\r\n if (d < f1) {\r\n f2 = f1;\r\n f1 = d;\r\n } else if (d < f2) {\r\n f2 = d;\r\n }\r\n }\r\n }\r\n return [f1, f2];\r\n}\r\n\r\n/** Smoothly interpolated value noise on a lattice of `cells` across a unit tile, wrapping. */\r\nfunction tiledValueNoise(u: number, v: number, cells: number, seed: number) {\r\n const x = u * cells;\r\n const y = v * cells;\r\n const cx = Math.floor(x);\r\n const cy = Math.floor(y);\r\n const fx = x - cx;\r\n const fy = y - cy;\r\n const sx = fx * fx * (3 - 2 * fx);\r\n const sy = fy * fy * (3 - 2 * fy);\r\n const at = (i: number, j: number) =>\r\n hash2((((cx + i) % cells) + cells) % cells, (((cy + j) % cells) + cells) % cells, seed);\r\n const a = at(0, 0) + (at(1, 0) - at(0, 0)) * sx;\r\n const b = at(0, 1) + (at(1, 1) - at(0, 1)) * sx;\r\n return a + (b - a) * sy;\r\n}\r\n\r\n/** Smoothstep falloff of a value: 1 at 0, 0 from `width` on. */\r\nfunction rim(d: number, width: number) {\r\n const t = Math.min(Math.max(d / width, 0), 1);\r\n return 1 - t * t * (3 - 2 * t);\r\n}\r\n\r\n/**\r\n * Default foam texture: a tile of bubbles, cells of Worley's basis at two\r\n * scales whose walls (where F2 - F1, the distance to the edge between two\r\n * cells, is small) are bright and whose middles dark, over clumps of value\r\n * noise, its grey levels those of Crest's default foam texture (see\r\n * FOAM_LEVELS). Value in the red channel.\r\n *\r\n * @internal\r\n */\r\nexport function getDefaultFoamTexture() {\r\n if (!foamTexture) {\r\n const n = FOAM_TEXTURE_SIZE;\r\n const values = new Float32Array(n * n);\r\n for (let y = 0; y < n; y++) {\r\n for (let x = 0; x < n; x++) {\r\n const u = (x + 0.5) / n;\r\n const v = (y + 0.5) / n;\r\n const [c1, c2] = worley(u, v, FOAM_BUBBLES_COARSE, 11);\r\n const [f1, f2] = worley(u, v, FOAM_BUBBLES_FINE, 23);\r\n const bubbles = 0.65 * rim(c2 - c1, FOAM_RIM_WIDTH) + 0.35 * rim(f2 - f1, FOAM_RIM_WIDTH);\r\n const clumps =\r\n 0.65 * tiledValueNoise(u, v, FOAM_CLUMPS, 37) + 0.35 * tiledValueNoise(u, v, FOAM_CLUMPS * 2, 41);\r\n values[y * n + x] = FOAM_CLUMP_WEIGHT * clumps + (1 - FOAM_CLUMP_WEIGHT) * bubbles;\r\n }\r\n }\r\n // Rank for rank onto Crest's grey levels\r\n const order = Array.from(values.keys()).sort((a, b) => values[a] - values[b]);\r\n const data = new Uint8Array(n * n * 4);\r\n const last = FOAM_LEVELS.length - 1;\r\n order.forEach((texel, rank) => {\r\n const t = (rank / (order.length - 1)) * last;\r\n const k = Math.min(Math.floor(t), last - 1);\r\n const level = FOAM_LEVELS[k] + (FOAM_LEVELS[k + 1] - FOAM_LEVELS[k]) * (t - k);\r\n const o = texel * 4;\r\n data[o] = data[o + 1] = data[o + 2] = Math.round(level * 255);\r\n data[o + 3] = 255;\r\n });\r\n foamTexture = getDevice().createTexture2D('rgba8unorm', n, n)!;\r\n foamTexture.name = '@WaterFoam';\r\n foamTexture.update(data, 0, 0, n, n);\r\n foamTexture.generateMipmaps();\r\n }\r\n return foamTexture;\r\n}\r\n\r\n/**\r\n * Samples a foam texture at `uv`, filtered with the screen gradients of the\r\n * world XZ it was taken from; its value is the red channel.\r\n * @param uvScale - uv per metre of world XZ.\r\n * @param mipScale - Factor on the filter footprint, above 1 to blur.\r\n * @param withSlope - Also take the slope of the value, by differencing a texel\r\n * along u and v.\r\n * @returns (value, its slope along world x, along world z), slopes per metre,\r\n * 0 without `withSlope`\r\n * @internal\r\n */\r\nexport function sampleFoamTexture(\r\n scope: PBInsideFunctionScope,\r\n tex: PBShaderExp,\r\n uv: PBShaderExp,\r\n xzGrad: PBShaderExp,\r\n uvScale: number | PBShaderExp,\r\n mipScale = 1,\r\n withSlope = true\r\n): PBShaderExp {\r\n const pb = scope.$builder;\r\n const dx = pb.mul(xzGrad.xy, uvScale, mipScale);\r\n const dy = pb.mul(xzGrad.zw, uvScale, mipScale);\r\n const s0 = pb.textureSampleGrad(tex, uv, dx, dy).r;\r\n if (!withSlope) {\r\n return pb.vec3(s0, 0, 0);\r\n }\r\n const texel = pb.div(pb.vec2(1), pb.vec2(pb.textureDimensions(tex, 0)));\r\n const su = pb.textureSampleGrad(tex, pb.add(uv, pb.vec2(texel.x, 0)), dx, dy).r;\r\n const sv = pb.textureSampleGrad(tex, pb.add(uv, pb.vec2(0, texel.y)), dx, dy).r;\r\n return pb.vec3(s0, pb.mul(pb.div(pb.vec2(pb.sub(su, s0), pb.sub(sv, s0)), texel), uvScale));\r\n}\r\n\r\n/**\r\n * Metres of world XZ per texel of a foam texture, at `uvScale` uv per metre.\r\n * @internal\r\n */\r\nexport function foamTexelSize(scope: PBInsideFunctionScope, tex: PBShaderExp, uvScale: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.div(1, pb.mul(uvScale, pb.float(pb.textureDimensions(tex, 0).x)));\r\n}\r\n"],"names":["foamTexture","FOAM_TEXTURE_SIZE","FOAM_BUBBLES_COARSE","FOAM_BUBBLES_FINE","FOAM_RIM_WIDTH","FOAM_CLUMPS","FOAM_CLUMP_WEIGHT","FOAM_LEVELS","hash2","x","y","seed","h","Math","imul","worley","u","v","cells","cx","floor","cy","f1","f2","j","i","gx","gy","wx","wy","dx","dy","d","sqrt","tiledValueNoise","fx","fy","sx","sy","at","a","b","rim","width","t","min","max","getDefaultFoamTexture","n","values","Float32Array","c1","c2","bubbles","clumps","order","Array","from","keys","sort","data","Uint8Array","last","length","forEach","texel","rank","k","level","o","round","getDevice","createTexture2D","name","update","generateMipmaps","sampleFoamTexture","scope","tex","uv","xzGrad","uvScale","mipScale","withSlope","pb","$builder","mul","xy","zw","s0","textureSampleGrad","r","vec3","div","vec2","textureDimensions","su","add","sv","sub","foamTexelSize","float"],"mappings":";;AAGA,IAAIA,WAAgC,GAAA,IAAA;AAEpC,2DACA,MAAMC,iBAAoB,GAAA,GAAA;AAC1B;;;;AAIC,IACD,MAAMC,mBAAsB,GAAA,EAAA;AAC5B,MAAMC,iBAAoB,GAAA,EAAA;AAC1B,MAAMC,cAAiB,GAAA,IAAA;AACvB,4GACA,MAAMC,WAAc,GAAA,CAAA;AACpB,MAAMC,iBAAoB,GAAA,GAAA;AAC1B;;;;;AAKC,IACD,MAAMC,WAAc,GAAA;AAClB,IAAA,GAAA;AAAK,IAAA,KAAA;AAAO,IAAA,IAAA;AAAM,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,IAAA;AAAM,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AACrG,IAAA;AACD,CAAA;AAED,oEACA,SAASC,KAAAA,CAAMC,CAAS,EAAEC,CAAS,EAAEC,IAAY,EAAA;AAC/C,IAAA,IAAIC,CAAIC,GAAAA,IAAAA,CAAKC,IAAI,CAACL,GAAG,UAAcI,CAAAA,GAAAA,IAAAA,CAAKC,IAAI,CAACJ,CAAG,EAAA,UAAA,CAAA,GAAcG,IAAKC,CAAAA,IAAI,CAACH,IAAM,EAAA,UAAA,CAAA;AAC9EC,IAAAA,CAAAA,GAAIC,IAAKC,CAAAA,IAAI,CAACF,CAAAA,GAAKA,MAAM,EAAK,EAAA,UAAA,CAAA;AAC9BA,IAAAA,CAAAA,GAAIC,IAAKC,CAAAA,IAAI,CAACF,CAAAA,GAAKA,MAAM,EAAK,EAAA,UAAA,CAAA;IAC9B,OAAQ,CAAA,CAACA,IAAKA,CAAM,KAAA,EAAE,MAAO,CAAA,IAAK,UAAA;AACpC;AAEA;;;;;IAMA,SAASG,OAAOC,CAAS,EAAEC,CAAS,EAAEC,KAAa,EAAEP,IAAY,EAAA;AAC/D,IAAA,MAAMF,IAAIO,CAAIE,GAAAA,KAAAA;AACd,IAAA,MAAMR,IAAIO,CAAIC,GAAAA,KAAAA;IACd,MAAMC,EAAAA,GAAKN,IAAKO,CAAAA,KAAK,CAACX,CAAAA,CAAAA;IACtB,MAAMY,EAAAA,GAAKR,IAAKO,CAAAA,KAAK,CAACV,CAAAA,CAAAA;AACtB,IAAA,IAAIY,EAAK,GAAA,GAAA;AACT,IAAA,IAAIC,EAAK,GAAA,GAAA;AACT,IAAA,IAAK,IAAIC,CAAI,GAAA,EAAIA,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;AAC5B,QAAA,IAAK,IAAIC,CAAI,GAAA,EAAIA,EAAAA,CAAAA,IAAK,GAAGA,CAAK,EAAA,CAAA;AAC5B,YAAA,MAAMC,KAAKP,EAAKM,GAAAA,CAAAA;AAChB,YAAA,MAAME,KAAKN,EAAKG,GAAAA,CAAAA;AAChB,YAAA,MAAMI,KAAK,CAAC,EAAMV,GAAAA,KAAAA,GAASA,KAAI,IAAKA,KAAAA;AACpC,YAAA,MAAMW,KAAK,CAAC,EAAMX,GAAAA,KAAAA,GAASA,KAAI,IAAKA,KAAAA;AACpC,YAAA,MAAMY,EAAKJ,GAAAA,EAAAA,GAAKlB,KAAMoB,CAAAA,EAAAA,EAAIC,IAAIlB,IAAQF,CAAAA,GAAAA,CAAAA;AACtC,YAAA,MAAMsB,KAAKJ,EAAKnB,GAAAA,KAAAA,CAAMoB,EAAIC,EAAAA,EAAAA,EAAIlB,OAAO,CAAKD,CAAAA,GAAAA,CAAAA;AAC1C,YAAA,MAAMsB,IAAInB,IAAKoB,CAAAA,IAAI,CAACH,EAAAA,GAAKA,KAAKC,EAAKA,GAAAA,EAAAA,CAAAA;AACnC,YAAA,IAAIC,IAAIV,EAAI,EAAA;gBACVC,EAAKD,GAAAA,EAAAA;gBACLA,EAAKU,GAAAA,CAAAA;aACA,MAAA,IAAIA,IAAIT,EAAI,EAAA;gBACjBA,EAAKS,GAAAA,CAAAA;AACP;AACF;AACF;IACA,OAAO;AAACV,QAAAA,EAAAA;AAAIC,QAAAA;AAAG,KAAA;AACjB;AAEA,+FACA,SAASW,eAAgBlB,CAAAA,CAAS,EAAEC,CAAS,EAAEC,KAAa,EAAEP,IAAY,EAAA;AACxE,IAAA,MAAMF,IAAIO,CAAIE,GAAAA,KAAAA;AACd,IAAA,MAAMR,IAAIO,CAAIC,GAAAA,KAAAA;IACd,MAAMC,EAAAA,GAAKN,IAAKO,CAAAA,KAAK,CAACX,CAAAA,CAAAA;IACtB,MAAMY,EAAAA,GAAKR,IAAKO,CAAAA,KAAK,CAACV,CAAAA,CAAAA;AACtB,IAAA,MAAMyB,KAAK1B,CAAIU,GAAAA,EAAAA;AACf,IAAA,MAAMiB,KAAK1B,CAAIW,GAAAA,EAAAA;AACf,IAAA,MAAMgB,KAAKF,EAAKA,GAAAA,EAAAA,IAAM,CAAA,GAAI,IAAIA,EAAC,CAAA;AAC/B,IAAA,MAAMG,KAAKF,EAAKA,GAAAA,EAAAA,IAAM,CAAA,GAAI,IAAIA,EAAC,CAAA;IAC/B,MAAMG,EAAAA,GAAK,CAACd,CAAAA,EAAWD,CACrBhB,GAAAA,KAAAA,CAAM,CAAC,CAAEW,EAAKM,GAAAA,CAAAA,IAAKP,KAAAA,GAASA,KAAI,IAAKA,KAAAA,EAAO,CAAC,CAAEG,EAAKG,GAAAA,CAAAA,IAAKN,KAAAA,GAASA,KAAI,IAAKA,KAAOP,EAAAA,IAAAA,CAAAA;AACpF,IAAA,MAAM6B,CAAID,GAAAA,EAAAA,CAAG,CAAG,EAAA,CAAA,CAAA,GAAK,CAACA,EAAG,CAAA,CAAA,EAAG,CAAKA,CAAAA,GAAAA,EAAAA,CAAG,CAAG,EAAA,CAAA,CAAC,IAAKF,EAAAA;AAC7C,IAAA,MAAMI,CAAIF,GAAAA,EAAAA,CAAG,CAAG,EAAA,CAAA,CAAA,GAAK,CAACA,EAAG,CAAA,CAAA,EAAG,CAAKA,CAAAA,GAAAA,EAAAA,CAAG,CAAG,EAAA,CAAA,CAAC,IAAKF,EAAAA;AAC7C,IAAA,OAAOG,CAAI,GAACC,CAAAA,CAAAA,GAAID,CAAAA,IAAKF,EAAAA;AACvB;AAEA,iEACA,SAASI,GAAIV,CAAAA,CAAS,EAAEW,KAAa,EAAA;IACnC,MAAMC,CAAAA,GAAI/B,KAAKgC,GAAG,CAAChC,KAAKiC,GAAG,CAACd,CAAIW,GAAAA,KAAAA,EAAO,CAAI,CAAA,EAAA,CAAA,CAAA;AAC3C,IAAA,OAAO,IAAIC,CAAIA,GAAAA,CAAAA,IAAK,CAAA,GAAI,IAAIA,CAAAA,CAAAA;AAC9B;AAEA;;;;;;;;AAQC,IACM,SAASG,qBAAAA,GAAAA;AACd,IAAA,IAAI,CAAC/C,WAAa,EAAA;AAChB,QAAA,MAAMgD,CAAI/C,GAAAA,iBAAAA;QACV,MAAMgD,MAAAA,GAAS,IAAIC,YAAAA,CAAaF,CAAIA,GAAAA,CAAAA,CAAAA;AACpC,QAAA,IAAK,IAAItC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIsC,GAAGtC,CAAK,EAAA,CAAA;AAC1B,YAAA,IAAK,IAAID,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIuC,GAAGvC,CAAK,EAAA,CAAA;AAC1B,gBAAA,MAAMO,CAAI,GAACP,CAAAA,CAAAA,GAAI,GAAE,IAAKuC,CAAAA;AACtB,gBAAA,MAAM/B,CAAI,GAACP,CAAAA,CAAAA,GAAI,GAAE,IAAKsC,CAAAA;AACtB,gBAAA,MAAM,CAACG,EAAIC,EAAAA,EAAAA,CAAG,GAAGrC,MAAOC,CAAAA,CAAAA,EAAGC,GAAGf,mBAAqB,EAAA,EAAA,CAAA;AACnD,gBAAA,MAAM,CAACoB,EAAIC,EAAAA,EAAAA,CAAG,GAAGR,MAAOC,CAAAA,CAAAA,EAAGC,GAAGd,iBAAmB,EAAA,EAAA,CAAA;gBACjD,MAAMkD,OAAAA,GAAU,OAAOX,GAAIU,CAAAA,EAAAA,GAAKD,IAAI/C,cAAkB,CAAA,GAAA,IAAA,GAAOsC,GAAInB,CAAAA,EAAAA,GAAKD,EAAIlB,EAAAA,cAAAA,CAAAA;AAC1E,gBAAA,MAAMkD,MACJ,GAAA,IAAA,GAAOpB,eAAgBlB,CAAAA,CAAAA,EAAGC,CAAGZ,EAAAA,WAAAA,EAAa,EAAM,CAAA,GAAA,IAAA,GAAO6B,eAAgBlB,CAAAA,CAAAA,EAAGC,CAAGZ,EAAAA,WAAAA,GAAc,CAAG,EAAA,EAAA,CAAA;gBAChG4C,MAAM,CAACvC,CAAIsC,GAAAA,CAAAA,GAAIvC,CAAE,CAAA,GAAGH,iBAAoBgD,GAAAA,MAAAA,GAAS,CAAC,CAAIhD,GAAAA,iBAAgB,IAAK+C,OAAAA;AAC7E;AACF;;AAEA,QAAA,MAAME,QAAQC,KAAMC,CAAAA,IAAI,CAACR,MAAOS,CAAAA,IAAI,IAAIC,IAAI,CAAC,CAACnB,CAAAA,EAAGC,IAAMQ,MAAM,CAACT,EAAE,GAAGS,MAAM,CAACR,CAAE,CAAA,CAAA;AAC5E,QAAA,MAAMmB,IAAO,GAAA,IAAIC,UAAWb,CAAAA,CAAAA,GAAIA,CAAI,GAAA,CAAA,CAAA;QACpC,MAAMc,IAAAA,GAAOvD,WAAYwD,CAAAA,MAAM,GAAG,CAAA;QAClCR,KAAMS,CAAAA,OAAO,CAAC,CAACC,KAAOC,EAAAA,IAAAA,GAAAA;YACpB,MAAMtB,CAAAA,GAAI,IAASW,IAAAA,MAAMQ,MAAM,GAAG,CAAA,CAAMD,GAAAA,IAAAA;YACxC,MAAMK,CAAAA,GAAItD,KAAKgC,GAAG,CAAChC,KAAKO,KAAK,CAACwB,IAAIkB,IAAO,GAAA,CAAA,CAAA;AACzC,YAAA,MAAMM,QAAQ7D,WAAW,CAAC4D,EAAE,GAAI5D,CAAAA,WAAW,CAAC4D,IAAI,CAAE,CAAA,GAAG5D,WAAW,CAAC4D,CAAAA,CAAE,KAAKvB,IAAIuB,CAAAA,CAAAA;AAC5E,YAAA,MAAME,IAAIJ,KAAQ,GAAA,CAAA;AAClBL,YAAAA,IAAI,CAACS,CAAE,CAAA,GAAGT,IAAI,CAACS,IAAI,CAAE,CAAA,GAAGT,IAAI,CAACS,IAAI,CAAE,CAAA,GAAGxD,IAAKyD,CAAAA,KAAK,CAACF,KAAQ,GAAA,GAAA,CAAA;YACzDR,IAAI,CAACS,CAAI,GAAA,CAAA,CAAE,GAAG,GAAA;AAChB,SAAA,CAAA;AACArE,QAAAA,WAAAA,GAAcuE,SAAYC,EAAAA,CAAAA,eAAe,CAAC,YAAA,EAAcxB,CAAGA,EAAAA,CAAAA,CAAAA;AAC3DhD,QAAAA,WAAAA,CAAYyE,IAAI,GAAG,YAAA;AACnBzE,QAAAA,WAAAA,CAAY0E,MAAM,CAACd,IAAM,EAAA,CAAA,EAAG,GAAGZ,CAAGA,EAAAA,CAAAA,CAAAA;AAClChD,QAAAA,WAAAA,CAAY2E,eAAe,EAAA;AAC7B;IACA,OAAO3E,WAAAA;AACT;AAEA;;;;;;;;;;AAUC,IACM,SAAS4E,iBAAAA,CACdC,KAA4B,EAC5BC,GAAgB,EAChBC,EAAe,EACfC,MAAmB,EACnBC,OAA6B,EAC7BC,WAAW,CAAC,EACZC,YAAY,IAAI,EAAA;IAEhB,MAAMC,EAAAA,GAAKP,MAAMQ,QAAQ;AACzB,IAAA,MAAMvD,KAAKsD,EAAGE,CAAAA,GAAG,CAACN,MAAOO,CAAAA,EAAE,EAAEN,OAASC,EAAAA,QAAAA,CAAAA;AACtC,IAAA,MAAMnD,KAAKqD,EAAGE,CAAAA,GAAG,CAACN,MAAOQ,CAAAA,EAAE,EAAEP,OAASC,EAAAA,QAAAA,CAAAA;IACtC,MAAMO,EAAAA,GAAKL,GAAGM,iBAAiB,CAACZ,KAAKC,EAAIjD,EAAAA,EAAAA,EAAIC,IAAI4D,CAAC;AAClD,IAAA,IAAI,CAACR,SAAW,EAAA;AACd,QAAA,OAAOC,EAAGQ,CAAAA,IAAI,CAACH,EAAAA,EAAI,CAAG,EAAA,CAAA,CAAA;AACxB;AACA,IAAA,MAAMxB,KAAQmB,GAAAA,EAAAA,CAAGS,GAAG,CAACT,GAAGU,IAAI,CAAC,CAAIV,CAAAA,EAAAA,EAAAA,CAAGU,IAAI,CAACV,EAAGW,CAAAA,iBAAiB,CAACjB,GAAK,EAAA,CAAA,CAAA,CAAA,CAAA;AACnE,IAAA,MAAMkB,KAAKZ,EAAGM,CAAAA,iBAAiB,CAACZ,GAAKM,EAAAA,EAAAA,CAAGa,GAAG,CAAClB,EAAAA,EAAIK,EAAGU,CAAAA,IAAI,CAAC7B,KAAMxD,CAAAA,CAAC,EAAE,CAAKqB,CAAAA,CAAAA,EAAAA,EAAAA,EAAIC,IAAI4D,CAAC;AAC/E,IAAA,MAAMO,KAAKd,EAAGM,CAAAA,iBAAiB,CAACZ,GAAKM,EAAAA,EAAAA,CAAGa,GAAG,CAAClB,EAAAA,EAAIK,EAAGU,CAAAA,IAAI,CAAC,CAAG7B,EAAAA,KAAAA,CAAMvD,CAAC,CAAIoB,CAAAA,EAAAA,EAAAA,EAAIC,IAAI4D,CAAC;IAC/E,OAAOP,EAAAA,CAAGQ,IAAI,CAACH,EAAAA,EAAIL,GAAGE,GAAG,CAACF,EAAGS,CAAAA,GAAG,CAACT,EAAAA,CAAGU,IAAI,CAACV,EAAAA,CAAGe,GAAG,CAACH,EAAIP,EAAAA,EAAAA,CAAAA,EAAKL,GAAGe,GAAG,CAACD,EAAIT,EAAAA,EAAAA,CAAAA,CAAAA,EAAMxB,KAAQgB,CAAAA,EAAAA,OAAAA,CAAAA,CAAAA;AACpF;AAEA;;;AAGC,IACM,SAASmB,aAAAA,CAAcvB,KAA4B,EAAEC,GAAgB,EAAEG,OAAoB,EAAA;IAChG,MAAMG,EAAAA,GAAKP,MAAMQ,QAAQ;AACzB,IAAA,OAAOD,GAAGS,GAAG,CAAC,CAAGT,EAAAA,EAAAA,CAAGE,GAAG,CAACL,OAAAA,EAASG,EAAGiB,CAAAA,KAAK,CAACjB,EAAGW,CAAAA,iBAAiB,CAACjB,GAAAA,EAAK,GAAGrE,CAAC,CAAA,CAAA,CAAA;AAC1E;;;;"}