From d89d814d077942845c40b083e126bdfa6b42a298 Mon Sep 17 00:00:00 2001 From: GengineJS <476393671@qq.com> Date: Mon, 17 Jul 2023 17:27:04 +0800 Subject: [PATCH] [Fixed] eslint --- .../reflection-probe-component.ts | 8 +- cocos/rendering/custom/executor.ts | 169 ++++++--- cocos/rendering/custom/web-pipeline.ts | 341 +++++++++++------- 3 files changed, 337 insertions(+), 181 deletions(-) diff --git a/cocos/3d/reflection-probe/reflection-probe-component.ts b/cocos/3d/reflection-probe/reflection-probe-component.ts index ec66ef564b2..9c94934eef3 100644 --- a/cocos/3d/reflection-probe/reflection-probe-component.ts +++ b/cocos/3d/reflection-probe/reflection-probe-component.ts @@ -23,7 +23,7 @@ */ import { ccclass, executeInEditMode, menu, playOnFocus, serializable, tooltip, type, visible } from 'cc.decorator'; import { EDITOR, EDITOR_NOT_IN_PREVIEW } from 'internal:constants'; -import { CCBoolean, CCObject, Color, Enum, Vec3 } from '../../core'; +import { CCBoolean, CCObject, Color, Enum, Vec3, warn } from '../../core'; import { TextureCube } from '../../asset/assets'; import { scene } from '../../render-scene'; @@ -127,7 +127,7 @@ export class ReflectionProbe extends Component { * @zh 设置探针类型,环境反射或者平面反射 */ @type(Enum(ProbeType)) - set probeType (value: number) { + set probeType (value: ProbeType) { this.probe.probeType = value; if (value !== this._probeType) { const lastSize = this._size.clone(); @@ -151,7 +151,7 @@ export class ReflectionProbe extends Component { this._objFlags ^= CCObject.Flags.IsRotationLocked; } if (!this._sourceCamera) { - console.warn('the reflection camera is invalid, please set the reflection camera'); + warn('the reflection camera is invalid, please set the reflection camera'); } else { this.probe.switchProbeType(value, this._sourceCamera.camera); } @@ -163,7 +163,7 @@ export class ReflectionProbe extends Component { this.size = this._size; } } - get probeType (): number { + get probeType (): ProbeType { return this._probeType; } diff --git a/cocos/rendering/custom/executor.ts b/cocos/rendering/custom/executor.ts index b699cd72035..b5492e7a13c 100644 --- a/cocos/rendering/custom/executor.ts +++ b/cocos/rendering/custom/executor.ts @@ -51,6 +51,7 @@ import { Framebuffer, FramebufferInfo, GeneralBarrierInfo, + InputAssembler, InputAssemblerInfo, LoadOp, MemoryUsageBit, @@ -58,6 +59,7 @@ import { Rect, RenderPass, RenderPassInfo, + Shader, StoreOp, SurfaceTransform, Swapchain, @@ -482,7 +484,7 @@ class DeviceRenderQueue { get renderPhase (): RenderPhaseData | null { return this._renderPhase; } get viewport (): Viewport | null { return this._viewport; } get scissor (): Rect | null { return this._scissor; } - private _sceneVisitor; + private _sceneVisitor!: WebSceneVisitor; private _blitDesc: BlitDesc | null = null; private _queueId = -1; set queueId (val) { this._queueId = val; } @@ -505,8 +507,10 @@ class DeviceRenderQueue { this._devicePass = devicePass; if (isEnableEffect()) this._phaseID = cclegacy.rendering.getPhaseID(devicePass.passID, context.renderGraph.getLayout(id) || 'default'); if (!this._sceneVisitor) { - this._sceneVisitor = new WebSceneVisitor(context.commandBuffer, - context.pipeline.pipelineSceneData); + this._sceneVisitor = new WebSceneVisitor( + context.commandBuffer, + context.pipeline.pipelineSceneData, + ); } } createBlitDesc (blit: Blit): void { @@ -612,7 +616,7 @@ class RenderPassLayoutInfo { protected _layout: PipelineLayoutData; protected _inputName: string; protected _descriptorSet: DescriptorSet | null = null; - constructor (layoutId, input: [string, ComputeView[]]) { + constructor (layoutId: number, input: [string, ComputeView[]]) { this._inputName = input[0]; this._layoutID = layoutId; const lg = context.layoutGraph; @@ -831,9 +835,11 @@ class DeviceRenderPass { // )); // } this._renderPass = device.createRenderPass(new RenderPassInfo(colors, depthStencilAttachment)); - this._framebuffer = framebuffer || device.createFramebuffer(new FramebufferInfo(this._renderPass, + this._framebuffer = framebuffer || device.createFramebuffer(new FramebufferInfo( + this._renderPass, swapchain ? [swapchain.colorTexture] : colorTexs, - swapchain ? swapchain.depthStencilTexture : depthTex)); + swapchain ? swapchain.depthStencilTexture : depthTex, + )); } get layoutName (): string { return this._layoutName; } get passID (): number { return this._passID; } @@ -898,8 +904,13 @@ class DeviceRenderPass { const pass = submodel.passes[0]; const ia = submodel.inputAssembler; const device = context.device; - const pso = PipelineStateManager.getOrCreatePipelineState(device, pass, - submodel.shaders[0], renderPass, ia); + const pso = PipelineStateManager.getOrCreatePipelineState( + device, + pass, + submodel.shaders[0], + renderPass, + ia, + ); const descData = getDescriptorSetDataFromLayoutId(pass.passID)!; mergeSrcToTargetDesc(descData.descriptorSet, context.pipeline.descriptorSet, true); profilerViewport.width = rect.width; @@ -928,10 +939,18 @@ class DeviceRenderPass { renderPassArea.width = tex.width; renderPassArea.height = tex.height; } - cmdBuff.beginRenderPass(this.renderPass, this.framebuffer, renderPassArea, - this.clearColor, this.clearDepth, this.clearStencil); - cmdBuff.bindDescriptorSet(SetIndex.GLOBAL, - context.pipeline.descriptorSet); + cmdBuff.beginRenderPass( + this.renderPass, + this.framebuffer, + renderPassArea, + this.clearColor, + this.clearDepth, + this.clearStencil, + ); + cmdBuff.bindDescriptorSet( + SetIndex.GLOBAL, + context.pipeline.descriptorSet, + ); for (const queue of this._deviceQueues) { queue.record(); } @@ -1091,7 +1110,7 @@ class GraphScene { } this.blit = null; } - init (scene, blit, sceneID): void { + init (scene: SceneData | null, blit: Blit | null, sceneID): void { this._copyScene(scene); this._copyBlit(blit); this.sceneID = sceneID; @@ -1104,8 +1123,12 @@ class DevicePreSceneTask extends WebSceneTask { protected _graphScene: GraphScene; private _cmdBuff: CommandBuffer; constructor (queue: DeviceRenderQueue, graphScene: GraphScene, visitor: SceneVisitor) { - super(context.pipelineSceneData, context.ubo, - graphScene.scene && graphScene.scene.camera ? graphScene.scene.camera : null, visitor); + super( + context.pipelineSceneData, + context.ubo, + graphScene.scene && graphScene.scene.camera ? graphScene.scene.camera : null, + visitor, + ); this._currentQueue = queue; this._graphScene = graphScene; this._renderPass = queue.devicePass.renderPass; @@ -1173,6 +1196,7 @@ class DevicePreSceneTask extends WebSceneTask { const probes = cclegacy.internal.reflectionProbeManager.getProbes(); for (let i = 0; i < probes.length; i++) { if (probes[i].hasFrameBuffer(this._currentQueue.devicePass.framebuffer)) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument this._submitInfo.reflectionProbe.gatherRenderObjects(probes[i], this.camera, this._cmdBuff); break; } @@ -1239,7 +1263,7 @@ class DevicePreSceneTask extends WebSceneTask { protected _insertRenderList (ro: RenderObject, subModelIdx: number, passIdx: number, isTransparent = false): void { const subModel = ro.model.subModels[subModelIdx]; - const pass = subModel.passes[passIdx]; + const pass: Pass = subModel.passes[passIdx]; const shader = subModel.shaders[passIdx]; const currTransparent = pass.blendState.targets[0].blend; const devicePass = this._currentQueue.devicePass; @@ -1249,7 +1273,7 @@ class DevicePreSceneTask extends WebSceneTask { if (currTransparent !== isTransparent || !(pass.phaseID & (isTransparent ? phase : this._currentQueue.phaseID))) { return; } - const hash = (0 << 30) | pass.priority << 16 | subModel.priority << 8 | passIdx; + const hash = (0 << 30) | pass.priority as number << 16 | subModel.priority as number << 8 | passIdx; const rp = context.pools.addPassInfo(); rp.priority = ro.model.priority; rp.hash = hash; @@ -1310,8 +1334,12 @@ class DeviceSceneTask extends WebSceneTask { protected _renderPass: RenderPass; protected _graphScene: GraphScene; constructor (queue: DeviceRenderQueue, graphScene: GraphScene, visitor: SceneVisitor) { - super(context.pipelineSceneData, context.ubo, - graphScene.scene && graphScene.scene.camera ? graphScene.scene.camera : null, visitor); + super( + context.pipelineSceneData, + context.ubo, + graphScene.scene && graphScene.scene.camera ? graphScene.scene.camera : null, + visitor, + ); this._currentQueue = queue; this._renderPass = this._currentQueue.devicePass.renderPass; this._graphScene = graphScene; @@ -1335,14 +1363,20 @@ class DeviceSceneTask extends WebSceneTask { : currSubmitInfo.opaqueList; for (let i = 0; i < renderList.length; ++i) { const { subModel, passIdx } = renderList[i]; - const { inputAssembler } = subModel; - const pass = subModel.passes[passIdx]; - const shader = subModel.shaders[passIdx]; - const pso = PipelineStateManager.getOrCreatePipelineState(deviceManager.gfxDevice, - pass, shader, this._renderPass, inputAssembler); + const inputAssembler: InputAssembler = subModel.inputAssembler; + const pass: Pass = subModel.passes[passIdx]; + const shader: Shader = subModel.shaders[passIdx]; + const descriptorSet: DescriptorSet = subModel.descriptorSet; + const pso = PipelineStateManager.getOrCreatePipelineState( + deviceManager.gfxDevice, + pass, + shader, + this._renderPass, + inputAssembler, + ); this.visitor.bindPipelineState(pso); this.visitor.bindDescriptorSet(SetIndex.MATERIAL, pass.descriptorSet); - this.visitor.bindDescriptorSet(SetIndex.LOCAL, subModel.descriptorSet); + this.visitor.bindDescriptorSet(SetIndex.LOCAL, descriptorSet); this.visitor.bindInputAssembler(inputAssembler); this.visitor.draw(inputAssembler); } @@ -1366,13 +1400,18 @@ class DeviceSceneTask extends WebSceneTask { const instance = instances[b]; if (!instance.count) { continue; } const shader = instance.shader!; - const pso = PipelineStateManager.getOrCreatePipelineState(deviceManager.gfxDevice, pass, - shader, this._renderPass, instance.ia); + const pso = PipelineStateManager.getOrCreatePipelineState( + deviceManager.gfxDevice, + pass, + shader, + this._renderPass, + instance.ia, + ); if (lastPSO !== pso) { this.visitor.bindPipelineState(pso); lastPSO = pso; } - const ia: any = instance.ia; + const ia: InputAssembler = instance.ia; this.visitor.bindDescriptorSet(SetIndex.LOCAL, instance.descriptorSet, res.value.dynamicOffsets); this.visitor.bindInputAssembler(ia); this.visitor.draw(ia); @@ -1397,7 +1436,7 @@ class DeviceSceneTask extends WebSceneTask { const pass = batch.passes[j]; if (((isEnableEffect()) ? pass.phaseID : pass.phase) !== this._currentQueue.phaseID) continue; const shader = batch.shaders[j]; - const inputAssembler: any = batch.inputAssembler!; + const inputAssembler: InputAssembler = batch.inputAssembler!; const pso = PipelineStateManager.getOrCreatePipelineState(deviceManager.gfxDevice, pass, shader, this._renderPass, inputAssembler); this.visitor.bindPipelineState(pso); this.visitor.bindDescriptorSet(SetIndex.MATERIAL, pass.descriptorSet); @@ -1414,14 +1453,22 @@ class DeviceSceneTask extends WebSceneTask { protected _recordShadowMap (): void { const submitMap = context.submitMap; const currSubmitInfo = submitMap.get(this.camera!)!.get(this._currentQueue.phaseID)!; - currSubmitInfo.shadowMap.get(this.graphScene.sceneID)!.recordCommandBuffer(context.device, - this._renderPass, context.commandBuffer); + currSubmitInfo.shadowMap.get(this.graphScene.sceneID)!.recordCommandBuffer( + context.device, + this._renderPass, + + context.commandBuffer, + ); } protected _recordReflectionProbe (): void { const submitMap = context.submitMap; const currSubmitInfo = submitMap.get(this.camera!)!.get(this._currentQueue.phaseID)!; - currSubmitInfo.reflectionProbe?.recordCommandBuffer(context.device, - this._renderPass, context.commandBuffer); + currSubmitInfo.reflectionProbe?.recordCommandBuffer( + context.device, + this._renderPass, + + context.commandBuffer, + ); } private _clearExtBlitDesc (desc, extResId: number[]): void { @@ -1448,12 +1495,17 @@ class DeviceSceneTask extends WebSceneTask { pass.update(); const shader = pass.getShaderVariant(); const devicePass = this._currentQueue.devicePass; - const screenIa: any = this._currentQueue.blitDesc!.screenQuad!.quadIA; + const screenIa: InputAssembler = this._currentQueue.blitDesc!.screenQuad!.quadIA!; const globalDesc = context.pipeline.descriptorSet; - let pso; + let pso: PipelineState | null = null; if (pass !== null && shader !== null && screenIa !== null) { - pso = PipelineStateManager.getOrCreatePipelineState(context.device, pass, shader, - devicePass.renderPass, screenIa); + pso = PipelineStateManager.getOrCreatePipelineState( + context.device, + pass, + shader, + devicePass.renderPass, + screenIa, + ); } if (pso) { this.visitor.bindPipelineState(pso); @@ -1474,18 +1526,22 @@ class DeviceSceneTask extends WebSceneTask { const devicePass = this._currentQueue.devicePass; const submitMap = context.submitMap; const currSubmitInfo = submitMap.get(this.camera!)!.get(this._currentQueue.phaseID)!; - currSubmitInfo.additiveLight?.recordCommandBuffer(context.device, + currSubmitInfo.additiveLight?.recordCommandBuffer( + context.device, this._renderPass, - context.commandBuffer); + context.commandBuffer, + ); } private _recordPlanarShadows (): void { const devicePass = this._currentQueue.devicePass; const submitMap = context.submitMap; const currSubmitInfo = submitMap.get(this.camera!)!.get(this._currentQueue.phaseID)!; - currSubmitInfo.planarQueue?.recordCommandBuffer(context.device, + currSubmitInfo.planarQueue?.recordCommandBuffer( + context.device, this._renderPass, - context.commandBuffer); + context.commandBuffer, + ); } protected _updateGlobal (data: RenderData): void { const devicePass = this._currentQueue.devicePass; @@ -1572,8 +1628,10 @@ class DeviceSceneTask extends WebSceneTask { if (graphSceneData.flags & SceneFlags.DEFAULT_LIGHTING) { this._recordAdditiveLights(); } - this.visitor.bindDescriptorSet(SetIndex.GLOBAL, - context.pipeline.descriptorSet); + this.visitor.bindDescriptorSet( + SetIndex.GLOBAL, + context.pipeline.descriptorSet, + ); if (graphSceneData.flags & SceneFlags.PLANAR_SHADOW) { this._recordPlanarShadows(); } @@ -1581,8 +1639,12 @@ class DeviceSceneTask extends WebSceneTask { this._recordTransparentList(); } if (graphSceneData.flags & SceneFlags.GEOMETRY) { - this.camera!.geometryRenderer?.render(devicePass.renderPass, - context.commandBuffer, context.pipeline.pipelineSceneData); + this.camera!.geometryRenderer?.render( + devicePass.renderPass, + context.commandBuffer, + + context.pipeline.pipelineSceneData, + ); } if (graphSceneData.flags & SceneFlags.UI) { this._recordUI(); @@ -1769,7 +1831,7 @@ class BlitInfo { const vbStride = Float32Array.BYTES_PER_ELEMENT * 4; const vbSize = vbStride * 4; const device = cclegacy.director.root.device; - const quadVB = device.createBuffer(new BufferInfo( + const quadVB: Buffer = device.createBuffer(new BufferInfo( BufferUsageBit.VERTEX | BufferUsageBit.TRANSFER_DST, MemoryUsageBit.DEVICE | MemoryUsageBit.HOST, vbSize, @@ -1784,7 +1846,7 @@ class BlitInfo { const ibStride = Uint8Array.BYTES_PER_ELEMENT; const ibSize = ibStride * 6; - const quadIB = device.createBuffer(new BufferInfo( + const quadIB: Buffer = device.createBuffer(new BufferInfo( BufferUsageBit.INDEX | BufferUsageBit.TRANSFER_DST, MemoryUsageBit.DEVICE, ibSize, @@ -1821,14 +1883,16 @@ class BlitInfo { } class ExecutorContext { - constructor (pipeline: BasicPipeline, + constructor ( + pipeline: BasicPipeline, ubo: PipelineUBO, device: Device, resourceGraph: ResourceGraph, renderGraph: RenderGraph, layoutGraph: LayoutGraphData, width: number, - height: number) { + height: number, + ) { this.pipeline = pipeline; this.device = device; this.commandBuffer = device.commandBuffer; @@ -1881,12 +1945,15 @@ class ExecutorContext { } export class Executor { - constructor (pipeline: BasicPipeline, + constructor ( + pipeline: BasicPipeline, ubo: PipelineUBO, device: Device, resourceGraph: ResourceGraph, layoutGraph: LayoutGraphData, - width: number, height: number) { + width: number, + height: number, + ) { context = this._context = new ExecutorContext( pipeline, ubo, diff --git a/cocos/rendering/custom/web-pipeline.ts b/cocos/rendering/custom/web-pipeline.ts index c85a9cdbeef..1b30db086fb 100644 --- a/cocos/rendering/custom/web-pipeline.ts +++ b/cocos/rendering/custom/web-pipeline.ts @@ -25,8 +25,8 @@ /* eslint-disable max-len */ import { systemInfo } from 'pal/system-info'; import { DEBUG } from 'internal:constants'; -import { Color, Buffer, DescriptorSetLayout, Device, Feature, Format, FormatFeatureBit, Sampler, Swapchain, Texture, ClearFlagBit, DescriptorSet, deviceManager, Viewport, API, CommandBuffer, Type, SamplerInfo, Filter, Address, DescriptorSetInfo, LoadOp, StoreOp, ShaderStageFlagBit, BufferInfo, TextureInfo, UniformBlock, ResolveMode, SampleCount } from '../../gfx'; -import { Mat4, Quat, toRadian, Vec2, Vec3, Vec4, assert, macro, cclegacy } from '../../core'; +import { Buffer, DescriptorSetLayout, Device, Feature, Format, FormatFeatureBit, Sampler, Swapchain, Texture, ClearFlagBit, DescriptorSet, deviceManager, Viewport, API, CommandBuffer, Type, SamplerInfo, Filter, Address, DescriptorSetInfo, LoadOp, StoreOp, ShaderStageFlagBit, BufferInfo, TextureInfo, UniformBlock, ResolveMode, SampleCount, Color } from '../../gfx'; +import { Mat4, Quat, toRadian, Vec2, Vec3, Vec4, assert, macro, cclegacy, IVec4Like, IMat4Like, IVec2Like } from '../../core'; import { AccessType, AttachmentType, CopyPair, LightInfo, LightingMode, MovePair, QueueHint, ResolvePair, ResourceDimension, ResourceFlags, ResourceResidency, SceneFlags, UpdateFrequency } from './types'; import { ComputeView, RasterView, Blit, ClearView, ComputePass, CopyPass, Dispatch, ManagedBuffer, ManagedResource, MovePass, RasterPass, RasterSubpass, RenderData, RenderGraph, RenderGraphComponent, RenderGraphValue, RenderQueue, RenderSwapchain, ResourceDesc, ResourceGraph, ResourceGraphValue, ResourceStates, ResourceTraits, SceneData, Subpass } from './render-graph'; import { ComputePassBuilder, ComputeQueueBuilder, ComputeSubpassBuilder, BasicPipeline, PipelineBuilder, RenderPassBuilder, RenderQueueBuilder, RenderSubpassBuilder, PipelineType, BasicRenderPassBuilder, PipelineCapabilities, BasicMultisampleRenderPassBuilder } from './pipeline'; @@ -54,6 +54,9 @@ import { getUBOTypeCount } from './utils'; import { initGlobalDescBinding } from './define'; import { createGfxDescriptorSetsAndPipelines } from './layout-graph-utils'; import { Root } from '../../root'; +import { CSMLayers, CSMShadowLayer } from '../shadow/csm-layers'; +import { Scene } from '../../scene-graph'; +import { Director } from '../../game'; const _uboVec = new Vec4(); const _uboVec3 = new Vec3(); @@ -75,32 +78,34 @@ export class WebSetter { this._lg = lg; } - protected _copyToBuffer (target: any, offset: number, type: Type): void { + protected _copyToBuffer (target: IVec4Like | Quat | IVec2Like | IMat4Like | number, offset: number, type: Type): void { assert(offset !== -1); const arr = this.getCurrConstant(); switch (type) { case Type.FLOAT4: - Vec4.toArray(arr, target, offset); + Vec4.toArray(arr, target as IVec4Like, offset); break; case Type.MAT4: - Mat4.toArray(arr, target, offset); + Mat4.toArray(arr, target as IMat4Like, offset); break; case Type.FLOAT: - arr[offset] = target; + arr[offset] = target as number; break; case Type.SAMPLER2D: break; case Type.TEXTURE2D: break; - case Type.FLOAT2: - arr[offset + 0] = target.x; - arr[offset + 1] = target.y; + case Type.FLOAT2: { + const vec2Val = target as IVec2Like; + arr[offset + 0] = vec2Val.x; + arr[offset + 1] = vec2Val.y; + } break; default: } } - protected _applyCurrConstantBuffer (name: string, target: any, type: Type, idx = 0): void { + protected _applyCurrConstantBuffer (name: string, target: IVec4Like | Quat | IVec2Like | IMat4Like | number, type: Type, idx = 0): void { const offset = this.getUniformOffset(name, type, idx); this._copyToBuffer(target, offset, type); } @@ -189,7 +194,7 @@ export class WebSetter { this._currCount += getUBOTypeCount(uniform.type) * uniform.count; } if (!this._data.constants.get(num)) { - const value = new Array(this._currCount); + const value: number[] = new Array(this._currCount); value.fill(0); this._data.constants.set(num, value); } @@ -283,16 +288,18 @@ export class WebSetter { protected _data: RenderData; protected _lg: LayoutGraphData; protected _currBlock; - protected _currStage; + protected _currStage: string = ''; protected _currCount; protected _currConstant: number[] = []; } -function setShadowUBOLightView (setter: WebSetter, +function setShadowUBOLightView ( + setter: WebSetter, camera: Camera, light: Light, level: number, - layout = 'default'): void { + layout = 'default', +): void { const director = cclegacy.director; const pipeline = (director.root as Root).pipeline; const device = pipeline.device; @@ -319,9 +326,9 @@ function setShadowUBOLightView (setter: WebSetter, if (shadowInfo.type === ShadowType.ShadowMap) { let near = 0.1; let far = 0; - let matShadowView; - let matShadowProj; - let matShadowViewProj; + let matShadowView: Mat4; + let matShadowProj: Mat4; + let matShadowViewProj: Mat4; let levelCount = 0; if (mainLight.shadowFixedArea || mainLight.csmLevel === CSMLevel.LEVEL_1) { matShadowView = csmLayers.specialLayer.matShadowView; @@ -394,12 +401,21 @@ function setShadowUBOLightView (setter: WebSetter, const matViewOffset = setter.getUniformOffset('cc_matLightView', Type.MAT4); const matViewProOffset = setter.getUniformOffset('cc_matLightViewProj', Type.MAT4); if (setter.hasUniform(matViewOffset) || setter.hasUniform(matViewProOffset)) { - Mat4.invert(_matView, (light as any).node.getWorldMatrix()); + Mat4.invert(_matView, spotLight.node!.getWorldMatrix()); } if (setter.hasUniform(matViewOffset)) setter.offsetMat4(_matView, matViewOffset); if (setter.hasUniform(matViewProOffset)) { - Mat4.perspective(_mulMatView, (light as any).angle, 1.0, 0.001, (light as any).range, - true, cap.clipSpaceMinZ, cap.clipSpaceSignY, 0); + Mat4.perspective( + _mulMatView, + spotLight.angle, + 1.0, + 0.001, + spotLight.range, + true, + cap.clipSpaceMinZ, + cap.clipSpaceSignY, + 0, + ); Mat4.multiply(_matView, _mulMatView, _matView); setter.offsetMat4(_matView, matViewProOffset); } @@ -449,12 +465,12 @@ function getPCFRadius (shadowInfo: Shadows, mainLight: DirectionalLight): number function setShadowUBOView (setter: WebSetter, camera: Camera | null, layout = 'default'): void { const director = cclegacy.director; const pipeline = director.root.pipeline; - const device = pipeline.device; + const device: Device = pipeline.device; const scene = director.getScene(); - const mainLight = camera && camera.scene ? camera.scene.mainLight : scene ? scene.renderScene.mainLight : null; + const mainLight: DirectionalLight = camera && camera.scene ? camera.scene.mainLight : scene ? scene.renderScene.mainLight : null; const sceneData = pipeline.pipelineSceneData; - const shadowInfo = sceneData.shadows; - const csmLayers = sceneData.csmLayers; + const shadowInfo: Shadows = sceneData.shadows; + const csmLayers: CSMLayers = sceneData.csmLayers; const csmSupported = sceneData.csmSupported; const packing = supportsR32FloatTexture(device) ? 0.0 : 1.0; const hasCCShadow = setter.addConstant('CCShadow', layout); @@ -465,11 +481,11 @@ function setShadowUBOView (setter: WebSetter, camera: Camera | null, layout = 'd if (mainLight.shadowFixedArea || mainLight.csmLevel === CSMLevel.LEVEL_1 || !csmSupported) { if (hasCCShadow) { setter.setCurrConstant('CCShadow', layout); - const matShadowView = csmLayers.specialLayer.matShadowView; - const matShadowProj = csmLayers.specialLayer.matShadowProj; - const matShadowViewProj = csmLayers.specialLayer.matShadowViewProj; - const near = mainLight.shadowNear; - const far = mainLight.shadowFar; + const matShadowView: Mat4 = csmLayers.specialLayer.matShadowView; + const matShadowProj: Mat4 = csmLayers.specialLayer.matShadowProj; + const matShadowViewProj: Mat4 = csmLayers.specialLayer.matShadowViewProj; + const near: number = mainLight.shadowNear; + const far: number = mainLight.shadowFar; uniformOffset = setter.getUniformOffset('cc_matLightView', Type.MAT4); if (setter.hasUniform(uniformOffset)) { setter.offsetMat4(matShadowView, uniformOffset); @@ -504,8 +520,8 @@ function setShadowUBOView (setter: WebSetter, camera: Camera | null, layout = 'd const layerThreshold = getPCFRadius(shadowInfo, mainLight); setter.setCurrConstant('CCCSM', layout); for (let i = 0; i < mainLight.csmLevel; i++) { - const layer = csmLayers.layers[i]; - const matShadowView = layer.matShadowView; + const layer: CSMShadowLayer = csmLayers.layers[i]; + const matShadowView: Mat4 = layer.matShadowView; uniformOffset = setter.getUniformOffset('cc_csmViewDir0', Type.FLOAT4, i); if (setter.hasUniform(uniformOffset)) { _uboVec.set(matShadowView.m00, matShadowView.m04, matShadowView.m08, layerThreshold); @@ -591,10 +607,13 @@ function setShadowUBOView (setter: WebSetter, camera: Camera | null, layout = 'd } } -function setCameraUBOValues (setter: WebSetter, - camera: Readonly | null, cfg: Readonly, - scene: Readonly, - layoutName = 'default'): void { +function setCameraUBOValues ( + setter: WebSetter, + camera: Readonly | null, + cfg: Readonly, + scene: RenderScene | null, + layoutName = 'default', +): void { const director = cclegacy.director; const root = director.root; const pipeline = root.pipeline as WebPipeline; @@ -741,14 +760,14 @@ function setTextureUBOView (setter: WebSetter, camera: Camera | null, cfg: Reado const root = director.root; if (skybox.reflectionMap) { const texture = skybox.reflectionMap.getGFXTexture()!; - const sampler = root.device.getSampler(skybox.reflectionMap.getSamplerInfo()); + const sampler: Sampler = root.device.getSampler(skybox.reflectionMap.getSamplerInfo()); setter.setTexture('cc_environment', texture); setter.setSampler('cc_environment', sampler); } else { const envmap = skybox.envmap ? skybox.envmap : builtinResMgr.get('default-cube-texture'); if (envmap) { const texture = envmap.getGFXTexture()!; - const sampler = root.device.getSampler(envmap.getSamplerInfo()); + const sampler: Sampler = root.device.getSampler(envmap.getSamplerInfo()); setter.setTexture('cc_environment', texture); setter.setSampler('cc_environment', sampler); } @@ -756,11 +775,11 @@ function setTextureUBOView (setter: WebSetter, camera: Camera | null, cfg: Reado const diffuseMap = skybox.diffuseMap ? skybox.diffuseMap : builtinResMgr.get('default-cube-texture'); if (diffuseMap) { const texture = diffuseMap.getGFXTexture()!; - const sampler = root.device.getSampler(diffuseMap.getSamplerInfo()); + const sampler: Sampler = root.device.getSampler(diffuseMap.getSamplerInfo()); setter.setTexture('cc_diffuseMap', texture); setter.setSampler('cc_diffuseMap', sampler); } - const pointSampler = root.device.getSampler(_samplerPointInfo); + const pointSampler: Sampler = root.device.getSampler(_samplerPointInfo); if (!setter.hasSampler('cc_shadowMap')) { setter.setSampler('cc_shadowMap', pointSampler); } @@ -779,7 +798,7 @@ function getFirstChildLayoutName (lg: LayoutGraphData, parentID: number): string if (lg.numVertices() && parentID !== 0xFFFFFFFF && lg.numChildren(parentID)) { const childNodes = lg.children(parentID); if (childNodes.next().value && childNodes.next().value.target !== lg.nullVertex()) { - const ququeLayoutID = childNodes.next().value.target; + const ququeLayoutID: number = childNodes.next().value.target; return lg.getName(ququeLayoutID); } } @@ -812,14 +831,16 @@ export class WebRenderQueueBuilder extends WebSetter implements RenderQueueBuild addSceneOfCamera (camera: Camera, light: LightInfo, sceneFlags = SceneFlags.NONE, name = 'Camera'): void { const sceneData = new SceneData(camera.scene, camera, sceneFlags, light); - this._renderGraph.addVertex( - RenderGraphValue.Scene, sceneData, name, '', new RenderData(), false, this._vertID, - ); + this._renderGraph.addVertex(RenderGraphValue.Scene, sceneData, name, '', new RenderData(), false, this._vertID); const layoutName = this.getLayoutName(); - const scene = cclegacy.director.getScene(); - setCameraUBOValues(this, camera, this._pipeline, - camera.scene ? camera.scene : scene ? scene.renderScene : null, - layoutName); + const scene: Scene = cclegacy.director.getScene(); + setCameraUBOValues( + this, + camera, + this._pipeline, + camera.scene || (scene ? scene.renderScene : null), + layoutName, + ); if (sceneFlags & SceneFlags.SHADOW_CASTER) { setShadowUBOLightView(this, camera, light.light!, light.level, layoutName); } else { @@ -830,31 +851,35 @@ export class WebRenderQueueBuilder extends WebSetter implements RenderQueueBuild } addScene (camera: Camera, sceneFlags = SceneFlags.NONE): void { const sceneData = new SceneData(camera.scene, camera, sceneFlags); - this._renderGraph.addVertex( - RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID, - ); + this._renderGraph.addVertex(RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID); } addSceneCulledByDirectionalLight (camera: Camera, sceneFlags: SceneFlags, light: DirectionalLight, level: number): void { const sceneData = new SceneData(camera.scene, camera, sceneFlags, new LightInfo(light, level)); - this._renderGraph.addVertex( - RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID, - ); + this._renderGraph.addVertex(RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID); } addSceneCulledBySpotLight (camera: Camera, sceneFlags: SceneFlags, light: SpotLight): void { const sceneData = new SceneData(camera.scene, camera, sceneFlags, new LightInfo(light, 0)); - this._renderGraph.addVertex( - RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID, - ); + this._renderGraph.addVertex(RenderGraphValue.Scene, sceneData, 'Scene', '', new RenderData(), false, this._vertID); } addFullscreenQuad (material: Material, passID: number, sceneFlags = SceneFlags.NONE, name = 'Quad'): void { this._renderGraph.addVertex( - RenderGraphValue.Blit, new Blit(material, passID, sceneFlags, null), - name, '', new RenderData(), false, this._vertID, + RenderGraphValue.Blit, + new Blit(material, passID, sceneFlags, null), + name, + '', + new RenderData(), + false, + this._vertID, ); const layoutName = this.getLayoutName(); - const scene = cclegacy.director.getScene(); - setCameraUBOValues(this, null, this._pipeline, - scene ? scene.renderScene : null, layoutName); + const scene: Scene | null = cclegacy.director.getScene(); + setCameraUBOValues( + this, + null, + this._pipeline, + scene ? scene.renderScene : null, + layoutName, + ); if (sceneFlags & SceneFlags.SHADOW_CASTER) { // setShadowUBOLightView(this, light.light!, light.level); } else { @@ -865,13 +890,23 @@ export class WebRenderQueueBuilder extends WebSetter implements RenderQueueBuild } addCameraQuad (camera: Camera, material: Material, passID: number, sceneFlags = SceneFlags.NONE): void { this._renderGraph.addVertex( - RenderGraphValue.Blit, new Blit(material, passID, sceneFlags, camera), - 'CameraQuad', '', new RenderData(), false, this._vertID, + RenderGraphValue.Blit, + new Blit(material, passID, sceneFlags, camera), + 'CameraQuad', + '', + new RenderData(), + false, + this._vertID, ); const layoutName = this.getLayoutName(); - const scene = cclegacy.director.getScene(); - setCameraUBOValues(this, camera, this._pipeline, - camera.scene ? camera.scene : scene ? scene.renderScene : null, layoutName); + const scene: Scene = cclegacy.director.getScene(); + setCameraUBOValues( + this, + camera, + this._pipeline, + camera.scene || (scene ? scene.renderScene : null), + layoutName, + ); if (sceneFlags & SceneFlags.SHADOW_CASTER) { // setShadowUBOLightView(this, light.light!, light.level); } else { @@ -882,8 +917,13 @@ export class WebRenderQueueBuilder extends WebSetter implements RenderQueueBuild } clearRenderTarget (name: string, color: Color = new Color()): void { this._renderGraph.addVertex( - RenderGraphValue.Clear, [new ClearView(name, ClearFlagBit.COLOR, color)], - 'ClearRenderTarget', '', new RenderData(), false, this._vertID, + RenderGraphValue.Clear, + [new ClearView(name, ClearFlagBit.COLOR, color)], + 'ClearRenderTarget', + '', + new RenderData(), + false, + this._vertID, ); } setViewport (viewport: Viewport): void { @@ -899,8 +939,14 @@ export class WebRenderQueueBuilder extends WebSetter implements RenderQueueBuild } export class WebRenderSubpassBuilder extends WebSetter implements RenderSubpassBuilder { - constructor (data: RenderData, renderGraph: RenderGraph, layoutGraph: LayoutGraphData, - vertID: number, subpass: RasterSubpass, pipeline: PipelineSceneData) { + constructor ( + data: RenderData, + renderGraph: RenderGraph, + layoutGraph: LayoutGraphData, + vertID: number, + subpass: RasterSubpass, + pipeline: PipelineSceneData, + ) { super(data, layoutGraph); this._renderGraph = renderGraph; this._layoutGraph = layoutGraph; @@ -908,11 +954,12 @@ export class WebRenderSubpassBuilder extends WebSetter implements RenderSubpassB this._subpass = subpass; this._pipeline = pipeline; - const layoutName = this._renderGraph.component( - RenderGraphComponent.Layout, this._vertID, - ); + const layoutName = this._renderGraph.component(RenderGraphComponent.Layout, this._vertID); this._layoutID = layoutGraph.locateChild(layoutGraph.nullVertex(), layoutName); } + addRenderTarget (name: string, accessType: AccessType, slotName?: string | undefined, loadOp?: LoadOp | undefined, storeOp?: StoreOp | undefined, color?: Color | undefined): void { + throw new Error('Method not implemented.'); + } setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void { throw new Error('Method not implemented.'); } @@ -925,9 +972,7 @@ export class WebRenderSubpassBuilder extends WebSetter implements RenderSubpassB set name (name: string) { this._renderGraph.setName(this._vertID, name); } - addRenderTarget (name: string, accessType: AccessType, slotName: string, loadOp = LoadOp.CLEAR, storeOp = StoreOp.STORE, clearColor = new Color()): void { - throw new Error('Method not implemented.'); - } + addDepthStencil (name: string, accessType: AccessType, depthSlotName = '', stencilSlotName = '', loadOp = LoadOp.CLEAR, storeOp = StoreOp.STORE, depth = 1, stencil = 0, clearFlag = ClearFlagBit.DEPTH_STENCIL): void { throw new Error('Method not implemented.'); } @@ -950,9 +995,7 @@ export class WebRenderSubpassBuilder extends WebSetter implements RenderSubpassB } const queue = new RenderQueue(hint); const data = new RenderData(); - const queueID = this._renderGraph.addVertex( - RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID, - ); + const queueID = this._renderGraph.addVertex(RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID); return new WebRenderQueueBuilder(data, this._renderGraph, this._layoutGraph, queueID, queue, this._pipeline); } get showStatistics (): boolean { @@ -980,9 +1023,7 @@ export class WebRenderPassBuilder extends WebSetter implements BasicMultisampleR this._pass = pass; this._pipeline = pipeline; - const layoutName = this._renderGraph.component( - RenderGraphComponent.Layout, this._vertID, - ); + const layoutName = this._renderGraph.component(RenderGraphComponent.Layout, this._vertID); this._layoutID = layoutGraph.locateChild(layoutGraph.nullVertex(), layoutName); } setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void { @@ -1009,24 +1050,32 @@ export class WebRenderPassBuilder extends WebSetter implements BasicMultisampleR if (loadOp === LoadOp.LOAD) { clearFlag = ClearFlagBit.NONE; } - const view = new RasterView('', - AccessType.WRITE, AttachmentType.RENDER_TARGET, + const view = new RasterView( + '', + AccessType.WRITE, + + AttachmentType.RENDER_TARGET, loadOp, storeOp, clearFlag, - clearColor); + clearColor, + ); this._pass.rasterViews.set(name, view); } addDepthStencil (name: string, loadOp = LoadOp.CLEAR, storeOp = StoreOp.STORE, depth = 1, stencil = 0, clearFlag = ClearFlagBit.DEPTH_STENCIL): void { if (DEBUG) { assert(Boolean(name && this._resourceGraph.contains(name))); } - const view = new RasterView('', - AccessType.WRITE, AttachmentType.DEPTH_STENCIL, + const view = new RasterView( + '', + AccessType.WRITE, + + AttachmentType.DEPTH_STENCIL, loadOp, storeOp, clearFlag, - new Color(depth, stencil, 0, 0)); + new Color(depth, stencil, 0, 0), + ); this._pass.rasterViews.set(name, view); } resolveRenderTarget (source: string, target: string): void { @@ -1075,9 +1124,7 @@ export class WebRenderPassBuilder extends WebSetter implements BasicMultisampleR this._pass.subpassGraph.addVertex(name, new Subpass()); const subpass = new RasterSubpass(subpassID, 1, 0); const data = new RenderData(); - const vertID = this._renderGraph.addVertex( - RenderGraphValue.RasterSubpass, subpass, name, layoutName, data, false, - ); + const vertID = this._renderGraph.addVertex(RenderGraphValue.RasterSubpass, subpass, name, layoutName, data, false); const result = new WebRenderSubpassBuilder(data, this._renderGraph, this._layoutGraph, vertID, subpass, this._pipeline); return result; } @@ -1088,34 +1135,51 @@ export class WebRenderPassBuilder extends WebSetter implements BasicMultisampleR } const queue = new RenderQueue(hint); const data = new RenderData(); - const queueID = this._renderGraph.addVertex( - RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID, - ); + const queueID = this._renderGraph.addVertex(RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID); return new WebRenderQueueBuilder(data, this._renderGraph, this._layoutGraph, queueID, queue, this._pipeline); } addFullscreenQuad (material: Material, passID: number, sceneFlags = SceneFlags.NONE, name = 'FullscreenQuad'): void { const queue = new RenderQueue(QueueHint.RENDER_TRANSPARENT); const queueId = this._renderGraph.addVertex( - RenderGraphValue.Queue, queue, - 'Queue', '', new RenderData(), - false, this._vertID, + RenderGraphValue.Queue, + queue, + 'Queue', + '', + new RenderData(), + false, + this._vertID, ); this._renderGraph.addVertex( - RenderGraphValue.Blit, new Blit(material, passID, sceneFlags, null), - name, '', new RenderData(), false, queueId, + RenderGraphValue.Blit, + new Blit(material, passID, sceneFlags, null), + name, + '', + new RenderData(), + false, + queueId, ); } addCameraQuad (camera: Camera, material: Material, passID: number, sceneFlags: SceneFlags, name = 'CameraQuad'): void { const queue = new RenderQueue(QueueHint.RENDER_TRANSPARENT); const queueId = this._renderGraph.addVertex( - RenderGraphValue.Queue, queue, - 'Queue', '', new RenderData(), false, this._vertID, + RenderGraphValue.Queue, + queue, + 'Queue', + '', + new RenderData(), + false, + this._vertID, ); this._renderGraph.addVertex( - RenderGraphValue.Blit, new Blit(material, passID, sceneFlags, camera), - name, '', new RenderData(), false, queueId, + RenderGraphValue.Blit, + new Blit(material, passID, sceneFlags, camera), + name, + '', + new RenderData(), + false, + queueId, ); } setViewport (viewport: Viewport): void { @@ -1164,7 +1228,15 @@ export class WebComputeQueueBuilder extends WebSetter implements ComputeQueueBui this._renderGraph.addVertex( RenderGraphValue.Dispatch, new Dispatch(material, passID, threadGroupCountX, threadGroupCountY, threadGroupCountZ), - name, '', new RenderData(), false, this._vertID, + name, + + '', + + new RenderData(), + + false, + + this._vertID, ); } private readonly _renderGraph: RenderGraph; @@ -1183,9 +1255,7 @@ export class WebComputePassBuilder extends WebSetter implements ComputePassBuild this._pass = pass; this._pipeline = pipeline; - const layoutName = this._renderGraph.component( - RenderGraphComponent.Layout, this._vertID, - ); + const layoutName = this._renderGraph.component(RenderGraphComponent.Layout, this._vertID); this._layoutID = layoutGraph.locateChild(layoutGraph.nullVertex(), layoutName); } setCustomShaderStages (name: string, stageFlags: ShaderStageFlagBit): void { @@ -1219,9 +1289,7 @@ export class WebComputePassBuilder extends WebSetter implements ComputePassBuild } const queue = new RenderQueue(); const data = new RenderData(); - const queueID = this._renderGraph.addVertex( - RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID, - ); + const queueID = this._renderGraph.addVertex(RenderGraphValue.Queue, queue, '', layoutName, data, false, this._vertID); return new WebComputeQueueBuilder(data, this._renderGraph, this._layoutGraph, queueID, queue, this._pipeline); } private readonly _renderGraph: RenderGraph; @@ -1317,7 +1385,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Framebuffer, renderWindow.framebuffer, - name, desc, + name, + + desc, new ResourceTraits(ResourceResidency.EXTERNAL), new ResourceStates(), new SamplerInfo(), @@ -1326,7 +1396,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Swapchain, new RenderSwapchain(renderWindow.swapchain), - name, desc, + name, + + desc, new ResourceTraits(ResourceResidency.BACKBUFFER), new ResourceStates(), new SamplerInfo(), @@ -1390,7 +1462,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Managed, new ManagedResource(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(Filter.LINEAR, Filter.LINEAR, Filter.NONE, Address.CLAMP, Address.CLAMP, Address.CLAMP), @@ -1661,7 +1735,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.ManagedBuffer, new ManagedBuffer(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(), @@ -1681,7 +1757,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Managed, new ManagedResource(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(Filter.LINEAR, Filter.LINEAR, Filter.NONE, Address.CLAMP, Address.CLAMP, Address.CLAMP), @@ -1700,7 +1778,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Managed, new ManagedResource(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(Filter.POINT, Filter.POINT, Filter.NONE), @@ -1718,7 +1798,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Managed, new ManagedResource(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(Filter.POINT, Filter.POINT, Filter.NONE), @@ -1737,7 +1819,9 @@ export class WebPipeline implements BasicPipeline { return this._resourceGraph.addVertex( ResourceGraphValue.Managed, new ManagedResource(), - name, desc, + name, + + desc, new ResourceTraits(residency), new ResourceStates(), new SamplerInfo(Filter.LINEAR, Filter.LINEAR, Filter.NONE, Address.CLAMP, Address.CLAMP, Address.CLAMP), @@ -1769,8 +1853,15 @@ export class WebPipeline implements BasicPipeline { throw new Error('Cannot run without creating rendergraph'); } if (!this._executor) { - this._executor = new Executor(this, this._pipelineUBO, this._device, - this._resourceGraph, this.layoutGraph, this.width, this.height); + this._executor = new Executor( + this, + this._pipelineUBO, + this._device, + this._resourceGraph, + this.layoutGraph, + this.width, + this.height, + ); } this._executor.resize(this.width, this.height); this._executor.execute(this._renderGraph); @@ -1823,9 +1914,7 @@ export class WebPipeline implements BasicPipeline { pass.quality = quality; const data = new RenderData(); - const vertID = this._renderGraph!.addVertex( - RenderGraphValue.RasterPass, pass, name, layoutName, data, false, - ); + const vertID = this._renderGraph!.addVertex(RenderGraphValue.RasterPass, pass, name, layoutName, data, false); const result = new WebRenderPassBuilder(data, this._renderGraph!, this._layoutGraph, this._resourceGraph, vertID, pass, this._pipelineSceneData); this._updateRasterPassConstants(result, width, height, isEnableEffect() ? layoutName : 'default'); initGlobalDescBinding(data, layoutName); @@ -1860,8 +1949,8 @@ export class WebPipeline implements BasicPipeline { } protected _updateRasterPassConstants (setter: WebSetter, width: number, height: number, layoutName = 'default'): void { - const director = cclegacy.director; - const root = director.root; + const director: Director = cclegacy.director; + const root: Root = director.root!; const shadingWidth = width; const shadingHeight = height; const pipeline = root.pipeline as WebPipeline; @@ -1888,7 +1977,7 @@ export class WebPipeline implements BasicPipeline { if (debugView) { if (setter.hasUniform(uniformOffset)) { const debugPackVec: number[] = [debugView.singleMode as number, 0.0, 0.0, 0.0]; - for (let i = DebugViewCompositeType.DIRECT_DIFFUSE as number; i < DebugViewCompositeType.MAX_BIT_COUNT; i++) { + for (let i = DebugViewCompositeType.DIRECT_DIFFUSE as number; i < (DebugViewCompositeType.MAX_BIT_COUNT as number); i++) { const idx = i >> 3; const bit = i % 8; debugPackVec[idx + 1] += (debugView.isCompositeModeEnabled(i) ? 1.0 : 0.0) * (10.0 ** bit);