@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 3.2 kB
JavaScript
import{BlendState as e}from"../../platform/graphics/blend-state.js";import{RenderPass as r}from"../../platform/graphics/render-pass.js";import{RenderAction as t}from"../composition/render-action.js";class n extends r{constructor(e,r,t,n){super(e),this.layerComposition=void 0,this.scene=void 0,this.renderer=void 0,this.renderActions=[],this.noDepthClear=!1,this.layerComposition=r,this.scene=t,this.renderer=n}addRenderAction(e){this.renderActions.push(e)}addLayer(e,r,n,a=!0){const s=new t;if(s.renderTarget=this.renderTarget,s.camera=e,s.layer=r,s.transparent=n,a){const t=0===this.renderActions.length;s.setupClears(t?e:void 0,r)}this.addRenderAction(s)}addLayers(e,r,t,n,a,s=!0){const{layerList:o,subLayerEnabled:i,subLayerList:d}=e;let l=n,c=t;for(;c<o.length;){const e=o[c],t=d[c],n=e.enabled&&i[c],h=r.camera.layersSet.has(e.id);if(n&&h&&(this.addLayer(r,e,t,l),l=!1),c++,e.id===a&&t===s)break}return c}updateDirectionalShadows(){const{renderer:e,renderActions:r}=this;for(let t=0;t<r.length;t++){const n=r[t].camera.camera,a=this.renderer.cameraDirShadowLights.get(n);if(a)for(let r=0;r<a.length;r++){const t=a[r];if(e.dirLightShadows.get(t)!==n){e.dirLightShadows.set(t,n);const r=e._shadowRendererDirectional.getLightRenderPass(t,n);r&&this.beforePasses.push(r)}}}}updateClears(){const e=this.renderActions[0];if(e){const r=e.camera.camera,t=r.fullSizeClearRect;this.setClearColor(t&&e.clearColor?r.clearColor:void 0),this.setClearDepth(t&&e.clearDepth&&!this.noDepthClear?r.clearDepth:void 0),this.setClearStencil(t&&e.clearStencil?r.clearStencil:void 0)}}frameUpdate(){super.frameUpdate(),this.updateDirectionalShadows(),this.updateClears()}before(){const{renderActions:e}=this;if(e.length){const r=e[0];r.camera.onPreRender&&r.firstCameraUse&&r.camera.onPreRender()}}execute(){const{layerComposition:e,renderActions:r}=this;for(let t=0;t<r.length;t++){const n=r[t];e.isEnabled(n.layer,n.transparent)&&this.renderRenderAction(n,0===t)}}after(){const{renderActions:e}=this;if(e.length){const r=e[e.length-1];r.camera.onPostRender&&r.lastCameraUse&&r.camera.onPostRender()}this.beforePasses.length=0}renderRenderAction(r,t){const{renderer:n,layerComposition:a}=this,s=n.device,{layer:o,transparent:i,camera:d}=r,l=a.camerasMap.get(d);if(!i&&o.onPreRenderOpaque?o.onPreRenderOpaque(l):i&&o.onPreRenderTransparent&&o.onPreRenderTransparent(l),o._preRenderCalledForCameras&1<<l||(o.onPreRender&&o.onPreRender(l),o._preRenderCalledForCameras|=1<<l),d){var c,h;const a={lightClusters:r.lightClusters},l=null!=(c=null==(h=d.camera.shaderPassInfo)?void 0:h.index)?c:o.shaderPass;t&&d.camera.fullSizeClearRect||(a.clearColor=r.clearColor,a.clearDepth=r.clearDepth,a.clearStencil=r.clearStencil),n.renderForwardLayer(d.camera,r.renderTarget,o,i,l,r.viewBindGroups,a),s.setBlendState(e.NOBLEND),s.setStencilState(null,null),s.setAlphaToCoverage(!1)}!i&&o.onPostRenderOpaque?o.onPostRenderOpaque(l):i&&o.onPostRenderTransparent&&o.onPostRenderTransparent(l),!o.onPostRender||o._postRenderCalledForCameras&1<<l||(o._postRenderCounter&=~(i?2:1),0===o._postRenderCounter&&(o.onPostRender(l),o._postRenderCalledForCameras|=1<<l,o._postRenderCounter=o._postRenderCounterMax))}}export{n as RenderPassForward};