@zephyr3d/scene 0.9.27 → 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 (502) 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 +54 -0
  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 +279 -55
  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 +171 -1
  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 +104 -178
  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 +25436 -15990
  109. package/dist/index.js +65 -11
  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/lambert.js +4 -1
  118. package/dist/material/lambert.js.map +1 -1
  119. package/dist/material/material.js +66 -4
  120. package/dist/material/material.js.map +1 -1
  121. package/dist/material/meshmaterial.js +118 -45
  122. package/dist/material/meshmaterial.js.map +1 -1
  123. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  124. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  126. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  128. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  130. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  132. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  133. package/dist/material/mixins/lit.js +191 -83
  134. package/dist/material/mixins/lit.js.map +1 -1
  135. package/dist/material/mixins/pbr/common.js +31 -206
  136. package/dist/material/mixins/pbr/common.js.map +1 -1
  137. package/dist/material/mtoon.js +1 -1
  138. package/dist/material/mtoon.js.map +1 -1
  139. package/dist/material/pbrmr.js +3 -0
  140. package/dist/material/pbrmr.js.map +1 -1
  141. package/dist/material/pbrsg.js +3 -0
  142. package/dist/material/pbrsg.js.map +1 -1
  143. package/dist/material/sdf_debug.js +78 -0
  144. package/dist/material/sdf_debug.js.map +1 -0
  145. package/dist/material/shader/helper.js +333 -191
  146. package/dist/material/shader/helper.js.map +1 -1
  147. package/dist/material/shader/terrain_blend.js +204 -43
  148. package/dist/material/shader/terrain_blend.js.map +1 -1
  149. package/dist/material/skin.js +331 -297
  150. package/dist/material/skin.js.map +1 -1
  151. package/dist/material/skinprofile.js +1058 -0
  152. package/dist/material/skinprofile.js.map +1 -0
  153. package/dist/material/sss.js +353 -0
  154. package/dist/material/sss.js.map +1 -0
  155. package/dist/material/sss_kernel.js +265 -0
  156. package/dist/material/sss_kernel.js.map +1 -0
  157. package/dist/material/sssprofile.js +879 -0
  158. package/dist/material/sssprofile.js.map +1 -0
  159. package/dist/material/subsurfaceprofile.js +4 -8
  160. package/dist/material/subsurfaceprofile.js.map +1 -1
  161. package/dist/material/terrain-cm.js +464 -188
  162. package/dist/material/terrain-cm.js.map +1 -1
  163. package/dist/material/unlit.js +3 -0
  164. package/dist/material/unlit.js.map +1 -1
  165. package/dist/material/water.js +1261 -1438
  166. package/dist/material/water.js.map +1 -1
  167. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  168. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  169. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  172. package/dist/physics/character.js +226 -0
  173. package/dist/physics/character.js.map +1 -0
  174. package/dist/physics/collider.js +209 -0
  175. package/dist/physics/collider.js.map +1 -0
  176. package/dist/physics/events.js +79 -0
  177. package/dist/physics/events.js.map +1 -0
  178. package/dist/physics/joint.js +272 -0
  179. package/dist/physics/joint.js.map +1 -0
  180. package/dist/physics/node_physics.js +234 -0
  181. package/dist/physics/node_physics.js.map +1 -0
  182. package/dist/physics/part.js +91 -0
  183. package/dist/physics/part.js.map +1 -0
  184. package/dist/physics/rigid_body.js +379 -0
  185. package/dist/physics/rigid_body.js.map +1 -0
  186. package/dist/physics/vehicle.js +335 -0
  187. package/dist/physics/vehicle.js.map +1 -0
  188. package/dist/physics/world.js +25 -0
  189. package/dist/physics/world.js.map +1 -0
  190. package/dist/posteffect/bloom.js +49 -14
  191. package/dist/posteffect/bloom.js.map +1 -1
  192. package/dist/posteffect/motionblur.js +106 -106
  193. package/dist/posteffect/motionblur.js.map +1 -1
  194. package/dist/posteffect/postsss.js +572 -0
  195. package/dist/posteffect/postsss.js.map +1 -0
  196. package/dist/posteffect/sao.js +2 -6
  197. package/dist/posteffect/sao.js.map +1 -1
  198. package/dist/posteffect/skinsss.js +605 -355
  199. package/dist/posteffect/skinsss.js.map +1 -1
  200. package/dist/posteffect/ssgi.js +91 -162
  201. package/dist/posteffect/ssgi.js.map +1 -1
  202. package/dist/posteffect/ssr.js +3 -11
  203. package/dist/posteffect/ssr.js.map +1 -1
  204. package/dist/posteffect/sss.js +4 -13
  205. package/dist/posteffect/sss.js.map +1 -1
  206. package/dist/posteffect/taa.js +1 -0
  207. package/dist/posteffect/taa.js.map +1 -1
  208. package/dist/render/abuffer_oit.js +3 -2
  209. package/dist/render/abuffer_oit.js.map +1 -1
  210. package/dist/render/clipmap.js +179 -64
  211. package/dist/render/clipmap.js.map +1 -1
  212. package/dist/render/cluster_light.js +958 -224
  213. package/dist/render/cluster_light.js.map +1 -1
  214. package/dist/render/cull_visitor.js +25 -5
  215. package/dist/render/cull_visitor.js.map +1 -1
  216. package/dist/render/debug_views.js +37 -0
  217. package/dist/render/debug_views.js.map +1 -0
  218. package/dist/render/depthpass.js +5 -1
  219. package/dist/render/depthpass.js.map +1 -1
  220. package/dist/render/drawable_mixin.js +53 -6
  221. package/dist/render/drawable_mixin.js.map +1 -1
  222. package/dist/render/dualdepthpeeling_oit.js +5 -5
  223. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  224. package/dist/render/envlight.js +196 -113
  225. package/dist/render/envlight.js.map +1 -1
  226. package/dist/render/fbm_wavegenerator.js +5 -10
  227. package/dist/render/fbm_wavegenerator.js.map +1 -1
  228. package/dist/render/fft_wavegenerator.js +247 -157
  229. package/dist/render/fft_wavegenerator.js.map +1 -1
  230. package/dist/render/gerstner_wavegenerator.js +16 -38
  231. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  232. package/dist/render/gi/probe_volume.js +1334 -0
  233. package/dist/render/gi/probe_volume.js.map +1 -0
  234. package/dist/render/gi/scene_gi.js +282 -0
  235. package/dist/render/gi/scene_gi.js.map +1 -0
  236. package/dist/render/gi/voxel_atlas.js +198 -0
  237. package/dist/render/gi/voxel_atlas.js.map +1 -0
  238. package/dist/render/gi/voxel_lighting.js +652 -0
  239. package/dist/render/gi/voxel_lighting.js.map +1 -0
  240. package/dist/render/gi/voxel_scene.js +642 -0
  241. package/dist/render/gi/voxel_scene.js.map +1 -0
  242. package/dist/render/gi/voxelize_pass.js +223 -0
  243. package/dist/render/gi/voxelize_pass.js.map +1 -0
  244. package/dist/render/globalbindgroup_allocator.js +3 -2
  245. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  246. package/dist/render/gpu_picking.js +9 -36
  247. package/dist/render/gpu_picking.js.map +1 -1
  248. package/dist/render/instance_culling.js +499 -0
  249. package/dist/render/instance_culling.js.map +1 -0
  250. package/dist/render/lightpass.js +19 -8
  251. package/dist/render/lightpass.js.map +1 -1
  252. package/dist/render/lod.js +46 -0
  253. package/dist/render/lod.js.map +1 -0
  254. package/dist/render/primitive.js +301 -9
  255. package/dist/render/primitive.js.map +1 -1
  256. package/dist/render/primitive_readback.js +209 -0
  257. package/dist/render/primitive_readback.js.map +1 -0
  258. package/dist/render/render_queue.js +162 -11
  259. package/dist/render/render_queue.js.map +1 -1
  260. package/dist/render/renderer.js +10 -7
  261. package/dist/render/renderer.js.map +1 -1
  262. package/dist/render/rendergraph/blackboard.js +14 -1
  263. package/dist/render/rendergraph/blackboard.js.map +1 -1
  264. package/dist/render/rendergraph/executor.js +136 -0
  265. package/dist/render/rendergraph/executor.js.map +1 -1
  266. package/dist/render/rendergraph/forward_plus_builder.js +272 -55
  267. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  268. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  269. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  270. package/dist/render/rendergraph/scene_render_context.js +31 -2
  271. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  272. package/dist/render/rendergraph/types.js.map +1 -1
  273. package/dist/render/renderpass.js +28 -5
  274. package/dist/render/renderpass.js.map +1 -1
  275. package/dist/render/sdf/box_allocator.js +98 -0
  276. package/dist/render/sdf/box_allocator.js.map +1 -0
  277. package/dist/render/sdf/global_sdf.js +865 -0
  278. package/dist/render/sdf/global_sdf.js.map +1 -0
  279. package/dist/render/sdf/scene_sdf.js +562 -0
  280. package/dist/render/sdf/scene_sdf.js.map +1 -0
  281. package/dist/render/sdf/sdf_atlas.js +227 -0
  282. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  283. package/dist/render/sdf/sdf_programs.js +42 -0
  284. package/dist/render/sdf/sdf_programs.js.map +1 -0
  285. package/dist/render/sdf/sdf_view.js +199 -0
  286. package/dist/render/sdf/sdf_view.js.map +1 -0
  287. package/dist/render/sdf/waterline.js +610 -0
  288. package/dist/render/sdf/waterline.js.map +1 -0
  289. package/dist/render/shadow_mask_pass.js +142 -25
  290. package/dist/render/shadow_mask_pass.js.map +1 -1
  291. package/dist/render/shore_wave_generator.js +1193 -0
  292. package/dist/render/shore_wave_generator.js.map +1 -0
  293. package/dist/render/sky.js +516 -86
  294. package/dist/render/sky.js.map +1 -1
  295. package/dist/render/transmission_thickness_pass.js +477 -0
  296. package/dist/render/transmission_thickness_pass.js.map +1 -0
  297. package/dist/render/underwater.js +58 -158
  298. package/dist/render/underwater.js.map +1 -1
  299. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  300. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  301. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  302. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  303. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  304. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  305. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  306. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  307. package/dist/render/volumetric_cloud/resources.js +380 -0
  308. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  309. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  310. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  311. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  312. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  313. package/dist/render/water_caustics.js +134 -319
  314. package/dist/render/water_caustics.js.map +1 -1
  315. package/dist/render/water_foam.js +627 -0
  316. package/dist/render/water_foam.js.map +1 -0
  317. package/dist/render/water_interaction.js +1795 -0
  318. package/dist/render/water_interaction.js.map +1 -0
  319. package/dist/render/weightedblended_oit.js +3 -3
  320. package/dist/render/weightedblended_oit.js.map +1 -1
  321. package/dist/scene/basesprite.js +9 -4
  322. package/dist/scene/basesprite.js.map +1 -1
  323. package/dist/scene/batchgroup.js +108 -12
  324. package/dist/scene/batchgroup.js.map +1 -1
  325. package/dist/scene/environment.js +28 -7
  326. package/dist/scene/environment.js.map +1 -1
  327. package/dist/scene/foliage.js +1020 -0
  328. package/dist/scene/foliage.js.map +1 -0
  329. package/dist/scene/foliage_buckets.js +147 -0
  330. package/dist/scene/foliage_buckets.js.map +1 -0
  331. package/dist/scene/foliage_mask.js +358 -0
  332. package/dist/scene/foliage_mask.js.map +1 -0
  333. package/dist/scene/hair.js +15 -4
  334. package/dist/scene/hair.js.map +1 -1
  335. package/dist/scene/light.js +179 -13
  336. package/dist/scene/light.js.map +1 -1
  337. package/dist/scene/mesh.js +327 -45
  338. package/dist/scene/mesh.js.map +1 -1
  339. package/dist/scene/meshdrawable.js +6 -0
  340. package/dist/scene/meshdrawable.js.map +1 -1
  341. package/dist/scene/msdftext.js +9 -3
  342. package/dist/scene/msdftext.js.map +1 -1
  343. package/dist/scene/msdftextsprite.js +9 -3
  344. package/dist/scene/msdftextsprite.js.map +1 -1
  345. package/dist/scene/particlesys.js +8 -2
  346. package/dist/scene/particlesys.js.map +1 -1
  347. package/dist/scene/physics_settings.js +157 -0
  348. package/dist/scene/physics_settings.js.map +1 -0
  349. package/dist/scene/scene.js +190 -44
  350. package/dist/scene/scene.js.map +1 -1
  351. package/dist/scene/scene_node.js +147 -6
  352. package/dist/scene/scene_node.js.map +1 -1
  353. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  354. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  355. package/dist/scene/terrain-cm/grass.js +881 -42
  356. package/dist/scene/terrain-cm/grass.js.map +1 -1
  357. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  358. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  359. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  360. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  361. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  362. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  363. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  364. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  365. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  366. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  367. package/dist/scene/update_queue.js +54 -0
  368. package/dist/scene/update_queue.js.map +1 -0
  369. package/dist/scene/water.js +633 -268
  370. package/dist/scene/water.js.map +1 -1
  371. package/dist/scene/water_surface_sampler.js +324 -0
  372. package/dist/scene/water_surface_sampler.js.map +1 -0
  373. package/dist/scene/wind.js +317 -0
  374. package/dist/scene/wind.js.map +1 -0
  375. package/dist/shaders/atmosphere.js +388 -166
  376. package/dist/shaders/atmosphere.js.map +1 -1
  377. package/dist/shaders/fog.js +100 -32
  378. package/dist/shaders/fog.js.map +1 -1
  379. package/dist/shaders/gi.js +365 -0
  380. package/dist/shaders/gi.js.map +1 -0
  381. package/dist/shaders/ltc_rect.js +202 -0
  382. package/dist/shaders/ltc_rect.js.map +1 -0
  383. package/dist/shaders/misc.js +1 -10
  384. package/dist/shaders/misc.js.map +1 -1
  385. package/dist/shaders/noise.js +5 -1
  386. package/dist/shaders/noise.js.map +1 -1
  387. package/dist/shaders/probes.js +309 -0
  388. package/dist/shaders/probes.js.map +1 -0
  389. package/dist/shaders/sdf.js +537 -0
  390. package/dist/shaders/sdf.js.map +1 -0
  391. package/dist/shaders/shadow.js +104 -70
  392. package/dist/shaders/shadow.js.map +1 -1
  393. package/dist/shaders/skin_brdf.js +243 -0
  394. package/dist/shaders/skin_brdf.js.map +1 -0
  395. package/dist/shaders/ssgi.js +63 -0
  396. package/dist/shaders/ssgi.js.map +1 -0
  397. package/dist/shaders/ssgi_reprojection.js +118 -0
  398. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  399. package/dist/shaders/ssr.js +6 -159
  400. package/dist/shaders/ssr.js.map +1 -1
  401. package/dist/shaders/temporal.js +38 -27
  402. package/dist/shaders/temporal.js.map +1 -1
  403. package/dist/shaders/water.js +32 -82
  404. package/dist/shaders/water.js.map +1 -1
  405. package/dist/shaders/water_medium.js +7 -21
  406. package/dist/shaders/water_medium.js.map +1 -1
  407. package/dist/shadow/dom.js +110 -19
  408. package/dist/shadow/dom.js.map +1 -1
  409. package/dist/shadow/esm.js +3 -3
  410. package/dist/shadow/esm.js.map +1 -1
  411. package/dist/shadow/pcf_opt.js +15 -48
  412. package/dist/shadow/pcf_opt.js.map +1 -1
  413. package/dist/shadow/pcf_pd.js +15 -53
  414. package/dist/shadow/pcf_pd.js.map +1 -1
  415. package/dist/shadow/pcss.js +34 -9
  416. package/dist/shadow/pcss.js.map +1 -1
  417. package/dist/shadow/shadow_impl.js +3 -8
  418. package/dist/shadow/shadow_impl.js.map +1 -1
  419. package/dist/shadow/shadow_region.js +40 -2
  420. package/dist/shadow/shadow_region.js.map +1 -1
  421. package/dist/shadow/shadowmapper.js +93 -53
  422. package/dist/shadow/shadowmapper.js.map +1 -1
  423. package/dist/shadow/ssm.js +18 -72
  424. package/dist/shadow/ssm.js.map +1 -1
  425. package/dist/shadow/vsm.js +3 -3
  426. package/dist/shadow/vsm.js.map +1 -1
  427. package/dist/shapes/shape.js +44 -1
  428. package/dist/shapes/shape.js.map +1 -1
  429. package/dist/utility/buoyancy.js +287 -0
  430. package/dist/utility/buoyancy.js.map +1 -0
  431. package/dist/utility/physical.js +10 -1
  432. package/dist/utility/physical.js.map +1 -1
  433. package/dist/utility/pmrem.js +17 -43
  434. package/dist/utility/pmrem.js.map +1 -1
  435. package/dist/utility/sdf/bake.js +435 -0
  436. package/dist/utility/sdf/bake.js.map +1 -0
  437. package/dist/utility/sdf/bvh.js +576 -0
  438. package/dist/utility/sdf/bvh.js.map +1 -0
  439. package/dist/utility/serialization/manager.js +34 -6
  440. package/dist/utility/serialization/manager.js.map +1 -1
  441. package/dist/utility/serialization/scene/animation.js +46 -5
  442. package/dist/utility/serialization/scene/animation.js.map +1 -1
  443. package/dist/utility/serialization/scene/batch.js +11 -4
  444. package/dist/utility/serialization/scene/batch.js.map +1 -1
  445. package/dist/utility/serialization/scene/camera.js +87 -254
  446. package/dist/utility/serialization/scene/camera.js.map +1 -1
  447. package/dist/utility/serialization/scene/cloth.js +25 -0
  448. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  449. package/dist/utility/serialization/scene/common.js +14 -6
  450. package/dist/utility/serialization/scene/common.js.map +1 -1
  451. package/dist/utility/serialization/scene/foliage.js +821 -0
  452. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  453. package/dist/utility/serialization/scene/hair.js +11 -4
  454. package/dist/utility/serialization/scene/hair.js.map +1 -1
  455. package/dist/utility/serialization/scene/light.js +115 -7
  456. package/dist/utility/serialization/scene/light.js.map +1 -1
  457. package/dist/utility/serialization/scene/material.js +388 -220
  458. package/dist/utility/serialization/scene/material.js.map +1 -1
  459. package/dist/utility/serialization/scene/mesh.js +69 -4
  460. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  461. package/dist/utility/serialization/scene/node.js +140 -5
  462. package/dist/utility/serialization/scene/node.js.map +1 -1
  463. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  464. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  465. package/dist/utility/serialization/scene/particle.js +11 -4
  466. package/dist/utility/serialization/scene/particle.js.map +1 -1
  467. package/dist/utility/serialization/scene/physics.js +120 -0
  468. package/dist/utility/serialization/scene/physics.js.map +1 -0
  469. package/dist/utility/serialization/scene/primitive.js +124 -10
  470. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  471. package/dist/utility/serialization/scene/scene.js +1687 -51
  472. package/dist/utility/serialization/scene/scene.js.map +1 -1
  473. package/dist/utility/serialization/scene/sprite.js +11 -4
  474. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  475. package/dist/utility/serialization/scene/terrain.js +163 -33
  476. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  477. package/dist/utility/serialization/scene/text.js +11 -4
  478. package/dist/utility/serialization/scene/text.js.map +1 -1
  479. package/dist/utility/serialization/scene/water.js +1543 -264
  480. package/dist/utility/serialization/scene/water.js.map +1 -1
  481. package/dist/utility/serialization/types.js.map +1 -1
  482. package/dist/utility/shprojector.js +10 -22
  483. package/dist/utility/shprojector.js.map +1 -1
  484. package/dist/utility/textures/foam.js +170 -0
  485. package/dist/utility/textures/foam.js.map +1 -0
  486. package/dist/utility/textures/ggxlut.js +17 -43
  487. package/dist/utility/textures/ggxlut.js.map +1 -1
  488. package/dist/utility/textures/ltcdata.js +4 -4
  489. package/dist/utility/textures/ltcdata.js.map +1 -1
  490. package/dist/utility/textures/ltclut.js +16 -6
  491. package/dist/utility/textures/ltclut.js.map +1 -1
  492. package/dist/utility/unsupported.js +24 -0
  493. package/dist/utility/unsupported.js.map +1 -0
  494. package/dist/values.js +13 -1
  495. package/dist/values.js.map +1 -1
  496. package/package.json +25 -12
  497. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  498. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  499. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  500. package/src/asset/meshoptimizer/LICENSE +21 -0
  501. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  502. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -0,0 +1,537 @@
1
+ import { getDevice } from '../app/api.js';
2
+
3
+ /** Uniform names of the global field, see {@link declareGlobalSDFUniforms}. */ const GLOBAL_SDF_TEXTURE = 'zGlobalSDFTex';
4
+ const GLOBAL_SDF_LEVELS = 'zGlobalSDFLevels';
5
+ const GLOBAL_SDF_PARAMS = 'zGlobalSDFParams';
6
+ const GLOBAL_SDF_TAGS = 'zGlobalSDFTags';
7
+ /** Voxels along a brick edge of the global field, the unit it is composited and tagged in. */ const GLOBAL_SDF_BRICK = 8;
8
+ /** Uniform names of the dynamic instances, see {@link declareDynamicSDFUniforms}. */ const SDF_ATLAS_TEXTURE = 'zSDFAtlasTex';
9
+ const SDF_DYNAMIC_INSTANCES = 'zSDFDynamic';
10
+ const SDF_DYNAMIC_INFO = 'zSDFDynamicInfo';
11
+ /** Most dynamic instances a shader merges into the field. */ const MAX_DYNAMIC_SDF_INSTANCES = 16;
12
+ /**
13
+ * vec4s per packed instance: world-to-local rows (3), (field box min, voxel size),
14
+ * (field box max, world scale), (atlas slot offset, thin). `thin` = half thickness in world
15
+ * units of a two-sided field's surface, -1 for one-sided; see `expand` of {@link sampleInstancesSDF}.
16
+ */ const SDF_INSTANCE_VEC4S = 6;
17
+ /**
18
+ * Declares the uniforms {@link sampleGlobalSDF} reads.
19
+ *
20
+ * - texture: levels stacked along z, `resolution + 1` slices each (last repeats the first),
21
+ * in {@link globalSDFFormat}; see {@link isGlobalSDFFilterable}.
22
+ * - tags: rgba32f, one texel per brick, stacked the same way: (world brick x, y, z, 1) of the
23
+ * brick last composited there.
24
+ * - levels[i]: (window origin in voxels, voxel size).
25
+ * - params: (resolution, number of levels, band in voxels, current mask); bit i set when
26
+ * every brick of level i is current (tags need not be read).
27
+ *
28
+ * @param levels - Clipmap levels; a compile-time constant of the program.
29
+ * @internal
30
+ */ function declareGlobalSDFUniforms(scope, group, levels) {
31
+ const pb = scope.$builder;
32
+ scope[GLOBAL_SDF_TEXTURE] = isGlobalSDFFilterable() ? pb.tex3D().uniform(group) : pb.tex3D().sampleType('unfilterable-float').uniform(group);
33
+ scope[GLOBAL_SDF_TAGS] = pb.tex3D().sampleType('unfilterable-float').uniform(group);
34
+ scope[GLOBAL_SDF_LEVELS] = pb.vec4[levels]().uniform(group);
35
+ scope[GLOBAL_SDF_PARAMS] = pb.vec4().uniform(group);
36
+ }
37
+ /**
38
+ * Texel format of the global field: r16f where compute-writable (WebGPU texture-formats-tier1),
39
+ * else r32f. Half precision suffices since only distances within the band are stored.
40
+ * @internal
41
+ */ function globalSDFFormat() {
42
+ return getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo('r16f')?.writable ? 'r16f' : 'r32f';
43
+ }
44
+ /**
45
+ * True when the device filters the global field's format (r16f always, r32f with
46
+ * float32-filterable); otherwise trilinear is done by hand from eight loads.
47
+ * @internal
48
+ */ function isGlobalSDFFilterable() {
49
+ return !!getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(globalSDFFormat())?.filterable;
50
+ }
51
+ /**
52
+ * Declares the uniforms {@link sampleDynamicSDF} reads: the mesh field atlas,
53
+ * up to {@link MAX_DYNAMIC_SDF_INSTANCES} packed instances and
54
+ * (instance count, 1 / atlas size).
55
+ * @internal
56
+ */ function declareDynamicSDFUniforms(scope, group) {
57
+ const pb = scope.$builder;
58
+ scope[SDF_ATLAS_TEXTURE] = pb.tex3D().uniform(group);
59
+ scope[SDF_DYNAMIC_INSTANCES] = pb.vec4[MAX_DYNAMIC_SDF_INSTANCES * SDF_INSTANCE_VEC4S]().uniform(group);
60
+ scope[SDF_DYNAMIC_INFO] = pb.vec4().uniform(group);
61
+ }
62
+ /**
63
+ * Distance in local units from a local position to one packed instance's field: trilinear
64
+ * atlas lookup inside the box, border value plus box distance outside. `bmin` is (box min,
65
+ * voxel size), `bmax` (box max, world scale), `slot` the atlas slot offset.
66
+ * @internal
67
+ */ function sampleInstanceField(scope, lp, bmin, bmax, slot, atlas, atlasInvSize) {
68
+ const pb = scope.$builder;
69
+ const funcName = `Z_sampleInstanceField_${atlas.$str}`;
70
+ pb.func(funcName, [
71
+ pb.vec3('lp'),
72
+ pb.vec4('bmin'),
73
+ pb.vec4('bmax'),
74
+ pb.vec4('slot'),
75
+ pb.vec3('invSize')
76
+ ], function() {
77
+ this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);
78
+ this.$l.outside = pb.length(pb.sub(this.lp, this.c));
79
+ this.$l.res = pb.div(pb.sub(this.bmax.xyz, this.bmin.xyz), this.bmin.w);
80
+ // Clamped to the outer sample centres, so the filter never reads a neighbour's slot
81
+ this.$l.f = pb.clamp(pb.div(pb.sub(this.c, this.bmin.xyz), this.bmin.w), pb.vec3(0.5), pb.sub(this.res, pb.vec3(0.5)));
82
+ this.$l.uvw = pb.mul(pb.add(this.slot.xyz, this.f), this.invSize);
83
+ this.$return(pb.add(pb.textureSampleLevel(atlas, this.uvw, 0).r, this.outside));
84
+ });
85
+ return scope[funcName](lp, bmin, bmax, slot, atlasInvSize);
86
+ }
87
+ /**
88
+ * Signed distance from a world position to the nearest of a set of packed instances
89
+ * (layout at {@link SDF_INSTANCE_VEC4S}), or `maxDist` when none is nearer. `baseOf(k)` gives
90
+ * the first vec4 of the k-th instance, `instance(i)` reads vec4 `i`. If `bestIndex` names an
91
+ * int variable, the nearest k is written to it.
92
+ *
93
+ * `expand` (world units) is the minimum half thickness given to two-sided surfaces so coarser
94
+ * grids don't step over them: half the voxel size of the grid being written, 0 for point samples.
95
+ * @internal
96
+ */ function sampleInstancesSDF(scope, p, count, maxDist, baseOf, instance, atlas, atlasInvSize, expand, bestIndex) {
97
+ const pb = scope.$builder;
98
+ scope.$l.sdfBest = maxDist;
99
+ scope.$l.sdfP4 = pb.vec4(p, 1);
100
+ scope.$l.sdfExpand = expand;
101
+ scope.$for(pb.uint('sdfK'), 0, count, function() {
102
+ this.$l.base = baseOf(this, this.sdfK);
103
+ this.$l.r0 = instance(this, this.base);
104
+ this.$l.r1 = instance(this, pb.add(this.base, 1));
105
+ this.$l.r2 = instance(this, pb.add(this.base, 2));
106
+ this.$l.bmin = instance(this, pb.add(this.base, 3));
107
+ this.$l.bmax = instance(this, pb.add(this.base, 4));
108
+ this.$l.slot = instance(this, pb.add(this.base, 5));
109
+ this.$l.lp = pb.vec3(pb.dot(this.r0, this.sdfP4), pb.dot(this.r1, this.sdfP4), pb.dot(this.r2, this.sdfP4));
110
+ this.$l.c = pb.clamp(this.lp, this.bmin.xyz, this.bmax.xyz);
111
+ // World length of a unit along each local axis
112
+ this.$l.axisScale = pb.div(pb.vec3(1), pb.vec3(pb.length(this.r0.xyz), pb.length(this.r1.xyz), pb.length(this.r2.xyz)));
113
+ // World distance to the field box, exact under non-uniform scale; only the
114
+ // field's own value takes the smallest axis scale
115
+ this.$l.outside = pb.length(pb.mul(pb.sub(this.lp, this.c), this.axisScale));
116
+ // How far a two-sided surface is pushed out to reach the half thickness asked for
117
+ this.$l.grow = this.$choice(pb.greaterThanEqual(this.slot.w, 0), pb.max(pb.sub(this.sdfExpand, this.slot.w), 0), pb.float(0));
118
+ // A field box farther than the current best cannot improve it
119
+ this.$if(pb.lessThan(pb.sub(this.outside, this.grow), this.sdfBest), function() {
120
+ this.$l.cand = pb.sub(pb.add(pb.mul(sampleInstanceField(this, this.c, this.bmin, this.bmax, this.slot, atlas, atlasInvSize), this.bmax.w), this.outside), this.grow);
121
+ this.$if(pb.lessThan(this.cand, this.sdfBest), function() {
122
+ this.sdfBest = this.cand;
123
+ if (bestIndex) {
124
+ this[bestIndex] = pb.int(this.sdfK);
125
+ }
126
+ });
127
+ });
128
+ });
129
+ return scope.sdfBest;
130
+ }
131
+ /**
132
+ * Signed distance to the dynamic instances at their current transforms, or `maxDist`.
133
+ * @internal
134
+ */ function sampleDynamicSDF(scope, worldPos, maxDist) {
135
+ const pb = scope.$builder;
136
+ const funcName = 'Z_sampleDynamicSDF';
137
+ pb.func(funcName, [
138
+ pb.vec3('p'),
139
+ pb.float('maxDist')
140
+ ], function() {
141
+ this.$return(sampleInstancesSDF(this, this.p, pb.uint(this[SDF_DYNAMIC_INFO].x), this.maxDist, (s, k)=>pb.mul(k, SDF_INSTANCE_VEC4S), (s, i)=>s[SDF_DYNAMIC_INSTANCES].at(i), this[SDF_ATLAS_TEXTURE], this[SDF_DYNAMIC_INFO].yzw, pb.float(0)));
142
+ });
143
+ return scope[funcName](worldPos, maxDist);
144
+ }
145
+ /**
146
+ * Signed distance to the whole scene field: global clipmap merged with dynamic instances.
147
+ * Needs {@link declareGlobalSDFUniforms} and {@link declareDynamicSDFUniforms}.
148
+ * @internal
149
+ */ function sampleSceneSDF(scope, worldPos, levels) {
150
+ const pb = scope.$builder;
151
+ const funcName = 'Z_sampleSceneSDF';
152
+ pb.func(funcName, [
153
+ pb.vec3('p')
154
+ ], function() {
155
+ this.$l.g = sampleGlobalSDF(this, this.p, levels);
156
+ this.$return(sampleDynamicSDF(this, this.p, this.g));
157
+ });
158
+ return scope[funcName](worldPos);
159
+ }
160
+ /**
161
+ * Surface expand scale in bricks holding two-sided meshes (1 elsewhere)
162
+ * @internal
163
+ */ const SDF_NOT_COVERED_EXPAND_SCALE = 0.6;
164
+ /**
165
+ * Tag alpha of a brick holding two-sided meshes (1 otherwise); see
166
+ * {@link SDF_NOT_COVERED_EXPAND_SCALE}.
167
+ * @internal
168
+ */ const GLOBAL_SDF_TAG_NOT_COVERED = 2;
169
+ /**
170
+ * False where the global field brick holding a position (finest level) was composited with
171
+ * two-sided meshes; true otherwise, including outside every window or for stale bricks.
172
+ * @internal
173
+ */ function globalSDFCovered(scope, worldPos, levels) {
174
+ const pb = scope.$builder;
175
+ const funcName = 'Z_globalSDFCovered';
176
+ pb.func(funcName, [
177
+ pb.vec3('p')
178
+ ], function() {
179
+ this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
180
+ this.$l.nbi = pb.ivec3(pb.div(this.res, GLOBAL_SDF_BRICK));
181
+ for(let i = 0; i < levels; i++){
182
+ this.$l[`cvInfo${i}`] = this[GLOBAL_SDF_LEVELS].at(i);
183
+ this.$l[`cvV${i}`] = pb.ivec3(pb.floor(pb.div(this.p, this[`cvInfo${i}`].w)));
184
+ this.$l[`cvO${i}`] = pb.ivec3(this[`cvInfo${i}`].xyz);
185
+ this.$if(pb.and(pb.all(pb.greaterThanEqual(this[`cvV${i}`], this[`cvO${i}`])), pb.all(pb.lessThan(this[`cvV${i}`], pb.add(this[`cvO${i}`], pb.ivec3(this.res))))), function() {
186
+ this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this[`cvV${i}`]), GLOBAL_SDF_BRICK)));
187
+ this.$l.w = wrap(this, this.b, this.nbi);
188
+ this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, i))), 0);
189
+ this.$return(pb.not(pb.and(pb.greaterThan(this.tag.w, GLOBAL_SDF_TAG_NOT_COVERED - 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b))));
190
+ });
191
+ }
192
+ this.$return(true);
193
+ });
194
+ return scope[funcName](worldPos);
195
+ }
196
+ /**
197
+ * Lumen surface expand (GlobalDistanceFieldUtils.ush) for a {@link sampleSceneSDFWithVoxel}
198
+ * sample at `p`, `t` along a trace: one voxel of the level read ({@link SDF_NOT_COVERED_EXPAND_SCALE}
199
+ * in two-sided bricks), ramping from 0 over the first two voxels. Zero for dynamic instances.
200
+ * @internal
201
+ */ function sdfSurfaceExpand(scope, p, sample, t, levels) {
202
+ const pb = scope.$builder;
203
+ const funcName = 'Z_sdfSurfaceExpand';
204
+ pb.func(funcName, [
205
+ pb.vec3('p'),
206
+ pb.vec2('s'),
207
+ pb.float('t')
208
+ ], function() {
209
+ this.$l.e = pb.mul(this.s.y, pb.clamp(pb.div(this.t, pb.max(pb.mul(this.s.y, 2), 1e-6)), 0, 1));
210
+ this.$if(pb.and(pb.lessThan(this.s.x, this.e), pb.greaterThanEqual(this.s.x, pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE))), function() {
211
+ this.$if(pb.not(globalSDFCovered(this, this.p, levels)), function() {
212
+ this.e = pb.mul(this.e, SDF_NOT_COVERED_EXPAND_SCALE);
213
+ });
214
+ });
215
+ this.$return(this.e);
216
+ });
217
+ return scope[funcName](p, sample, t);
218
+ }
219
+ /**
220
+ * Voxels over which a global field level blends into the next coarser one near its window
221
+ * edge; wider than a brick (the window move step) so the hand-over never jumps.
222
+ * @internal
223
+ */ const SDF_LEVEL_BLEND_VOXELS = 16;
224
+ /**
225
+ * Signed distance (world units, negative inside) from the global clipmap field.
226
+ *
227
+ * The finest level holding the point within its band answers, blending into the next coarser
228
+ * level near window edges and band edges. Past all windows or with every level saturated, the
229
+ * coarsest value is returned as a lower bound, keeping sphere tracing safe. Windows are toroidal;
230
+ * non-filterable formats use manual trilinear. A level answers only where all bricks under the
231
+ * filter are tagged current, so stale bricks after a window move are ignored.
232
+ * @internal
233
+ */ function sampleGlobalSDF(scope, worldPos, levels) {
234
+ return sampleGlobalSDFWithVoxel(scope, worldPos, levels).x;
235
+ }
236
+ /**
237
+ * First level worth reading after a sphere-trace step read `prevDist`; finer levels saturate.
238
+ * @internal
239
+ */ function sdfStartLevel(scope, prevDist, levels) {
240
+ const pb = scope.$builder;
241
+ let start = pb.int(0);
242
+ for(let i = 0; i < levels - 1; i++){
243
+ start = pb.add(start, pb.int(pb.greaterThanEqual(prevDist, pb.mul(scope[GLOBAL_SDF_PARAMS].z, scope[GLOBAL_SDF_LEVELS].at(i).w, 0.95))));
244
+ }
245
+ return start;
246
+ }
247
+ /**
248
+ * {@link sampleGlobalSDFWithVoxel} for sphere tracing: starts at the level `prevDist` needs,
249
+ * rereading from the finest level near a surface. Levels finer than `minLevel` are never .
250
+ * @internal
251
+ */ function sampleGlobalSDFHinted(scope, worldPos, prevDist, levels, minLevel) {
252
+ const pb = scope.$builder;
253
+ const funcName = 'Z_sampleGlobalSDFHinted';
254
+ pb.func(funcName, [
255
+ pb.vec3('p'),
256
+ pb.float('prevDist'),
257
+ pb.int('minLevel')
258
+ ], function() {
259
+ this.$l.start = pb.max(sdfStartLevel(this, this.prevDist, levels), this.minLevel);
260
+ this.$l.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.start);
261
+ this.$if(pb.greaterThan(this.start, this.minLevel), function() {
262
+ this.$if(pb.lessThan(this.g.x, pb.mul(this[GLOBAL_SDF_PARAMS].z, this[GLOBAL_SDF_LEVELS].at(pb.sub(this.start, 1)).w)), function() {
263
+ this.g = sampleGlobalSDFWithVoxel(this, this.p, levels, this.minLevel);
264
+ });
265
+ });
266
+ this.$return(this.g);
267
+ });
268
+ return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0));
269
+ }
270
+ /**
271
+ * {@link sampleSceneSDFWithVoxel} for sphere tracing, using {@link sampleGlobalSDFHinted}.
272
+ * @internal
273
+ */ function sampleSceneSDFHinted(scope, worldPos, prevDist, levels, minLevel) {
274
+ const pb = scope.$builder;
275
+ const funcName = 'Z_sampleSceneSDFHinted';
276
+ pb.func(funcName, [
277
+ pb.vec3('p'),
278
+ pb.float('prevDist'),
279
+ pb.int('minLevel')
280
+ ], function() {
281
+ this.$l.g = sampleGlobalSDFHinted(this, this.p, this.prevDist, levels, this.minLevel);
282
+ this.$l.d = sampleDynamicSDF(this, this.p, this.g.x);
283
+ this.$return(pb.vec2(this.d, this.$choice(pb.lessThan(this.d, this.g.x), pb.float(0), this.g.y)));
284
+ });
285
+ return scope[funcName](worldPos, prevDist, minLevel ?? pb.int(0));
286
+ }
287
+ /** Steps {@link sdfRefineHit} takes past a hit on the swollen surface. @internal */ const SDF_REFINE_STEPS = 8;
288
+ /**
289
+ * Refines a sphere-trace hit on the surface swollen by {@link sdfSurfaceExpand} to the field's
290
+ * own surface: steps on from `t` (distance `d`, answering `voxel` size, 0 for dynamic) to the zero
291
+ * crossing or minimum, at most {@link SDF_REFINE_STEPS} steps of at least 1/8 voxel. Needed because
292
+ * the swollen surface lies up to a voxel short, notably in concave corners.
293
+ * @internal
294
+ */ function sdfRefineHit(scope, origin, dir, t, d, voxel, minLevel, levels) {
295
+ const pb = scope.$builder;
296
+ const funcName = 'Z_sdfRefineHit';
297
+ pb.func(funcName, [
298
+ pb.vec3('o'),
299
+ pb.vec3('dir'),
300
+ pb.float('t'),
301
+ pb.float('d'),
302
+ pb.float('voxel'),
303
+ pb.int('minLevel')
304
+ ], function() {
305
+ // Stopped inside: back out by as much
306
+ this.$if(pb.lessThanEqual(this.d, 0), function() {
307
+ this.$return(pb.max(pb.add(this.t, this.d), 0));
308
+ });
309
+ this.$l.rt = this.t;
310
+ this.$l.rd = this.d;
311
+ this.$l.rStep = pb.mul(pb.max(this.voxel, this[GLOBAL_SDF_LEVELS].at(0).w), 0.125);
312
+ this.$for(pb.int('r'), 0, SDF_REFINE_STEPS, function() {
313
+ this.$l.nt = pb.add(this.rt, pb.max(this.rd, this.rStep));
314
+ this.$l.nd = sampleSceneSDFHinted(this, pb.add(this.o, pb.mul(this.dir, this.nt)), this.rd, levels, this.minLevel).x;
315
+ this.$if(pb.lessThanEqual(this.nd, 0), function() {
316
+ this.$return(pb.add(this.rt, pb.mul(pb.sub(this.nt, this.rt), pb.div(this.rd, pb.sub(this.rd, this.nd)))));
317
+ });
318
+ this.$if(pb.greaterThanEqual(this.nd, this.rd), function() {
319
+ this.$break();
320
+ });
321
+ this.rt = this.nt;
322
+ this.rd = this.nd;
323
+ });
324
+ this.$return(this.rt);
325
+ });
326
+ return scope[funcName](origin, dir, t, d, voxel, minLevel);
327
+ }
328
+ /**
329
+ * {@link sampleGlobalSDF} returning (distance, voxel size) in world units; levels finer than
330
+ * `minLevel` are skipped.
331
+ * @internal
332
+ */ function sampleGlobalSDFWithVoxel(scope, worldPos, levels, minLevel) {
333
+ const pb = scope.$builder;
334
+ const filterable = isGlobalSDFFilterable();
335
+ const funcName = 'Z_sampleGlobalSDFWithVoxel';
336
+ pb.func(funcName, [
337
+ pb.vec3('p'),
338
+ pb.int('minLevel')
339
+ ], function() {
340
+ this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
341
+ this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
342
+ this.$l.band = this[GLOBAL_SDF_PARAMS].z;
343
+ // Weighted sums of the levels read, and the weight still left to coarser levels
344
+ this.$l.sum = pb.float(0);
345
+ this.$l.sumVoxel = pb.float(0);
346
+ this.$l.remaining = pb.float(1);
347
+ // The coarsest value read: a bound when every level read was saturated
348
+ this.$l.last = pb.mul(this.band, this[GLOBAL_SDF_LEVELS].at(levels - 1).w);
349
+ this.$l.lastVoxel = this[GLOBAL_SDF_LEVELS].at(levels - 1).w;
350
+ this.$l.valid = false;
351
+ this.$l.base = pb.vec3(0);
352
+ this.$l.t = pb.vec3(0);
353
+ this.$l.v0 = pb.ivec3(0);
354
+ for(let i = 0; i < levels; i++){
355
+ // Finest first, each level taking the share its finer levels left
356
+ const wanted = i === levels - 1 ? pb.greaterThan(this.remaining, 1e-4) : pb.and(pb.greaterThan(this.remaining, 1e-4), pb.lessThanEqual(this.minLevel, i));
357
+ this.$if(wanted, function() {
358
+ this.$l.info = this[GLOBAL_SDF_LEVELS].at(i);
359
+ // Position in voxels of the window, sample centres at integers
360
+ this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
361
+ this.$l.inside = pb.and(pb.all(pb.greaterThanEqual(this.f, pb.vec3(0))), pb.all(pb.lessThanEqual(this.f, pb.vec3(pb.sub(this.resF, 1)))));
362
+ this.valid = false;
363
+ this.$if(this.inside, function() {
364
+ this.$if(levelCurrent(this, i), function() {
365
+ this.valid = true;
366
+ }).$else(function() {
367
+ // World voxel index of the filter's lower corner
368
+ this.valid = bricksCurrent(this, pb.add(pb.ivec3(pb.floor(this.f)), pb.ivec3(this.info.xyz)), i);
369
+ });
370
+ });
371
+ this.$if(this.valid, function() {
372
+ if (filterable) {
373
+ // World voxel position, sample centres at integers, wrapped into the window
374
+ this.$l.vw = pb.add(this.f, this.info.xyz);
375
+ this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));
376
+ this.$l.depth = pb.add(this.resF, 1);
377
+ this.$l.d = pb.textureSampleLevel(this[GLOBAL_SDF_TEXTURE], pb.vec3(pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF), pb.div(pb.add(this.vw.z, pb.add(pb.mul(this.depth, i), 0.5)), pb.mul(this.depth, levels))), 0).r;
378
+ } else {
379
+ this.base = pb.floor(this.f);
380
+ this.t = pb.sub(this.f, this.base);
381
+ // World voxel index of the lower corner, then toroidal texel
382
+ this.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));
383
+ this.$l.c000 = loadWrapped(this, this.v0, 0, 0, 0, i);
384
+ this.$l.c100 = loadWrapped(this, this.v0, 1, 0, 0, i);
385
+ this.$l.c010 = loadWrapped(this, this.v0, 0, 1, 0, i);
386
+ this.$l.c110 = loadWrapped(this, this.v0, 1, 1, 0, i);
387
+ this.$l.c001 = loadWrapped(this, this.v0, 0, 0, 1, i);
388
+ this.$l.c101 = loadWrapped(this, this.v0, 1, 0, 1, i);
389
+ this.$l.c011 = loadWrapped(this, this.v0, 0, 1, 1, i);
390
+ this.$l.c111 = loadWrapped(this, this.v0, 1, 1, 1, i);
391
+ this.$l.d = pb.mix(pb.mix(pb.mix(this.c000, this.c100, this.t.x), pb.mix(this.c010, this.c110, this.t.x), this.t.y), pb.mix(pb.mix(this.c001, this.c101, this.t.x), pb.mix(this.c011, this.c111, this.t.x), this.t.y), this.t.z);
392
+ }
393
+ this.last = this.d;
394
+ this.lastVoxel = this.info.w;
395
+ if (i === levels - 1) {
396
+ this.$l.w = pb.float(1);
397
+ } else {
398
+ // Hand over near the window edge and near the band edge (beyond which values are lower bounds)
399
+ this.$l.lo = pb.min(pb.min(this.f.x, this.f.y), this.f.z);
400
+ this.$l.hi = pb.sub(pb.sub(this.resF, 1), pb.max(pb.max(this.f.x, this.f.y), this.f.z));
401
+ this.$l.edge = pb.min(this.lo, this.hi);
402
+ this.$l.bandW = pb.mul(this.band, this.info.w);
403
+ this.$l.w = pb.mul(pb.smoothStep(1, 1 + SDF_LEVEL_BLEND_VOXELS, this.edge), pb.sub(1, pb.smoothStep(pb.mul(this.bandW, 0.75), pb.mul(this.bandW, 0.95), pb.abs(this.d))));
404
+ }
405
+ this.$l.share = pb.mul(this.remaining, this.w);
406
+ this.sum = pb.add(this.sum, pb.mul(this.share, this.d));
407
+ this.sumVoxel = pb.add(this.sumVoxel, pb.mul(this.share, this.info.w));
408
+ this.remaining = pb.sub(this.remaining, this.share);
409
+ });
410
+ });
411
+ }
412
+ // What no level answered for: past the coarsest window, or every level saturated
413
+ this.$l.result = pb.add(this.sum, pb.mul(this.remaining, this.last));
414
+ this.$l.resultVoxel = pb.add(this.sumVoxel, pb.mul(this.remaining, this.lastVoxel));
415
+ this.$return(pb.vec2(this.result, this.resultVoxel));
416
+ });
417
+ return scope[funcName](worldPos, minLevel ?? pb.int(0));
418
+ }
419
+ /**
420
+ * Signed distance from one global clipmap level chosen at run time, with no blending or brick
421
+ * currency check.
422
+ * @internal
423
+ */ function sampleGlobalSDFLevel(scope, worldPos, level, levels) {
424
+ const pb = scope.$builder;
425
+ const filterable = isGlobalSDFFilterable();
426
+ const funcName = 'Z_sampleGlobalSDFLevel';
427
+ pb.func(funcName, [
428
+ pb.vec3('p'),
429
+ pb.int('level')
430
+ ], function() {
431
+ this.$l.res = pb.int(this[GLOBAL_SDF_PARAMS].x);
432
+ this.$l.resF = this[GLOBAL_SDF_PARAMS].x;
433
+ this.$l.info = this[GLOBAL_SDF_LEVELS].at(this.level);
434
+ // Position in voxels of the window, sample centres at integers
435
+ this.$l.f = pb.sub(pb.div(this.p, this.info.w), pb.add(this.info.xyz, pb.vec3(0.5)));
436
+ // Slice of the level's first z, `resolution + 1` slices a level
437
+ this.$l.z0 = pb.mul(pb.add(this.res, 1), this.level);
438
+ if (filterable) {
439
+ this.$l.vw = pb.add(this.f, this.info.xyz);
440
+ this.vw = pb.sub(this.vw, pb.mul(pb.floor(pb.div(this.vw, this.resF)), this.resF));
441
+ this.$l.depth = pb.add(this.resF, 1);
442
+ this.$return(pb.textureSampleLevel(this[GLOBAL_SDF_TEXTURE], pb.vec3(pb.div(pb.add(this.vw.xy, pb.vec2(0.5)), this.resF), pb.div(pb.add(this.vw.z, pb.add(pb.float(this.z0), 0.5)), pb.mul(this.depth, levels))), 0).r);
443
+ } else {
444
+ this.$l.base = pb.floor(this.f);
445
+ this.$l.t = pb.sub(this.f, this.base);
446
+ this.$l.v0 = pb.add(pb.ivec3(this.base), pb.ivec3(this.info.xyz));
447
+ const load = (dx, dy, dz)=>{
448
+ const v = pb.add(this.v0, pb.ivec3(dx, dy, dz));
449
+ const w = wrap(this, v, pb.ivec3(this.res));
450
+ return pb.textureLoad(this[GLOBAL_SDF_TEXTURE], pb.ivec3(w.x, w.y, pb.add(w.z, this.z0)), 0).r;
451
+ };
452
+ this.$return(pb.mix(pb.mix(pb.mix(load(0, 0, 0), load(1, 0, 0), this.t.x), pb.mix(load(0, 1, 0), load(1, 1, 0), this.t.x), this.t.y), pb.mix(pb.mix(load(0, 0, 1), load(1, 0, 1), this.t.x), pb.mix(load(0, 1, 1), load(1, 1, 1), this.t.x), this.t.y), this.t.z));
453
+ }
454
+ });
455
+ return scope[funcName](worldPos, level);
456
+ }
457
+ /** ((v % n) + n) % n, the remainder of a negative index being negative */ function wrap(scope, v, n) {
458
+ const pb = scope.$builder;
459
+ return pb.mod(pb.add(pb.mod(v, n), n), n);
460
+ }
461
+ /**
462
+ * True when the brick of a level holding world voxel `v` is tagged with its own
463
+ * world brick coordinates, i.e. composited for the current window.
464
+ * @internal
465
+ */ function globalSDFVoxelCurrent(scope, v, level) {
466
+ const pb = scope.$builder;
467
+ const funcName = `Z_globalSDFVoxelCurrent${level}`;
468
+ pb.func(funcName, [
469
+ pb.ivec3('v')
470
+ ], function() {
471
+ this.$if(levelCurrent(this, level), function() {
472
+ this.$return(true);
473
+ });
474
+ this.$l.nbi = pb.ivec3(pb.int(pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK)));
475
+ this.$l.b = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v), GLOBAL_SDF_BRICK)));
476
+ this.$l.w = wrap(this, this.b, this.nbi);
477
+ this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))), 0);
478
+ this.$return(pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b)));
479
+ });
480
+ return scope[funcName](v);
481
+ }
482
+ /** True when every brick of a level is current, by the mask in the params' w. */ function levelCurrent(scope, level) {
483
+ const pb = scope.$builder;
484
+ return pb.notEqual(pb.compAnd(pb.uint(scope[GLOBAL_SDF_PARAMS].w), pb.uint(1 << level)), pb.uint(0));
485
+ }
486
+ /**
487
+ * True when every brick covering voxels v0..v0+1 of a level is tagged current (one to eight bricks).
488
+ */ function bricksCurrent(scope, v0, level) {
489
+ const pb = scope.$builder;
490
+ const funcName = `Z_globalSDFBricksCurrent${level}`;
491
+ pb.func(funcName, [
492
+ pb.ivec3('v0')
493
+ ], function() {
494
+ this.$l.nb = pb.div(this[GLOBAL_SDF_PARAMS].x, GLOBAL_SDF_BRICK);
495
+ this.$l.nbi = pb.ivec3(pb.int(this.nb));
496
+ // Floor division of possibly negative voxel indices
497
+ this.$l.lo = pb.ivec3(pb.floor(pb.div(pb.vec3(this.v0), GLOBAL_SDF_BRICK)));
498
+ this.$l.hi = pb.ivec3(pb.floor(pb.div(pb.vec3(pb.add(this.v0, pb.ivec3(1))), GLOBAL_SDF_BRICK)));
499
+ this.$l.ok = true;
500
+ for(let c = 0; c < 8; c++){
501
+ const bits = [
502
+ c & 1,
503
+ c >> 1 & 1,
504
+ c >> 2 & 1
505
+ ];
506
+ // A corner using the upper brick on an axis matters only where the footprint crosses into it
507
+ const needs = [
508
+ 'x',
509
+ 'y',
510
+ 'z'
511
+ ].filter((_, a)=>bits[a]).map((a)=>pb.notEqual(this.lo[a], this.hi[a]));
512
+ const body = function() {
513
+ this.$l.b = pb.ivec3(bits[0] ? this.hi.x : this.lo.x, bits[1] ? this.hi.y : this.lo.y, bits[2] ? this.hi.z : this.lo.z);
514
+ this.$l.w = wrap(this, this.b, this.nbi);
515
+ this.$l.tag = pb.textureLoad(this[GLOBAL_SDF_TAGS], pb.ivec3(this.w.x, this.w.y, pb.add(this.w.z, pb.mul(this.nbi.z, level))), 0);
516
+ this.ok = pb.and(this.ok, pb.and(pb.greaterThan(this.tag.w, 0.5), pb.equal(pb.ivec3(this.tag.xyz), this.b)));
517
+ };
518
+ if (needs.length === 0) {
519
+ body.call(this);
520
+ } else {
521
+ this.$if(needs.reduce((x, y)=>pb.and(x, y)), body);
522
+ }
523
+ }
524
+ this.$return(this.ok);
525
+ });
526
+ return scope[funcName](v0);
527
+ }
528
+ function loadWrapped(scope, v0, dx, dy, dz, level) {
529
+ const pb = scope.$builder;
530
+ const v = pb.add(v0, pb.ivec3(dx, dy, dz));
531
+ // ((v % n) + n) % n, the remainder of a negative index being negative
532
+ const t = pb.mod(pb.add(pb.mod(v, pb.ivec3(scope.res)), pb.ivec3(scope.res)), pb.ivec3(scope.res));
533
+ return pb.textureLoad(scope[GLOBAL_SDF_TEXTURE], pb.ivec3(t.x, t.y, pb.add(t.z, pb.mul(pb.add(scope.res, 1), level))), 0).r;
534
+ }
535
+
536
+ export { GLOBAL_SDF_BRICK, GLOBAL_SDF_LEVELS, GLOBAL_SDF_PARAMS, GLOBAL_SDF_TAGS, GLOBAL_SDF_TAG_NOT_COVERED, GLOBAL_SDF_TEXTURE, MAX_DYNAMIC_SDF_INSTANCES, SDF_ATLAS_TEXTURE, SDF_DYNAMIC_INFO, SDF_DYNAMIC_INSTANCES, SDF_INSTANCE_VEC4S, SDF_LEVEL_BLEND_VOXELS, SDF_NOT_COVERED_EXPAND_SCALE, SDF_REFINE_STEPS, declareDynamicSDFUniforms, declareGlobalSDFUniforms, globalSDFCovered, globalSDFFormat, globalSDFVoxelCurrent, isGlobalSDFFilterable, sampleDynamicSDF, sampleGlobalSDF, sampleGlobalSDFHinted, sampleGlobalSDFLevel, sampleGlobalSDFWithVoxel, sampleInstanceField, sampleInstancesSDF, sampleSceneSDF, sampleSceneSDFHinted, sdfRefineHit, sdfSurfaceExpand };
537
+ //# sourceMappingURL=sdf.js.map