@zephyr3d/scene 0.9.26 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\nimport type { HairNode } from '../scene/hair';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isHair()) {\r\n return this.visitHair(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Visits a hair node.\r\n *\r\n * @remarks\r\n * Treated like a mesh rather than like water: hair casts shadows, and the\r\n * strand material has a transparent shadow caster path built for exactly that.\r\n * @internal\r\n */\r\n visitHair(node: HairNode) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isHair","visitHair","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
1
+ {"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\nimport type { HairNode } from '../scene/hair';\r\nimport { getDevice } from '../app/api';\r\nimport { warnUnsupported } from '../utility/unsupported';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /** @internal */\r\n private _lodCamera: Camera;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param lodCamera - Camera whose view selects the levels of detail, the culling camera by default\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue, lodCamera?: Camera) {\r\n this._camera = camera;\r\n this._lodCamera = lodCamera ?? camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /**\r\n * The camera whose view selects the levels of detail: the view being rendered, which for shadow\r\n * maps is not the culling camera\r\n */\r\n get lodCamera() {\r\n return this._lodCamera;\r\n }\r\n set lodCamera(camera: Camera) {\r\n this._lodCamera = camera;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable, lod = 0) {\r\n this.renderQueue.push(camera, drawable, lod);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isHair()) {\r\n return this.visitHair(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node, node.selectLod(this._lodCamera));\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /**\r\n * Visits a hair node.\r\n *\r\n * @remarks\r\n * Treated like a mesh rather than like water: hair casts shadows, and the\r\n * strand material has a transparent shadow caster path built for exactly that.\r\n * @internal\r\n */\r\n visitHair(node: HairNode) {\r\n if (getDevice().type !== 'webgpu') {\r\n // Kept out of the queue entirely: the strand shader reads storage buffers\r\n // from the vertex stage, so every pass that drew it would fail to build its\r\n // program and log an error that does not say why.\r\n warnUnsupported('Hair strands (Hair node)', 'WebGPU', 'hair is not drawn');\r\n return false;\r\n }\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n this.renderQueue.pushWater(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","lodCamera","_camera","_lodCamera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","lod","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isHair","visitHair","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","selectLod","getDevice","warnUnsupported","pushWater","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { DEBUG_VIEWS } from '@zephyr3d/base';
2
+ import { RENDER_PASS_TYPE_LIGHT, RENDER_PASS_TYPE_DEPTH } from '../values.js';
3
+
4
+ /**
5
+ * Wireframe debug view: while active, triangle primitives draw as the edges of their triangles,
6
+ * see Primitive. Nested, so a wireframe mesh drawn inside a wireframe view ends it only once.
7
+ */ let wireframeDepth = 0;
8
+ /** @internal Whether primitives drawn now are drawn as wireframe */ function isWireframeActive() {
9
+ return DEBUG_VIEWS && wireframeDepth > 0;
10
+ }
11
+ /**
12
+ * @internal Whether a draw in this context may draw wireframe: the depth and light passes, which
13
+ * must agree for the light pass's equal depth test. Shadows and picking keep the triangles.
14
+ */ function isWireframePass(ctx) {
15
+ const type = ctx?.renderPass?.type;
16
+ return DEBUG_VIEWS && (type === RENDER_PASS_TYPE_LIGHT || type === RENDER_PASS_TYPE_DEPTH);
17
+ }
18
+ /** @internal Start drawing primitives as wireframe, until the matching {@link endWireframe} */ function beginWireframe() {
19
+ wireframeDepth++;
20
+ }
21
+ /** @internal End a {@link beginWireframe} */ function endWireframe() {
22
+ wireframeDepth = Math.max(0, wireframeDepth - 1);
23
+ }
24
+ const warned = new Set();
25
+ /**
26
+ * @internal Warn once that a debug view was turned on without DEBUG_VIEWS, where it has no effect.
27
+ * @returns DEBUG_VIEWS
28
+ */ function checkDebugViews(name) {
29
+ if (!DEBUG_VIEWS && !warned.has(name)) {
30
+ warned.add(name);
31
+ console.warn(`${name} is a debug view and has no effect: set globalThis.__ZEPHYR3D_DEBUG_VIEWS__ = true before the engine loads to use it`);
32
+ }
33
+ return DEBUG_VIEWS;
34
+ }
35
+
36
+ export { beginWireframe, checkDebugViews, endWireframe, isWireframeActive, isWireframePass };
37
+ //# sourceMappingURL=debug_views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug_views.js","sources":["../../src/render/debug_views.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEBUG_VIEWS } from '@zephyr3d/base';\r\nimport type { DrawContext } from './drawable';\r\nimport { RENDER_PASS_TYPE_DEPTH, RENDER_PASS_TYPE_LIGHT } from '../values';\r\n\r\n/**\r\n * Wireframe debug view: while active, triangle primitives draw as the edges of their triangles,\r\n * see Primitive. Nested, so a wireframe mesh drawn inside a wireframe view ends it only once.\r\n */\r\nlet wireframeDepth = 0;\r\n\r\n/** @internal Whether primitives drawn now are drawn as wireframe */\r\nexport function isWireframeActive() {\r\n return DEBUG_VIEWS && wireframeDepth > 0;\r\n}\r\n\r\n/**\r\n * @internal Whether a draw in this context may draw wireframe: the depth and light passes, which\r\n * must agree for the light pass's equal depth test. Shadows and picking keep the triangles.\r\n */\r\nexport function isWireframePass(ctx: Nullable<DrawContext>) {\r\n const type = ctx?.renderPass?.type;\r\n return DEBUG_VIEWS && (type === RENDER_PASS_TYPE_LIGHT || type === RENDER_PASS_TYPE_DEPTH);\r\n}\r\n\r\n/** @internal Start drawing primitives as wireframe, until the matching {@link endWireframe} */\r\nexport function beginWireframe() {\r\n wireframeDepth++;\r\n}\r\n\r\n/** @internal End a {@link beginWireframe} */\r\nexport function endWireframe() {\r\n wireframeDepth = Math.max(0, wireframeDepth - 1);\r\n}\r\n\r\nconst warned = new Set<string>();\r\n\r\n/**\r\n * @internal Warn once that a debug view was turned on without DEBUG_VIEWS, where it has no effect.\r\n * @returns DEBUG_VIEWS\r\n */\r\nexport function checkDebugViews(name: string) {\r\n if (!DEBUG_VIEWS && !warned.has(name)) {\r\n warned.add(name);\r\n console.warn(\r\n `${name} is a debug view and has no effect: set globalThis.__ZEPHYR3D_DEBUG_VIEWS__ = true before the engine loads to use it`\r\n );\r\n }\r\n return DEBUG_VIEWS;\r\n}\r\n"],"names":["wireframeDepth","isWireframeActive","DEBUG_VIEWS","isWireframePass","ctx","type","renderPass","RENDER_PASS_TYPE_LIGHT","RENDER_PASS_TYPE_DEPTH","beginWireframe","endWireframe","Math","max","warned","Set","checkDebugViews","name","has","add","console","warn"],"mappings":";;;AAKA;;;AAGC,IACD,IAAIA,cAAiB,GAAA,CAAA;AAErB,qEACO,SAASC,iBAAAA,GAAAA;AACd,IAAA,OAAOC,eAAeF,cAAiB,GAAA,CAAA;AACzC;AAEA;;;IAIO,SAASG,eAAAA,CAAgBC,GAA0B,EAAA;IACxD,MAAMC,IAAAA,GAAOD,KAAKE,UAAYD,EAAAA,IAAAA;AAC9B,IAAA,OAAOH,WAAgBG,KAAAA,IAASE,KAAAA,sBAAAA,IAA0BF,SAASG,sBAAqB,CAAA;AAC1F;AAEA,gGACO,SAASC,cAAAA,GAAAA;AACdT,IAAAA,cAAAA,EAAAA;AACF;AAEA,8CACO,SAASU,YAAAA,GAAAA;AACdV,IAAAA,cAAAA,GAAiBW,IAAKC,CAAAA,GAAG,CAAC,CAAA,EAAGZ,cAAiB,GAAA,CAAA,CAAA;AAChD;AAEA,MAAMa,SAAS,IAAIC,GAAAA,EAAAA;AAEnB;;;IAIO,SAASC,eAAAA,CAAgBC,IAAY,EAAA;AAC1C,IAAA,IAAI,CAACd,WAAe,IAAA,CAACW,MAAOI,CAAAA,GAAG,CAACD,IAAO,CAAA,EAAA;AACrCH,QAAAA,MAAAA,CAAOK,GAAG,CAACF,IAAAA,CAAAA;AACXG,QAAAA,OAAAA,CAAQC,IAAI,CACV,CAAGJ,EAAAA,IAAAA,CAAK,oHAAoH,CAAC,CAAA;AAEjI;IACA,OAAOd,WAAAA;AACT;;;;"}
@@ -64,7 +64,11 @@ import { ShaderHelper } from '../material/shader/helper.js';
64
64
  this._encodeDepth = !!val;
65
65
  }
66
66
  /** @internal */ _getGlobalBindGroupHash(ctx) {
67
- return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}`;
67
+ // Every flag that changes the fragment output count has to be in here. See
68
+ // the note in renderItems: a hash collision hands this pass another pass's
69
+ // program, and the failure mode is an output count mismatch rather than
70
+ // anything that points at the cache.
71
+ return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}:${Number(ctx.sssProfileId)}`;
68
72
  }
69
73
  /** @internal */ renderItems(ctx, renderCamera, renderQueue) {
70
74
  const items = renderQueue.itemList;
@@ -1 +1 @@
1
- {"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n private _motionVectorOnly: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n this._motionVectorOnly = false;\r\n }\r\n /**\r\n * Draws the transparent queue for its motion vectors alone.\r\n *\r\n * @remarks\r\n * Blended geometry is absent from the ordinary prepass, so it contributes no\r\n * velocity and a temporal filter reprojects it with whatever is behind it -\r\n * which for hair swinging in front of a still background means reprojecting it\r\n * as if it were still. This mode fills that in: same pass, same shaders, but\r\n * the framebuffer carries the motion vector attachment only, nothing writes\r\n * depth, and materials that have not opted in discard.\r\n *\r\n * It cannot be exact. One velocity per pixel cannot describe several blended\r\n * layers, so the value that survives is whichever fragment landed last rather\r\n * than the nearest. For hair that is the same approximation the dithered path\r\n * already makes - dither keeps one arbitrary strand per pixel - which is why\r\n * it holds up there and why it stays opt-in rather than applying to every\r\n * transparent material.\r\n */\r\n get motionVectorOnly() {\r\n return this._motionVectorOnly;\r\n }\r\n set motionVectorOnly(val: boolean) {\r\n this._motionVectorOnly = !!val;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(\r\n ctx.motionVectors\r\n )}:${Number(this._motionVectorOnly)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only\r\n // consults when shaderVariantHash is null. LightPass clears that field on entry but not\r\n // on exit, so a depth pass running after it would otherwise inherit the light pass's\r\n // variant hash and hash to the same key -- handing this pass the light pass's program.\r\n // The prepass never noticed (it runs first, while the field is still null); the\r\n // transmission depth pass runs after the light pass and did, silently reusing a\r\n // single-output program. With motion vectors on, its framebuffer has two attachments and\r\n // the reuse finally surfaced as a fragment output count mismatch.\r\n ctx.shaderVariantHash = null;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._motionVectorOnly\r\n ? items.transparent\r\n : this._transmission\r\n ? items.transmission\r\n : items.opaque;\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["DepthPass","RenderPass","_renderBackface","_encodeDepth","_transmission","_motionVectorOnly","RENDER_PASS_TYPE_DEPTH","motionVectorOnly","val","transmission","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","shaderVariantHash","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","transparent","opaque","lit","drawItemList","unlit"],"mappings":"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"}
1
+ {"version":3,"file":"depthpass.js","sources":["../../src/render/depthpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { RENDER_PASS_TYPE_DEPTH } from '../values';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\n/**\r\n * Depth render pass\r\n *\r\n * Scene depth render pass\r\n *\r\n * @public\r\n */\r\nexport class DepthPass extends RenderPass {\r\n private _renderBackface: boolean;\r\n private _encodeDepth: boolean;\r\n private _transmission: boolean;\r\n private _motionVectorOnly: boolean;\r\n /**\r\n * Creates an instance of DepthRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_DEPTH);\r\n this._renderBackface = false;\r\n this._encodeDepth = false;\r\n this._transmission = false;\r\n this._motionVectorOnly = false;\r\n }\r\n /**\r\n * Draws the transparent queue for its motion vectors alone.\r\n *\r\n * @remarks\r\n * Blended geometry is absent from the ordinary prepass, so it contributes no\r\n * velocity and a temporal filter reprojects it with whatever is behind it -\r\n * which for hair swinging in front of a still background means reprojecting it\r\n * as if it were still. This mode fills that in: same pass, same shaders, but\r\n * the framebuffer carries the motion vector attachment only, nothing writes\r\n * depth, and materials that have not opted in discard.\r\n *\r\n * It cannot be exact. One velocity per pixel cannot describe several blended\r\n * layers, so the value that survives is whichever fragment landed last rather\r\n * than the nearest. For hair that is the same approximation the dithered path\r\n * already makes - dither keeps one arbitrary strand per pixel - which is why\r\n * it holds up there and why it stays opt-in rather than applying to every\r\n * transparent material.\r\n */\r\n get motionVectorOnly() {\r\n return this._motionVectorOnly;\r\n }\r\n set motionVectorOnly(val: boolean) {\r\n this._motionVectorOnly = !!val;\r\n }\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val: boolean) {\r\n this._transmission = val;\r\n }\r\n get renderBackface() {\r\n return this._renderBackface;\r\n }\r\n set renderBackface(val) {\r\n this._renderBackface = !!val;\r\n }\r\n get encodeDepth() {\r\n return this._encodeDepth;\r\n }\r\n set encodeDepth(val) {\r\n this._encodeDepth = !!val;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext) {\r\n // Every flag that changes the fragment output count has to be in here. See\r\n // the note in renderItems: a hash collision hands this pass another pass's\r\n // program, and the failure mode is an output count mismatch rather than\r\n // anything that points at the cache.\r\n return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(\r\n ctx.motionVectors\r\n )}:${Number(this._motionVectorOnly)}:${Number(ctx.sssProfileId)}`;\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, renderCamera: Camera, renderQueue: RenderQueue) {\r\n const items = renderQueue.itemList;\r\n if (items) {\r\n ctx.drawEnvLight = false;\r\n ctx.env = null;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only\r\n // consults when shaderVariantHash is null. LightPass clears that field on entry but not\r\n // on exit, so a depth pass running after it would otherwise inherit the light pass's\r\n // variant hash and hash to the same key -- handing this pass the light pass's program.\r\n // The prepass never noticed (it runs first, while the field is still null); the\r\n // transmission depth pass runs after the light pass and did, silently reusing a\r\n // single-output program. With motion vectors on, its framebuffer has two attachments and\r\n // the reuse finally surfaced as a fragment output count mismatch.\r\n ctx.shaderVariantHash = null;\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n ctx.device.setBindGroup(0, bindGroup);\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);\r\n const reverseWinding = ctx.camera.worldMatrixDet < 0;\r\n const list = this._motionVectorOnly\r\n ? items.transparent\r\n : this._transmission\r\n ? items.transmission\r\n : items.opaque;\r\n for (const lit of list.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n for (const unlit of list.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["DepthPass","RenderPass","_renderBackface","_encodeDepth","_transmission","_motionVectorOnly","RENDER_PASS_TYPE_DEPTH","motionVectorOnly","val","transmission","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","sssProfileId","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","shaderVariantHash","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","transparent","opaque","lit","drawItemList","unlit"],"mappings":"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"}
@@ -3,14 +3,15 @@ import { ShaderHelper } from '../material/shader/helper.js';
3
3
  import '../material/lambert.js';
4
4
  import '../material/blinn.js';
5
5
  import '../material/unlit.js';
6
+ import '../material/meshmaterial.js';
6
7
  import '../material/particle.js';
7
8
  import '../material/subsurfaceprofile.js';
8
- import '../material/skin.js';
9
+ import '../material/sssprofile.js';
10
+ import '../material/sss.js';
9
11
  import '../material/eye.js';
10
12
  import '@zephyr3d/device';
11
13
  import { MaterialVaryingFlags } from '../values.js';
12
14
  import { getDevice } from '../app/api.js';
13
- import '../material/meshmaterial.js';
14
15
  import '../material/hair.js';
15
16
  import '../material/hairstrand.js';
16
17
  import '../material/grassmaterial.js';
@@ -29,6 +30,8 @@ const skinInfluenceInfo = new Vector4();
29
30
  let defaultSkinInfluenceTexture = null;
30
31
  const instanceBindGroupTransfromTags = new WeakMap();
31
32
  const drawableBindGroupTransfromTags = new WeakMap();
33
+ /** Skin palette base last written to each instance data block or drawable bind group */ const instanceSkinPaletteBases = new WeakMap();
34
+ const drawableSkinPaletteBases = new WeakMap();
32
35
  const bindGroupCache = {};
33
36
  const usedBindGroups = new WeakMap();
34
37
  function fetchBindGroup(skinning, morphing, instancing) {
@@ -94,8 +97,10 @@ function mixinDrawable(baseCls) {
94
97
  _drawableId;
95
98
  _objectColor;
96
99
  _nodeTransformTag;
100
+ /** Stamp of the scene drawable update queue this drawable is waiting in, see UpdateQueue */ _drawableQueueStamp;
97
101
  constructor(...args){
98
102
  super(...args);
103
+ this._drawableQueueStamp = 0;
99
104
  this._drawableId = ++_drawableId;
100
105
  this._objectColor = null;
101
106
  this._mdRenderQueueRef = [];
@@ -158,26 +163,43 @@ function mixinDrawable(baseCls) {
158
163
  applyTransformUniforms(renderQueue) {
159
164
  const instanceInfo = renderQueue.getInstanceInfo(this);
160
165
  const currentTag = this.getNode().transformTag;
166
+ const paletteBase = this.getBoneMatrices() ? this.getSkinPaletteBase() : 0;
161
167
  if (instanceInfo) {
162
168
  const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;
163
- if (tag !== currentTag) {
169
+ if (tag !== currentTag || instanceSkinPaletteBases.get(instanceInfo) !== paletteBase) {
170
+ // The unused z of the framestamp vector carries the skin palette base of the instance
171
+ this._worldMatrixBuffer[18] = paletteBase;
164
172
  instanceInfo.bindGroup.bindGroup.setRawData(ShaderHelper.getInstanceDataUniformName(), instanceInfo.offset * 4, this._worldMatrixBuffer, 0, 36);
165
173
  instanceBindGroupTransfromTags.set(instanceInfo, currentTag);
174
+ instanceSkinPaletteBases.set(instanceInfo, paletteBase);
166
175
  }
167
176
  } else {
168
177
  const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);
178
+ if (drawableSkinPaletteBases.get(drawableBindGroup) !== paletteBase) {
179
+ if (this.getBoneMatrices()) {
180
+ drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), paletteBase);
181
+ }
182
+ drawableSkinPaletteBases.set(drawableBindGroup, paletteBase);
183
+ }
169
184
  const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;
170
185
  if (tag !== currentTag) {
171
186
  drawableBindGroup.setValue(ShaderHelper.getWorldMatrixUniformName(), this._currentWorldMatrixBuffer);
172
187
  drawableBindGroup.setValue(ShaderHelper.getPrevWorldMatrixUniformName(), this._prevWorldMatrixBuffer);
173
188
  drawableBindGroup.setValue(ShaderHelper.getPrevWorldMatrixFrameUniformName(), this._framestampBuffer[0]);
174
189
  if (this.getBoneMatrices()) {
175
- drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
190
+ drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.getSkinSpaceMatrix());
176
191
  }
177
192
  drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);
178
193
  }
179
194
  }
180
195
  }
196
+ applyTransformUniformsAll() {
197
+ for (const ref of this._mdRenderQueueRef){
198
+ if (ref.valid && !ref.ref.disposed) {
199
+ this.applyTransformUniforms(ref.ref);
200
+ }
201
+ }
202
+ }
181
203
  applyMaterialUniformsAll() {
182
204
  for (const ref of this._mdRenderQueueRef){
183
205
  if (ref.valid && !ref.ref.disposed) {
@@ -194,6 +216,28 @@ function mixinDrawable(baseCls) {
194
216
  instanceInfo.bindGroup.bindGroup.setRawData(ShaderHelper.getInstanceDataUniformName(), (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4, uniforms, 0, uniforms.length);
195
217
  }
196
218
  }
219
+ /**
220
+ * Takes the current world matrix of the node at once, as the previous one too.
221
+ *
222
+ * @remarks
223
+ * The world matrix a drawable renders with is refreshed in {@link Scene.frameUpdate}. A
224
+ * drawable created and placed after that, e.g. in `updatePerCamera`, would be drawn that
225
+ * frame with the matrix it had when created; call this once it is placed. The previous
226
+ * matrix is set to the same, so it gets no motion from where it was created.
227
+ */ syncDrawableTransform() {
228
+ const node = this.getNode();
229
+ this._nodeTransformTag = node.transformTag;
230
+ const frame = getDevice().frameInfo.frameCounter;
231
+ this._currentWorldMatrixBuffer.set(node.worldMatrix);
232
+ this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);
233
+ this._framestampBuffer[0] = frame;
234
+ this._framestampBuffer[1] = frame;
235
+ for (const ref of this._mdRenderQueueRef){
236
+ if (ref.valid && !ref.ref.disposed) {
237
+ this.applyTransformUniforms(ref.ref);
238
+ }
239
+ }
240
+ }
197
241
  updateState() {
198
242
  const currentTag = this.getNode().transformTag;
199
243
  if (this._nodeTransformTag !== currentTag) {
@@ -217,15 +261,18 @@ function mixinDrawable(baseCls) {
217
261
  const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue);
218
262
  device.setBindGroup(1, drawableBindGroup);
219
263
  if (ctx.instanceData) {
220
- device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);
264
+ device.setBindGroup(3, ctx.instanceData.culled?.bindGroup ?? ctx.instanceData.bindGroup.bindGroup);
221
265
  }
222
266
  if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {
223
267
  const boneTexture = this.getBoneMatrices();
224
268
  const skinData = this.getSkinInfluenceData();
225
269
  drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);
226
- drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
270
+ drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.getSkinSpaceMatrix());
227
271
  boneTextureSize.setXY(boneTexture.width, boneTexture.height);
228
272
  drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);
273
+ if (!ctx.instanceData) {
274
+ drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), this.getSkinPaletteBase());
275
+ }
229
276
  drawableBindGroup.setTexture(ShaderHelper.getSkinInfluenceDataUniformName(), skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture());
230
277
  skinInfluenceInfo.setXYZW(skinData?.width ?? 1, skinData?.height ?? 1, skinData?.influenceCount ?? 4, skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0);
231
278
  drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);
@@ -1 +1 @@
1
- {"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\nconst skinInfluenceInfo = new Vector4();\r\nlet defaultSkinInfluenceTexture: Nullable<Texture2D> = null;\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction getDefaultSkinInfluenceTexture() {\r\n let texture = defaultSkinInfluenceTexture;\r\n if (!texture) {\r\n texture = getDevice().createTexture2D('rgba32f', 1, 1, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n texture.update(new Float32Array(4), 0, 0, 1, 1);\r\n defaultSkinInfluenceTexture = texture;\r\n }\r\n return texture;\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n const skinData = (this as unknown as Mesh).getSkinInfluenceData();\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n drawableBindGroup.setTexture(\r\n ShaderHelper.getSkinInfluenceDataUniformName(),\r\n skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture()\r\n );\r\n skinInfluenceInfo.setXYZW(\r\n skinData?.width ?? 1,\r\n skinData?.height ?? 1,\r\n skinData?.influenceCount ?? 4,\r\n skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0\r\n );\r\n drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getRenderMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","skinInfluenceInfo","Vector4","defaultSkinInfluenceTexture","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","getDefaultSkinInfluenceTexture","texture","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","Float32Array","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","skinData","getSkinInfluenceData","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","getSkinInfluenceDataUniformName","setXYZW","influenceCount","Math","ceil","max","getSkinInfluenceInfoUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getRenderMorphInfo","getMorphDataUniformName","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice, Texture2D } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyTransformUniformsAll(): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n syncDrawableTransform(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\nconst skinInfluenceInfo = new Vector4();\r\nlet defaultSkinInfluenceTexture: Nullable<Texture2D> = null;\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n/** Skin palette base last written to each instance data block or drawable bind group */\r\nconst instanceSkinPaletteBases = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableSkinPaletteBases = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nfunction getDefaultSkinInfluenceTexture() {\r\n let texture = defaultSkinInfluenceTexture;\r\n if (!texture) {\r\n texture = getDevice().createTexture2D('rgba32f', 1, 1, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n texture.update(new Float32Array(4), 0, 0, 1, 1);\r\n defaultSkinInfluenceTexture = texture;\r\n }\r\n return texture;\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n /** Stamp of the scene drawable update queue this drawable is waiting in, see UpdateQueue */\r\n _drawableQueueStamp: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableQueueStamp = 0;\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n const paletteBase = (this as unknown as Drawable).getBoneMatrices()\r\n ? (this as unknown as Mesh).getSkinPaletteBase()\r\n : 0;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag || instanceSkinPaletteBases.get(instanceInfo) !== paletteBase) {\r\n // The unused z of the framestamp vector carries the skin palette base of the instance\r\n this._worldMatrixBuffer[18] = paletteBase;\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n instanceSkinPaletteBases.set(instanceInfo, paletteBase);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n if (drawableSkinPaletteBases.get(drawableBindGroup) !== paletteBase) {\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(ShaderHelper.getSkinPaletteBaseUniformName(), paletteBase);\r\n }\r\n drawableSkinPaletteBases.set(drawableBindGroup, paletteBase);\r\n }\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).getSkinSpaceMatrix()\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyTransformUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n /**\r\n * Takes the current world matrix of the node at once, as the previous one too.\r\n *\r\n * @remarks\r\n * The world matrix a drawable renders with is refreshed in {@link Scene.frameUpdate}. A\r\n * drawable created and placed after that, e.g. in `updatePerCamera`, would be drawn that\r\n * frame with the matrix it had when created; call this once it is placed. The previous\r\n * matrix is set to the same, so it gets no motion from where it was created.\r\n */\r\n syncDrawableTransform() {\r\n const node = this.getNode();\r\n this._nodeTransformTag = node.transformTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n this._currentWorldMatrixBuffer.set(node.worldMatrix);\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.culled?.bindGroup ?? ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n const skinData = (this as unknown as Mesh).getSkinInfluenceData();\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).getSkinSpaceMatrix()\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n if (!ctx.instanceData) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getSkinPaletteBaseUniformName(),\r\n (this as unknown as Mesh).getSkinPaletteBase()\r\n );\r\n }\r\n drawableBindGroup.setTexture(\r\n ShaderHelper.getSkinInfluenceDataUniformName(),\r\n skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture()\r\n );\r\n skinInfluenceInfo.setXYZW(\r\n skinData?.width ?? 1,\r\n skinData?.height ?? 1,\r\n skinData?.influenceCount ?? 4,\r\n skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0\r\n );\r\n drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getRenderMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","skinInfluenceInfo","Vector4","defaultSkinInfluenceTexture","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","instanceSkinPaletteBases","drawableSkinPaletteBases","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","getDefaultSkinInfluenceTexture","texture","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","Float32Array","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","_drawableQueueStamp","args","Map","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","paletteBase","getBoneMatrices","getSkinPaletteBase","tag","setRawData","getInstanceDataUniformName","getSkinPaletteBaseUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneInvBindMatrixUniformName","getSkinSpaceMatrix","applyTransformUniformsAll","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","syncDrawableTransform","node","frame","updateState","bind","ctx","device","instanceData","setBindGroup","culled","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","skinData","getSkinInfluenceData","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","getSkinInfluenceDataUniformName","setXYZW","influenceCount","Math","ceil","max","getSkinInfluenceInfoUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getRenderMorphInfo","getMorphDataUniformName","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}