@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"shadowmapper.js","sources":["../../src/shadow/shadowmapper.ts"],"sourcesContent":["import type { RequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport {\r\n retainObject,\r\n Matrix4x4,\r\n Vector3,\r\n Vector4,\r\n AABB,\r\n CubeFace,\r\n Frustum,\r\n Disposable\r\n} from '@zephyr3d/base';\r\nimport type {\r\n PBShaderExp,\r\n FrameBuffer,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureCube,\r\n TextureFormat,\r\n PBInsideFunctionScope,\r\n TextureSampler,\r\n TextureCreationOptions,\r\n TextureType,\r\n BaseTexture\r\n} from '@zephyr3d/device';\r\nimport { Camera } from '../camera/camera';\r\nimport { SSM } from './ssm';\r\nimport { ESM } from './esm';\r\nimport { VSM } from './vsm';\r\nimport type { PCFPD } from './pcf_pd';\r\nimport { PCFOPT } from './pcf_opt';\r\nimport { PCSS } from './pcss';\r\nimport type { PointLight, PunctualLight, RectLight, SpotLight } from '../scene/light';\r\nimport type { ShadowMapPass } from '../render/shadowmap_pass';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { ShadowImpl } from './shadow_impl';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\nimport { ShadowRegion } from './shadow_region';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpFrustum = new Frustum(Matrix4x4.identity());\r\n\r\n/**\r\n * Shadow mapping mode\r\n * @public\r\n */\r\nexport type ShadowMode =\r\n | 'hard'\r\n | 'vsm'\r\n | 'esm'\r\n | 'pcf'\r\n | 'pcss'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-pd'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-opt';\r\n/**\r\n * Preset shadow quality profiles.\r\n *\r\n * @public\r\n */\r\nexport type ShadowQualityPreset = 'character-small' | 'outdoor-large';\r\n\r\n/** @internal */\r\nexport type ShadowMapParams = {\r\n lightType: number;\r\n shaderHash: string;\r\n numShadowCascades: number;\r\n depthClampEnabled: boolean;\r\n cascadeDistances: Vector4;\r\n depthBiasValues: Vector4[];\r\n depthBiasScales: Vector4;\r\n cameraParams: Vector4;\r\n shadowMatrices: Float32Array;\r\n shadowMapFramebuffer: Nullable<FrameBuffer>;\r\n shadowMap: Nullable<BaseTexture>;\r\n shadowMapSampler: Nullable<TextureSampler>;\r\n impl: Nullable<ShadowImpl>;\r\n implData: unknown;\r\n /**\r\n * Zero-based ordinal of this light within the screen-space shadow mask\r\n * (`layer = ordinal >> 2`, `channel = ordinal & 3`). Set by\r\n * {@link ShadowMaskRenderer.render} each frame the mask is built; undefined\r\n * when the mask is not in use. Consumed by effects that sample the mask\r\n * instead of recomputing shadows (e.g. the SSS combine pass).\r\n */\r\n maskOrdinal?: number;\r\n};\r\n\r\n/** @internal */\r\nexport type ShadowMapType = Texture2D | TextureCube | Texture2DArray;\r\n\r\n/** @internal */\r\nexport interface ShadowConfig {\r\n shadowMapSize: number;\r\n numCascades?: number;\r\n splitLambda?: number;\r\n depthBias?: number;\r\n normalBias?: number;\r\n nearClip?: number;\r\n}\r\n\r\n/**\r\n * The shadow map generator\r\n * @public\r\n */\r\nexport class ShadowMapper extends Disposable {\r\n /** @internal */\r\n private static readonly _snapMatrix = new Matrix4x4();\r\n /** @internal */\r\n private static readonly _target = new Vector3();\r\n /** @internal */\r\n private static readonly _up = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMin = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMax = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumCenter = new Vector3();\r\n /** @internal */\r\n private static readonly _lightCameras: WeakMap<Scene, Camera[]> = new WeakMap();\r\n /** @internal */\r\n private static readonly _shadowMapParams: ShadowMapParams[] = [];\r\n /** @internal */\r\n protected _light: PunctualLight;\r\n /** @internal */\r\n protected _config: RequireOptionals<ShadowConfig>;\r\n /** @internal */\r\n protected _resourceDirty: boolean;\r\n /** @internal */\r\n protected _shadowMode: ShadowMode;\r\n /** @internal */\r\n protected _shadowDistance: number;\r\n /** @internal */\r\n protected _impl: Nullable<ShadowImpl>;\r\n /** @internal */\r\n protected _pdSampleCount: number;\r\n /** @internal */\r\n protected _pdSampleRadius: number;\r\n /** @internal */\r\n protected _pcfKernelSize: number;\r\n /** @internal */\r\n protected _pcssLightRadius: number;\r\n /** @internal */\r\n protected _pcssBlockerSampleCount: number;\r\n /** @internal */\r\n protected _pcssFilterSampleCount: number;\r\n /** @internal */\r\n protected _pcssMaxFilterRadius: number;\r\n /** @internal */\r\n protected _pcssTemporalJitter: boolean;\r\n /** @internal */\r\n protected _vsmBlurKernelSize: number;\r\n /** @internal */\r\n protected _vsmBlurRadius: number;\r\n /** @internal */\r\n protected _vsmDarkness: number;\r\n /** @internal */\r\n protected _esmBlur: boolean;\r\n /** @internal */\r\n protected _esmLogSpace: boolean;\r\n /** @internal */\r\n protected _esmBlurKernelSize: number;\r\n /** @internal */\r\n protected _esmBlurRadius: number;\r\n /** @internal */\r\n protected _esmDepthScale: number;\r\n /** @internal */\r\n protected _shadowStrength: number;\r\n /** @internal */\r\n protected _shadowRegion: ShadowRegion;\r\n /**\r\n * Creates an instance of ShadowMapper\r\n * @param light - The light that is used to generate shadow map\r\n */\r\n constructor(light: PunctualLight) {\r\n super();\r\n this._light = light;\r\n this._config = {\r\n shadowMapSize: 1024,\r\n numCascades: 1,\r\n splitLambda: 0.5,\r\n depthBias: 0.003,\r\n normalBias: 0.2,\r\n nearClip: 1\r\n };\r\n this._resourceDirty = true;\r\n this._shadowMode = 'pcf';\r\n this._shadowDistance = 2000;\r\n this._impl = null;\r\n this._pdSampleCount = 24;\r\n this._pdSampleRadius = 3;\r\n this._pcfKernelSize = 7;\r\n this._pcssLightRadius = 8;\r\n this._pcssBlockerSampleCount = 24;\r\n this._pcssFilterSampleCount = 32;\r\n this._pcssMaxFilterRadius = 32;\r\n this._pcssTemporalJitter = true;\r\n this._vsmBlurKernelSize = 5;\r\n this._vsmBlurRadius = 4;\r\n this._vsmDarkness = 0.3;\r\n this._esmBlur = true;\r\n this._esmLogSpace = true;\r\n this._esmBlurKernelSize = 5;\r\n this._esmBlurRadius = 4;\r\n this._esmDepthScale = 200;\r\n this._shadowStrength = 1;\r\n this._shadowRegion = new ShadowRegion();\r\n this.applyMode(this._shadowMode);\r\n }\r\n /** The light that is used to generate shadow map */\r\n get light() {\r\n return this._light;\r\n }\r\n /** Size of the shadow map */\r\n get shadowMapSize() {\r\n return this._config.shadowMapSize;\r\n }\r\n set shadowMapSize(num) {\r\n if (!Number.isInteger(num) || num < 1) {\r\n console.error(`invalid shadow map size: ${num}`);\r\n return;\r\n }\r\n if (this._config.shadowMapSize !== num) {\r\n this._config.shadowMapSize = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** Shadow region for directional light */\r\n get shadowRegion() {\r\n return this._shadowRegion;\r\n }\r\n /** @internal */\r\n updateDirectionalShadowRegion(force = false) {\r\n if (!this._light.isDirectionLight()) {\r\n return;\r\n }\r\n if (!force) {\r\n return;\r\n }\r\n const scene = this._light.scene;\r\n if (!scene) {\r\n return;\r\n }\r\n this._shadowRegion.clear();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n this._shadowRegion.addDynamicCaster(child);\r\n }\r\n });\r\n }\r\n /** @internal */\r\n computeDirectionalShadowRegion(scene: Scene) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n const bbox = child.getWorldBoundingVolume()?.toAABB();\r\n if (bbox) {\r\n aabb.extend(bbox.minPoint);\r\n aabb.extend(bbox.maxPoint);\r\n }\r\n }\r\n });\r\n return aabb.isValid() ? aabb : null;\r\n }\r\n /** Maximum distance from the camera, shadow will not be rendered beyond this range */\r\n get shadowDistance() {\r\n return this._shadowDistance;\r\n }\r\n set shadowDistance(val) {\r\n this._shadowDistance = Math.max(0, val);\r\n }\r\n /** Count of the cascades, The maximum value is 4 */\r\n get numShadowCascades() {\r\n return this._config.numCascades;\r\n }\r\n set numShadowCascades(num) {\r\n if (num !== 1 && num !== 2 && num !== 3 && num !== 4) {\r\n console.error(`invalid shadow cascade number: ${num}`);\r\n return;\r\n }\r\n if (!this._light.isDirectionLight() && num > 1) {\r\n console.error(`only directional light can have more than one shadow cascades`);\r\n return;\r\n }\r\n if (num !== this._config.numCascades) {\r\n this._config.numCascades = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** The split lambda for cascaded shadow mapping */\r\n get splitLambda() {\r\n return this._config.splitLambda;\r\n }\r\n set splitLambda(val) {\r\n if (this._config.splitLambda !== val) {\r\n this._config.splitLambda = val;\r\n }\r\n }\r\n /** Depth bias for the shadow map */\r\n get depthBias() {\r\n return this._config.depthBias;\r\n }\r\n set depthBias(val) {\r\n this._config.depthBias = val;\r\n }\r\n /** Normal bias for the shadow map */\r\n get normalBias() {\r\n return this._config.normalBias;\r\n }\r\n set normalBias(val) {\r\n this._config.normalBias = val;\r\n }\r\n /** Near clip plane */\r\n get nearClip() {\r\n return this._config.nearClip;\r\n }\r\n set nearClip(val) {\r\n if (this._config.nearClip !== val) {\r\n this._config.nearClip = val;\r\n }\r\n }\r\n /** Shadow strength, 0 means no shadowing and 1 means full shadowing */\r\n get shadowStrength() {\r\n return this._shadowStrength;\r\n }\r\n set shadowStrength(val) {\r\n this._shadowStrength = Math.min(1, Math.max(0, Number(val) || 0));\r\n }\r\n /** Shadow map mode */\r\n get mode() {\r\n return this._shadowMode;\r\n }\r\n set mode(mode) {\r\n if (mode !== this._shadowMode) {\r\n this._shadowMode = mode;\r\n this.applyMode(this._shadowMode);\r\n }\r\n }\r\n /**\r\n * Applies a practical shadow preset for common scenarios.\r\n *\r\n * `character-small`: higher contact quality and tighter distance for character-centric scenes.\r\n * `outdoor-large`: longer distance coverage for open scenes.\r\n */\r\n applyQualityPreset(preset: ShadowQualityPreset) {\r\n if (preset === 'character-small') {\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 120;\r\n this.splitLambda = 0.75;\r\n this.depthBias = 0.005;\r\n this.normalBias = 0.3;\r\n this.nearClip = 0.2;\r\n this.pcfKernelSize = 5;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 3 : 1;\r\n return;\r\n }\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 800;\r\n this.splitLambda = 0.6;\r\n this.depthBias = 0.0035;\r\n this.normalBias = 0.22;\r\n this.nearClip = 1;\r\n this.pcfKernelSize = 3;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 4 : 1;\r\n }\r\n /** @internal */\r\n getShaderHash(shadowMapParams: ShadowMapParams) {\r\n return `${shadowMapParams.impl!.constructor.name}_${shadowMapParams.impl!.getShaderHash()}_${\r\n shadowMapParams.lightType\r\n }_${shadowMapParams.shadowMap!.target}_${Number(shadowMapParams.numShadowCascades > 1)}_${Number(\r\n getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMapParams.shadowMap!.format)\r\n .filterable\r\n )}`;\r\n }\r\n /** Sample count for poisson disc PCF */\r\n get pdSampleCount() {\r\n return this._pdSampleCount;\r\n }\r\n set pdSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pdSampleCount) {\r\n this._pdSampleCount = val;\r\n const pcfpd = this.asPCFPD();\r\n if (pcfpd) {\r\n pcfpd.tapCount = this._pdSampleCount;\r\n }\r\n }\r\n }\r\n /** Radius for poisson disc PCF */\r\n get pdSampleRadius() {\r\n return this._pdSampleRadius;\r\n }\r\n set pdSampleRadius(val) {\r\n val = Math.max(0, Number(val) >> 0);\r\n if (val !== this._pdSampleRadius) {\r\n this._pdSampleRadius = val;\r\n this.asPCFPD()?.setDepthScale(this._pdSampleRadius);\r\n }\r\n }\r\n /** Kernel size for optimized PCF */\r\n get pcfKernelSize() {\r\n return this._pcfKernelSize;\r\n }\r\n set pcfKernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._pcfKernelSize) {\r\n this._pcfKernelSize = val;\r\n const pcfopt = this.asPCFOPT();\r\n if (pcfopt) {\r\n pcfopt.kernelSize = this._pcfKernelSize;\r\n }\r\n }\r\n }\r\n /** Light radius for PCSS shadow, measured in shadow-map texels */\r\n get pcssLightRadius() {\r\n return this._pcssLightRadius;\r\n }\r\n set pcssLightRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._pcssLightRadius) {\r\n this._pcssLightRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.lightRadius = this._pcssLightRadius;\r\n }\r\n }\r\n }\r\n /** Blocker search sample count for PCSS shadow */\r\n get pcssBlockerSampleCount() {\r\n return this._pcssBlockerSampleCount;\r\n }\r\n set pcssBlockerSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssBlockerSampleCount) {\r\n this._pcssBlockerSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.blockerSampleCount = this._pcssBlockerSampleCount;\r\n }\r\n }\r\n }\r\n /** Filter sample count for PCSS shadow */\r\n get pcssFilterSampleCount() {\r\n return this._pcssFilterSampleCount;\r\n }\r\n set pcssFilterSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssFilterSampleCount) {\r\n this._pcssFilterSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.filterSampleCount = this._pcssFilterSampleCount;\r\n }\r\n }\r\n }\r\n /** Maximum PCSS filter radius, measured in shadow-map texels */\r\n get pcssMaxFilterRadius() {\r\n return this._pcssMaxFilterRadius;\r\n }\r\n set pcssMaxFilterRadius(val) {\r\n val = Math.max(1, Number(val) || 1);\r\n if (val !== this._pcssMaxFilterRadius) {\r\n this._pcssMaxFilterRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.maxFilterRadius = this._pcssMaxFilterRadius;\r\n }\r\n }\r\n }\r\n /** If true, rotates PCSS sampling pattern over frames for TAA accumulation */\r\n get pcssTemporalJitter() {\r\n return this._pcssTemporalJitter;\r\n }\r\n set pcssTemporalJitter(val) {\r\n val = !!val;\r\n if (val !== this._pcssTemporalJitter) {\r\n this._pcssTemporalJitter = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.temporalJitter = this._pcssTemporalJitter;\r\n }\r\n }\r\n }\r\n /** Kernel size of VSM */\r\n get vsmBlurKernelSize() {\r\n return this._vsmBlurKernelSize;\r\n }\r\n set vsmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._vsmBlurKernelSize) {\r\n this._vsmBlurKernelSize = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.kernelSize = this._vsmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for VSM */\r\n get vsmBlurRadius() {\r\n return this._vsmBlurRadius;\r\n }\r\n set vsmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._vsmBlurRadius) {\r\n this._vsmBlurRadius = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.blurSize = this._vsmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Darkness for VSM */\r\n get vsmDarkness() {\r\n return this._vsmDarkness;\r\n }\r\n set vsmDarkness(val) {\r\n val = Math.min(0.999, Math.max(0, Number(val) || 0));\r\n if (val !== this._vsmDarkness) {\r\n this._vsmDarkness = val;\r\n this.asVSM()?.setDepthScale(this._vsmDarkness);\r\n }\r\n }\r\n /** Whether to enable ESM blur */\r\n get esmBlur() {\r\n return this._esmBlur;\r\n }\r\n set esmBlur(val) {\r\n if (!!val !== this.esmBlur) {\r\n this._esmBlur = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blur = this._esmBlur;\r\n }\r\n }\r\n }\r\n /** Whether to enable log space ESM blur */\r\n get esmLogSpace() {\r\n return this._esmLogSpace;\r\n }\r\n set esmLogSpace(val) {\r\n if (!!val !== this.esmLogSpace) {\r\n this._esmLogSpace = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.logSpace = this._esmLogSpace;\r\n }\r\n }\r\n }\r\n /** Kernel size for ESM */\r\n get esmBlurKernelSize() {\r\n return this._esmBlurKernelSize;\r\n }\r\n set esmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._esmBlurKernelSize) {\r\n this._esmBlurKernelSize = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.kernelSize = this._esmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for ESM */\r\n get esmBlurRadius() {\r\n return this._esmBlurRadius;\r\n }\r\n set esmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmBlurRadius) {\r\n this._esmBlurRadius = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blurSize = this._esmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Depth scale for ESM */\r\n get esmDepthScale() {\r\n return this._esmDepthScale;\r\n }\r\n set esmDepthScale(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmDepthScale) {\r\n this._esmDepthScale = val;\r\n this.asESM()?.setDepthScale(this._esmDepthScale);\r\n }\r\n }\r\n /** @internal */\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadow(shadowMapParams, scope, shadowVertex, NdotL);\r\n }\r\n /** @internal */\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadowCSM(shadowMapParams, scope, shadowVertex, NdotL, split);\r\n }\r\n /** @internal */\r\n static releaseTemporalResources(ctx: DrawContext) {\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n const shadowMapParams = ctx.shadowMapInfo.get(k)!;\r\n //ctx.device.pool.releaseFrameBuffer(shadowMapParams.shadowMapFramebuffer);\r\n shadowMapParams.lightType = LIGHT_TYPE_NONE;\r\n shadowMapParams.depthClampEnabled = false;\r\n shadowMapParams.shaderHash = '';\r\n shadowMapParams.numShadowCascades = 1;\r\n shadowMapParams.shadowMapFramebuffer = null;\r\n shadowMapParams.impl = null;\r\n shadowMapParams.shadowMap = null;\r\n shadowMapParams.shadowMapSampler = null;\r\n shadowMapParams.implData = null;\r\n this._shadowMapParams.push(shadowMapParams);\r\n }\r\n ctx.shadowMapInfo = null;\r\n }\r\n }\r\n /** @internal */\r\n static computeShadowBias(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n z: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n linear: boolean\r\n ) {\r\n const pb = scope.$builder;\r\n const depthBiasParam = ShaderHelper.getDepthBiasValues(scope);\r\n if (shadowMapParams.lightType === LIGHT_TYPE_DIRECTIONAL) {\r\n return pb.dot(pb.mul(depthBiasParam.xy, pb.vec2(1, pb.sub(1, NdotL))), pb.vec2(1, 1));\r\n } else {\r\n const nearFar = ShaderHelper.getShadowCameraParams(scope).xy;\r\n const linearDepth = linear ? z : ShaderHelper.nonLinearDepthToLinearNormalized(scope, z, nearFar);\r\n const biasScaleFactor = pb.mix(1, depthBiasParam.w, linearDepth);\r\n return pb.dot(pb.mul(depthBiasParam.xy, pb.vec2(1, pb.sub(1, NdotL)), biasScaleFactor), pb.vec2(1, 1));\r\n }\r\n }\r\n /** @internal */\r\n static computeShadowBiasCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const depthBiasParam = ShaderHelper.getDepthBiasValues(scope);\r\n const splitFlags = pb.vec4(\r\n pb.float(pb.equal(split, 0)),\r\n pb.float(pb.equal(split, 1)),\r\n pb.float(pb.equal(split, 2)),\r\n pb.float(pb.equal(split, 3))\r\n );\r\n const depthBiasScale = pb.dot(ShaderHelper.getDepthBiasScales(scope), splitFlags);\r\n return pb.dot(pb.mul(depthBiasParam.xy, pb.vec2(1, pb.sub(1, NdotL)), depthBiasScale), pb.vec2(1, 1));\r\n }\r\n /** @internal */\r\n protected isTextureInvalid(\r\n texture: Texture2D | TextureCube | Texture2DArray,\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number\r\n ) {\r\n return (\r\n texture &&\r\n (texture.target !== target ||\r\n texture.format !== format ||\r\n texture.width !== width ||\r\n texture.height !== height ||\r\n texture.depth !== this.numShadowCascades)\r\n );\r\n }\r\n /** @internal */\r\n protected createTexture(\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number\r\n ) {\r\n const device = getDevice();\r\n const options: TextureCreationOptions = {\r\n mipmapping: false\r\n };\r\n switch (target) {\r\n case '2d':\r\n return device.createTexture2D(format, width, height, options)!;\r\n case 'cube':\r\n return device.createCubeTexture(format, width, options)!;\r\n case '2darray':\r\n return device.createTexture2DArray(format, width, height, depth, options)!;\r\n default:\r\n throw new Error(`Invalid target ${target}`);\r\n }\r\n }\r\n /** @internal */\r\n static fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: TextureFormat,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : device.type !== 'webgl' && lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /** @internal */\r\n protected updateResources(shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n const colorFormat = shadowMapParams.impl!.getShadowMapColorFormat(shadowMapParams);\r\n const depthFormat = shadowMapParams.impl!.getShadowMapDepthFormat(shadowMapParams);\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const shadowMapWidth =\r\n numCascades > 1 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n const shadowMapHeight =\r\n numCascades > 2 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n /*\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [device.pool.fetchTemporalTexture2DArray(false, colorFormat, shadowMapWidth, shadowMapHeight, numCascades, false)]\r\n : this._light.isPointLight()\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, shadowMapWidth, false)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, shadowMapWidth, shadowMapHeight, false)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, shadowMapWidth, shadowMapHeight, numCascades, false)\r\n : device.type !== 'webgl' && this._light.isPointLight()\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, shadowMapWidth, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, shadowMapWidth, shadowMapHeight, false)\r\n : null;\r\n shadowMapParams.shadowMapFramebuffer = device.pool.createTemporalFramebuffer(false, colorAttachments, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n */\r\n shadowMapParams.shadowMapFramebuffer = ShadowMapper.fetchTemporalFramebuffer(\r\n true,\r\n this._light.lightType,\r\n numCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat!,\r\n depthFormat\r\n );\r\n shadowMapParams.impl = this._impl;\r\n this._impl!.updateResources(shadowMapParams);\r\n }\r\n /** @internal */\r\n protected createLightCameraPoint(lightCamera: Camera) {\r\n //lightCamera.reparent(this._light);\r\n lightCamera.parent = lightCamera.scene!.rootNode;\r\n lightCamera.position.setXYZ(0, 0, 0);\r\n lightCamera.rotation.identity();\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n lightCamera.setPerspective(\r\n Math.PI / 2,\r\n 1,\r\n this._config.nearClip!,\r\n Math.min(this._shadowDistance, (this._light as PointLight).positionAndRange.w)\r\n );\r\n lightCamera.position.set(this._light.positionAndRange.xyz());\r\n }\r\n /** @internal */\r\n protected createLightCameraSpot(lightCamera: Camera) {\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const spot = this._light as SpotLight;\r\n // The shadow frustum must match the lit cone. Physical mode defines it by the outer cone\r\n // half-angle; legacy stores the cosine of its own cutoff angle.\r\n const fov =\r\n spot.scene?.lightingMode === 'physical' ? 2 * spot.outerConeAngle : 2 * Math.acos(spot.cutoff);\r\n lightCamera.setPerspective(\r\n fov,\r\n 1,\r\n this._config.nearClip,\r\n Math.min(this._shadowDistance, spot.positionAndRange.w)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraRect(lightCamera: Camera) {\r\n const rect = this._light as RectLight;\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const halfW = rect.width * 0.5;\r\n const halfH = rect.height * 0.5;\r\n const far = Math.min(this._shadowDistance, rect.range);\r\n lightCamera.setOrtho(\r\n -halfW,\r\n halfW,\r\n -halfH,\r\n halfH,\r\n this._config.nearClip,\r\n Math.max(this._config.nearClip + 0.001, far)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraDirectional(\r\n sceneAABB: AABB,\r\n sceneCamera: Camera,\r\n lightCamera: Camera,\r\n cropMatrix?: Nullable<Matrix4x4>,\r\n border?: number\r\n ) {\r\n let frustum = sceneCamera.frustumViewSpace;\r\n if (this._shadowDistance < sceneCamera.getFarPlane()) {\r\n tmpMatrix.set(sceneCamera.getProjectionMatrix());\r\n tmpMatrix.setNearFar(tmpMatrix.getNearPlane(), this._shadowDistance);\r\n //tmpMatrix.multiplyRight(sceneCamera.viewMatrix);\r\n tmpFrustum.initWithMatrix(tmpMatrix);\r\n frustum = tmpFrustum;\r\n }\r\n const borderSize = Number.isFinite(border ?? 0) ? Math.max(0, border ?? 0) : 0;\r\n const clampedBorderSize = Math.min(borderSize, (this.shadowMapSize - 1) * 0.5);\r\n const paddingScale = this.shadowMapSize / (this.shadowMapSize - 2 * clampedBorderSize);\r\n //const frustum = sceneCamera.frustum;\r\n const frustumMin = ShadowMapper._frustumMin;\r\n const frustumMax = ShadowMapper._frustumMax;\r\n const frustumCenter = ShadowMapper._frustumCenter;\r\n const target = ShadowMapper._target;\r\n const up = ShadowMapper._up;\r\n // const frustum = new Frustum(sceneCamera.viewProjectionMatrix);\r\n frustumMin.setXYZ(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n frustumMax.setXYZ(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n frustum.corners.forEach((p) => {\r\n frustumMin.inplaceMin(p);\r\n frustumMax.inplaceMax(p);\r\n });\r\n let radius = Vector3.distance(frustumMin, frustumMax) * 0.5 * paddingScale;\r\n const center = sceneCamera.thisToWorld(\r\n Vector3.add(frustumMin, frustumMax, frustumCenter).scaleBy(0.5),\r\n frustumCenter\r\n );\r\n // Clamp to the scene bounds first, then apply the filter border.\r\n const sceneRadius = sceneAABB.diagonalLength * 0.5 * paddingScale;\r\n if (sceneRadius < radius) {\r\n radius = sceneRadius;\r\n Vector3.add(sceneAABB.minPoint, sceneAABB.maxPoint, center).scaleBy(0.5);\r\n }\r\n target.setXYZ(\r\n center.x + this._light.directionAndCutoff.x,\r\n center.y + this._light.directionAndCutoff.y,\r\n center.z + this._light.directionAndCutoff.z\r\n );\r\n up.setXYZ(0, 1, 0);\r\n lightCamera.lookAt(center, target, up);\r\n lightCamera.position.set(center);\r\n lightCamera.setOrtho(\r\n -radius,\r\n radius,\r\n -radius,\r\n radius,\r\n -radius,\r\n Math.max(Vector3.distance(center, sceneCamera.getWorldPosition()), sceneCamera.getFarPlane())\r\n );\r\n center.setXYZ(0, 0, 0);\r\n lightCamera.viewProjectionMatrix.transformPointP(center, center);\r\n if (cropMatrix) {\r\n const tx = center.x * this.shadowMapSize * 0.5;\r\n const ty = center.y * this.shadowMapSize * 0.5;\r\n const rx = Math.round(tx);\r\n const ry = Math.round(ty);\r\n center.setXYZ(((rx - tx) * 2) / this.shadowMapSize, ((ry - ty) * 2) / this.shadowMapSize, 0);\r\n cropMatrix.translation(center);\r\n }\r\n\r\n /*\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n const minz = frustumMin.z;\r\n const maxz = frustumMax.z;\r\n const texelSizeW = (maxx - minx) / this.shadowMapSize;\r\n const texelSizeH = (maxy - miny) / this.shadowMapSize;\r\n const cx = Math.floor((minx + maxx) / 2 / texelSizeW) * texelSizeW;\r\n const cy = Math.floor((miny + maxy) / 2 / texelSizeH) * texelSizeH;\r\n const cz = (minz + maxz) / 2;\r\n const hx = Math.floor(((maxx - minx) * (expand + 0.5)) / texelSizeW) * texelSizeW;\r\n const hy = Math.floor(((maxy - miny) * (expand + 0.5)) / texelSizeH) * texelSizeH;\r\n lightCamera.position.setXYZ(cx, cy, cz);\r\n lightCamera.setOrtho(\r\n -hx,\r\n hx,\r\n -hy,\r\n hy,\r\n sceneMax.z - maxz,\r\n sceneMax.z - minz + 1\r\n );\r\n if (cropMatrix) {\r\n // compute crop matrix\r\n let clipMaxX = 0,\r\n clipMaxY = 0;\r\n let clipMinX = Number.MAX_VALUE,\r\n clipMinY = Number.MAX_VALUE;\r\n frustum.corners.forEach((p) => {\r\n const clipPos = lightCamera.viewProjectionMatrix.transformPoint(p);\r\n clipPos.x = Math.min(1, Math.max(-1, clipPos.x / clipPos.w));\r\n clipPos.y = Math.min(1, Math.max(-1, clipPos.y / clipPos.w));\r\n if (clipPos.x > clipMaxX) {\r\n clipMaxX = clipPos.x;\r\n }\r\n if (clipPos.x < clipMinX) {\r\n clipMinX = clipPos.x;\r\n }\r\n if (clipPos.y > clipMaxY) {\r\n clipMaxY = clipPos.y;\r\n }\r\n if (clipPos.y < clipMinY) {\r\n clipMinY = clipPos.y;\r\n }\r\n });\r\n const clipW = clipMaxX - clipMinX;\r\n const clipH = clipMaxY - clipMinY;\r\n clipMinX -= expand * clipW;\r\n clipMinY -= expand * clipH;\r\n clipMaxX += expand * clipW;\r\n clipMaxY += expand * clipH;\r\n const scaleX = 2 / (clipMaxX - clipMinX);\r\n const scaleY = 2 / (clipMaxY - clipMinY);\r\n const offsetX = -0.5 * (clipMaxX + clipMinX) * scaleX;\r\n const offsetY = -0.5 * (clipMaxY + clipMinY) * scaleY;\r\n cropMatrix.identity();\r\n cropMatrix.m00 = scaleX;\r\n cropMatrix.m11 = scaleY;\r\n cropMatrix.m03 = offsetX;\r\n cropMatrix.m13 = offsetY;\r\n }\r\n */\r\n }\r\n /** {@inheritDoc Disposable.onDispose} */\r\n protected onDispose(): void {\r\n this._shadowRegion.dispose();\r\n }\r\n /** @internal */\r\n private static fetchShadowMapParams() {\r\n if (this._shadowMapParams.length > 0) {\r\n const params = this._shadowMapParams.pop()!;\r\n // Pooled objects retain last frame's ordinal; clear it so it is only set\r\n // again by ShadowMaskRenderer for lights actually written to the mask.\r\n params.maskOrdinal = undefined;\r\n return params;\r\n } else {\r\n return {\r\n lightType: LIGHT_TYPE_NONE,\r\n depthClampEnabled: false,\r\n shaderHash: '',\r\n cameraParams: new Vector4(),\r\n cascadeDistances: new Vector4(),\r\n depthBiasScales: new Vector4(),\r\n depthBiasValues: [new Vector4(), new Vector4(), new Vector4(), new Vector4()],\r\n numShadowCascades: 1,\r\n shadowMatrices: new Float32Array(16 * 4),\r\n shadowMap: null,\r\n shadowMapSampler: null,\r\n shadowMapFramebuffer: null,\r\n impl: null,\r\n implData: null\r\n };\r\n }\r\n }\r\n /** @internal */\r\n private static fetchCameraForScene(scene: Scene) {\r\n const cameras = this._lightCameras.get(scene);\r\n if (!cameras || cameras.length === 0) {\r\n const camera = new Camera(scene);\r\n retainObject(camera);\r\n return camera;\r\n } else {\r\n const camera = cameras.pop()!;\r\n camera.parent = scene.rootNode;\r\n camera.position.setXYZ(0, 0, 0);\r\n camera.rotation.identity();\r\n camera.scale.setXYZ(1, 1, 1);\r\n camera.clipMask = 0;\r\n return camera;\r\n }\r\n }\r\n /** @internal */\r\n private static releaseCamera(camera: Camera) {\r\n let cameras = this._lightCameras.get(camera.scene!);\r\n if (!cameras) {\r\n cameras = [];\r\n this._lightCameras.set(camera.scene!, cameras);\r\n }\r\n camera.remove();\r\n cameras.push(camera);\r\n }\r\n /** @internal */\r\n calcSplitDistances(nearPlane: number, farPlane: number, numCascades: number) {\r\n const result: number[] = [0, 0, 0, 0, 0];\r\n for (let i = 0; i <= numCascades; ++i) {\r\n const fIDM = i / numCascades;\r\n const fLog = nearPlane * Math.pow(farPlane / nearPlane, fIDM);\r\n const fUniform = nearPlane + (farPlane - nearPlane) * fIDM;\r\n result[i] = fLog * this._config.splitLambda + fUniform * (1 - this._config.splitLambda);\r\n }\r\n return result;\r\n }\r\n /** @internal */\r\n protected calcDepthBiasParams(\r\n camera: Camera,\r\n shadowMapSize: number,\r\n depthBias: number,\r\n normalBias: number,\r\n depthScale: number,\r\n result: Vector4\r\n ) {\r\n const sizeNear = Math.min(\r\n camera.getProjectionMatrix().getNearPlaneWidth(),\r\n camera.getProjectionMatrix().getNearPlaneHeight()\r\n );\r\n const sizeFar = Math.min(\r\n camera.getProjectionMatrix().getFarPlaneWidth(),\r\n camera.getProjectionMatrix().getFarPlaneHeight()\r\n );\r\n const scaleFactor = (sizeNear / shadowMapSize) * 2;\r\n result.setXYZW(depthBias * scaleFactor, normalBias * 0.0001, depthScale, sizeFar / sizeNear);\r\n }\r\n /** @internal */\r\n protected postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n this._impl!.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n render(ctx: DrawContext, renderPass: ShadowMapPass) {\r\n if (!ctx.shadowMapInfo) {\r\n ctx.shadowMapInfo = new Map();\r\n }\r\n const shadowMapParams = ShadowMapper.fetchShadowMapParams();\r\n shadowMapParams.impl = this._impl;\r\n shadowMapParams.lightType = this.light.lightType;\r\n shadowMapParams.numShadowCascades =\r\n shadowMapParams.lightType === LIGHT_TYPE_DIRECTIONAL ? (this._config.numCascades ?? 1) : 1;\r\n ctx.shadowMapInfo.set(this.light, shadowMapParams);\r\n const scene = ctx.scene;\r\n const camera = ctx.camera;\r\n renderPass.light = this._light;\r\n this.updateResources(shadowMapParams);\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n const device = getDevice();\r\n const fb = shadowMapParams.shadowMapFramebuffer!;\r\n shadowMapParams.depthClampEnabled = false;\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n const depthScale = this._impl!.getDepthScale();\r\n const directionalShadowRegion = this._shadowRegion.region;\r\n const shadowRegion =\r\n this._light.isDirectionLight() && directionalShadowRegion?.isValid()\r\n ? directionalShadowRegion\r\n : scene.boundingBox;\r\n if (this._light.isPointLight()) {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n this.createLightCameraPoint(shadowMapRenderCamera);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewMatrix));\r\n for (const face of [CubeFace.PX, CubeFace.NX, CubeFace.PY, CubeFace.NY, CubeFace.PZ, CubeFace.NZ]) {\r\n shadowMapRenderCamera.lookAtCubeFace(face);\r\n fb.setColorAttachmentCubeFace(0, face);\r\n fb.setDepthAttachmentCubeFace(face);\r\n renderPass.render(ctx, shadowMapRenderCamera);\r\n }\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.identity());\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n } else {\r\n if (this._config.numCascades > 1) {\r\n const distances = this.calcSplitDistances(\r\n camera.getNearPlane(),\r\n Math.min(this._shadowDistance, camera.getFarPlane()),\r\n this._config.numCascades\r\n );\r\n const cascadeCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapCullCamera = ShadowMapper.fetchCameraForScene(scene);\r\n shadowMapCullCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n cascadeCamera.parent = camera;\r\n shadowMapParams.depthClampEnabled = getDevice().getDeviceCaps().shaderCaps.supportFragmentDepth;\r\n for (let split = 0; split < this._config.numCascades; split++) {\r\n cascadeCamera.setPerspective(\r\n camera.getFOV(),\r\n camera.getAspect(),\r\n distances[split],\r\n distances[split + 1]\r\n );\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n const border = shadowMapParams.impl!.getShadowMapBorder(shadowMapParams); //20 / this._config.shadowMapSize;\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n cascadeCamera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n border\r\n );\r\n this.createLightCameraDirectional(shadowRegion, cascadeCamera, shadowMapCullCamera, null, border);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[split]\r\n );\r\n shadowMapParams.depthBiasScales[split] =\r\n shadowMapParams.depthBiasValues[0].x !== 0\r\n ? shadowMapParams.depthBiasValues[split].x / shadowMapParams.depthBiasValues[0].x\r\n : 1;\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n let scissor: Nullable<number[]> = null;\r\n if (\r\n fb.getColorAttachments()[0]?.isTexture2DArray() ||\r\n fb.getDepthAttachment()?.isTexture2DArray()\r\n ) {\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n fb.setColorAttachmentLayer(0, split);\r\n fb.setDepthAttachmentLayer(split);\r\n } else {\r\n const numRows = this._config.numCascades > 2 ? 2 : 1;\r\n const numCols = this._config.numCascades > 1 ? 2 : 1;\r\n const adjMatrix = new Matrix4x4();\r\n const col = split % 2;\r\n const row = split >> 1;\r\n adjMatrix.setRowXYZW(0, 1.5 - 0.5 * numCols, 0, 0, 0);\r\n adjMatrix.setRowXYZW(1, 0, 1.5 - 0.5 * numRows, 0, 0);\r\n adjMatrix.setRowXYZW(2, 0, 0, 1, 0);\r\n adjMatrix.setRowXYZW(3, col - 0.5 * numCols + 0.5, row - 0.5 * numRows + 0.5, 0, 1);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(\r\n adjMatrix,\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n )\r\n );\r\n if (device.type === 'webgpu') {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n (numRows - 1 - row) * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n } else {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n row * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n }\r\n }\r\n device.setFramebuffer(fb);\r\n device.setScissor(scissor);\r\n renderPass.render(ctx, shadowMapRenderCamera, shadowMapCullCamera);\r\n shadowMapParams.shadowMatrices.set(\r\n Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix),\r\n split * 16\r\n );\r\n shadowMapParams.cascadeDistances[split] = distances[split + 1];\r\n }\r\n ShadowMapper.releaseCamera(cascadeCamera);\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n ShadowMapper.releaseCamera(shadowMapCullCamera);\r\n } else {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene)!;\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n snapMatrix.identity();\r\n shadowMapRenderCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n if (this._light.isDirectionLight()) {\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n camera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n shadowMapParams.impl!.getShadowMapBorder(shadowMapParams)\r\n );\r\n } else if (this._light.isRectLight()) {\r\n this.createLightCameraRect(shadowMapRenderCamera);\r\n } else {\r\n this.createLightCameraSpot(shadowMapRenderCamera);\r\n }\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n renderPass.render(ctx, shadowMapRenderCamera);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix));\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n }\r\n }\r\n this.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n private applyMode(mode: ShadowMode) {\r\n if (\r\n mode !== 'hard' &&\r\n mode !== 'vsm' &&\r\n mode !== 'esm' &&\r\n mode !== 'pcf' &&\r\n mode !== 'pcf-pd' &&\r\n mode !== 'pcf-opt' &&\r\n mode !== 'pcss'\r\n ) {\r\n console.error(`ShadowMapper.setShadowMode() failed: invalid mode: ${mode}`);\r\n return;\r\n }\r\n this._impl = null;\r\n if (mode === 'hard') {\r\n this._impl = new SSM();\r\n } else if (mode === 'vsm') {\r\n this._impl = new VSM(this._vsmBlurKernelSize, this._vsmBlurRadius, this._vsmDarkness);\r\n } else if (mode === 'esm') {\r\n this._impl = new ESM(this._esmBlurKernelSize, this._esmBlurRadius, this._esmDepthScale);\r\n const esm = this._impl as ESM;\r\n esm.blur = this._esmBlur;\r\n esm.logSpace = this._esmLogSpace;\r\n } else if (mode === 'pcf' || mode === 'pcf-opt' || mode === 'pcf-pd') {\r\n this._impl = new PCFOPT(this._pcfKernelSize);\r\n } else if (mode === 'pcss') {\r\n this._impl = new PCSS(\r\n this._pcssLightRadius,\r\n this._pcssBlockerSampleCount,\r\n this._pcssFilterSampleCount,\r\n this._pcssMaxFilterRadius,\r\n this._pcssTemporalJitter\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private asVSM() {\r\n return this._impl?.getType() === 'vsm' ? (this._impl as VSM) : null;\r\n }\r\n /** @internal */\r\n private asESM() {\r\n return this._impl?.getType() === 'esm' ? (this._impl as ESM) : null;\r\n }\r\n /** @internal */\r\n private asPCFPD() {\r\n return this._impl?.getType() === 'pcf-pd' ? (this._impl as PCFPD) : null;\r\n }\r\n /** @internal */\r\n private asPCFOPT() {\r\n return this._impl?.getType() === 'pcf-opt' ? (this._impl as PCFOPT) : null;\r\n }\r\n /** @internal */\r\n private asPCSS() {\r\n return this._impl?.getType() === 'pcss' ? (this._impl as PCSS) : null;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","tmpFrustum","Frustum","identity","ShadowMapper","Disposable","_snapMatrix","_target","Vector3","_up","_frustumMin","_frustumMax","_frustumCenter","_lightCameras","WeakMap","_shadowMapParams","light","_light","_config","shadowMapSize","numCascades","splitLambda","depthBias","normalBias","nearClip","_resourceDirty","_shadowMode","_shadowDistance","_impl","_pdSampleCount","_pdSampleRadius","_pcfKernelSize","_pcssLightRadius","_pcssBlockerSampleCount","_pcssFilterSampleCount","_pcssMaxFilterRadius","_pcssTemporalJitter","_vsmBlurKernelSize","_vsmBlurRadius","_vsmDarkness","_esmBlur","_esmLogSpace","_esmBlurKernelSize","_esmBlurRadius","_esmDepthScale","_shadowStrength","_shadowRegion","ShadowRegion","applyMode","num","Number","isInteger","console","error","shadowRegion","updateDirectionalShadowRegion","force","isDirectionLight","scene","clear","rootNode","iterate","child","isMesh","isClipmapTerrain","castShadow","addDynamicCaster","computeDirectionalShadowRegion","aabb","AABB","beginExtend","bbox","getWorldBoundingVolume","toAABB","extend","minPoint","maxPoint","isValid","shadowDistance","val","Math","max","numShadowCascades","shadowStrength","min","mode","applyQualityPreset","preset","pcfKernelSize","getShaderHash","shadowMapParams","impl","name","lightType","shadowMap","target","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","pdSampleCount","pcfpd","asPCFPD","tapCount","pdSampleRadius","setDepthScale","pcfopt","asPCFOPT","kernelSize","pcssLightRadius","pcss","asPCSS","lightRadius","pcssBlockerSampleCount","blockerSampleCount","pcssFilterSampleCount","filterSampleCount","pcssMaxFilterRadius","maxFilterRadius","pcssTemporalJitter","temporalJitter","vsmBlurKernelSize","vsm","asVSM","vsmBlurRadius","blurSize","vsmDarkness","esmBlur","esm","asESM","blur","esmLogSpace","logSpace","esmBlurKernelSize","esmBlurRadius","esmDepthScale","computeShadow","scope","shadowVertex","NdotL","computeShadowCSM","split","releaseTemporalResources","ctx","shadowMapInfo","k","keys","get","LIGHT_TYPE_NONE","depthClampEnabled","shaderHash","shadowMapFramebuffer","shadowMapSampler","implData","push","computeShadowBias","z","linear","pb","$builder","depthBiasParam","ShaderHelper","getDepthBiasValues","LIGHT_TYPE_DIRECTIONAL","dot","mul","xy","vec2","sub","nearFar","getShadowCameraParams","linearDepth","nonLinearDepthToLinearNormalized","biasScaleFactor","mix","w","computeShadowBiasCSM","splitFlags","vec4","float","equal","depthBiasScale","getDepthBiasScales","isTextureInvalid","texture","width","height","depth","createTexture","device","options","mipmapping","createTexture2D","createCubeTexture","createTexture2DArray","Error","fetchTemporalFramebuffer","autoRelease","colorFormat","depthFormat","useTextureArray","type","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","updateResources","getShadowMapColorFormat","getShadowMapDepthFormat","shadowMapWidth","shadowMapHeight","createLightCameraPoint","lightCamera","parent","position","setXYZ","rotation","scale","setPerspective","PI","positionAndRange","set","xyz","createLightCameraSpot","worldMatrix","decompose","spot","fov","lightingMode","outerConeAngle","acos","cutoff","createLightCameraRect","rect","halfW","halfH","far","range","setOrtho","createLightCameraDirectional","sceneAABB","sceneCamera","cropMatrix","border","frustum","frustumViewSpace","getFarPlane","getProjectionMatrix","setNearFar","getNearPlane","initWithMatrix","borderSize","isFinite","clampedBorderSize","paddingScale","frustumMin","frustumMax","frustumCenter","up","MAX_VALUE","corners","forEach","p","inplaceMin","inplaceMax","radius","distance","center","thisToWorld","add","scaleBy","sceneRadius","diagonalLength","x","directionAndCutoff","y","lookAt","getWorldPosition","viewProjectionMatrix","transformPointP","tx","ty","rx","round","ry","translation","dispose","fetchShadowMapParams","length","params","pop","maskOrdinal","undefined","cameraParams","Vector4","cascadeDistances","depthBiasScales","depthBiasValues","shadowMatrices","Float32Array","fetchCameraForScene","cameras","camera","Camera","retainObject","clipMask","releaseCamera","remove","calcSplitDistances","nearPlane","farPlane","result","i","fIDM","fLog","pow","fUniform","calcDepthBiasParams","depthScale","sizeNear","getNearPlaneWidth","getNearPlaneHeight","sizeFar","getFarPlaneWidth","getFarPlaneHeight","scaleFactor","setXYZW","postRenderShadowMap","render","renderPass","Map","clearColor","getShadowMapClearColor","getDepthScale","directionalShadowRegion","region","boundingBox","isPointLight","shadowMapRenderCamera","setFramebuffer","transpose","viewMatrix","face","CubeFace","PX","NX","PY","NY","PZ","NZ","lookAtCubeFace","setColorAttachmentCubeFace","setDepthAttachmentCubeFace","distances","cascadeCamera","shadowMapCullCamera","ClipLeft","ClipRight","ClipBottom","ClipTop","shaderCaps","supportFragmentDepth","getFOV","getAspect","snapMatrix","getShadowMapBorder","scissor","getColorAttachments","isTexture2DArray","getDepthAttachment","setProjectionMatrix","multiply","setColorAttachmentLayer","setDepthAttachmentLayer","numRows","numCols","adjMatrix","col","row","setRowXYZW","setScissor","isRectLight","SSM","VSM","ESM","PCFOPT","PCSS","getType"],"mappings":"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"}
1
+ {"version":3,"file":"shadowmapper.js","sources":["../../src/shadow/shadowmapper.ts"],"sourcesContent":["import type { RequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport {\r\n retainObject,\r\n Matrix4x4,\r\n Vector3,\r\n Vector4,\r\n AABB,\r\n CubeFace,\r\n Frustum,\r\n Disposable\r\n} from '@zephyr3d/base';\r\nimport type {\r\n PBShaderExp,\r\n FrameBuffer,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureCube,\r\n TextureFormat,\r\n PBInsideFunctionScope,\r\n TextureSampler,\r\n TextureCreationOptions,\r\n TextureType,\r\n BaseTexture\r\n} from '@zephyr3d/device';\r\nimport { Camera } from '../camera/camera';\r\nimport { SSM } from './ssm';\r\nimport { ESM } from './esm';\r\nimport { VSM } from './vsm';\r\nimport type { PCFPD } from './pcf_pd';\r\nimport { PCFOPT } from './pcf_opt';\r\nimport { PCSS } from './pcss';\r\nimport { DOM } from './dom';\r\nimport type { PointLight, PunctualLight, RectLight, SpotLight } from '../scene/light';\r\nimport type { ShadowMapPass } from '../render/shadowmap_pass';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { ShadowImpl } from './shadow_impl';\r\nimport type { DrawContext } from '../render';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_NONE, LIGHT_TYPE_POINT } from '../values';\r\nimport { getDevice } from '../app/api';\r\nimport { ShadowRegion } from './shadow_region';\r\n\r\nconst tmpMatrix = new Matrix4x4();\r\nconst tmpFrustum = new Frustum(Matrix4x4.identity());\r\n\r\n/**\r\n * Shadow mapping mode\r\n * @public\r\n */\r\nexport type ShadowMode =\r\n | 'hard'\r\n | 'vsm'\r\n | 'esm'\r\n | 'pcf'\r\n | 'pcss'\r\n /**\r\n * Deep opacity map. Fractional occlusion through hair rather than a binary\r\n * blocked/unblocked test. WebGPU only.\r\n */\r\n | 'dom'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-pd'\r\n /** @deprecated Use `pcf` instead. */\r\n | 'pcf-opt';\r\n/**\r\n * Preset shadow quality profiles.\r\n *\r\n * @public\r\n */\r\nexport type ShadowQualityPreset = 'character-small' | 'outdoor-large';\r\n\r\n/** @internal */\r\nexport type ShadowMapParams = {\r\n lightType: number;\r\n shaderHash: string;\r\n numShadowCascades: number;\r\n depthClampEnabled: boolean;\r\n cascadeDistances: Vector4;\r\n depthBiasValues: Vector4[];\r\n depthBiasScales: Vector4;\r\n cameraParams: Vector4;\r\n shadowMatrices: Float32Array;\r\n shadowMapFramebuffer: Nullable<FrameBuffer>;\r\n shadowMap: Nullable<BaseTexture>;\r\n shadowMapSampler: Nullable<TextureSampler>;\r\n impl: Nullable<ShadowImpl>;\r\n implData: unknown;\r\n /**\r\n * Zero-based ordinal of this light within the screen-space shadow mask\r\n * (`layer = ordinal >> 2`, `channel = ordinal & 3`). Set by\r\n * {@link ShadowMaskRenderer.render} each frame the mask is built; undefined\r\n * when the mask is not in use. Consumed by effects that sample the mask\r\n * instead of recomputing shadows (e.g. the SSS combine pass).\r\n */\r\n maskOrdinal?: number;\r\n};\r\n\r\n/** @internal */\r\nexport type ShadowMapType = Texture2D | TextureCube | Texture2DArray;\r\n\r\n/** @internal */\r\nexport interface ShadowConfig {\r\n shadowMapSize: number;\r\n numCascades?: number;\r\n splitLambda?: number;\r\n depthBias?: number;\r\n normalBias?: number;\r\n nearClip?: number;\r\n}\r\n\r\n/**\r\n * The shadow map generator\r\n * @public\r\n */\r\nexport class ShadowMapper extends Disposable {\r\n /** @internal */\r\n private static readonly _snapMatrix = new Matrix4x4();\r\n /** @internal */\r\n private static readonly _target = new Vector3();\r\n /** @internal */\r\n private static readonly _up = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMin = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumMax = new Vector3();\r\n /** @internal */\r\n private static readonly _frustumCenter = new Vector3();\r\n /** @internal */\r\n private static readonly _lightCameras: WeakMap<Scene, Camera[]> = new WeakMap();\r\n /** @internal */\r\n private static readonly _shadowMapParams: ShadowMapParams[] = [];\r\n /** @internal */\r\n protected _light: PunctualLight;\r\n /** @internal */\r\n protected _config: RequireOptionals<ShadowConfig>;\r\n /** @internal */\r\n protected _resourceDirty: boolean;\r\n /** @internal */\r\n protected _shadowMode: ShadowMode;\r\n /** @internal */\r\n protected _shadowDistance: number;\r\n /** @internal */\r\n protected _impl: Nullable<ShadowImpl>;\r\n /** @internal */\r\n protected _pdSampleCount: number;\r\n /** @internal */\r\n protected _pdSampleRadius: number;\r\n /** @internal */\r\n protected _pcfKernelSize: number;\r\n /** @internal */\r\n protected _pcssLightRadius: number;\r\n /** @internal */\r\n protected _pcssBlockerSampleCount: number;\r\n /** @internal */\r\n protected _pcssFilterSampleCount: number;\r\n /** @internal */\r\n protected _pcssMaxFilterRadius: number;\r\n /** @internal */\r\n protected _pcssTemporalJitter: boolean;\r\n /** @internal */\r\n protected _domLayerDistance: number;\r\n /** @internal */\r\n protected _domDensity: number;\r\n /** @internal */\r\n protected _domFilterSize: number;\r\n /** @internal */\r\n protected _vsmBlurKernelSize: number;\r\n /** @internal */\r\n protected _vsmBlurRadius: number;\r\n /** @internal */\r\n protected _vsmDarkness: number;\r\n /** @internal */\r\n protected _esmBlur: boolean;\r\n /** @internal */\r\n protected _esmLogSpace: boolean;\r\n /** @internal */\r\n protected _esmBlurKernelSize: number;\r\n /** @internal */\r\n protected _esmBlurRadius: number;\r\n /** @internal */\r\n protected _esmDepthScale: number;\r\n /** @internal */\r\n protected _shadowStrength: number;\r\n /** @internal */\r\n protected _shadowRegion: ShadowRegion;\r\n /**\r\n * Creates an instance of ShadowMapper\r\n * @param light - The light that is used to generate shadow map\r\n */\r\n constructor(light: PunctualLight) {\r\n super();\r\n this._light = light;\r\n this._config = {\r\n shadowMapSize: 1024,\r\n numCascades: 1,\r\n splitLambda: 0.5,\r\n depthBias: 0.003,\r\n normalBias: 1.5,\r\n nearClip: 1\r\n };\r\n this._resourceDirty = true;\r\n this._shadowMode = 'pcf';\r\n this._shadowDistance = 2000;\r\n this._impl = null;\r\n this._pdSampleCount = 24;\r\n this._pdSampleRadius = 3;\r\n this._pcfKernelSize = 7;\r\n this._pcssLightRadius = 8;\r\n this._pcssBlockerSampleCount = 24;\r\n this._pcssFilterSampleCount = 32;\r\n this._pcssMaxFilterRadius = 32;\r\n this._pcssTemporalJitter = true;\r\n this._domLayerDistance = 0.25;\r\n this._domDensity = 1;\r\n this._domFilterSize = 5;\r\n this._vsmBlurKernelSize = 5;\r\n this._vsmBlurRadius = 4;\r\n this._vsmDarkness = 0.3;\r\n this._esmBlur = true;\r\n this._esmLogSpace = true;\r\n this._esmBlurKernelSize = 5;\r\n this._esmBlurRadius = 4;\r\n this._esmDepthScale = 200;\r\n this._shadowStrength = 1;\r\n this._shadowRegion = new ShadowRegion();\r\n this.applyMode(this._shadowMode);\r\n }\r\n /** The light that is used to generate shadow map */\r\n get light() {\r\n return this._light;\r\n }\r\n /** Size of the shadow map */\r\n get shadowMapSize() {\r\n return this._config.shadowMapSize;\r\n }\r\n set shadowMapSize(num) {\r\n if (!Number.isInteger(num) || num < 1) {\r\n console.error(`invalid shadow map size: ${num}`);\r\n return;\r\n }\r\n if (this._config.shadowMapSize !== num) {\r\n this._config.shadowMapSize = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** Shadow region for directional light */\r\n get shadowRegion() {\r\n return this._shadowRegion;\r\n }\r\n /** @internal */\r\n updateDirectionalShadowRegion(force = false) {\r\n if (!this._light.isDirectionLight()) {\r\n return;\r\n }\r\n if (!force) {\r\n return;\r\n }\r\n const scene = this._light.scene;\r\n if (!scene) {\r\n return;\r\n }\r\n this._shadowRegion.clear();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n this._shadowRegion.addDynamicCaster(child);\r\n }\r\n });\r\n }\r\n /** @internal */\r\n computeDirectionalShadowRegion(scene: Scene) {\r\n const aabb = new AABB();\r\n aabb.beginExtend();\r\n scene.rootNode.iterate((child) => {\r\n if ((child.isMesh() || child.isClipmapTerrain()) && child.castShadow) {\r\n const bbox = child.getWorldBoundingVolume()?.toAABB();\r\n if (bbox) {\r\n aabb.extend(bbox.minPoint);\r\n aabb.extend(bbox.maxPoint);\r\n }\r\n }\r\n });\r\n return aabb.isValid() ? aabb : null;\r\n }\r\n /** Maximum distance from the camera, shadow will not be rendered beyond this range */\r\n get shadowDistance() {\r\n return this._shadowDistance;\r\n }\r\n set shadowDistance(val) {\r\n this._shadowDistance = Math.max(0, val);\r\n }\r\n /** Count of the cascades, The maximum value is 4 */\r\n get numShadowCascades() {\r\n return this._config.numCascades;\r\n }\r\n set numShadowCascades(num) {\r\n if (num !== 1 && num !== 2 && num !== 3 && num !== 4) {\r\n console.error(`invalid shadow cascade number: ${num}`);\r\n return;\r\n }\r\n if (!this._light.isDirectionLight() && num > 1) {\r\n console.error(`only directional light can have more than one shadow cascades`);\r\n return;\r\n }\r\n if (num !== this._config.numCascades) {\r\n this._config.numCascades = num;\r\n this._resourceDirty = true;\r\n }\r\n }\r\n /** The split lambda for cascaded shadow mapping */\r\n get splitLambda() {\r\n return this._config.splitLambda;\r\n }\r\n set splitLambda(val) {\r\n if (this._config.splitLambda !== val) {\r\n this._config.splitLambda = val;\r\n }\r\n }\r\n /** Depth bias for the shadow map */\r\n get depthBias() {\r\n return this._config.depthBias;\r\n }\r\n set depthBias(val) {\r\n this._config.depthBias = val;\r\n }\r\n /**\r\n * Normal offset bias, in shadow map texels.\r\n *\r\n * @remarks\r\n * Before sampling, the receiver is moved along its normal by this many texel\r\n * widths, scaled by `sin(theta)` between the normal and the light so the\r\n * offset is zero facing the light and largest at grazing incidence. This is\r\n * what removes grazing-angle self-shadowing acne; {@link depthBias} alone\r\n * cannot, because the depth error over one texel grows without bound as the\r\n * surface turns away from the light.\r\n *\r\n * Useful values are roughly 1 to 4. Too little leaves acne on curved surfaces\r\n * near the terminator; too much detaches contact shadows from thin geometry.\r\n */\r\n get normalBias() {\r\n return this._config.normalBias;\r\n }\r\n set normalBias(val) {\r\n this._config.normalBias = val;\r\n }\r\n /** Near clip plane */\r\n get nearClip() {\r\n return this._config.nearClip;\r\n }\r\n set nearClip(val) {\r\n if (this._config.nearClip !== val) {\r\n this._config.nearClip = val;\r\n }\r\n }\r\n /** Shadow strength, 0 means no shadowing and 1 means full shadowing */\r\n get shadowStrength() {\r\n return this._shadowStrength;\r\n }\r\n set shadowStrength(val) {\r\n this._shadowStrength = Math.min(1, Math.max(0, Number(val) || 0));\r\n }\r\n /** Shadow map mode */\r\n get mode() {\r\n return this._shadowMode;\r\n }\r\n set mode(mode) {\r\n if (mode !== this._shadowMode) {\r\n this._shadowMode = mode;\r\n this.applyMode(this._shadowMode);\r\n }\r\n }\r\n /**\r\n * Applies a practical shadow preset for common scenarios.\r\n *\r\n * `character-small`: higher contact quality and tighter distance for character-centric scenes.\r\n * `outdoor-large`: longer distance coverage for open scenes.\r\n */\r\n applyQualityPreset(preset: ShadowQualityPreset) {\r\n if (preset === 'character-small') {\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 120;\r\n this.splitLambda = 0.75;\r\n this.depthBias = 0.005;\r\n this.normalBias = 2;\r\n this.nearClip = 0.2;\r\n this.pcfKernelSize = 5;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 3 : 1;\r\n return;\r\n }\r\n this.mode = 'pcf';\r\n this.shadowMapSize = 2048;\r\n this.shadowDistance = 800;\r\n this.splitLambda = 0.6;\r\n this.depthBias = 0.0035;\r\n this.normalBias = 1.5;\r\n this.nearClip = 1;\r\n this.pcfKernelSize = 3;\r\n this.numShadowCascades = this._light.isDirectionLight() ? 4 : 1;\r\n }\r\n /** @internal */\r\n getShaderHash(shadowMapParams: ShadowMapParams) {\r\n return `${shadowMapParams.impl!.constructor.name}_${shadowMapParams.impl!.getShaderHash()}_${\r\n shadowMapParams.lightType\r\n }_${shadowMapParams.shadowMap!.target}_${Number(shadowMapParams.numShadowCascades > 1)}_${Number(\r\n getDevice().getDeviceCaps().textureCaps.getTextureFormatInfo(shadowMapParams.shadowMap!.format)\r\n .filterable\r\n )}`;\r\n }\r\n /** Sample count for poisson disc PCF */\r\n get pdSampleCount() {\r\n return this._pdSampleCount;\r\n }\r\n set pdSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pdSampleCount) {\r\n this._pdSampleCount = val;\r\n const pcfpd = this.asPCFPD();\r\n if (pcfpd) {\r\n pcfpd.tapCount = this._pdSampleCount;\r\n }\r\n }\r\n }\r\n /** Radius for poisson disc PCF */\r\n get pdSampleRadius() {\r\n return this._pdSampleRadius;\r\n }\r\n set pdSampleRadius(val) {\r\n val = Math.max(0, Number(val) >> 0);\r\n if (val !== this._pdSampleRadius) {\r\n this._pdSampleRadius = val;\r\n this.asPCFPD()?.setDepthScale(this._pdSampleRadius);\r\n }\r\n }\r\n /** Kernel size for optimized PCF */\r\n get pcfKernelSize() {\r\n return this._pcfKernelSize;\r\n }\r\n set pcfKernelSize(val) {\r\n val = val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._pcfKernelSize) {\r\n this._pcfKernelSize = val;\r\n const pcfopt = this.asPCFOPT();\r\n if (pcfopt) {\r\n pcfopt.kernelSize = this._pcfKernelSize;\r\n }\r\n }\r\n }\r\n /** Light radius for PCSS shadow, measured in shadow-map texels */\r\n get pcssLightRadius() {\r\n return this._pcssLightRadius;\r\n }\r\n set pcssLightRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._pcssLightRadius) {\r\n this._pcssLightRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.lightRadius = this._pcssLightRadius;\r\n }\r\n }\r\n }\r\n /**\r\n * Depth spanned by the deep opacity map's layers, in world units along the\r\n * light direction. Only meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Set it to roughly the thickness of the hair. Too small and everything past\r\n * the outer strands saturates the last layer, which is a hard shadow again;\r\n * too large and all three layers fall inside the first strand, leaving the\r\n * interior unshadowed.\r\n */\r\n get domLayerDistance() {\r\n return this._domLayerDistance;\r\n }\r\n set domLayerDistance(val) {\r\n val = Math.max(0.0001, Number(val) || 0);\r\n if (val !== this._domLayerDistance) {\r\n this._domLayerDistance = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.layerDistance = this._domLayerDistance;\r\n }\r\n }\r\n }\r\n /**\r\n * How strongly accumulated hair coverage attenuates light. Only meaningful when\r\n * the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * Raise it to darken the interior of a groom without moving the layers.\r\n */\r\n get domDensity() {\r\n return this._domDensity;\r\n }\r\n set domDensity(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._domDensity) {\r\n this._domDensity = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.density = this._domDensity;\r\n }\r\n }\r\n }\r\n /**\r\n * Width of the deep opacity map's sampling kernel in texels: 1, 3, 5 or 7. Only\r\n * meaningful when the shadow mode is `dom`.\r\n *\r\n * @remarks\r\n * The technique's own gradation runs along the light rather than across the\r\n * map, so without a kernel the silhouette of a groom is as hard an edge as an\r\n * unfiltered shadow map gives. This is what softens it, at one layer lookup per\r\n * tap. Defaults to 5.\r\n */\r\n get domFilterSize() {\r\n return this._domFilterSize;\r\n }\r\n set domFilterSize(val) {\r\n val = val !== 1 && val !== 3 && val !== 5 && val !== 7 ? 5 : val;\r\n if (val !== this._domFilterSize) {\r\n this._domFilterSize = val;\r\n const dom = this.asDOM();\r\n if (dom) {\r\n dom.filterSize = this._domFilterSize;\r\n }\r\n }\r\n }\r\n /** Blocker search sample count for PCSS shadow */\r\n get pcssBlockerSampleCount() {\r\n return this._pcssBlockerSampleCount;\r\n }\r\n set pcssBlockerSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssBlockerSampleCount) {\r\n this._pcssBlockerSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.blockerSampleCount = this._pcssBlockerSampleCount;\r\n }\r\n }\r\n }\r\n /** Filter sample count for PCSS shadow */\r\n get pcssFilterSampleCount() {\r\n return this._pcssFilterSampleCount;\r\n }\r\n set pcssFilterSampleCount(val) {\r\n val = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n if (val !== this._pcssFilterSampleCount) {\r\n this._pcssFilterSampleCount = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.filterSampleCount = this._pcssFilterSampleCount;\r\n }\r\n }\r\n }\r\n /** Maximum PCSS filter radius, measured in shadow-map texels */\r\n get pcssMaxFilterRadius() {\r\n return this._pcssMaxFilterRadius;\r\n }\r\n set pcssMaxFilterRadius(val) {\r\n val = Math.max(1, Number(val) || 1);\r\n if (val !== this._pcssMaxFilterRadius) {\r\n this._pcssMaxFilterRadius = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.maxFilterRadius = this._pcssMaxFilterRadius;\r\n }\r\n }\r\n }\r\n /** If true, rotates PCSS sampling pattern over frames for TAA accumulation */\r\n get pcssTemporalJitter() {\r\n return this._pcssTemporalJitter;\r\n }\r\n set pcssTemporalJitter(val) {\r\n val = !!val;\r\n if (val !== this._pcssTemporalJitter) {\r\n this._pcssTemporalJitter = val;\r\n const pcss = this.asPCSS();\r\n if (pcss) {\r\n pcss.temporalJitter = this._pcssTemporalJitter;\r\n }\r\n }\r\n }\r\n /** Kernel size of VSM */\r\n get vsmBlurKernelSize() {\r\n return this._vsmBlurKernelSize;\r\n }\r\n set vsmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._vsmBlurKernelSize) {\r\n this._vsmBlurKernelSize = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.kernelSize = this._vsmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for VSM */\r\n get vsmBlurRadius() {\r\n return this._vsmBlurRadius;\r\n }\r\n set vsmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._vsmBlurRadius) {\r\n this._vsmBlurRadius = val;\r\n const vsm = this.asVSM();\r\n if (vsm) {\r\n vsm.blurSize = this._vsmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Darkness for VSM */\r\n get vsmDarkness() {\r\n return this._vsmDarkness;\r\n }\r\n set vsmDarkness(val) {\r\n val = Math.min(0.999, Math.max(0, Number(val) || 0));\r\n if (val !== this._vsmDarkness) {\r\n this._vsmDarkness = val;\r\n this.asVSM()?.setDepthScale(this._vsmDarkness);\r\n }\r\n }\r\n /** Whether to enable ESM blur */\r\n get esmBlur() {\r\n return this._esmBlur;\r\n }\r\n set esmBlur(val) {\r\n if (!!val !== this.esmBlur) {\r\n this._esmBlur = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blur = this._esmBlur;\r\n }\r\n }\r\n }\r\n /** Whether to enable log space ESM blur */\r\n get esmLogSpace() {\r\n return this._esmLogSpace;\r\n }\r\n set esmLogSpace(val) {\r\n if (!!val !== this.esmLogSpace) {\r\n this._esmLogSpace = !!val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.logSpace = this._esmLogSpace;\r\n }\r\n }\r\n }\r\n /** Kernel size for ESM */\r\n get esmBlurKernelSize() {\r\n return this._esmBlurKernelSize;\r\n }\r\n set esmBlurKernelSize(val) {\r\n val = Math.max(3, Number(val) >> 0) | 1;\r\n if (val !== this._esmBlurKernelSize) {\r\n this._esmBlurKernelSize = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.kernelSize = this._esmBlurKernelSize;\r\n }\r\n }\r\n }\r\n /** Blur radius for ESM */\r\n get esmBlurRadius() {\r\n return this._esmBlurRadius;\r\n }\r\n set esmBlurRadius(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmBlurRadius) {\r\n this._esmBlurRadius = val;\r\n const esm = this.asESM();\r\n if (esm) {\r\n esm.blurSize = this._esmBlurRadius;\r\n }\r\n }\r\n }\r\n /** Depth scale for ESM */\r\n get esmDepthScale() {\r\n return this._esmDepthScale;\r\n }\r\n set esmDepthScale(val) {\r\n val = Math.max(0, Number(val) || 0);\r\n if (val !== this._esmDepthScale) {\r\n this._esmDepthScale = val;\r\n this.asESM()?.setDepthScale(this._esmDepthScale);\r\n }\r\n }\r\n /** @internal */\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadow(shadowMapParams, scope, shadowVertex, NdotL);\r\n }\r\n /** @internal */\r\n computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ) {\r\n return this._impl!.computeShadowCSM(shadowMapParams, scope, shadowVertex, NdotL, split);\r\n }\r\n /** @internal */\r\n static releaseTemporalResources(ctx: DrawContext) {\r\n if (ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n const shadowMapParams = ctx.shadowMapInfo.get(k)!;\r\n //ctx.device.pool.releaseFrameBuffer(shadowMapParams.shadowMapFramebuffer);\r\n shadowMapParams.lightType = LIGHT_TYPE_NONE;\r\n shadowMapParams.depthClampEnabled = false;\r\n shadowMapParams.shaderHash = '';\r\n shadowMapParams.numShadowCascades = 1;\r\n shadowMapParams.shadowMapFramebuffer = null;\r\n shadowMapParams.impl = null;\r\n shadowMapParams.shadowMap = null;\r\n shadowMapParams.shadowMapSampler = null;\r\n shadowMapParams.implData = null;\r\n this._shadowMapParams.push(shadowMapParams);\r\n }\r\n ctx.shadowMapInfo = null;\r\n }\r\n }\r\n /** @internal */\r\n protected isTextureInvalid(\r\n texture: Texture2D | TextureCube | Texture2DArray,\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number\r\n ) {\r\n return (\r\n texture &&\r\n (texture.target !== target ||\r\n texture.format !== format ||\r\n texture.width !== width ||\r\n texture.height !== height ||\r\n texture.depth !== this.numShadowCascades)\r\n );\r\n }\r\n /** @internal */\r\n protected createTexture(\r\n target: TextureType,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n depth: number\r\n ) {\r\n const device = getDevice();\r\n const options: TextureCreationOptions = {\r\n mipmapping: false\r\n };\r\n switch (target) {\r\n case '2d':\r\n return device.createTexture2D(format, width, height, options)!;\r\n case 'cube':\r\n return device.createCubeTexture(format, width, options)!;\r\n case '2darray':\r\n return device.createTexture2DArray(format, width, height, depth, options)!;\r\n default:\r\n throw new Error(`Invalid target ${target}`);\r\n }\r\n }\r\n /** @internal */\r\n static fetchTemporalFramebuffer(\r\n autoRelease: boolean,\r\n lightType: number,\r\n numCascades: number,\r\n width: number,\r\n height: number,\r\n colorFormat: TextureFormat,\r\n depthFormat: TextureFormat,\r\n mipmapping?: boolean\r\n ) {\r\n const device = getDevice();\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [\r\n device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n colorFormat,\r\n width,\r\n height,\r\n numCascades,\r\n mipmapping\r\n )\r\n ]\r\n : lightType === LIGHT_TYPE_POINT\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, width, mipmapping)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, width, height, mipmapping)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, width, height, numCascades, false)\r\n : device.type !== 'webgl' && lightType === LIGHT_TYPE_POINT\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, width, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, width, height, false)\r\n : null;\r\n const fb = device.pool.createTemporalFramebuffer(autoRelease, colorAttachments!, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /** @internal */\r\n protected updateResources(shadowMapParams: ShadowMapParams) {\r\n const device = getDevice();\r\n const colorFormat = shadowMapParams.impl!.getShadowMapColorFormat(shadowMapParams);\r\n const depthFormat = shadowMapParams.impl!.getShadowMapDepthFormat(shadowMapParams);\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n const useTextureArray = numCascades > 1 && device.type !== 'webgl';\r\n const shadowMapWidth =\r\n numCascades > 1 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n const shadowMapHeight =\r\n numCascades > 2 && !useTextureArray ? 2 * this._config.shadowMapSize : this._config.shadowMapSize;\r\n /*\r\n const colorAttachments = colorFormat\r\n ? useTextureArray\r\n ? [device.pool.fetchTemporalTexture2DArray(false, colorFormat, shadowMapWidth, shadowMapHeight, numCascades, false)]\r\n : this._light.isPointLight()\r\n ? [device.pool.fetchTemporalTextureCube(false, colorFormat, shadowMapWidth, false)]\r\n : [device.pool.fetchTemporalTexture2D(false, colorFormat, shadowMapWidth, shadowMapHeight, false)]\r\n : null;\r\n const depthAttachment = depthFormat\r\n ? useTextureArray\r\n ? device.pool.fetchTemporalTexture2DArray(false, depthFormat, shadowMapWidth, shadowMapHeight, numCascades, false)\r\n : device.type !== 'webgl' && this._light.isPointLight()\r\n ? device.pool.fetchTemporalTextureCube(false, depthFormat, shadowMapWidth, false)\r\n : device.pool.fetchTemporalTexture2D(false, depthFormat, shadowMapWidth, shadowMapHeight, false)\r\n : null;\r\n shadowMapParams.shadowMapFramebuffer = device.pool.createTemporalFramebuffer(false, colorAttachments, depthAttachment);\r\n if (colorAttachments) {\r\n device.pool.releaseTexture(colorAttachments[0]);\r\n }\r\n if (depthAttachment) {\r\n device.pool.releaseTexture(depthAttachment);\r\n }\r\n */\r\n shadowMapParams.shadowMapFramebuffer = ShadowMapper.fetchTemporalFramebuffer(\r\n true,\r\n this._light.lightType,\r\n numCascades,\r\n shadowMapWidth,\r\n shadowMapHeight,\r\n colorFormat!,\r\n depthFormat\r\n );\r\n shadowMapParams.impl = this._impl;\r\n this._impl!.updateResources(shadowMapParams);\r\n }\r\n /** @internal */\r\n protected createLightCameraPoint(lightCamera: Camera) {\r\n //lightCamera.reparent(this._light);\r\n lightCamera.parent = lightCamera.scene!.rootNode;\r\n lightCamera.position.setXYZ(0, 0, 0);\r\n lightCamera.rotation.identity();\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n lightCamera.setPerspective(\r\n Math.PI / 2,\r\n 1,\r\n this._config.nearClip!,\r\n Math.min(this._shadowDistance, (this._light as PointLight).positionAndRange.w)\r\n );\r\n lightCamera.position.set(this._light.positionAndRange.xyz());\r\n }\r\n /** @internal */\r\n protected createLightCameraSpot(lightCamera: Camera) {\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const spot = this._light as SpotLight;\r\n // The shadow frustum must match the lit cone. Physical mode defines it by the outer cone\r\n // half-angle; legacy stores the cosine of its own cutoff angle.\r\n const fov =\r\n spot.scene?.lightingMode === 'physical' ? 2 * spot.outerConeAngle : 2 * Math.acos(spot.cutoff);\r\n lightCamera.setPerspective(\r\n fov,\r\n 1,\r\n this._config.nearClip,\r\n Math.min(this._shadowDistance, spot.positionAndRange.w)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraRect(lightCamera: Camera) {\r\n const rect = this._light as RectLight;\r\n this._light.worldMatrix.decompose(null, lightCamera.rotation, lightCamera.position);\r\n lightCamera.parent = this._light.scene?.rootNode ?? null;\r\n lightCamera.scale.setXYZ(1, 1, 1);\r\n const halfW = rect.width * 0.5;\r\n const halfH = rect.height * 0.5;\r\n const far = Math.min(this._shadowDistance, rect.range);\r\n lightCamera.setOrtho(\r\n -halfW,\r\n halfW,\r\n -halfH,\r\n halfH,\r\n this._config.nearClip,\r\n Math.max(this._config.nearClip + 0.001, far)\r\n );\r\n }\r\n /** @internal */\r\n protected createLightCameraDirectional(\r\n sceneAABB: AABB,\r\n sceneCamera: Camera,\r\n lightCamera: Camera,\r\n cropMatrix?: Nullable<Matrix4x4>,\r\n border?: number\r\n ) {\r\n let frustum = sceneCamera.frustumViewSpace;\r\n if (this._shadowDistance < sceneCamera.getFarPlane()) {\r\n tmpMatrix.set(sceneCamera.getProjectionMatrix());\r\n tmpMatrix.setNearFar(tmpMatrix.getNearPlane(), this._shadowDistance);\r\n //tmpMatrix.multiplyRight(sceneCamera.viewMatrix);\r\n tmpFrustum.initWithMatrix(tmpMatrix);\r\n frustum = tmpFrustum;\r\n }\r\n const borderSize = Number.isFinite(border ?? 0) ? Math.max(0, border ?? 0) : 0;\r\n const clampedBorderSize = Math.min(borderSize, (this.shadowMapSize - 1) * 0.5);\r\n const paddingScale = this.shadowMapSize / (this.shadowMapSize - 2 * clampedBorderSize);\r\n //const frustum = sceneCamera.frustum;\r\n const frustumMin = ShadowMapper._frustumMin;\r\n const frustumMax = ShadowMapper._frustumMax;\r\n const frustumCenter = ShadowMapper._frustumCenter;\r\n const target = ShadowMapper._target;\r\n const up = ShadowMapper._up;\r\n // const frustum = new Frustum(sceneCamera.viewProjectionMatrix);\r\n frustumMin.setXYZ(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);\r\n frustumMax.setXYZ(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);\r\n frustum.corners.forEach((p) => {\r\n frustumMin.inplaceMin(p);\r\n frustumMax.inplaceMax(p);\r\n });\r\n let radius = Vector3.distance(frustumMin, frustumMax) * 0.5 * paddingScale;\r\n const center = sceneCamera.thisToWorld(\r\n Vector3.add(frustumMin, frustumMax, frustumCenter).scaleBy(0.5),\r\n frustumCenter\r\n );\r\n // Clamp to the scene bounds first, then apply the filter border.\r\n const sceneRadius = sceneAABB.diagonalLength * 0.5 * paddingScale;\r\n if (sceneRadius < radius) {\r\n radius = sceneRadius;\r\n Vector3.add(sceneAABB.minPoint, sceneAABB.maxPoint, center).scaleBy(0.5);\r\n }\r\n target.setXYZ(\r\n center.x + this._light.directionAndCutoff.x,\r\n center.y + this._light.directionAndCutoff.y,\r\n center.z + this._light.directionAndCutoff.z\r\n );\r\n up.setXYZ(0, 1, 0);\r\n lightCamera.lookAt(center, target, up);\r\n lightCamera.position.set(center);\r\n lightCamera.setOrtho(\r\n -radius,\r\n radius,\r\n -radius,\r\n radius,\r\n -radius,\r\n Math.max(Vector3.distance(center, sceneCamera.getWorldPosition()), sceneCamera.getFarPlane())\r\n );\r\n center.setXYZ(0, 0, 0);\r\n lightCamera.viewProjectionMatrix.transformPointP(center, center);\r\n if (cropMatrix) {\r\n const tx = center.x * this.shadowMapSize * 0.5;\r\n const ty = center.y * this.shadowMapSize * 0.5;\r\n const rx = Math.round(tx);\r\n const ry = Math.round(ty);\r\n center.setXYZ(((rx - tx) * 2) / this.shadowMapSize, ((ry - ty) * 2) / this.shadowMapSize, 0);\r\n cropMatrix.translation(center);\r\n }\r\n\r\n /*\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n const minz = frustumMin.z;\r\n const maxz = frustumMax.z;\r\n const texelSizeW = (maxx - minx) / this.shadowMapSize;\r\n const texelSizeH = (maxy - miny) / this.shadowMapSize;\r\n const cx = Math.floor((minx + maxx) / 2 / texelSizeW) * texelSizeW;\r\n const cy = Math.floor((miny + maxy) / 2 / texelSizeH) * texelSizeH;\r\n const cz = (minz + maxz) / 2;\r\n const hx = Math.floor(((maxx - minx) * (expand + 0.5)) / texelSizeW) * texelSizeW;\r\n const hy = Math.floor(((maxy - miny) * (expand + 0.5)) / texelSizeH) * texelSizeH;\r\n lightCamera.position.setXYZ(cx, cy, cz);\r\n lightCamera.setOrtho(\r\n -hx,\r\n hx,\r\n -hy,\r\n hy,\r\n sceneMax.z - maxz,\r\n sceneMax.z - minz + 1\r\n );\r\n if (cropMatrix) {\r\n // compute crop matrix\r\n let clipMaxX = 0,\r\n clipMaxY = 0;\r\n let clipMinX = Number.MAX_VALUE,\r\n clipMinY = Number.MAX_VALUE;\r\n frustum.corners.forEach((p) => {\r\n const clipPos = lightCamera.viewProjectionMatrix.transformPoint(p);\r\n clipPos.x = Math.min(1, Math.max(-1, clipPos.x / clipPos.w));\r\n clipPos.y = Math.min(1, Math.max(-1, clipPos.y / clipPos.w));\r\n if (clipPos.x > clipMaxX) {\r\n clipMaxX = clipPos.x;\r\n }\r\n if (clipPos.x < clipMinX) {\r\n clipMinX = clipPos.x;\r\n }\r\n if (clipPos.y > clipMaxY) {\r\n clipMaxY = clipPos.y;\r\n }\r\n if (clipPos.y < clipMinY) {\r\n clipMinY = clipPos.y;\r\n }\r\n });\r\n const clipW = clipMaxX - clipMinX;\r\n const clipH = clipMaxY - clipMinY;\r\n clipMinX -= expand * clipW;\r\n clipMinY -= expand * clipH;\r\n clipMaxX += expand * clipW;\r\n clipMaxY += expand * clipH;\r\n const scaleX = 2 / (clipMaxX - clipMinX);\r\n const scaleY = 2 / (clipMaxY - clipMinY);\r\n const offsetX = -0.5 * (clipMaxX + clipMinX) * scaleX;\r\n const offsetY = -0.5 * (clipMaxY + clipMinY) * scaleY;\r\n cropMatrix.identity();\r\n cropMatrix.m00 = scaleX;\r\n cropMatrix.m11 = scaleY;\r\n cropMatrix.m03 = offsetX;\r\n cropMatrix.m13 = offsetY;\r\n }\r\n */\r\n }\r\n /** {@inheritDoc Disposable.onDispose} */\r\n protected onDispose(): void {\r\n this._shadowRegion.dispose();\r\n }\r\n /** @internal */\r\n private static fetchShadowMapParams() {\r\n if (this._shadowMapParams.length > 0) {\r\n const params = this._shadowMapParams.pop()!;\r\n // Pooled objects retain last frame's ordinal; clear it so it is only set\r\n // again by ShadowMaskRenderer for lights actually written to the mask.\r\n params.maskOrdinal = undefined;\r\n return params;\r\n } else {\r\n return {\r\n lightType: LIGHT_TYPE_NONE,\r\n depthClampEnabled: false,\r\n shaderHash: '',\r\n cameraParams: new Vector4(),\r\n cascadeDistances: new Vector4(),\r\n depthBiasScales: new Vector4(),\r\n depthBiasValues: [new Vector4(), new Vector4(), new Vector4(), new Vector4()],\r\n numShadowCascades: 1,\r\n shadowMatrices: new Float32Array(16 * 4),\r\n shadowMap: null,\r\n shadowMapSampler: null,\r\n shadowMapFramebuffer: null,\r\n impl: null,\r\n implData: null\r\n };\r\n }\r\n }\r\n /** @internal */\r\n private static fetchCameraForScene(scene: Scene) {\r\n const cameras = this._lightCameras.get(scene);\r\n if (!cameras || cameras.length === 0) {\r\n const camera = new Camera(scene);\r\n retainObject(camera);\r\n return camera;\r\n } else {\r\n const camera = cameras.pop()!;\r\n camera.parent = scene.rootNode;\r\n camera.position.setXYZ(0, 0, 0);\r\n camera.rotation.identity();\r\n camera.scale.setXYZ(1, 1, 1);\r\n camera.clipMask = 0;\r\n return camera;\r\n }\r\n }\r\n /** @internal */\r\n private static releaseCamera(camera: Camera) {\r\n let cameras = this._lightCameras.get(camera.scene!);\r\n if (!cameras) {\r\n cameras = [];\r\n this._lightCameras.set(camera.scene!, cameras);\r\n }\r\n camera.remove();\r\n cameras.push(camera);\r\n }\r\n /** @internal */\r\n calcSplitDistances(nearPlane: number, farPlane: number, numCascades: number) {\r\n const result: number[] = [0, 0, 0, 0, 0];\r\n for (let i = 0; i <= numCascades; ++i) {\r\n const fIDM = i / numCascades;\r\n const fLog = nearPlane * Math.pow(farPlane / nearPlane, fIDM);\r\n const fUniform = nearPlane + (farPlane - nearPlane) * fIDM;\r\n result[i] = fLog * this._config.splitLambda + fUniform * (1 - this._config.splitLambda);\r\n }\r\n return result;\r\n }\r\n /** @internal */\r\n protected calcDepthBiasParams(\r\n camera: Camera,\r\n shadowMapSize: number,\r\n depthBias: number,\r\n normalBias: number,\r\n depthScale: number,\r\n result: Vector4\r\n ) {\r\n const sizeNear = Math.min(\r\n camera.getProjectionMatrix().getNearPlaneWidth(),\r\n camera.getProjectionMatrix().getNearPlaneHeight()\r\n );\r\n const sizeFar = Math.min(\r\n camera.getProjectionMatrix().getFarPlaneWidth(),\r\n camera.getProjectionMatrix().getFarPlaneHeight()\r\n );\r\n // World-space size of one shadow map texel at the near plane. Both bias\r\n // terms are expressed in multiples of it, so a tighter cascade automatically\r\n // gets a proportionally smaller offset.\r\n const texelWorldSize = sizeNear / shadowMapSize;\r\n result.setXYZW(\r\n depthBias * texelWorldSize * 2,\r\n // Normal offset distance in world units. Unlike a depth bias this moves\r\n // the receiver sideways out of the texel that produces grazing-angle\r\n // acne, which no amount of depth bias can fix (the required depth offset\r\n // diverges as NdotL approaches zero).\r\n normalBias * texelWorldSize,\r\n depthScale,\r\n sizeFar / sizeNear\r\n );\r\n }\r\n /** @internal */\r\n protected postRenderShadowMap(shadowMapParams: ShadowMapParams) {\r\n this._impl!.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n render(ctx: DrawContext, renderPass: ShadowMapPass) {\r\n if (!ctx.shadowMapInfo) {\r\n ctx.shadowMapInfo = new Map();\r\n }\r\n const shadowMapParams = ShadowMapper.fetchShadowMapParams();\r\n shadowMapParams.impl = this._impl;\r\n shadowMapParams.lightType = this.light.lightType;\r\n shadowMapParams.numShadowCascades =\r\n shadowMapParams.lightType === LIGHT_TYPE_DIRECTIONAL && this._impl!.supportsCascades()\r\n ? (this._config.numCascades ?? 1)\r\n : 1;\r\n ctx.shadowMapInfo.set(this.light, shadowMapParams);\r\n const scene = ctx.scene;\r\n const camera = ctx.camera;\r\n renderPass.light = this._light;\r\n this.updateResources(shadowMapParams);\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n const device = getDevice();\r\n const fb = shadowMapParams.shadowMapFramebuffer!;\r\n shadowMapParams.depthClampEnabled = false;\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n const depthScale = this._impl!.getDepthScale();\r\n const geometryPassCount = Math.max(1, this._impl!.getGeometryPassCount(shadowMapParams) >> 0);\r\n // Repeats the caster draw for implementations that need more than one look at\r\n // the geometry (deep opacity maps). Single-pass implementations - every one\r\n // but DOM - take the `pass === 0` path once and behave exactly as before.\r\n const renderGeometry = (renderCamera: Camera, cullCamera?: Camera) => {\r\n if (geometryPassCount === 1) {\r\n renderPass.render(ctx, renderCamera, cullCamera);\r\n return;\r\n }\r\n // Culling depends only on the camera, so the extra passes reuse the first\r\n // pass's queue rather than walking the scene graph again per pass.\r\n const renderQueue = renderPass.cullScene(ctx, cullCamera ?? renderCamera);\r\n try {\r\n for (let pass = 0; pass < geometryPassCount; pass++) {\r\n this._impl!.beginGeometryPass(shadowMapParams, pass);\r\n // The emitted caster shader differs between passes, and the shadow pass\r\n // keys its programs on this hash, so it has to be refreshed per pass\r\n // rather than computed once up front.\r\n shadowMapParams.shaderHash = this.getShaderHash(shadowMapParams);\r\n renderPass.clearColor = this._impl!.getShadowMapClearColor(shadowMapParams);\r\n renderPass.render(ctx, renderCamera, cullCamera, renderQueue);\r\n }\r\n } finally {\r\n renderQueue.dispose();\r\n }\r\n };\r\n const directionalShadowRegion = this._shadowRegion.region;\r\n const shadowRegion =\r\n this._light.isDirectionLight() && directionalShadowRegion?.isValid()\r\n ? directionalShadowRegion\r\n : scene.boundingBox;\r\n if (this._light.isPointLight()) {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n this.createLightCameraPoint(shadowMapRenderCamera);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewMatrix));\r\n for (const face of [CubeFace.PX, CubeFace.NX, CubeFace.PY, CubeFace.NY, CubeFace.PZ, CubeFace.NZ]) {\r\n shadowMapRenderCamera.lookAtCubeFace(face);\r\n fb.setColorAttachmentCubeFace(0, face);\r\n fb.setDepthAttachmentCubeFace(face);\r\n renderGeometry(shadowMapRenderCamera);\r\n }\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.identity());\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n } else {\r\n // Reads the resolved count, not the configured one: an implementation that\r\n // cannot store cascades has already collapsed it to a single split, and the\r\n // cascade path would index array layers its shadow map does not have.\r\n const numCascades = shadowMapParams.numShadowCascades;\r\n if (numCascades > 1) {\r\n const distances = this.calcSplitDistances(\r\n camera.getNearPlane(),\r\n Math.min(this._shadowDistance, camera.getFarPlane()),\r\n numCascades\r\n );\r\n const cascadeCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene);\r\n const shadowMapCullCamera = ShadowMapper.fetchCameraForScene(scene);\r\n shadowMapCullCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n cascadeCamera.parent = camera;\r\n shadowMapParams.depthClampEnabled = getDevice().getDeviceCaps().shaderCaps.supportFragmentDepth;\r\n for (let split = 0; split < numCascades; split++) {\r\n cascadeCamera.setPerspective(\r\n camera.getFOV(),\r\n camera.getAspect(),\r\n distances[split],\r\n distances[split + 1]\r\n );\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n const border = shadowMapParams.impl!.getShadowMapBorder(shadowMapParams); //20 / this._config.shadowMapSize;\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n cascadeCamera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n border\r\n );\r\n this.createLightCameraDirectional(shadowRegion, cascadeCamera, shadowMapCullCamera, null, border);\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[split]\r\n );\r\n shadowMapParams.depthBiasScales[split] =\r\n shadowMapParams.depthBiasValues[0].x !== 0\r\n ? shadowMapParams.depthBiasValues[split].x / shadowMapParams.depthBiasValues[0].x\r\n : 1;\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n let scissor: Nullable<number[]> = null;\r\n if (\r\n fb.getColorAttachments()[0]?.isTexture2DArray() ||\r\n fb.getDepthAttachment()?.isTexture2DArray()\r\n ) {\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n fb.setColorAttachmentLayer(0, split);\r\n fb.setDepthAttachmentLayer(split);\r\n } else {\r\n const numRows = numCascades > 2 ? 2 : 1;\r\n const numCols = numCascades > 1 ? 2 : 1;\r\n const adjMatrix = new Matrix4x4();\r\n const col = split % 2;\r\n const row = split >> 1;\r\n adjMatrix.setRowXYZW(0, 1.5 - 0.5 * numCols, 0, 0, 0);\r\n adjMatrix.setRowXYZW(1, 0, 1.5 - 0.5 * numRows, 0, 0);\r\n adjMatrix.setRowXYZW(2, 0, 0, 1, 0);\r\n adjMatrix.setRowXYZW(3, col - 0.5 * numCols + 0.5, row - 0.5 * numRows + 0.5, 0, 1);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(\r\n adjMatrix,\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n )\r\n );\r\n if (device.type === 'webgpu') {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n (numRows - 1 - row) * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n } else {\r\n scissor = [\r\n col * this._config.shadowMapSize,\r\n row * this._config.shadowMapSize,\r\n this._config.shadowMapSize,\r\n this._config.shadowMapSize\r\n ];\r\n }\r\n }\r\n device.setFramebuffer(fb);\r\n device.setScissor(scissor);\r\n renderGeometry(shadowMapRenderCamera, shadowMapCullCamera);\r\n shadowMapParams.shadowMatrices.set(\r\n Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix),\r\n split * 16\r\n );\r\n shadowMapParams.cascadeDistances[split] = distances[split + 1];\r\n }\r\n ShadowMapper.releaseCamera(cascadeCamera);\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n ShadowMapper.releaseCamera(shadowMapCullCamera);\r\n } else {\r\n const shadowMapRenderCamera = ShadowMapper.fetchCameraForScene(scene)!;\r\n const snapMatrix = ShadowMapper._snapMatrix;\r\n snapMatrix.identity();\r\n shadowMapRenderCamera.clipMask = AABB.ClipLeft | AABB.ClipRight | AABB.ClipBottom | AABB.ClipTop;\r\n if (this._light.isDirectionLight()) {\r\n this.createLightCameraDirectional(\r\n shadowRegion,\r\n camera,\r\n shadowMapRenderCamera,\r\n snapMatrix,\r\n shadowMapParams.impl!.getShadowMapBorder(shadowMapParams)\r\n );\r\n } else if (this._light.isRectLight()) {\r\n this.createLightCameraRect(shadowMapRenderCamera);\r\n } else {\r\n this.createLightCameraSpot(shadowMapRenderCamera);\r\n }\r\n this.calcDepthBiasParams(\r\n shadowMapRenderCamera,\r\n this._config.shadowMapSize,\r\n this._config.depthBias,\r\n this._config.normalBias,\r\n depthScale,\r\n shadowMapParams.depthBiasValues[0]\r\n );\r\n shadowMapParams.cameraParams.setXYZW(\r\n shadowMapRenderCamera.getNearPlane(),\r\n shadowMapRenderCamera.getFarPlane(),\r\n this._config.shadowMapSize,\r\n this._shadowDistance\r\n );\r\n device.setFramebuffer(fb);\r\n shadowMapRenderCamera.setProjectionMatrix(\r\n Matrix4x4.multiply(snapMatrix, shadowMapRenderCamera.getProjectionMatrix())\r\n );\r\n renderGeometry(shadowMapRenderCamera);\r\n shadowMapParams.shadowMatrices.set(Matrix4x4.transpose(shadowMapRenderCamera.viewProjectionMatrix));\r\n ShadowMapper.releaseCamera(shadowMapRenderCamera);\r\n }\r\n }\r\n this.postRenderShadowMap(shadowMapParams);\r\n }\r\n /** @internal */\r\n private applyMode(mode: ShadowMode) {\r\n if (\r\n mode !== 'hard' &&\r\n mode !== 'vsm' &&\r\n mode !== 'esm' &&\r\n mode !== 'pcf' &&\r\n mode !== 'pcf-pd' &&\r\n mode !== 'pcf-opt' &&\r\n mode !== 'pcss' &&\r\n mode !== 'dom'\r\n ) {\r\n console.error(`ShadowMapper.setShadowMode() failed: invalid mode: ${mode}`);\r\n return;\r\n }\r\n if (mode === 'dom' && getDevice().type !== 'webgpu') {\r\n // The strand geometry this mode exists to shadow is WebGPU only, so the\r\n // WebGL paths were never built. Falling back keeps a scene authored with it\r\n // renderable rather than failing to produce a shadow map at all.\r\n console.warn(`ShadowMapper.setShadowMode(): 'dom' requires WebGPU, falling back to 'pcf'`);\r\n this.applyMode('pcf');\r\n return;\r\n }\r\n this._impl = null;\r\n if (mode === 'hard') {\r\n this._impl = new SSM();\r\n } else if (mode === 'vsm') {\r\n this._impl = new VSM(this._vsmBlurKernelSize, this._vsmBlurRadius, this._vsmDarkness);\r\n } else if (mode === 'esm') {\r\n this._impl = new ESM(this._esmBlurKernelSize, this._esmBlurRadius, this._esmDepthScale);\r\n const esm = this._impl as ESM;\r\n esm.blur = this._esmBlur;\r\n esm.logSpace = this._esmLogSpace;\r\n } else if (mode === 'pcf' || mode === 'pcf-opt' || mode === 'pcf-pd') {\r\n this._impl = new PCFOPT(this._pcfKernelSize);\r\n } else if (mode === 'dom') {\r\n this._impl = new DOM(this._domLayerDistance, this._domDensity, this._domFilterSize);\r\n } else if (mode === 'pcss') {\r\n this._impl = new PCSS(\r\n this._pcssLightRadius,\r\n this._pcssBlockerSampleCount,\r\n this._pcssFilterSampleCount,\r\n this._pcssMaxFilterRadius,\r\n this._pcssTemporalJitter\r\n );\r\n }\r\n }\r\n /** @internal */\r\n private asVSM() {\r\n return this._impl?.getType() === 'vsm' ? (this._impl as VSM) : null;\r\n }\r\n /** @internal */\r\n private asDOM() {\r\n return this._impl?.getType() === 'dom' ? (this._impl as DOM) : null;\r\n }\r\n /** @internal */\r\n private asESM() {\r\n return this._impl?.getType() === 'esm' ? (this._impl as ESM) : null;\r\n }\r\n /** @internal */\r\n private asPCFPD() {\r\n return this._impl?.getType() === 'pcf-pd' ? (this._impl as PCFPD) : null;\r\n }\r\n /** @internal */\r\n private asPCFOPT() {\r\n return this._impl?.getType() === 'pcf-opt' ? (this._impl as PCFOPT) : null;\r\n }\r\n /** @internal */\r\n private asPCSS() {\r\n return this._impl?.getType() === 'pcss' ? (this._impl as PCSS) : null;\r\n }\r\n}\r\n"],"names":["tmpMatrix","Matrix4x4","tmpFrustum","Frustum","identity","ShadowMapper","Disposable","_snapMatrix","_target","Vector3","_up","_frustumMin","_frustumMax","_frustumCenter","_lightCameras","WeakMap","_shadowMapParams","light","_light","_config","shadowMapSize","numCascades","splitLambda","depthBias","normalBias","nearClip","_resourceDirty","_shadowMode","_shadowDistance","_impl","_pdSampleCount","_pdSampleRadius","_pcfKernelSize","_pcssLightRadius","_pcssBlockerSampleCount","_pcssFilterSampleCount","_pcssMaxFilterRadius","_pcssTemporalJitter","_domLayerDistance","_domDensity","_domFilterSize","_vsmBlurKernelSize","_vsmBlurRadius","_vsmDarkness","_esmBlur","_esmLogSpace","_esmBlurKernelSize","_esmBlurRadius","_esmDepthScale","_shadowStrength","_shadowRegion","ShadowRegion","applyMode","num","Number","isInteger","console","error","shadowRegion","updateDirectionalShadowRegion","force","isDirectionLight","scene","clear","rootNode","iterate","child","isMesh","isClipmapTerrain","castShadow","addDynamicCaster","computeDirectionalShadowRegion","aabb","AABB","beginExtend","bbox","getWorldBoundingVolume","toAABB","extend","minPoint","maxPoint","isValid","shadowDistance","val","Math","max","numShadowCascades","shadowStrength","min","mode","applyQualityPreset","preset","pcfKernelSize","getShaderHash","shadowMapParams","impl","name","lightType","shadowMap","target","getDevice","getDeviceCaps","textureCaps","getTextureFormatInfo","format","filterable","pdSampleCount","pcfpd","asPCFPD","tapCount","pdSampleRadius","setDepthScale","pcfopt","asPCFOPT","kernelSize","pcssLightRadius","pcss","asPCSS","lightRadius","domLayerDistance","dom","asDOM","layerDistance","domDensity","density","domFilterSize","filterSize","pcssBlockerSampleCount","blockerSampleCount","pcssFilterSampleCount","filterSampleCount","pcssMaxFilterRadius","maxFilterRadius","pcssTemporalJitter","temporalJitter","vsmBlurKernelSize","vsm","asVSM","vsmBlurRadius","blurSize","vsmDarkness","esmBlur","esm","asESM","blur","esmLogSpace","logSpace","esmBlurKernelSize","esmBlurRadius","esmDepthScale","computeShadow","scope","shadowVertex","NdotL","computeShadowCSM","split","releaseTemporalResources","ctx","shadowMapInfo","k","keys","get","LIGHT_TYPE_NONE","depthClampEnabled","shaderHash","shadowMapFramebuffer","shadowMapSampler","implData","push","isTextureInvalid","texture","width","height","depth","createTexture","device","options","mipmapping","createTexture2D","createCubeTexture","createTexture2DArray","Error","fetchTemporalFramebuffer","autoRelease","colorFormat","depthFormat","useTextureArray","type","colorAttachments","pool","fetchTemporalTexture2DArray","LIGHT_TYPE_POINT","fetchTemporalTextureCube","fetchTemporalTexture2D","depthAttachment","fb","createTemporalFramebuffer","releaseTexture","updateResources","getShadowMapColorFormat","getShadowMapDepthFormat","shadowMapWidth","shadowMapHeight","createLightCameraPoint","lightCamera","parent","position","setXYZ","rotation","scale","setPerspective","PI","positionAndRange","w","set","xyz","createLightCameraSpot","worldMatrix","decompose","spot","fov","lightingMode","outerConeAngle","acos","cutoff","createLightCameraRect","rect","halfW","halfH","far","range","setOrtho","createLightCameraDirectional","sceneAABB","sceneCamera","cropMatrix","border","frustum","frustumViewSpace","getFarPlane","getProjectionMatrix","setNearFar","getNearPlane","initWithMatrix","borderSize","isFinite","clampedBorderSize","paddingScale","frustumMin","frustumMax","frustumCenter","up","MAX_VALUE","corners","forEach","p","inplaceMin","inplaceMax","radius","distance","center","thisToWorld","add","scaleBy","sceneRadius","diagonalLength","x","directionAndCutoff","y","z","lookAt","getWorldPosition","viewProjectionMatrix","transformPointP","tx","ty","rx","round","ry","translation","dispose","fetchShadowMapParams","length","params","pop","maskOrdinal","undefined","cameraParams","Vector4","cascadeDistances","depthBiasScales","depthBiasValues","shadowMatrices","Float32Array","fetchCameraForScene","cameras","camera","Camera","retainObject","clipMask","releaseCamera","remove","calcSplitDistances","nearPlane","farPlane","result","i","fIDM","fLog","pow","fUniform","calcDepthBiasParams","depthScale","sizeNear","getNearPlaneWidth","getNearPlaneHeight","sizeFar","getFarPlaneWidth","getFarPlaneHeight","texelWorldSize","setXYZW","postRenderShadowMap","render","renderPass","Map","LIGHT_TYPE_DIRECTIONAL","supportsCascades","clearColor","getShadowMapClearColor","getDepthScale","geometryPassCount","getGeometryPassCount","renderGeometry","renderCamera","cullCamera","renderQueue","cullScene","pass","beginGeometryPass","directionalShadowRegion","region","boundingBox","isPointLight","shadowMapRenderCamera","setFramebuffer","transpose","viewMatrix","face","CubeFace","PX","NX","PY","NY","PZ","NZ","lookAtCubeFace","setColorAttachmentCubeFace","setDepthAttachmentCubeFace","distances","cascadeCamera","shadowMapCullCamera","ClipLeft","ClipRight","ClipBottom","ClipTop","shaderCaps","supportFragmentDepth","getFOV","getAspect","snapMatrix","getShadowMapBorder","scissor","getColorAttachments","isTexture2DArray","getDepthAttachment","setProjectionMatrix","multiply","setColorAttachmentLayer","setDepthAttachmentLayer","numRows","numCols","adjMatrix","col","row","setRowXYZW","setScissor","isRectLight","warn","SSM","VSM","ESM","PCFOPT","DOM","PCSS","getType"],"mappings":"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"}
@@ -116,10 +116,11 @@ import { BoundingBox } from '../utility/bounding_volume.js';
116
116
  this.indexCount = indices.length;
117
117
  return true;
118
118
  }
119
- /** @internal */ static _transform(matrix, vertices, normals, offset) {
119
+ /** @internal */ static _transform(matrix, vertices, normals, offset, tangents) {
120
120
  if (matrix) {
121
121
  const tmpVec = new Vector3();
122
- for(let i = offset; i < vertices.length - 2; i += 3){
122
+ const tangentOffset = offset / 3 * 4;
123
+ for(let i = offset, tangentIndex = tangentOffset; i < vertices.length - 2; i += 3, tangentIndex += 4){
123
124
  tmpVec.setXYZ(vertices[i], vertices[i + 1], vertices[i + 2]);
124
125
  matrix.transformPointAffine(tmpVec, tmpVec);
125
126
  vertices[i] = tmpVec.x;
@@ -133,6 +134,14 @@ import { BoundingBox } from '../utility/bounding_volume.js';
133
134
  normals[i + 1] = tmpVec.y;
134
135
  normals[i + 2] = tmpVec.z;
135
136
  }
137
+ if (tangents) {
138
+ tmpVec.setXYZ(tangents[tangentIndex], tangents[tangentIndex + 1], tangents[tangentIndex + 2]);
139
+ matrix.transformVectorAffine(tmpVec, tmpVec);
140
+ tmpVec.inplaceNormalize();
141
+ tangents[tangentIndex] = tmpVec.x;
142
+ tangents[tangentIndex + 1] = tmpVec.y;
143
+ tangents[tangentIndex + 2] = tmpVec.z;
144
+ }
136
145
  }
137
146
  }
138
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"shape.js","sources":["../../src/shapes/shape.ts"],"sourcesContent":["import type { Clonable, DeepRequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, type Matrix4x4 } from '@zephyr3d/base';\r\nimport { Primitive } from '../render/primitive';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\n\r\n/**\r\n * Base class for creation options of any kind of shapes\r\n * @public\r\n */\r\nexport interface ShapeCreationOptions {\r\n /** true if we need to calculate normals for the shape */\r\n needNormal?: boolean;\r\n /** true if we need to calculate tangents for the shape */\r\n needTangent?: boolean;\r\n /** true if we need to calculate texture coordinates for the shape */\r\n needUV?: boolean;\r\n /** Transform matrix for the shape */\r\n transform?: Nullable<Matrix4x4>;\r\n}\r\n\r\n/**\r\n * Abstract base class for any kind of shapes\r\n * @public\r\n */\r\nexport abstract class Shape<T extends ShapeCreationOptions = ShapeCreationOptions>\r\n extends Primitive\r\n implements Clonable<Shape<T>>\r\n{\r\n static _defaultOptions = {\r\n needNormal: true,\r\n needTangent: true,\r\n needUV: true,\r\n transform: null\r\n };\r\n protected _options!: DeepRequireOptionals<T>;\r\n /**\r\n * Creates an instance of shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: T) {\r\n super();\r\n this._create(options);\r\n }\r\n protected static computeTangent(\r\n v0: number[],\r\n v1: number[],\r\n v2: number[],\r\n uv0: number[],\r\n uv1: number[],\r\n uv2: number[],\r\n normal: number[]\r\n ) {\r\n const dp1 = new Vector3(v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]);\r\n const dp2 = new Vector3(v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]);\r\n\r\n const du1 = uv1[0] - uv0[0],\r\n dv1 = uv1[1] - uv0[1];\r\n const du2 = uv2[0] - uv0[0],\r\n dv2 = uv2[1] - uv0[1];\r\n\r\n const denom = du1 * dv2 - dv1 * du2;\r\n\r\n if (Math.abs(denom) <= 1e-8) {\r\n return [1, 0, 0, 1];\r\n }\r\n\r\n const r = 1.0 / denom;\r\n let t0 = (dp1.x * dv2 - dp2.x * dv1) * r;\r\n let t1 = (dp1.y * dv2 - dp2.y * dv1) * r;\r\n let t2 = (dp1.z * dv2 - dp2.z * dv1) * r;\r\n const b0 = (dp2.x * du1 - dp1.x * du2) * r;\r\n const b1 = (dp2.y * du1 - dp1.y * du2) * r;\r\n const b2 = (dp2.z * du1 - dp1.z * du2) * r;\r\n\r\n // Gram-Schmidt\r\n const dotNT = normal[0] * t0 + normal[1] * t1 + normal[2] * t2;\r\n t0 -= normal[0] * dotNT;\r\n t1 -= normal[1] * dotNT;\r\n t2 -= normal[2] * dotNT;\r\n const lenT = Math.hypot(t0, t1, t2);\r\n if (lenT > 1e-8) {\r\n t0 /= lenT;\r\n t1 /= lenT;\r\n t2 /= lenT;\r\n } else {\r\n t0 = 1;\r\n t1 = 0;\r\n t2 = 0;\r\n }\r\n\r\n // w\r\n const c0 = normal[1] * t2 - normal[2] * t1;\r\n const c1 = normal[2] * t0 - normal[0] * t2;\r\n const c2 = normal[0] * t1 - normal[1] * t0;\r\n const w = c0 * b0 + c1 * b1 + c2 * b2 < 0 ? -1 : 1;\r\n\r\n return [t0, t1, t2, w];\r\n }\r\n\r\n abstract clone(): this;\r\n /** Get shape creation options */\r\n get options(): DeepRequireOptionals<T> {\r\n return this._options;\r\n }\r\n set options(options: T) {\r\n this._create(options);\r\n }\r\n /** Get shape type */\r\n abstract get type(): string;\r\n /**\r\n * Normalize options\r\n * @param options - creation options\r\n * @returns Normalized creation options\r\n */\r\n normalizeOptions(options?: T): DeepRequireOptionals<T> {\r\n const defaultOptions = (this.constructor as any)._defaultOptions as DeepRequireOptionals<T>;\r\n return Object.assign({}, defaultOptions, options ?? {});\r\n }\r\n /** @internal */\r\n protected _create(options?: T): boolean {\r\n this._options = this.normalizeOptions(options);\r\n const vertices: number[] = [];\r\n const indices: number[] = [];\r\n const normals: Nullable<number[]> = this._options.needNormal ? [] : null;\r\n const tangents: Nullable<number[]> = this._options.needTangent ? [] : null;\r\n const uvs: Nullable<number[]> = this._options.needUV ? [] : null;\r\n const bbox = new BoundingBox();\r\n bbox.beginExtend();\r\n this.primitiveType = (this.constructor as any).generateData(\r\n this._options,\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n bbox,\r\n null,\r\n null\r\n );\r\n for (const s of ['position', 'normal', 'tangent', 'texCoord0'] as const) {\r\n this.removeVertexBuffer(s);\r\n }\r\n this.setIndexBuffer(null);\r\n this.createAndSetVertexBuffer('position_f32x3', new Float32Array(vertices));\r\n if (normals) {\r\n this.createAndSetVertexBuffer('normal_f32x3', new Float32Array(normals));\r\n }\r\n if (tangents) {\r\n this.createAndSetVertexBuffer('tangent_f32x4', new Float32Array(tangents));\r\n }\r\n if (uvs) {\r\n this.createAndSetVertexBuffer('tex0_f32x2', new Float32Array(uvs));\r\n }\r\n this.createAndSetIndexBuffer(new Uint16Array(indices));\r\n this.setBoundingVolume(bbox);\r\n this.indexCount = indices.length;\r\n return true;\r\n }\r\n /** @internal */\r\n protected static _transform(\r\n matrix: Nullable<Matrix4x4> | undefined,\r\n vertices: number[],\r\n normals: number[],\r\n offset: number\r\n ) {\r\n if (matrix) {\r\n const tmpVec = new Vector3();\r\n for (let i = offset; i < vertices.length - 2; i += 3) {\r\n tmpVec.setXYZ(vertices[i], vertices[i + 1], vertices[i + 2]);\r\n matrix.transformPointAffine(tmpVec, tmpVec);\r\n vertices[i] = tmpVec.x;\r\n vertices[i + 1] = tmpVec.y;\r\n vertices[i + 2] = tmpVec.z;\r\n if (normals) {\r\n tmpVec.setXYZ(normals[i], normals[i + 1], normals[i + 2]);\r\n matrix.transformVectorAffine(tmpVec, tmpVec);\r\n tmpVec.inplaceNormalize();\r\n normals[i] = tmpVec.x;\r\n normals[i + 1] = tmpVec.y;\r\n normals[i + 2] = tmpVec.z;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["Shape","Primitive","_defaultOptions","needNormal","needTangent","needUV","transform","_options","options","_create","computeTangent","v0","v1","v2","uv0","uv1","uv2","normal","dp1","Vector3","dp2","du1","dv1","du2","dv2","denom","Math","abs","r","t0","x","t1","y","t2","z","b0","b1","b2","dotNT","lenT","hypot","c0","c1","c2","w","normalizeOptions","defaultOptions","Object","assign","vertices","indices","normals","tangents","uvs","bbox","BoundingBox","beginExtend","primitiveType","generateData","s","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","setBoundingVolume","indexCount","length","_transform","matrix","offset","tmpVec","i","setXYZ","transformPointAffine","transformVectorAffine","inplaceNormalize"],"mappings":"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"}
1
+ {"version":3,"file":"shape.js","sources":["../../src/shapes/shape.ts"],"sourcesContent":["import type { Clonable, DeepRequireOptionals, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, type Matrix4x4 } from '@zephyr3d/base';\r\nimport { Primitive } from '../render/primitive';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\n\r\n/**\r\n * Base class for creation options of any kind of shapes\r\n * @public\r\n */\r\nexport interface ShapeCreationOptions {\r\n /** true if we need to calculate normals for the shape */\r\n needNormal?: boolean;\r\n /** true if we need to calculate tangents for the shape */\r\n needTangent?: boolean;\r\n /** true if we need to calculate texture coordinates for the shape */\r\n needUV?: boolean;\r\n /** Transform matrix for the shape */\r\n transform?: Nullable<Matrix4x4>;\r\n}\r\n\r\n/**\r\n * Abstract base class for any kind of shapes\r\n * @public\r\n */\r\nexport abstract class Shape<T extends ShapeCreationOptions = ShapeCreationOptions>\r\n extends Primitive\r\n implements Clonable<Shape<T>>\r\n{\r\n static _defaultOptions = {\r\n needNormal: true,\r\n needTangent: true,\r\n needUV: true,\r\n transform: null\r\n };\r\n protected _options!: DeepRequireOptionals<T>;\r\n /**\r\n * Creates an instance of shape\r\n * @param options - The creation options\r\n */\r\n constructor(options?: T) {\r\n super();\r\n this._create(options);\r\n }\r\n protected static computeTangent(\r\n v0: number[],\r\n v1: number[],\r\n v2: number[],\r\n uv0: number[],\r\n uv1: number[],\r\n uv2: number[],\r\n normal: number[]\r\n ) {\r\n const dp1 = new Vector3(v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]);\r\n const dp2 = new Vector3(v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]);\r\n\r\n const du1 = uv1[0] - uv0[0],\r\n dv1 = uv1[1] - uv0[1];\r\n const du2 = uv2[0] - uv0[0],\r\n dv2 = uv2[1] - uv0[1];\r\n\r\n const denom = du1 * dv2 - dv1 * du2;\r\n\r\n if (Math.abs(denom) <= 1e-8) {\r\n return [1, 0, 0, 1];\r\n }\r\n\r\n const r = 1.0 / denom;\r\n let t0 = (dp1.x * dv2 - dp2.x * dv1) * r;\r\n let t1 = (dp1.y * dv2 - dp2.y * dv1) * r;\r\n let t2 = (dp1.z * dv2 - dp2.z * dv1) * r;\r\n const b0 = (dp2.x * du1 - dp1.x * du2) * r;\r\n const b1 = (dp2.y * du1 - dp1.y * du2) * r;\r\n const b2 = (dp2.z * du1 - dp1.z * du2) * r;\r\n\r\n // Gram-Schmidt\r\n const dotNT = normal[0] * t0 + normal[1] * t1 + normal[2] * t2;\r\n t0 -= normal[0] * dotNT;\r\n t1 -= normal[1] * dotNT;\r\n t2 -= normal[2] * dotNT;\r\n const lenT = Math.hypot(t0, t1, t2);\r\n if (lenT > 1e-8) {\r\n t0 /= lenT;\r\n t1 /= lenT;\r\n t2 /= lenT;\r\n } else {\r\n t0 = 1;\r\n t1 = 0;\r\n t2 = 0;\r\n }\r\n\r\n // w\r\n const c0 = normal[1] * t2 - normal[2] * t1;\r\n const c1 = normal[2] * t0 - normal[0] * t2;\r\n const c2 = normal[0] * t1 - normal[1] * t0;\r\n const w = c0 * b0 + c1 * b1 + c2 * b2 < 0 ? -1 : 1;\r\n\r\n return [t0, t1, t2, w];\r\n }\r\n\r\n abstract clone(): this;\r\n /** Get shape creation options */\r\n get options(): DeepRequireOptionals<T> {\r\n return this._options;\r\n }\r\n set options(options: T) {\r\n this._create(options);\r\n }\r\n /** Get shape type */\r\n abstract get type(): string;\r\n /**\r\n * Normalize options\r\n * @param options - creation options\r\n * @returns Normalized creation options\r\n */\r\n normalizeOptions(options?: T): DeepRequireOptionals<T> {\r\n const defaultOptions = (this.constructor as any)._defaultOptions as DeepRequireOptionals<T>;\r\n return Object.assign({}, defaultOptions, options ?? {});\r\n }\r\n /** @internal */\r\n protected _create(options?: T): boolean {\r\n this._options = this.normalizeOptions(options);\r\n const vertices: number[] = [];\r\n const indices: number[] = [];\r\n const normals: Nullable<number[]> = this._options.needNormal ? [] : null;\r\n const tangents: Nullable<number[]> = this._options.needTangent ? [] : null;\r\n const uvs: Nullable<number[]> = this._options.needUV ? [] : null;\r\n const bbox = new BoundingBox();\r\n bbox.beginExtend();\r\n this.primitiveType = (this.constructor as any).generateData(\r\n this._options,\r\n vertices,\r\n normals,\r\n tangents,\r\n uvs,\r\n indices,\r\n bbox,\r\n null,\r\n null\r\n );\r\n for (const s of ['position', 'normal', 'tangent', 'texCoord0'] as const) {\r\n this.removeVertexBuffer(s);\r\n }\r\n this.setIndexBuffer(null);\r\n this.createAndSetVertexBuffer('position_f32x3', new Float32Array(vertices));\r\n if (normals) {\r\n this.createAndSetVertexBuffer('normal_f32x3', new Float32Array(normals));\r\n }\r\n if (tangents) {\r\n this.createAndSetVertexBuffer('tangent_f32x4', new Float32Array(tangents));\r\n }\r\n if (uvs) {\r\n this.createAndSetVertexBuffer('tex0_f32x2', new Float32Array(uvs));\r\n }\r\n this.createAndSetIndexBuffer(new Uint16Array(indices));\r\n this.setBoundingVolume(bbox);\r\n this.indexCount = indices.length;\r\n return true;\r\n }\r\n /** @internal */\r\n protected static _transform(\r\n matrix: Nullable<Matrix4x4> | undefined,\r\n vertices: number[],\r\n normals: Nullable<number[]>,\r\n offset: number,\r\n tangents?: Nullable<number[]>\r\n ) {\r\n if (matrix) {\r\n const tmpVec = new Vector3();\r\n const tangentOffset = (offset / 3) * 4;\r\n for (let i = offset, tangentIndex = tangentOffset; i < vertices.length - 2; i += 3, tangentIndex += 4) {\r\n tmpVec.setXYZ(vertices[i], vertices[i + 1], vertices[i + 2]);\r\n matrix.transformPointAffine(tmpVec, tmpVec);\r\n vertices[i] = tmpVec.x;\r\n vertices[i + 1] = tmpVec.y;\r\n vertices[i + 2] = tmpVec.z;\r\n if (normals) {\r\n tmpVec.setXYZ(normals[i], normals[i + 1], normals[i + 2]);\r\n matrix.transformVectorAffine(tmpVec, tmpVec);\r\n tmpVec.inplaceNormalize();\r\n normals[i] = tmpVec.x;\r\n normals[i + 1] = tmpVec.y;\r\n normals[i + 2] = tmpVec.z;\r\n }\r\n if (tangents) {\r\n tmpVec.setXYZ(tangents[tangentIndex], tangents[tangentIndex + 1], tangents[tangentIndex + 2]);\r\n matrix.transformVectorAffine(tmpVec, tmpVec);\r\n tmpVec.inplaceNormalize();\r\n tangents[tangentIndex] = tmpVec.x;\r\n tangents[tangentIndex + 1] = tmpVec.y;\r\n tangents[tangentIndex + 2] = tmpVec.z;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["Shape","Primitive","_defaultOptions","needNormal","needTangent","needUV","transform","_options","options","_create","computeTangent","v0","v1","v2","uv0","uv1","uv2","normal","dp1","Vector3","dp2","du1","dv1","du2","dv2","denom","Math","abs","r","t0","x","t1","y","t2","z","b0","b1","b2","dotNT","lenT","hypot","c0","c1","c2","w","normalizeOptions","defaultOptions","Object","assign","vertices","indices","normals","tangents","uvs","bbox","BoundingBox","beginExtend","primitiveType","generateData","s","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","setBoundingVolume","indexCount","length","_transform","matrix","offset","tmpVec","tangentOffset","i","tangentIndex","setXYZ","transformPointAffine","transformVectorAffine","inplaceNormalize"],"mappings":"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"}