@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
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Burley (Christensen-Burley) normalized diffusion weight for one channel.
3
+ *
4
+ * @remarks
5
+ * The profile is
6
+ *
7
+ * ```
8
+ * R(r) = (exp(-r/d) + exp(-r/(3d))) / (8 * pi * d * r)
9
+ * ```
10
+ *
11
+ * where `d` is the shaping distance. The `1/r` factor is the 2D-to-1D Jacobian
12
+ * of the radially symmetric profile; a separable screen-space blur integrates
13
+ * along a line rather than over a disc, so it is dropped here and the weights
14
+ * are renormalized by their own sum instead. That is the standard separable
15
+ * approximation - it is not exactly the 2D profile, but the error is far below
16
+ * what the depth-aware tap rejection introduces anyway.
17
+ *
18
+ * Two exponentials rather than one Gaussian is what gives skin its
19
+ * characteristic shape: a sharp peak that keeps detail near the source, plus a
20
+ * long tail that carries the bleed. A single Gaussian can match one or the
21
+ * other, not both, which is why Gaussian SSS reads as haze.
22
+ *
23
+ * {@link SSS} in `posteffect/sss.ts` carries a more elaborate variant driven by
24
+ * per-pixel profile slots and a LUT. This one is deliberately separate and much
25
+ * smaller: {@link SkinSSS} has a single global profile in uniforms, so it needs
26
+ * no LUT plumbing. Unifying the two is worthwhile but would mean editing a
27
+ * 2500-line shader that has no pixel-regression coverage.
28
+ *
29
+ * @param scope - Shader scope.
30
+ * @param distance - Absolute distance from the kernel center, in the same units as `d`.
31
+ * @param d - Shaping distance for this channel. Larger values scatter further.
32
+ * @returns Unnormalized weight; callers must divide by the accumulated sum.
33
+ *
34
+ * @internal
35
+ */ function burleyDiffusionWeight(scope, distance, d) {
36
+ const pb = scope.$builder;
37
+ const funcName = 'lib_burleyDiffusionWeight';
38
+ pb.func(funcName, [
39
+ pb.float('distance'),
40
+ pb.float('d')
41
+ ], function() {
42
+ this.$l.safeD = pb.max(this.d, 1e-4);
43
+ this.$l.r = pb.div(pb.abs(this.distance), this.safeD);
44
+ // exp() of a large negative is flushed to zero anyway; clamping keeps the
45
+ // argument in range on backends that are less forgiving about it.
46
+ this.$l.e1 = pb.exp(pb.neg(pb.min(this.r, 40)));
47
+ this.$l.e2 = pb.exp(pb.neg(pb.min(pb.div(this.r, 3), 40)));
48
+ this.$return(pb.div(pb.add(this.e1, this.e2), this.safeD));
49
+ });
50
+ return pb.getGlobalScope()[funcName](distance, d);
51
+ }
52
+
53
+ export { burleyDiffusionWeight };
54
+ //# sourceMappingURL=diffusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffusion.js","sources":["../../src/shaders/diffusion.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\n\r\n/**\r\n * Burley (Christensen-Burley) normalized diffusion weight for one channel.\r\n *\r\n * @remarks\r\n * The profile is\r\n *\r\n * ```\r\n * R(r) = (exp(-r/d) + exp(-r/(3d))) / (8 * pi * d * r)\r\n * ```\r\n *\r\n * where `d` is the shaping distance. The `1/r` factor is the 2D-to-1D Jacobian\r\n * of the radially symmetric profile; a separable screen-space blur integrates\r\n * along a line rather than over a disc, so it is dropped here and the weights\r\n * are renormalized by their own sum instead. That is the standard separable\r\n * approximation - it is not exactly the 2D profile, but the error is far below\r\n * what the depth-aware tap rejection introduces anyway.\r\n *\r\n * Two exponentials rather than one Gaussian is what gives skin its\r\n * characteristic shape: a sharp peak that keeps detail near the source, plus a\r\n * long tail that carries the bleed. A single Gaussian can match one or the\r\n * other, not both, which is why Gaussian SSS reads as haze.\r\n *\r\n * {@link SSS} in `posteffect/sss.ts` carries a more elaborate variant driven by\r\n * per-pixel profile slots and a LUT. This one is deliberately separate and much\r\n * smaller: {@link SkinSSS} has a single global profile in uniforms, so it needs\r\n * no LUT plumbing. Unifying the two is worthwhile but would mean editing a\r\n * 2500-line shader that has no pixel-regression coverage.\r\n *\r\n * @param scope - Shader scope.\r\n * @param distance - Absolute distance from the kernel center, in the same units as `d`.\r\n * @param d - Shaping distance for this channel. Larger values scatter further.\r\n * @returns Unnormalized weight; callers must divide by the accumulated sum.\r\n *\r\n * @internal\r\n */\r\nexport function burleyDiffusionWeight(\r\n scope: PBInsideFunctionScope,\r\n distance: PBShaderExp,\r\n d: PBShaderExp\r\n): PBShaderExp {\r\n const pb = scope.$builder;\r\n const funcName = 'lib_burleyDiffusionWeight';\r\n pb.func(funcName, [pb.float('distance'), pb.float('d')], function () {\r\n this.$l.safeD = pb.max(this.d, 1e-4);\r\n this.$l.r = pb.div(pb.abs(this.distance), this.safeD);\r\n // exp() of a large negative is flushed to zero anyway; clamping keeps the\r\n // argument in range on backends that are less forgiving about it.\r\n this.$l.e1 = pb.exp(pb.neg(pb.min(this.r, 40)));\r\n this.$l.e2 = pb.exp(pb.neg(pb.min(pb.div(this.r, 3), 40)));\r\n this.$return(pb.div(pb.add(this.e1, this.e2), this.safeD));\r\n });\r\n return pb.getGlobalScope()[funcName](distance, d) as PBShaderExp;\r\n}\r\n"],"names":["burleyDiffusionWeight","scope","distance","d","pb","$builder","funcName","func","float","$l","safeD","max","r","div","abs","e1","exp","neg","min","e2","$return","add","getGlobalScope"],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCC,IACM,SAASA,qBAAAA,CACdC,KAA4B,EAC5BC,QAAqB,EACrBC,CAAc,EAAA;IAEd,MAAMC,EAAAA,GAAKH,MAAMI,QAAQ;AACzB,IAAA,MAAMC,QAAW,GAAA,2BAAA;IACjBF,EAAGG,CAAAA,IAAI,CAACD,QAAU,EAAA;AAACF,QAAAA,EAAAA,CAAGI,KAAK,CAAC,UAAA,CAAA;AAAaJ,QAAAA,EAAAA,CAAGI,KAAK,CAAC,GAAA;KAAK,EAAE,WAAA;QACvD,IAAI,CAACC,EAAE,CAACC,KAAK,GAAGN,EAAGO,CAAAA,GAAG,CAAC,IAAI,CAACR,CAAC,EAAE,IAAA,CAAA;AAC/B,QAAA,IAAI,CAACM,EAAE,CAACG,CAAC,GAAGR,GAAGS,GAAG,CAACT,EAAGU,CAAAA,GAAG,CAAC,IAAI,CAACZ,QAAQ,CAAG,EAAA,IAAI,CAACQ,KAAK,CAAA;;;AAGpD,QAAA,IAAI,CAACD,EAAE,CAACM,EAAE,GAAGX,GAAGY,GAAG,CAACZ,EAAGa,CAAAA,GAAG,CAACb,EAAGc,CAAAA,GAAG,CAAC,IAAI,CAACN,CAAC,EAAE,EAAA,CAAA,CAAA,CAAA;QAC1C,IAAI,CAACH,EAAE,CAACU,EAAE,GAAGf,EAAGY,CAAAA,GAAG,CAACZ,EAAGa,CAAAA,GAAG,CAACb,EAAGc,CAAAA,GAAG,CAACd,EAAGS,CAAAA,GAAG,CAAC,IAAI,CAACD,CAAC,EAAE,CAAI,CAAA,EAAA,EAAA,CAAA,CAAA,CAAA;AACrD,QAAA,IAAI,CAACQ,OAAO,CAAChB,GAAGS,GAAG,CAACT,GAAGiB,GAAG,CAAC,IAAI,CAACN,EAAE,EAAE,IAAI,CAACI,EAAE,CAAG,EAAA,IAAI,CAACT,KAAK,CAAA,CAAA;AAC1D,KAAA,CAAA;AACA,IAAA,OAAON,GAAGkB,cAAc,EAAE,CAAChB,QAAAA,CAAS,CAACJ,QAAUC,EAAAA,CAAAA,CAAAA;AACjD;;;;"}
@@ -426,15 +426,25 @@ function getShadowMapSize(scope) {
426
426
  ], function() {
427
427
  this.$l.dx = pb.dpdx(this.coords);
428
428
  this.$l.dy = pb.dpdy(this.coords);
429
- this.$l.biasMultiply = pb.float(1);
430
429
  this.$l.uv = pb.vec2(pb.sub(pb.mul(this.dy.y, this.dx.z), pb.mul(this.dx.y, this.dy.z)), pb.sub(pb.mul(this.dx.x, this.dy.z), pb.mul(this.dy.x, this.dx.z)));
431
- this.$l.uv = pb.mul(this.$l.uv, pb.div(this.biasMultiply, pb.sub(pb.mul(this.dx.x, this.dy.y), pb.mul(this.dx.y, this.dy.x))));
432
- // from unity shader
433
- this.$l.minFractionalError = pb.float(0.01);
434
- this.$l.fractionalSamplingError = pb.dot(pb.vec2(getShadowMapTexelSize(this)), pb.abs(this.$l.uv));
435
- this.$l.staticBias = pb.min(this.$l.fractionalSamplingError, this.$l.minFractionalError);
436
- // return
437
- this.$return(pb.vec3(this.$l.uv, this.$l.staticBias));
430
+ // At grazing incidence the shadow-space footprint of a pixel collapses and
431
+ // this determinant tends to zero, so the gradient blows up (and flips sign
432
+ // across neighbouring pixels). Rather than clamp the fallout downstream,
433
+ // report "no usable plane" and let the caller fall back to the constant
434
+ // depth bias plus normal offset.
435
+ this.$l.det = pb.sub(pb.mul(this.dx.x, this.dy.y), pb.mul(this.dx.y, this.dy.x));
436
+ this.$if(pb.lessThan(pb.abs(this.det), 1e-8), function() {
437
+ this.$return(pb.vec3(0));
438
+ });
439
+ this.uv = pb.div(this.uv, this.det);
440
+ // `.z` used to carry a scalar "static bias" capped at a hardcoded 0.01.
441
+ // That constant came from a Unity shader operating on perspective (non
442
+ // linear) shadow depth; for a directional light's orthographic camera the
443
+ // depth is linear, so 0.01 means 1% of the whole depth range - metres of
444
+ // world-space push on a typical scene, which is what produced the light
445
+ // leaks around the terminator. Constant depth bias plus normal offset cover
446
+ // this properly now, so only the plane gradient survives.
447
+ this.$return(pb.vec3(this.uv, 0));
438
448
  });
439
449
  return pb.getGlobalScope()[funcNameComputeReceiverPlaneDepthBias](texCoord);
440
450
  }
@@ -805,22 +815,27 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
805
815
  depthBias
806
816
  ] : []);
807
817
  }
808
- /** @internal */ function filterShadowPCF(scope, lightType, shadowMapFormat, kernelSize, texCoord, receiverPlaneDepthBias, cascade) {
818
+ /**
819
+ * Fixed-kernel PCF.
820
+ *
821
+ * @remarks
822
+ * Unlike {@link filterShadowPCSS} and {@link filterShadowPoissonDisc}, this
823
+ * filter never applied the receiver plane depth gradient per tap - it only used
824
+ * the scalar `.z` guard, which has been removed (see
825
+ * {@link computeReceiverPlaneDepthBias}). Over a kernel this narrow the plane
826
+ * correction is worth little, and the constant depth bias plus normal offset
827
+ * cover the receiver slope, so the parameter is gone rather than left inert.
828
+ * @internal
829
+ */ function filterShadowPCF(scope, lightType, shadowMapFormat, kernelSize, texCoord, cascade) {
809
830
  const funcNameFilterShadowPCF = `lib_filterShadowPCF${kernelSize}x${kernelSize}`;
810
831
  const pb = scope.$builder;
811
832
  pb.func(funcNameFilterShadowPCF, [
812
833
  pb.vec4('texCoord'),
813
- ...receiverPlaneDepthBias ? [
814
- pb.vec3('receiverPlaneDepthBias')
815
- ] : [],
816
834
  ...cascade ? [
817
835
  pb.int('cascade')
818
836
  ] : []
819
837
  ], function() {
820
838
  this.$l.lightDepth = this.texCoord.z;
821
- if (receiverPlaneDepthBias) {
822
- this.lightDepth = REVERSE_Z ? pb.add(this.lightDepth, this.receiverPlaneDepthBias.z) : pb.sub(this.lightDepth, this.receiverPlaneDepthBias.z);
823
- }
824
839
  const shadowMapTexelSize = getShadowMapTexelSize(this);
825
840
  this.$l.uv = pb.add(pb.mul(this.texCoord.xy, pb.vec2(getShadowMapSize(this))), pb.vec2(0));
826
841
  this.$l.st = pb.fract(this.uv);
@@ -880,9 +895,7 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
880
895
  }
881
896
  this.$return(this.shadow);
882
897
  });
883
- return pb.getGlobalScope()[funcNameFilterShadowPCF](texCoord, ...receiverPlaneDepthBias ? [
884
- receiverPlaneDepthBias
885
- ] : [], ...cascade ? [
898
+ return pb.getGlobalScope()[funcNameFilterShadowPCF](texCoord, ...cascade ? [
886
899
  cascade
887
900
  ] : []);
888
901
  }
@@ -941,9 +954,8 @@ function chebyshevUpperBound(scope, distance, occluder, deviceEncoded) {
941
954
  // spot receivers and their stored depth use a linear encoding.
942
955
  const deviceEncoded = isDeviceDepthShadow(lightType);
943
956
  this.$l.lightDepth = this.texCoord.z;
944
- if (receiverPlaneDepthBias) {
945
- this.lightDepth = REVERSE_Z && deviceEncoded ? pb.add(this.lightDepth, this.receiverPlaneDepthBias.z) : pb.sub(this.lightDepth, this.receiverPlaneDepthBias.z);
946
- }
957
+ // The scalar `.z` guard is gone (see computeReceiverPlaneDepthBias); the
958
+ // per-tap plane gradient below is the part that was ever load bearing.
947
959
  this.$l.sampleBounds = pb.vec4(0, 0, 1, 1);
948
960
  if (cascade && getDevice().type === 'webgl' && numCascades > 1) {
949
961
  const numCols = numCascades > 1 ? 2 : 1;