@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -0,0 +1,252 @@
1
+ import { Disposable, DRef } from '@zephyr3d/base';
2
+ import { getDevice } from '../app/api.js';
3
+
4
+ /** Floats in one slot: a 4x4 matrix stored as 4 rgba32f texels on one row */ const FLOATS_PER_SLOT = 16;
5
+ /** Texels in one slot */ const TEXELS_PER_SLOT = 4;
6
+ /** Atlas width in texels, a multiple of TEXELS_PER_SLOT so no slot straddles two rows */ const ATLAS_WIDTH = 1024;
7
+ /** Initial atlas height in rows */ const INITIAL_HEIGHT = 64;
8
+ /**
9
+ * Shaders compute texel indices as floats, which stay exact below 2^24, so the atlas never holds
10
+ * more texels than that
11
+ */ const MAX_TEXELS = 1 << 24;
12
+ /**
13
+ * Shared rgba32f texture holding the skinning matrix palettes of all skinned meshes.
14
+ *
15
+ * @remarks
16
+ * The atlas is addressed in slots of 4 texels (one 4x4 matrix, one row per texel), so the
17
+ * shader fetches a matrix the same way it fetched one from a per-skeleton joint texture.
18
+ * Blocks are allocated first-fit from a free list and keep their place until released, so the
19
+ * slot index of a block can be stored in instance data without being rewritten every frame.
20
+ *
21
+ * Writes go to a CPU-side mirror and the dirty rows are uploaded once per frame by {@link flush}.
22
+ * Growing the atlas replaces its texture; {@link changeTag} tells consumers holding the old one.
23
+ * The old texture is only released, so a consumer still holding a reference keeps it alive until
24
+ * it switches over.
25
+ *
26
+ * @internal
27
+ */ class SkinPaletteAtlas extends Disposable {
28
+ static _instance = null;
29
+ static _uploadListeners = [];
30
+ static _replaceListeners = [];
31
+ _texture;
32
+ _data;
33
+ _height;
34
+ /** Free slot ranges sorted by base, never adjacent to each other */ _freeList;
35
+ _dirtyRowMin;
36
+ _dirtyRowMax;
37
+ _changeTag;
38
+ constructor(){
39
+ super();
40
+ this._texture = new DRef();
41
+ this._height = INITIAL_HEIGHT;
42
+ this._data = new Float32Array(ATLAS_WIDTH * this._height * 4);
43
+ this._freeList = [
44
+ {
45
+ base: 0,
46
+ count: this.slotCapacity
47
+ }
48
+ ];
49
+ this._dirtyRowMin = Number.MAX_SAFE_INTEGER;
50
+ this._dirtyRowMax = -1;
51
+ this._changeTag = 0;
52
+ }
53
+ /** The atlas of the current device, created on first use */ static get instance() {
54
+ if (!this._instance || this._instance.disposed) {
55
+ this._instance = new SkinPaletteAtlas();
56
+ }
57
+ return this._instance;
58
+ }
59
+ /** Upload the pending writes of the atlas, if one has been created, then notify upload listeners */ static flushPending() {
60
+ if (this._instance && !this._instance.disposed) {
61
+ const uploaded = this._instance.flush();
62
+ for (const listener of this._uploadListeners){
63
+ listener(uploaded);
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Register a callback run by every {@link flushPending}, told whether rows were uploaded.
69
+ *
70
+ * @remarks
71
+ * For writers of the atlas texture other than the CPU mirror, whose slots an upload of the mirror
72
+ * rows covering them overwrites.
73
+ */ static addUploadListener(listener) {
74
+ this._uploadListeners.push(listener);
75
+ }
76
+ /**
77
+ * Register a callback run each time the atlas grows and replaces its texture.
78
+ *
79
+ * @remarks
80
+ * For consumers holding the texture that are not refreshed every frame, such as skinned meshes
81
+ * sleeping while an animation bank track poses them.
82
+ */ static addTextureReplacedListener(listener) {
83
+ this._replaceListeners.push(listener);
84
+ }
85
+ /** Atlas texture, created on first use and replaced when the atlas grows */ get texture() {
86
+ let texture = this._texture.get();
87
+ if (!texture) {
88
+ const device = getDevice();
89
+ texture = device.createTexture2D('rgba32f', ATLAS_WIDTH, this._height, {
90
+ // Animation bank tracks evaluate their palettes in compute passes on WebGPU
91
+ writable: device.type === 'webgpu',
92
+ mipmapping: false,
93
+ samplerOptions: {
94
+ magFilter: 'nearest',
95
+ minFilter: 'nearest',
96
+ mipFilter: 'none'
97
+ }
98
+ });
99
+ this._texture.set(texture);
100
+ this.markDirtyRows(0, this._height - 1);
101
+ }
102
+ return texture;
103
+ }
104
+ /** Width of the atlas in texels */ get width() {
105
+ return ATLAS_WIDTH;
106
+ }
107
+ /** Height of the atlas in texels */ get height() {
108
+ return this._height;
109
+ }
110
+ /** Increased each time the atlas texture is replaced */ get changeTag() {
111
+ return this._changeTag;
112
+ }
113
+ /** Number of slots the atlas holds at its current size */ get slotCapacity() {
114
+ return ATLAS_WIDTH * this._height / TEXELS_PER_SLOT;
115
+ }
116
+ /**
117
+ * Allocate a block of consecutive slots, growing the atlas when no free range is large enough.
118
+ *
119
+ * @param count - Number of slots
120
+ * @returns The allocated block
121
+ */ allocate(count) {
122
+ count = Math.max(1, Math.ceil(count));
123
+ for(;;){
124
+ for(let i = 0; i < this._freeList.length; i++){
125
+ const range = this._freeList[i];
126
+ if (range.count >= count) {
127
+ const block = {
128
+ base: range.base,
129
+ count
130
+ };
131
+ range.base += count;
132
+ range.count -= count;
133
+ if (range.count === 0) {
134
+ this._freeList.splice(i, 1);
135
+ }
136
+ return block;
137
+ }
138
+ }
139
+ this.grow(count);
140
+ }
141
+ }
142
+ /**
143
+ * Return a block to the free list, merging it with adjacent free ranges.
144
+ *
145
+ * @param block - Block returned by {@link allocate}
146
+ */ free(block) {
147
+ let i = 0;
148
+ while(i < this._freeList.length && this._freeList[i].base < block.base){
149
+ i++;
150
+ }
151
+ const prev = i > 0 ? this._freeList[i - 1] : null;
152
+ const next = i < this._freeList.length ? this._freeList[i] : null;
153
+ if (prev && prev.base + prev.count === block.base) {
154
+ prev.count += block.count;
155
+ if (next && prev.base + prev.count === next.base) {
156
+ prev.count += next.count;
157
+ this._freeList.splice(i, 1);
158
+ }
159
+ } else if (next && block.base + block.count === next.base) {
160
+ next.base = block.base;
161
+ next.count += block.count;
162
+ } else {
163
+ this._freeList.splice(i, 0, {
164
+ base: block.base,
165
+ count: block.count
166
+ });
167
+ }
168
+ }
169
+ /**
170
+ * Write consecutive slots to the CPU-side mirror and mark their rows dirty.
171
+ *
172
+ * @param slot - Index of the first slot
173
+ * @param values - Slot contents, 16 floats per slot
174
+ * @param slotCount - Number of slots to write, defaults to all slots in `values`
175
+ */ writeSlots(slot, values, slotCount) {
176
+ slotCount = slotCount ?? Math.floor(values.length / FLOATS_PER_SLOT);
177
+ const floatCount = slotCount * FLOATS_PER_SLOT;
178
+ const offset = slot * FLOATS_PER_SLOT;
179
+ if (values.length === floatCount) {
180
+ this._data.set(values, offset);
181
+ } else {
182
+ for(let i = 0; i < floatCount; i++){
183
+ this._data[offset + i] = values[i];
184
+ }
185
+ }
186
+ this.markDirtySlots(slot, slotCount);
187
+ }
188
+ /**
189
+ * Upload the rows written since the last flush to the atlas texture.
190
+ *
191
+ * @returns Whether any rows were uploaded
192
+ */ flush() {
193
+ if (this._dirtyRowMax < 0) {
194
+ return false;
195
+ }
196
+ const texture = this.texture;
197
+ const rowFloats = ATLAS_WIDTH * 4;
198
+ const rowMin = this._dirtyRowMin;
199
+ const rowCount = this._dirtyRowMax - rowMin + 1;
200
+ texture.update(this._data.subarray(rowMin * rowFloats, (rowMin + rowCount) * rowFloats), 0, rowMin, ATLAS_WIDTH, rowCount);
201
+ this._dirtyRowMin = Number.MAX_SAFE_INTEGER;
202
+ this._dirtyRowMax = -1;
203
+ return true;
204
+ }
205
+ /** @internal */ onDispose() {
206
+ super.onDispose();
207
+ this._texture.dispose();
208
+ if (SkinPaletteAtlas._instance === this) {
209
+ SkinPaletteAtlas._instance = null;
210
+ }
211
+ }
212
+ /** Mark the rows covering a range of slots dirty */ markDirtySlots(slot, slotCount) {
213
+ if (slotCount > 0) {
214
+ const slotsPerRow = ATLAS_WIDTH / TEXELS_PER_SLOT;
215
+ this.markDirtyRows(Math.floor(slot / slotsPerRow), Math.floor((slot + slotCount - 1) / slotsPerRow));
216
+ }
217
+ }
218
+ markDirtyRows(rowMin, rowMax) {
219
+ this._dirtyRowMin = Math.min(this._dirtyRowMin, rowMin);
220
+ this._dirtyRowMax = Math.max(this._dirtyRowMax, rowMax);
221
+ }
222
+ /** Double the height until a block of the given slot count fits at the end */ grow(count) {
223
+ const maxHeight = Math.min(getDevice().getDeviceCaps().textureCaps.maxTextureSize, MAX_TEXELS / ATLAS_WIDTH);
224
+ const last = this._freeList[this._freeList.length - 1];
225
+ const tailFree = last && last.base + last.count === this.slotCapacity ? last.count : 0;
226
+ let height = this._height;
227
+ while((height - this._height) * ATLAS_WIDTH / TEXELS_PER_SLOT + tailFree < count){
228
+ height *= 2;
229
+ if (height > maxHeight) {
230
+ throw new Error(`SkinPaletteAtlas: cannot allocate ${count} slots, atlas is full`);
231
+ }
232
+ }
233
+ const oldCapacity = this.slotCapacity;
234
+ const data = new Float32Array(ATLAS_WIDTH * height * 4);
235
+ data.set(this._data);
236
+ this._data = data;
237
+ this._height = height;
238
+ this.free({
239
+ base: oldCapacity,
240
+ count: this.slotCapacity - oldCapacity
241
+ });
242
+ this._texture.set(null);
243
+ this.markDirtyRows(0, height - 1);
244
+ this._changeTag++;
245
+ for (const listener of SkinPaletteAtlas._replaceListeners){
246
+ listener();
247
+ }
248
+ }
249
+ }
250
+
251
+ export { SkinPaletteAtlas };
252
+ //# sourceMappingURL=skin_palette_atlas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin_palette_atlas.js","sources":["../../src/animation/skin_palette_atlas.ts"],"sourcesContent":["import { DRef, Disposable } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** Floats in one slot: a 4x4 matrix stored as 4 rgba32f texels on one row */\r\nconst FLOATS_PER_SLOT = 16;\r\n/** Texels in one slot */\r\nconst TEXELS_PER_SLOT = 4;\r\n/** Atlas width in texels, a multiple of TEXELS_PER_SLOT so no slot straddles two rows */\r\nconst ATLAS_WIDTH = 1024;\r\n/** Initial atlas height in rows */\r\nconst INITIAL_HEIGHT = 64;\r\n/**\r\n * Shaders compute texel indices as floats, which stay exact below 2^24, so the atlas never holds\r\n * more texels than that\r\n */\r\nconst MAX_TEXELS = 1 << 24;\r\n\r\n/**\r\n * A range of slots allocated in the skin palette atlas.\r\n *\r\n * @internal\r\n */\r\nexport interface SkinPaletteBlock {\r\n /** Index of the first slot */\r\n readonly base: number;\r\n /** Number of slots */\r\n readonly count: number;\r\n}\r\n\r\n/**\r\n * Shared rgba32f texture holding the skinning matrix palettes of all skinned meshes.\r\n *\r\n * @remarks\r\n * The atlas is addressed in slots of 4 texels (one 4x4 matrix, one row per texel), so the\r\n * shader fetches a matrix the same way it fetched one from a per-skeleton joint texture.\r\n * Blocks are allocated first-fit from a free list and keep their place until released, so the\r\n * slot index of a block can be stored in instance data without being rewritten every frame.\r\n *\r\n * Writes go to a CPU-side mirror and the dirty rows are uploaded once per frame by {@link flush}.\r\n * Growing the atlas replaces its texture; {@link changeTag} tells consumers holding the old one.\r\n * The old texture is only released, so a consumer still holding a reference keeps it alive until\r\n * it switches over.\r\n *\r\n * @internal\r\n */\r\nexport class SkinPaletteAtlas extends Disposable {\r\n private static _instance: Nullable<SkinPaletteAtlas> = null;\r\n private static readonly _uploadListeners: ((uploaded: boolean) => void)[] = [];\r\n private static readonly _replaceListeners: (() => void)[] = [];\r\n private readonly _texture: DRef<Texture2D>;\r\n private _data: Float32Array<ArrayBuffer>;\r\n private _height: number;\r\n /** Free slot ranges sorted by base, never adjacent to each other */\r\n private readonly _freeList: { base: number; count: number }[];\r\n private _dirtyRowMin: number;\r\n private _dirtyRowMax: number;\r\n private _changeTag: number;\r\n private constructor() {\r\n super();\r\n this._texture = new DRef();\r\n this._height = INITIAL_HEIGHT;\r\n this._data = new Float32Array(ATLAS_WIDTH * this._height * 4);\r\n this._freeList = [{ base: 0, count: this.slotCapacity }];\r\n this._dirtyRowMin = Number.MAX_SAFE_INTEGER;\r\n this._dirtyRowMax = -1;\r\n this._changeTag = 0;\r\n }\r\n /** The atlas of the current device, created on first use */\r\n static get instance() {\r\n if (!this._instance || this._instance.disposed) {\r\n this._instance = new SkinPaletteAtlas();\r\n }\r\n return this._instance;\r\n }\r\n /** Upload the pending writes of the atlas, if one has been created, then notify upload listeners */\r\n static flushPending() {\r\n if (this._instance && !this._instance.disposed) {\r\n const uploaded = this._instance.flush();\r\n for (const listener of this._uploadListeners) {\r\n listener(uploaded);\r\n }\r\n }\r\n }\r\n /**\r\n * Register a callback run by every {@link flushPending}, told whether rows were uploaded.\r\n *\r\n * @remarks\r\n * For writers of the atlas texture other than the CPU mirror, whose slots an upload of the mirror\r\n * rows covering them overwrites.\r\n */\r\n static addUploadListener(listener: (uploaded: boolean) => void) {\r\n this._uploadListeners.push(listener);\r\n }\r\n /**\r\n * Register a callback run each time the atlas grows and replaces its texture.\r\n *\r\n * @remarks\r\n * For consumers holding the texture that are not refreshed every frame, such as skinned meshes\r\n * sleeping while an animation bank track poses them.\r\n */\r\n static addTextureReplacedListener(listener: () => void) {\r\n this._replaceListeners.push(listener);\r\n }\r\n /** Atlas texture, created on first use and replaced when the atlas grows */\r\n get texture() {\r\n let texture = this._texture.get();\r\n if (!texture) {\r\n const device = getDevice();\r\n texture = device.createTexture2D('rgba32f', ATLAS_WIDTH, this._height, {\r\n // Animation bank tracks evaluate their palettes in compute passes on WebGPU\r\n writable: device.type === 'webgpu',\r\n mipmapping: false,\r\n samplerOptions: {\r\n magFilter: 'nearest',\r\n minFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n this._texture.set(texture);\r\n this.markDirtyRows(0, this._height - 1);\r\n }\r\n return texture;\r\n }\r\n /** Width of the atlas in texels */\r\n get width() {\r\n return ATLAS_WIDTH;\r\n }\r\n /** Height of the atlas in texels */\r\n get height() {\r\n return this._height;\r\n }\r\n /** Increased each time the atlas texture is replaced */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /** Number of slots the atlas holds at its current size */\r\n get slotCapacity() {\r\n return (ATLAS_WIDTH * this._height) / TEXELS_PER_SLOT;\r\n }\r\n /**\r\n * Allocate a block of consecutive slots, growing the atlas when no free range is large enough.\r\n *\r\n * @param count - Number of slots\r\n * @returns The allocated block\r\n */\r\n allocate(count: number): SkinPaletteBlock {\r\n count = Math.max(1, Math.ceil(count));\r\n for (;;) {\r\n for (let i = 0; i < this._freeList.length; i++) {\r\n const range = this._freeList[i];\r\n if (range.count >= count) {\r\n const block = { base: range.base, count };\r\n range.base += count;\r\n range.count -= count;\r\n if (range.count === 0) {\r\n this._freeList.splice(i, 1);\r\n }\r\n return block;\r\n }\r\n }\r\n this.grow(count);\r\n }\r\n }\r\n /**\r\n * Return a block to the free list, merging it with adjacent free ranges.\r\n *\r\n * @param block - Block returned by {@link allocate}\r\n */\r\n free(block: SkinPaletteBlock) {\r\n let i = 0;\r\n while (i < this._freeList.length && this._freeList[i].base < block.base) {\r\n i++;\r\n }\r\n const prev = i > 0 ? this._freeList[i - 1] : null;\r\n const next = i < this._freeList.length ? this._freeList[i] : null;\r\n if (prev && prev.base + prev.count === block.base) {\r\n prev.count += block.count;\r\n if (next && prev.base + prev.count === next.base) {\r\n prev.count += next.count;\r\n this._freeList.splice(i, 1);\r\n }\r\n } else if (next && block.base + block.count === next.base) {\r\n next.base = block.base;\r\n next.count += block.count;\r\n } else {\r\n this._freeList.splice(i, 0, { base: block.base, count: block.count });\r\n }\r\n }\r\n /**\r\n * Write consecutive slots to the CPU-side mirror and mark their rows dirty.\r\n *\r\n * @param slot - Index of the first slot\r\n * @param values - Slot contents, 16 floats per slot\r\n * @param slotCount - Number of slots to write, defaults to all slots in `values`\r\n */\r\n writeSlots(slot: number, values: ArrayLike<number>, slotCount?: number) {\r\n slotCount = slotCount ?? Math.floor(values.length / FLOATS_PER_SLOT);\r\n const floatCount = slotCount * FLOATS_PER_SLOT;\r\n const offset = slot * FLOATS_PER_SLOT;\r\n if (values.length === floatCount) {\r\n this._data.set(values, offset);\r\n } else {\r\n for (let i = 0; i < floatCount; i++) {\r\n this._data[offset + i] = values[i];\r\n }\r\n }\r\n this.markDirtySlots(slot, slotCount);\r\n }\r\n /**\r\n * Upload the rows written since the last flush to the atlas texture.\r\n *\r\n * @returns Whether any rows were uploaded\r\n */\r\n flush() {\r\n if (this._dirtyRowMax < 0) {\r\n return false;\r\n }\r\n const texture = this.texture;\r\n const rowFloats = ATLAS_WIDTH * 4;\r\n const rowMin = this._dirtyRowMin;\r\n const rowCount = this._dirtyRowMax - rowMin + 1;\r\n texture.update(\r\n this._data.subarray(rowMin * rowFloats, (rowMin + rowCount) * rowFloats),\r\n 0,\r\n rowMin,\r\n ATLAS_WIDTH,\r\n rowCount\r\n );\r\n this._dirtyRowMin = Number.MAX_SAFE_INTEGER;\r\n this._dirtyRowMax = -1;\r\n return true;\r\n }\r\n /** @internal */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._texture.dispose();\r\n if (SkinPaletteAtlas._instance === this) {\r\n SkinPaletteAtlas._instance = null;\r\n }\r\n }\r\n /** Mark the rows covering a range of slots dirty */\r\n private markDirtySlots(slot: number, slotCount: number) {\r\n if (slotCount > 0) {\r\n const slotsPerRow = ATLAS_WIDTH / TEXELS_PER_SLOT;\r\n this.markDirtyRows(Math.floor(slot / slotsPerRow), Math.floor((slot + slotCount - 1) / slotsPerRow));\r\n }\r\n }\r\n private markDirtyRows(rowMin: number, rowMax: number) {\r\n this._dirtyRowMin = Math.min(this._dirtyRowMin, rowMin);\r\n this._dirtyRowMax = Math.max(this._dirtyRowMax, rowMax);\r\n }\r\n /** Double the height until a block of the given slot count fits at the end */\r\n private grow(count: number) {\r\n const maxHeight = Math.min(\r\n getDevice().getDeviceCaps().textureCaps.maxTextureSize,\r\n MAX_TEXELS / ATLAS_WIDTH\r\n );\r\n const last = this._freeList[this._freeList.length - 1];\r\n const tailFree = last && last.base + last.count === this.slotCapacity ? last.count : 0;\r\n let height = this._height;\r\n while (((height - this._height) * ATLAS_WIDTH) / TEXELS_PER_SLOT + tailFree < count) {\r\n height *= 2;\r\n if (height > maxHeight) {\r\n throw new Error(`SkinPaletteAtlas: cannot allocate ${count} slots, atlas is full`);\r\n }\r\n }\r\n const oldCapacity = this.slotCapacity;\r\n const data = new Float32Array(ATLAS_WIDTH * height * 4);\r\n data.set(this._data);\r\n this._data = data;\r\n this._height = height;\r\n this.free({ base: oldCapacity, count: this.slotCapacity - oldCapacity });\r\n this._texture.set(null);\r\n this.markDirtyRows(0, height - 1);\r\n this._changeTag++;\r\n for (const listener of SkinPaletteAtlas._replaceListeners) {\r\n listener();\r\n }\r\n }\r\n}\r\n"],"names":["FLOATS_PER_SLOT","TEXELS_PER_SLOT","ATLAS_WIDTH","INITIAL_HEIGHT","MAX_TEXELS","SkinPaletteAtlas","Disposable","_instance","_uploadListeners","_replaceListeners","_texture","_data","_height","_dirtyRowMin","_dirtyRowMax","_changeTag","DRef","Float32Array","_freeList","base","count","slotCapacity","Number","MAX_SAFE_INTEGER","instance","disposed","flushPending","uploaded","flush","listener","addUploadListener","push","addTextureReplacedListener","texture","get","device","getDevice","createTexture2D","writable","type","mipmapping","samplerOptions","magFilter","minFilter","mipFilter","set","markDirtyRows","width","height","changeTag","allocate","Math","max","ceil","i","length","range","block","splice","grow","free","prev","next","writeSlots","slot","values","slotCount","floor","floatCount","offset","markDirtySlots","rowFloats","rowMin","rowCount","update","subarray","onDispose","dispose","slotsPerRow","rowMax","min","maxHeight","getDeviceCaps","textureCaps","maxTextureSize","last","tailFree","Error","oldCapacity","data"],"mappings":"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"}