@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,209 @@
1
+ import { PBPrimitiveType } from '@zephyr3d/device';
2
+
3
+ function scalarByteSize(type) {
4
+ switch(type){
5
+ case PBPrimitiveType.I16:
6
+ case PBPrimitiveType.I16_NORM:
7
+ case PBPrimitiveType.U16:
8
+ case PBPrimitiveType.U16_NORM:
9
+ case PBPrimitiveType.F16:
10
+ return 2;
11
+ case PBPrimitiveType.I32:
12
+ case PBPrimitiveType.I32_NORM:
13
+ case PBPrimitiveType.U32:
14
+ case PBPrimitiveType.U32_NORM:
15
+ case PBPrimitiveType.F32:
16
+ return 4;
17
+ default:
18
+ return 1;
19
+ }
20
+ }
21
+ function readScalar(view, byteOffset, scalarType, normalized) {
22
+ switch(scalarType){
23
+ case PBPrimitiveType.I8:
24
+ case PBPrimitiveType.I8_NORM:
25
+ {
26
+ const value = view.getInt8(byteOffset);
27
+ return normalized ? Math.max(-1, value / 127) : value;
28
+ }
29
+ case PBPrimitiveType.U8:
30
+ case PBPrimitiveType.U8_NORM:
31
+ {
32
+ const value = view.getUint8(byteOffset);
33
+ return normalized ? value / 255 : value;
34
+ }
35
+ case PBPrimitiveType.I16:
36
+ case PBPrimitiveType.I16_NORM:
37
+ {
38
+ const value = view.getInt16(byteOffset, true);
39
+ return normalized ? Math.max(-1, value / 32767) : value;
40
+ }
41
+ case PBPrimitiveType.U16:
42
+ case PBPrimitiveType.U16_NORM:
43
+ {
44
+ const value = view.getUint16(byteOffset, true);
45
+ return normalized ? value / 65535 : value;
46
+ }
47
+ case PBPrimitiveType.I32:
48
+ case PBPrimitiveType.I32_NORM:
49
+ {
50
+ const value = view.getInt32(byteOffset, true);
51
+ return normalized ? Math.max(-1, value / 2147483647) : value;
52
+ }
53
+ case PBPrimitiveType.U32:
54
+ case PBPrimitiveType.U32_NORM:
55
+ {
56
+ const value = view.getUint32(byteOffset, true);
57
+ return normalized ? value / 4294967295 : value;
58
+ }
59
+ case PBPrimitiveType.F32:
60
+ return view.getFloat32(byteOffset, true);
61
+ default:
62
+ return 0;
63
+ }
64
+ }
65
+ /**
66
+ * Reads a vertex attribute of a primitive back from the GPU, as tightly packed
67
+ * floats: `componentCount` per vertex, for every vertex in the vertex buffer.
68
+ *
69
+ * @remarks
70
+ * Handles interleaved buffers and integer formats, normalized or not. Half
71
+ * float attributes are not supported and throw.
72
+ *
73
+ * @returns The data, or null if the primitive has no such attribute or it has
74
+ * fewer than `componentCount` components.
75
+ *
76
+ * @public
77
+ */ async function readPrimitiveAttribute(primitive, semantic, componentCount) {
78
+ const info = primitive.getVertexBufferInfo(semantic);
79
+ if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {
80
+ return null;
81
+ }
82
+ const vertexCount = primitive.getNumVertices();
83
+ if (vertexCount <= 0) {
84
+ return null;
85
+ }
86
+ const bytes = await info.buffer.getBufferSubData();
87
+ const result = new Float32Array(vertexCount * componentCount);
88
+ const scalarType = info.type.scalarType;
89
+ const normalized = info.type.normalized;
90
+ const componentByteSize = scalarByteSize(scalarType);
91
+ const baseByteOffset = info.drawOffset + info.offset;
92
+ if (scalarType === PBPrimitiveType.F32 && !normalized && baseByteOffset % 4 === 0 && info.stride % 4 === 0) {
93
+ const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
94
+ const stride = info.stride >> 2;
95
+ const srcOffset = baseByteOffset >> 2;
96
+ for(let i = 0; i < vertexCount; i++){
97
+ const src = srcOffset + i * stride;
98
+ const dst = i * componentCount;
99
+ for(let c = 0; c < componentCount; c++){
100
+ result[dst + c] = raw[src + c];
101
+ }
102
+ }
103
+ return result;
104
+ }
105
+ if (scalarType === PBPrimitiveType.F16) {
106
+ throw new Error(`Unsupported ${semantic} attribute format: half float`);
107
+ }
108
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
109
+ for(let i = 0; i < vertexCount; i++){
110
+ const src = baseByteOffset + i * info.stride;
111
+ const dst = i * componentCount;
112
+ for(let c = 0; c < componentCount; c++){
113
+ result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);
114
+ }
115
+ }
116
+ return result;
117
+ }
118
+ /**
119
+ * Reads a range of a triangle-list primitive's indices back from the GPU, as
120
+ * indices into its whole vertex buffer.
121
+ *
122
+ * @remarks
123
+ * The range defaults to what the primitive draws at full detail: its
124
+ * `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only
125
+ * (the other levels are further ranges of the same index buffer). For a
126
+ * primitive without an index buffer the range is of vertices.
127
+ *
128
+ * @public
129
+ */ async function readPrimitiveIndices(primitive, indexStart = primitive.indexStart, indexCount = primitive.indexCount) {
130
+ if (primitive.primitiveType !== 'triangle-list') {
131
+ throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);
132
+ }
133
+ if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {
134
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
135
+ }
136
+ const indexBuffer = primitive.getIndexBuffer();
137
+ if (!indexBuffer) {
138
+ if (indexStart + indexCount > primitive.getNumVertices()) {
139
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
140
+ }
141
+ const indices = new Uint32Array(indexCount);
142
+ for(let i = 0; i < indexCount; i++){
143
+ indices[i] = indexStart + i;
144
+ }
145
+ return indices;
146
+ }
147
+ const bytes = await indexBuffer.getBufferSubData();
148
+ const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;
149
+ const all = is16 ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1) : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);
150
+ if (indexStart + indexCount > all.length) {
151
+ throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);
152
+ }
153
+ return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));
154
+ }
155
+ /**
156
+ * Reads the triangles of one level of detail of a triangle-list primitive back
157
+ * from the GPU, keeping only the vertices they use.
158
+ *
159
+ * @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's
160
+ * lowest detail use the lowest.
161
+ *
162
+ * @public
163
+ */ async function readPrimitiveTriangles(primitive, lod = 0) {
164
+ const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);
165
+ const [indexStart, indexCount] = level === 0 ? [
166
+ primitive.indexStart,
167
+ primitive.indexCount
168
+ ] : [
169
+ primitive.lods[level - 1].indexStart,
170
+ primitive.lods[level - 1].indexCount
171
+ ];
172
+ const [positions, indices] = await Promise.all([
173
+ readPrimitiveAttribute(primitive, 'position', 3),
174
+ readPrimitiveIndices(primitive, indexStart, indexCount)
175
+ ]);
176
+ if (!positions) {
177
+ throw new Error('Primitive has no vertex positions');
178
+ }
179
+ // Other levels share the vertex buffer; keep only the vertices this one uses.
180
+ const vertexCount = positions.length / 3;
181
+ const remap = new Int32Array(vertexCount).fill(-1);
182
+ let used = 0;
183
+ for(let i = 0; i < indices.length; i++){
184
+ const v = indices[i];
185
+ if (v >= vertexCount) {
186
+ throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);
187
+ }
188
+ if (remap[v] < 0) {
189
+ remap[v] = used++;
190
+ }
191
+ indices[i] = remap[v];
192
+ }
193
+ const compact = new Float32Array(used * 3);
194
+ for(let v = 0; v < vertexCount; v++){
195
+ const dst = remap[v];
196
+ if (dst >= 0) {
197
+ compact[dst * 3] = positions[v * 3];
198
+ compact[dst * 3 + 1] = positions[v * 3 + 1];
199
+ compact[dst * 3 + 2] = positions[v * 3 + 2];
200
+ }
201
+ }
202
+ return {
203
+ positions: compact,
204
+ indices
205
+ };
206
+ }
207
+
208
+ export { readPrimitiveAttribute, readPrimitiveIndices, readPrimitiveTriangles };
209
+ //# sourceMappingURL=primitive_readback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitive_readback.js","sources":["../../src/render/primitive_readback.ts"],"sourcesContent":["import { PBPrimitiveType } from '@zephyr3d/device';\r\nimport type { Primitive } from './primitive';\r\n\r\n/**\r\n * Triangles read back from a primitive, with only the vertices they use.\r\n *\r\n * @public\r\n */\r\nexport interface PrimitiveTriangles {\r\n /** Vertex positions in the primitive's local space, xyz per vertex. */\r\n positions: Float32Array<ArrayBuffer>;\r\n /** Three indices into `positions` per triangle. */\r\n indices: Uint32Array<ArrayBuffer>;\r\n}\r\n\r\nfunction scalarByteSize(type: PBPrimitiveType) {\r\n switch (type) {\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM:\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM:\r\n case PBPrimitiveType.F16:\r\n return 2;\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM:\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM:\r\n case PBPrimitiveType.F32:\r\n return 4;\r\n default:\r\n return 1;\r\n }\r\n}\r\n\r\nfunction readScalar(view: DataView, byteOffset: number, scalarType: PBPrimitiveType, normalized: boolean) {\r\n switch (scalarType) {\r\n case PBPrimitiveType.I8:\r\n case PBPrimitiveType.I8_NORM: {\r\n const value = view.getInt8(byteOffset);\r\n return normalized ? Math.max(-1, value / 127) : value;\r\n }\r\n case PBPrimitiveType.U8:\r\n case PBPrimitiveType.U8_NORM: {\r\n const value = view.getUint8(byteOffset);\r\n return normalized ? value / 255 : value;\r\n }\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM: {\r\n const value = view.getInt16(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 32767) : value;\r\n }\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM: {\r\n const value = view.getUint16(byteOffset, true);\r\n return normalized ? value / 65535 : value;\r\n }\r\n case PBPrimitiveType.I32:\r\n case PBPrimitiveType.I32_NORM: {\r\n const value = view.getInt32(byteOffset, true);\r\n return normalized ? Math.max(-1, value / 2147483647) : value;\r\n }\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.U32_NORM: {\r\n const value = view.getUint32(byteOffset, true);\r\n return normalized ? value / 4294967295 : value;\r\n }\r\n case PBPrimitiveType.F32:\r\n return view.getFloat32(byteOffset, true);\r\n default:\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Reads a vertex attribute of a primitive back from the GPU, as tightly packed\r\n * floats: `componentCount` per vertex, for every vertex in the vertex buffer.\r\n *\r\n * @remarks\r\n * Handles interleaved buffers and integer formats, normalized or not. Half\r\n * float attributes are not supported and throw.\r\n *\r\n * @returns The data, or null if the primitive has no such attribute or it has\r\n * fewer than `componentCount` components.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveAttribute(\r\n primitive: Primitive,\r\n semantic: 'position' | 'normal' | 'blendIndices' | 'blendWeights',\r\n componentCount: number\r\n): Promise<Float32Array<ArrayBuffer> | null> {\r\n const info = primitive.getVertexBufferInfo(semantic);\r\n if (!info || !info.type.isPrimitiveType() || info.type.cols < componentCount) {\r\n return null;\r\n }\r\n const vertexCount = primitive.getNumVertices();\r\n if (vertexCount <= 0) {\r\n return null;\r\n }\r\n const bytes = await info.buffer.getBufferSubData();\r\n const result = new Float32Array(vertexCount * componentCount);\r\n const scalarType = info.type.scalarType;\r\n const normalized = info.type.normalized;\r\n const componentByteSize = scalarByteSize(scalarType);\r\n const baseByteOffset = info.drawOffset + info.offset;\r\n if (\r\n scalarType === PBPrimitiveType.F32 &&\r\n !normalized &&\r\n baseByteOffset % 4 === 0 &&\r\n info.stride % 4 === 0\r\n ) {\r\n const raw = new Float32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n const stride = info.stride >> 2;\r\n const srcOffset = baseByteOffset >> 2;\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = srcOffset + i * stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = raw[src + c];\r\n }\r\n }\r\n return result;\r\n }\r\n if (scalarType === PBPrimitiveType.F16) {\r\n throw new Error(`Unsupported ${semantic} attribute format: half float`);\r\n }\r\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\r\n for (let i = 0; i < vertexCount; i++) {\r\n const src = baseByteOffset + i * info.stride;\r\n const dst = i * componentCount;\r\n for (let c = 0; c < componentCount; c++) {\r\n result[dst + c] = readScalar(view, src + c * componentByteSize, scalarType, normalized);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Reads a range of a triangle-list primitive's indices back from the GPU, as\r\n * indices into its whole vertex buffer.\r\n *\r\n * @remarks\r\n * The range defaults to what the primitive draws at full detail: its\r\n * `indexStart` and `indexCount`, which for a primitive with LODs is LOD 0 only\r\n * (the other levels are further ranges of the same index buffer). For a\r\n * primitive without an index buffer the range is of vertices.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveIndices(\r\n primitive: Primitive,\r\n indexStart = primitive.indexStart,\r\n indexCount = primitive.indexCount\r\n): Promise<Uint32Array<ArrayBuffer>> {\r\n if (primitive.primitiveType !== 'triangle-list') {\r\n throw new Error(`Only triangle-list primitives can be read as triangles, not ${primitive.primitiveType}`);\r\n }\r\n if (indexCount <= 0 || indexCount % 3 !== 0 || indexStart < 0) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indexBuffer = primitive.getIndexBuffer();\r\n if (!indexBuffer) {\r\n if (indexStart + indexCount > primitive.getNumVertices()) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n const indices = new Uint32Array(indexCount);\r\n for (let i = 0; i < indexCount; i++) {\r\n indices[i] = indexStart + i;\r\n }\r\n return indices;\r\n }\r\n const bytes = await indexBuffer.getBufferSubData();\r\n const is16 = indexBuffer.indexType.primitiveType === PBPrimitiveType.U16;\r\n const all = is16\r\n ? new Uint16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 1)\r\n : new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\r\n if (indexStart + indexCount > all.length) {\r\n throw new Error(`Invalid triangle range: start ${indexStart}, count ${indexCount}`);\r\n }\r\n return Uint32Array.from(all.subarray(indexStart, indexStart + indexCount));\r\n}\r\n\r\n/**\r\n * Reads the triangles of one level of detail of a triangle-list primitive back\r\n * from the GPU, keeping only the vertices they use.\r\n *\r\n * @param lod - Level of detail; 0 is full detail. Levels beyond the primitive's\r\n * lowest detail use the lowest.\r\n *\r\n * @public\r\n */\r\nexport async function readPrimitiveTriangles(primitive: Primitive, lod = 0): Promise<PrimitiveTriangles> {\r\n const level = Math.min(Math.max(0, Math.floor(lod)), primitive.lods.length);\r\n const [indexStart, indexCount] =\r\n level === 0\r\n ? [primitive.indexStart, primitive.indexCount]\r\n : [primitive.lods[level - 1].indexStart, primitive.lods[level - 1].indexCount];\r\n const [positions, indices] = await Promise.all([\r\n readPrimitiveAttribute(primitive, 'position', 3),\r\n readPrimitiveIndices(primitive, indexStart, indexCount)\r\n ]);\r\n if (!positions) {\r\n throw new Error('Primitive has no vertex positions');\r\n }\r\n // Other levels share the vertex buffer; keep only the vertices this one uses.\r\n const vertexCount = positions.length / 3;\r\n const remap = new Int32Array(vertexCount).fill(-1);\r\n let used = 0;\r\n for (let i = 0; i < indices.length; i++) {\r\n const v = indices[i];\r\n if (v >= vertexCount) {\r\n throw new Error(`Index ${v} out of range of ${vertexCount} vertices`);\r\n }\r\n if (remap[v] < 0) {\r\n remap[v] = used++;\r\n }\r\n indices[i] = remap[v];\r\n }\r\n const compact = new Float32Array(used * 3);\r\n for (let v = 0; v < vertexCount; v++) {\r\n const dst = remap[v];\r\n if (dst >= 0) {\r\n compact[dst * 3] = positions[v * 3];\r\n compact[dst * 3 + 1] = positions[v * 3 + 1];\r\n compact[dst * 3 + 2] = positions[v * 3 + 2];\r\n }\r\n }\r\n return { positions: compact, indices };\r\n}\r\n"],"names":["scalarByteSize","type","PBPrimitiveType","I16","I16_NORM","U16","U16_NORM","F16","I32","I32_NORM","U32","U32_NORM","F32","readScalar","view","byteOffset","scalarType","normalized","I8","I8_NORM","value","getInt8","Math","max","U8","U8_NORM","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","readPrimitiveAttribute","primitive","semantic","componentCount","info","getVertexBufferInfo","isPrimitiveType","cols","vertexCount","getNumVertices","bytes","buffer","getBufferSubData","result","Float32Array","componentByteSize","baseByteOffset","drawOffset","offset","stride","raw","byteLength","srcOffset","i","src","dst","c","Error","DataView","readPrimitiveIndices","indexStart","indexCount","primitiveType","indexBuffer","getIndexBuffer","indices","Uint32Array","is16","indexType","all","Uint16Array","length","from","subarray","readPrimitiveTriangles","lod","level","min","floor","lods","positions","Promise","remap","Int32Array","fill","used","v","compact"],"mappings":"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"}
@@ -5,13 +5,14 @@ import { ShaderHelper } from '../material/shader/helper.js';
5
5
  import '../material/lambert.js';
6
6
  import '../material/blinn.js';
7
7
  import '../material/unlit.js';
8
+ import '../material/meshmaterial.js';
8
9
  import '../material/particle.js';
9
10
  import '../material/subsurfaceprofile.js';
10
- import '../material/skin.js';
11
+ import '../material/sssprofile.js';
12
+ import '../material/sss.js';
11
13
  import '../material/eye.js';
12
14
  import { RenderBundleWrapper } from './renderbundle_wrapper.js';
13
15
  import { getDevice } from '../app/api.js';
14
- import '../material/meshmaterial.js';
15
16
  import '../material/hair.js';
16
17
  import '../material/hairstrand.js';
17
18
  import '../material/grassmaterial.js';
@@ -23,6 +24,7 @@ import '../material/pbrblueprint.js';
23
24
  import '../material/sprite.js';
24
25
  import '../material/sprite_std.js';
25
26
  import '../utility/blueprint/material/texture.js';
27
+ import { InstanceCuller } from './instance_culling.js';
26
28
 
27
29
  const maxBufferSizeInFloats = 65536 / 4;
28
30
  /**
@@ -117,10 +119,17 @@ const tmpDrawablePos = new Vector3();
117
119
  _needSceneColorWithDepth;
118
120
  /** @internal */ _drawTransparent;
119
121
  /** @internal */ _objectColorMaps;
122
+ /** @internal */ _cullCamera;
123
+ /** @internal */ _lodCamera;
124
+ /** @internal Culls the instances of the batches on the GPU, see InstanceCuller */ _instanceCuller;
125
+ /** @internal Queues pushed into this one, which may cull their instances for its view */ _childQueues;
120
126
  /**
121
127
  * Creates an instance of a render queue
122
128
  * @param renderPass - The render pass to which the render queue belongs
123
- */ constructor(renderPass, bindGroupAllocator){
129
+ * @param bindGroupAllocator - Allocator of instance data, default the shared one
130
+ * @param instanceCulling - Whether the instances of the batches are frustum culled on the GPU
131
+ * for each view the queue is pushed to, where supported. For queues built once and replayed
132
+ */ constructor(renderPass, bindGroupAllocator, instanceCulling){
124
133
  super();
125
134
  this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;
126
135
  this._itemList = null;
@@ -144,6 +153,50 @@ const tmpDrawablePos = new Vector3();
144
153
  this._objectColorMaps = [
145
154
  new Map()
146
155
  ];
156
+ this._cullCamera = null;
157
+ this._lodCamera = null;
158
+ this._instanceCuller = instanceCulling && InstanceCuller.isSupported() ? new InstanceCuller() : null;
159
+ this._childQueues = [];
160
+ }
161
+ /**
162
+ * Cull the instances of the queues pushed into this one for its view, before drawing it.
163
+ *
164
+ * @internal
165
+ */ cullInstances() {
166
+ for (const child of this._childQueues){
167
+ child._instanceCuller?.cull(this);
168
+ }
169
+ }
170
+ /**
171
+ * Have the bounds of a batched drawable updated for GPU instance culling.
172
+ *
173
+ * @internal
174
+ */ markInstanceBoundsDirty(drawable) {
175
+ this._instanceCuller?.markBoundsDirty(drawable);
176
+ }
177
+ /**
178
+ * The camera this queue was culled with, set by {@link RenderQueue.end}.
179
+ *
180
+ * Differs from the draw context camera in shadow passes, which cull from the light. Drawables
181
+ * that cull their own sub-parts (clipmap terrain tiles) need it to keep only what the pass
182
+ * can see.
183
+ * @internal
184
+ */ get cullCamera() {
185
+ return this._cullCamera;
186
+ }
187
+ /**
188
+ * The camera whose view selects the levels of detail, set by {@link RenderQueue.end}: the main
189
+ * camera in shadow passes, where it differs from the cull camera.
190
+ * @internal
191
+ */ get lodCamera() {
192
+ return this._lodCamera;
193
+ }
194
+ /**
195
+ * Whether the instances of the batches are culled on the GPU, which then also selects the
196
+ * levels of detail where the device allows
197
+ * @internal
198
+ */ get culledOnGpu() {
199
+ return !!this._instanceCuller;
147
200
  }
148
201
  /** The sun light */ get sunLight() {
149
202
  return this._sunLight;
@@ -267,6 +320,9 @@ const tmpDrawablePos = new Vector3();
267
320
  * Push items from another render queue
268
321
  * @param queue - The render queue to be pushed
269
322
  */ pushRenderQueue(queue) {
323
+ if (queue._instanceCuller) {
324
+ this._childQueues.push(queue);
325
+ }
270
326
  this._waterList.push(...queue._waterList);
271
327
  const newItemLists = queue._itemList;
272
328
  if (!newItemLists) {
@@ -301,7 +357,8 @@ const tmpDrawablePos = new Vector3();
301
357
  * Push an item to the render queue
302
358
  * @param camera - The camera for drawing the item
303
359
  * @param drawable - The object to be drawn
304
- */ push(camera, drawable) {
360
+ * @param lod - Level of detail to draw the drawable's primitive at, default 0
361
+ */ push(camera, drawable, lod = 0) {
305
362
  if (drawable) {
306
363
  drawable.pushRenderQueueRef(this._ref);
307
364
  if (!this._itemList) {
@@ -321,13 +378,23 @@ const tmpDrawablePos = new Vector3();
321
378
  drawable.getMaterial().objectColor = drawable.getObjectColor();
322
379
  this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);
323
380
  }
324
- if (drawable.isBatchable()) {
325
- const instanceList = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0].instanceList : this._itemList.transmission_trans.lit[0].instanceList : unlit ? this._itemList.transparent.unlit[0].instanceList : this._itemList.transparent.lit[0].instanceList : transmission ? unlit ? this._itemList.transmission.unlit[0].instanceList : this._itemList.transmission.lit[0].instanceList : unlit ? this._itemList.opaque.unlit[0].instanceList : this._itemList.opaque.lit[0].instanceList;
326
- const hash = drawable.getInstanceId(this._renderPass);
381
+ // Meshes colored by level of detail draw with another material than the one whose instance
382
+ // data a batch would hold
383
+ if (drawable.isBatchable() && !camera.lodColoration) {
384
+ const info = trans ? transmission ? unlit ? this._itemList.transmission_trans.unlit[0] : this._itemList.transmission_trans.lit[0] : unlit ? this._itemList.transparent.unlit[0] : this._itemList.transparent.lit[0] : transmission ? unlit ? this._itemList.transmission.unlit[0] : this._itemList.transmission.lit[0] : unlit ? this._itemList.opaque.unlit[0] : this._itemList.opaque.lit[0];
385
+ const instanceList = info.instanceList;
386
+ // Levels of detail of one primitive draw different index ranges, each its own batch,
387
+ // unless GPU culling selects the level of every instance of the batch
388
+ if (this._instanceCuller && InstanceCuller.selectsLod(drawable)) {
389
+ lod = 0;
390
+ }
391
+ const id = drawable.getInstanceId(this._renderPass);
392
+ const hash = lod > 0 ? `${id}:lod${lod}` : id;
327
393
  let drawableList = instanceList[hash];
328
394
  if (!drawableList) {
329
395
  drawableList = [];
330
396
  instanceList[hash] = drawableList;
397
+ info.instanceLods[hash] = lod;
331
398
  }
332
399
  drawableList.push(drawable);
333
400
  } else {
@@ -347,7 +414,8 @@ const tmpDrawablePos = new Vector3();
347
414
  this.binaryInsert(queue, {
348
415
  drawable,
349
416
  sortDistance: drawable.getSortDistance(camera),
350
- instanceData: null
417
+ instanceData: null,
418
+ lod
351
419
  });
352
420
  if (material) {
353
421
  list.materialList.add(material.coreMaterial);
@@ -356,6 +424,55 @@ const tmpDrawablePos = new Vector3();
356
424
  }
357
425
  }
358
426
  }
427
+ /**
428
+ * Give every drawable of the queue its object color and register it for GPU picking.
429
+ *
430
+ * @remarks
431
+ * {@link push} does this for queues culled in a frame that picks. A queue built once and kept
432
+ * across frames (BatchGroup) was usually built in a frame that did not, so it is done again
433
+ * whenever a frame picks.
434
+ *
435
+ * @internal
436
+ */ registerObjectColors() {
437
+ const map = this._objectColorMaps[0];
438
+ const register = (drawable)=>{
439
+ const material = drawable.getMaterial();
440
+ if (material) {
441
+ material.objectColor = drawable.getObjectColor();
442
+ }
443
+ map.set(drawable.getDrawableId(), drawable);
444
+ };
445
+ for (const drawable of this._instanceInfo.keys()){
446
+ register(drawable);
447
+ }
448
+ const itemList = this._itemList;
449
+ if (itemList) {
450
+ for (const bundle of [
451
+ itemList.opaque,
452
+ itemList.transmission,
453
+ itemList.transparent,
454
+ itemList.transmission_trans
455
+ ]){
456
+ for (const info of [
457
+ ...bundle.lit,
458
+ ...bundle.unlit
459
+ ]){
460
+ if (info.renderQueue === this) {
461
+ for (const list of [
462
+ info.itemList,
463
+ info.skinItemList,
464
+ info.morphItemList,
465
+ info.skinAndMorphItemList
466
+ ]){
467
+ for (const item of list){
468
+ register(item.drawable);
469
+ }
470
+ }
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
359
476
  /** @internal */ getDrawableByColor(c, map) {
360
477
  const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];
361
478
  map = map ?? this._objectColorMaps;
@@ -400,6 +517,9 @@ const tmpDrawablePos = new Vector3();
400
517
  if (info.instanceRenderBundle) {
401
518
  info.instanceRenderBundle.dispose();
402
519
  }
520
+ if (info.skinInstanceRenderBundle) {
521
+ info.skinInstanceRenderBundle.dispose();
522
+ }
403
523
  }
404
524
  }
405
525
  }
@@ -412,6 +532,7 @@ const tmpDrawablePos = new Vector3();
412
532
  valid: true
413
533
  };
414
534
  this._instanceInfo.clear();
535
+ this._childQueues.length = 0;
415
536
  this._objectColorMaps.length = 0;
416
537
  this._objectColorMaps.push(new Map());
417
538
  this._shadowedLightList = [];
@@ -426,7 +547,15 @@ const tmpDrawablePos = new Vector3();
426
547
  this._needSceneColorWithDepth = false;
427
548
  this._drawTransparent = false;
428
549
  }
429
- /** @internal */ end(camera, createRenderBundles) {
550
+ /**
551
+ * Finish the queue after pushing its items.
552
+ * @param camera - The camera the queue was culled with
553
+ * @param createRenderBundles - Whether the batches are recorded into render bundles
554
+ * @param lodCamera - The camera whose view selected the levels of detail, the culling camera by default
555
+ * @internal
556
+ */ end(camera, createRenderBundles, lodCamera) {
557
+ this._cullCamera = camera;
558
+ this._lodCamera = lodCamera ?? camera;
430
559
  const frameCounter = getDevice().frameInfo.frameCounter;
431
560
  const itemList = this._itemList;
432
561
  if (!this.itemList) {
@@ -468,9 +597,10 @@ const tmpDrawablePos = new Vector3();
468
597
  offset: bindGroup.offset,
469
598
  numInstances: 0,
470
599
  stride
471
- }
600
+ },
601
+ lod: info.instanceLods[x] ?? 0
472
602
  };
473
- this.binaryInsert(info.instanceItemList, item);
603
+ this.binaryInsert(drawable.getBoneMatrices() ? info.skinInstanceItemList : info.instanceItemList, item);
474
604
  drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);
475
605
  }
476
606
  const instanceInfo = {
@@ -489,6 +619,7 @@ const tmpDrawablePos = new Vector3();
489
619
  }
490
620
  }
491
621
  info.instanceList = {};
622
+ info.instanceLods = {};
492
623
  if (createRenderBundles) {
493
624
  if (info.itemList.length > 0) {
494
625
  info.renderBundle = new RenderBundleWrapper();
@@ -505,8 +636,22 @@ const tmpDrawablePos = new Vector3();
505
636
  if (info.instanceItemList.length > 0) {
506
637
  info.instanceRenderBundle = new RenderBundleWrapper();
507
638
  }
639
+ if (info.skinInstanceItemList.length > 0) {
640
+ info.skinInstanceRenderBundle = new RenderBundleWrapper();
641
+ }
642
+ }
643
+ }
644
+ }
645
+ if (this._instanceCuller) {
646
+ const items = [];
647
+ for (const list of lists){
648
+ for (const info of list){
649
+ if (info.renderQueue === this) {
650
+ items.push(...info.instanceItemList, ...info.skinInstanceItemList);
651
+ }
508
652
  }
509
653
  }
654
+ this._instanceCuller.rebuild(items, this._instanceInfo);
510
655
  }
511
656
  return this;
512
657
  }
@@ -546,6 +691,10 @@ const tmpDrawablePos = new Vector3();
546
691
  super.onDispose();
547
692
  this.reset();
548
693
  this._ref.valid = false;
694
+ this._cullCamera = null;
695
+ this._lodCamera = null;
696
+ this._instanceCuller?.dispose();
697
+ this._instanceCuller = null;
549
698
  }
550
699
  drawableDistanceToCamera(drawable, cameraPos) {
551
700
  const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);
@@ -558,8 +707,10 @@ const tmpDrawablePos = new Vector3();
558
707
  morphItemList: [],
559
708
  skinAndMorphItemList: [],
560
709
  instanceItemList: [],
710
+ skinInstanceItemList: [],
561
711
  materialList: new Set(),
562
712
  instanceList: {},
713
+ instanceLods: {},
563
714
  renderQueue: this
564
715
  };
565
716
  }