@zephyr3d/scene 0.9.3 → 0.9.4
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.
- package/dist/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/app/engine.js +119 -71
- package/dist/app/engine.js.map +1 -1
- package/dist/asset/assetmanager.js +296 -244
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +1 -0
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/model.js +57 -57
- package/dist/asset/model.js.map +1 -1
- package/dist/index.d.ts +684 -33
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +123 -108
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +29 -17
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +1 -0
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +86 -87
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +234 -228
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +143 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +47 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +1275 -1091
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/serialization/manager.js +321 -277
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +2 -0
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +2 -0
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +2 -0
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -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 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 _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 /**\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 }\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 scope.Z_AB_depthTexture = pb.tex2D().uniform(2);\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 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] !== 0) {\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 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 device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(ABufferOIT._compositeRenderStates!);\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\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 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(this.c_dst, this.a_dst);\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 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 }\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","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","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","$outputs","outColor","vec4","beginPass","pass","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","length","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","setProgram","bindGroup","setBuffer","setValue","setBindGroup","drawFullscreenQuad","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","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","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","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 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 _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 /**\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 }\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 scope.Z_AB_depthTexture = pb.tex2D().uniform(2);\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 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] !== 0) {\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 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 device.setBindGroup(0, bindGroup);\r\n drawFullscreenQuad(ABufferOIT._compositeRenderStates!);\r\n device.setBindGroup(0, lastBindGroup[0], lastBindGroup[1]);\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 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(this.c_dst, this.a_dst);\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 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 }\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","_ubAlignment","_nodeBuffer","_headStagingBuffer","_headBuffer","_scissorOffsetBuffer","_numLayers","_screenSize","_hash","_debug","_scissorSlices","_scissorHeight","_currentPass","_savedScissor","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","$outputs","outColor","vec4","beginPass","pass","scissorY","scissorH","min","deviceYToScreen","deviceXToScreen","copyBuffer","uid","data","Uint8Array","readBuffer","getBufferSubData","then","buffer","length","console","error","endPass","getCompositeProgram","lastBindGroup","getBindGroup","setProgram","bindGroup","setBuffer","setValue","setBindGroup","drawFullscreenQuad","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","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","name","createBindGroup","bindGroupLayouts","createRenderStateSet","useBlendingState","setBlendFuncRGB","setBlendFuncAlpha","useDepthState","enableTest","enableWrite","onDispose"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\nimport { Vector4 } from '@zephyr3d/base';\nimport type {\n AbstractDevice,\n BindGroup,\n FrameBuffer,\n GPUProgram,\n PBStructTypeInfo,\n RenderStateSet,\n StructuredBuffer,\n Texture2D,\n VertexLayout\n} from '@zephyr3d/device';\nimport type { Camera } from '../camera/camera';\nimport type { RenderQueue } from './render_queue';\nimport { ShaderHelper } from '../material/shader/helper';\nimport { getDevice } from '../app/api';\n\nexport class ClusteredLight {\n private readonly _tileCountX: number;\n private readonly _tileCountY: number;\n private readonly _tileCountZ: number;\n private readonly _lights: Float32Array<ArrayBuffer>;\n private _lightIndexTexture: Nullable<Texture2D>;\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\n private _lightIndexProgram: Nullable<GPUProgram>;\n private _bindGroup: Nullable<BindGroup>;\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\n private _lightBuffer: Nullable<StructuredBuffer>;\n private readonly _sizeParam: Vector4;\n private _countParam: Int32Array<ArrayBuffer>;\n private readonly _clusterParam: Vector4;\n constructor() {\n this._tileCountX = 16;\n this._tileCountY = 16;\n this._tileCountZ = 32;\n this._lights = new Float32Array(16 * (ShaderHelper.getMaxClusteredLightCount() + 1));\n this._lightIndexTexture = null;\n this._lightIndexFramebuffer = null;\n this._lightIndexProgram = null;\n this._lightBuffer = null;\n this._bindGroup = null;\n this._lightIndexVertexLayout = null;\n this._lightIndexRenderStates = null;\n this._sizeParam = new Vector4();\n this._countParam = new Int32Array(4);\n this._clusterParam = new Vector4();\n }\n get lightBuffer() {\n return this._lightBuffer;\n }\n get clusterParam() {\n return this._clusterParam;\n }\n get countParam() {\n return this._countParam;\n }\n get lightIndexTexture() {\n return this._lightIndexTexture;\n }\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\n let vb: StructuredBuffer;\n if (device.type === 'webgl') {\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 3);\n for (let i = 0; i < vertices.length; i++) {\n const ix = i % textureWidth;\n const iy = Math.floor(i / textureWidth);\n vertices[i * 3 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\n vertices[i * 3 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\n vertices[i * 3 + 2] = i;\n }\n vb = device.createVertexBuffer('position_f32x3', vertices)!;\n } else {\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 2);\n for (let i = 0; i < vertices.length; i++) {\n const ix = i % textureWidth;\n const iy = Math.floor(i / textureWidth);\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\n }\n vb = device.createVertexBuffer('position_f32x2', vertices)!;\n }\n this._lightIndexVertexLayout = device.createVertexLayout({\n vertexBuffers: [{ buffer: vb }]\n });\n }\n private createRenderState(device: AbstractDevice) {\n this._lightIndexRenderStates = device.createRenderStateSet();\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\n }\n private createProgram(device: AbstractDevice) {\n const webgl1 = device.type === 'webgl';\n this._lightIndexProgram = device.buildRenderProgram({\n vertex(pb) {\n this.$inputs.pos = (webgl1 ? pb.vec3() : pb.vec2()).attrib('position');\n this.$outputs.value = webgl1 ? pb.vec4() : pb.uvec4();\n this.invProjMatrix = pb.mat4().uniform(0);\n this.viewMatrix = pb.mat4().uniform(0);\n this.sizeParam = pb.vec4().uniform(0);\n this.countParam = pb.ivec4().uniform(0);\n this[ShaderHelper.getLightBufferUniformName()] =\n pb.vec4[(ShaderHelper.getMaxClusteredLightCount() + 1) * 4]().uniformBuffer(0);\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\n this.$l.normal = pb.vec3(0, 0, 1);\n this.$l.ab = pb.sub(this.b, this.a);\n this.$l.t = pb.div(\n pb.sub(this.zDistance, pb.dot(this.normal, this.a)),\n pb.dot(this.normal, this.ab)\n );\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\n });\n pb.func('clipToView', [pb.vec4('clip')], function () {\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\n this.$return(pb.div(this.view, this.view.w));\n });\n pb.func('screenToView', [pb.vec4('screen')], function () {\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\n this.$l.clip = pb.vec4(\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\n this.screen.z,\n this.screen.w\n );\n this.$return(this.clipToView(this.clip));\n });\n pb.func(\n 'sphereIntersectsAABB',\n [pb.vec4('sphere'), pb.vec3('aabbMin'), pb.vec3('aabbMax')],\n function () {\n this.$l.dmin = pb.float(0);\n this.$if(pb.lessThanEqual(this.sphere.w, 0), function () {\n this.$return(true);\n });\n this.$for(pb.int('i'), 0, 3, function () {\n this.$if(pb.lessThan(this.sphere.at(this.i), this.aabbMin.at(this.i)), function () {\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMin.at(this.i));\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\n }).$elseif(pb.greaterThan(this.sphere.at(this.i), this.aabbMax.at(this.i)), function () {\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMax.at(this.i));\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\n });\n });\n this.$if(pb.lessThanEqual(this.dmin, pb.mul(this.sphere.w, this.sphere.w)), function () {\n this.$return(true);\n });\n this.$return(false);\n }\n );\n pb.main(function () {\n if (pb.getDevice().type !== 'webgpu') {\n this.$builtins.pointSize = 1;\n }\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\n if (pb.getDevice().type === 'webgpu') {\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\n }\n this.$l.tileIndex = webgl1 ? pb.int(this.$inputs.pos.z) : pb.int(this.$builtins.vertexIndex);\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\n this.$l.yIndex = pb.div(\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\n this.countParam.x\n );\n this.$l.xIndex = pb.sub(\n this.tileIndex,\n pb.add(\n pb.mul(this.zIndex, this.countParam.x, this.countParam.y),\n pb.mul(this.yIndex, this.countParam.x)\n )\n );\n this.$l.maxPoint_sS = pb.vec4(\n pb.mul(\n pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))),\n this.tileSize\n ),\n 0.0,\n 1.0\n );\n this.$l.minPoint_sS = pb.vec4(\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\n 0.0,\n 1.0\n );\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\n this.$l.tileNear = pb.mul(\n pb.neg(this.sizeParam.z),\n pb.pow(\n pb.div(this.sizeParam.w, this.sizeParam.z),\n pb.div(pb.float(this.zIndex), pb.float(this.countParam.z))\n )\n );\n this.$l.tileFar = pb.mul(\n pb.neg(this.sizeParam.z),\n pb.pow(\n pb.div(this.sizeParam.w, this.sizeParam.z),\n pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z))\n )\n );\n this.$l.eyePos = pb.vec3(0);\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\n this.$l.aabbMin = pb.min(\n pb.min(this.minPointNear, this.minPointFar),\n pb.min(this.maxPointNear, this.maxPointFar)\n );\n this.$l.aabbMax = pb.max(\n pb.max(this.minPointNear, this.minPointFar),\n pb.max(this.maxPointNear, this.maxPointFar)\n );\n this.$l.n = pb.int(0);\n if (webgl1) {\n this.$l.lightIndices = pb.float[8]();\n this.$for(pb.int('i'), 0, 8, function () {\n this.lightIndices.setAt(this.i, 0);\n });\n this.$for(pb.int('i'), 1, 256, function () {\n this.$if(pb.equal(this.i, this.countParam.w), function () {\n this.$break();\n });\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\n this.$l.lightPos.w = this.light.w;\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\n this.$for(pb.int('j'), 0, 8, function () {\n this.$if(pb.equal(this.j, this.n), function () {\n this.lightIndices.setAt(this.j, pb.float(this.i));\n this.n = pb.add(this.n, 1);\n this.$break();\n });\n });\n this.$if(pb.equal(this.n, 8), function () {\n this.$break();\n });\n });\n });\n this.$outputs.value.r = pb.add(pb.mul(this.lightIndices[0], 256), this.lightIndices[1]);\n this.$outputs.value.g = pb.add(pb.mul(this.lightIndices[2], 256), this.lightIndices[3]);\n this.$outputs.value.b = pb.add(pb.mul(this.lightIndices[4], 256), this.lightIndices[5]);\n this.$outputs.value.a = pb.add(pb.mul(this.lightIndices[6], 256), this.lightIndices[7]);\n } else {\n this.$l.lightIndex = [\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0),\n pb.uint(0)\n ];\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\n this.$l.lightPos.w = this.light.w;\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\n this.lightIndex.setAt(this.n, this.i);\n this.n = pb.add(this.n, 1);\n this.$if(pb.equal(this.n, 16), function () {\n this.$break();\n });\n });\n });\n this.$l.r = pb.add(\n pb.sal(this.lightIndex[0], 24),\n pb.sal(this.lightIndex[1], 16),\n pb.sal(this.lightIndex[2], 8),\n this.lightIndex[3]\n );\n this.$l.g = pb.add(\n pb.sal(this.lightIndex[4], 24),\n pb.sal(this.lightIndex[5], 16),\n pb.sal(this.lightIndex[6], 8),\n this.lightIndex[7]\n );\n this.$l.b = pb.add(\n pb.sal(this.lightIndex[8], 24),\n pb.sal(this.lightIndex[9], 16),\n pb.sal(this.lightIndex[10], 8),\n this.lightIndex[11]\n );\n this.$l.a = pb.add(\n pb.sal(this.lightIndex[12], 24),\n pb.sal(this.lightIndex[13], 16),\n pb.sal(this.lightIndex[14], 8),\n this.lightIndex[15]\n );\n this.$outputs.value = pb.uvec4(this.r, this.g, this.b, this.a);\n }\n });\n },\n fragment(pb) {\n this.$outputs.color = webgl1 ? pb.vec4() : pb.uvec4();\n pb.main(function () {\n this.$outputs.color = this.$inputs.value;\n });\n }\n })!;\n this._lightIndexProgram.name = '@ClusteredLight_Index';\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\n this._lightBuffer?.dispose();\n const lightBufferType = this._lightIndexProgram.getBindingInfo(\n ShaderHelper.getLightBufferUniformName()!\n )!.type;\n this._lightBuffer = device.createStructuredBuffer(lightBufferType as PBStructTypeInfo, {\n usage: 'uniform'\n });\n }\n private createLightIndexTexture(device: AbstractDevice) {\n const exp = Math.log2(this._tileCountX * this._tileCountY * this._tileCountZ);\n const a = (exp + 1) >>> 1;\n const b = exp - a;\n const textureWidth = 2 << (a - 1);\n const textureHeight = 2 << (b - 1);\n if (textureWidth * textureHeight !== this._tileCountX * this._tileCountY * this._tileCountZ) {\n throw new Error('Internal error');\n }\n this._lightIndexTexture = device.createTexture2D(\n device.type === 'webgl' ? 'rgba32f' : 'rgba32ui',\n textureWidth,\n textureHeight,\n { mipmapping: false }\n )!;\n this._lightIndexTexture.name = 'ClusterLightIndex';\n this._lightIndexFramebuffer?.dispose();\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\n }\n calculateLightIndex(camera: Camera, renderQueue: RenderQueue) {\n const numLights = this.getVisibleLights(renderQueue, this._lights);\n const device = getDevice();\n if (!this._lightIndexTexture) {\n this.createLightIndexTexture(device);\n }\n if (!this._lightIndexProgram) {\n this.createProgram(device);\n }\n if (!this._lightIndexVertexLayout) {\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\n }\n if (!this._lightIndexRenderStates) {\n this.createRenderState(device);\n }\n const viewport = device.getViewport();\n const vw = device.screenXToDevice(viewport.width);\n const vh = device.screenYToDevice(viewport.height);\n const scale = this._tileCountZ / Math.log2(camera.getFarPlane() / camera.getNearPlane());\n const bias = -(\n (this._tileCountZ * Math.log2(camera.getNearPlane())) /\n Math.log2(camera.getFarPlane() / camera.getNearPlane())\n );\n this._clusterParam.setXYZW(vw, vh, scale, bias);\n this._sizeParam.setXYZW(vw, vh, camera.getNearPlane(), camera.getFarPlane());\n this._countParam[0] = this._tileCountX;\n this._countParam[1] = this._tileCountY;\n this._countParam[2] = this._tileCountZ;\n // countParam.w stores light count + 1 because clustered indices start from 1.\n // Keep it valid even when there are no unshadowed punctual lights so deferred\n // passes can still evaluate emissive / env lighting without invalid cluster math.\n this._countParam[3] = numLights + 1;\n device.pushDeviceStates();\n device.setFramebuffer(this._lightIndexFramebuffer);\n if (numLights > 0) {\n if (this._lightBuffer!.disposed) {\n this._lightBuffer!.reload();\n }\n this._lightBuffer!.bufferSubData(0, this._lights);\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\n this._bindGroup!.setValue('viewMatrix', camera.viewMatrix);\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\n this._bindGroup!.setValue('countParam', this._countParam);\n this._bindGroup!.setBuffer(ShaderHelper.getLightBufferUniformName(), this._lightBuffer!);\n device.setProgram(this._lightIndexProgram);\n device.setVertexLayout(this._lightIndexVertexLayout);\n device.setBindGroup(0, this._bindGroup!);\n const savedRS = device.getRenderStates();\n device.setRenderStates(this._lightIndexRenderStates);\n device.draw('point-list', 0, this._tileCountX * this._tileCountY * this._tileCountZ);\n device.setRenderStates(savedRS);\n } else {\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), 1, 0);\n }\n device.popDeviceStates();\n }\n private getVisibleLights(renderQueue: RenderQueue, lights: Float32Array) {\n const numLights = Math.min(renderQueue.unshadowedLights.length, ShaderHelper.getMaxClusteredLightCount());\n for (let i = 1; i <= numLights; i++) {\n const light = renderQueue.unshadowedLights[i - 1];\n const offset = i * 16;\n lights.set(light.positionAndRange, offset);\n lights.set(light.directionAndCutoff, offset + 4);\n lights.set(light.diffuseAndIntensity, offset + 8);\n lights.set(light.extraParams, offset + 12);\n }\n return numLights;\n }\n}\n"],"names":["ClusteredLight","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","Float32Array","ShaderHelper","getMaxClusteredLightCount","Vector4","Int32Array","lightBuffer","clusterParam","countParam","lightIndexTexture","createVertexLayout","device","textureWidth","textureHeight","vb","type","vertices","i","length","ix","iy","Math","floor","createVertexBuffer","vertexBuffers","buffer","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","webgl1","buildRenderProgram","vertex","pb","$inputs","pos","vec3","vec2","attrib","$outputs","value","vec4","uvec4","invProjMatrix","mat4","uniform","viewMatrix","sizeParam","ivec4","getLightBufferUniformName","uniformBuffer","func","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","view","clip","w","texCoord","screen","xy","x","y","z","clipToView","dmin","$if","lessThanEqual","sphere","$for","int","lessThan","at","aabbMin","delta","$elseif","greaterThan","aabbMax","main","getDevice","$builtins","pointSize","position","tileIndex","vertexIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","xyz","minPoint_vS","tileNear","neg","pow","tileFar","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","min","max","n","lightIndices","setAt","equal","$break","light","lightPos","sphereIntersectsAABB","j","r","g","lightIndex","uint","sal","fragment","color","name","createBindGroup","bindGroupLayouts","dispose","lightBufferType","getBindingInfo","createStructuredBuffer","usage","createLightIndexTexture","exp","log2","Error","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","numLights","getVisibleLights","width","height","viewport","getViewport","vw","screenXToDevice","vh","screenYToDevice","scale","getFarPlane","getNearPlane","bias","setXYZW","pushDeviceStates","setFramebuffer","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","setVertexLayout","setBindGroup","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","popDeviceStates","lights","unshadowedLights","offset","set","positionAndRange","directionAndCutoff","diffuseAndIntensity","extraParams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cluster_light.js","sources":["../../src/render/cluster_light.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBStructTypeInfo,\r\n RenderStateSet,\r\n StructuredBuffer,\r\n Texture2D,\r\n VertexLayout\r\n} from '@zephyr3d/device';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { RenderQueue } from './render_queue';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport class ClusteredLight {\r\n private readonly _tileCountX: number;\r\n private readonly _tileCountY: number;\r\n private readonly _tileCountZ: number;\r\n private readonly _lights: Float32Array<ArrayBuffer>;\r\n private _lightIndexTexture: Nullable<Texture2D>;\r\n private _lightIndexFramebuffer: Nullable<FrameBuffer>;\r\n private _lightIndexProgram: Nullable<GPUProgram>;\r\n private _bindGroup: Nullable<BindGroup>;\r\n private _lightIndexVertexLayout: Nullable<VertexLayout>;\r\n private _lightIndexRenderStates: Nullable<RenderStateSet>;\r\n private _lightBuffer: Nullable<StructuredBuffer>;\r\n private readonly _sizeParam: Vector4;\r\n private _countParam: Int32Array<ArrayBuffer>;\r\n private readonly _clusterParam: Vector4;\r\n constructor() {\r\n this._tileCountX = 16;\r\n this._tileCountY = 16;\r\n this._tileCountZ = 32;\r\n this._lights = new Float32Array(16 * (ShaderHelper.getMaxClusteredLightCount() + 1));\r\n this._lightIndexTexture = null;\r\n this._lightIndexFramebuffer = null;\r\n this._lightIndexProgram = null;\r\n this._lightBuffer = null;\r\n this._bindGroup = null;\r\n this._lightIndexVertexLayout = null;\r\n this._lightIndexRenderStates = null;\r\n this._sizeParam = new Vector4();\r\n this._countParam = new Int32Array(4);\r\n this._clusterParam = new Vector4();\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n get clusterParam() {\r\n return this._clusterParam;\r\n }\r\n get countParam() {\r\n return this._countParam;\r\n }\r\n get lightIndexTexture() {\r\n return this._lightIndexTexture;\r\n }\r\n private createVertexLayout(device: AbstractDevice, textureWidth: number, textureHeight: number) {\r\n let vb: StructuredBuffer;\r\n if (device.type === 'webgl') {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 3);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 3 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 3 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n vertices[i * 3 + 2] = i;\r\n }\r\n vb = device.createVertexBuffer('position_f32x3', vertices)!;\r\n } else {\r\n const vertices = new Float32Array(this._tileCountX * this._tileCountY * this._tileCountZ * 2);\r\n for (let i = 0; i < vertices.length; i++) {\r\n const ix = i % textureWidth;\r\n const iy = Math.floor(i / textureWidth);\r\n vertices[i * 2 + 0] = (2 * (ix + 0.5)) / textureWidth - 1;\r\n vertices[i * 2 + 1] = (2 * (iy + 0.5)) / textureHeight - 1;\r\n }\r\n vb = device.createVertexBuffer('position_f32x2', vertices)!;\r\n }\r\n this._lightIndexVertexLayout = device.createVertexLayout({\r\n vertexBuffers: [{ buffer: vb }]\r\n });\r\n }\r\n private createRenderState(device: AbstractDevice) {\r\n this._lightIndexRenderStates = device.createRenderStateSet();\r\n this._lightIndexRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n this._lightIndexRenderStates.useRasterizerState().setCullMode('none');\r\n }\r\n private createProgram(device: AbstractDevice) {\r\n const webgl1 = device.type === 'webgl';\r\n this._lightIndexProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = (webgl1 ? pb.vec3() : pb.vec2()).attrib('position');\r\n this.$outputs.value = webgl1 ? pb.vec4() : pb.uvec4();\r\n this.invProjMatrix = pb.mat4().uniform(0);\r\n this.viewMatrix = pb.mat4().uniform(0);\r\n this.sizeParam = pb.vec4().uniform(0);\r\n this.countParam = pb.ivec4().uniform(0);\r\n this[ShaderHelper.getLightBufferUniformName()] =\r\n pb.vec4[(ShaderHelper.getMaxClusteredLightCount() + 1) * 4]().uniformBuffer(0);\r\n pb.func('lineIntersectionToZPlane', [pb.vec3('a'), pb.vec3('b'), pb.float('zDistance')], function () {\r\n this.$l.normal = pb.vec3(0, 0, 1);\r\n this.$l.ab = pb.sub(this.b, this.a);\r\n this.$l.t = pb.div(\r\n pb.sub(this.zDistance, pb.dot(this.normal, this.a)),\r\n pb.dot(this.normal, this.ab)\r\n );\r\n this.$return(pb.add(this.a, pb.mul(this.t, this.ab)));\r\n });\r\n pb.func('clipToView', [pb.vec4('clip')], function () {\r\n this.$l.view = pb.mul(this.invProjMatrix, this.clip);\r\n this.$return(pb.div(this.view, this.view.w));\r\n });\r\n pb.func('screenToView', [pb.vec4('screen')], function () {\r\n this.$l.texCoord = pb.div(this.screen.xy, this.sizeParam.xy);\r\n this.$l.clip = pb.vec4(\r\n pb.sub(pb.mul(pb.vec2(this.texCoord.x, pb.sub(1, this.texCoord.y)), 2), pb.vec2(1)),\r\n this.screen.z,\r\n this.screen.w\r\n );\r\n this.$return(this.clipToView(this.clip));\r\n });\r\n pb.func(\r\n 'sphereIntersectsAABB',\r\n [pb.vec4('sphere'), pb.vec3('aabbMin'), pb.vec3('aabbMax')],\r\n function () {\r\n this.$l.dmin = pb.float(0);\r\n this.$if(pb.lessThanEqual(this.sphere.w, 0), function () {\r\n this.$return(true);\r\n });\r\n this.$for(pb.int('i'), 0, 3, function () {\r\n this.$if(pb.lessThan(this.sphere.at(this.i), this.aabbMin.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMin.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n }).$elseif(pb.greaterThan(this.sphere.at(this.i), this.aabbMax.at(this.i)), function () {\r\n this.$l.delta = pb.sub(this.sphere.at(this.i), this.aabbMax.at(this.i));\r\n this.dmin = pb.add(this.dmin, pb.mul(this.delta, this.delta));\r\n });\r\n });\r\n this.$if(pb.lessThanEqual(this.dmin, pb.mul(this.sphere.w, this.sphere.w)), function () {\r\n this.$return(true);\r\n });\r\n this.$return(false);\r\n }\r\n );\r\n pb.main(function () {\r\n if (pb.getDevice().type !== 'webgpu') {\r\n this.$builtins.pointSize = 1;\r\n }\r\n this.$builtins.position = pb.vec4(this.$inputs.pos.xy, 0, 1);\r\n if (pb.getDevice().type === 'webgpu') {\r\n this.$builtins.position = pb.mul(this.$builtins.position, pb.vec4(1, -1, 1, 1));\r\n }\r\n this.$l.tileIndex = webgl1 ? pb.int(this.$inputs.pos.z) : pb.int(this.$builtins.vertexIndex);\r\n this.$l.tileSize = pb.div(this.sizeParam.xy, pb.vec2(this.countParam.xy));\r\n this.$l.zIndex = pb.div(this.tileIndex, pb.mul(this.countParam.x, this.countParam.y));\r\n this.$l.yIndex = pb.div(\r\n pb.sub(this.tileIndex, pb.mul(this.zIndex, this.countParam.x, this.countParam.y)),\r\n this.countParam.x\r\n );\r\n this.$l.xIndex = pb.sub(\r\n this.tileIndex,\r\n pb.add(\r\n pb.mul(this.zIndex, this.countParam.x, this.countParam.y),\r\n pb.mul(this.yIndex, this.countParam.x)\r\n )\r\n );\r\n this.$l.maxPoint_sS = pb.vec4(\r\n pb.mul(\r\n pb.vec2(pb.float(pb.add(this.xIndex, 1)), pb.float(pb.add(this.yIndex, 1))),\r\n this.tileSize\r\n ),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.minPoint_sS = pb.vec4(\r\n pb.mul(pb.vec2(pb.float(this.xIndex), pb.float(this.yIndex)), this.tileSize),\r\n 0.0,\r\n 1.0\r\n );\r\n this.$l.maxPoint_vS = this.screenToView(this.maxPoint_sS).xyz;\r\n this.$l.minPoint_vS = this.screenToView(this.minPoint_sS).xyz;\r\n this.$l.tileNear = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.float(this.zIndex), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.tileFar = pb.mul(\r\n pb.neg(this.sizeParam.z),\r\n pb.pow(\r\n pb.div(this.sizeParam.w, this.sizeParam.z),\r\n pb.div(pb.add(pb.float(this.zIndex), 1), pb.float(this.countParam.z))\r\n )\r\n );\r\n this.$l.eyePos = pb.vec3(0);\r\n this.$l.minPointNear = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileNear);\r\n this.$l.minPointFar = this.lineIntersectionToZPlane(this.eyePos, this.minPoint_vS, this.tileFar);\r\n this.$l.maxPointNear = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileNear);\r\n this.$l.maxPointFar = this.lineIntersectionToZPlane(this.eyePos, this.maxPoint_vS, this.tileFar);\r\n this.$l.aabbMin = pb.min(\r\n pb.min(this.minPointNear, this.minPointFar),\r\n pb.min(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.aabbMax = pb.max(\r\n pb.max(this.minPointNear, this.minPointFar),\r\n pb.max(this.maxPointNear, this.maxPointFar)\r\n );\r\n this.$l.n = pb.int(0);\r\n if (webgl1) {\r\n this.$l.lightIndices = pb.float[8]();\r\n this.$for(pb.int('i'), 0, 8, function () {\r\n this.lightIndices.setAt(this.i, 0);\r\n });\r\n this.$for(pb.int('i'), 1, 256, function () {\r\n this.$if(pb.equal(this.i, this.countParam.w), function () {\r\n this.$break();\r\n });\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.$for(pb.int('j'), 0, 8, function () {\r\n this.$if(pb.equal(this.j, this.n), function () {\r\n this.lightIndices.setAt(this.j, pb.float(this.i));\r\n this.n = pb.add(this.n, 1);\r\n this.$break();\r\n });\r\n });\r\n this.$if(pb.equal(this.n, 8), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$outputs.value.r = pb.add(pb.mul(this.lightIndices[0], 256), this.lightIndices[1]);\r\n this.$outputs.value.g = pb.add(pb.mul(this.lightIndices[2], 256), this.lightIndices[3]);\r\n this.$outputs.value.b = pb.add(pb.mul(this.lightIndices[4], 256), this.lightIndices[5]);\r\n this.$outputs.value.a = pb.add(pb.mul(this.lightIndices[6], 256), this.lightIndices[7]);\r\n } else {\r\n this.$l.lightIndex = [\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0),\r\n pb.uint(0)\r\n ];\r\n this.$for(pb.uint('i'), 1, pb.uint(this.countParam.w), function () {\r\n this.$l.light = this[ShaderHelper.getLightBufferUniformName()].at(pb.mul(this.i, 4));\r\n this.$l.lightPos = pb.mul(this.viewMatrix, pb.vec4(this.light.xyz, 1));\r\n this.$l.lightPos.w = this.light.w;\r\n this.$if(this.sphereIntersectsAABB(this.lightPos, this.aabbMin, this.aabbMax), function () {\r\n this.lightIndex.setAt(this.n, this.i);\r\n this.n = pb.add(this.n, 1);\r\n this.$if(pb.equal(this.n, 16), function () {\r\n this.$break();\r\n });\r\n });\r\n });\r\n this.$l.r = pb.add(\r\n pb.sal(this.lightIndex[0], 24),\r\n pb.sal(this.lightIndex[1], 16),\r\n pb.sal(this.lightIndex[2], 8),\r\n this.lightIndex[3]\r\n );\r\n this.$l.g = pb.add(\r\n pb.sal(this.lightIndex[4], 24),\r\n pb.sal(this.lightIndex[5], 16),\r\n pb.sal(this.lightIndex[6], 8),\r\n this.lightIndex[7]\r\n );\r\n this.$l.b = pb.add(\r\n pb.sal(this.lightIndex[8], 24),\r\n pb.sal(this.lightIndex[9], 16),\r\n pb.sal(this.lightIndex[10], 8),\r\n this.lightIndex[11]\r\n );\r\n this.$l.a = pb.add(\r\n pb.sal(this.lightIndex[12], 24),\r\n pb.sal(this.lightIndex[13], 16),\r\n pb.sal(this.lightIndex[14], 8),\r\n this.lightIndex[15]\r\n );\r\n this.$outputs.value = pb.uvec4(this.r, this.g, this.b, this.a);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = webgl1 ? pb.vec4() : pb.uvec4();\r\n pb.main(function () {\r\n this.$outputs.color = this.$inputs.value;\r\n });\r\n }\r\n })!;\r\n this._lightIndexProgram.name = '@ClusteredLight_Index';\r\n this._bindGroup = device.createBindGroup(this._lightIndexProgram.bindGroupLayouts[0]);\r\n this._lightBuffer?.dispose();\r\n const lightBufferType = this._lightIndexProgram.getBindingInfo(\r\n ShaderHelper.getLightBufferUniformName()!\r\n )!.type;\r\n this._lightBuffer = device.createStructuredBuffer(lightBufferType as PBStructTypeInfo, {\r\n usage: 'uniform'\r\n });\r\n }\r\n private createLightIndexTexture(device: AbstractDevice) {\r\n const exp = Math.log2(this._tileCountX * this._tileCountY * this._tileCountZ);\r\n const a = (exp + 1) >>> 1;\r\n const b = exp - a;\r\n const textureWidth = 2 << (a - 1);\r\n const textureHeight = 2 << (b - 1);\r\n if (textureWidth * textureHeight !== this._tileCountX * this._tileCountY * this._tileCountZ) {\r\n throw new Error('Internal error');\r\n }\r\n this._lightIndexTexture = device.createTexture2D(\r\n device.type === 'webgl' ? 'rgba32f' : 'rgba32ui',\r\n textureWidth,\r\n textureHeight,\r\n { mipmapping: false }\r\n )!;\r\n this._lightIndexTexture.name = 'ClusterLightIndex';\r\n this._lightIndexFramebuffer?.dispose();\r\n this._lightIndexFramebuffer = device.createFrameBuffer([this._lightIndexTexture], null);\r\n }\r\n calculateLightIndex(camera: Camera, renderQueue: RenderQueue) {\r\n const numLights = this.getVisibleLights(renderQueue, this._lights);\r\n const device = getDevice();\r\n if (!this._lightIndexTexture) {\r\n this.createLightIndexTexture(device);\r\n }\r\n if (!this._lightIndexProgram) {\r\n this.createProgram(device);\r\n }\r\n if (!this._lightIndexVertexLayout) {\r\n this.createVertexLayout(device, this._lightIndexTexture!.width, this._lightIndexTexture!.height);\r\n }\r\n if (!this._lightIndexRenderStates) {\r\n this.createRenderState(device);\r\n }\r\n const viewport = device.getViewport();\r\n const vw = device.screenXToDevice(viewport.width);\r\n const vh = device.screenYToDevice(viewport.height);\r\n const scale = this._tileCountZ / Math.log2(camera.getFarPlane() / camera.getNearPlane());\r\n const bias = -(\r\n (this._tileCountZ * Math.log2(camera.getNearPlane())) /\r\n Math.log2(camera.getFarPlane() / camera.getNearPlane())\r\n );\r\n this._clusterParam.setXYZW(vw, vh, scale, bias);\r\n this._sizeParam.setXYZW(vw, vh, camera.getNearPlane(), camera.getFarPlane());\r\n this._countParam[0] = this._tileCountX;\r\n this._countParam[1] = this._tileCountY;\r\n this._countParam[2] = this._tileCountZ;\r\n // countParam.w stores light count + 1 because clustered indices start from 1.\r\n // Keep it valid even when there are no unshadowed punctual lights so deferred\r\n // passes can still evaluate emissive / env lighting without invalid cluster math.\r\n this._countParam[3] = numLights + 1;\r\n device.pushDeviceStates();\r\n device.setFramebuffer(this._lightIndexFramebuffer);\r\n if (numLights > 0) {\r\n if (this._lightBuffer!.disposed) {\r\n this._lightBuffer!.reload();\r\n }\r\n this._lightBuffer!.bufferSubData(0, this._lights);\r\n this._bindGroup!.setValue('invProjMatrix', camera.getInvProjectionMatrix());\r\n this._bindGroup!.setValue('viewMatrix', camera.viewMatrix);\r\n this._bindGroup!.setValue('sizeParam', this._sizeParam);\r\n this._bindGroup!.setValue('countParam', this._countParam);\r\n this._bindGroup!.setBuffer(ShaderHelper.getLightBufferUniformName(), this._lightBuffer!);\r\n device.setProgram(this._lightIndexProgram);\r\n device.setVertexLayout(this._lightIndexVertexLayout);\r\n device.setBindGroup(0, this._bindGroup!);\r\n const savedRS = device.getRenderStates();\r\n device.setRenderStates(this._lightIndexRenderStates);\r\n device.draw('point-list', 0, this._tileCountX * this._tileCountY * this._tileCountZ);\r\n device.setRenderStates(savedRS);\r\n } else {\r\n device.clearFrameBuffer(new Vector4(0, 0, 0, 0), 1, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n private getVisibleLights(renderQueue: RenderQueue, lights: Float32Array) {\r\n const numLights = Math.min(renderQueue.unshadowedLights.length, ShaderHelper.getMaxClusteredLightCount());\r\n for (let i = 1; i <= numLights; i++) {\r\n const light = renderQueue.unshadowedLights[i - 1];\r\n const offset = i * 16;\r\n lights.set(light.positionAndRange, offset);\r\n lights.set(light.directionAndCutoff, offset + 4);\r\n lights.set(light.diffuseAndIntensity, offset + 8);\r\n lights.set(light.extraParams, offset + 12);\r\n }\r\n return numLights;\r\n }\r\n}\r\n"],"names":["ClusteredLight","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","Float32Array","ShaderHelper","getMaxClusteredLightCount","Vector4","Int32Array","lightBuffer","clusterParam","countParam","lightIndexTexture","createVertexLayout","device","textureWidth","textureHeight","vb","type","vertices","i","length","ix","iy","Math","floor","createVertexBuffer","vertexBuffers","buffer","createRenderState","createRenderStateSet","useDepthState","enableTest","enableWrite","useRasterizerState","setCullMode","createProgram","webgl1","buildRenderProgram","vertex","pb","$inputs","pos","vec3","vec2","attrib","$outputs","value","vec4","uvec4","invProjMatrix","mat4","uniform","viewMatrix","sizeParam","ivec4","getLightBufferUniformName","uniformBuffer","func","float","$l","normal","ab","sub","b","a","t","div","zDistance","dot","$return","add","mul","view","clip","w","texCoord","screen","xy","x","y","z","clipToView","dmin","$if","lessThanEqual","sphere","$for","int","lessThan","at","aabbMin","delta","$elseif","greaterThan","aabbMax","main","getDevice","$builtins","pointSize","position","tileIndex","vertexIndex","tileSize","zIndex","yIndex","xIndex","maxPoint_sS","minPoint_sS","maxPoint_vS","screenToView","xyz","minPoint_vS","tileNear","neg","pow","tileFar","eyePos","minPointNear","lineIntersectionToZPlane","minPointFar","maxPointNear","maxPointFar","min","max","n","lightIndices","setAt","equal","$break","light","lightPos","sphereIntersectsAABB","j","r","g","lightIndex","uint","sal","fragment","color","name","createBindGroup","bindGroupLayouts","dispose","lightBufferType","getBindingInfo","createStructuredBuffer","usage","createLightIndexTexture","exp","log2","Error","createTexture2D","mipmapping","createFrameBuffer","calculateLightIndex","camera","renderQueue","numLights","getVisibleLights","width","height","viewport","getViewport","vw","screenXToDevice","vh","screenYToDevice","scale","getFarPlane","getNearPlane","bias","setXYZW","pushDeviceStates","setFramebuffer","disposed","reload","bufferSubData","setValue","getInvProjectionMatrix","setBuffer","setProgram","setVertexLayout","setBindGroup","savedRS","getRenderStates","setRenderStates","draw","clearFrameBuffer","popDeviceStates","lights","unshadowedLights","offset","set","positionAndRange","directionAndCutoff","diffuseAndIntensity","extraParams"],"mappings":"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"}
|
|
@@ -76,6 +76,10 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
76
76
|
return this.visitPunctualLight(target);
|
|
77
77
|
} else if (target.isBatchGroup()) {
|
|
78
78
|
return this.visitBatchGroup(target);
|
|
79
|
+
} else if (target.isMSDFTextSprite()) {
|
|
80
|
+
return this.visitMSDFTextSprite(target);
|
|
81
|
+
} else if (target.isMSDFText()) {
|
|
82
|
+
return this.visitMSDFText(target);
|
|
79
83
|
} else {
|
|
80
84
|
return false;
|
|
81
85
|
}
|
|
@@ -130,6 +134,30 @@ import { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../va
|
|
|
130
134
|
}
|
|
131
135
|
return false;
|
|
132
136
|
}
|
|
137
|
+
visitMSDFText(node) {
|
|
138
|
+
if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
|
|
139
|
+
const clipState = this.getClipStateWithNode(node);
|
|
140
|
+
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
141
|
+
for (const batch of node.batches){
|
|
142
|
+
this.push(this._camera, batch);
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
visitMSDFTextSprite(node) {
|
|
150
|
+
if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {
|
|
151
|
+
const clipState = this.getClipStateWithNode(node);
|
|
152
|
+
if (clipState !== ClipState.NOT_CLIPPED) {
|
|
153
|
+
for (const batch of node.batches){
|
|
154
|
+
this.push(this._camera, batch);
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
133
161
|
/** @internal */ visitMesh(node) {
|
|
134
162
|
if (!node.hidden && (node.castShadow || !this._isShadowMapping) && (node.gpuPickable || !this._isGPUPicking)) {
|
|
135
163
|
const clipState = this.getClipStateWithNode(node);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cull_visitor.js","sources":["../../src/render/cull_visitor.ts"],"sourcesContent":["import type { AABB } from '@zephyr3d/base';\r\nimport { ClipState } from '@zephyr3d/base';\r\nimport { OctreeNode } from '../scene/octree';\r\nimport { RENDER_PASS_TYPE_OBJECT_COLOR, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { GraphNode } from '../scene/graph_node';\r\nimport type { RenderQueue } from './render_queue';\r\nimport type { RenderPass, Drawable } from '.';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { ClipmapTerrain } from '../scene/terrain-cm';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { Visitor } from '../scene/visitor';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { SceneNode } from '../scene/scene_node';\r\nimport type { BatchGroup } from '../scene/batchgroup';\r\nimport type { MSDFText, MSDFTextSprite, ParticleSystem, Sprite } from '../scene';\r\nimport type { Water } from '../scene/water';\r\n\r\n/**\r\n * Node visitor for culling\r\n * @public\r\n */\r\nexport class CullVisitor implements Visitor<SceneNode | OctreeNode> {\r\n /** @internal */\r\n private _camera: Camera;\r\n /** @internal */\r\n private _skipClipTest: boolean;\r\n /** @internal */\r\n private _renderQueue: RenderQueue;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private readonly _isGPUPicking: boolean;\r\n /** @internal */\r\n private readonly _isShadowMapping: boolean;\r\n /**\r\n * Creates an instance of CullVisitor\r\n * @param renderPass - Render pass for the culling task\r\n * @param camera - Camera that will be used for culling\r\n * @param rendeQueue - RenderQueue\r\n * @param viewPoint - Camera position of the primary render pass\r\n */\r\n constructor(renderPass: RenderPass, camera: Camera, renderQueue: RenderQueue) {\r\n this._camera = camera;\r\n this._renderQueue = renderQueue;\r\n this._skipClipTest = false;\r\n this._renderPass = renderPass;\r\n this._isGPUPicking = this._renderPass.type === RENDER_PASS_TYPE_OBJECT_COLOR;\r\n this._isShadowMapping = this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP;\r\n }\r\n /** The camera that will be used for culling */\r\n get camera() {\r\n return this._camera;\r\n }\r\n set camera(camera: Camera) {\r\n this._camera = camera || null;\r\n }\r\n /** true if cull with frustum culling, otherwise false. default is true */\r\n get frustumCulling() {\r\n return !this._skipClipTest;\r\n }\r\n set frustumCulling(val) {\r\n this._skipClipTest = !val;\r\n }\r\n /** Render pass for the culling task */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /** The result of culling */\r\n get renderQueue() {\r\n return this._renderQueue;\r\n }\r\n set renderQueue(renderQueue: RenderQueue) {\r\n this._renderQueue = renderQueue;\r\n }\r\n /** Frustum for culling */\r\n get frustum() {\r\n return this._camera?.frustum || null;\r\n }\r\n /** @internal */\r\n push(camera: Camera, drawable: Drawable) {\r\n this.renderQueue.push(camera, drawable);\r\n }\r\n /** @internal */\r\n pushRenderQueue(renderQueue: RenderQueue) {\r\n this.renderQueue.pushRenderQueue(renderQueue);\r\n }\r\n /**\r\n * Visits a node\r\n * @param target - The node to be visit\r\n */\r\n visit(target: SceneNode | OctreeNode) {\r\n if (target instanceof OctreeNode) {\r\n return this.visitOctreeNode(target);\r\n } else if (target.isMesh()) {\r\n return this.visitMesh(target);\r\n } else if (target.isSprite()) {\r\n return this.visitSprite(target);\r\n } else if (target.isWater()) {\r\n return this.visitWater(target);\r\n } else if (target.isParticleSystem()) {\r\n return this.visitParticleSystem(target);\r\n } else if (target.isClipmapTerrain()) {\r\n return this.visitClipmapTerrain(target);\r\n } else if (target.isPunctualLight()) {\r\n return this.visitPunctualLight(target);\r\n } else if (target.isBatchGroup()) {\r\n return this.visitBatchGroup(target);\r\n } else if (target.isMSDFTextSprite()) {\r\n return this.visitMSDFTextSprite(target);\r\n } else if (target.isMSDFText()) {\r\n return this.visitMSDFText(target);\r\n } else {\r\n return false;\r\n }\r\n }\r\n /** @internal */\r\n visitPunctualLight(node: PunctualLight) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.renderQueue.pushLight(node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitClipmapTerrain(node: ClipmapTerrain) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitBatchGroup(node: BatchGroup) {\r\n if (!node.hidden) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n node.cull(this);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitParticleSystem(node: ParticleSystem) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitSprite(node: Sprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFText(node: MSDFText) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n visitMSDFTextSprite(node: MSDFTextSprite) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n for (const batch of node.batches) {\r\n this.push(this._camera, batch);\r\n }\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitMesh(node: Mesh) {\r\n if (\r\n !node.hidden &&\r\n (node.castShadow || !this._isShadowMapping) &&\r\n (node.gpuPickable || !this._isGPUPicking)\r\n ) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitWater(node: Water) {\r\n if (!node.hidden && !this._isShadowMapping && (node.gpuPickable || !this._isGPUPicking)) {\r\n const clipState = this.getClipStateWithNode(node);\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n this.push(this._camera, node);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n visitOctreeNode(node: OctreeNode) {\r\n const clipState =\r\n node.getLevel() > 0 ? this.getClipStateWithAABB(node.getBoxLoosed()) : ClipState.CLIPPED;\r\n if (clipState !== ClipState.NOT_CLIPPED) {\r\n const saveSkipFlag = this._skipClipTest;\r\n this._skipClipTest = this._skipClipTest || clipState === ClipState.A_INSIDE_B;\r\n const nodes = node.getNodes();\r\n for (let i = 0; i < nodes.length; i++) {\r\n this.visit(nodes[i]);\r\n }\r\n this._skipClipTest = saveSkipFlag;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n protected getClipStateWithNode(node: GraphNode) {\r\n let clipState: ClipState;\r\n if (this._skipClipTest) {\r\n clipState = ClipState.A_INSIDE_B;\r\n } else if (!node.clipTestEnabled) {\r\n clipState = ClipState.CLIPPED;\r\n } else {\r\n const bv = node.getWorldBoundingVolume();\r\n clipState = bv ? this.getClipStateWithAABB(bv.toAABB()) : ClipState.CLIPPED;\r\n }\r\n return clipState;\r\n }\r\n /** @internal */\r\n protected getClipStateWithAABB(aabb: AABB) {\r\n return this.camera.clipMask\r\n ? aabb.getClipStateWithFrustumMask(this.frustum, this.camera.clipMask)\r\n : aabb.getClipStateWithFrustum(this.frustum);\r\n }\r\n}\r\n"],"names":["CullVisitor","renderPass","camera","renderQueue","_camera","_renderQueue","_skipClipTest","_renderPass","_isGPUPicking","type","RENDER_PASS_TYPE_OBJECT_COLOR","_isShadowMapping","RENDER_PASS_TYPE_SHADOWMAP","frustumCulling","val","frustum","push","drawable","pushRenderQueue","visit","target","OctreeNode","visitOctreeNode","isMesh","visitMesh","isSprite","visitSprite","isWater","visitWater","isParticleSystem","visitParticleSystem","isClipmapTerrain","visitClipmapTerrain","isPunctualLight","visitPunctualLight","isBatchGroup","visitBatchGroup","isMSDFTextSprite","visitMSDFTextSprite","isMSDFText","visitMSDFText","node","hidden","clipState","getClipStateWithNode","ClipState","NOT_CLIPPED","pushLight","castShadow","gpuPickable","cull","batch","batches","getLevel","getClipStateWithAABB","getBoxLoosed","CLIPPED","saveSkipFlag","A_INSIDE_B","nodes","getNodes","i","length","clipTestEnabled","bv","getWorldBoundingVolume","toAABB","aabb","clipMask","getClipStateWithFrustumMask","getClipStateWithFrustum"],"mappings":"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"}
|