@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 3.19 kB
JavaScript
import{Vec4 as e}from"../../core/math/vec4.js";import{Mat4 as t}from"../../core/math/mat4.js";import{CULLFACE_NONE as r}from"../../platform/graphics/constants.js";import{LIGHTTYPE_DIRECTIONAL as i,LIGHTTYPE_OMNI as n}from"../constants.js";import{createShaderFromCode as s}from"../shader-lib/utils.js";import{LightCamera as o}from"./light-camera.js";import{BlendState as a}from"../../platform/graphics/blend-state.js";import{QuadRender as l}from"../graphics/quad-render.js";import{DepthState as d}from"../../platform/graphics/depth-state.js";import{RenderPass as u}from"../../platform/graphics/render-pass.js";const c="\n\tattribute vec2 vertex_position;\n\tvarying vec2 uv0;\n\tvoid main(void) {\n\t\tgl_Position = vec4(vertex_position, 0.5, 1.0);\n\t\tuv0 = vertex_position.xy * 0.5 + 0.5;\n\t\t#ifndef WEBGPU\n\t\t\tuv0.y = 1.0 - uv0.y;\n\t\t#endif\n\t}",h=new e,p=[];class v extends u{constructor(e,t){super(e),this._quadRenderer2D=null,this._quadRendererCube=null,this._filteredLights=[],this._cubeSlotsOffsets=t,this.requiresCubemaps=!1,this.blitTextureId=e.scope.resolve("blitTexture"),this.invViewProjId=e.scope.resolve("invViewProj")}destroy(){var e,t;null==(e=this._quadRenderer2D)||e.destroy(),this._quadRenderer2D=null,null==(t=this._quadRendererCube)||t.destroy(),this._quadRendererCube=null}static create(e,t){const r=new v(e.device,t);return r.init(e),r.colorOps.clear=!1,r.depthStencilOps.clearDepth=!1,r}update(e){const t=this._filteredLights;this.filter(e,t),this.executeEnabled=t.length>0}filter(e,t){for(let r=0;r<e.length;r++){const n=e[r];n._type!==i&&(n.atlasViewportAllocated&&n.atlasSlotUpdated&&n.enabled&&n.cookie&&n.visibleThisFrame&&t.push(n))}}initInvViewProjMatrices(){if(!p.length)for(let e=0;e<6;e++){const r=o.create(null,n,e),i=r.projectionMatrix,s=r.node.getLocalTransform().clone().invert();p[e]=(new t).mul2(i,s).invert()}}get quadRenderer2D(){if(!this._quadRenderer2D){const e=s(this.device,c,"\n\tvarying vec2 uv0;\n\tuniform sampler2D blitTexture;\n\tvoid main(void) {\n\t\tgl_FragColor = texture2D(blitTexture, uv0);\n\t}","cookieRenderer2d");this._quadRenderer2D=new l(e)}return this._quadRenderer2D}get quadRendererCube(){if(!this._quadRendererCube){const e=s(this.device,c,"\n\tvarying vec2 uv0;\n\tuniform samplerCube blitTexture;\n\tuniform mat4 invViewProj;\n\tvoid main(void) {\n\t\tvec4 projPos = vec4(uv0 * 2.0 - 1.0, 0.5, 1.0);\n\t\tvec4 worldPos = invViewProj * projPos;\n\t\tgl_FragColor = textureCube(blitTexture, worldPos.xyz);\n\t}","cookieRendererCube");this._quadRendererCube=new l(e)}return this._quadRendererCube}execute(){const e=this.device;e.setBlendState(a.NOBLEND),e.setCullMode(r),e.setDepthState(d.NODEPTH),e.setStencilState();const t=this.renderTarget.colorBuffer.width,i=this._cubeSlotsOffsets,n=this._filteredLights;for(let e=0;e<n.length;e++){const r=n[e],s=r.numShadowFaces,o=s>1?this.quadRendererCube:this.quadRenderer2D;s>1&&this.initInvViewProjMatrices(),this.blitTextureId.setValue(r.cookie);for(let e=0;e<s;e++){if(h.copy(r.atlasViewport),s>1){const t=h.z/3,r=i[e];h.x+=t*r.x,h.y+=t*r.y,h.z=t,h.w=t,this.invViewProjId.setValue(p[e].data)}h.mulScalar(t),o.render(h)}}n.length=0}}export{v as RenderPassCookieRenderer};