@zephyr3d/scene 0.9.24 → 0.9.26

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 (264) hide show
  1. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  2. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  3. package/dist/animation/joint_dynamics/controller.js +7 -5
  4. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/morphtrack.js +3 -4
  8. package/dist/animation/morphtrack.js.map +1 -1
  9. package/dist/animation/skeleton.js +58 -24
  10. package/dist/animation/skeleton.js.map +1 -1
  11. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  12. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  13. package/dist/animation/spring/spring_collider.js +4 -3
  14. package/dist/animation/spring/spring_collider.js.map +1 -1
  15. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  16. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  17. package/dist/animation/spring/spring_particle.js +2 -0
  18. package/dist/animation/spring/spring_particle.js.map +1 -1
  19. package/dist/animation/spring/spring_system.js +11 -3
  20. package/dist/animation/spring/spring_system.js.map +1 -1
  21. package/dist/animation/spring_modifier.js +10 -0
  22. package/dist/animation/spring_modifier.js.map +1 -1
  23. package/dist/app/engine.js +53 -43
  24. package/dist/app/engine.js.map +1 -1
  25. package/dist/app/scriptingsystem.js +119 -6
  26. package/dist/app/scriptingsystem.js.map +1 -1
  27. package/dist/app/scriptregistry.js +3 -2
  28. package/dist/app/scriptregistry.js.map +1 -1
  29. package/dist/asset/assetmanager.js +284 -67
  30. package/dist/asset/assetmanager.js.map +1 -1
  31. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  32. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  33. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  34. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  35. package/dist/asset/model.js +178 -67
  36. package/dist/asset/model.js.map +1 -1
  37. package/dist/camera/camera.js +193 -21
  38. package/dist/camera/camera.js.map +1 -1
  39. package/dist/camera/perspectivecamera.js +3 -1
  40. package/dist/camera/perspectivecamera.js.map +1 -1
  41. package/dist/index.d.ts +4040 -1290
  42. package/dist/index.js +16 -6
  43. package/dist/index.js.map +1 -1
  44. package/dist/material/eye.js +932 -0
  45. package/dist/material/eye.js.map +1 -0
  46. package/dist/material/hair.js +917 -0
  47. package/dist/material/hair.js.map +1 -0
  48. package/dist/material/hairstrand.js +842 -0
  49. package/dist/material/hairstrand.js.map +1 -0
  50. package/dist/material/hairstrand_data.js +162 -0
  51. package/dist/material/hairstrand_data.js.map +1 -0
  52. package/dist/material/lambert.js +5 -2
  53. package/dist/material/lambert.js.map +1 -1
  54. package/dist/material/material.js +338 -300
  55. package/dist/material/material.js.map +1 -1
  56. package/dist/material/meshmaterial.js +120 -19
  57. package/dist/material/meshmaterial.js.map +1 -1
  58. package/dist/material/mixins/albedocolor.js +1 -1
  59. package/dist/material/mixins/albedocolor.js.map +1 -1
  60. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  61. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  63. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  65. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  67. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  70. package/dist/material/mixins/lit.js +73 -18
  71. package/dist/material/mixins/lit.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +4 -4
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/mixins/texture.js +48 -11
  75. package/dist/material/mixins/texture.js.map +1 -1
  76. package/dist/material/mtoon.js +6 -5
  77. package/dist/material/mtoon.js.map +1 -1
  78. package/dist/material/pbrblueprint.js +146 -28
  79. package/dist/material/pbrblueprint.js.map +1 -1
  80. package/dist/material/pbrblueprint_instance.js +501 -0
  81. package/dist/material/pbrblueprint_instance.js.map +1 -0
  82. package/dist/material/pbrmr.js +15 -16
  83. package/dist/material/pbrmr.js.map +1 -1
  84. package/dist/material/shader/helper.js +766 -456
  85. package/dist/material/shader/helper.js.map +1 -1
  86. package/dist/material/shader/terrain_blend.js +55 -0
  87. package/dist/material/shader/terrain_blend.js.map +1 -0
  88. package/dist/material/skin.js +192 -32
  89. package/dist/material/skin.js.map +1 -1
  90. package/dist/material/spriteblueprint.js +16 -1
  91. package/dist/material/spriteblueprint.js.map +1 -1
  92. package/dist/material/subsurfaceprofile.js +86 -23
  93. package/dist/material/subsurfaceprofile.js.map +1 -1
  94. package/dist/material/water.js +3 -1
  95. package/dist/material/water.js.map +1 -1
  96. package/dist/posteffect/bloom.js +167 -7
  97. package/dist/posteffect/bloom.js.map +1 -1
  98. package/dist/posteffect/coloradjust.js +2 -1
  99. package/dist/posteffect/coloradjust.js.map +1 -1
  100. package/dist/posteffect/compositor.js.map +1 -1
  101. package/dist/posteffect/fxaa.js +2 -1
  102. package/dist/posteffect/fxaa.js.map +1 -1
  103. package/dist/posteffect/grayscale.js +3 -1
  104. package/dist/posteffect/grayscale.js.map +1 -1
  105. package/dist/posteffect/motionblur.js +4 -1
  106. package/dist/posteffect/motionblur.js.map +1 -1
  107. package/dist/posteffect/posteffect.js.map +1 -1
  108. package/dist/posteffect/skinsss.js +368 -69
  109. package/dist/posteffect/skinsss.js.map +1 -1
  110. package/dist/posteffect/ssgi.js +16 -9
  111. package/dist/posteffect/ssgi.js.map +1 -1
  112. package/dist/posteffect/ssr.js +3 -0
  113. package/dist/posteffect/ssr.js.map +1 -1
  114. package/dist/posteffect/sss.js +91 -34
  115. package/dist/posteffect/sss.js.map +1 -1
  116. package/dist/posteffect/taa.js.map +1 -1
  117. package/dist/posteffect/tonemap.js +44 -1
  118. package/dist/posteffect/tonemap.js.map +1 -1
  119. package/dist/render/abuffer_oit.js +45 -39
  120. package/dist/render/abuffer_oit.js.map +1 -1
  121. package/dist/render/cluster_light.js +4 -4
  122. package/dist/render/cluster_light.js.map +1 -1
  123. package/dist/render/cull_visitor.js +19 -0
  124. package/dist/render/cull_visitor.js.map +1 -1
  125. package/dist/render/depthpass.js +36 -2
  126. package/dist/render/depthpass.js.map +1 -1
  127. package/dist/render/drawable_mixin.js +26 -1
  128. package/dist/render/drawable_mixin.js.map +1 -1
  129. package/dist/render/dualdepthpeeling_oit.js +52 -51
  130. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  131. package/dist/render/envlight.js +1 -1
  132. package/dist/render/envlight.js.map +1 -1
  133. package/dist/render/fbm_wavegenerator.js +3 -0
  134. package/dist/render/fbm_wavegenerator.js.map +1 -1
  135. package/dist/render/gerstner_wavegenerator.js +3 -0
  136. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  137. package/dist/render/globalbindgroup_allocator.js +3 -0
  138. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  139. package/dist/render/oit.js +29 -0
  140. package/dist/render/oit.js.map +1 -0
  141. package/dist/render/render_queue.js +3 -0
  142. package/dist/render/render_queue.js.map +1 -1
  143. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  144. package/dist/render/rendergraph/executor.js +2 -0
  145. package/dist/render/rendergraph/executor.js.map +1 -1
  146. package/dist/render/rendergraph/forward_plus_builder.js +61 -1
  147. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  148. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  149. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  150. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  151. package/dist/render/rendergraph/types.js.map +1 -1
  152. package/dist/render/shadow_mask_pass.js +73 -8
  153. package/dist/render/shadow_mask_pass.js.map +1 -1
  154. package/dist/render/sky.js +166 -126
  155. package/dist/render/sky.js.map +1 -1
  156. package/dist/render/weightedblended_oit.js +36 -35
  157. package/dist/render/weightedblended_oit.js.map +1 -1
  158. package/dist/scene/basesprite.js +8 -0
  159. package/dist/scene/basesprite.js.map +1 -1
  160. package/dist/scene/batchgroup.js +3 -0
  161. package/dist/scene/batchgroup.js.map +1 -1
  162. package/dist/scene/environment.js +4 -1
  163. package/dist/scene/environment.js.map +1 -1
  164. package/dist/scene/hair.js +963 -0
  165. package/dist/scene/hair.js.map +1 -0
  166. package/dist/scene/light.js +5 -1
  167. package/dist/scene/light.js.map +1 -1
  168. package/dist/scene/mesh.js +481 -47
  169. package/dist/scene/mesh.js.map +1 -1
  170. package/dist/scene/meshdrawable.js +6 -0
  171. package/dist/scene/meshdrawable.js.map +1 -1
  172. package/dist/scene/msdftext.js +3 -0
  173. package/dist/scene/msdftext.js.map +1 -1
  174. package/dist/scene/msdftextsprite.js +3 -0
  175. package/dist/scene/msdftextsprite.js.map +1 -1
  176. package/dist/scene/particlesys.js +6 -0
  177. package/dist/scene/particlesys.js.map +1 -1
  178. package/dist/scene/scene.js +3 -0
  179. package/dist/scene/scene.js.map +1 -1
  180. package/dist/scene/scene_node.js +6 -1
  181. package/dist/scene/scene_node.js.map +1 -1
  182. package/dist/scene/terrain-cm/grass.js +273 -249
  183. package/dist/scene/terrain-cm/grass.js.map +1 -1
  184. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  185. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  186. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  187. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  188. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  189. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  190. package/dist/scene/water.js +6 -0
  191. package/dist/scene/water.js.map +1 -1
  192. package/dist/shaders/atmosphere.js.map +1 -1
  193. package/dist/shaders/diffusion.js +54 -0
  194. package/dist/shaders/diffusion.js.map +1 -0
  195. package/dist/shaders/shadow.js +33 -21
  196. package/dist/shaders/shadow.js.map +1 -1
  197. package/dist/shaders/temporal.js +71 -33
  198. package/dist/shaders/temporal.js.map +1 -1
  199. package/dist/shadow/dom.js +546 -0
  200. package/dist/shadow/dom.js.map +1 -0
  201. package/dist/shadow/pcf_opt.js +3 -5
  202. package/dist/shadow/pcf_opt.js.map +1 -1
  203. package/dist/shadow/pcf_pd.js +1 -1
  204. package/dist/shadow/pcf_pd.js.map +1 -1
  205. package/dist/shadow/receiver_bias.js +41 -0
  206. package/dist/shadow/receiver_bias.js.map +1 -0
  207. package/dist/shadow/shader.js +20 -60
  208. package/dist/shadow/shader.js.map +1 -1
  209. package/dist/shadow/shadow_impl.js +89 -0
  210. package/dist/shadow/shadow_impl.js.map +1 -1
  211. package/dist/shadow/shadow_region.js +50 -50
  212. package/dist/shadow/shadow_region.js.map +1 -1
  213. package/dist/shadow/shadowmapper.js +150 -37
  214. package/dist/shadow/shadowmapper.js.map +1 -1
  215. package/dist/shapes/shape.js +11 -2
  216. package/dist/shapes/shape.js.map +1 -1
  217. package/dist/shapes/sphere.js +50 -9
  218. package/dist/shapes/sphere.js.map +1 -1
  219. package/dist/utility/blueprint/common/constants.js +112 -2
  220. package/dist/utility/blueprint/common/constants.js.map +1 -1
  221. package/dist/utility/blueprint/material/func.js +142 -49
  222. package/dist/utility/blueprint/material/func.js.map +1 -1
  223. package/dist/utility/blueprint/material/ir.js +490 -25
  224. package/dist/utility/blueprint/material/ir.js.map +1 -1
  225. package/dist/utility/blueprint/material/texture.js +898 -4
  226. package/dist/utility/blueprint/material/texture.js.map +1 -1
  227. package/dist/utility/serialization/manager.js +431 -100
  228. package/dist/utility/serialization/manager.js.map +1 -1
  229. package/dist/utility/serialization/scene/animation.js +370 -3
  230. package/dist/utility/serialization/scene/animation.js.map +1 -1
  231. package/dist/utility/serialization/scene/batch.js +4 -0
  232. package/dist/utility/serialization/scene/batch.js.map +1 -1
  233. package/dist/utility/serialization/scene/camera.js +133 -1
  234. package/dist/utility/serialization/scene/camera.js.map +1 -1
  235. package/dist/utility/serialization/scene/common.js +26 -5
  236. package/dist/utility/serialization/scene/common.js.map +1 -1
  237. package/dist/utility/serialization/scene/hair.js +1141 -0
  238. package/dist/utility/serialization/scene/hair.js.map +1 -0
  239. package/dist/utility/serialization/scene/light.js +84 -4
  240. package/dist/utility/serialization/scene/light.js.map +1 -1
  241. package/dist/utility/serialization/scene/material.js +1867 -166
  242. package/dist/utility/serialization/scene/material.js.map +1 -1
  243. package/dist/utility/serialization/scene/mesh.js +231 -14
  244. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  245. package/dist/utility/serialization/scene/node.js +141 -7
  246. package/dist/utility/serialization/scene/node.js.map +1 -1
  247. package/dist/utility/serialization/scene/particle.js +4 -0
  248. package/dist/utility/serialization/scene/particle.js.map +1 -1
  249. package/dist/utility/serialization/scene/primitive.js +18 -0
  250. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  251. package/dist/utility/serialization/scene/sprite.js +4 -0
  252. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  253. package/dist/utility/serialization/scene/terrain.js +92 -69
  254. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  255. package/dist/utility/serialization/scene/text.js +4 -0
  256. package/dist/utility/serialization/scene/text.js.map +1 -1
  257. package/dist/utility/serialization/scene/water.js +4 -0
  258. package/dist/utility/serialization/scene/water.js.map +1 -1
  259. package/dist/utility/serialization/types.js.map +1 -1
  260. package/dist/utility/shprojector.js +96 -95
  261. package/dist/utility/shprojector.js.map +1 -1
  262. package/dist/values.js +105 -58
  263. package/dist/values.js.map +1 -1
  264. package/package.json +3 -3
@@ -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\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.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 /** @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","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\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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"}
@@ -12,6 +12,7 @@ import { ShaderHelper } from '../material/shader/helper.js';
12
12
  _renderBackface;
13
13
  _encodeDepth;
14
14
  _transmission;
15
+ _motionVectorOnly;
15
16
  /**
16
17
  * Creates an instance of DepthRenderPass
17
18
  */ constructor(){
@@ -19,6 +20,30 @@ import { ShaderHelper } from '../material/shader/helper.js';
19
20
  this._renderBackface = false;
20
21
  this._encodeDepth = false;
21
22
  this._transmission = false;
23
+ this._motionVectorOnly = false;
24
+ }
25
+ /**
26
+ * Draws the transparent queue for its motion vectors alone.
27
+ *
28
+ * @remarks
29
+ * Blended geometry is absent from the ordinary prepass, so it contributes no
30
+ * velocity and a temporal filter reprojects it with whatever is behind it -
31
+ * which for hair swinging in front of a still background means reprojecting it
32
+ * as if it were still. This mode fills that in: same pass, same shaders, but
33
+ * the framebuffer carries the motion vector attachment only, nothing writes
34
+ * depth, and materials that have not opted in discard.
35
+ *
36
+ * It cannot be exact. One velocity per pixel cannot describe several blended
37
+ * layers, so the value that survives is whichever fragment landed last rather
38
+ * than the nearest. For hair that is the same approximation the dithered path
39
+ * already makes - dither keeps one arbitrary strand per pixel - which is why
40
+ * it holds up there and why it stays opt-in rather than applying to every
41
+ * transparent material.
42
+ */ get motionVectorOnly() {
43
+ return this._motionVectorOnly;
44
+ }
45
+ set motionVectorOnly(val) {
46
+ this._motionVectorOnly = !!val;
22
47
  }
23
48
  get transmission() {
24
49
  return this._transmission;
@@ -39,7 +64,7 @@ import { ShaderHelper } from '../material/shader/helper.js';
39
64
  this._encodeDepth = !!val;
40
65
  }
41
66
  /** @internal */ _getGlobalBindGroupHash(ctx) {
42
- return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}`;
67
+ return `${Number(this._renderBackface)}:${Number(this._encodeDepth)}:${Number(ctx.motionVectors)}:${Number(this._motionVectorOnly)}`;
43
68
  }
44
69
  /** @internal */ renderItems(ctx, renderCamera, renderQueue) {
45
70
  const items = renderQueue.itemList;
@@ -47,12 +72,21 @@ import { ShaderHelper } from '../material/shader/helper.js';
47
72
  ctx.drawEnvLight = false;
48
73
  ctx.env = null;
49
74
  ctx.flip = this.isAutoFlip(ctx);
75
+ // This pass keys its programs off renderPassHash, which Material.calcGlobalHash only
76
+ // consults when shaderVariantHash is null. LightPass clears that field on entry but not
77
+ // on exit, so a depth pass running after it would otherwise inherit the light pass's
78
+ // variant hash and hash to the same key -- handing this pass the light pass's program.
79
+ // The prepass never noticed (it runs first, while the field is still null); the
80
+ // transmission depth pass runs after the light pass and did, silently reusing a
81
+ // single-output program. With motion vectors on, its framebuffer has two attachments and
82
+ // the reuse finally surfaced as a fragment output count mismatch.
83
+ ctx.shaderVariantHash = null;
50
84
  ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, renderCamera);
51
85
  const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);
52
86
  ctx.device.setBindGroup(0, bindGroup);
53
87
  ShaderHelper.setCameraUniforms(bindGroup, ctx, renderCamera, true);
54
88
  const reverseWinding = ctx.camera.worldMatrixDet < 0;
55
- const list = this._transmission ? items.transmission : items.opaque;
89
+ const list = this._motionVectorOnly ? items.transparent : this._transmission ? items.transmission : items.opaque;
56
90
  for (const lit of list.lit){
57
91
  this.drawItemList(lit, ctx, reverseWinding);
58
92
  }
@@ -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 /**\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 }\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(ctx.motionVectors)}`;\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 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._transmission ? items.transmission : 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","RENDER_PASS_TYPE_DEPTH","transmission","val","renderBackface","encodeDepth","_getGlobalBindGroupHash","ctx","Number","motionVectors","renderCamera","renderQueue","items","itemList","drawEnvLight","env","flip","isAutoFlip","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","device","setBindGroup","ShaderHelper","setCameraUniforms","reverseWinding","camera","worldMatrixDet","list","opaque","lit","drawItemList","unlit"],"mappings":";;;;AAOA;;;;;;IAOO,MAAMA,SAAkBC,SAAAA,UAAAA,CAAAA;IACrBC,eAAyB;IACzBC,YAAsB;IACtBC,aAAuB;AAC/B;;AAEC,MACD,WAAc,EAAA;AACZ,QAAA,KAAK,CAACC,sBAAAA,CAAAA;QACN,IAAI,CAACH,eAAe,GAAG,KAAA;QACvB,IAAI,CAACC,YAAY,GAAG,KAAA;QACpB,IAAI,CAACC,aAAa,GAAG,KAAA;AACvB;AACA,IAAA,IAAIE,YAAe,GAAA;QACjB,OAAO,IAAI,CAACF,aAAa;AAC3B;IACA,IAAIE,YAAAA,CAAaC,GAAY,EAAE;QAC7B,IAAI,CAACH,aAAa,GAAGG,GAAAA;AACvB;AACA,IAAA,IAAIC,cAAiB,GAAA;QACnB,OAAO,IAAI,CAACN,eAAe;AAC7B;IACA,IAAIM,cAAAA,CAAeD,GAAG,EAAE;AACtB,QAAA,IAAI,CAACL,eAAe,GAAG,CAAC,CAACK,GAAAA;AAC3B;AACA,IAAA,IAAIE,WAAc,GAAA;QAChB,OAAO,IAAI,CAACN,YAAY;AAC1B;IACA,IAAIM,WAAAA,CAAYF,GAAG,EAAE;AACnB,QAAA,IAAI,CAACJ,YAAY,GAAG,CAAC,CAACI,GAAAA;AACxB;AACA,qBACUG,uBAAwBC,CAAAA,GAAgB,EAAE;AAClD,QAAA,OAAO,GAAGC,MAAO,CAAA,IAAI,CAACV,eAAe,CAAA,CAAE,CAAC,EAAEU,MAAAA,CAAO,IAAI,CAACT,YAAY,CAAE,CAAA,CAAC,EAAES,MAAOD,CAAAA,GAAAA,CAAIE,aAAa,CAAG,CAAA,CAAA;AACpG;qBAEA,WAAsBF,CAAAA,GAAgB,EAAEG,YAAoB,EAAEC,WAAwB,EAAE;QACtF,MAAMC,KAAAA,GAAQD,YAAYE,QAAQ;AAClC,QAAA,IAAID,KAAO,EAAA;AACTL,YAAAA,GAAAA,CAAIO,YAAY,GAAG,KAAA;AACnBP,YAAAA,GAAAA,CAAIQ,GAAG,GAAG,IAAA;AACVR,YAAAA,GAAAA,CAAIS,IAAI,GAAG,IAAI,CAACC,UAAU,CAACV,GAAAA,CAAAA;AAC3BA,YAAAA,GAAAA,CAAIW,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAACZ,GAAKG,EAAAA,YAAAA,CAAAA;AACtD,YAAA,MAAMU,SAAYb,GAAAA,GAAAA,CAAIc,wBAAwB,CAACC,kBAAkB,CAACf,GAAAA,CAAAA;AAClEA,YAAAA,GAAAA,CAAIgB,MAAM,CAACC,YAAY,CAAC,CAAGJ,EAAAA,SAAAA,CAAAA;AAC3BK,YAAAA,YAAAA,CAAaC,iBAAiB,CAACN,SAAWb,EAAAA,GAAAA,EAAKG,YAAc,EAAA,IAAA,CAAA;AAC7D,YAAA,MAAMiB,cAAiBpB,GAAAA,GAAAA,CAAIqB,MAAM,CAACC,cAAc,GAAG,CAAA;YACnD,MAAMC,IAAAA,GAAO,IAAI,CAAC9B,aAAa,GAAGY,KAAMV,CAAAA,YAAY,GAAGU,KAAAA,CAAMmB,MAAM;AACnE,YAAA,KAAK,MAAMC,GAAAA,IAAOF,IAAKE,CAAAA,GAAG,CAAE;AAC1B,gBAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAKzB,GAAKoB,EAAAA,cAAAA,CAAAA;AAC9B;AACA,YAAA,KAAK,MAAMO,KAAAA,IAASJ,IAAKI,CAAAA,KAAK,CAAE;AAC9B,gBAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAO3B,GAAKoB,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;AACF;;;;"}
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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"}
@@ -6,10 +6,13 @@ import '../material/unlit.js';
6
6
  import '../material/particle.js';
7
7
  import '../material/subsurfaceprofile.js';
8
8
  import '../material/skin.js';
9
+ import '../material/eye.js';
9
10
  import '@zephyr3d/device';
10
11
  import { MaterialVaryingFlags } from '../values.js';
11
12
  import { getDevice } from '../app/api.js';
12
13
  import '../material/meshmaterial.js';
14
+ import '../material/hair.js';
15
+ import '../material/hairstrand.js';
13
16
  import '../material/grassmaterial.js';
14
17
  import '../material/terrain-cm.js';
15
18
  import '../material/pbrmr.js';
@@ -22,6 +25,8 @@ import '../utility/blueprint/material/texture.js';
22
25
 
23
26
  let _drawableId = 0;
24
27
  const boneTextureSize = new Vector2();
28
+ const skinInfluenceInfo = new Vector4();
29
+ let defaultSkinInfluenceTexture = null;
25
30
  const instanceBindGroupTransfromTags = new WeakMap();
26
31
  const drawableBindGroupTransfromTags = new WeakMap();
27
32
  const bindGroupCache = {};
@@ -58,6 +63,22 @@ function releaseBindGroup(bindGroup) {
58
63
  }
59
64
  }
60
65
  }
66
+ function getDefaultSkinInfluenceTexture() {
67
+ let texture = defaultSkinInfluenceTexture;
68
+ if (!texture) {
69
+ texture = getDevice().createTexture2D('rgba32f', 1, 1, {
70
+ mipmapping: false,
71
+ samplerOptions: {
72
+ minFilter: 'nearest',
73
+ magFilter: 'nearest',
74
+ mipFilter: 'none'
75
+ }
76
+ });
77
+ texture.update(new Float32Array(4), 0, 0, 1, 1);
78
+ defaultSkinInfluenceTexture = texture;
79
+ }
80
+ return texture;
81
+ }
61
82
  function mixinDrawable(baseCls) {
62
83
  const cls = class extends baseCls {
63
84
  _mdRenderQueueRef;
@@ -200,14 +221,18 @@ function mixinDrawable(baseCls) {
200
221
  }
201
222
  if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {
202
223
  const boneTexture = this.getBoneMatrices();
224
+ const skinData = this.getSkinInfluenceData();
203
225
  drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);
204
226
  drawableBindGroup.setValue(ShaderHelper.getBoneInvBindMatrixUniformName(), this.invWorldMatrix);
205
227
  boneTextureSize.setXY(boneTexture.width, boneTexture.height);
206
228
  drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);
229
+ drawableBindGroup.setTexture(ShaderHelper.getSkinInfluenceDataUniformName(), skinData?.texture?.get() ?? getDefaultSkinInfluenceTexture());
230
+ skinInfluenceInfo.setXYZW(skinData?.width ?? 1, skinData?.height ?? 1, skinData?.influenceCount ?? 4, skinData ? Math.ceil(Math.max(0, skinData.influenceCount - 4) / 2) : 0);
231
+ drawableBindGroup.setValue(ShaderHelper.getSkinInfluenceInfoUniformName(), skinInfluenceInfo);
207
232
  }
208
233
  if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {
209
234
  const morphData = this.getMorphData();
210
- const morphInfo = this.getMorphInfo();
235
+ const morphInfo = this.getRenderMorphInfo();
211
236
  drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture.get());
212
237
  drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer.get());
213
238
  }
@@ -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 } 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\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\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 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 }\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).getMorphInfo()!;\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","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","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","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","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","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 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,24 +1,25 @@
1
- import { Disposable, Vector4, REVERSE_Z, DEPTH_FARTHEST } from '@zephyr3d/base';
1
+ import { Vector4, REVERSE_Z, DEPTH_FARTHEST } from '@zephyr3d/base';
2
+ import { OIT } from './oit.js';
2
3
  import { drawFullscreenQuad } from './fullscreenquad.js';
3
4
  import { tryGetApp } from '../app/api.js';
4
5
 
5
6
  const DEPTH_FORMAT = 'rg32f';
6
7
  const ACCUM_FORMAT = 'rgba16f';
7
8
  const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
8
- /**
9
- * Dual depth peeling OIT renderer.
10
- *
11
- * @remarks
12
- * This implementation follows the official dual depth peeling pass structure:
13
- * an initialization pass writes the nearest/farthest transparent depth pair, then
14
- * each peel pass ping-pongs the depth pair while accumulating front and back colors.
15
- *
16
- * It requires MRT, per-target blending, min/max blend equations and blendable
17
- * floating-point color targets. If those capabilities are missing, supportDevice()
18
- * returns false and the transparent pass falls back to sorted alpha blending.
19
- *
20
- * @public
21
- */ class DualDepthPeelingOIT extends Disposable {
9
+ /**
10
+ * Dual depth peeling OIT renderer.
11
+ *
12
+ * @remarks
13
+ * This implementation follows the official dual depth peeling pass structure:
14
+ * an initialization pass writes the nearest/farthest transparent depth pair, then
15
+ * each peel pass ping-pongs the depth pair while accumulating front and back colors.
16
+ *
17
+ * It requires MRT, per-target blending, min/max blend equations and blendable
18
+ * floating-point color targets. If those capabilities are missing, supportDevice()
19
+ * returns false and the transparent pass falls back to sorted alpha blending.
20
+ *
21
+ * @public
22
+ */ class DualDepthPeelingOIT extends OIT {
22
23
  /** Type name of DualDepthPeelingOIT */ static type = 'ddp';
23
24
  static DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);
24
25
  static FRONT_CLEAR = new Vector4(0, 0, 0, 1);
@@ -34,10 +35,10 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
34
35
  _backTarget;
35
36
  _framebuffers;
36
37
  _device;
37
- /**
38
- * Creates an instance of DualDepthPeelingOIT.
39
- *
40
- * @param numPeels - Number of peel iterations after the initialization pass.
38
+ /**
39
+ * Creates an instance of DualDepthPeelingOIT.
40
+ *
41
+ * @param numPeels - Number of peel iterations after the initialization pass.
41
42
  */ constructor(numPeels = 8){
42
43
  super();
43
44
  this._numPeels = Math.max(1, Math.floor(numPeels || 0));
@@ -61,12 +62,12 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
61
62
  set numPeels(val) {
62
63
  this._numPeels = Math.max(1, Math.floor(val || 0));
63
64
  }
64
- /**
65
- * Checks whether dual depth peeling can run with a capability snapshot.
66
- *
67
- * @param deviceType - The device type.
68
- * @param caps - The device capabilities.
69
- * @returns True if dual depth peeling is supported.
65
+ /**
66
+ * Checks whether dual depth peeling can run with a capability snapshot.
67
+ *
68
+ * @param deviceType - The device type.
69
+ * @param caps - The device capabilities.
70
+ * @returns True if dual depth peeling is supported.
70
71
  */ static supportDeviceCaps(deviceType, caps) {
71
72
  const framebufferCaps = caps.framebufferCaps;
72
73
  const textureCaps = caps.textureCaps;
@@ -75,29 +76,29 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
75
76
  const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;
76
77
  return webgl2OrBetter && framebufferCaps.maxDrawBuffers >= 3 && framebufferCaps.supportPerTargetBlending && framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE && miscCaps.supportBlendMinMax && textureCaps.supportHalfFloatColorBuffer && textureCaps.supportFloatColorBuffer && textureCaps.supportFloatBlending;
77
78
  }
78
- /**
79
- * {@inheritDoc OIT.getType}
79
+ /**
80
+ * {@inheritDoc OIT.getType}
80
81
  */ getType() {
81
82
  return DualDepthPeelingOIT.type;
82
83
  }
83
- /**
84
- * {@inheritDoc OIT.supportDevice}
84
+ /**
85
+ * {@inheritDoc OIT.supportDevice}
85
86
  */ supportDevice(deviceType) {
86
87
  const device = tryGetApp()?.device;
87
88
  return !!device && device.type === deviceType && DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps());
88
89
  }
89
- /**
90
- * {@inheritDoc OIT.wantsPremultipliedAlpha}
90
+ /**
91
+ * {@inheritDoc OIT.wantsPremultipliedAlpha}
91
92
  */ wantsPremultipliedAlpha() {
92
93
  return true;
93
94
  }
94
- /**
95
- * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
95
+ /**
96
+ * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
96
97
  */ wantsAdditiveLightPassAlpha() {
97
98
  return true;
98
99
  }
99
- /**
100
- * {@inheritDoc OIT.begin}
100
+ /**
101
+ * {@inheritDoc OIT.begin}
101
102
  */ begin(ctx) {
102
103
  this.releaseFramebuffers();
103
104
  if (!ctx.depthTexture) {
@@ -107,8 +108,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
107
108
  this.createFramebuffers(ctx);
108
109
  return this._numPeels + 1;
109
110
  }
110
- /**
111
- * {@inheritDoc OIT.end}
111
+ /**
112
+ * {@inheritDoc OIT.end}
112
113
  */ end(ctx) {
113
114
  try {
114
115
  if (this._frontTarget && this._backTarget) {
@@ -119,8 +120,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
119
120
  this._hash = DualDepthPeelingOIT.type;
120
121
  }
121
122
  }
122
- /**
123
- * {@inheritDoc OIT.beginPass}
123
+ /**
124
+ * {@inheritDoc OIT.beginPass}
124
125
  */ beginPass(ctx, pass) {
125
126
  this._currentPass = pass;
126
127
  const targetIndex = pass & 1;
@@ -144,13 +145,13 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
144
145
  ], null, null);
145
146
  return true;
146
147
  }
147
- /**
148
- * {@inheritDoc OIT.endPass}
148
+ /**
149
+ * {@inheritDoc OIT.endPass}
149
150
  */ endPass(ctx, _pass) {
150
151
  ctx.device.popDeviceStates();
151
152
  }
152
- /**
153
- * {@inheritDoc OIT.setupFragmentOutput}
153
+ /**
154
+ * {@inheritDoc OIT.setupFragmentOutput}
154
155
  */ setupFragmentOutput(scope) {
155
156
  const pb = scope.$builder;
156
157
  scope.$outputs.Z_DDP_depth = pb.vec2();
@@ -160,8 +161,8 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
160
161
  scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();
161
162
  }
162
163
  }
163
- /**
164
- * {@inheritDoc OIT.outputFragmentColor}
164
+ /**
165
+ * {@inheritDoc OIT.outputFragmentColor}
165
166
  */ outputFragmentColor(scope, color, ctx) {
166
167
  const pb = scope.$builder;
167
168
  scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);
@@ -192,20 +193,20 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
192
193
  }
193
194
  return true;
194
195
  }
195
- /**
196
- * {@inheritDoc OIT.applyUniforms}
196
+ /**
197
+ * {@inheritDoc OIT.applyUniforms}
197
198
  */ applyUniforms(_ctx, bindGroup) {
198
199
  if (this._currentPass > 0) {
199
200
  bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[this._currentPass & 1 ^ 1]);
200
201
  }
201
202
  }
202
- /**
203
- * {@inheritDoc OIT.calculateHash}
203
+ /**
204
+ * {@inheritDoc OIT.calculateHash}
204
205
  */ calculateHash() {
205
206
  return this._hash;
206
207
  }
207
- /**
208
- * {@inheritDoc OIT.setRenderStates}
208
+ /**
209
+ * {@inheritDoc OIT.setRenderStates}
209
210
  */ setRenderStates(rs) {
210
211
  rs.useBlendingState().enable(false).enableAlphaToCoverage(false);
211
212
  rs.useDepthState().enableTest(true).enableWrite(false);