@zephyr3d/scene 0.9.21 → 0.9.23
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/joint_dynamics/collision.js +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9100 -8712
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +186 -11
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +51 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +1196 -0
- package/dist/posteffect/ssgi.js.map +1 -0
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +137 -49
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +12 -6
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +41 -0
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +10 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +197 -35
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +96 -29
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi.js +63 -0
- package/dist/shaders/ssgi.js.map +1 -0
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +13 -8
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +15 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +15 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +17 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +20 -2
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +10 -3
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +16 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +10 -8
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +2 -3
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
- package/dist/animation/joint_dynamics/convex_collider.js +0 -320
- package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
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 { MAX_CLUSTERED_LIGHTS, MAX_SHADOW_MASK_LIGHTS } from '../values';\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 type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\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 private _numShadowLights: number;\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 * (MAX_CLUSTERED_LIGHTS + 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 this._numShadowLights = 0;\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\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[(MAX_CLUSTERED_LIGHTS + 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, camera.screenSpaceShadowMask);\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 clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\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, useShadowMask: boolean) {\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 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 // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(renderQueue.shadowedLights.length, MAX_SHADOW_MASK_LIGHTS, MAX_CLUSTERED_LIGHTS);\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Unshadowed lights fill the region after the mask-backed shadow lights.\r\n const numUnshadowed = Math.min(renderQueue.unshadowedLights.length, MAX_CLUSTERED_LIGHTS - slot);\r\n for (let j = 0; j < numUnshadowed; j++) {\r\n writeLight(renderQueue.unshadowedLights[j], slot + j + 1);\r\n }\r\n slot += numUnshadowed;\r\n // Shadow-casting lights beyond the mask capacity (MAX_SHADOW_MASK_LIGHTS) have\r\n // no mask slot. Rather than dropping them silently, place them past index N so\r\n // they are still lit — without a mask sample, i.e. degraded to no shadow.\r\n if (useShadowMask && renderQueue.shadowedLights.length > numShadow) {\r\n const overflow = renderQueue.shadowedLights.length - numShadow;\r\n const numOverflow = Math.min(overflow, MAX_CLUSTERED_LIGHTS - slot);\r\n for (let k = 0; k < numOverflow; k++) {\r\n writeLight(renderQueue.shadowedLights[numShadow + k], slot + k + 1);\r\n }\r\n slot += numOverflow;\r\n if (!ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${numOverflow < overflow ? `, and ${overflow - numOverflow} dropped` : ''}.`\r\n );\r\n }\r\n }\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["ClusteredLight","_warnedShadowMaskOverflow","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","_numShadowLights","Float32Array","MAX_CLUSTERED_LIGHTS","Vector4","Int32Array","lightBuffer","numShadowLights","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","ShaderHelper","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","screenSpaceShadowMask","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","useShadowMask","writeLight","slot","offset","set","positionAndRange","directionAndCutoff","diffuseAndIntensity","extraParams","numShadow","shadowedLights","MAX_SHADOW_MASK_LIGHTS","numUnshadowed","unshadowedLights","overflow","numOverflow","k","console","warn"],"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 { DEPTH_CLEAR_VALUE, Vector4 } from '@zephyr3d/base';\r\nimport { MAX_CLUSTERED_LIGHTS, MAX_SHADOW_MASK_LIGHTS } from '../values';\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 type { PunctualLight } from '../scene/light';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport class ClusteredLight {\r\n /** Emit the shadow-mask overflow warning only once per session. */\r\n private static _warnedShadowMaskOverflow = false;\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 private _numShadowLights: number;\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 * (MAX_CLUSTERED_LIGHTS + 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 this._numShadowLights = 0;\r\n }\r\n get lightBuffer() {\r\n return this._lightBuffer;\r\n }\r\n /**\r\n * Number of shadow-casting lights placed at the head of the clustered light\r\n * buffer (indices `1..N`), each backed by a screen-space shadow mask slot.\r\n * Zero unless the screen-space shadow mask path is active.\r\n */\r\n get numShadowLights() {\r\n return this._numShadowLights;\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[(MAX_CLUSTERED_LIGHTS + 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(\r\n camera: Camera,\r\n renderQueue: RenderQueue,\r\n screenSpaceShadowMask = camera.screenSpaceShadowMask,\r\n preExposure = 1\r\n ) {\r\n const numLights = this.getVisibleLights(renderQueue, this._lights, screenSpaceShadowMask, preExposure);\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 clustered\r\n // shading math stays well-defined for emissive and environment lighting paths.\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), DEPTH_CLEAR_VALUE, 0);\r\n }\r\n device.popDeviceStates();\r\n }\r\n private getVisibleLights(\r\n renderQueue: RenderQueue,\r\n lights: Float32Array,\r\n useShadowMask: boolean,\r\n preExposure: number\r\n ) {\r\n const writeLight = (light: PunctualLight, slot: number) => {\r\n const offset = slot * 16;\r\n const colorIntensity = light.diffuseAndIntensity;\r\n lights.set(light.positionAndRange, offset);\r\n lights.set(light.directionAndCutoff, offset + 4);\r\n // Only the intensity carries the camera pre-exposure; the color stays as authored. The\r\n // light's own cached vector must not be mutated because it is shared across cameras.\r\n lights[offset + 8] = colorIntensity.x;\r\n lights[offset + 9] = colorIntensity.y;\r\n lights[offset + 10] = colorIntensity.z;\r\n lights[offset + 11] = colorIntensity.w * preExposure;\r\n lights.set(light.extraParams, offset + 12);\r\n };\r\n // When the screen-space shadow mask is active, shadow-casting lights occupy\r\n // the head of the buffer (slots 1..N) in the exact order of\r\n // renderQueue.shadowedLights. The mask pass must assign layers/channels from\r\n // the SAME list in the SAME order so that a light's buffer index maps to its\r\n // mask slot without storing a per-light index. Keep these two in lockstep.\r\n let numShadow = 0;\r\n let slot = 0;\r\n if (useShadowMask) {\r\n numShadow = Math.min(renderQueue.shadowedLights.length, MAX_SHADOW_MASK_LIGHTS, MAX_CLUSTERED_LIGHTS);\r\n for (let i = 1; i <= numShadow; i++) {\r\n writeLight(renderQueue.shadowedLights[i - 1], i);\r\n }\r\n slot = numShadow;\r\n }\r\n // Unshadowed lights fill the region after the mask-backed shadow lights.\r\n const numUnshadowed = Math.min(renderQueue.unshadowedLights.length, MAX_CLUSTERED_LIGHTS - slot);\r\n for (let j = 0; j < numUnshadowed; j++) {\r\n writeLight(renderQueue.unshadowedLights[j], slot + j + 1);\r\n }\r\n slot += numUnshadowed;\r\n // Shadow-casting lights beyond the mask capacity (MAX_SHADOW_MASK_LIGHTS) have\r\n // no mask slot. Rather than dropping them silently, place them past index N so\r\n // they are still lit — without a mask sample, i.e. degraded to no shadow.\r\n if (useShadowMask && renderQueue.shadowedLights.length > numShadow) {\r\n const overflow = renderQueue.shadowedLights.length - numShadow;\r\n const numOverflow = Math.min(overflow, MAX_CLUSTERED_LIGHTS - slot);\r\n for (let k = 0; k < numOverflow; k++) {\r\n writeLight(renderQueue.shadowedLights[numShadow + k], slot + k + 1);\r\n }\r\n slot += numOverflow;\r\n if (!ClusteredLight._warnedShadowMaskOverflow) {\r\n ClusteredLight._warnedShadowMaskOverflow = true;\r\n console.warn(\r\n `ClusteredLight: ${renderQueue.shadowedLights.length} shadow-casting lights exceed the ` +\r\n `screen-space shadow mask capacity (${MAX_SHADOW_MASK_LIGHTS}); ${overflow} light(s) are ` +\r\n `lit without shadows${numOverflow < overflow ? `, and ${overflow - numOverflow} dropped` : ''}.`\r\n );\r\n }\r\n }\r\n this._numShadowLights = numShadow;\r\n return slot;\r\n }\r\n}\r\n"],"names":["ClusteredLight","_warnedShadowMaskOverflow","_tileCountX","_tileCountY","_tileCountZ","_lights","_lightIndexTexture","_lightIndexFramebuffer","_lightIndexProgram","_bindGroup","_lightIndexVertexLayout","_lightIndexRenderStates","_lightBuffer","_sizeParam","_countParam","_clusterParam","_numShadowLights","Float32Array","MAX_CLUSTERED_LIGHTS","Vector4","Int32Array","lightBuffer","numShadowLights","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","ShaderHelper","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","screenSpaceShadowMask","preExposure","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","DEPTH_CLEAR_VALUE","popDeviceStates","lights","useShadowMask","writeLight","slot","offset","colorIntensity","diffuseAndIntensity","set","positionAndRange","directionAndCutoff","extraParams","numShadow","shadowedLights","MAX_SHADOW_MASK_LIGHTS","numUnshadowed","unshadowedLights","overflow","numOverflow","k","console","warn"],"mappings":"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"}
|
|
@@ -111,12 +111,15 @@ function mixinDrawable(baseCls) {
|
|
|
111
111
|
}
|
|
112
112
|
pushRenderQueueRef(ref) {
|
|
113
113
|
this.renderQueueRefPrune();
|
|
114
|
-
this._mdRenderQueueRef.
|
|
114
|
+
if (!this._mdRenderQueueRef.includes(ref)) {
|
|
115
|
+
this._mdRenderQueueRef.push(ref);
|
|
116
|
+
}
|
|
115
117
|
}
|
|
116
118
|
renderQueueRefPrune(force = false) {
|
|
117
119
|
for(let i = this._mdRenderQueueRef.length - 1; i >= 0; i--){
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
+
const queueRef = this._mdRenderQueueRef[i];
|
|
121
|
+
const ref = queueRef.ref;
|
|
122
|
+
if (force || !queueRef.valid || ref.disposed) {
|
|
120
123
|
this._mdRenderQueueRef.splice(i, 1);
|
|
121
124
|
const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);
|
|
122
125
|
if (bindGroup) {
|
|
@@ -156,7 +159,7 @@ function mixinDrawable(baseCls) {
|
|
|
156
159
|
}
|
|
157
160
|
applyMaterialUniformsAll() {
|
|
158
161
|
for (const ref of this._mdRenderQueueRef){
|
|
159
|
-
if (ref.ref) {
|
|
162
|
+
if (ref.valid && !ref.ref.disposed) {
|
|
160
163
|
const instanceInfo = ref.ref.getInstanceInfo(this);
|
|
161
164
|
if (instanceInfo) {
|
|
162
165
|
this.applyMaterialUniforms(instanceInfo);
|
|
@@ -182,7 +185,7 @@ function mixinDrawable(baseCls) {
|
|
|
182
185
|
}
|
|
183
186
|
this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);
|
|
184
187
|
for (const ref of this._mdRenderQueueRef){
|
|
185
|
-
if (ref.ref) {
|
|
188
|
+
if (ref.valid && !ref.ref.disposed) {
|
|
186
189
|
this.applyTransformUniforms(ref.ref);
|
|
187
190
|
}
|
|
188
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const ref = this._mdRenderQueueRef[i].ref;\r\n if (force || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.ref) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","pushRenderQueueRef","ref","renderQueueRefPrune","force","i","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAIA,WAAc,GAAA,CAAA;AAClB,MAAMC,kBAAkB,IAAIC,OAAAA,EAAAA;AAE5B,MAAMC,iCAAiC,IAAIC,OAAAA,EAAAA;AAC3C,MAAMC,iCAAiC,IAAID,OAAAA,EAAAA;AAE3C,MAAME,iBAA8C,EAAC;AACrD,MAAMC,iBAA6C,IAAIH,OAAAA,EAAAA;AAEvD,SAASI,cAAeC,CAAAA,QAAiB,EAAEC,QAAiB,EAAEC,UAAmB,EAAA;IAC/E,MAAMC,IAAAA,GAAO,GAAGD,UAAW,CAAA,CAAC,EAAED,QAAS,CAAA,CAAC,EAAED,QAAU,CAAA,CAAA;IACpD,MAAMI,UAAAA,GAAaP,cAAc,CAACM,IAAK,CAAA;AACvC,IAAA,IAAIE,SAAiC,GAAA,IAAA;AACrC,IAAA,IAAID,UAAcA,IAAAA,UAAAA,CAAWE,MAAM,GAAG,CAAG,EAAA;AACvCD,QAAAA,SAAAA,GAAYD,WAAWG,GAAG,EAAA;KACrB,MAAA;AACL,QAAA,MAAMC,MAASC,GAAAA,YAAAA,CAAaC,0BAA0B,CAACV,UAAUC,QAAUC,EAAAA,UAAAA,CAAAA;QAC3EG,SAAYM,GAAAA,SAAAA,EAAAA,CAAYC,eAAe,CAACJ,MAAAA,CAAAA;AAC1C;IACAV,cAAee,CAAAA,GAAG,CAACR,SAAWF,EAAAA,IAAAA,CAAAA;IAC9B,OAAOE,SAAAA;AACT;AAEA,SAASS,iBAAiBT,SAA8B,EAAA;AACtD,IAAA,IAAIA,SAAW,EAAA;QACb,MAAMF,IAAAA,GAAOL,cAAeiB,CAAAA,GAAG,CAACV,SAAAA,CAAAA;AAChC,QAAA,IAAIF,IAAM,EAAA;AACRL,YAAAA,cAAAA,CAAekB,MAAM,CAACX,SAAAA,CAAAA;AACtBT,YAAAA,8BAAAA,CAA+BoB,MAAM,CAACX,SAAAA,CAAAA;YACtC,MAAMD,UAAAA,GAAaP,cAAc,CAACM,IAAK,CAAA;AACvC,YAAA,IAAIC,UAAY,EAAA;AACdA,gBAAAA,UAAAA,CAAWa,IAAI,CAACZ,SAAAA,CAAAA;aACX,MAAA;gBACLR,cAAc,CAACM,KAAK,GAAG;AAACE,oBAAAA;AAAU,iBAAA;AACpC;SACK,MAAA;AACLA,YAAAA,SAAAA,CAAUa,OAAO,EAAA;AACnB;AACF;AACF;AAEO,SAASC,cAMdC,OAAU,EAAA;AACV,IAAA,MAAMC,MAAM,cAAcD,OAAAA,CAAAA;QACPE,iBAAoC;QAC7CC,oBAA0C;QACjCC,6BAA2D;QACpEC,wBAA8C;QAC9CC,yBAA+C;QAC/CC,6BAAmD;QAC1CC,kBAA8C;QACvDC,iBAA2C;QAClCC,yBAAqD;QACrDC,sBAAkD;QAClDxC,WAAoB;QAC7ByC,YAAgC;QAChCC,iBAA0B;QAClC,WAAY,CAAA,GAAGC,IAAW,CAAE;AAC1B,YAAA,KAAK,CAAIA,GAAAA,IAAAA,CAAAA;YACT,IAAI,CAAC3C,WAAW,GAAG,EAAEA,WAAAA;YACrB,IAAI,CAACyC,YAAY,GAAG,IAAA;YACpB,IAAI,CAACV,iBAAiB,GAAG,EAAE;YAC3B,IAAI,CAACC,oBAAoB,GAAG,IAAA;YAC5B,IAAI,CAACC,6BAA6B,GAAG,IAAIW,GAAAA,EAAAA;YACzC,IAAI,CAACV,wBAAwB,GAAG,IAAA;YAChC,IAAI,CAACC,yBAAyB,GAAG,IAAA;YACjC,IAAI,CAACC,6BAA6B,GAAG,IAAA;AACrC,YAAA,IAAI,CAACC,kBAAkB,GAAG,IAAIQ,aAAa,CAAI,GAAA,CAAA,CAAA;YAC/C,IAAI,CAACP,iBAAiB,GAAG,IAAIQ,UAAAA,CAAW,IAAI,CAACT,kBAAkB,CAACU,MAAM,EAAE,CAAI,GAAA,EAAA,CAAA;YAC5E,IAAI,CAACR,yBAAyB,GAAG,IAAI,CAACF,kBAAkB,CAACW,QAAQ,CAAC,CAAG,EAAA,EAAA,CAAA;YACrE,IAAI,CAACR,sBAAsB,GAAG,IAAI,CAACH,kBAAkB,CAACW,QAAQ,CAAC,EAAI,EAAA,EAAA,CAAA;YACnE,IAAI,CAACT,yBAAyB,CAACjB,GAAG,CAAC,IAAI,CAAC2B,OAAO,EAAA,CAAGC,WAAW,CAAA;YAC7D,IAAI,CAACZ,iBAAiB,CAAC,CAAA,CAAE,GAAGlB,SAAY+B,EAAAA,CAAAA,SAAS,CAACC,YAAY;YAC9D,IAAI,CAACd,iBAAiB,CAAC,CAAA,CAAE,GAAG,IAAI,CAACA,iBAAiB,CAAC,CAAE,CAAA;YACrD,IAAI,CAACE,sBAAsB,CAAClB,GAAG,CAAC,IAAI,CAAC2B,OAAO,EAAA,CAAGC,WAAW,CAAA;YAC1D,IAAI,CAACR,iBAAiB,GAAG,EAAC;AAC1B,YAAA,IAAI,CAACO,OAAO,EAAGI,CAAAA,EAAE,CAAC,kBAAoB,EAAA,IAAA;AACpC,gBAAA,IAAI,CAACJ,OAAO,EAAA,CAAGK,KAAK,EAAEC,oBAAoB,IAAI,CAAA;AAChD,aAAA,CAAA;AACF;QACAC,aAAgB,GAAA;YACd,OAAO,IAAI,CAACxD,WAAW;AACzB;QACAyD,cAAqC,GAAA;AACnC,YAAA,IAAI,CAAC,IAAI,CAAChB,YAAY,EAAE;gBACtB,MAAMiB,CAAAA,GAAI,CAAC,IAAI,CAAC1D,WAAW,GAAG,IAAG,IAAK,GAAA;gBACtC,MAAM2D,CAAAA,GAAI,CAAC,IAAK,CAAC3D,WAAW,KAAK,CAAK,GAAA,IAAG,IAAK,GAAA;gBAC9C,MAAM4D,CAAAA,GAAI,CAAC,IAAK,CAAC5D,WAAW,KAAK,EAAM,GAAA,IAAG,IAAK,GAAA;gBAC/C,MAAM6D,CAAAA,GAAI,CAAC,IAAK,CAAC7D,WAAW,KAAK,EAAM,GAAA,IAAG,IAAK,GAAA;AAC/C,gBAAA,IAAI,CAACyC,YAAY,GAAG,IAAIqB,OAAQD,CAAAA,CAAAA,EAAGD,GAAGD,CAAGD,EAAAA,CAAAA,CAAAA;AAC3C;YACA,OAAO,IAAI,CAACjB,YAAY;AAC1B;AACAsB,QAAAA,kBAAAA,CAAmBC,GAAmB,EAAE;AACtC,YAAA,IAAI,CAACC,mBAAmB,EAAA;AACxB,YAAA,IAAI,CAAClC,iBAAiB,CAACL,IAAI,CAACsC,GAAAA,CAAAA;AAC9B;QACAC,mBAAoBC,CAAAA,KAAAA,GAAQ,KAAK,EAAE;YACjC,IAAK,IAAIC,CAAI,GAAA,IAAI,CAACpC,iBAAiB,CAAChB,MAAM,GAAG,CAAA,EAAGoD,CAAK,IAAA,CAAA,EAAGA,CAAK,EAAA,CAAA;AAC3D,gBAAA,MAAMH,MAAM,IAAI,CAACjC,iBAAiB,CAACoC,CAAAA,CAAE,CAACH,GAAG;gBACzC,IAAIE,KAAAA,IAASF,GAAII,CAAAA,QAAQ,EAAE;AACzB,oBAAA,IAAI,CAACrC,iBAAiB,CAACsC,MAAM,CAACF,CAAG,EAAA,CAAA,CAAA;AACjC,oBAAA,MAAMrD,YAAY,IAAI,CAACmB,6BAA6B,CAACT,GAAG,CAACwC,GAAAA,CAAAA;AACzD,oBAAA,IAAIlD,SAAW,EAAA;wBACbS,gBAAiBT,CAAAA,SAAAA,CAAAA;AACjB,wBAAA,IAAI,CAACmB,6BAA6B,CAACR,MAAM,CAACuC,GAAAA,CAAAA;AAC5C;AACF;AACF;AACF;AACAM,QAAAA,4BAAAA,CAA6BC,WAAwB,EAAEC,MAAc,EAAEC,MAAc,EAAE;AACrF,YAAA,MAAMC,oBAAoB,IAAI,CAACC,oBAAoB,CAACvD,aAAa,IAAMmD,EAAAA,WAAAA,CAAAA;AACvEG,YAAAA,iBAAAA,CAAkBE,QAAQ,CAAC1D,YAAa2D,CAAAA,gCAAgC,IAAIL,MAAU,IAAA,CAAA,CAAA;AACtFE,YAAAA,iBAAAA,CAAkBE,QAAQ,CAAC1D,YAAa4D,CAAAA,gCAAgC,IAAIL,MAAU,IAAA,CAAA,CAAA;AACxF;AACAM,QAAAA,sBAAAA,CAAuBR,WAAwB,EAAE;AAC/C,YAAA,MAAMS,YAAeT,GAAAA,WAAAA,CAAYU,eAAe,CAAC,IAAI,CAAA;AACrD,YAAA,MAAMC,UAAa,GAAA,IAAI,CAACjC,OAAO,GAAGkC,YAAY;AAC9C,YAAA,IAAIH,YAAc,EAAA;AAChB,gBAAA,MAAMI,GAAMjF,GAAAA,8BAAAA,CAA+BqB,GAAG,CAACwD,iBAAiB,EAAC;AACjE,gBAAA,IAAII,QAAQF,UAAY,EAAA;AACtBF,oBAAAA,YAAAA,CAAalE,SAAS,CAACA,SAAS,CAACuE,UAAU,CACzCnE,YAAaoE,CAAAA,0BAA0B,EACvCN,EAAAA,YAAAA,CAAaP,MAAM,GAAG,CAAA,EACtB,IAAI,CAACpC,kBAAkB,EACvB,CACA,EAAA,EAAA,CAAA;oBAEFlC,8BAA+BmB,CAAAA,GAAG,CAAC0D,YAAcE,EAAAA,UAAAA,CAAAA;AACnD;aACK,MAAA;AACL,gBAAA,MAAMR,oBAAoB,IAAI,CAACC,oBAAoB,CAACvD,aAAa,KAAOmD,EAAAA,WAAAA,CAAAA;AACxE,gBAAA,MAAMa,GAAM/E,GAAAA,8BAAAA,CAA+BmB,GAAG,CAACkD,sBAAsB,EAAC;AACtE,gBAAA,IAAIU,QAAQF,UAAY,EAAA;AACtBR,oBAAAA,iBAAAA,CAAkBE,QAAQ,CACxB1D,YAAAA,CAAaqE,yBAAyB,EACtC,EAAA,IAAI,CAAChD,yBAAyB,CAAA;AAEhCmC,oBAAAA,iBAAAA,CAAkBE,QAAQ,CACxB1D,YAAAA,CAAasE,6BAA6B,EAC1C,EAAA,IAAI,CAAChD,sBAAsB,CAAA;oBAE7BkC,iBAAkBE,CAAAA,QAAQ,CACxB1D,YAAauE,CAAAA,kCAAkC,IAC/C,IAAI,CAACnD,iBAAiB,CAAC,CAAE,CAAA,CAAA;AAE3B,oBAAA,IAAI,IAAK,CAAyBoD,eAAe,EAAI,EAAA;wBACnDhB,iBAAkBE,CAAAA,QAAQ,CACxB1D,YAAayE,CAAAA,+BAA+B,IAC5C,IAAK,CAAqBC,cAAc,CAAA;AAE5C;oBACAvF,8BAA+BiB,CAAAA,GAAG,CAACoD,iBAAmBQ,EAAAA,UAAAA,CAAAA;AACxD;AACF;AACF;QACAW,wBAA2B,GAAA;AACzB,YAAA,KAAK,MAAM7B,GAAAA,IAAO,IAAI,CAACjC,iBAAiB,CAAE;gBACxC,IAAIiC,GAAAA,CAAIA,GAAG,EAAE;AACX,oBAAA,MAAMgB,eAAehB,GAAIA,CAAAA,GAAG,CAACiB,eAAe,CAAC,IAAI,CAAA;AACjD,oBAAA,IAAID,YAAc,EAAA;wBAChB,IAAI,CAACc,qBAAqB,CAACd,YAAAA,CAAAA;AAC7B;AACF;AACF;AACF;AACAc,QAAAA,qBAAAA,CAAsBd,YAAkC,EAAE;AACxD,YAAA,MAAMe,QAAW,GAAC,IAAI,CAA8BC,mBAAmB,EAAA;AACvE,YAAA,IAAID,QAAU,EAAA;gBACZf,YAAalE,CAAAA,SAAS,CAACA,SAAS,CAACuE,UAAU,CACzCnE,YAAAA,CAAaoE,0BAA0B,EAAA,EACvC,CAACN,aAAaP,MAAM,GAAGvD,YAAa+E,CAAAA,6BAA6B,GAAG,CAAA,IAAK,CACzEF,EAAAA,QAAAA,EACA,CACAA,EAAAA,QAAAA,CAAShF,MAAM,CAAA;AAEnB;AACF;QACAmF,WAAc,GAAA;AACZ,YAAA,MAAMhB,UAAa,GAAA,IAAI,CAACjC,OAAO,GAAGkC,YAAY;AAC9C,YAAA,IAAI,IAAI,CAACzC,iBAAiB,KAAKwC,UAAY,EAAA;gBACzC,IAAI,CAACxC,iBAAiB,GAAGwC,UAAAA;AACzB,gBAAA,MAAMiB,KAAQ/E,GAAAA,SAAAA,EAAAA,CAAY+B,SAAS,CAACC,YAAY;AAChD,gBAAA,IAAI+C,UAAU,IAAI,CAAC7D,iBAAiB,CAAC,EAAE,EAAE;AACvC,oBAAA,IAAI,CAACE,sBAAsB,CAAClB,GAAG,CAAC,IAAI,CAACiB,yBAAyB,CAAA;AAC9D,oBAAA,IAAI,CAACD,iBAAiB,CAAC,CAAA,CAAE,GAAG6D,KAAAA;AAC5B,oBAAA,IAAI,CAAC7D,iBAAiB,CAAC,CAAA,CAAE,GAAG6D,KAAAA;AAC9B;gBACA,IAAI,CAAC5D,yBAAyB,CAACjB,GAAG,CAAC,IAAI,CAAC2B,OAAO,EAAA,CAAGC,WAAW,CAAA;AAC7D,gBAAA,KAAK,MAAMc,GAAAA,IAAO,IAAI,CAACjC,iBAAiB,CAAE;oBACxC,IAAIiC,GAAAA,CAAIA,GAAG,EAAE;AACX,wBAAA,IAAI,CAACe,sBAAsB,CAACf,GAAAA,CAAIA,GAAG,CAAA;AACrC;AACF;AACF;AACF;AACA,yBACAoC,IAAAA,CAAKC,GAAgB,EAAE9B,WAAkC,EAAE;YACzD,MAAM+B,MAAAA,GAASD,IAAIC,MAAM;YACzB,MAAM5B,iBAAAA,GAAoB,IAAI,CAACC,oBAAoB,CAAC2B,QAAQ,CAAC,CAACD,GAAIE,CAAAA,YAAY,EAAEhC,WAAAA,CAAAA;YAChF+B,MAAOE,CAAAA,YAAY,CAAC,CAAG9B,EAAAA,iBAAAA,CAAAA;YACvB,IAAI2B,GAAAA,CAAIE,YAAY,EAAE;gBACpBD,MAAOE,CAAAA,YAAY,CAAC,CAAGH,EAAAA,GAAAA,CAAIE,YAAY,CAACzF,SAAS,CAACA,SAAS,CAAA;AAC7D;AACA,YAAA,IAAIuF,GAAII,CAAAA,aAAa,GAAGC,oBAAAA,CAAqBC,cAAc,EAAE;AAC3D,gBAAA,MAAMC,WAAc,GAAC,IAAI,CAAqBlB,eAAe,EAAA;AAC7DhB,gBAAAA,iBAAAA,CAAkBmC,UAAU,CAAC3F,YAAa4F,CAAAA,0BAA0B,EAAIF,EAAAA,WAAAA,CAAAA;gBACxElC,iBAAkBE,CAAAA,QAAQ,CACxB1D,YAAayE,CAAAA,+BAA+B,IAC5C,IAAK,CAAqBC,cAAc,CAAA;AAE1C3F,gBAAAA,eAAAA,CAAgB8G,KAAK,CAACH,WAAAA,CAAYI,KAAK,EAAEJ,YAAYK,MAAM,CAAA;AAC3DvC,gBAAAA,iBAAAA,CAAkBE,QAAQ,CAAC1D,YAAagG,CAAAA,6BAA6B,EAAIjH,EAAAA,eAAAA,CAAAA;AAC3E;AACA,YAAA,IAAIoG,GAAII,CAAAA,aAAa,GAAGC,oBAAAA,CAAqBS,eAAe,EAAE;AAC5D,gBAAA,MAAMC,SAAY,GAAC,IAAI,CAAqBC,YAAY,EAAA;AACxD,gBAAA,MAAMC,SAAY,GAAC,IAAI,CAAqBC,YAAY,EAAA;gBACxD7C,iBAAkBmC,CAAAA,UAAU,CAAC3F,YAAasG,CAAAA,uBAAuB,IAAIJ,SAAUK,CAAAA,OAAO,CAAEjG,GAAG,EAAA,CAAA;gBAC3FkD,iBAAkBgD,CAAAA,SAAS,CAACxG,YAAayG,CAAAA,uBAAuB,IAAIL,SAAUvE,CAAAA,MAAM,CAAEvB,GAAG,EAAA,CAAA;AAC3F;AACF;AACA,yBACAmD,oBAAqB2B,CAAAA,MAAsB,EAAE3F,UAAmB,EAAE4D,WAAwB,EAAE;AAC1F,YAAA,MAAM9D,WAAW,CAAC,CAAC,IAAK,CAAyBiF,eAAe,EAAA;AAChE,YAAA,MAAMhF,WAAW,CAAC,CAAC,IAAK,CAAyB2G,YAAY,EAAA;YAC7D,IAAIvG,SAAAA,GAAYH,UACZ,GAAA,IAAI,CAACsB,6BAA6B,CAACT,GAAG,CAAC+C,WAAAA,CAAAA,GACvC9D,QAAYC,IAAAA,QAAAA,GACV,IAAI,CAAC0B,6BAA6B,GAClC3B,QACE,GAAA,IAAI,CAACyB,wBAAwB,GAC7BxB,QAAAA,GACE,IAAI,CAACyB,yBAAyB,GAC9B,IAAI,CAACH,oBAAoB;AACnC,YAAA,IAAI,CAAClB,SAAW,EAAA;gBACdA,SAAYN,GAAAA,cAAAA,CAAeC,UAAUC,QAAUC,EAAAA,UAAAA,CAAAA;AAC/C,gBAAA,IAAIA,UAAY,EAAA;AACd,oBAAA,IAAI,CAACsB,6BAA6B,CAACX,GAAG,CAACiD,WAAazD,EAAAA,SAAAA,CAAAA;iBAC/C,MAAA,IAAIL,YAAYC,QAAU,EAAA;oBAC/B,IAAI,CAAC0B,6BAA6B,GAAGtB,SAAAA;AACvC,iBAAA,MAAO,IAAIL,QAAU,EAAA;oBACnB,IAAI,CAACyB,wBAAwB,GAAGpB,SAAAA;AAClC,iBAAA,MAAO,IAAIJ,QAAU,EAAA;oBACnB,IAAI,CAACyB,yBAAyB,GAAGrB,SAAAA;iBAC5B,MAAA;oBACL,IAAI,CAACkB,oBAAoB,GAAGlB,SAAAA;AAC9B;AACA,gBAAA,IAAI,CAACH,UAAY,EAAA;AACfG,oBAAAA,SAAAA,CAAU8D,QAAQ,CAAC1D,YAAAA,CAAa0G,yBAAyB,EAAI,EAAA,IAAI,CAACnE,cAAc,EAAA,CAAA;AAClF;AACF;YACA,OAAO3C,SAAAA;AACT;QACA+G,SAAY,GAAA;AACV,YAAA,KAAK,CAACA,SAAAA,EAAAA;YACN,IAAI,CAAC5D,mBAAmB,CAAC,IAAA,CAAA;YACzB1C,gBAAiB,CAAA,IAAI,CAACS,oBAAoB,CAAA;YAC1CT,gBAAiB,CAAA,IAAI,CAACW,wBAAwB,CAAA;YAC9CX,gBAAiB,CAAA,IAAI,CAACY,yBAAyB,CAAA;AACjD;AACF,KAAA;IACA,OAAOL,GAAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"drawable_mixin.js","sources":["../../src/render/drawable_mixin.ts"],"sourcesContent":["import type { Disposable, GenericConstructor, Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector4 } from '@zephyr3d/base';\r\nimport type { AbstractDevice } from '@zephyr3d/device';\r\nimport type { BindGroup } from '@zephyr3d/device';\r\nimport type { BatchDrawable, DrawContext, Drawable } from './drawable';\r\nimport { ShaderHelper } from '../material';\r\nimport type { DrawableInstanceInfo, RenderQueue, RenderQueueRef } from './render_queue';\r\nimport type { Mesh, SceneNode } from '../scene';\r\nimport { MaterialVaryingFlags } from '../values';\r\nimport { getDevice } from '../app/api';\r\n\r\nexport interface IMixinDrawable {\r\n readonly objectColor: Vector4;\r\n getDrawableId(): number;\r\n pushRenderQueueRef(ref: RenderQueueRef): void;\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number): void;\r\n applyTransformUniforms(renderQueue: RenderQueue): void;\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo): void;\r\n applyMaterialUniformsAll(): void;\r\n getObjectColor(): Vector4;\r\n updateState(): void;\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void;\r\n}\r\n\r\nlet _drawableId = 0;\r\nconst boneTextureSize = new Vector2();\r\n\r\nconst instanceBindGroupTransfromTags = new WeakMap<DrawableInstanceInfo, number>();\r\nconst drawableBindGroupTransfromTags = new WeakMap<BindGroup, number>();\r\n\r\nconst bindGroupCache: Record<string, BindGroup[]> = {};\r\nconst usedBindGroups: WeakMap<BindGroup, string> = new WeakMap();\r\n\r\nfunction fetchBindGroup(skinning: boolean, morphing: boolean, instancing: boolean) {\r\n const hash = `${instancing}:${morphing}:${skinning}`;\r\n const bindGroups = bindGroupCache[hash];\r\n let bindGroup: Nullable<BindGroup> = null;\r\n if (bindGroups && bindGroups.length > 0) {\r\n bindGroup = bindGroups.pop()!;\r\n } else {\r\n const layout = ShaderHelper.getDrawableBindGroupLayout(skinning, morphing, instancing);\r\n bindGroup = getDevice().createBindGroup(layout);\r\n }\r\n usedBindGroups.set(bindGroup, hash);\r\n return bindGroup;\r\n}\r\n\r\nfunction releaseBindGroup(bindGroup: Nullable<BindGroup>) {\r\n if (bindGroup) {\r\n const hash = usedBindGroups.get(bindGroup);\r\n if (hash) {\r\n usedBindGroups.delete(bindGroup);\r\n drawableBindGroupTransfromTags.delete(bindGroup);\r\n const bindGroups = bindGroupCache[hash];\r\n if (bindGroups) {\r\n bindGroups.push(bindGroup);\r\n } else {\r\n bindGroupCache[hash] = [bindGroup];\r\n }\r\n } else {\r\n bindGroup.dispose();\r\n }\r\n }\r\n}\r\n\r\nexport function mixinDrawable<\r\n T extends GenericConstructor<\r\n {\r\n getNode(): SceneNode;\r\n } & Disposable\r\n >\r\n>(baseCls: T): T & { new (...args: any[]): IMixinDrawable } {\r\n const cls = class extends baseCls {\r\n private readonly _mdRenderQueueRef: RenderQueueRef[];\r\n private _mdDrawableBindGroup: Nullable<BindGroup>;\r\n private readonly _mdDrawableBindGroupInstanced: Map<RenderQueue, BindGroup>;\r\n private _mdDrawableBindGroupSkin: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupMorph: Nullable<BindGroup>;\r\n private _mdDrawableBindGroupSkinMorph: Nullable<BindGroup>;\r\n private readonly _worldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private _framestampBuffer: Int32Array<ArrayBuffer>;\r\n private readonly _currentWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _prevWorldMatrixBuffer: Float32Array<ArrayBuffer>;\r\n private readonly _drawableId: number;\r\n private _objectColor: Nullable<Vector4>;\r\n private _nodeTransformTag: number;\r\n constructor(...args: any[]) {\r\n super(...args);\r\n this._drawableId = ++_drawableId;\r\n this._objectColor = null;\r\n this._mdRenderQueueRef = [];\r\n this._mdDrawableBindGroup = null;\r\n this._mdDrawableBindGroupInstanced = new Map();\r\n this._mdDrawableBindGroupSkin = null;\r\n this._mdDrawableBindGroupMorph = null;\r\n this._mdDrawableBindGroupSkinMorph = null;\r\n this._worldMatrixBuffer = new Float32Array(4 * 9);\r\n this._framestampBuffer = new Int32Array(this._worldMatrixBuffer.buffer, 4 * 16);\r\n this._currentWorldMatrixBuffer = this._worldMatrixBuffer.subarray(0, 16);\r\n this._prevWorldMatrixBuffer = this._worldMatrixBuffer.subarray(20, 36);\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._framestampBuffer[0] = getDevice().frameInfo.frameCounter;\r\n this._framestampBuffer[1] = this._framestampBuffer[0];\r\n this._prevWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n this._nodeTransformTag = -1;\r\n this.getNode().on('transformchanged', () => {\r\n this.getNode().scene?.queueUpdateDrawable(this as unknown as Drawable);\r\n });\r\n }\r\n getDrawableId() {\r\n return this._drawableId;\r\n }\r\n getObjectColor(): Immutable<Vector4> {\r\n if (!this._objectColor) {\r\n const a = (this._drawableId & 0xff) / 255;\r\n const b = ((this._drawableId >>> 8) & 0xff) / 255;\r\n const g = ((this._drawableId >>> 16) & 0xff) / 255;\r\n const r = ((this._drawableId >>> 24) & 0xff) / 255;\r\n this._objectColor = new Vector4(r, g, b, a);\r\n }\r\n return this._objectColor;\r\n }\r\n pushRenderQueueRef(ref: RenderQueueRef) {\r\n this.renderQueueRefPrune();\r\n if (!this._mdRenderQueueRef.includes(ref)) {\r\n this._mdRenderQueueRef.push(ref);\r\n }\r\n }\r\n renderQueueRefPrune(force = false) {\r\n for (let i = this._mdRenderQueueRef.length - 1; i >= 0; i--) {\r\n const queueRef = this._mdRenderQueueRef[i];\r\n const ref = queueRef.ref;\r\n if (force || !queueRef.valid || ref.disposed) {\r\n this._mdRenderQueueRef.splice(i, 1);\r\n const bindGroup = this._mdDrawableBindGroupInstanced.get(ref);\r\n if (bindGroup) {\r\n releaseBindGroup(bindGroup);\r\n this._mdDrawableBindGroupInstanced.delete(ref);\r\n }\r\n }\r\n }\r\n }\r\n applyInstanceOffsetAndStride(renderQueue: RenderQueue, stride: number, offset: number) {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), true, renderQueue);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataStrideUniformName(), stride >> 2);\r\n drawableBindGroup.setValue(ShaderHelper.getInstanceDataOffsetUniformName(), offset >> 2);\r\n }\r\n applyTransformUniforms(renderQueue: RenderQueue) {\r\n const instanceInfo = renderQueue.getInstanceInfo(this as unknown as Drawable);\r\n const currentTag = this.getNode().transformTag;\r\n if (instanceInfo) {\r\n const tag = instanceBindGroupTransfromTags.get(instanceInfo) ?? -1;\r\n if (tag !== currentTag) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n instanceInfo.offset * 4,\r\n this._worldMatrixBuffer,\r\n 0,\r\n 36\r\n );\r\n instanceBindGroupTransfromTags.set(instanceInfo, currentTag);\r\n }\r\n } else {\r\n const drawableBindGroup = this.getDrawableBindGroup(getDevice(), false, renderQueue);\r\n const tag = drawableBindGroupTransfromTags.get(drawableBindGroup) ?? -1;\r\n if (tag !== currentTag) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getWorldMatrixUniformName(),\r\n this._currentWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixUniformName(),\r\n this._prevWorldMatrixBuffer\r\n );\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getPrevWorldMatrixFrameUniformName(),\r\n this._framestampBuffer[0]\r\n );\r\n if ((this as unknown as Drawable).getBoneMatrices()) {\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n }\r\n drawableBindGroupTransfromTags.set(drawableBindGroup, currentTag);\r\n }\r\n }\r\n }\r\n applyMaterialUniformsAll() {\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n const instanceInfo = ref.ref.getInstanceInfo(this as unknown as Drawable);\r\n if (instanceInfo) {\r\n this.applyMaterialUniforms(instanceInfo);\r\n }\r\n }\r\n }\r\n }\r\n applyMaterialUniforms(instanceInfo: DrawableInstanceInfo) {\r\n const uniforms = (this as unknown as BatchDrawable).getInstanceUniforms();\r\n if (uniforms) {\r\n instanceInfo.bindGroup.bindGroup.setRawData(\r\n ShaderHelper.getInstanceDataUniformName(),\r\n (instanceInfo.offset + ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4) * 4,\r\n uniforms,\r\n 0,\r\n uniforms.length\r\n );\r\n }\r\n }\r\n updateState() {\r\n const currentTag = this.getNode().transformTag;\r\n if (this._nodeTransformTag !== currentTag) {\r\n this._nodeTransformTag = currentTag;\r\n const frame = getDevice().frameInfo.frameCounter;\r\n if (frame !== this._framestampBuffer[1]) {\r\n this._prevWorldMatrixBuffer.set(this._currentWorldMatrixBuffer);\r\n this._framestampBuffer[0] = frame;\r\n this._framestampBuffer[1] = frame;\r\n }\r\n this._currentWorldMatrixBuffer.set(this.getNode().worldMatrix);\r\n for (const ref of this._mdRenderQueueRef) {\r\n if (ref.valid && !ref.ref.disposed) {\r\n this.applyTransformUniforms(ref.ref);\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n bind(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n const device = ctx.device;\r\n const drawableBindGroup = this.getDrawableBindGroup(device, !!ctx.instanceData, renderQueue!);\r\n device.setBindGroup(1, drawableBindGroup);\r\n if (ctx.instanceData) {\r\n device.setBindGroup(3, ctx.instanceData.bindGroup.bindGroup);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_ANIMATION) {\r\n const boneTexture = (this as unknown as Mesh).getBoneMatrices()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getBoneMatricesUniformName(), boneTexture);\r\n drawableBindGroup.setValue(\r\n ShaderHelper.getBoneInvBindMatrixUniformName(),\r\n (this as unknown as Mesh).invWorldMatrix\r\n );\r\n boneTextureSize.setXY(boneTexture.width, boneTexture.height);\r\n drawableBindGroup.setValue(ShaderHelper.getBoneTextureSizeUniformName(), boneTextureSize);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.MORPH_ANIMATION) {\r\n const morphData = (this as unknown as Mesh).getMorphData()!;\r\n const morphInfo = (this as unknown as Mesh).getMorphInfo()!;\r\n drawableBindGroup.setTexture(ShaderHelper.getMorphDataUniformName(), morphData.texture!.get()!);\r\n drawableBindGroup.setBuffer(ShaderHelper.getMorphInfoUniformName(), morphInfo.buffer!.get()!);\r\n }\r\n }\r\n /** @internal */\r\n getDrawableBindGroup(device: AbstractDevice, instancing: boolean, renderQueue: RenderQueue) {\r\n const skinning = !!(this as unknown as Drawable).getBoneMatrices();\r\n const morphing = !!(this as unknown as Drawable).getMorphData();\r\n let bindGroup = instancing\r\n ? this._mdDrawableBindGroupInstanced.get(renderQueue)\r\n : skinning && morphing\r\n ? this._mdDrawableBindGroupSkinMorph\r\n : skinning\r\n ? this._mdDrawableBindGroupSkin\r\n : morphing\r\n ? this._mdDrawableBindGroupMorph\r\n : this._mdDrawableBindGroup;\r\n if (!bindGroup) {\r\n bindGroup = fetchBindGroup(skinning, morphing, instancing);\r\n if (instancing) {\r\n this._mdDrawableBindGroupInstanced.set(renderQueue, bindGroup);\r\n } else if (skinning && morphing) {\r\n this._mdDrawableBindGroupSkinMorph = bindGroup;\r\n } else if (skinning) {\r\n this._mdDrawableBindGroupSkin = bindGroup;\r\n } else if (morphing) {\r\n this._mdDrawableBindGroupMorph = bindGroup;\r\n } else {\r\n this._mdDrawableBindGroup = bindGroup;\r\n }\r\n if (!instancing) {\r\n bindGroup.setValue(ShaderHelper.getObjectColorUniformName(), this.getObjectColor());\r\n }\r\n }\r\n return bindGroup;\r\n }\r\n onDispose() {\r\n super.onDispose();\r\n this.renderQueueRefPrune(true);\r\n releaseBindGroup(this._mdDrawableBindGroup);\r\n releaseBindGroup(this._mdDrawableBindGroupSkin);\r\n releaseBindGroup(this._mdDrawableBindGroupMorph);\r\n }\r\n };\r\n return cls as unknown as T & { new (...args: any[]): IMixinDrawable };\r\n}\r\n"],"names":["_drawableId","boneTextureSize","Vector2","instanceBindGroupTransfromTags","WeakMap","drawableBindGroupTransfromTags","bindGroupCache","usedBindGroups","fetchBindGroup","skinning","morphing","instancing","hash","bindGroups","bindGroup","length","pop","layout","ShaderHelper","getDrawableBindGroupLayout","getDevice","createBindGroup","set","releaseBindGroup","get","delete","push","dispose","mixinDrawable","baseCls","cls","_mdRenderQueueRef","_mdDrawableBindGroup","_mdDrawableBindGroupInstanced","_mdDrawableBindGroupSkin","_mdDrawableBindGroupMorph","_mdDrawableBindGroupSkinMorph","_worldMatrixBuffer","_framestampBuffer","_currentWorldMatrixBuffer","_prevWorldMatrixBuffer","_objectColor","_nodeTransformTag","args","Map","Float32Array","Int32Array","buffer","subarray","getNode","worldMatrix","frameInfo","frameCounter","on","scene","queueUpdateDrawable","getDrawableId","getObjectColor","a","b","g","r","Vector4","pushRenderQueueRef","ref","renderQueueRefPrune","includes","force","i","queueRef","valid","disposed","splice","applyInstanceOffsetAndStride","renderQueue","stride","offset","drawableBindGroup","getDrawableBindGroup","setValue","getInstanceDataStrideUniformName","getInstanceDataOffsetUniformName","applyTransformUniforms","instanceInfo","getInstanceInfo","currentTag","transformTag","tag","setRawData","getInstanceDataUniformName","getWorldMatrixUniformName","getPrevWorldMatrixUniformName","getPrevWorldMatrixFrameUniformName","getBoneMatrices","getBoneInvBindMatrixUniformName","invWorldMatrix","applyMaterialUniformsAll","applyMaterialUniforms","uniforms","getInstanceUniforms","MATERIAL_INSTANCE_DATA_OFFSET","updateState","frame","bind","ctx","device","instanceData","setBindGroup","materialFlags","MaterialVaryingFlags","SKIN_ANIMATION","boneTexture","setTexture","getBoneMatricesUniformName","setXY","width","height","getBoneTextureSizeUniformName","MORPH_ANIMATION","morphData","getMorphData","morphInfo","getMorphInfo","getMorphDataUniformName","texture","setBuffer","getMorphInfoUniformName","getObjectColorUniformName","onDispose"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Disposable, Vector4 } from '@zephyr3d/base';
|
|
1
|
+
import { Disposable, Vector4, REVERSE_Z, DEPTH_FARTHEST } from '@zephyr3d/base';
|
|
2
2
|
import { drawFullscreenQuad } from './fullscreenquad.js';
|
|
3
3
|
import { tryGetApp } from '../app/api.js';
|
|
4
4
|
|
|
@@ -167,18 +167,23 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
167
167
|
scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);
|
|
168
168
|
scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);
|
|
169
169
|
scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);
|
|
170
|
+
// The peeling depth encoding is internal to this algorithm; normalize
|
|
171
|
+
// device depth to standard orientation (0 = near) so the (-front, back)
|
|
172
|
+
// encoding, the max/max blend extraction and the peel window logic stay
|
|
173
|
+
// convention independent.
|
|
174
|
+
scope.$l.Z_DDP_normDepth = REVERSE_Z ? pb.sub(1, scope.$builtins.fragCoord.z) : scope.$builtins.fragCoord.z;
|
|
170
175
|
if (this._currentPass === 0) {
|
|
171
|
-
scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope
|
|
176
|
+
scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.Z_DDP_normDepth), scope.Z_DDP_normDepth);
|
|
172
177
|
} else {
|
|
173
178
|
scope.$l.Z_DDP_prevDepth = pb.textureLoad(scope.Z_DDP_depthTexture, pb.ivec2(scope.$builtins.fragCoord.xy), 0).xy;
|
|
174
179
|
scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);
|
|
175
180
|
scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;
|
|
176
|
-
scope.$l.Z_DDP_curDepth = scope
|
|
181
|
+
scope.$l.Z_DDP_curDepth = scope.Z_DDP_normDepth;
|
|
177
182
|
scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);
|
|
178
183
|
scope.$if(pb.or(pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth), pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)), function() {
|
|
179
184
|
pb.discard();
|
|
180
185
|
}).$elseif(pb.and(pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth), pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)), function() {
|
|
181
|
-
this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this
|
|
186
|
+
this.$outputs.Z_DDP_depth = pb.vec2(pb.neg(this.Z_DDP_normDepth), this.Z_DDP_normDepth);
|
|
182
187
|
}).$elseif(pb.and(pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)), pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))), function() {
|
|
183
188
|
this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;
|
|
184
189
|
}).$else(function() {
|
|
@@ -294,7 +299,7 @@ const COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;
|
|
|
294
299
|
this.$inputs.pos = pb.vec2().attrib('position');
|
|
295
300
|
this.$outputs.uv = pb.vec2();
|
|
296
301
|
pb.main(function() {
|
|
297
|
-
this.$builtins.position = pb.vec4(this.$inputs.pos,
|
|
302
|
+
this.$builtins.position = pb.vec4(this.$inputs.pos, DEPTH_FARTHEST, 1);
|
|
298
303
|
this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));
|
|
299
304
|
if (device.type === 'webgpu') {
|
|
300
305
|
this.$builtins.position.y = pb.neg(this.$builtins.position.y);
|