@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,358 @@
1
+ /** Cells along each side of a {@link FoliageDensityMask} tile */ const FOLIAGE_MASK_TILE_SIZE = 64;
2
+ /** Key of a tile from its integer tile coordinates */ function tileKey(tx, tz) {
3
+ return `${tx},${tz}`;
4
+ }
5
+ /**
6
+ * Where a {@link FoliageLayer} grows, and how densely: a value from 0 to 1 per square cell of the
7
+ * plane of the foliage system, painted with the foliage brush.
8
+ *
9
+ * @remarks
10
+ * Cells are stored in square tiles of {@link FOLIAGE_MASK_TILE_SIZE} cells, and only tiles
11
+ * holding a non-zero value exist, so the mask covers an unbounded plane at the cost of what was
12
+ * painted. Values are kept in steps of 1/255.
13
+ *
14
+ * Cell `(i, j)` covers `[i, i + 1) × [j, j + 1)` cell sizes; its value is at its centre, and
15
+ * {@link FoliageDensityMask.sample} interpolates between centres.
16
+ * @public
17
+ */ class FoliageDensityMask {
18
+ _cellSize;
19
+ _tiles;
20
+ /**
21
+ * Creates an empty mask
22
+ * @param cellSize - Edge of a cell, in meters
23
+ */ constructor(cellSize = 1){
24
+ this._cellSize = Math.max(1e-3, cellSize);
25
+ this._tiles = new Map();
26
+ }
27
+ /** Edge of a cell, in meters. Changing it keeps the cell values, so what was painted scales. */ get cellSize() {
28
+ return this._cellSize;
29
+ }
30
+ set cellSize(val) {
31
+ this._cellSize = Math.max(1e-3, val);
32
+ }
33
+ /** Number of tiles holding painted cells */ get numTiles() {
34
+ return this._tiles.size;
35
+ }
36
+ /** Whether nothing is painted */ get empty() {
37
+ return this._tiles.size === 0;
38
+ }
39
+ /** Clears every cell */ clear() {
40
+ this._tiles.clear();
41
+ }
42
+ /**
43
+ * Value of a cell, 0 to 1
44
+ * @param i - Cell column
45
+ * @param j - Cell row
46
+ */ getCell(i, j) {
47
+ const n = FOLIAGE_MASK_TILE_SIZE;
48
+ const tx = Math.floor(i / n);
49
+ const tz = Math.floor(j / n);
50
+ const tile = this._tiles.get(tileKey(tx, tz));
51
+ return tile ? tile[(j - tz * n) * n + (i - tx * n)] / 255 : 0;
52
+ }
53
+ /**
54
+ * Sets the value of a cell
55
+ * @param i - Cell column
56
+ * @param j - Cell row
57
+ * @param value - New value, clamped to 0..1
58
+ */ setCell(i, j, value) {
59
+ const n = FOLIAGE_MASK_TILE_SIZE;
60
+ const tx = Math.floor(i / n);
61
+ const tz = Math.floor(j / n);
62
+ const key = tileKey(tx, tz);
63
+ const v = Math.round(Math.min(1, Math.max(0, value)) * 255);
64
+ let tile = this._tiles.get(key);
65
+ if (!tile) {
66
+ if (v === 0) {
67
+ return;
68
+ }
69
+ tile = new Uint8Array(n * n);
70
+ this._tiles.set(key, tile);
71
+ }
72
+ tile[(j - tz * n) * n + (i - tx * n)] = v;
73
+ if (v === 0 && tile.every((c)=>c === 0)) {
74
+ this._tiles.delete(key);
75
+ }
76
+ }
77
+ /**
78
+ * The density at a point, interpolated between the centres of the cells around it
79
+ * @param x - Position x, local to the foliage system
80
+ * @param z - Position z, local to the foliage system
81
+ */ sample(x, z) {
82
+ const fx = x / this._cellSize - 0.5;
83
+ const fz = z / this._cellSize - 0.5;
84
+ const i = Math.floor(fx);
85
+ const j = Math.floor(fz);
86
+ const u = fx - i;
87
+ const v = fz - j;
88
+ const a = this.getCell(i, j);
89
+ const b = this.getCell(i + 1, j);
90
+ const c = this.getCell(i, j + 1);
91
+ const d = this.getCell(i + 1, j + 1);
92
+ return (a * (1 - u) + b * u) * (1 - v) + (c * (1 - u) + d * u) * v;
93
+ }
94
+ /**
95
+ * Changes the cells within a circle, weighted by a falloff from the centre
96
+ *
97
+ * @remarks
98
+ * Each cell whose centre lies within the circle becomes
99
+ * `clamp(old + amount × weight)`, where weight is 1 at the centre and falls smoothly to 0 at
100
+ * the edge over the outer `falloff` fraction of the radius. A negative amount erases.
101
+ *
102
+ * @param x - Circle centre x, local to the foliage system
103
+ * @param z - Circle centre z, local to the foliage system
104
+ * @param radius - Circle radius
105
+ * @param amount - Change at full weight, -1 to 1
106
+ * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1
107
+ * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
108
+ */ paintCircle(x, z, radius, amount, falloff = 0.5) {
109
+ if (!(radius > 0) || amount === 0) {
110
+ return null;
111
+ }
112
+ const cs = this._cellSize;
113
+ const i0 = Math.floor((x - radius) / cs);
114
+ const i1 = Math.floor((x + radius) / cs);
115
+ const j0 = Math.floor((z - radius) / cs);
116
+ const j1 = Math.floor((z + radius) / cs);
117
+ let changed = false;
118
+ for(let j = j0; j <= j1; j++){
119
+ for(let i = i0; i <= i1; i++){
120
+ const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);
121
+ if (w <= 0) {
122
+ continue;
123
+ }
124
+ const old = this.getCell(i, j);
125
+ const next = Math.min(1, Math.max(0, old + amount * w));
126
+ if (Math.round(next * 255) !== Math.round(old * 255)) {
127
+ this.setCell(i, j, next);
128
+ changed = true;
129
+ }
130
+ }
131
+ }
132
+ return changed ? this.cellRegion(i0, j0, i1, j1) : null;
133
+ }
134
+ /**
135
+ * Moves the cells within a circle towards a density, by the brush weight: a cell at full
136
+ * weight becomes `value`, one at the soft edge moves part of the way
137
+ * @param x - Circle centre x, local to the foliage system
138
+ * @param z - Circle centre z, local to the foliage system
139
+ * @param radius - Circle radius
140
+ * @param value - Target density, 0 to 1
141
+ * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1
142
+ * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
143
+ */ blendCircle(x, z, radius, value, falloff = 0.5) {
144
+ if (!(radius > 0)) {
145
+ return null;
146
+ }
147
+ const target = Math.min(1, Math.max(0, value));
148
+ const cs = this._cellSize;
149
+ const i0 = Math.floor((x - radius) / cs);
150
+ const i1 = Math.floor((x + radius) / cs);
151
+ const j0 = Math.floor((z - radius) / cs);
152
+ const j1 = Math.floor((z + radius) / cs);
153
+ let changed = false;
154
+ for(let j = j0; j <= j1; j++){
155
+ for(let i = i0; i <= i1; i++){
156
+ const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);
157
+ if (w <= 0) {
158
+ continue;
159
+ }
160
+ const old = this.getCell(i, j);
161
+ const next = old + (target - old) * w;
162
+ if (Math.round(next * 255) !== Math.round(old * 255)) {
163
+ this.setCell(i, j, next);
164
+ changed = true;
165
+ }
166
+ }
167
+ }
168
+ return changed ? this.cellRegion(i0, j0, i1, j1) : null;
169
+ }
170
+ /**
171
+ * Sets every cell whose centre lies within a circle
172
+ * @param x - Circle centre x, local to the foliage system
173
+ * @param z - Circle centre z, local to the foliage system
174
+ * @param radius - Circle radius
175
+ * @param value - New value, 0 to 1
176
+ * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed
177
+ */ fillCircle(x, z, radius, value) {
178
+ if (!(radius > 0)) {
179
+ return null;
180
+ }
181
+ const cs = this._cellSize;
182
+ const i0 = Math.floor((x - radius) / cs);
183
+ const i1 = Math.floor((x + radius) / cs);
184
+ const j0 = Math.floor((z - radius) / cs);
185
+ const j1 = Math.floor((z + radius) / cs);
186
+ const r2 = radius * radius;
187
+ let changed = false;
188
+ for(let j = j0; j <= j1; j++){
189
+ for(let i = i0; i <= i1; i++){
190
+ const dx = (i + 0.5) * cs - x;
191
+ const dz = (j + 0.5) * cs - z;
192
+ if (dx * dx + dz * dz > r2) {
193
+ continue;
194
+ }
195
+ if (Math.round(this.getCell(i, j) * 255) !== Math.round(Math.min(1, Math.max(0, value)) * 255)) {
196
+ this.setCell(i, j, value);
197
+ changed = true;
198
+ }
199
+ }
200
+ }
201
+ return changed ? this.cellRegion(i0, j0, i1, j1) : null;
202
+ }
203
+ /**
204
+ * Region of the plane the painted tiles cover, `[minX, minZ, maxX, maxZ]` local to the
205
+ * foliage system, or null when nothing is painted
206
+ */ getBounds() {
207
+ if (this._tiles.size === 0) {
208
+ return null;
209
+ }
210
+ let tx0 = Infinity;
211
+ let tz0 = Infinity;
212
+ let tx1 = -Infinity;
213
+ let tz1 = -Infinity;
214
+ for (const key of this._tiles.keys()){
215
+ const [tx, tz] = key.split(',').map(Number);
216
+ tx0 = Math.min(tx0, tx);
217
+ tz0 = Math.min(tz0, tz);
218
+ tx1 = Math.max(tx1, tx);
219
+ tz1 = Math.max(tz1, tz);
220
+ }
221
+ const n = FOLIAGE_MASK_TILE_SIZE;
222
+ return this.cellRegion(tx0 * n, tz0 * n, tx1 * n + n - 1, tz1 * n + n - 1);
223
+ }
224
+ /**
225
+ * Regions of the plane the painted tiles cover, one `[minX, minZ, maxX, maxZ]` per tile
226
+ */ getTileRegions() {
227
+ const n = FOLIAGE_MASK_TILE_SIZE;
228
+ const out = [];
229
+ for (const key of this._tiles.keys()){
230
+ const [tx, tz] = key.split(',').map(Number);
231
+ out.push(this.cellRegion(tx * n, tz * n, tx * n + n - 1, tz * n + n - 1));
232
+ }
233
+ return out;
234
+ }
235
+ /**
236
+ * The tiles touching a region, for undo: tile coordinates and a copy of the cells, null for
237
+ * a tile that does not exist
238
+ * @param region - `[minX, minZ, maxX, maxZ]`, local to the foliage system
239
+ */ copyTiles(region) {
240
+ const out = [];
241
+ for (const [tx, tz] of this.tilesInRegion(region)){
242
+ const tile = this._tiles.get(tileKey(tx, tz));
243
+ out.push({
244
+ tx,
245
+ tz,
246
+ cells: tile ? tile.slice() : null
247
+ });
248
+ }
249
+ return out;
250
+ }
251
+ /**
252
+ * Puts back tiles copied with {@link FoliageDensityMask.copyTiles}
253
+ * @param tiles - The copies
254
+ */ restoreTiles(tiles) {
255
+ for (const { tx, tz, cells } of tiles){
256
+ if (cells && cells.some((c)=>c !== 0)) {
257
+ this._tiles.set(tileKey(tx, tz), cells.slice());
258
+ } else {
259
+ this._tiles.delete(tileKey(tx, tz));
260
+ }
261
+ }
262
+ }
263
+ /** Tile coordinates of the tiles touching a region */ tilesInRegion(region) {
264
+ const span = this._cellSize * FOLIAGE_MASK_TILE_SIZE;
265
+ const tx0 = Math.floor(region[0] / span);
266
+ const tz0 = Math.floor(region[1] / span);
267
+ const tx1 = Math.floor(region[2] / span);
268
+ const tz1 = Math.floor(region[3] / span);
269
+ const out = [];
270
+ for(let tz = tz0; tz <= tz1; tz++){
271
+ for(let tx = tx0; tx <= tx1; tx++){
272
+ out.push([
273
+ tx,
274
+ tz
275
+ ]);
276
+ }
277
+ }
278
+ return out;
279
+ }
280
+ /** Byte size of {@link FoliageDensityMask.write} */ get byteSize() {
281
+ const n = FOLIAGE_MASK_TILE_SIZE;
282
+ return 4 + this._tiles.size * (8 + n * n);
283
+ }
284
+ /**
285
+ * Writes the tiles: their count, then per tile its coordinates as two int32 and its cells
286
+ * @param view - Destination
287
+ * @param offset - Byte offset to write at
288
+ * @returns Byte offset after the data
289
+ */ write(view, offset) {
290
+ const n = FOLIAGE_MASK_TILE_SIZE;
291
+ view.setUint32(offset, this._tiles.size, true);
292
+ offset += 4;
293
+ // In a fixed order, so the same mask always writes the same bytes
294
+ const keys = [
295
+ ...this._tiles.keys()
296
+ ].sort();
297
+ for (const key of keys){
298
+ const [tx, tz] = key.split(',').map(Number);
299
+ view.setInt32(offset, tx, true);
300
+ view.setInt32(offset + 4, tz, true);
301
+ offset += 8;
302
+ new Uint8Array(view.buffer, view.byteOffset + offset, n * n).set(this._tiles.get(key));
303
+ offset += n * n;
304
+ }
305
+ return offset;
306
+ }
307
+ /**
308
+ * Replaces the tiles with ones written by {@link FoliageDensityMask.write}
309
+ * @param view - Source
310
+ * @param offset - Byte offset to read at
311
+ * @returns Byte offset after the data
312
+ */ read(view, offset) {
313
+ const n = FOLIAGE_MASK_TILE_SIZE;
314
+ this._tiles.clear();
315
+ const count = view.getUint32(offset, true);
316
+ offset += 4;
317
+ for(let k = 0; k < count; k++){
318
+ const tx = view.getInt32(offset, true);
319
+ const tz = view.getInt32(offset + 4, true);
320
+ offset += 8;
321
+ const cells = new Uint8Array(view.buffer, view.byteOffset + offset, n * n).slice();
322
+ offset += n * n;
323
+ if (cells.some((c)=>c !== 0)) {
324
+ this._tiles.set(tileKey(tx, tz), cells);
325
+ }
326
+ }
327
+ return offset;
328
+ }
329
+ /** Region covered by an inclusive range of cells */ cellRegion(i0, j0, i1, j1) {
330
+ const cs = this._cellSize;
331
+ return [
332
+ i0 * cs,
333
+ j0 * cs,
334
+ (i1 + 1) * cs,
335
+ (j1 + 1) * cs
336
+ ];
337
+ }
338
+ }
339
+ /**
340
+ * Weight of the foliage brush at a distance from its centre: 1 up to `1 - falloff` of the radius,
341
+ * then falling smoothly to 0 at the edge
342
+ * @param t - Distance from the centre over the radius
343
+ * @param falloff - Fraction of the radius over which the weight falls, 0 to 1
344
+ * @public
345
+ */ function foliageBrushWeight(t, falloff) {
346
+ if (t >= 1) {
347
+ return 0;
348
+ }
349
+ const f = Math.min(1, Math.max(0, falloff));
350
+ if (f <= 0 || t <= 1 - f) {
351
+ return 1;
352
+ }
353
+ const s = (1 - t) / f;
354
+ return s * s * (3 - 2 * s);
355
+ }
356
+
357
+ export { FOLIAGE_MASK_TILE_SIZE, FoliageDensityMask, foliageBrushWeight };
358
+ //# sourceMappingURL=foliage_mask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foliage_mask.js","sources":["../../src/scene/foliage_mask.ts"],"sourcesContent":["/** Cells along each side of a {@link FoliageDensityMask} tile */\r\nexport const FOLIAGE_MASK_TILE_SIZE = 64;\r\n\r\n/** Key of a tile from its integer tile coordinates */\r\nfunction tileKey(tx: number, tz: number) {\r\n return `${tx},${tz}`;\r\n}\r\n\r\n/**\r\n * Where a {@link FoliageLayer} grows, and how densely: a value from 0 to 1 per square cell of the\r\n * plane of the foliage system, painted with the foliage brush.\r\n *\r\n * @remarks\r\n * Cells are stored in square tiles of {@link FOLIAGE_MASK_TILE_SIZE} cells, and only tiles\r\n * holding a non-zero value exist, so the mask covers an unbounded plane at the cost of what was\r\n * painted. Values are kept in steps of 1/255.\r\n *\r\n * Cell `(i, j)` covers `[i, i + 1) × [j, j + 1)` cell sizes; its value is at its centre, and\r\n * {@link FoliageDensityMask.sample} interpolates between centres.\r\n * @public\r\n */\r\nexport class FoliageDensityMask {\r\n private _cellSize: number;\r\n private readonly _tiles: Map<string, Uint8Array>;\r\n /**\r\n * Creates an empty mask\r\n * @param cellSize - Edge of a cell, in meters\r\n */\r\n constructor(cellSize = 1) {\r\n this._cellSize = Math.max(1e-3, cellSize);\r\n this._tiles = new Map();\r\n }\r\n /** Edge of a cell, in meters. Changing it keeps the cell values, so what was painted scales. */\r\n get cellSize() {\r\n return this._cellSize;\r\n }\r\n set cellSize(val: number) {\r\n this._cellSize = Math.max(1e-3, val);\r\n }\r\n /** Number of tiles holding painted cells */\r\n get numTiles() {\r\n return this._tiles.size;\r\n }\r\n /** Whether nothing is painted */\r\n get empty() {\r\n return this._tiles.size === 0;\r\n }\r\n /** Clears every cell */\r\n clear() {\r\n this._tiles.clear();\r\n }\r\n /**\r\n * Value of a cell, 0 to 1\r\n * @param i - Cell column\r\n * @param j - Cell row\r\n */\r\n getCell(i: number, j: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const tx = Math.floor(i / n);\r\n const tz = Math.floor(j / n);\r\n const tile = this._tiles.get(tileKey(tx, tz));\r\n return tile ? tile[(j - tz * n) * n + (i - tx * n)] / 255 : 0;\r\n }\r\n /**\r\n * Sets the value of a cell\r\n * @param i - Cell column\r\n * @param j - Cell row\r\n * @param value - New value, clamped to 0..1\r\n */\r\n setCell(i: number, j: number, value: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const tx = Math.floor(i / n);\r\n const tz = Math.floor(j / n);\r\n const key = tileKey(tx, tz);\r\n const v = Math.round(Math.min(1, Math.max(0, value)) * 255);\r\n let tile = this._tiles.get(key);\r\n if (!tile) {\r\n if (v === 0) {\r\n return;\r\n }\r\n tile = new Uint8Array(n * n);\r\n this._tiles.set(key, tile);\r\n }\r\n tile[(j - tz * n) * n + (i - tx * n)] = v;\r\n if (v === 0 && tile.every((c) => c === 0)) {\r\n this._tiles.delete(key);\r\n }\r\n }\r\n /**\r\n * The density at a point, interpolated between the centres of the cells around it\r\n * @param x - Position x, local to the foliage system\r\n * @param z - Position z, local to the foliage system\r\n */\r\n sample(x: number, z: number) {\r\n const fx = x / this._cellSize - 0.5;\r\n const fz = z / this._cellSize - 0.5;\r\n const i = Math.floor(fx);\r\n const j = Math.floor(fz);\r\n const u = fx - i;\r\n const v = fz - j;\r\n const a = this.getCell(i, j);\r\n const b = this.getCell(i + 1, j);\r\n const c = this.getCell(i, j + 1);\r\n const d = this.getCell(i + 1, j + 1);\r\n return (a * (1 - u) + b * u) * (1 - v) + (c * (1 - u) + d * u) * v;\r\n }\r\n /**\r\n * Changes the cells within a circle, weighted by a falloff from the centre\r\n *\r\n * @remarks\r\n * Each cell whose centre lies within the circle becomes\r\n * `clamp(old + amount × weight)`, where weight is 1 at the centre and falls smoothly to 0 at\r\n * the edge over the outer `falloff` fraction of the radius. A negative amount erases.\r\n *\r\n * @param x - Circle centre x, local to the foliage system\r\n * @param z - Circle centre z, local to the foliage system\r\n * @param radius - Circle radius\r\n * @param amount - Change at full weight, -1 to 1\r\n * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n paintCircle(\r\n x: number,\r\n z: number,\r\n radius: number,\r\n amount: number,\r\n falloff = 0.5\r\n ): [number, number, number, number] | null {\r\n if (!(radius > 0) || amount === 0) {\r\n return null;\r\n }\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);\r\n if (w <= 0) {\r\n continue;\r\n }\r\n const old = this.getCell(i, j);\r\n const next = Math.min(1, Math.max(0, old + amount * w));\r\n if (Math.round(next * 255) !== Math.round(old * 255)) {\r\n this.setCell(i, j, next);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Moves the cells within a circle towards a density, by the brush weight: a cell at full\r\n * weight becomes `value`, one at the soft edge moves part of the way\r\n * @param x - Circle centre x, local to the foliage system\r\n * @param z - Circle centre z, local to the foliage system\r\n * @param radius - Circle radius\r\n * @param value - Target density, 0 to 1\r\n * @param falloff - Fraction of the radius over which the weight falls to 0, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n blendCircle(\r\n x: number,\r\n z: number,\r\n radius: number,\r\n value: number,\r\n falloff = 0.5\r\n ): [number, number, number, number] | null {\r\n if (!(radius > 0)) {\r\n return null;\r\n }\r\n const target = Math.min(1, Math.max(0, value));\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const w = foliageBrushWeight(Math.hypot((i + 0.5) * cs - x, (j + 0.5) * cs - z) / radius, falloff);\r\n if (w <= 0) {\r\n continue;\r\n }\r\n const old = this.getCell(i, j);\r\n const next = old + (target - old) * w;\r\n if (Math.round(next * 255) !== Math.round(old * 255)) {\r\n this.setCell(i, j, next);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Sets every cell whose centre lies within a circle\r\n * @param x - Circle centre x, local to the foliage system\r\n * @param z - Circle centre z, local to the foliage system\r\n * @param radius - Circle radius\r\n * @param value - New value, 0 to 1\r\n * @returns The changed region `[minX, minZ, maxX, maxZ]`, local, or null when nothing changed\r\n */\r\n fillCircle(x: number, z: number, radius: number, value: number): [number, number, number, number] | null {\r\n if (!(radius > 0)) {\r\n return null;\r\n }\r\n const cs = this._cellSize;\r\n const i0 = Math.floor((x - radius) / cs);\r\n const i1 = Math.floor((x + radius) / cs);\r\n const j0 = Math.floor((z - radius) / cs);\r\n const j1 = Math.floor((z + radius) / cs);\r\n const r2 = radius * radius;\r\n let changed = false;\r\n for (let j = j0; j <= j1; j++) {\r\n for (let i = i0; i <= i1; i++) {\r\n const dx = (i + 0.5) * cs - x;\r\n const dz = (j + 0.5) * cs - z;\r\n if (dx * dx + dz * dz > r2) {\r\n continue;\r\n }\r\n if (Math.round(this.getCell(i, j) * 255) !== Math.round(Math.min(1, Math.max(0, value)) * 255)) {\r\n this.setCell(i, j, value);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed ? this.cellRegion(i0, j0, i1, j1) : null;\r\n }\r\n /**\r\n * Region of the plane the painted tiles cover, `[minX, minZ, maxX, maxZ]` local to the\r\n * foliage system, or null when nothing is painted\r\n */\r\n getBounds(): [number, number, number, number] | null {\r\n if (this._tiles.size === 0) {\r\n return null;\r\n }\r\n let tx0 = Infinity;\r\n let tz0 = Infinity;\r\n let tx1 = -Infinity;\r\n let tz1 = -Infinity;\r\n for (const key of this._tiles.keys()) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n tx0 = Math.min(tx0, tx);\r\n tz0 = Math.min(tz0, tz);\r\n tx1 = Math.max(tx1, tx);\r\n tz1 = Math.max(tz1, tz);\r\n }\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n return this.cellRegion(tx0 * n, tz0 * n, tx1 * n + n - 1, tz1 * n + n - 1);\r\n }\r\n /**\r\n * Regions of the plane the painted tiles cover, one `[minX, minZ, maxX, maxZ]` per tile\r\n */\r\n getTileRegions(): [number, number, number, number][] {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n const out: [number, number, number, number][] = [];\r\n for (const key of this._tiles.keys()) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n out.push(this.cellRegion(tx * n, tz * n, tx * n + n - 1, tz * n + n - 1));\r\n }\r\n return out;\r\n }\r\n /**\r\n * The tiles touching a region, for undo: tile coordinates and a copy of the cells, null for\r\n * a tile that does not exist\r\n * @param region - `[minX, minZ, maxX, maxZ]`, local to the foliage system\r\n */\r\n copyTiles(region: readonly [number, number, number, number]) {\r\n const out: { tx: number; tz: number; cells: Uint8Array | null }[] = [];\r\n for (const [tx, tz] of this.tilesInRegion(region)) {\r\n const tile = this._tiles.get(tileKey(tx, tz));\r\n out.push({ tx, tz, cells: tile ? tile.slice() : null });\r\n }\r\n return out;\r\n }\r\n /**\r\n * Puts back tiles copied with {@link FoliageDensityMask.copyTiles}\r\n * @param tiles - The copies\r\n */\r\n restoreTiles(tiles: readonly { tx: number; tz: number; cells: Uint8Array | null }[]) {\r\n for (const { tx, tz, cells } of tiles) {\r\n if (cells && cells.some((c) => c !== 0)) {\r\n this._tiles.set(tileKey(tx, tz), cells.slice());\r\n } else {\r\n this._tiles.delete(tileKey(tx, tz));\r\n }\r\n }\r\n }\r\n /** Tile coordinates of the tiles touching a region */\r\n tilesInRegion(region: readonly [number, number, number, number]): [number, number][] {\r\n const span = this._cellSize * FOLIAGE_MASK_TILE_SIZE;\r\n const tx0 = Math.floor(region[0] / span);\r\n const tz0 = Math.floor(region[1] / span);\r\n const tx1 = Math.floor(region[2] / span);\r\n const tz1 = Math.floor(region[3] / span);\r\n const out: [number, number][] = [];\r\n for (let tz = tz0; tz <= tz1; tz++) {\r\n for (let tx = tx0; tx <= tx1; tx++) {\r\n out.push([tx, tz]);\r\n }\r\n }\r\n return out;\r\n }\r\n /** Byte size of {@link FoliageDensityMask.write} */\r\n get byteSize() {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n return 4 + this._tiles.size * (8 + n * n);\r\n }\r\n /**\r\n * Writes the tiles: their count, then per tile its coordinates as two int32 and its cells\r\n * @param view - Destination\r\n * @param offset - Byte offset to write at\r\n * @returns Byte offset after the data\r\n */\r\n write(view: DataView, offset: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n view.setUint32(offset, this._tiles.size, true);\r\n offset += 4;\r\n // In a fixed order, so the same mask always writes the same bytes\r\n const keys = [...this._tiles.keys()].sort();\r\n for (const key of keys) {\r\n const [tx, tz] = key.split(',').map(Number);\r\n view.setInt32(offset, tx, true);\r\n view.setInt32(offset + 4, tz, true);\r\n offset += 8;\r\n new Uint8Array(view.buffer, view.byteOffset + offset, n * n).set(this._tiles.get(key)!);\r\n offset += n * n;\r\n }\r\n return offset;\r\n }\r\n /**\r\n * Replaces the tiles with ones written by {@link FoliageDensityMask.write}\r\n * @param view - Source\r\n * @param offset - Byte offset to read at\r\n * @returns Byte offset after the data\r\n */\r\n read(view: DataView, offset: number) {\r\n const n = FOLIAGE_MASK_TILE_SIZE;\r\n this._tiles.clear();\r\n const count = view.getUint32(offset, true);\r\n offset += 4;\r\n for (let k = 0; k < count; k++) {\r\n const tx = view.getInt32(offset, true);\r\n const tz = view.getInt32(offset + 4, true);\r\n offset += 8;\r\n const cells = new Uint8Array(view.buffer, view.byteOffset + offset, n * n).slice();\r\n offset += n * n;\r\n if (cells.some((c) => c !== 0)) {\r\n this._tiles.set(tileKey(tx, tz), cells);\r\n }\r\n }\r\n return offset;\r\n }\r\n /** Region covered by an inclusive range of cells */\r\n private cellRegion(i0: number, j0: number, i1: number, j1: number): [number, number, number, number] {\r\n const cs = this._cellSize;\r\n return [i0 * cs, j0 * cs, (i1 + 1) * cs, (j1 + 1) * cs];\r\n }\r\n}\r\n\r\n/**\r\n * Weight of the foliage brush at a distance from its centre: 1 up to `1 - falloff` of the radius,\r\n * then falling smoothly to 0 at the edge\r\n * @param t - Distance from the centre over the radius\r\n * @param falloff - Fraction of the radius over which the weight falls, 0 to 1\r\n * @public\r\n */\r\nexport function foliageBrushWeight(t: number, falloff: number) {\r\n if (t >= 1) {\r\n return 0;\r\n }\r\n const f = Math.min(1, Math.max(0, falloff));\r\n if (f <= 0 || t <= 1 - f) {\r\n return 1;\r\n }\r\n const s = (1 - t) / f;\r\n return s * s * (3 - 2 * s);\r\n}\r\n"],"names":["FOLIAGE_MASK_TILE_SIZE","tileKey","tx","tz","FoliageDensityMask","_cellSize","_tiles","cellSize","Math","max","Map","val","numTiles","size","empty","clear","getCell","i","j","n","floor","tile","get","setCell","value","key","v","round","min","Uint8Array","set","every","c","delete","sample","x","z","fx","fz","u","a","b","d","paintCircle","radius","amount","falloff","cs","i0","i1","j0","j1","changed","w","foliageBrushWeight","hypot","old","next","cellRegion","blendCircle","target","fillCircle","r2","dx","dz","getBounds","tx0","Infinity","tz0","tx1","tz1","keys","split","map","Number","getTileRegions","out","push","copyTiles","region","tilesInRegion","cells","slice","restoreTiles","tiles","some","span","byteSize","write","view","offset","setUint32","sort","setInt32","buffer","byteOffset","read","count","getUint32","k","getInt32","t","f","s"],"mappings":"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"}
@@ -2,19 +2,21 @@ import { applyMixins, DRef, Vector3 } from '@zephyr3d/base';
2
2
  import { GraphNode } from './graph_node.js';
3
3
  import { mixinDrawable } from '../render/drawable_mixin.js';
4
4
  import { QUEUE_OPAQUE } from '../values.js';
5
- import '../render/render_queue.js';
6
5
  import { getEngine } from '../app/api.js';
6
+ import { warnUnsupported } from '../utility/unsupported.js';
7
+ import '../render/render_queue.js';
7
8
  import { Primitive } from '../render/primitive.js';
8
9
  import '@zephyr3d/device';
9
10
  import '../material/shader/helper.js';
10
11
  import '../material/lambert.js';
11
12
  import '../material/blinn.js';
12
13
  import '../material/unlit.js';
14
+ import '../material/meshmaterial.js';
13
15
  import '../material/particle.js';
14
16
  import '../material/subsurfaceprofile.js';
15
- import '../material/skin.js';
17
+ import '../material/sssprofile.js';
18
+ import '../material/sss.js';
16
19
  import '../material/eye.js';
17
- import '../material/meshmaterial.js';
18
20
  import '../material/hair.js';
19
21
  import { HairStrandMaterial } from '../material/hairstrand.js';
20
22
  import { HairStrandData } from '../material/hairstrand_data.js';
@@ -32,9 +34,14 @@ import '../render/lightpass.js';
32
34
  import '../render/sky.js';
33
35
  import '../render/clipmap.js';
34
36
  import '../render/envlight.js';
37
+ import '../render/lod.js';
35
38
  import '../render/dualdepthpeeling_oit.js';
36
39
  import '../shaders/atmosphere.js';
40
+ import '../render/water_interaction.js';
37
41
  import '../render/rendergraph/scene_render_context.js';
42
+ import '../render/sdf/scene_sdf.js';
43
+ import '../render/sdf/global_sdf.js';
44
+ import '../render/gi/voxelize_pass.js';
38
45
  import { isHairSimulationSupported, GPUHairSimulation } from '../animation/hair/gpu_hair_simulation.js';
39
46
  import { parseZHair } from '../asset/loaders/zhair/zhair_format.js';
40
47
  import { mergeHairStrandSources, loadZHairStrandSources } from '../asset/loaders/zhair/zhair_loader.js';
@@ -851,7 +858,11 @@ import { BoundingBox } from '../utility/bounding_volume.js';
851
858
  */ _createSimulation() {
852
859
  this._disposeSimulation();
853
860
  const data = this._strands.get();
854
- if (!data || !this._source || !isHairSimulationSupported()) {
861
+ if (!data || !this._source) {
862
+ return;
863
+ }
864
+ if (!isHairSimulationSupported()) {
865
+ warnUnsupported('Hair strand dynamics (Hair.simulationEnabled)', 'WebGPU', 'strands stay in their rest pose');
855
866
  return;
856
867
  }
857
868
  const simulation = new GPUHairSimulation(data, this._source, this._simulationOptions);