@zephyr3d/editor 0.3.8 → 0.3.9

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 (137) hide show
  1. package/dist/assets/{index-BZ1L8ggE.js → index-CO6yA4Rj.js} +313 -11
  2. package/dist/assistant/zephyr-types-index.json +13834 -11679
  3. package/dist/index.html +1 -1
  4. package/dist/modules/zephyr3d_backend-webgpu.js +1 -1
  5. package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
  6. package/dist/modules/zephyr3d_device.js +2 -2
  7. package/dist/modules/zephyr3d_device.js.map +1 -1
  8. package/dist/modules/zephyr3d_scene.js +2325 -515
  9. package/dist/modules/zephyr3d_scene.js.map +1 -1
  10. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +1 -1
  11. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
  12. package/dist/vendor/zephyr3d/device/dist/device.js +2 -2
  13. package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
  14. package/dist/vendor/zephyr3d/scene/dist/app/engine.js +3 -1
  15. package/dist/vendor/zephyr3d/scene/dist/app/engine.js.map +1 -1
  16. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js +1 -0
  17. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js.map +1 -1
  18. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +87 -0
  19. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
  20. package/dist/vendor/zephyr3d/scene/dist/index.d.ts +158 -4
  21. package/dist/vendor/zephyr3d/scene/dist/index.js +3 -0
  22. package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
  23. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js +8 -1
  24. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js.map +1 -1
  25. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js +6 -0
  26. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js.map +1 -1
  27. package/dist/vendor/zephyr3d/scene/dist/material/skin.js +263 -0
  28. package/dist/vendor/zephyr3d/scene/dist/material/skin.js.map +1 -0
  29. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js +3 -0
  30. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js.map +1 -1
  31. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js +194 -0
  32. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js.map +1 -0
  33. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js +26 -49
  34. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js.map +1 -1
  35. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js +1 -0
  36. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js.map +1 -1
  37. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js +2 -40
  38. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js.map +1 -1
  39. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js +1 -0
  40. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js.map +1 -1
  41. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js +1 -0
  42. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js.map +1 -1
  43. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js +1 -0
  44. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js.map +1 -1
  45. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js +1 -0
  46. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js.map +1 -1
  47. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js +1 -0
  48. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js.map +1 -1
  49. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js +4 -1
  50. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js.map +1 -1
  51. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js +1 -0
  52. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js.map +1 -1
  53. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js +1 -0
  54. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js.map +1 -1
  55. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js +12 -5
  56. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  57. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +78 -8
  58. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  59. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js +1 -0
  60. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js.map +1 -1
  61. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js +1 -0
  62. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js.map +1 -1
  63. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js +1 -0
  64. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js.map +1 -1
  65. package/dist/vendor/zephyr3d/scene/dist/scene/light.js +158 -154
  66. package/dist/vendor/zephyr3d/scene/dist/scene/light.js.map +1 -1
  67. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js +1 -0
  68. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js.map +1 -1
  69. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js +1 -0
  70. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js.map +1 -1
  71. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js +1 -0
  72. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js.map +1 -1
  73. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js +1 -0
  74. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js.map +1 -1
  75. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
  76. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
  77. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js +1 -0
  78. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js.map +1 -1
  79. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js +1 -0
  80. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  81. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js +1 -0
  82. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  83. package/dist/vendor/zephyr3d/scene/dist/scene/water.js +1 -0
  84. package/dist/vendor/zephyr3d/scene/dist/scene/water.js.map +1 -1
  85. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js +617 -1
  86. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js.map +1 -1
  87. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js +1 -0
  88. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js.map +1 -1
  89. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js +1 -0
  90. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js.map +1 -1
  91. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js +1 -0
  92. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js.map +1 -1
  93. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js +182 -0
  94. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js.map +1 -0
  95. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js +1 -0
  96. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js.map +1 -1
  97. package/dist/vendor/zephyr3d/scene/dist/shadow/shadow_impl.js.map +1 -1
  98. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js +183 -105
  99. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js.map +1 -1
  100. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js +1 -0
  101. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js.map +1 -1
  102. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js +1 -0
  103. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js.map +1 -1
  104. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +3 -1
  105. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
  106. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +1 -0
  107. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
  108. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js +1 -0
  109. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js.map +1 -1
  110. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js +122 -0
  111. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
  112. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js +1 -0
  113. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
  114. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js +102 -21
  115. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
  116. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js +195 -3
  117. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
  118. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js +1 -0
  119. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
  120. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js +1 -0
  121. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
  122. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js +1 -0
  123. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
  124. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js +1 -0
  125. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
  126. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js +1 -0
  127. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js.map +1 -1
  128. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js +1 -0
  129. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
  130. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js +1 -0
  131. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js.map +1 -1
  132. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js +1 -0
  133. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js.map +1 -1
  134. package/dist/vendor/zephyr3d/scene/dist/values.js +1 -0
  135. package/dist/vendor/zephyr3d/scene/dist/values.js.map +1 -1
  136. package/electron/main.cjs +30 -6
  137. package/package.json +4 -4
@@ -0,0 +1,182 @@
1
+ import { Vector4 } from '@zephyr3d/base';
2
+ import { ShadowImpl } from './shadow_impl.js';
3
+ import { computeShadowMapDepth, computeReceiverPlaneDepthBias, filterShadowPCSS } from '../shaders/shadow.js';
4
+ import { decodeNormalizedFloatFromRGBA } from '../shaders/misc.js';
5
+ import { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values.js';
6
+ import { ShaderHelper } from '../material/shader/helper.js';
7
+ import { computeShadowBiasCSM, computeShadowBias } from './shader.js';
8
+ import { getDevice } from '../app/api.js';
9
+
10
+ /** @internal */ class PCSS extends ShadowImpl {
11
+ _lightRadius;
12
+ _blockerSampleCount;
13
+ _filterSampleCount;
14
+ _maxFilterRadius;
15
+ _temporalJitter;
16
+ constructor(lightRadius, blockerSampleCount, filterSampleCount, maxFilterRadius, temporalJitter){
17
+ super();
18
+ this._lightRadius = lightRadius ?? 8;
19
+ this._blockerSampleCount = blockerSampleCount ?? 24;
20
+ this._filterSampleCount = filterSampleCount ?? 32;
21
+ this._maxFilterRadius = maxFilterRadius ?? 32;
22
+ this._temporalJitter = temporalJitter ?? true;
23
+ }
24
+ get lightRadius() {
25
+ return this._lightRadius;
26
+ }
27
+ set lightRadius(val) {
28
+ this._lightRadius = Math.max(0, Number(val) || 0);
29
+ }
30
+ get blockerSampleCount() {
31
+ return this._blockerSampleCount;
32
+ }
33
+ set blockerSampleCount(val) {
34
+ this._blockerSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);
35
+ }
36
+ get filterSampleCount() {
37
+ return this._filterSampleCount;
38
+ }
39
+ set filterSampleCount(val) {
40
+ this._filterSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);
41
+ }
42
+ get maxFilterRadius() {
43
+ return this._maxFilterRadius;
44
+ }
45
+ set maxFilterRadius(val) {
46
+ this._maxFilterRadius = Math.max(1, Number(val) || 1);
47
+ }
48
+ get temporalJitter() {
49
+ return this._temporalJitter;
50
+ }
51
+ set temporalJitter(val) {
52
+ this._temporalJitter = !!val;
53
+ }
54
+ getType() {
55
+ return 'pcss';
56
+ }
57
+ dispose() {}
58
+ resourceDirty() {
59
+ return false;
60
+ }
61
+ getShadowMapBorder(_shadowMapParams) {
62
+ return this._lightRadius > 0 ? Math.ceil(Math.max(this._lightRadius, this._maxFilterRadius) + 2) : 0;
63
+ }
64
+ getShadowMapClearColor(_shadowMapParams) {
65
+ return new Vector4(1, 1, 1, 1);
66
+ }
67
+ getShadowMap(shadowMapParams) {
68
+ return shadowMapParams.shadowMapFramebuffer.getColorAttachments()[0];
69
+ }
70
+ doUpdateResources(shadowMapParams) {
71
+ shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);
72
+ shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;
73
+ }
74
+ postRenderShadowMap() {}
75
+ getDepthScale() {
76
+ return 1;
77
+ }
78
+ setDepthScale(_val) {}
79
+ getShaderHash() {
80
+ return `${Number(this._temporalJitter)}`;
81
+ }
82
+ getShadowMapColorFormat(_shadowMapParams) {
83
+ const device = getDevice();
84
+ if (device.type === 'webgl') {
85
+ return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : device.getDeviceCaps().textureCaps.supportFloatColorBuffer ? 'rgba32f' : 'rgba8unorm';
86
+ }
87
+ return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer ? 'r16f' : device.getDeviceCaps().textureCaps.supportFloatColorBuffer ? 'r32f' : 'rgba8unorm';
88
+ }
89
+ getParams(out) {
90
+ out.setXYZW(this._lightRadius, this._blockerSampleCount, this._filterSampleCount, this._maxFilterRadius);
91
+ }
92
+ getShadowMapDepthFormat(_shadowMapParams) {
93
+ return getDevice().type === 'webgl' ? 'd24s8' : 'd32f';
94
+ }
95
+ computeShadowMapDepth(shadowMapParams, scope, worldPos) {
96
+ return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap.format);
97
+ }
98
+ computeShadowCSM(shadowMapParams, scope, shadowVertex, NdotL, split) {
99
+ const funcNameComputeShadowCSM = 'lib_computeShadowCSM';
100
+ const pb = scope.$builder;
101
+ const that = this;
102
+ pb.func(funcNameComputeShadowCSM, [
103
+ pb.vec4('shadowVertex'),
104
+ pb.float('NdotL'),
105
+ pb.int('split')
106
+ ], function() {
107
+ this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
108
+ this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);
109
+ this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), pb.lessThanEqual(this.shadowCoord.z, 1)));
110
+ this.$l.shadow = pb.float(1);
111
+ this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);
112
+ this.$if(this.inShadow, function() {
113
+ this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);
114
+ this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);
115
+ this.shadow = filterShadowPCSS(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord, this.receiverPlaneDepthBias, this.split, that._temporalJitter, shadowMapParams.numShadowCascades);
116
+ });
117
+ this.$return(this.shadow);
118
+ });
119
+ return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split);
120
+ }
121
+ computeShadow(shadowMapParams, scope, shadowVertex, NdotL) {
122
+ const funcNameComputeShadow = 'lib_computeShadow';
123
+ const pb = scope.$builder;
124
+ const that = this;
125
+ pb.func(funcNameComputeShadow, [
126
+ pb.vec4('shadowVertex'),
127
+ pb.float('NdotL')
128
+ ], function() {
129
+ if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {
130
+ this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);
131
+ this.$l.distance = pb.div(pb.length(this.dir), ShaderHelper.getLightPositionAndRangeForShadow(this).w);
132
+ this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.distance, this.NdotL, true);
133
+ this.$l.shadowCoord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));
134
+ this.$return(filterShadowPCSS(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord, undefined, undefined, that._temporalJitter));
135
+ }
136
+ this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);
137
+ this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);
138
+ this.$l.inShadow = pb.all(pb.bvec2(pb.all(pb.bvec4(pb.greaterThanEqual(this.shadowCoord.x, 0), pb.lessThanEqual(this.shadowCoord.x, 1), pb.greaterThanEqual(this.shadowCoord.y, 0), pb.lessThanEqual(this.shadowCoord.y, 1))), pb.lessThanEqual(this.shadowCoord.z, 1)));
139
+ this.$l.shadow = pb.float(1);
140
+ if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {
141
+ this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;
142
+ this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(this, this.shadowCoord.z, this.nearFar);
143
+ }
144
+ this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);
145
+ this.$if(this.inShadow, function() {
146
+ if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {
147
+ this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.shadowCoord.z, this.NdotL, true);
148
+ } else {
149
+ this.$l.shadowBias = computeShadowBias(shadowMapParams.lightType, this, this.shadowCoord.z, this.NdotL, false);
150
+ }
151
+ this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);
152
+ this.shadow = filterShadowPCSS(this, shadowMapParams.lightType, shadowMapParams.shadowMap.format, this.shadowCoord, this.receiverPlaneDepthBias, undefined, that._temporalJitter);
153
+ });
154
+ this.$return(this.shadow);
155
+ });
156
+ return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL);
157
+ }
158
+ useNativeShadowMap(_shadowMapParams) {
159
+ return false;
160
+ }
161
+ /** @internal */ samplePointShadowMap(shadowMapParams, scope, coords, z, bias) {
162
+ const funcNameSampleShadowMap = 'lib_samplePointShadowMapPCSS';
163
+ const pb = scope.$builder;
164
+ pb.func(funcNameSampleShadowMap, [
165
+ pb.vec3('coords'),
166
+ pb.float('z'),
167
+ pb.float('bias')
168
+ ], function() {
169
+ const floatDepthTexture = shadowMapParams.shadowMap.format !== 'rgba8unorm';
170
+ this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);
171
+ if (!floatDepthTexture) {
172
+ this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);
173
+ }
174
+ this.$l.distance = pb.sub(this.z, this.bias);
175
+ this.$return(pb.step(this.distance, this.shadowTex.x));
176
+ });
177
+ return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias);
178
+ }
179
+ }
180
+
181
+ export { PCSS };
182
+ //# sourceMappingURL=pcss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcss.js","sources":["../../src/shadow/pcss.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { PBInsideFunctionScope, PBShaderExp, TextureFormat } from '@zephyr3d/device';\r\nimport { ShadowImpl } from './shadow_impl';\r\nimport type { ShadowMapParams, ShadowMapType } from './shadowmapper';\r\nimport { computeReceiverPlaneDepthBias, computeShadowMapDepth, filterShadowPCSS } from '../shaders/shadow';\r\nimport { decodeNormalizedFloatFromRGBA } from '../shaders/misc';\r\nimport { LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { computeShadowBias, computeShadowBiasCSM } from './shader';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @internal */\r\nexport class PCSS extends ShadowImpl {\r\n protected _lightRadius: number;\r\n protected _blockerSampleCount: number;\r\n protected _filterSampleCount: number;\r\n protected _maxFilterRadius: number;\r\n protected _temporalJitter: boolean;\r\n constructor(\r\n lightRadius?: number,\r\n blockerSampleCount?: number,\r\n filterSampleCount?: number,\r\n maxFilterRadius?: number,\r\n temporalJitter?: boolean\r\n ) {\r\n super();\r\n this._lightRadius = lightRadius ?? 8;\r\n this._blockerSampleCount = blockerSampleCount ?? 24;\r\n this._filterSampleCount = filterSampleCount ?? 32;\r\n this._maxFilterRadius = maxFilterRadius ?? 32;\r\n this._temporalJitter = temporalJitter ?? true;\r\n }\r\n get lightRadius() {\r\n return this._lightRadius;\r\n }\r\n set lightRadius(val) {\r\n this._lightRadius = Math.max(0, Number(val) || 0);\r\n }\r\n get blockerSampleCount() {\r\n return this._blockerSampleCount;\r\n }\r\n set blockerSampleCount(val) {\r\n this._blockerSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get filterSampleCount() {\r\n return this._filterSampleCount;\r\n }\r\n set filterSampleCount(val) {\r\n this._filterSampleCount = Math.min(Math.max(1, Number(val) >> 0), 64);\r\n }\r\n get maxFilterRadius() {\r\n return this._maxFilterRadius;\r\n }\r\n set maxFilterRadius(val) {\r\n this._maxFilterRadius = Math.max(1, Number(val) || 1);\r\n }\r\n get temporalJitter() {\r\n return this._temporalJitter;\r\n }\r\n set temporalJitter(val) {\r\n this._temporalJitter = !!val;\r\n }\r\n getType() {\r\n return 'pcss' as const;\r\n }\r\n dispose() {}\r\n resourceDirty() {\r\n return false;\r\n }\r\n getShadowMapBorder(_shadowMapParams: ShadowMapParams) {\r\n return this._lightRadius > 0 ? Math.ceil(Math.max(this._lightRadius, this._maxFilterRadius) + 2) : 0;\r\n }\r\n getShadowMapClearColor(_shadowMapParams: ShadowMapParams) {\r\n return new Vector4(1, 1, 1, 1);\r\n }\r\n getShadowMap(shadowMapParams: ShadowMapParams) {\r\n return shadowMapParams.shadowMapFramebuffer!.getColorAttachments()[0] as ShadowMapType;\r\n }\r\n doUpdateResources(shadowMapParams: ShadowMapParams) {\r\n shadowMapParams.shadowMap = this.getShadowMap(shadowMapParams);\r\n shadowMapParams.shadowMapSampler = shadowMapParams.shadowMap?.getDefaultSampler(false) ?? null;\r\n }\r\n postRenderShadowMap() {}\r\n getDepthScale() {\r\n return 1;\r\n }\r\n setDepthScale(_val: number) {}\r\n getShaderHash() {\r\n return `${Number(this._temporalJitter)}`;\r\n }\r\n getShadowMapColorFormat(_shadowMapParams: ShadowMapParams): Nullable<TextureFormat> {\r\n const device = getDevice();\r\n if (device.type === 'webgl') {\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'rgba16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'rgba32f'\r\n : 'rgba8unorm';\r\n }\r\n return device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer\r\n ? 'r16f'\r\n : device.getDeviceCaps().textureCaps.supportFloatColorBuffer\r\n ? 'r32f'\r\n : 'rgba8unorm';\r\n }\r\n getParams(out: Vector4) {\r\n out.setXYZW(this._lightRadius, this._blockerSampleCount, this._filterSampleCount, this._maxFilterRadius);\r\n }\r\n getShadowMapDepthFormat(_shadowMapParams: ShadowMapParams): TextureFormat {\r\n return getDevice().type === 'webgl' ? 'd24s8' : 'd32f';\r\n }\r\n computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ) {\r\n return computeShadowMapDepth(scope, worldPos, shadowMapParams.shadowMap!.format);\r\n }\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 const funcNameComputeShadowCSM = 'lib_computeShadowCSM';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(\r\n funcNameComputeShadowCSM,\r\n [pb.vec4('shadowVertex'), pb.float('NdotL'), pb.int('split')],\r\n function () {\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n this.$l.shadowBias = computeShadowBiasCSM(this, this.NdotL, this.split);\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n this.split,\r\n that._temporalJitter,\r\n shadowMapParams.numShadowCascades\r\n );\r\n });\r\n this.$return(this.shadow);\r\n }\r\n );\r\n return pb.getGlobalScope()[funcNameComputeShadowCSM](shadowVertex, NdotL, split) as PBShaderExp;\r\n }\r\n computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ) {\r\n const funcNameComputeShadow = 'lib_computeShadow';\r\n const pb = scope.$builder;\r\n const that = this;\r\n pb.func(funcNameComputeShadow, [pb.vec4('shadowVertex'), pb.float('NdotL')], function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_POINT) {\r\n this.$l.dir = pb.sub(this.shadowVertex.xyz, ShaderHelper.getLightPositionAndRangeForShadow(this).xyz);\r\n this.$l.distance = pb.div(\r\n pb.length(this.dir),\r\n ShaderHelper.getLightPositionAndRangeForShadow(this).w\r\n );\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.distance,\r\n this.NdotL,\r\n true\r\n );\r\n this.$l.shadowCoord = pb.vec4(this.dir, pb.sub(this.distance, this.shadowBias));\r\n this.$return(\r\n filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n undefined,\r\n undefined,\r\n that._temporalJitter\r\n )\r\n );\r\n }\r\n this.$l.shadowCoord = pb.div(this.shadowVertex, this.shadowVertex.w);\r\n this.$l.shadowCoord = pb.add(pb.mul(this.shadowCoord, 0.5), 0.5);\r\n this.$l.inShadow = pb.all(\r\n pb.bvec2(\r\n pb.all(\r\n pb.bvec4(\r\n pb.greaterThanEqual(this.shadowCoord.x, 0),\r\n pb.lessThanEqual(this.shadowCoord.x, 1),\r\n pb.greaterThanEqual(this.shadowCoord.y, 0),\r\n pb.lessThanEqual(this.shadowCoord.y, 1)\r\n )\r\n ),\r\n pb.lessThanEqual(this.shadowCoord.z, 1)\r\n )\r\n );\r\n this.$l.shadow = pb.float(1);\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.nearFar = ShaderHelper.getShadowCameraParams(this).xy;\r\n this.shadowCoord.z = ShaderHelper.nonLinearDepthToLinearNormalized(\r\n this,\r\n this.shadowCoord.z,\r\n this.nearFar\r\n );\r\n }\r\n this.$l.receiverPlaneDepthBias = computeReceiverPlaneDepthBias(this, this.shadowCoord);\r\n this.$if(this.inShadow, function () {\r\n if (shadowMapParams.lightType === LIGHT_TYPE_SPOT) {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n true\r\n );\r\n } else {\r\n this.$l.shadowBias = computeShadowBias(\r\n shadowMapParams.lightType,\r\n this,\r\n this.shadowCoord.z,\r\n this.NdotL,\r\n false\r\n );\r\n }\r\n this.shadowCoord.z = pb.sub(this.shadowCoord.z, this.shadowBias);\r\n this.shadow = filterShadowPCSS(\r\n this,\r\n shadowMapParams.lightType,\r\n shadowMapParams.shadowMap!.format,\r\n this.shadowCoord,\r\n this.receiverPlaneDepthBias,\r\n undefined,\r\n that._temporalJitter\r\n );\r\n });\r\n this.$return(this.shadow);\r\n });\r\n return pb.getGlobalScope()[funcNameComputeShadow](shadowVertex, NdotL) as PBShaderExp;\r\n }\r\n useNativeShadowMap(_shadowMapParams: ShadowMapParams) {\r\n return false;\r\n }\r\n /** @internal */\r\n samplePointShadowMap(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n coords: PBShaderExp,\r\n z: PBShaderExp,\r\n bias: PBShaderExp\r\n ) {\r\n const funcNameSampleShadowMap = 'lib_samplePointShadowMapPCSS';\r\n const pb = scope.$builder;\r\n pb.func(funcNameSampleShadowMap, [pb.vec3('coords'), pb.float('z'), pb.float('bias')], function () {\r\n const floatDepthTexture = shadowMapParams.shadowMap!.format !== 'rgba8unorm';\r\n this.$l.shadowTex = pb.textureSampleLevel(ShaderHelper.getShadowMap(this), this.coords, 0);\r\n if (!floatDepthTexture) {\r\n this.shadowTex.x = decodeNormalizedFloatFromRGBA(this, this.shadowTex);\r\n }\r\n this.$l.distance = pb.sub(this.z, this.bias);\r\n this.$return(pb.step(this.distance, this.shadowTex.x));\r\n });\r\n return pb.getGlobalScope()[funcNameSampleShadowMap](coords, z, bias) as PBShaderExp;\r\n }\r\n}\r\n"],"names":["PCSS","ShadowImpl","_lightRadius","_blockerSampleCount","_filterSampleCount","_maxFilterRadius","_temporalJitter","lightRadius","blockerSampleCount","filterSampleCount","maxFilterRadius","temporalJitter","val","Math","max","Number","min","getType","dispose","resourceDirty","getShadowMapBorder","_shadowMapParams","ceil","getShadowMapClearColor","Vector4","getShadowMap","shadowMapParams","shadowMapFramebuffer","getColorAttachments","doUpdateResources","shadowMap","shadowMapSampler","getDefaultSampler","postRenderShadowMap","getDepthScale","setDepthScale","_val","getShaderHash","getShadowMapColorFormat","device","getDevice","type","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","supportFloatColorBuffer","getParams","out","setXYZW","getShadowMapDepthFormat","computeShadowMapDepth","scope","worldPos","format","computeShadowCSM","shadowVertex","NdotL","split","funcNameComputeShadowCSM","pb","$builder","that","func","vec4","float","int","$l","shadowCoord","div","w","add","mul","inShadow","all","bvec2","bvec4","greaterThanEqual","x","lessThanEqual","y","z","shadow","receiverPlaneDepthBias","computeReceiverPlaneDepthBias","$if","shadowBias","computeShadowBiasCSM","sub","filterShadowPCSS","lightType","numShadowCascades","$return","getGlobalScope","computeShadow","funcNameComputeShadow","LIGHT_TYPE_POINT","dir","xyz","ShaderHelper","getLightPositionAndRangeForShadow","distance","length","computeShadowBias","undefined","LIGHT_TYPE_SPOT","nearFar","getShadowCameraParams","xy","nonLinearDepthToLinearNormalized","useNativeShadowMap","samplePointShadowMap","coords","bias","funcNameSampleShadowMap","vec3","floatDepthTexture","shadowTex","textureSampleLevel","decodeNormalizedFloatFromRGBA","step"],"mappings":"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"}
@@ -4,6 +4,7 @@ import '../material/blinn.js';
4
4
  import '../material/unlit.js';
5
5
  import '../material/particle.js';
6
6
  import '../material/subsurfaceprofile.js';
7
+ import '../material/skin.js';
7
8
  import '@zephyr3d/device';
8
9
  import { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_SPOT, LIGHT_TYPE_POINT } from '../values.js';
9
10
  import '@zephyr3d/base';
@@ -1 +1 @@
1
- {"version":3,"file":"shader.js","sources":["../../src/shadow/shader.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\n\r\nfunction getShadowReceiverBiasFactors(scope: PBInsideFunctionScope) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Thin masked geometry such as layered hair cards needs a tighter receiver bias,\r\n // otherwise nearby layers lose self-shadow before the shadow map is even sampled.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n return pb.vec2(pb.mix(0.22, 0.4, cutoff), pb.mix(0.05, 0.16, cutoff)) as PBShaderExp;\r\n }\r\n return pb.vec2(1, 1) as PBShaderExp;\r\n}\r\n\r\nfunction isMaskedPerspectiveShadowLight(scope: PBInsideFunctionScope, lightType: number) {\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n return !!alphaCutoff && (lightType === LIGHT_TYPE_SPOT || lightType === LIGHT_TYPE_POINT);\r\n}\r\n\r\nfunction getShadowReceiverNoL(scope: PBInsideFunctionScope, NdotL: PBShaderExp, lightType?: number) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Layered masked cards should not explode slope bias at grazing angles.\r\n // This is especially visible for back / rim spot lights on hair cards.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n if (lightType != null && isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n return pb.max(NdotL, pb.mix(0.85, 0.95, cutoff)) as PBShaderExp;\r\n }\r\n return pb.max(NdotL, pb.mix(0.45, 0.65, cutoff)) as PBShaderExp;\r\n }\r\n return NdotL as PBShaderExp;\r\n}\r\n\r\nfunction getShadowReceiverPerspectiveBiasScale(\r\n scope: PBInsideFunctionScope,\r\n lightType: number,\r\n linearDepth: PBShaderExp,\r\n farNearRatio: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff && isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n // Perspective shadow cameras (spot / point) can over-amplify receiver bias at depth.\r\n // Keep masked layered geometry in a much tighter range so hair cards can still self-occlude.\r\n const cappedFarNearRatio = pb.min(farNearRatio, pb.mix(1.15, 1.6, cutoff));\r\n return pb.mix(1, cappedFarNearRatio, linearDepth) as PBShaderExp;\r\n }\r\n return pb.mix(1, farNearRatio, linearDepth) as PBShaderExp;\r\n}\r\n\r\nexport function computeShadowBiasCSM(scope: PBInsideFunctionScope, NdotL: PBShaderExp, split: PBShaderExp) {\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 const receiverBiasFactors = getShadowReceiverBiasFactors(scope);\r\n const receiverNoL = getShadowReceiverNoL(scope, NdotL);\r\n return pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL)), depthBiasScale),\r\n pb.vec2(1, 1)\r\n );\r\n}\r\n\r\nexport function computeShadowBias(\r\n lightType: number,\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 const receiverBiasFactors = getShadowReceiverBiasFactors(scope);\r\n const receiverNoL = getShadowReceiverNoL(scope, NdotL, lightType);\r\n if (lightType === LIGHT_TYPE_DIRECTIONAL) {\r\n return pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL))),\r\n pb.vec2(1, 1)\r\n );\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 = getShadowReceiverPerspectiveBiasScale(\r\n scope,\r\n lightType,\r\n linearDepth,\r\n depthBiasParam.w\r\n );\r\n let bias = pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL)), biasScaleFactor),\r\n pb.vec2(1, 1)\r\n );\r\n if (isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff!;\r\n bias = pb.mul(bias, pb.mix(0.12, 0.22, pb.clamp(alphaCutoff, 0, 1))) as PBShaderExp;\r\n }\r\n return bias;\r\n }\r\n}\r\n"],"names":["getShadowReceiverBiasFactors","scope","pb","$builder","alphaCutoff","zAlphaCutoff","cutoff","clamp","vec2","mix","isMaskedPerspectiveShadowLight","lightType","LIGHT_TYPE_SPOT","LIGHT_TYPE_POINT","getShadowReceiverNoL","NdotL","max","getShadowReceiverPerspectiveBiasScale","linearDepth","farNearRatio","cappedFarNearRatio","min","computeShadowBiasCSM","split","depthBiasParam","ShaderHelper","getDepthBiasValues","splitFlags","vec4","float","equal","depthBiasScale","dot","getDepthBiasScales","receiverBiasFactors","receiverNoL","mul","xy","sub","computeShadowBias","z","linear","LIGHT_TYPE_DIRECTIONAL","nearFar","getShadowCameraParams","nonLinearDepthToLinearNormalized","biasScaleFactor","w","bias"],"mappings":"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"}
1
+ {"version":3,"file":"shader.js","sources":["../../src/shadow/shader.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport { ShaderHelper } from '../material';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT } from '../values';\r\n\r\nfunction getShadowReceiverBiasFactors(scope: PBInsideFunctionScope) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Thin masked geometry such as layered hair cards needs a tighter receiver bias,\r\n // otherwise nearby layers lose self-shadow before the shadow map is even sampled.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n return pb.vec2(pb.mix(0.22, 0.4, cutoff), pb.mix(0.05, 0.16, cutoff)) as PBShaderExp;\r\n }\r\n return pb.vec2(1, 1) as PBShaderExp;\r\n}\r\n\r\nfunction isMaskedPerspectiveShadowLight(scope: PBInsideFunctionScope, lightType: number) {\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n return !!alphaCutoff && (lightType === LIGHT_TYPE_SPOT || lightType === LIGHT_TYPE_POINT);\r\n}\r\n\r\nfunction getShadowReceiverNoL(scope: PBInsideFunctionScope, NdotL: PBShaderExp, lightType?: number) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff) {\r\n // Layered masked cards should not explode slope bias at grazing angles.\r\n // This is especially visible for back / rim spot lights on hair cards.\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n if (lightType != null && isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n return pb.max(NdotL, pb.mix(0.85, 0.95, cutoff)) as PBShaderExp;\r\n }\r\n return pb.max(NdotL, pb.mix(0.45, 0.65, cutoff)) as PBShaderExp;\r\n }\r\n return NdotL as PBShaderExp;\r\n}\r\n\r\nfunction getShadowReceiverPerspectiveBiasScale(\r\n scope: PBInsideFunctionScope,\r\n lightType: number,\r\n linearDepth: PBShaderExp,\r\n farNearRatio: PBShaderExp\r\n) {\r\n const pb = scope.$builder;\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff;\r\n if (alphaCutoff && isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n const cutoff = pb.clamp(alphaCutoff, 0, 1);\r\n // Perspective shadow cameras (spot / point) can over-amplify receiver bias at depth.\r\n // Keep masked layered geometry in a much tighter range so hair cards can still self-occlude.\r\n const cappedFarNearRatio = pb.min(farNearRatio, pb.mix(1.15, 1.6, cutoff));\r\n return pb.mix(1, cappedFarNearRatio, linearDepth) as PBShaderExp;\r\n }\r\n return pb.mix(1, farNearRatio, linearDepth) as PBShaderExp;\r\n}\r\n\r\nexport function computeShadowBiasCSM(scope: PBInsideFunctionScope, NdotL: PBShaderExp, split: PBShaderExp) {\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 const receiverBiasFactors = getShadowReceiverBiasFactors(scope);\r\n const receiverNoL = getShadowReceiverNoL(scope, NdotL);\r\n return pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL)), depthBiasScale),\r\n pb.vec2(1, 1)\r\n );\r\n}\r\n\r\nexport function computeShadowBias(\r\n lightType: number,\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 const receiverBiasFactors = getShadowReceiverBiasFactors(scope);\r\n const receiverNoL = getShadowReceiverNoL(scope, NdotL, lightType);\r\n if (lightType === LIGHT_TYPE_DIRECTIONAL) {\r\n return pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL))),\r\n pb.vec2(1, 1)\r\n );\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 = getShadowReceiverPerspectiveBiasScale(\r\n scope,\r\n lightType,\r\n linearDepth,\r\n depthBiasParam.w\r\n );\r\n let bias = pb.dot(\r\n pb.mul(depthBiasParam.xy, receiverBiasFactors, pb.vec2(1, pb.sub(1, receiverNoL)), biasScaleFactor),\r\n pb.vec2(1, 1)\r\n );\r\n if (isMaskedPerspectiveShadowLight(scope, lightType)) {\r\n const alphaCutoff = (scope as PBInsideFunctionScope & { zAlphaCutoff?: PBShaderExp }).zAlphaCutoff!;\r\n bias = pb.mul(bias, pb.mix(0.12, 0.22, pb.clamp(alphaCutoff, 0, 1))) as PBShaderExp;\r\n }\r\n return bias;\r\n }\r\n}\r\n"],"names":["getShadowReceiverBiasFactors","scope","pb","$builder","alphaCutoff","zAlphaCutoff","cutoff","clamp","vec2","mix","isMaskedPerspectiveShadowLight","lightType","LIGHT_TYPE_SPOT","LIGHT_TYPE_POINT","getShadowReceiverNoL","NdotL","max","getShadowReceiverPerspectiveBiasScale","linearDepth","farNearRatio","cappedFarNearRatio","min","computeShadowBiasCSM","split","depthBiasParam","ShaderHelper","getDepthBiasValues","splitFlags","vec4","float","equal","depthBiasScale","dot","getDepthBiasScales","receiverBiasFactors","receiverNoL","mul","xy","sub","computeShadowBias","z","linear","LIGHT_TYPE_DIRECTIONAL","nearFar","getShadowCameraParams","nonLinearDepthToLinearNormalized","biasScaleFactor","w","bias"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"shadow_impl.js","sources":["../../src/shadow/shadow_impl.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureFormat } from '@zephyr3d/device';\r\nimport type { ShadowMapParams, ShadowMapType, ShadowMode } from './shadowmapper';\r\nimport { Vector4, type Nullable } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport abstract class ShadowImpl {\r\n protected _resourceDirty: boolean;\r\n constructor() {\r\n this._resourceDirty = true;\r\n }\r\n invalidateResource() {\r\n this._resourceDirty = true;\r\n }\r\n updateResources(shadowMapParams: ShadowMapParams) {\r\n this.doUpdateResources(shadowMapParams);\r\n }\r\n abstract getType(): ShadowMode;\r\n abstract getShadowMapBorder(shadowMapParams: ShadowMapParams): number;\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n return colorAttachment\r\n ? colorAttachment.isFloatFormat()\r\n ? new Vector4(1, 1, 1, 1)\r\n : new Vector4(0, 0, 0, 1)\r\n : null;\r\n }\r\n abstract getShadowMap(shadowMapParams: ShadowMapParams): ShadowMapType;\r\n abstract postRenderShadowMap(shadowMapParams: ShadowMapParams): void;\r\n abstract getDepthScale(): number;\r\n abstract setDepthScale(val: number): void;\r\n abstract resourceDirty(): boolean;\r\n abstract doUpdateResources(shadowMapParams: ShadowMapParams): void;\r\n abstract getShaderHash(): string;\r\n abstract computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ): PBShaderExp;\r\n abstract getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat>;\r\n abstract getShadowMapDepthFormat(shadowMapParams: ShadowMapParams): TextureFormat;\r\n abstract useNativeShadowMap(shadowMapParams: ShadowMapParams): boolean;\r\n}\r\n"],"names":["ShadowImpl","_resourceDirty","invalidateResource","updateResources","shadowMapParams","doUpdateResources","getShadowMapClearColor","colorAttachment","shadowMapFramebuffer","getColorAttachments","isFloatFormat","Vector4"],"mappings":";;AAIA,iBACO,MAAeA,UAAAA,CAAAA;IACVC,cAAwB;IAClC,WAAc,EAAA;QACZ,IAAI,CAACA,cAAc,GAAG,IAAA;AACxB;IACAC,kBAAqB,GAAA;QACnB,IAAI,CAACD,cAAc,GAAG,IAAA;AACxB;AACAE,IAAAA,eAAAA,CAAgBC,eAAgC,EAAE;QAChD,IAAI,CAACC,iBAAiB,CAACD,eAAAA,CAAAA;AACzB;AAGAE,IAAAA,sBAAAA,CAAuBF,eAAgC,EAAE;AACvD,QAAA,MAAMG,kBAAkBH,eAAgBI,CAAAA,oBAAoB,EAAEC,mBAAAA,EAAqB,CAAC,CAAE,CAAA;AACtF,QAAA,OAAOF,eACHA,GAAAA,eAAAA,CAAgBG,aAAa,EAAA,GAC3B,IAAIC,OAAQ,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KACrB,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CACvB,CAAA,GAAA,IAAA;AACN;AA6BF;;;;"}
1
+ {"version":3,"file":"shadow_impl.js","sources":["../../src/shadow/shadow_impl.ts"],"sourcesContent":["import type { PBInsideFunctionScope, PBShaderExp, TextureFormat } from '@zephyr3d/device';\r\nimport type { ShadowMapParams, ShadowMapType, ShadowMode } from './shadowmapper';\r\nimport { Vector4, type Nullable } from '@zephyr3d/base';\r\n\r\n/** @internal */\r\nexport abstract class ShadowImpl {\r\n protected _resourceDirty: boolean;\r\n constructor() {\r\n this._resourceDirty = true;\r\n }\r\n invalidateResource() {\r\n this._resourceDirty = true;\r\n }\r\n updateResources(shadowMapParams: ShadowMapParams) {\r\n this.doUpdateResources(shadowMapParams);\r\n }\r\n abstract getType(): ShadowMode;\r\n abstract getShadowMapBorder(shadowMapParams: ShadowMapParams): number;\r\n getShadowMapClearColor(shadowMapParams: ShadowMapParams) {\r\n const colorAttachment = shadowMapParams.shadowMapFramebuffer?.getColorAttachments()[0];\r\n return colorAttachment\r\n ? colorAttachment.isFloatFormat()\r\n ? new Vector4(1, 1, 1, 1)\r\n : new Vector4(0, 0, 0, 1)\r\n : null;\r\n }\r\n abstract getParams(out: Vector4): void;\r\n abstract getShadowMap(shadowMapParams: ShadowMapParams): ShadowMapType;\r\n abstract postRenderShadowMap(shadowMapParams: ShadowMapParams): void;\r\n abstract getDepthScale(): number;\r\n abstract setDepthScale(val: number): void;\r\n abstract resourceDirty(): boolean;\r\n abstract doUpdateResources(shadowMapParams: ShadowMapParams): void;\r\n abstract getShaderHash(): string;\r\n abstract computeShadowMapDepth(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadow(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp\r\n ): PBShaderExp;\r\n abstract computeShadowCSM(\r\n shadowMapParams: ShadowMapParams,\r\n scope: PBInsideFunctionScope,\r\n shadowVertex: PBShaderExp,\r\n NdotL: PBShaderExp,\r\n split: PBShaderExp\r\n ): PBShaderExp;\r\n abstract getShadowMapColorFormat(shadowMapParams: ShadowMapParams): Nullable<TextureFormat>;\r\n abstract getShadowMapDepthFormat(shadowMapParams: ShadowMapParams): TextureFormat;\r\n abstract useNativeShadowMap(shadowMapParams: ShadowMapParams): boolean;\r\n}\r\n"],"names":["ShadowImpl","_resourceDirty","invalidateResource","updateResources","shadowMapParams","doUpdateResources","getShadowMapClearColor","colorAttachment","shadowMapFramebuffer","getColorAttachments","isFloatFormat","Vector4"],"mappings":";;AAIA,iBACO,MAAeA,UAAAA,CAAAA;IACVC,cAAwB;IAClC,WAAc,EAAA;QACZ,IAAI,CAACA,cAAc,GAAG,IAAA;AACxB;IACAC,kBAAqB,GAAA;QACnB,IAAI,CAACD,cAAc,GAAG,IAAA;AACxB;AACAE,IAAAA,eAAAA,CAAgBC,eAAgC,EAAE;QAChD,IAAI,CAACC,iBAAiB,CAACD,eAAAA,CAAAA;AACzB;AAGAE,IAAAA,sBAAAA,CAAuBF,eAAgC,EAAE;AACvD,QAAA,MAAMG,kBAAkBH,eAAgBI,CAAAA,oBAAoB,EAAEC,mBAAAA,EAAqB,CAAC,CAAE,CAAA;AACtF,QAAA,OAAOF,eACHA,GAAAA,eAAAA,CAAgBG,aAAa,EAAA,GAC3B,IAAIC,OAAQ,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,KACrB,IAAIA,OAAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CACvB,CAAA,GAAA,IAAA;AACN;AA8BF;;;;"}