@zephyr3d/scene 0.9.20 → 0.9.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/camera/camera.js +208 -208
  2. package/dist/camera/camera.js.map +1 -1
  3. package/dist/index.d.ts +9 -0
  4. package/dist/posteffect/posteffect.js +16 -0
  5. package/dist/posteffect/posteffect.js.map +1 -1
  6. package/dist/posteffect/ssgi.js +644 -0
  7. package/dist/posteffect/ssgi.js.map +1 -0
  8. package/dist/posteffect/sss.js +129 -44
  9. package/dist/posteffect/sss.js.map +1 -1
  10. package/dist/render/lightpass.js +5 -1
  11. package/dist/render/lightpass.js.map +1 -1
  12. package/dist/render/rendergraph/forward_plus_builder.js +21 -6
  13. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  14. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  15. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  16. package/dist/render/shadow_mask_pass.js +42 -39
  17. package/dist/render/shadow_mask_pass.js.map +1 -1
  18. package/dist/shaders/ssgi.js +63 -0
  19. package/dist/shaders/ssgi.js.map +1 -0
  20. package/dist/shadow/esm.js +3 -1
  21. package/dist/shadow/esm.js.map +1 -1
  22. package/dist/shadow/pcf_opt.js +4 -1
  23. package/dist/shadow/pcf_opt.js.map +1 -1
  24. package/dist/shadow/pcf_pd.js +4 -1
  25. package/dist/shadow/pcf_pd.js.map +1 -1
  26. package/dist/shadow/pcss.js +2 -0
  27. package/dist/shadow/pcss.js.map +1 -1
  28. package/dist/shadow/shadow_impl.js.map +1 -1
  29. package/dist/shadow/shadowmapper.js +5 -1
  30. package/dist/shadow/shadowmapper.js.map +1 -1
  31. package/dist/shadow/ssm.js +4 -1
  32. package/dist/shadow/ssm.js.map +1 -1
  33. package/dist/shadow/vsm.js +3 -1
  34. package/dist/shadow/vsm.js.map +1 -1
  35. package/dist/utility/serialization/scene/camera.js.map +1 -1
  36. package/package.json +1 -1
  37. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  38. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -131,7 +131,11 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
131
131
  const needsTransparentSingleColorFramebuffer = !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;
132
132
  const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : tmpFramebuffer;
133
133
  const oit = renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type) ? camera.oit : null;
134
- if (!oit && renderQueue.drawTransparent) {
134
+ // Sort only when this invocation actually draws the transparent queue.
135
+ // The opaque pass (and the SSS-profile pass) run with _renderTransparent
136
+ // === false; without this guard they would sort the transparent lists
137
+ // pointlessly, and the real transparent pass would then sort them again.
138
+ if (!oit && renderQueue.drawTransparent && this._renderTransparent) {
135
139
  renderQueue.sortTransparentItems(camera.getWorldPosition());
136
140
  }
137
141
  const flags = {
@@ -1 +1 @@
1
- {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n }\r\n /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }:${ctx.screenSpaceShadowMask ? 1 : 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","screenSpaceShadowMask","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","releaseFrameBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n }\r\n /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }:${ctx.screenSpaceShadowMask ? 1 : 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","screenSpaceShadowMask","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","releaseFrameBuffer"],"mappings":";;;;;AAUA,MAAMA,oBACJC,oBAAqBC,CAAAA,mBAAmB,GACxCD,oBAAAA,CAAqBE,iBAAiB,GACtCF,oBAAAA,CAAqBG,iBAAiB,GACtCH,qBAAqBI,gBAAgB,GACrCJ,qBAAqBK,sBAAsB,GAC3CL,qBAAqBM,cAAc;AACrC,MAAMC,kCAAAA,GACJP,qBAAqBC,mBAAmB,GACxCD,qBAAqBE,iBAAiB,GACtCF,qBAAqBI,gBAAgB;AAEvC;;;IAIO,MAAMI,SAAkBC,SAAAA,UAAAA,CAAAA;qBAE7B,cAA2C;qBAE3C,aAAiC;qBAEjC,aAAiC;qBAEjC,kBAAsC;AACtC;;AAEC,MACD,WAAc,EAAA;AACZ,QAAA,KAAK,CAACC,sBAAAA,CAAAA;QACN,IAAI,CAACC,cAAc,GAAG,IAAA;QACtB,IAAI,CAACC,aAAa,GAAG,KAAA;QACrB,IAAI,CAACC,aAAa,GAAG,IAAA;QACrB,IAAI,CAACC,kBAAkB,GAAG,IAAA;AAC1B,QAAA,IAAI,CAACC,WAAW,GAAGC,OAAAA,CAAQC,IAAI,EAAA;AACjC;qBAEA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAACN,aAAa;AAC3B;IACA,IAAIM,YAAAA,CAAaC,GAAG,EAAE;QACpB,IAAI,CAACP,aAAa,GAAGO,GAAAA;AACvB;qBAEA,IAAIC,YAAe,GAAA;QACjB,OAAO,IAAI,CAACP,aAAa;AAC3B;IACA,IAAIO,YAAAA,CAAaD,GAAY,EAAE;AAC7B,QAAA,IAAI,CAACN,aAAa,GAAG,CAAC,CAACM,GAAAA;AACzB;qBAEA,IAAIE,iBAAoB,GAAA;QACtB,OAAO,IAAI,CAACP,kBAAkB;AAChC;IACA,IAAIO,iBAAAA,CAAkBF,GAAY,EAAE;AAClC,QAAA,IAAI,CAACL,kBAAkB,GAAG,CAAC,CAACK,GAAAA;AAC9B;AACA,qBACA,oCAAUG,CAAqCC,GAAgB,EAAEC,aAAqB,EAAE;AACtF,QAAA,MAAMC,WAAcF,GAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA;AAC7C,QAAA,IAAI,CAACF,WAAa,EAAA;YAChB,OAAO,IAAA;AACT;AACA,QAAA,MAAMG,WAAqB,GAAA;YAACH,WAAYI,CAAAA,mBAAmB,EAAE,CAAC,CAAE;AAAC,SAAA;QACjE,IAAIL,aAAAA,GAAgBxB,oBAAqBG,CAAAA,iBAAiB,EAAE;YAC1DyB,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIQ,iBAAiB,CAAA;AACxC;QACA,IAAIP,aAAAA,GAAgBxB,oBAAqBK,CAAAA,sBAAsB,EAAE;YAC/DuB,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIS,sBAAsB,CAAA;AAC7C;QACA,IAAIR,aAAAA,GAAgBxB,oBAAqBM,CAAAA,cAAc,EAAE;YACvDsB,WAAYE,CAAAA,IAAI,CAACP,GAAAA,CAAIU,cAAc,CAAA;AACrC;AACA,QAAA,OAAOL,YAAYM,MAAM,KAAK,IAAIN,WAAW,CAAC,EAAE,GAAGA,WAAAA;AACrD;AACA,qBACA,+BAAUO,CAAgCZ,GAAgB,EAAEa,WAAwB,EAAE;QACpF,MAAMC,aAAAA,GAAgBd,IAAIc,aAAa;AACvC,QAAA,IAAI,CAACA,aAAAA,IAAiBA,aAAcC,CAAAA,IAAI,KAAK,CAAG,EAAA;YAC9C,OAAO,IAAA;AACT;QACA,IAAIF,WAAAA,CAAYG,uBAAuB,IAAIF,aAAAA,CAAcG,GAAG,CAACJ,WAAAA,CAAYG,uBAAuB,CAAG,EAAA;AACjG,YAAA,OAAOH,YAAYG,uBAAuB;AAC5C;QACA,IAAIH,WAAAA,CAAYK,wBAAwB,IAAIJ,aAAAA,CAAcG,GAAG,CAACJ,WAAAA,CAAYK,wBAAwB,CAAG,EAAA;AACnG,YAAA,OAAOL,YAAYK,wBAAwB;AAC7C;AACA,QAAA,KAAK,MAAMC,KAAAA,IAASN,WAAYO,CAAAA,cAAc,CAAE;YAC9C,IAAIN,aAAAA,CAAcG,GAAG,CAACE,KAAQ,CAAA,EAAA;gBAC5B,OAAOA,KAAAA;AACT;AACF;AACA,QAAA,OAAOL,cAAcO,IAAI,EAAA,CAAGC,IAAI,EAAA,CAAGC,KAAK,IAAI,IAAA;AAC9C;AACA,qBACA,uBAAUC,CAAwBxB,GAAgB,EAAEyB,MAAc,EAAE;AAClE,QAAA,OAAO,CAAG,EAAA,IAAI,CAACrC,cAAc,CAAC,CAAC,EAAEY,GAAAA,CAAI0B,kBAAkB,EAAEC,SAAa,IAAA,CAAA,CAAE,CAAC,EACvE3B,GAAAA,CAAI4B,aAAa,GAAG,CAAI,GAAA,CAAA,CACzB,CAAC,EAAEH,OAAOI,GAAG,EAAEC,aAAmB,EAAA,IAAA,EAAA,CAAG,CAAC,EAAE9B,GAAI+B,CAAAA,GAAG,CAAEC,OAAO,CACvDhC,GACA,CAAA,CAAA,CAAC,EAAEA,GAAAA,CAAIC,aAAa,CAAC,CAAC,EAAED,GAAIiC,CAAAA,kBAAkB,EAAEC,GAAAA,IAAO,CAAE,CAAA,CAAC,EAAElC,GAAImC,CAAAA,iBAAiB,EAAED,GAAAA,IAAO,CAAE,CAAA,CAAC,EAC7FlC,GAAAA,CAAIoC,UAAU,EAAEF,GAAAA,IAAO,CACxB,CAAA,CAAC,EAAElC,GAAAA,CAAIqC,qBAAqB,GAAG,IAAI,CAAG,CAAA,CAAA;AACzC;AACA,qBACUC,eACRtC,CAAAA,GAAgB,EAChByB,MAAc,EACdc,QAA8B,EAC9BC,MAAuB,EACvBC,KAAU,EACV;QACA,MAAMC,aAAAA,GAAgB,CAAC1C,GAAAA,CAAI4B,aAAa;AACxC5B,QAAAA,GAAAA,CAAI2C,YAAY,GACdD,aACA1C,IAAAA,GAAAA,CAAI+B,GAAG,CAAEZ,KAAK,CAACyB,IAAI,KAAK,MACvB5C,KAAAA,GAAI+B,CAAAA,GAAG,CAAEZ,KAAK,CAAC0B,QAAQ,CAACC,WAAW,EAAM9C,IAAAA,GAAAA,CAAI+B,GAAG,CAAEZ,KAAK,CAAC0B,QAAQ,CAACE,aAAa,EAAC,CAAA;AAClF/C,QAAAA,GAAAA,CAAIgD,cAAc,GAAG,IAAI,CAACC,sBAAsB,CAACjD,GAAKyB,EAAAA,MAAAA,CAAAA;AACtD,QAAA,MAAMyB,SAAYlD,GAAAA,GAAAA,CAAImD,wBAAwB,CAACC,kBAAkB,CAACpD,GAAAA,CAAAA;AAClE,QAAA,IAAI,CAACyC,KAAMY,CAAAA,SAAS,CAACrD,GAAIgD,CAAAA,cAAc,CAAC,EAAE;YACxCM,YAAaC,CAAAA,iBAAiB,CAACL,SAAAA,EAAWlD,GAAKyB,EAAAA,MAAAA,EAAQ,CAAC,CAACzB,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAA;AAClFqC,YAAAA,KAAAA,CAAMY,SAAS,CAACrD,GAAIgD,CAAAA,cAAc,CAAC,GAAG,CAAA;AACxC;QACA,IAAIhD,GAAAA,CAAI0B,kBAAkB,EAAE;AAC1B4B,YAAAA,YAAAA,CAAaE,sBAAsB,CAACN,SAAAA,EAAWlD,GAAKwC,EAAAA,MAAM,CAAC,CAAE,CAAA,CAAA;SACxD,MAAA;AACL,YAAA,IAAI,CAACC,KAAMgB,CAAAA,QAAQ,CAACzD,GAAIgD,CAAAA,cAAc,CAAC,EAAE;gBACvCM,YAAaI,CAAAA,gBAAgB,CAC3BR,SACAlD,EAAAA,GAAAA,EACAA,IAAI2D,cAAc,CAAEC,YAAY,EAChC5D,GAAI2D,CAAAA,cAAc,CAAEE,UAAU,EAC9B7D,IAAI2D,cAAc,CAAEG,WAAW,EAC/B9D,GAAAA,CAAI2D,cAAc,CAAEI,iBAAiB,CAAA;AAEvCtB,gBAAAA,KAAAA,CAAMgB,QAAQ,CAACzD,GAAIgD,CAAAA,cAAc,CAAC,GAAG,CAAA;AACvC;;;;YAIA,IAAIhD,GAAAA,CAAIqC,qBAAqB,EAAE;AAC7BiB,gBAAAA,YAAAA,CAAaU,iBAAiB,CAACd,SAAAA,EAAW,CAAC,CAAClD,IAAIiE,uBAAuB,CAAA;AACzE;AACF;AACA,QAAA,IAAIjE,GAAIC,CAAAA,aAAa,GAAGxB,oBAAAA,CAAqByF,SAAS,IAAI,CAACzB,KAAAA,CAAM0B,MAAM,CAACnE,GAAIgD,CAAAA,cAAc,CAAC,EAAE;YAC3FM,YAAac,CAAAA,cAAc,CACzBlB,SACAlD,EAAAA,GAAAA,CAAI+B,GAAG,CAAEsC,GAAG,CAACC,OAAO,KAAK,SAAA,GAAY,IAAI,CACzCtE,EAAAA,GAAAA,CAAI+B,GAAG,CAAEsC,GAAG,CAACE,aAAa,EAC1B7B,aAAAA,GAAgB,CAAI,GAAA,CAAA,EACpB1C,GAAI+B,CAAAA,GAAG,CAAEsC,GAAG,CAACG,gBAAgB,EAC7BxE,GAAI+B,CAAAA,GAAG,CAAEsC,GAAG,CAACI,eAAe,EAC5BzE,GAAI+B,CAAAA,GAAG,CAAEsC,GAAG,CAACK,uBAAuB,CAAC1E,GACrCA,CAAAA,EAAAA,GAAAA,CAAI+B,GAAG,CAAEsC,GAAG,CAACM,qBAAqB,CAAC3E,GAAAA,CAAAA,CAAAA;AAErCyC,YAAAA,KAAAA,CAAM0B,MAAM,CAACnE,GAAIgD,CAAAA,cAAc,CAAC,GAAG,CAAA;AACrC;AACAhD,QAAAA,GAAAA,CAAIG,MAAM,CAACyE,YAAY,CAAC,CAAG1B,EAAAA,SAAAA,CAAAA;QAC3B,MAAM2B,cAAAA,GAAiBpD,MAAOqD,CAAAA,cAAc,GAAG,CAAA;AAC/C,QAAA,KAAK,MAAMC,GAAAA,IAAOxC,QAASwC,CAAAA,GAAG,CAAE;AAC9B,YAAA,IAAI,CAACC,YAAY,CAACD,GAAAA,EAAK/E,GAAK6E,EAAAA,cAAAA,CAAAA;AAC9B;QACA,IAAI,CAAC7E,GAAI4B,CAAAA,aAAa,EAAE;AACtB,YAAA,KAAK,MAAMqD,KAAAA,IAAS1C,QAAS0C,CAAAA,KAAK,CAAE;AAClC,gBAAA,IAAI,CAACD,YAAY,CAACC,KAAAA,EAAOjF,GAAK6E,EAAAA,cAAAA,CAAAA;AAChC;AACF;AACF;qBAEA,WAAsB7E,CAAAA,GAAgB,EAAEyB,MAAc,EAAEZ,WAAwB,EAAE;AAChFb,QAAAA,GAAAA,CAAIgD,cAAc,GAAG,IAAA;AACrBhD,QAAAA,GAAAA,CAAI+B,GAAG,GAAG/B,GAAIkF,CAAAA,KAAK,CAACnD,GAAG;AACvB/B,QAAAA,GAAAA,CAAI2C,YAAY,GAAG,KAAA;AACnB3C,QAAAA,GAAAA,CAAImF,IAAI,GAAG,IAAI,CAACC,UAAU,CAACpF,GAAAA,CAAAA;QAC3B,MAAMqF,UAAAA,GAAarF,GAAIC,CAAAA,aAAa,GAAGzB,iBAAAA;AACvC,QAAA,MAAM8G,2BAA8BtF,GAAAA,GAAAA,CAAIC,aAAa,GAAG,CAACjB,kCAAAA;AACzD,QAAA,MAAMuG,gCAAmCvF,GAAAA,GAAAA,CAAIC,aAAa,GAAG,CAACzB,iBAAAA;AAC9D,QAAA,MAAMgH,cAAiBH,GAAAA,UAAAA,GACnBrF,GAAIG,CAAAA,MAAM,CAACsF,IAAI,CAACC,wBAAwB,CACtC,KACA1F,EAAAA,GAAAA,CAAIG,MAAM,CAACwF,qBAAqB,EAChC3F,EAAAA,GAAAA,CAAIG,MAAM,CAACyF,sBAAsB,EAAA,EACjC,IAAI,CAAC7F,oCAAoC,CAACC,GAAAA,EAAKsF,2BAC/CtF,CAAAA,EAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAIyF,kBAAkB,EAEjD,CAAA,GAAA,IAAA;QACJ,MAAMC,sCAAAA,GACJ,CAAC,CAACN,cAAAA,IAAkBA,eAAelF,mBAAmB,EAAA,CAAGK,MAAM,GAAG,CAAA;AACpE,QAAA,MAAMoF,yBAA4BD,GAAAA,sCAAAA,GAC9B9F,GAAIG,CAAAA,MAAM,CAACsF,IAAI,CAACC,wBAAwB,CACtC,KACA1F,EAAAA,GAAAA,CAAIG,MAAM,CAACwF,qBAAqB,EAChC3F,EAAAA,GAAAA,CAAIG,MAAM,CAACyF,sBAAsB,EAAA,EACjC,IAAI,CAAC7F,oCAAoC,CAACC,GAAAA,EAAKuF,gCAC/CvF,CAAAA,EAAAA,GAAAA,CAAIG,MAAM,CAACC,cAAc,EAAA,CAAIyF,kBAAkB,EAEjDL,CAAAA,GAAAA,cAAAA;AACJ,QAAA,MAAM3D,MACJhB,WAAYmF,CAAAA,eAAe,IAAIvE,MAAOI,CAAAA,GAAG,IAAIJ,MAAOI,CAAAA,GAAG,CAACoE,aAAa,CAACjG,IAAIG,MAAM,CAACyC,IAAI,CACjFnB,GAAAA,MAAAA,CAAOI,GAAG,GACV,IAAA;;;;;QAKN,IAAI,CAACA,OAAOhB,WAAYmF,CAAAA,eAAe,IAAI,IAAI,CAACzG,kBAAkB,EAAE;YAClEsB,WAAYqF,CAAAA,oBAAoB,CAACzE,MAAAA,CAAO0E,gBAAgB,EAAA,CAAA;AAC1D;AACA,QAAA,MAAM1D,KAAa,GAAA;AACjBgB,YAAAA,QAAAA,EAAU,EAAC;AACXJ,YAAAA,SAAAA,EAAW,EAAC;AACZc,YAAAA,MAAAA,EAAQ;AACV,SAAA;QACA,MAAMiC,KAAAA,GAAQvF,YAAY0B,QAAQ;AAClC,QAAA,MAAM8D,KAAQ,GAAA,IAAI,CAAChH,aAAa,GAC5B;YAAC+G,KAAOzG,EAAAA,YAAAA;YAAcyG,KAAOE,EAAAA,kBAAAA;YAAoBF,KAAOG,EAAAA;SAAY,GACpE;YAACH,KAAOI,EAAAA,MAAAA;YAAQJ,KAAOG,EAAAA;AAAY,SAAA;AACvC,QAAA,IAAK,IAAIE,CAAI,GAAA,CAAA,EAAGA,IAAIJ,KAAM1F,CAAAA,MAAM,EAAE8F,CAAK,EAAA,CAAA;AACrC,YAAA,MAAMC,eAAeD,CAAM,KAAA,CAAA;AAC3B,YAAA,IAAI,YAACC,IAAgB,CAAC,IAAI,CAACpH,aAAa,IAAM,CAACoH,YAAgB,IAAA,CAAC,IAAI,CAACnH,kBAAkB,EAAG;AACxF,gBAAA;AACF;YACA,IAAI8G,KAAK,CAACI,CAAAA,CAAE,EAAE;AACZzG,gBAAAA,GAAAA,CAAI2G,KAAK,GAAGF,CAAM,KAAA,CAAA,GAAIG,YAAeC,GAAAA,iBAAAA;;;;;;;gBAOrC,MAAMC,kBAAAA,GAAqB9G,IAAIqC,qBAAqB,IAAI,CAAC,IAAI,CAAChD,aAAa,IAAIoH,CAAM,KAAA,CAAA;AACrFzG,gBAAAA,GAAAA,CAAIiE,uBAAuB,GAAG6C,kBAAAA;AAC9B9G,gBAAAA,GAAAA,CAAI6B,GAAG,GAAG4E,CAAAA,KAAM,CAAK,IAAA,CAACL,QAAQ,IAAOvE,GAAAA,GAAAA;AACrC,gBAAA,MAAMkF,oCACJ,GAAA,CAAC,CAAC/G,GAAAA,CAAI6B,GAAG,IAAI7B,GAAAA,CAAI2G,KAAK,KAAKE,iBAAqB7G,IAAAA,GAAAA,CAAI6B,GAAG,CAACmF,OAAO,EAAO,KAAA,IAAA;AACxE,gBAAA,IAAI,CAAChH,GAAAA,CAAI2G,KAAK,KAAKE,iBAAAA,IAAqB,IAAI,CAACxH,aAAa,KAAKW,GAAAA,CAAIkF,KAAK,CAACnD,GAAG,CAACsC,GAAG,CAAC4C,WAAW,EAAE;oBAC5FjH,GAAIC,CAAAA,aAAa,IAAIxB,oBAAAA,CAAqByF,SAAS;AACrD;gBACA,MAAMgD,YAAAA,GAAelH,IAAI6B,GAAG,GAAG7B,IAAI6B,GAAG,CAACsF,KAAK,CAACnH,GAAO,CAAA,GAAA,CAAA;AACpD,gBAAA,IAAK,IAAIoH,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIF,cAAcE,CAAK,EAAA,CAAA;AACrC,oBAAA,IAAIpH,GAAI6B,CAAAA,GAAG,IAAI,CAACkF,oCAAsC,EAAA;AACpD,wBAAA,IAAI,CAAC/G,GAAI6B,CAAAA,GAAG,CAACwF,SAAS,CAACrH,KAAKoH,CAAI,CAAA,EAAA;AAC9B,4BAAA;AACF;AACF;AACA,oBAAA,MAAME,eAAe,CAAC9E,MAAAA,GAAAA;wBACpB,IAAIxC,GAAAA,CAAI6B,GAAG,IAAIkF,oCAAsC,EAAA;AACnD,4BAAA,IAAI,CAAC/G,GAAI6B,CAAAA,GAAG,CAACwF,SAAS,CAACrH,KAAKoH,CAAI,CAAA,EAAA;AAC9B,gCAAA;AACF;4BACA,IAAI,CAAC9E,eAAe,CAACtC,GAAAA,EAAKyB,QAAQ4E,KAAK,CAACI,CAAE,CAAA,EAAGjE,MAAQC,EAAAA,KAAAA,CAAAA;AACrDzC,4BAAAA,GAAAA,CAAI6B,GAAG,CAAC0F,OAAO,CAACvH,GAAKoH,EAAAA,CAAAA,CAAAA;yBAChB,MAAA;4BACL,IAAI,CAAC9E,eAAe,CAACtC,GAAAA,EAAKyB,QAAQ4E,KAAK,CAACI,CAAE,CAAA,EAAGjE,MAAQC,EAAAA,KAAAA,CAAAA;AACvD;AACF,qBAAA;AACA,oBAAA,MAAM+E,uBAAuB,CAAChF,MAAAA,GAAAA;AAC5B,wBAAA,MAAMiF,eACJzH,GAAAA,GAAAA,CAAI2G,KAAK,KAAKE,oBAAoBd,yBAA4BP,GAAAA,cAAAA;AAChE,wBAAA,IAAIxF,IAAI4B,aAAa,IAAI6F,mBAAmB,CAACzH,GAAAA,CAAI6B,GAAG,EAAE;4BACpD,MAAM6F,kBAAAA,GAAqB1H,IAAIC,aAAa;4BAC5CD,GAAIC,CAAAA,aAAa,GACfD,GAAAA,CAAI2G,KAAK,KAAKE,oBACVa,kBAAqB,GAAA,CAAClJ,iBACtBkJ,GAAAA,kBAAAA,GAAqB,CAAC1I,kCAAAA;4BAC5BgB,GAAIG,CAAAA,MAAM,CAACwH,gBAAgB,EAAA;4BAC3B3H,GAAIG,CAAAA,MAAM,CAACyH,cAAc,CAACH,eAAAA,CAAAA;4BAC1B,IAAI;gCACFH,YAAa9E,CAAAA,MAAAA,CAAAA;6BACL,QAAA;AACRxC,gCAAAA,GAAAA,CAAIC,aAAa,GAAGyH,kBAAAA;gCACpB1H,GAAIG,CAAAA,MAAM,CAAC0H,eAAe,EAAA;AAC5B;yBACK,MAAA;4BACLP,YAAa9E,CAAAA,MAAAA,CAAAA;AACf;AACF,qBAAA;AACA,oBAAA,IAAIsF,UAAa,GAAA,CAAA;;;;AAIjB,oBAAA,IAAI,CAAChB,kBAAAA,IAAsB9G,GAAIc,CAAAA,aAAa,EAAE;AAC5C,wBAAA,KAAK,MAAMiH,CAAK/H,IAAAA,GAAAA,CAAIc,aAAa,CAACO,IAAI,EAAI,CAAA;AACxCrB,4BAAAA,GAAAA,CAAI0B,kBAAkB,GAAGqG,CAAAA;4BACzB/H,GAAI4B,CAAAA,aAAa,GAAGkG,UAAa,GAAA,CAAA;4BACjC,IAAI,CAAC1I,cAAc,GAAGY,GAAAA,CAAIc,aAAa,CAACkH,GAAG,CAACD,CAAAA,CAAAA,CAAIE,UAAU;4BAC1DT,oBAAqB,CAAA;AAACO,gCAAAA;AAAE,6BAAA,CAAA;AACxBD,4BAAAA,UAAAA,EAAAA;AACF;AACF;AACA,oBAAA,IAAIA,eAAe,CAAKjH,IAAAA,WAAAA,CAAYqH,gBAAgB,CAACvH,MAAM,GAAG,CAAG,EAAA;AAC/DX,wBAAAA,GAAAA,CAAI0B,kBAAkB,GAAG,IAAA;wBACzB1B,GAAI4B,CAAAA,aAAa,GAAGkG,UAAa,GAAA,CAAA;wBACjC,IAAI,CAAC1I,cAAc,GAAG,EAAA;AACtBoI,wBAAAA,oBAAAA,CAAqB3G,YAAYqH,gBAAgB,CAAA;AACnD;AACA,oBAAA,IAAIlI,GAAI6B,CAAAA,GAAG,IAAI,CAACkF,oCAAsC,EAAA;AACpD/G,wBAAAA,GAAAA,CAAI6B,GAAG,CAAC0F,OAAO,CAACvH,GAAKoH,EAAAA,CAAAA,CAAAA;AACvB;AACF;gBACA,IAAIpH,GAAAA,CAAI6B,GAAG,EAAE;oBACX7B,GAAI6B,CAAAA,GAAG,CAACsG,GAAG,CAACnI,GAAAA,CAAAA;AACd;AACAA,gBAAAA,GAAAA,CAAIC,aAAa,IAAI,CAACxB,oBAAAA,CAAqByF,SAAS;AACtD;AACA,YAAA,IAAIuC,CAAM,KAAA,CAAA,IAAK,CAACzG,GAAAA,CAAImC,iBAAiB,EAAE;AACrC,gBAAA,IAAIqD,cAAgB,EAAA;oBAClBxF,GAAIG,CAAAA,MAAM,CAACwH,gBAAgB,EAAA;oBAC3B3H,GAAIG,CAAAA,MAAM,CAACyH,cAAc,CAACpC,cAAAA,CAAAA;AAC5B;AACAxF,gBAAAA,GAAAA,CAAI+B,GAAG,CAACsC,GAAG,CAAC+D,SAAS,CAACpI,GAAAA,CAAAA;AACtB,gBAAA,IAAIA,IAAI+B,GAAG,CAACsC,GAAG,CAAC4C,WAAW,EAAE;AAC3BjH,oBAAAA,GAAAA,CAAI+B,GAAG,CAACsC,GAAG,CAACgE,SAAS,CAAC5G,MAAAA,CAAAA;AACxB;AACA,gBAAA,IAAI+D,cAAgB,EAAA;oBAClBxF,GAAIG,CAAAA,MAAM,CAAC0H,eAAe,EAAA;AAC5B;AACF;;;AAGF;AACA,QAAA,IAAIrC,cAAgB,EAAA;AAClBxF,YAAAA,GAAAA,CAAIG,MAAM,CAACsF,IAAI,CAAC6C,kBAAkB,CAAC9C,cAAAA,CAAAA;AACrC;QACA,IAAIO,yBAAAA,IAA6BA,8BAA8BP,cAAgB,EAAA;AAC7ExF,YAAAA,GAAAA,CAAIG,MAAM,CAACsF,IAAI,CAAC6C,kBAAkB,CAACvC,yBAAAA,CAAAA;AACrC;AACA/F,QAAAA,GAAAA,CAAI6B,GAAG,GAAG,IAAA;AACZ;AACF;;;;"}
@@ -407,7 +407,14 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
407
407
  const numShadowLights = renderQueue.shadowedLights.length;
408
408
  const numLayers = ShadowMaskRenderer.getLayerCount(numShadowLights);
409
409
  const maskPassResult = graph.addPass('ShadowMaskPass', (builder)=>{
410
- builder.read(depthHandle);
410
+ // Freeze the current linear-depth handle at build time. `depthHandle` is a
411
+ // mutable `let` that a later TransmissionDepth pass reassigns to a new
412
+ // version ('linearDepth@TransmissionDepth'); if the execute closure below
413
+ // captured it by reference it would read a handle this pass never declared,
414
+ // tripping RenderGraphExecutor's access assertion. The shadow mask is built
415
+ // from the opaque prepass depth, so the pre-transmission version is correct.
416
+ const maskDepthHandle = depthHandle;
417
+ builder.read(maskDepthHandle);
411
418
  builder.read(depthPassResult.depthFramebufferHandle);
412
419
  // createTexture already registers this pass as the resource producer, so
413
420
  // downstream passes read this handle directly (same pattern as HiZ). The
@@ -420,7 +427,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
420
427
  arrayLayers: numLayers
421
428
  });
422
429
  builder.setExecute((rgCtx)=>{
423
- const depthTex = rgCtx.getTexture(depthHandle);
430
+ const depthTex = rgCtx.getTexture(maskDepthHandle);
424
431
  const maskTex = rgCtx.getTexture(maskHandle);
425
432
  _shadowMaskRenderer.render(ctx, depthTex, renderQueue.shadowedLights, (layer)=>rgCtx.createFramebuffer({
426
433
  width: maskTex.width,
@@ -1376,8 +1383,12 @@ function blitToCurrentColorAttachment(ctx, source) {
1376
1383
  _scenePass.renderOpaque = true;
1377
1384
  _scenePass.renderTransparent = false;
1378
1385
  _scenePass.render(ctx, null, null, renderQueue);
1379
- _scenePass.renderTransparent = true;
1380
1386
  } finally{
1387
+ // Restore the shared _scenePass flags so no state leaks to the next pass:
1388
+ // the transparent pass sets transmission/renderOpaque/renderTransparent
1389
+ // itself rather than inheriting whatever this pass happened to leave.
1390
+ _scenePass.renderTransparent = true;
1391
+ _scenePass.transmission = false;
1381
1392
  ctx.device.popDeviceStates();
1382
1393
  }
1383
1394
  }
@@ -1420,9 +1431,13 @@ function blitToCurrentColorAttachment(ctx, source) {
1420
1431
  device.setFramebuffer(framebuffer);
1421
1432
  device.setViewport(null);
1422
1433
  device.setScissor(null);
1423
- // _scenePass.transmission carries over from the opaque phase (true when the
1424
- // scene color copy seeded the background, false otherwise). Never clear:
1425
- // the opaque result is already in the target.
1434
+ // Derive transmission mode from the same single source of truth the opaque
1435
+ // pass used (renderQueue.needSceneColor()) instead of inheriting leftover
1436
+ // _scenePass state. When scene color is needed the opaque pass seeded the
1437
+ // refraction background and drew the transmission-opaque list, so here we
1438
+ // draw transmission_trans + transparent; otherwise just the transparent
1439
+ // list. Never clear: the opaque result is already in the target.
1440
+ _scenePass.transmission = renderQueue.needSceneColor();
1426
1441
  _scenePass.clearColor = null;
1427
1442
  _scenePass.clearDepth = null;
1428
1443
  _scenePass.clearStencil = null;