@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":"shadow_mask_pass.js","sources":["../../src/render/shadow_mask_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';\r\n\r\n/**\r\n * Number of shadow-casting lights packed into a single RGBA8 mask array layer.\r\n * One light per color channel.\r\n */\r\nexport const SHADOW_MASK_LIGHTS_PER_LAYER = 4;\r\n\r\n/**\r\n * Maximum number of shadow mask array layers, derived from the per-light cap.\r\n */\r\nexport const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;\r\n\r\n/**\r\n * Renders the screen-space shadow mask for the Forward+ pipeline.\r\n *\r\n * For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,\r\n * 0 = fully shadowed) is reconstructed from the linear depth prepass and written\r\n * into one channel of one layer of an `rgba8unorm` texture array. Four lights are\r\n * packed per layer (one per RGBA channel).\r\n *\r\n * The layer/channel assignment must stay in lockstep with\r\n * {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered\r\n * buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based\r\n * light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The\r\n * clustered shading pass recovers the same mapping from a light's buffer index, so\r\n * no per-light mask index is stored.\r\n *\r\n * @internal\r\n */\r\nexport class ShadowMaskRenderer {\r\n /** Fullscreen mask programs keyed by a per-light shader signature. */\r\n private _programs: Map<string, GPUProgram>;\r\n /** Bind groups paired with each cached program. */\r\n private _bindGroups: Map<string, BindGroup>;\r\n /** One render state per RGBA channel (color mask selects the target channel). */\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n }\r\n\r\n /**\r\n * Number of array layers required to hold `numLights` shadow lights.\r\n * @param numLights - Number of shadow-casting lights.\r\n * @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.\r\n */\r\n static getLayerCount(numLights: number): number {\r\n const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);\r\n return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);\r\n }\r\n\r\n /**\r\n * Render the shadow mask for the given shadow-casting lights.\r\n *\r\n * @param ctx - Draw context (must carry shadowMapInfo for the lights).\r\n * @param depthTexture - Linear depth texture from the depth prepass.\r\n * @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).\r\n * @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numLights);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n const framebuffer = getLayerFramebuffer(layer);\r\n device.setFramebuffer(framebuffer);\r\n // Clear to \"fully lit\" (1 = no shadow) so channels without an assigned\r\n // light, and pixels outside any shadow, read as unshadowed. The mask array\r\n // has no depth attachment, so depth/stencil clear args are null.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light);\r\n if (!shadowMapParams || !shadowMapParams.shadowMap) {\r\n continue;\r\n }\r\n // Record where this light lives in the mask so downstream samplers (e.g.\r\n // the SSS combine pass) can read its channel without recomputing shadows.\r\n shadowMapParams.maskOrdinal = ordinal;\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n /** Render one shadow light into one color channel of the current framebuffer. */\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const key = this.getProgramKey(ctx, shadowMapParams);\r\n let program = this._programs.get(key) ?? null;\r\n let bindGroup = this._bindGroups.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams);\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, bindGroup);\r\n }\r\n bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n /**\r\n * The program signature: distinct shadow implementations, cascade counts and\r\n * shadow map types must not share a compiled program.\r\n */\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\r\n return `${ctx.device.type}|${shadowMapParams.shaderHash}`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams\r\n ): void {\r\n const camera = ctx.camera;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n // Full shadow light struct (matches helper.ts currentShadowLight lightStruct,\r\n // including implParams which PCSS/VSM impls read via getShadowImplParams).\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n UNIFORM_NAME_SHADOW_MAP,\r\n shadowMapParams.shadowMap!,\r\n shadowMapParams.shadowMapSampler\r\n );\r\n }\r\n\r\n /**\r\n * Whether the fullscreen output needs a vertical flip. Mask array layers are\r\n * offscreen render targets, so the convention matches other offscreen passes\r\n * (no flip); WebGPU still flips clip-space Y in the vertex shader.\r\n */\r\n private needFlip(_device: AbstractDevice): boolean {\r\n return false;\r\n }\r\n\r\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const shadowMap = shadowMapParams.shadowMap!;\r\n const program = device.buildRenderProgram({\r\n label: 'ShadowMask',\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n // Required by PCSS temporal jitter (ShaderHelper.getFramestamp).\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n const shadowTex = shadowMap.isTextureCube()\r\n ? shadowMap.isDepth()\r\n ? pb.texCubeShadow()\r\n : pb.texCube()\r\n : shadowMap.isTexture2D()\r\n ? shadowMap.isDepth()\r\n ? pb.tex2DShadow()\r\n : pb.tex2D()\r\n : shadowMap.isDepth()\r\n ? pb.tex2DArrayShadow()\r\n : pb.tex2DArray();\r\n if (\r\n !shadowMap.isDepth() &&\r\n !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable\r\n ) {\r\n shadowTex.sampleType('unfilterable-float');\r\n }\r\n this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.$outputs.color = pb.vec4();\r\n // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen\r\n // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.\r\n pb.func(\r\n 'zShadowMaskFactor',\r\n [pb.vec3('worldPos'), pb.float('depth01'), pb.float('NoL')],\r\n function () {\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);\r\n this.$l.splitDistances = this.light.cascadeDistances;\r\n this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n if (device.type === 'webgl') {\r\n this.$l.shadowVertex = pb.vec4();\r\n this.$for(pb.int('cascade'), 0, 4, function () {\r\n this.$if(pb.equal(this.cascade, this.split), function () {\r\n this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.worldPos, 1),\r\n this.cascade\r\n );\r\n this.$break();\r\n });\r\n });\r\n } else {\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.worldPos, 1),\r\n this.split\r\n );\r\n }\r\n this.$l.shadow = shadowMapParams.impl!.computeShadowCSM(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL,\r\n this.split\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n } else {\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(this, pb.vec4(this.worldPos, 1));\r\n this.$l.shadow = shadowMapParams.impl!.computeShadow(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n }\r\n }\r\n );\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n // NoL is unavailable in a fullscreen pass (no geometric normal); it only\r\n // feeds normal-offset bias, so a conservative 1.0 is used.\r\n this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, pb.float(1));\r\n this.$outputs.color = pb.vec4(this.factor);\r\n });\r\n }\r\n })!;\r\n program.name = '@ShadowMask';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n\r\n/** Shared type alias to keep the mask factor accessor discoverable. */\r\nexport type ShadowMaskFactorExp = PBShaderExp;\r\n"],"names":["UNIFORM_NAME_SHADOW_MAP","SHADOW_MASK_LIGHTS_PER_LAYER","MAX_SHADOW_MASK_LAYERS","MAX_SHADOW_MASK_LIGHTS","ShadowMaskRenderer","_nearFar","_cameraPosition","_cameraParams","_programs","Map","_bindGroups","_channelStates","Vector2","Vector4","getLayerCount","numLights","n","Math","min","ceil","render","ctx","depthTexture","lights","getLayerFramebuffer","device","length","shadowMapInfo","numLayers","channelStates","getChannelStates","savedShadowLight","currentShadowLight","pushDeviceStates","layer","framebuffer","setFramebuffer","clearFrameBuffer","channel","ordinal","light","shadowMapParams","get","shadowMap","maskOrdinal","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","bindGroup","createProgram","createBindGroup","bindGroupLayouts","set","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","type","shaderHash","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setXY","setValue","position","params","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","numShadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","invViewProjectionMatrix","needFlip","setTexture","fetchSampler","shadowMapSampler","_device","numCascades","buildRenderProgram","label","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","neg","fragment","cameraStruct","defineStruct","float","lightStruct","vec3","shadowTex","isTextureCube","isDepth","texCubeShadow","texCube","isTexture2D","tex2DShadow","tex2D","tex2DArrayShadow","tex2DArray","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","sampleType","depthTex","invViewProjMatrix","mat4","cameraNearFar","color","func","$l","linearDepth","depth01","splitDistances","comparison","greaterThan","cascadeFlags","split","dot","shadowVertex","$for","equal","cascade","calculateShadowSpaceVertex","worldPos","$break","computeShadowCSM","NoL","shadowDistance","w","mix","smoothStep","distance","$return","clamp","computeShadow","samplePositionFromDepth","factor","zShadowMaskFactor","name","dispose","values","clear"],"mappings":"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"}
1
+ {"version":3,"file":"shadow_mask_pass.js","sources":["../../src/render/shadow_mask_pass.ts"],"sourcesContent":["import { DEPTH_FARTHEST, Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from './drawable';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { ShadowMapParams } from '../shadow/shadowmapper';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { LIGHT_TYPE_DIRECTIONAL, MAX_SHADOW_MASK_LIGHTS } from '../values';\r\nimport { fetchSampler } from '../utility/misc';\r\n\r\nconst UNIFORM_NAME_SHADOW_MAP = 'Z_UniformShadowMap';\r\n\r\n/**\r\n * Number of shadow-casting lights packed into a single RGBA8 mask array layer.\r\n * One light per color channel.\r\n */\r\nexport const SHADOW_MASK_LIGHTS_PER_LAYER = 4;\r\n\r\n/**\r\n * Maximum number of shadow mask array layers, derived from the per-light cap.\r\n */\r\nexport const MAX_SHADOW_MASK_LAYERS = MAX_SHADOW_MASK_LIGHTS / SHADOW_MASK_LIGHTS_PER_LAYER;\r\n\r\n/**\r\n * Renders the screen-space shadow mask for the Forward+ pipeline.\r\n *\r\n * For each shadow-casting light, the light's visibility factor `[0,1]` (1 = lit,\r\n * 0 = fully shadowed) is reconstructed from the linear depth prepass and written\r\n * into one channel of one layer of an `rgba8unorm` texture array. Four lights are\r\n * packed per layer (one per RGBA channel).\r\n *\r\n * The layer/channel assignment must stay in lockstep with\r\n * {@link ClusteredLight.getVisibleLights}: shadow-casting lights occupy clustered\r\n * buffer indices `1..N` in the order of `renderQueue.shadowedLights`. The zero-based\r\n * light ordinal `s = index - 1` maps to `layer = s >> 2`, `channel = s & 3`. The\r\n * clustered shading pass recovers the same mapping from a light's buffer index, so\r\n * no per-light mask index is stored.\r\n *\r\n * @internal\r\n */\r\nexport class ShadowMaskRenderer {\r\n /** Fullscreen mask programs keyed by a per-light shader signature. */\r\n private _programs: Map<string, GPUProgram>;\r\n /** Bind groups paired with each cached program. */\r\n private _bindGroups: Map<string, BindGroup>;\r\n /** One render state per RGBA channel (color mask selects the target channel). */\r\n private _channelStates: Nullable<RenderStateSet[]>;\r\n private readonly _nearFar: Vector2;\r\n private readonly _invRenderSize: Vector2;\r\n private readonly _cameraPosition: Vector4;\r\n private readonly _cameraParams: Vector4;\r\n\r\n constructor() {\r\n this._programs = new Map();\r\n this._bindGroups = new Map();\r\n this._channelStates = null;\r\n this._nearFar = new Vector2();\r\n this._invRenderSize = new Vector2();\r\n this._cameraPosition = new Vector4();\r\n this._cameraParams = new Vector4();\r\n }\r\n\r\n /**\r\n * Number of array layers required to hold `numLights` shadow lights.\r\n * @param numLights - Number of shadow-casting lights.\r\n * @returns Layer count, clamped to {@link MAX_SHADOW_MASK_LAYERS}.\r\n */\r\n static getLayerCount(numLights: number): number {\r\n const n = Math.min(numLights, MAX_SHADOW_MASK_LIGHTS);\r\n return Math.min(Math.ceil(n / SHADOW_MASK_LIGHTS_PER_LAYER), MAX_SHADOW_MASK_LAYERS);\r\n }\r\n\r\n /**\r\n * Render the shadow mask for the given shadow-casting lights.\r\n *\r\n * @param ctx - Draw context (must carry shadowMapInfo for the lights).\r\n * @param depthTexture - Linear depth texture from the depth prepass.\r\n * @param lights - Shadow-casting lights, in clustered-buffer order (index 1..N).\r\n * @param getLayerFramebuffer - Resolves the framebuffer bound to mask array layer `k`.\r\n */\r\n render(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n lights: PunctualLight[],\r\n getLayerFramebuffer: (layer: number) => FrameBuffer\r\n ): void {\r\n const device = ctx.device;\r\n const numLights = Math.min(lights.length, MAX_SHADOW_MASK_LIGHTS);\r\n if (numLights === 0 || !ctx.shadowMapInfo) {\r\n return;\r\n }\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numLights);\r\n const channelStates = this.getChannelStates(device);\r\n const savedShadowLight = ctx.currentShadowLight;\r\n\r\n device.pushDeviceStates();\r\n for (let layer = 0; layer < numLayers; layer++) {\r\n const framebuffer = getLayerFramebuffer(layer);\r\n device.setFramebuffer(framebuffer);\r\n // Clear to \"fully lit\" (1 = no shadow) so channels without an assigned\r\n // light, and pixels outside any shadow, read as unshadowed. The mask array\r\n // has no depth attachment, so depth/stencil clear args are null.\r\n device.clearFrameBuffer(new Vector4(1, 1, 1, 1), null, null);\r\n for (let channel = 0; channel < SHADOW_MASK_LIGHTS_PER_LAYER; channel++) {\r\n const ordinal = layer * SHADOW_MASK_LIGHTS_PER_LAYER + channel;\r\n if (ordinal >= numLights) {\r\n break;\r\n }\r\n const light = lights[ordinal];\r\n const shadowMapParams = ctx.shadowMapInfo.get(light);\r\n if (!shadowMapParams || !shadowMapParams.shadowMap) {\r\n continue;\r\n }\r\n // Record where this light lives in the mask so downstream samplers (e.g.\r\n // the SSS combine pass) can read its channel without recomputing shadows.\r\n shadowMapParams.maskOrdinal = ordinal;\r\n ctx.currentShadowLight = light;\r\n this.renderLightChannel(ctx, depthTexture, light, shadowMapParams, channelStates[channel]);\r\n }\r\n }\r\n device.popDeviceStates();\r\n ctx.currentShadowLight = savedShadowLight;\r\n }\r\n\r\n /** Render one shadow light into one color channel of the current framebuffer. */\r\n private renderLightChannel(\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams,\r\n renderState: RenderStateSet\r\n ): void {\r\n const device = ctx.device;\r\n const key = this.getProgramKey(ctx, shadowMapParams);\r\n let program = this._programs.get(key) ?? null;\r\n let bindGroup = this._bindGroups.get(key) ?? null;\r\n if (!program) {\r\n program = this.createProgram(ctx, shadowMapParams);\r\n bindGroup = device.createBindGroup(program.bindGroupLayouts[0]);\r\n this._programs.set(key, program);\r\n this._bindGroups.set(key, bindGroup);\r\n }\r\n bindGroup = this._bindGroups.get(key)!;\r\n this.setUniforms(bindGroup, ctx, depthTexture, light, shadowMapParams);\r\n device.setProgram(program);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(renderState);\r\n }\r\n\r\n /**\r\n * The program signature: distinct shadow implementations, cascade counts and\r\n * shadow map types must not share a compiled program.\r\n */\r\n private getProgramKey(ctx: DrawContext, shadowMapParams: ShadowMapParams): string {\r\n return `${ctx.device.type}|${shadowMapParams.shaderHash}`;\r\n }\r\n\r\n private getChannelStates(device: AbstractDevice): RenderStateSet[] {\r\n if (!this._channelStates) {\r\n this._channelStates = [];\r\n for (let c = 0; c < SHADOW_MASK_LIGHTS_PER_LAYER; c++) {\r\n const rs = device.createRenderStateSet();\r\n rs.useDepthState().enableTest(false).enableWrite(false);\r\n rs.useRasterizerState().setCullMode('none');\r\n rs.useColorState().setColorMask(c === 0, c === 1, c === 2, c === 3);\r\n this._channelStates.push(rs);\r\n }\r\n }\r\n return this._channelStates;\r\n }\r\n\r\n private setUniforms(\r\n bindGroup: BindGroup,\r\n ctx: DrawContext,\r\n depthTexture: Texture2D,\r\n light: PunctualLight,\r\n shadowMapParams: ShadowMapParams\r\n ): void {\r\n const camera = ctx.camera;\r\n const near = camera.getNearPlane();\r\n const far = camera.getFarPlane();\r\n const cameraPos = camera.getWorldPosition();\r\n this._cameraPosition.setXYZW(cameraPos.x, cameraPos.y, cameraPos.z, 0);\r\n this._cameraParams.setXYZW(near, far, 1, 1);\r\n this._nearFar.setXY(near, far);\r\n bindGroup.setValue('camera', {\r\n position: this._cameraPosition,\r\n params: this._cameraParams,\r\n shadowDebugCascades: camera.shadowDebugCascades ? 1 : 0,\r\n framestamp: ctx.device.frameInfo.frameCounter\r\n });\r\n // Full shadow light struct (matches helper.ts currentShadowLight lightStruct,\r\n // including implParams which PCSS/VSM impls read via getShadowImplParams).\r\n const implParams = new Vector4();\r\n shadowMapParams.impl!.getParams(implParams);\r\n bindGroup.setValue('light', {\r\n sunDir: ctx.sunLight\r\n ? ctx.sunLight.directionAndCutoff.xyz().scaleBy(-1)\r\n : new Vector4(0, 1, 0, 0).xyz(),\r\n shadowCascades: shadowMapParams.numShadowCascades,\r\n positionAndRange: light.positionAndRange,\r\n directionAndCutoff: light.directionAndCutoff,\r\n diffuseAndIntensity: ShaderHelper.getPreExposedColorIntensity(light, ctx),\r\n extraParams: light.extraParams,\r\n cascadeDistances: shadowMapParams.cascadeDistances,\r\n depthBiasValues: shadowMapParams.depthBiasValues[0],\r\n shadowCameraParams: shadowMapParams.cameraParams,\r\n depthBiasScales: shadowMapParams.depthBiasScales,\r\n implParams: implParams,\r\n shadowMatrices: new Float32Array(shadowMapParams.shadowMatrices),\r\n shadowStrength: light.shadow.shadowStrength,\r\n envLightStrength: ShaderHelper.getEnvLightLuminance(ctx),\r\n envLightSpecularStrength: ctx.env?.light.specularStrength ?? 1\r\n });\r\n bindGroup.setValue('invViewProjMatrix', camera.invViewProjectionMatrix);\r\n bindGroup.setValue('cameraNearFar', this._nearFar);\r\n // Neighbour tap spacing for the depth-based normal reconstruction.\r\n this._invRenderSize.setXY(1 / depthTexture.width, 1 / depthTexture.height);\r\n bindGroup.setValue('invRenderSize', this._invRenderSize);\r\n bindGroup.setValue('flip', this.needFlip(ctx.device) ? 1 : 0);\r\n bindGroup.setTexture('depthTex', depthTexture, fetchSampler('clamp_nearest_nomip'));\r\n bindGroup.setTexture(\r\n UNIFORM_NAME_SHADOW_MAP,\r\n shadowMapParams.shadowMap!,\r\n shadowMapParams.shadowMapSampler\r\n );\r\n }\r\n\r\n /**\r\n * Whether the fullscreen output needs a vertical flip. Mask array layers are\r\n * offscreen render targets, so the convention matches other offscreen passes\r\n * (no flip); WebGPU still flips clip-space Y in the vertex shader.\r\n */\r\n private needFlip(_device: AbstractDevice): boolean {\r\n return false;\r\n }\r\n\r\n private createProgram(ctx: DrawContext, shadowMapParams: ShadowMapParams): GPUProgram {\r\n const device = ctx.device;\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const lightType = shadowMapParams.lightType;\r\n const shadowMap = shadowMapParams.shadowMap!;\r\n const program = device.buildRenderProgram({\r\n label: 'ShadowMask',\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n const cameraStruct = pb.defineStruct([\r\n pb.vec4('position'),\r\n pb.vec4('params'),\r\n pb.float('shadowDebugCascades'),\r\n // Required by PCSS temporal jitter (ShaderHelper.getFramestamp).\r\n pb.int('framestamp')\r\n ]);\r\n // Must match helper.ts currentShadowLight lightStruct field-for-field.\r\n const lightStruct = pb.defineStruct([\r\n pb.vec3('sunDir'),\r\n pb.int('shadowCascades'),\r\n pb.vec4('positionAndRange'),\r\n pb.vec4('directionAndCutoff'),\r\n pb.vec4('diffuseAndIntensity'),\r\n pb.vec4('extraParams'),\r\n pb.vec4('cascadeDistances'),\r\n pb.vec4('depthBiasValues'),\r\n pb.vec4('shadowCameraParams'),\r\n pb.vec4('depthBiasScales'),\r\n pb.vec4('implParams'),\r\n pb.vec4[16]('shadowMatrices'),\r\n pb.float('shadowStrength'),\r\n pb.float('envLightStrength'),\r\n pb.float('envLightSpecularStrength')\r\n ]);\r\n this.camera = cameraStruct().uniform(0);\r\n this.light = lightStruct().uniform(0);\r\n const shadowTex = shadowMap.isTextureCube()\r\n ? shadowMap.isDepth()\r\n ? pb.texCubeShadow()\r\n : pb.texCube()\r\n : shadowMap.isTexture2D()\r\n ? shadowMap.isDepth()\r\n ? pb.tex2DShadow()\r\n : pb.tex2D()\r\n : shadowMap.isDepth()\r\n ? pb.tex2DArrayShadow()\r\n : pb.tex2DArray();\r\n if (\r\n !shadowMap.isDepth() &&\r\n !device.getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMap.format).filterable\r\n ) {\r\n shadowTex.sampleType('unfilterable-float');\r\n }\r\n this[UNIFORM_NAME_SHADOW_MAP] = shadowTex.uniform(0);\r\n this.depthTex = pb.tex2D().sampleType('unfilterable-float').uniform(0);\r\n this.invViewProjMatrix = pb.mat4().uniform(0);\r\n this.cameraNearFar = pb.vec2().uniform(0);\r\n this.invRenderSize = pb.vec2().uniform(0);\r\n this.$outputs.color = pb.vec4();\r\n /**\r\n * Geometric normal recovered from the depth prepass.\r\n *\r\n * The opaque queue takes its shadows from this mask rather than from\r\n * each material's calculateShadow, so this is the only place the normal\r\n * offset can be applied on that path - and a fullscreen pass has no\r\n * interpolated normal to use.\r\n *\r\n * Naive cross(dpdx, dpdy) spans depth discontinuities and produces a\r\n * wild normal along every silhouette. Taking the nearer neighbour on\r\n * each axis keeps the basis on one surface instead.\r\n */\r\n pb.func('zReconstructNormal', [pb.vec2('uv'), pb.vec4('center')], function () {\r\n this.$l.dx = pb.vec2(this.invRenderSize.x, 0);\r\n this.$l.dy = pb.vec2(0, this.invRenderSize.y);\r\n this.$l.right = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.left = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dx),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.up = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.add(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.down = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n pb.sub(this.uv, this.dy),\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n this.$l.edgeX = pb.sub(this.right.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(\r\n pb.abs(pb.sub(this.left.w, this.center.w)),\r\n pb.abs(pb.sub(this.right.w, this.center.w))\r\n ),\r\n function () {\r\n this.edgeX = pb.sub(this.center.xyz, this.left.xyz);\r\n }\r\n );\r\n this.$l.edgeY = pb.sub(this.up.xyz, this.center.xyz);\r\n this.$if(\r\n pb.lessThan(pb.abs(pb.sub(this.down.w, this.center.w)), pb.abs(pb.sub(this.up.w, this.center.w))),\r\n function () {\r\n this.edgeY = pb.sub(this.center.xyz, this.down.xyz);\r\n }\r\n );\r\n this.$l.n = pb.cross(this.edgeX, this.edgeY);\r\n this.$l.len = pb.length(this.n);\r\n // Degenerate footprint (flat depth, or a pixel with no geometry):\r\n // report a zero normal, which yields a zero offset downstream.\r\n this.$if(pb.lessThan(this.len, 1e-12), function () {\r\n this.$return(pb.vec3(0));\r\n });\r\n this.n = pb.div(this.n, this.len);\r\n // The cross product's sign depends on which neighbours were picked, so\r\n // orient it towards the camera rather than tracking that.\r\n this.$l.toEye = pb.sub(this.camera.position.xyz, this.center.xyz);\r\n this.$if(pb.lessThan(pb.dot(this.n, this.toEye), 0), function () {\r\n this.n = pb.neg(this.n);\r\n });\r\n this.$return(this.n);\r\n });\r\n // Explicit-depth cascade selection (fragCoord.z is invalid in a fullscreen\r\n // pass). Mirrors posteffect/sss.ts calculateTransmissionShadow.\r\n pb.func(\r\n 'zShadowMaskFactor',\r\n [pb.vec3('worldPos'), pb.float('depth01'), pb.float('NoL'), pb.vec3('worldNormal')],\r\n function () {\r\n if (numCascades > 1) {\r\n this.$l.linearDepth = pb.mul(this.depth01, this.camera.params.y);\r\n this.$l.splitDistances = this.light.cascadeDistances;\r\n this.$l.comparison = pb.vec4(pb.greaterThan(pb.vec4(this.linearDepth), this.splitDistances));\r\n this.$l.cascadeFlags = pb.vec4(\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 0)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 1)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 2)),\r\n pb.float(pb.greaterThan(this.light.shadowCascades, 3))\r\n );\r\n this.$l.split = pb.int(pb.dot(this.comparison, this.cascadeFlags));\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL,\r\n ShaderHelper.getShadowCascadeBiasScale(this, this.split)\r\n );\r\n if (device.type === 'webgl') {\r\n this.$l.shadowVertex = pb.vec4();\r\n this.$for(pb.int('cascade'), 0, 4, function () {\r\n this.$if(pb.equal(this.cascade, this.split), function () {\r\n this.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1),\r\n this.cascade\r\n );\r\n this.$break();\r\n });\r\n });\r\n } else {\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1),\r\n this.split\r\n );\r\n }\r\n this.$l.shadow = shadowMapParams.impl!.computeShadowCSM(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL,\r\n this.split\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n } else {\r\n this.$l.biasedPos = ShaderHelper.applyShadowNormalOffset(\r\n shadowMapParams.lightType,\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.NoL\r\n );\r\n this.$l.shadowVertex = ShaderHelper.calculateShadowSpaceVertex(\r\n this,\r\n pb.vec4(this.biasedPos, 1)\r\n );\r\n this.$l.shadow = shadowMapParams.impl!.computeShadow(\r\n shadowMapParams,\r\n this,\r\n this.shadowVertex,\r\n this.NoL\r\n );\r\n this.$l.shadowDistance = this.light.shadowCameraParams.w;\r\n this.shadow = pb.mix(\r\n this.shadow,\r\n 1,\r\n pb.smoothStep(\r\n pb.mul(this.shadowDistance, 0.8),\r\n this.shadowDistance,\r\n pb.distance(this.camera.position.xyz, this.worldPos)\r\n )\r\n );\r\n this.shadow = pb.mix(1, this.shadow, this.light.shadowStrength);\r\n this.$return(pb.clamp(this.shadow, 0, 1));\r\n }\r\n }\r\n );\r\n pb.main(function () {\r\n this.$l.pos = ShaderHelper.samplePositionFromDepth(\r\n this,\r\n this.depthTex,\r\n this.$inputs.uv,\r\n this.invViewProjMatrix,\r\n this.cameraNearFar\r\n );\r\n // The normal is recovered from the depth prepass rather than\r\n // interpolated, because this pass is where the opaque queue's shadows\r\n // are decided and normal offset bias needs one.\r\n this.$l.normal = this.zReconstructNormal(this.$inputs.uv, this.pos);\r\n this.$l.lightDir =\r\n lightType === LIGHT_TYPE_DIRECTIONAL\r\n ? pb.neg(this.light.directionAndCutoff.xyz)\r\n : pb.normalize(pb.sub(this.light.positionAndRange.xyz, this.pos.xyz));\r\n // A zero normal (degenerate reconstruction) gives NoL 0, hence the\r\n // largest offset. Clamp to 1 there instead so those pixels fall back to\r\n // the unoffset behaviour rather than being pushed the furthest.\r\n this.$l.NoL = pb.float(1);\r\n this.$if(pb.greaterThan(pb.dot(this.normal, this.normal), 0.5), function () {\r\n this.NoL = pb.clamp(pb.dot(this.normal, this.lightDir), 0, 1);\r\n });\r\n this.$l.factor = this.zShadowMaskFactor(this.pos.xyz, this.pos.w, this.NoL, this.normal);\r\n this.$outputs.color = pb.vec4(this.factor);\r\n });\r\n }\r\n })!;\r\n program.name = '@ShadowMask';\r\n return program;\r\n }\r\n\r\n /** Release cached GPU resources. */\r\n dispose(): void {\r\n for (const program of this._programs.values()) {\r\n program.dispose();\r\n }\r\n this._programs.clear();\r\n this._bindGroups.clear();\r\n this._channelStates = null;\r\n }\r\n}\r\n\r\n/** Shared type alias to keep the mask factor accessor discoverable. */\r\nexport type ShadowMaskFactorExp = PBShaderExp;\r\n"],"names":["UNIFORM_NAME_SHADOW_MAP","SHADOW_MASK_LIGHTS_PER_LAYER","MAX_SHADOW_MASK_LAYERS","MAX_SHADOW_MASK_LIGHTS","ShadowMaskRenderer","_nearFar","_invRenderSize","_cameraPosition","_cameraParams","_programs","Map","_bindGroups","_channelStates","Vector2","Vector4","getLayerCount","numLights","n","Math","min","ceil","render","ctx","depthTexture","lights","getLayerFramebuffer","device","length","shadowMapInfo","numLayers","channelStates","getChannelStates","savedShadowLight","currentShadowLight","pushDeviceStates","layer","framebuffer","setFramebuffer","clearFrameBuffer","channel","ordinal","light","shadowMapParams","get","shadowMap","maskOrdinal","renderLightChannel","popDeviceStates","renderState","key","getProgramKey","program","bindGroup","createProgram","createBindGroup","bindGroupLayouts","set","setUniforms","setProgram","setBindGroup","drawFullscreenQuad","type","shaderHash","c","rs","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","useColorState","setColorMask","push","camera","near","getNearPlane","far","getFarPlane","cameraPos","getWorldPosition","setXYZW","x","y","z","setXY","setValue","position","params","shadowDebugCascades","framestamp","frameInfo","frameCounter","implParams","impl","getParams","sunDir","sunLight","directionAndCutoff","xyz","scaleBy","shadowCascades","numShadowCascades","positionAndRange","diffuseAndIntensity","ShaderHelper","getPreExposedColorIntensity","extraParams","cascadeDistances","depthBiasValues","shadowCameraParams","cameraParams","depthBiasScales","shadowMatrices","Float32Array","shadowStrength","shadow","envLightStrength","getEnvLightLuminance","envLightSpecularStrength","env","specularStrength","invViewProjectionMatrix","width","height","needFlip","setTexture","fetchSampler","shadowMapSampler","_device","numCascades","lightType","buildRenderProgram","label","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","vec4","DEPTH_FARTHEST","add","mul","xy","$if","notEqual","neg","fragment","cameraStruct","defineStruct","float","lightStruct","vec3","shadowTex","isTextureCube","isDepth","texCubeShadow","texCube","isTexture2D","tex2DShadow","tex2D","tex2DArrayShadow","tex2DArray","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","sampleType","depthTex","invViewProjMatrix","mat4","cameraNearFar","invRenderSize","color","func","$l","dx","dy","right","samplePositionFromDepth","left","sub","up","down","edgeX","center","lessThan","abs","w","edgeY","cross","len","$return","div","toEye","dot","linearDepth","depth01","splitDistances","comparison","greaterThan","cascadeFlags","split","biasedPos","applyShadowNormalOffset","worldPos","worldNormal","NoL","getShadowCascadeBiasScale","shadowVertex","$for","equal","cascade","calculateShadowSpaceVertex","$break","computeShadowCSM","shadowDistance","mix","smoothStep","distance","clamp","computeShadow","normal","zReconstructNormal","lightDir","LIGHT_TYPE_DIRECTIONAL","normalize","factor","zShadowMaskFactor","name","dispose","values","clear"],"mappings":"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"}