@zephyr3d/scene 0.9.19 → 0.9.21

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 (95) hide show
  1. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  2. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  3. package/dist/asset/assetmanager.js +1 -0
  4. package/dist/asset/assetmanager.js.map +1 -1
  5. package/dist/camera/camera.js +39 -0
  6. package/dist/camera/camera.js.map +1 -1
  7. package/dist/index.d.ts +190 -4
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/material/meshmaterial.js +2 -2
  11. package/dist/material/meshmaterial.js.map +1 -1
  12. package/dist/material/mixins/lit.js +10 -0
  13. package/dist/material/mixins/lit.js.map +1 -1
  14. package/dist/material/shader/helper.js +117 -2
  15. package/dist/material/shader/helper.js.map +1 -1
  16. package/dist/posteffect/skinsss.js +10 -10
  17. package/dist/posteffect/skinsss.js.map +1 -1
  18. package/dist/posteffect/ssr.js +13 -13
  19. package/dist/posteffect/ssr.js.map +1 -1
  20. package/dist/posteffect/sss.js +8 -7
  21. package/dist/posteffect/sss.js.map +1 -1
  22. package/dist/posteffect/tonemap.js +5 -5
  23. package/dist/posteffect/tonemap.js.map +1 -1
  24. package/dist/render/abuffer_oit.js +5 -0
  25. package/dist/render/abuffer_oit.js.map +1 -1
  26. package/dist/render/cluster_light.js +52 -8
  27. package/dist/render/cluster_light.js.map +1 -1
  28. package/dist/render/dualdepthpeeling_oit.js +331 -0
  29. package/dist/render/dualdepthpeeling_oit.js.map +1 -0
  30. package/dist/render/lightpass.js +29 -8
  31. package/dist/render/lightpass.js.map +1 -1
  32. package/dist/render/renderer.js +3 -0
  33. package/dist/render/renderer.js.map +1 -1
  34. package/dist/render/rendergraph/blackboard.js +40 -39
  35. package/dist/render/rendergraph/blackboard.js.map +1 -1
  36. package/dist/render/rendergraph/device_pool_allocator.js +10 -1
  37. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  38. package/dist/render/rendergraph/forward_plus_builder.js +75 -4
  39. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  40. package/dist/render/rendergraph/types.js.map +1 -1
  41. package/dist/render/renderpass.js +12 -2
  42. package/dist/render/renderpass.js.map +1 -1
  43. package/dist/render/shadow_mask_pass.js +297 -0
  44. package/dist/render/shadow_mask_pass.js.map +1 -0
  45. package/dist/render/weightedblended_oit.js +5 -0
  46. package/dist/render/weightedblended_oit.js.map +1 -1
  47. package/dist/scene/basesprite.js +1 -0
  48. package/dist/scene/basesprite.js.map +1 -1
  49. package/dist/scene/batchgroup.js +1 -0
  50. package/dist/scene/batchgroup.js.map +1 -1
  51. package/dist/scene/environment.js +1 -0
  52. package/dist/scene/environment.js.map +1 -1
  53. package/dist/scene/msdftext.js +1 -0
  54. package/dist/scene/msdftext.js.map +1 -1
  55. package/dist/scene/msdftextsprite.js +1 -0
  56. package/dist/scene/msdftextsprite.js.map +1 -1
  57. package/dist/scene/particlesys.js +1 -0
  58. package/dist/scene/particlesys.js.map +1 -1
  59. package/dist/scene/scene.js +1 -0
  60. package/dist/scene/scene.js.map +1 -1
  61. package/dist/scene/terrain-cm/grass.js +1 -0
  62. package/dist/scene/terrain-cm/grass.js.map +1 -1
  63. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  64. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  65. package/dist/scene/water.js +1 -0
  66. package/dist/scene/water.js.map +1 -1
  67. package/dist/utility/serialization/manager.js +1 -0
  68. package/dist/utility/serialization/manager.js.map +1 -1
  69. package/dist/utility/serialization/scene/animation.js +1 -0
  70. package/dist/utility/serialization/scene/animation.js.map +1 -1
  71. package/dist/utility/serialization/scene/batch.js +1 -0
  72. package/dist/utility/serialization/scene/batch.js.map +1 -1
  73. package/dist/utility/serialization/scene/camera.js +35 -2
  74. package/dist/utility/serialization/scene/camera.js.map +1 -1
  75. package/dist/utility/serialization/scene/light.js +1 -0
  76. package/dist/utility/serialization/scene/light.js.map +1 -1
  77. package/dist/utility/serialization/scene/mesh.js +1 -0
  78. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  79. package/dist/utility/serialization/scene/node.js +1 -0
  80. package/dist/utility/serialization/scene/node.js.map +1 -1
  81. package/dist/utility/serialization/scene/particle.js +1 -0
  82. package/dist/utility/serialization/scene/particle.js.map +1 -1
  83. package/dist/utility/serialization/scene/primitive.js +1 -0
  84. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  85. package/dist/utility/serialization/scene/sprite.js +1 -0
  86. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  87. package/dist/utility/serialization/scene/terrain.js +1 -0
  88. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  89. package/dist/utility/serialization/scene/text.js +1 -0
  90. package/dist/utility/serialization/scene/text.js.map +1 -1
  91. package/dist/utility/serialization/scene/water.js +1 -0
  92. package/dist/utility/serialization/scene/water.js.map +1 -1
  93. package/dist/values.js +11 -1
  94. package/dist/values.js.map +1 -1
  95. package/package.json +2 -2
@@ -2,15 +2,15 @@ import { AbstractPostEffect, PostEffectLayer } from './posteffect.js';
2
2
  import { linearToGamma } from '../shaders/misc.js';
3
3
  import { fetchSampler } from '../utility/misc.js';
4
4
 
5
- /**
6
- * The tonemap post effect
7
- * @public
5
+ /**
6
+ * The tonemap post effect
7
+ * @public
8
8
  */ class Tonemap extends AbstractPostEffect {
9
9
  static _programTonemap = null;
10
10
  static _bindgroupTonemap = null;
11
11
  _exposure;
12
- /**
13
- * Creates an instance of tonemap post effect
12
+ /**
13
+ * Creates an instance of tonemap post effect
14
14
  */ constructor(){
15
15
  super();
16
16
  this._layer = PostEffectLayer.transparent;
@@ -1 +1 @@
1
- {"version":3,"file":"tonemap.js","sources":["../../src/posteffect/tonemap.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\nimport { linearToGamma } from '../shaders/misc';\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\nimport type { DrawContext } from '../render';\nimport { fetchSampler } from '../utility/misc';\nimport type { Nullable } from '@zephyr3d/base';\n\n/**\n * The tonemap post effect\n * @public\n */\nexport class Tonemap extends AbstractPostEffect {\n private static _programTonemap: Nullable<GPUProgram> = null;\n private static _bindgroupTonemap: Nullable<BindGroup> = null;\n private _exposure: number;\n /**\n * Creates an instance of tonemap post effect\n */\n constructor() {\n super();\n this._layer = PostEffectLayer.transparent;\n this._exposure = 1;\n }\n /** Exposure value */\n get exposure() {\n return this._exposure;\n }\n set exposure(val) {\n this._exposure = val;\n }\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\n requireLinearDepthTexture() {\n return false;\n }\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\n requireDepthAttachment() {\n return false;\n }\n /** {@inheritDoc AbstractPostEffect.apply} */\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\n const device = ctx.device;\n this._prepare(device, inputColorTexture);\n this._tonemap(device, inputColorTexture, srgbOutput);\n }\n /** @internal */\n private _tonemap(device: AbstractDevice, inputColorTexture: Texture2D, sRGBOutput: boolean) {\n Tonemap._bindgroupTonemap!.setValue('srgbOut', sRGBOutput ? 1 : 0);\n Tonemap._bindgroupTonemap!.setValue('exposure', this._exposure);\n Tonemap._bindgroupTonemap!.setValue('flip', this.needFlip(device) ? 1 : 0);\n Tonemap._bindgroupTonemap!.setTexture('tex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\n device.setProgram(Tonemap._programTonemap);\n device.setBindGroup(0, Tonemap._bindgroupTonemap!);\n this.drawFullscreenQuad();\n }\n /** @internal */\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\n if (!Tonemap._programTonemap) {\n Tonemap._programTonemap = device.buildRenderProgram({\n vertex(pb) {\n this.flip = pb.int().uniform(0);\n this.$inputs.pos = pb.vec2().attrib('position');\n this.$outputs.uv = pb.vec2();\n pb.main(function () {\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\n this.$if(pb.notEqual(this.flip, 0), function () {\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\n });\n });\n },\n fragment(pb) {\n this.srgbOut = pb.int().uniform(0);\n this.exposure = pb.float().uniform(0);\n this.tex = pb.tex2D().uniform(0);\n this.$outputs.outColor = pb.vec4();\n pb.func('RRTAndODTFit', [pb.vec3('v')], function () {\n this.$l.a = pb.sub(pb.mul(this.v, pb.add(this.v, pb.vec3(0.0245786))), pb.vec3(0.000090537));\n this.$l.b = pb.add(\n pb.mul(this.v, pb.add(pb.mul(this.v, 0.983729), pb.vec3(0.432951))),\n pb.vec3(0.238081)\n );\n this.$return(pb.div(this.a, this.b));\n });\n pb.main(function () {\n this.$l.vSample = pb.textureSample(this.tex, this.$inputs.uv);\n this.$l.ACESInputMat = pb.mat3(\n 0.59719,\n 0.076,\n 0.0284,\n 0.35458,\n 0.90834,\n 0.13383,\n 0.04823,\n 0.01566,\n 0.83777\n );\n this.$l.ACESOutputMat = pb.mat3(\n 1.60475,\n -0.10208,\n -0.00327,\n -0.53108,\n 1.10813,\n -0.07276,\n -0.07367,\n -0.00605,\n 1.07602\n );\n this.$l.color = pb.mul(this.vSample.rgb, pb.div(this.exposure, 0.6));\n this.color = pb.mul(this.ACESInputMat, this.color);\n this.color = this.RRTAndODTFit(this.color);\n this.color = pb.mul(this.ACESOutputMat, this.color);\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\n this.color = linearToGamma(this, this.color);\n });\n this.$outputs.outColor = pb.vec4(this.color, 1);\n });\n }\n })!;\n Tonemap._programTonemap.name = '@Tonemap';\n Tonemap._bindgroupTonemap = device.createBindGroup(Tonemap._programTonemap.bindGroupLayouts[0]);\n }\n }\n}\n"],"names":["Tonemap","AbstractPostEffect","_programTonemap","_bindgroupTonemap","_exposure","_layer","PostEffectLayer","transparent","exposure","val","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","_prepare","_tonemap","sRGBOutput","setValue","needFlip","setTexture","fetchSampler","setProgram","setBindGroup","drawFullscreenQuad","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srgbOut","float","tex","tex2D","outColor","func","vec3","$l","a","sub","v","b","$return","div","vSample","textureSample","ACESInputMat","mat3","ACESOutputMat","color","rgb","RRTAndODTFit","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
1
+ {"version":3,"file":"tonemap.js","sources":["../../src/posteffect/tonemap.ts"],"sourcesContent":["import { AbstractPostEffect, PostEffectLayer } from './posteffect';\r\nimport { linearToGamma } from '../shaders/misc';\r\nimport type { AbstractDevice, BindGroup, GPUProgram, Texture2D } from '@zephyr3d/device';\r\nimport type { DrawContext } from '../render';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * The tonemap post effect\r\n * @public\r\n */\r\nexport class Tonemap extends AbstractPostEffect {\r\n private static _programTonemap: Nullable<GPUProgram> = null;\r\n private static _bindgroupTonemap: Nullable<BindGroup> = null;\r\n private _exposure: number;\r\n /**\r\n * Creates an instance of tonemap post effect\r\n */\r\n constructor() {\r\n super();\r\n this._layer = PostEffectLayer.transparent;\r\n this._exposure = 1;\r\n }\r\n /** Exposure value */\r\n get exposure() {\r\n return this._exposure;\r\n }\r\n set exposure(val) {\r\n this._exposure = val;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireLinearDepthTexture} */\r\n requireLinearDepthTexture() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.requireDepthAttachment} */\r\n requireDepthAttachment() {\r\n return false;\r\n }\r\n /** {@inheritDoc AbstractPostEffect.apply} */\r\n apply(ctx: DrawContext, inputColorTexture: Texture2D, sceneDepthTexture: Texture2D, srgbOutput: boolean) {\r\n const device = ctx.device;\r\n this._prepare(device, inputColorTexture);\r\n this._tonemap(device, inputColorTexture, srgbOutput);\r\n }\r\n /** @internal */\r\n private _tonemap(device: AbstractDevice, inputColorTexture: Texture2D, sRGBOutput: boolean) {\r\n Tonemap._bindgroupTonemap!.setValue('srgbOut', sRGBOutput ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setValue('exposure', this._exposure);\r\n Tonemap._bindgroupTonemap!.setValue('flip', this.needFlip(device) ? 1 : 0);\r\n Tonemap._bindgroupTonemap!.setTexture('tex', inputColorTexture, fetchSampler('clamp_nearest_nomip'));\r\n device.setProgram(Tonemap._programTonemap);\r\n device.setBindGroup(0, Tonemap._bindgroupTonemap!);\r\n this.drawFullscreenQuad();\r\n }\r\n /** @internal */\r\n private _prepare(device: AbstractDevice, _srcTexture: Texture2D) {\r\n if (!Tonemap._programTonemap) {\r\n Tonemap._programTonemap = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.flip = pb.int().uniform(0);\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 0, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n this.$if(pb.notEqual(this.flip, 0), function () {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n });\r\n });\r\n },\r\n fragment(pb) {\r\n this.srgbOut = pb.int().uniform(0);\r\n this.exposure = pb.float().uniform(0);\r\n this.tex = pb.tex2D().uniform(0);\r\n this.$outputs.outColor = pb.vec4();\r\n pb.func('RRTAndODTFit', [pb.vec3('v')], function () {\r\n this.$l.a = pb.sub(pb.mul(this.v, pb.add(this.v, pb.vec3(0.0245786))), pb.vec3(0.000090537));\r\n this.$l.b = pb.add(\r\n pb.mul(this.v, pb.add(pb.mul(this.v, 0.983729), pb.vec3(0.432951))),\r\n pb.vec3(0.238081)\r\n );\r\n this.$return(pb.div(this.a, this.b));\r\n });\r\n pb.main(function () {\r\n this.$l.vSample = pb.textureSample(this.tex, this.$inputs.uv);\r\n this.$l.ACESInputMat = pb.mat3(\r\n 0.59719,\r\n 0.076,\r\n 0.0284,\r\n 0.35458,\r\n 0.90834,\r\n 0.13383,\r\n 0.04823,\r\n 0.01566,\r\n 0.83777\r\n );\r\n this.$l.ACESOutputMat = pb.mat3(\r\n 1.60475,\r\n -0.10208,\r\n -0.00327,\r\n -0.53108,\r\n 1.10813,\r\n -0.07276,\r\n -0.07367,\r\n -0.00605,\r\n 1.07602\r\n );\r\n this.$l.color = pb.mul(this.vSample.rgb, pb.div(this.exposure, 0.6));\r\n this.color = pb.mul(this.ACESInputMat, this.color);\r\n this.color = this.RRTAndODTFit(this.color);\r\n this.color = pb.mul(this.ACESOutputMat, this.color);\r\n this.color = pb.clamp(this.color, pb.vec3(0), pb.vec3(1));\r\n this.$if(pb.notEqual(this.srgbOut, 0), function () {\r\n this.color = linearToGamma(this, this.color);\r\n });\r\n this.$outputs.outColor = pb.vec4(this.color, 1);\r\n });\r\n }\r\n })!;\r\n Tonemap._programTonemap.name = '@Tonemap';\r\n Tonemap._bindgroupTonemap = device.createBindGroup(Tonemap._programTonemap.bindGroupLayouts[0]);\r\n }\r\n }\r\n}\r\n"],"names":["Tonemap","AbstractPostEffect","_programTonemap","_bindgroupTonemap","_exposure","_layer","PostEffectLayer","transparent","exposure","val","requireLinearDepthTexture","requireDepthAttachment","apply","ctx","inputColorTexture","sceneDepthTexture","srgbOutput","device","_prepare","_tonemap","sRGBOutput","setValue","needFlip","setTexture","fetchSampler","setProgram","setBindGroup","drawFullscreenQuad","_srcTexture","buildRenderProgram","vertex","pb","flip","int","uniform","$inputs","pos","vec2","attrib","$outputs","uv","main","$builtins","position","vec4","add","mul","xy","$if","notEqual","y","neg","fragment","srgbOut","float","tex","tex2D","outColor","func","vec3","$l","a","sub","v","b","$return","div","vSample","textureSample","ACESInputMat","mat3","ACESOutputMat","color","rgb","RRTAndODTFit","clamp","linearToGamma","name","createBindGroup","bindGroupLayouts"],"mappings":"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"}
@@ -88,6 +88,11 @@ import '../utility/blueprint/material/texture.js';
88
88
  return ABufferOIT.usePremultipliedAlpha;
89
89
  }
90
90
  /**
91
+ * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}
92
+ */ wantsAdditiveLightPassAlpha() {
93
+ return true;
94
+ }
95
+ /**
91
96
  * {@inheritDoc OIT.begin}
92
97
  */ begin(ctx) {
93
98
  const device = ctx.device;
@@ -1 +1 @@
1
- {"version":3,"file":"abuffer_oit.js","sources":["../../src/render/abuffer_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceViewport,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { ShaderHelper } from '../material';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * per-pixel linked list OIT renderer using ABuffer.\r\n *\r\n * @remarks\r\n * The ABuffer OIT renderer only supports WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class ABufferOIT extends Disposable implements OIT {\r\n /** Type name of ABufferOIT */\r\n public static readonly type = 'ab';\r\n public static readonly usePremultipliedAlpha = true;\r\n private static readonly MAX_FRAGMENT_LAYERS = 75;\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private static _compositeAdditiveRenderStates: Nullable<RenderStateSet> = null;\r\n private static _ubAlignment = 0;\r\n private _nodeBuffer: Nullable<GPUDataBuffer>;\r\n private _headStagingBuffer: Nullable<GPUDataBuffer>;\r\n private _headBuffer: Nullable<GPUDataBuffer>;\r\n private _scissorOffsetBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _numLayers: number;\r\n private _screenSize: Uint32Array<ArrayBuffer>;\r\n private _hash: Nullable<string>;\r\n private readonly _debug: boolean;\r\n private _scissorSlices: number;\r\n private _scissorHeight: number;\r\n private _currentPass: number;\r\n private _savedScissor: Nullable<DeviceViewport>;\r\n private _singleColorFramebuffer: Nullable<FrameBuffer>;\r\n /**\r\n * Creates an instance of ABufferOIT class\r\n *\r\n * @param numLayers - How many transparent layers, default is 16\r\n */\r\n constructor(numLayers = 16) {\r\n super();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer = null;\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer = null;\r\n this._numLayers = numLayers;\r\n this._screenSize = new Uint32Array([0xffffffff, 0xffffffff]);\r\n this._hash = null;\r\n this._debug = false;\r\n this._scissorSlices = 0;\r\n this._scissorHeight = 0;\r\n this._savedScissor = null;\r\n this._currentPass = 0;\r\n this._singleColorFramebuffer = null;\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return ABufferOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n return deviceType === 'webgpu';\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return ABufferOIT.usePremultipliedAlpha;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._savedScissor = device.getScissor();\r\n const ubAlignment = (ABufferOIT._ubAlignment =\r\n device.getDeviceCaps().shaderCaps.uniformBufferOffsetAlignment);\r\n const viewport = device.getViewport();\r\n const screenWidth = device.screenXToDevice(viewport.width);\r\n const screenHeight = device.screenYToDevice(Math.max(viewport.height, 1));\r\n if (screenWidth !== this._screenSize[0] || screenHeight !== this._screenSize[1]) {\r\n // Resize buffers if viewport was changed\r\n this._screenSize[0] = screenWidth;\r\n this._screenSize[1] = screenHeight;\r\n // compute scissor slices\r\n const maxBufferSize = device.getDeviceCaps().shaderCaps.maxStorageBufferSize;\r\n const bytesPerLine = screenWidth * 4 * 4 * this._numLayers;\r\n this._scissorHeight = (maxBufferSize / bytesPerLine) >> 0;\r\n this._scissorSlices = Math.ceil(screenHeight / this._scissorHeight);\r\n const offsetBufferSize = ubAlignment * this._scissorSlices;\r\n const offsetBuffer = new Uint32Array(offsetBufferSize >> 2);\r\n for (let i = 0; i < this._scissorSlices; i++) {\r\n offsetBuffer[i * (ubAlignment >> 2)] = i * this._scissorHeight;\r\n }\r\n if (!this._scissorOffsetBuffer || this._scissorOffsetBuffer.byteLength < offsetBuffer.byteLength) {\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = device.createBuffer(offsetBuffer.byteLength, { usage: 'uniform' });\r\n }\r\n this._scissorOffsetBuffer.bufferSubData(0, offsetBuffer);\r\n // resize node buffer\r\n const size = screenWidth * this._scissorHeight * 4;\r\n const nodeBufferSize = size * 4 * this._numLayers;\r\n if (!this._nodeBuffer || nodeBufferSize > this._nodeBuffer.byteLength) {\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = device.createBuffer(nodeBufferSize, { storage: true, usage: 'uniform' });\r\n }\r\n // resize head buffer\r\n const headBufferSize = size + 4;\r\n if (!this._headBuffer || headBufferSize > this._headBuffer.byteLength) {\r\n this._headBuffer?.dispose();\r\n this._headBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n const tmpArray = new Uint32Array(headBufferSize >> 2);\r\n tmpArray.fill(0xffffffff);\r\n this._headStagingBuffer.bufferSubData(0, tmpArray);\r\n }\r\n }\r\n return this._scissorSlices;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n // Restore scissor rect\r\n ctx.device.setScissor(this._savedScissor);\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.Z_AB_scissorOffset = pb.uint().uniformBuffer(2);\r\n scope.Z_AB_nodeBuffer = pb.uvec4[0]().storageBuffer(2);\r\n scope.Z_AB_headImage = pb.atomic_uint[0]().storageBuffer(2);\r\n scope.Z_AB_screenSize = pb.uint().uniform(2);\r\n // Read with textureLoad only\r\n scope.Z_AB_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n scope.$outputs.outColor = pb.vec4();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const device = ctx.device;\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n this._singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (this._singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n const scissorY = pass * this._scissorHeight;\r\n const scissorH =\r\n Math.min((pass + 1) * this._scissorHeight, this._screenSize[1]) - pass * this._scissorHeight;\r\n device.setScissor([\r\n 0,\r\n device.deviceYToScreen(this._screenSize[1] - scissorY - scissorH),\r\n device.deviceXToScreen(this._screenSize[0]),\r\n device.deviceYToScreen(scissorH)\r\n ]);\r\n device.copyBuffer(this._headStagingBuffer!, this._headBuffer!, 0, 0, this._headStagingBuffer!.byteLength);\r\n // Update render hash\r\n this._hash = `${this.getType()}#${this._nodeBuffer!.uid}#${this._headBuffer!.uid}#${\r\n this._scissorOffsetBuffer!.uid\r\n }#${pass}`;\r\n if (this._debug) {\r\n const data = new Uint8Array(this._headBuffer!.byteLength);\r\n const readBuffer = device.createBuffer(this._headBuffer!.byteLength, { usage: 'read' });\r\n device.copyBuffer(this._headBuffer!, readBuffer, 0, 0, this._headBuffer!.byteLength);\r\n readBuffer.getBufferSubData(data).then(() => {\r\n const uint = new Uint32Array(data.buffer);\r\n for (let i = 0; i < uint.length; i++) {\r\n if (uint[i] !== 0xffffffff) {\r\n console.error('Clear head buffer failed');\r\n break;\r\n }\r\n }\r\n readBuffer.dispose();\r\n });\r\n }\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, pass: number) {\r\n const device = ctx.device;\r\n ABufferOIT.getCompositeProgram(device);\r\n const lastBindGroup = device.getBindGroup(0);\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n !this._singleColorFramebuffer &&\r\n currentFramebuffer &&\r\n currentFramebuffer.getColorAttachments().length > 1 &&\r\n colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(ABufferOIT.getCompositeProgram(device));\r\n const bindGroup = ABufferOIT._compositeBindGroup!;\r\n bindGroup.setBuffer(\r\n 'scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n pass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('headBuffer', this._headBuffer!);\r\n bindGroup.setBuffer('nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setValue('screenWidth', this._screenSize[0]);\r\n bindGroup.setValue('additiveOnly', ctx.lightBlending ? 1 : 0);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(\r\n ctx.lightBlending ? ABufferOIT._compositeAdditiveRenderStates! : ABufferOIT._compositeRenderStates!\r\n );\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n } else if (this._singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(this._singleColorFramebuffer);\r\n this._singleColorFramebuffer = null;\r\n } else {\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash!;\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(ctx: DrawContext, bindGroup: BindGroup) {\r\n bindGroup.setBuffer('Z_AB_nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setBuffer(\r\n 'Z_AB_scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n this._currentPass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('Z_AB_headImage', this._headBuffer!);\r\n bindGroup.setValue('Z_AB_screenSize', this._screenSize[0]);\r\n bindGroup.setTexture('Z_AB_depthTexture', ctx.linearDepthTexture!);\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n // linear depth of current fragment\r\n scope.$l.fragDepth = ShaderHelper.nonLinearDepthToLinearNormalized(scope, scope.$builtins.fragCoord.z);\r\n // linear depth in depth texture\r\n scope.$l.linearDepth = pb.textureLoad(\r\n scope.Z_AB_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).r;\r\n // saved to buffer only if nothing is infront\r\n scope.$if(pb.lessThan(scope.fragDepth, scope.linearDepth), function () {\r\n this.$l.Z_AB_pixelCount = pb.atomicAdd(this.Z_AB_headImage.at(0), 1);\r\n this.$l.Z_AB_nodeOffset = this.Z_AB_pixelCount;\r\n // save if index not exceeded\r\n this.$if(pb.lessThan(this.Z_AB_nodeOffset, pb.arrayLength(this.Z_AB_nodeBuffer)), function () {\r\n this.$l.Z_AB_headOffset = pb.add(\r\n pb.mul(this.Z_AB_screenSize, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.Z_AB_scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n this.$l.Z_AB_oldHead = pb.atomicExchange(\r\n this.Z_AB_headImage.at(pb.add(this.Z_AB_headOffset, 1)),\r\n this.Z_AB_nodeOffset\r\n );\r\n this.$l.Z_AB_colorScale = pb.floatBitsToUint(pb.length(color.rgb));\r\n this.$l.Z_AB_color = pb.pack4x8unorm(pb.vec4(pb.normalize(color.rgb), pb.clamp(color.a, 0, 1)));\r\n this.$l.Z_AB_depth = pb.floatBitsToUint(this.fragDepth);\r\n this.Z_AB_nodeBuffer.setAt(\r\n this.Z_AB_nodeOffset,\r\n pb.uvec4(this.Z_AB_color, this.Z_AB_colorScale, this.Z_AB_depth, this.Z_AB_oldHead)\r\n );\r\n pb.discard();\r\n });\r\n });\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const stencilStates = rs.useStencilState();\r\n stencilStates.enable(true);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(1);\r\n stencilStates.setReadMask(0xff);\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.scissorOffset = pb.uint().uniformBuffer(0);\r\n this.headBuffer = pb.uint[0]().storageBuffer(0);\r\n this.nodeBuffer = pb.uvec4[0]().storageBuffer(0);\r\n this.screenWidth = pb.uint().uniform(0);\r\n this.additiveOnly = pb.int().uniform(0);\r\n pb.func('unpackColor', [pb.uvec4('x')], function () {\r\n this.$l.colorNorm = pb.unpack4x8unorm(this.x.x);\r\n this.$l.colorScale = pb.uintBitsToFloat(this.x.y);\r\n this.$return(pb.vec4(pb.mul(this.colorNorm.rgb, this.colorScale), this.colorNorm.a));\r\n });\r\n pb.main(function () {\r\n this.$l.fragmentArray = pb.uvec4[ABufferOIT.MAX_FRAGMENT_LAYERS]();\r\n this.$l.fragmentArrayLen = pb.uint(0);\r\n this.$l.offset = pb.add(\r\n pb.mul(this.screenWidth, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n //this.$l.head = this.headBuffer.at(this.offset);\r\n this.$l.head = this.headBuffer.at(pb.add(this.offset, 1));\r\n this.$while(\r\n pb.and(\r\n pb.lessThan(this.fragmentArrayLen, ABufferOIT.MAX_FRAGMENT_LAYERS),\r\n pb.notEqual(this.head, 0xffffffff)\r\n ),\r\n function () {\r\n this.fragmentArray.setAt(this.fragmentArrayLen, this.nodeBuffer.at(this.head));\r\n this.head = this.fragmentArray.at(this.fragmentArrayLen).w;\r\n this.fragmentArrayLen = pb.add(this.fragmentArrayLen, 1);\r\n }\r\n );\r\n this.$if(pb.equal(this.fragmentArrayLen, 0), function () {\r\n this.$outputs.outColor = pb.vec4(0, 0, 0, 1);\r\n }).$else(function () {\r\n // bubble sort\r\n this.$for(pb.uint('i'), 0, pb.sub(this.fragmentArrayLen, 1), function () {\r\n this.$for(pb.uint('j'), 0, pb.sub(pb.sub(this.fragmentArrayLen, 1), this.i), function () {\r\n this.$l.a = this.fragmentArray.at(this.j);\r\n this.$l.b = this.fragmentArray.at(pb.add(this.j, 1));\r\n this.$if(pb.greaterThan(this.a.z, this.b.z), function () {\r\n this.fragmentArray.setAt(this.j, this.b);\r\n this.fragmentArray.setAt(pb.add(this.j, 1), this.a);\r\n });\r\n });\r\n });\r\n // under operator blending\r\n this.$l.c0 = this.unpackColor(this.fragmentArray[0]);\r\n this.$l.c_dst = ABufferOIT.usePremultipliedAlpha ? this.c0.rgb : pb.mul(this.c0.rgb, this.c0.a);\r\n this.$l.a_dst = pb.sub(1, this.c0.a);\r\n this.$for(pb.uint('i'), 1, this.fragmentArrayLen, function () {\r\n this.$l.c = this.unpackColor(this.fragmentArray.at(this.i));\r\n if (ABufferOIT.usePremultipliedAlpha) {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.a_dst));\r\n } else {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.c.a, this.a_dst));\r\n }\r\n this.a_dst = pb.mul(this.a_dst, pb.sub(1, this.c.a));\r\n });\r\n this.$outputs.outColor = pb.vec4(\r\n this.c_dst,\r\n pb.equal(this.additiveOnly, 0) ? this.a_dst : pb.float(0)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@ABufferOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._compositeAdditiveRenderStates = device.createRenderStateSet();\r\n this._compositeAdditiveRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeAdditiveRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n const stencilStates = this._compositeRenderStates.useStencilState();\r\n stencilStates.enable(false);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(0);\r\n stencilStates.setReadMask(0xff);\r\n const additiveStencilStates = this._compositeAdditiveRenderStates.useStencilState();\r\n additiveStencilStates.enable(false);\r\n additiveStencilStates.setFrontCompareFunc('always');\r\n additiveStencilStates.setBackCompareFunc('always');\r\n additiveStencilStates.setFrontOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setBackOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setReference(0);\r\n additiveStencilStates.setReadMask(0xff);\r\n }\r\n return this._compositeProgram;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = null;\r\n this._headBuffer?.dispose();\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = null;\r\n this._hash = null;\r\n this._savedScissor = null;\r\n }\r\n}\r\n"],"names":["ABufferOIT","Disposable","type","usePremultipliedAlpha","MAX_FRAGMENT_LAYERS","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_compositeAdditiveRenderStates","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","_singleColorFramebuffer","numLayers","Uint32Array","getType","supportDevice","deviceType","wantsPremultipliedAlpha","begin","ctx","device","getScissor","ubAlignment","getDeviceCaps","shaderCaps","uniformBufferOffsetAlignment","viewport","getViewport","screenWidth","screenXToDevice","width","screenHeight","screenYToDevice","Math","max","height","maxBufferSize","maxStorageBufferSize","bytesPerLine","ceil","offsetBufferSize","offsetBuffer","i","byteLength","dispose","createBuffer","usage","bufferSubData","size","nodeBufferSize","storage","headBufferSize","tmpArray","fill","end","setScissor","setupFragmentOutput","scope","pb","$builder","Z_AB_scissorOffset","uint","uniformBuffer","Z_AB_nodeBuffer","uvec4","storageBuffer","Z_AB_headImage","atomic_uint","Z_AB_screenSize","uniform","Z_AB_depthTexture","tex2D","noSampler","$outputs","outColor","vec4","beginPass","pass","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","length","pool","fetchTemporalFramebuffer","getDepthAttachment","scissor","pushDeviceStates","setFramebuffer","setViewport","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","singleColorFramebuffer","setProgram","bindGroup","setBuffer","setValue","lightBlending","setBindGroup","drawFullscreenQuad","popDeviceStates","releaseFrameBuffer","calculateHash","applyUniforms","setTexture","linearDepthTexture","outputFragmentColor","color","$l","fragDepth","ShaderHelper","nonLinearDepthToLinearNormalized","$builtins","fragCoord","z","linearDepth","textureLoad","ivec2","xy","r","$if","lessThan","Z_AB_pixelCount","atomicAdd","at","Z_AB_nodeOffset","arrayLength","Z_AB_headOffset","add","mul","sub","y","x","Z_AB_oldHead","atomicExchange","Z_AB_colorScale","floatBitsToUint","rgb","Z_AB_color","pack4x8unorm","normalize","clamp","a","Z_AB_depth","setAt","discard","setRenderStates","rs","stencilStates","useStencilState","enable","setFrontCompareFunc","setBackCompareFunc","setFrontOp","setBackOp","setReference","setReadMask","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","neg","fragment","scissorOffset","headBuffer","nodeBuffer","additiveOnly","int","func","colorNorm","unpack4x8unorm","colorScale","uintBitsToFloat","$return","fragmentArray","fragmentArrayLen","offset","head","$while","and","notEqual","w","equal","$else","$for","j","b","greaterThan","c0","unpackColor","c_dst","a_dst","c","float","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","additiveStencilStates","onDispose"],"mappings":"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"}
1
+ {"version":3,"file":"abuffer_oit.js","sources":["../../src/render/abuffer_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceViewport,\r\n FrameBuffer,\r\n GPUDataBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet\r\n} from '@zephyr3d/device';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { ShaderHelper } from '../material';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable } from '@zephyr3d/base';\r\n\r\n/**\r\n * per-pixel linked list OIT renderer using ABuffer.\r\n *\r\n * @remarks\r\n * The ABuffer OIT renderer only supports WebGPU device.\r\n *\r\n * @public\r\n */\r\nexport class ABufferOIT extends Disposable implements OIT {\r\n /** Type name of ABufferOIT */\r\n public static readonly type = 'ab';\r\n public static readonly usePremultipliedAlpha = true;\r\n private static readonly MAX_FRAGMENT_LAYERS = 75;\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private static _compositeAdditiveRenderStates: Nullable<RenderStateSet> = null;\r\n private static _ubAlignment = 0;\r\n private _nodeBuffer: Nullable<GPUDataBuffer>;\r\n private _headStagingBuffer: Nullable<GPUDataBuffer>;\r\n private _headBuffer: Nullable<GPUDataBuffer>;\r\n private _scissorOffsetBuffer: Nullable<GPUDataBuffer>;\r\n private readonly _numLayers: number;\r\n private _screenSize: Uint32Array<ArrayBuffer>;\r\n private _hash: Nullable<string>;\r\n private readonly _debug: boolean;\r\n private _scissorSlices: number;\r\n private _scissorHeight: number;\r\n private _currentPass: number;\r\n private _savedScissor: Nullable<DeviceViewport>;\r\n private _singleColorFramebuffer: Nullable<FrameBuffer>;\r\n /**\r\n * Creates an instance of ABufferOIT class\r\n *\r\n * @param numLayers - How many transparent layers, default is 16\r\n */\r\n constructor(numLayers = 16) {\r\n super();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer = null;\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer = null;\r\n this._numLayers = numLayers;\r\n this._screenSize = new Uint32Array([0xffffffff, 0xffffffff]);\r\n this._hash = null;\r\n this._debug = false;\r\n this._scissorSlices = 0;\r\n this._scissorHeight = 0;\r\n this._savedScissor = null;\r\n this._currentPass = 0;\r\n this._singleColorFramebuffer = null;\r\n }\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return ABufferOIT.type;\r\n }\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n return deviceType === 'webgpu';\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return ABufferOIT.usePremultipliedAlpha;\r\n }\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n const device = ctx.device;\r\n this._savedScissor = device.getScissor();\r\n const ubAlignment = (ABufferOIT._ubAlignment =\r\n device.getDeviceCaps().shaderCaps.uniformBufferOffsetAlignment);\r\n const viewport = device.getViewport();\r\n const screenWidth = device.screenXToDevice(viewport.width);\r\n const screenHeight = device.screenYToDevice(Math.max(viewport.height, 1));\r\n if (screenWidth !== this._screenSize[0] || screenHeight !== this._screenSize[1]) {\r\n // Resize buffers if viewport was changed\r\n this._screenSize[0] = screenWidth;\r\n this._screenSize[1] = screenHeight;\r\n // compute scissor slices\r\n const maxBufferSize = device.getDeviceCaps().shaderCaps.maxStorageBufferSize;\r\n const bytesPerLine = screenWidth * 4 * 4 * this._numLayers;\r\n this._scissorHeight = (maxBufferSize / bytesPerLine) >> 0;\r\n this._scissorSlices = Math.ceil(screenHeight / this._scissorHeight);\r\n const offsetBufferSize = ubAlignment * this._scissorSlices;\r\n const offsetBuffer = new Uint32Array(offsetBufferSize >> 2);\r\n for (let i = 0; i < this._scissorSlices; i++) {\r\n offsetBuffer[i * (ubAlignment >> 2)] = i * this._scissorHeight;\r\n }\r\n if (!this._scissorOffsetBuffer || this._scissorOffsetBuffer.byteLength < offsetBuffer.byteLength) {\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = device.createBuffer(offsetBuffer.byteLength, { usage: 'uniform' });\r\n }\r\n this._scissorOffsetBuffer.bufferSubData(0, offsetBuffer);\r\n // resize node buffer\r\n const size = screenWidth * this._scissorHeight * 4;\r\n const nodeBufferSize = size * 4 * this._numLayers;\r\n if (!this._nodeBuffer || nodeBufferSize > this._nodeBuffer.byteLength) {\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = device.createBuffer(nodeBufferSize, { storage: true, usage: 'uniform' });\r\n }\r\n // resize head buffer\r\n const headBufferSize = size + 4;\r\n if (!this._headBuffer || headBufferSize > this._headBuffer.byteLength) {\r\n this._headBuffer?.dispose();\r\n this._headBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = device.createBuffer(headBufferSize, { storage: true, usage: 'uniform' });\r\n const tmpArray = new Uint32Array(headBufferSize >> 2);\r\n tmpArray.fill(0xffffffff);\r\n this._headStagingBuffer.bufferSubData(0, tmpArray);\r\n }\r\n }\r\n return this._scissorSlices;\r\n }\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n // Restore scissor rect\r\n ctx.device.setScissor(this._savedScissor);\r\n }\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.Z_AB_scissorOffset = pb.uint().uniformBuffer(2);\r\n scope.Z_AB_nodeBuffer = pb.uvec4[0]().storageBuffer(2);\r\n scope.Z_AB_headImage = pb.atomic_uint[0]().storageBuffer(2);\r\n scope.Z_AB_screenSize = pb.uint().uniform(2);\r\n // Read with textureLoad only\r\n scope.Z_AB_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n scope.$outputs.outColor = pb.vec4();\r\n }\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const device = ctx.device;\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n this._singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (this._singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n const scissorY = pass * this._scissorHeight;\r\n const scissorH =\r\n Math.min((pass + 1) * this._scissorHeight, this._screenSize[1]) - pass * this._scissorHeight;\r\n device.setScissor([\r\n 0,\r\n device.deviceYToScreen(this._screenSize[1] - scissorY - scissorH),\r\n device.deviceXToScreen(this._screenSize[0]),\r\n device.deviceYToScreen(scissorH)\r\n ]);\r\n device.copyBuffer(this._headStagingBuffer!, this._headBuffer!, 0, 0, this._headStagingBuffer!.byteLength);\r\n // Update render hash\r\n this._hash = `${this.getType()}#${this._nodeBuffer!.uid}#${this._headBuffer!.uid}#${\r\n this._scissorOffsetBuffer!.uid\r\n }#${pass}`;\r\n if (this._debug) {\r\n const data = new Uint8Array(this._headBuffer!.byteLength);\r\n const readBuffer = device.createBuffer(this._headBuffer!.byteLength, { usage: 'read' });\r\n device.copyBuffer(this._headBuffer!, readBuffer, 0, 0, this._headBuffer!.byteLength);\r\n readBuffer.getBufferSubData(data).then(() => {\r\n const uint = new Uint32Array(data.buffer);\r\n for (let i = 0; i < uint.length; i++) {\r\n if (uint[i] !== 0xffffffff) {\r\n console.error('Clear head buffer failed');\r\n break;\r\n }\r\n }\r\n readBuffer.dispose();\r\n });\r\n }\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, pass: number) {\r\n const device = ctx.device;\r\n ABufferOIT.getCompositeProgram(device);\r\n const lastBindGroup = device.getBindGroup(0);\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n !this._singleColorFramebuffer &&\r\n currentFramebuffer &&\r\n currentFramebuffer.getColorAttachments().length > 1 &&\r\n colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(ABufferOIT.getCompositeProgram(device));\r\n const bindGroup = ABufferOIT._compositeBindGroup!;\r\n bindGroup.setBuffer(\r\n 'scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n pass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('headBuffer', this._headBuffer!);\r\n bindGroup.setBuffer('nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setValue('screenWidth', this._screenSize[0]);\r\n bindGroup.setValue('additiveOnly', ctx.lightBlending ? 1 : 0);\r\n device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(\r\n ctx.lightBlending ? ABufferOIT._compositeAdditiveRenderStates! : ABufferOIT._compositeRenderStates!\r\n );\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n } else if (this._singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(this._singleColorFramebuffer);\r\n this._singleColorFramebuffer = null;\r\n } else {\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash!;\r\n }\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(ctx: DrawContext, bindGroup: BindGroup) {\r\n bindGroup.setBuffer('Z_AB_nodeBuffer', this._nodeBuffer!);\r\n bindGroup.setBuffer(\r\n 'Z_AB_scissorOffset',\r\n this._scissorOffsetBuffer!,\r\n 0,\r\n this._currentPass * ABufferOIT._ubAlignment,\r\n ABufferOIT._ubAlignment\r\n );\r\n bindGroup.setBuffer('Z_AB_headImage', this._headBuffer!);\r\n bindGroup.setValue('Z_AB_screenSize', this._screenSize[0]);\r\n bindGroup.setTexture('Z_AB_depthTexture', ctx.linearDepthTexture!);\r\n }\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp) {\r\n const pb = scope.$builder;\r\n // linear depth of current fragment\r\n scope.$l.fragDepth = ShaderHelper.nonLinearDepthToLinearNormalized(scope, scope.$builtins.fragCoord.z);\r\n // linear depth in depth texture\r\n scope.$l.linearDepth = pb.textureLoad(\r\n scope.Z_AB_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).r;\r\n // saved to buffer only if nothing is infront\r\n scope.$if(pb.lessThan(scope.fragDepth, scope.linearDepth), function () {\r\n this.$l.Z_AB_pixelCount = pb.atomicAdd(this.Z_AB_headImage.at(0), 1);\r\n this.$l.Z_AB_nodeOffset = this.Z_AB_pixelCount;\r\n // save if index not exceeded\r\n this.$if(pb.lessThan(this.Z_AB_nodeOffset, pb.arrayLength(this.Z_AB_nodeBuffer)), function () {\r\n this.$l.Z_AB_headOffset = pb.add(\r\n pb.mul(this.Z_AB_screenSize, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.Z_AB_scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n this.$l.Z_AB_oldHead = pb.atomicExchange(\r\n this.Z_AB_headImage.at(pb.add(this.Z_AB_headOffset, 1)),\r\n this.Z_AB_nodeOffset\r\n );\r\n this.$l.Z_AB_colorScale = pb.floatBitsToUint(pb.length(color.rgb));\r\n this.$l.Z_AB_color = pb.pack4x8unorm(pb.vec4(pb.normalize(color.rgb), pb.clamp(color.a, 0, 1)));\r\n this.$l.Z_AB_depth = pb.floatBitsToUint(this.fragDepth);\r\n this.Z_AB_nodeBuffer.setAt(\r\n this.Z_AB_nodeOffset,\r\n pb.uvec4(this.Z_AB_color, this.Z_AB_colorScale, this.Z_AB_depth, this.Z_AB_oldHead)\r\n );\r\n pb.discard();\r\n });\r\n });\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n const stencilStates = rs.useStencilState();\r\n stencilStates.enable(true);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(1);\r\n stencilStates.setReadMask(0xff);\r\n }\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.scissorOffset = pb.uint().uniformBuffer(0);\r\n this.headBuffer = pb.uint[0]().storageBuffer(0);\r\n this.nodeBuffer = pb.uvec4[0]().storageBuffer(0);\r\n this.screenWidth = pb.uint().uniform(0);\r\n this.additiveOnly = pb.int().uniform(0);\r\n pb.func('unpackColor', [pb.uvec4('x')], function () {\r\n this.$l.colorNorm = pb.unpack4x8unorm(this.x.x);\r\n this.$l.colorScale = pb.uintBitsToFloat(this.x.y);\r\n this.$return(pb.vec4(pb.mul(this.colorNorm.rgb, this.colorScale), this.colorNorm.a));\r\n });\r\n pb.main(function () {\r\n this.$l.fragmentArray = pb.uvec4[ABufferOIT.MAX_FRAGMENT_LAYERS]();\r\n this.$l.fragmentArrayLen = pb.uint(0);\r\n this.$l.offset = pb.add(\r\n pb.mul(this.screenWidth, pb.sub(pb.uint(this.$builtins.fragCoord.y), this.scissorOffset)),\r\n pb.uint(this.$builtins.fragCoord.x)\r\n );\r\n //this.$l.head = this.headBuffer.at(this.offset);\r\n this.$l.head = this.headBuffer.at(pb.add(this.offset, 1));\r\n this.$while(\r\n pb.and(\r\n pb.lessThan(this.fragmentArrayLen, ABufferOIT.MAX_FRAGMENT_LAYERS),\r\n pb.notEqual(this.head, 0xffffffff)\r\n ),\r\n function () {\r\n this.fragmentArray.setAt(this.fragmentArrayLen, this.nodeBuffer.at(this.head));\r\n this.head = this.fragmentArray.at(this.fragmentArrayLen).w;\r\n this.fragmentArrayLen = pb.add(this.fragmentArrayLen, 1);\r\n }\r\n );\r\n this.$if(pb.equal(this.fragmentArrayLen, 0), function () {\r\n this.$outputs.outColor = pb.vec4(0, 0, 0, 1);\r\n }).$else(function () {\r\n // bubble sort\r\n this.$for(pb.uint('i'), 0, pb.sub(this.fragmentArrayLen, 1), function () {\r\n this.$for(pb.uint('j'), 0, pb.sub(pb.sub(this.fragmentArrayLen, 1), this.i), function () {\r\n this.$l.a = this.fragmentArray.at(this.j);\r\n this.$l.b = this.fragmentArray.at(pb.add(this.j, 1));\r\n this.$if(pb.greaterThan(this.a.z, this.b.z), function () {\r\n this.fragmentArray.setAt(this.j, this.b);\r\n this.fragmentArray.setAt(pb.add(this.j, 1), this.a);\r\n });\r\n });\r\n });\r\n // under operator blending\r\n this.$l.c0 = this.unpackColor(this.fragmentArray[0]);\r\n this.$l.c_dst = ABufferOIT.usePremultipliedAlpha ? this.c0.rgb : pb.mul(this.c0.rgb, this.c0.a);\r\n this.$l.a_dst = pb.sub(1, this.c0.a);\r\n this.$for(pb.uint('i'), 1, this.fragmentArrayLen, function () {\r\n this.$l.c = this.unpackColor(this.fragmentArray.at(this.i));\r\n if (ABufferOIT.usePremultipliedAlpha) {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.a_dst));\r\n } else {\r\n this.c_dst = pb.add(this.c_dst, pb.mul(this.c.rgb, this.c.a, this.a_dst));\r\n }\r\n this.a_dst = pb.mul(this.a_dst, pb.sub(1, this.c.a));\r\n });\r\n this.$outputs.outColor = pb.vec4(\r\n this.c_dst,\r\n pb.equal(this.additiveOnly, 0) ? this.a_dst : pb.float(0)\r\n );\r\n });\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@ABufferOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._compositeAdditiveRenderStates = device.createRenderStateSet();\r\n this._compositeAdditiveRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'one')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeAdditiveRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n const stencilStates = this._compositeRenderStates.useStencilState();\r\n stencilStates.enable(false);\r\n stencilStates.setFrontCompareFunc('always');\r\n stencilStates.setBackCompareFunc('always');\r\n stencilStates.setFrontOp('keep', 'keep', 'replace');\r\n stencilStates.setBackOp('keep', 'keep', 'replace');\r\n stencilStates.setReference(0);\r\n stencilStates.setReadMask(0xff);\r\n const additiveStencilStates = this._compositeAdditiveRenderStates.useStencilState();\r\n additiveStencilStates.enable(false);\r\n additiveStencilStates.setFrontCompareFunc('always');\r\n additiveStencilStates.setBackCompareFunc('always');\r\n additiveStencilStates.setFrontOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setBackOp('keep', 'keep', 'replace');\r\n additiveStencilStates.setReference(0);\r\n additiveStencilStates.setReadMask(0xff);\r\n }\r\n return this._compositeProgram;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._nodeBuffer?.dispose();\r\n this._nodeBuffer = null;\r\n this._headStagingBuffer?.dispose();\r\n this._headStagingBuffer = null;\r\n this._headBuffer?.dispose();\r\n this._headBuffer = null;\r\n this._scissorOffsetBuffer?.dispose();\r\n this._scissorOffsetBuffer = null;\r\n this._hash = null;\r\n this._savedScissor = null;\r\n }\r\n}\r\n"],"names":["ABufferOIT","Disposable","type","usePremultipliedAlpha","MAX_FRAGMENT_LAYERS","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_compositeAdditiveRenderStates","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","_singleColorFramebuffer","numLayers","Uint32Array","getType","supportDevice","deviceType","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","device","getScissor","ubAlignment","getDeviceCaps","shaderCaps","uniformBufferOffsetAlignment","viewport","getViewport","screenWidth","screenXToDevice","width","screenHeight","screenYToDevice","Math","max","height","maxBufferSize","maxStorageBufferSize","bytesPerLine","ceil","offsetBufferSize","offsetBuffer","i","byteLength","dispose","createBuffer","usage","bufferSubData","size","nodeBufferSize","storage","headBufferSize","tmpArray","fill","end","setScissor","setupFragmentOutput","scope","pb","$builder","Z_AB_scissorOffset","uint","uniformBuffer","Z_AB_nodeBuffer","uvec4","storageBuffer","Z_AB_headImage","atomic_uint","Z_AB_screenSize","uniform","Z_AB_depthTexture","tex2D","noSampler","$outputs","outColor","vec4","beginPass","pass","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","length","pool","fetchTemporalFramebuffer","getDepthAttachment","scissor","pushDeviceStates","setFramebuffer","setViewport","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","singleColorFramebuffer","setProgram","bindGroup","setBuffer","setValue","lightBlending","setBindGroup","drawFullscreenQuad","popDeviceStates","releaseFrameBuffer","calculateHash","applyUniforms","setTexture","linearDepthTexture","outputFragmentColor","color","$l","fragDepth","ShaderHelper","nonLinearDepthToLinearNormalized","$builtins","fragCoord","z","linearDepth","textureLoad","ivec2","xy","r","$if","lessThan","Z_AB_pixelCount","atomicAdd","at","Z_AB_nodeOffset","arrayLength","Z_AB_headOffset","add","mul","sub","y","x","Z_AB_oldHead","atomicExchange","Z_AB_colorScale","floatBitsToUint","rgb","Z_AB_color","pack4x8unorm","normalize","clamp","a","Z_AB_depth","setAt","discard","setRenderStates","rs","stencilStates","useStencilState","enable","setFrontCompareFunc","setBackCompareFunc","setFrontOp","setBackOp","setReference","setReadMask","buildRenderProgram","vertex","$inputs","pos","vec2","attrib","uv","main","position","neg","fragment","scissorOffset","headBuffer","nodeBuffer","additiveOnly","int","func","colorNorm","unpack4x8unorm","colorScale","uintBitsToFloat","$return","fragmentArray","fragmentArrayLen","offset","head","$while","and","notEqual","w","equal","$else","$for","j","b","greaterThan","c0","unpackColor","c_dst","a_dst","c","float","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","additiveStencilStates","onDispose"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { Vector4 } from '@zephyr3d/base';
2
- import { MAX_CLUSTERED_LIGHTS } from '../values.js';
2
+ import { MAX_CLUSTERED_LIGHTS, MAX_SHADOW_MASK_LIGHTS } from '../values.js';
3
3
  import { ShaderHelper } from '../material/shader/helper.js';
4
4
  import { getDevice } from '../app/api.js';
5
5
 
6
6
  class ClusteredLight {
7
+ /** Emit the shadow-mask overflow warning only once per session. */ static _warnedShadowMaskOverflow = false;
7
8
  _tileCountX;
8
9
  _tileCountY;
9
10
  _tileCountZ;
@@ -18,6 +19,7 @@ class ClusteredLight {
18
19
  _sizeParam;
19
20
  _countParam;
20
21
  _clusterParam;
22
+ _numShadowLights;
21
23
  constructor(){
22
24
  this._tileCountX = 16;
23
25
  this._tileCountY = 16;
@@ -33,10 +35,18 @@ class ClusteredLight {
33
35
  this._sizeParam = new Vector4();
34
36
  this._countParam = new Int32Array(4);
35
37
  this._clusterParam = new Vector4();
38
+ this._numShadowLights = 0;
36
39
  }
37
40
  get lightBuffer() {
38
41
  return this._lightBuffer;
39
42
  }
43
+ /**
44
+ * Number of shadow-casting lights placed at the head of the clustered light
45
+ * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.
46
+ * Zero unless the screen-space shadow mask path is active.
47
+ */ get numShadowLights() {
48
+ return this._numShadowLights;
49
+ }
40
50
  get clusterParam() {
41
51
  return this._clusterParam;
42
52
  }
@@ -267,7 +277,7 @@ class ClusteredLight {
267
277
  ], null);
268
278
  }
269
279
  calculateLightIndex(camera, renderQueue) {
270
- const numLights = this.getVisibleLights(renderQueue, this._lights);
280
+ const numLights = this.getVisibleLights(renderQueue, this._lights, camera.screenSpaceShadowMask);
271
281
  const device = getDevice();
272
282
  if (!this._lightIndexTexture) {
273
283
  this.createLightIndexTexture(device);
@@ -319,17 +329,51 @@ class ClusteredLight {
319
329
  }
320
330
  device.popDeviceStates();
321
331
  }
322
- getVisibleLights(renderQueue, lights) {
323
- const numLights = Math.min(renderQueue.unshadowedLights.length, MAX_CLUSTERED_LIGHTS);
324
- for(let i = 1; i <= numLights; i++){
325
- const light = renderQueue.unshadowedLights[i - 1];
326
- const offset = i * 16;
332
+ getVisibleLights(renderQueue, lights, useShadowMask) {
333
+ const writeLight = (light, slot)=>{
334
+ const offset = slot * 16;
327
335
  lights.set(light.positionAndRange, offset);
328
336
  lights.set(light.directionAndCutoff, offset + 4);
329
337
  lights.set(light.diffuseAndIntensity, offset + 8);
330
338
  lights.set(light.extraParams, offset + 12);
339
+ };
340
+ // When the screen-space shadow mask is active, shadow-casting lights occupy
341
+ // the head of the buffer (slots 1..N) in the exact order of
342
+ // renderQueue.shadowedLights. The mask pass must assign layers/channels from
343
+ // the SAME list in the SAME order so that a light's buffer index maps to its
344
+ // mask slot without storing a per-light index. Keep these two in lockstep.
345
+ let numShadow = 0;
346
+ let slot = 0;
347
+ if (useShadowMask) {
348
+ numShadow = Math.min(renderQueue.shadowedLights.length, MAX_SHADOW_MASK_LIGHTS, MAX_CLUSTERED_LIGHTS);
349
+ for(let i = 1; i <= numShadow; i++){
350
+ writeLight(renderQueue.shadowedLights[i - 1], i);
351
+ }
352
+ slot = numShadow;
353
+ }
354
+ // Unshadowed lights fill the region after the mask-backed shadow lights.
355
+ const numUnshadowed = Math.min(renderQueue.unshadowedLights.length, MAX_CLUSTERED_LIGHTS - slot);
356
+ for(let j = 0; j < numUnshadowed; j++){
357
+ writeLight(renderQueue.unshadowedLights[j], slot + j + 1);
358
+ }
359
+ slot += numUnshadowed;
360
+ // Shadow-casting lights beyond the mask capacity (MAX_SHADOW_MASK_LIGHTS) have
361
+ // no mask slot. Rather than dropping them silently, place them past index N so
362
+ // they are still lit — without a mask sample, i.e. degraded to no shadow.
363
+ if (useShadowMask && renderQueue.shadowedLights.length > numShadow) {
364
+ const overflow = renderQueue.shadowedLights.length - numShadow;
365
+ const numOverflow = Math.min(overflow, MAX_CLUSTERED_LIGHTS - slot);
366
+ for(let k = 0; k < numOverflow; k++){
367
+ writeLight(renderQueue.shadowedLights[numShadow + k], slot + k + 1);
368
+ }
369
+ slot += numOverflow;
370
+ if (!ClusteredLight._warnedShadowMaskOverflow) {
371
+ ClusteredLight._warnedShadowMaskOverflow = true;
372
+ console.warn(`ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` + `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` + `lit without shadows${numOverflow < overflow ? `, and ${overflow - numOverflow} dropped` : ''}.`);
373
+ }
331
374
  }
332
- return numLights;
375
+ this._numShadowLights = numShadow;
376
+ return slot;
333
377
  }
334
378
  }
335
379