UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 1.78 kB
import{math as e}from"../../core/math/math.js";import{ShadowMap as t}from"./shadow-map.js";import{LIGHTTYPE_SPOT as s,LIGHTTYPE_OMNI as o}from"../constants.js";import{RenderPassShadowLocalNonClustered as r}from"./render-pass-shadow-local-non-clustered.js";class a{constructor(e,t){this.shadowLights=[],this.renderer=void 0,this.shadowRenderer=void 0,this.device=void 0,this.renderer=e,this.shadowRenderer=t,this.device=e.device}cull(r,a,n=null){const d=this.renderer.scene.clusteredLightingEnabled;r.visibleThisFrame=!0,d||r._shadowMap||(r._shadowMap=t.create(this.device,r));const i=r._type,h=i===s?1:6;for(let t=0;t<h;t++){const h=r.getRenderData(null,t),l=h.shadowCamera;l.nearClip=r.attenuationEnd/1e3,l.farClip=r.attenuationEnd,h.depthRangeCompensation=l.farClip-l.nearClip;const c=l._node,p=r._node;if(c.setPosition(p.getPosition()),i===s)l.fov=2*r._outerConeAngle,c.setRotation(p.getRotation()),c.rotateLocal(-90,0,0);else if(i===o)if(d){const t=2/(this.shadowRenderer.lightTextureAtlas.shadowAtlasResolution*r.atlasViewport.z/3)*this.shadowRenderer.lightTextureAtlas.shadowEdgePixels;l.fov=Math.atan(1+t)*e.RAD_TO_DEG*2}else l.fov=90;this.renderer.updateCameraFrustum(l),this.shadowRenderer.cullShadowCasters(a,r,h.visibleCasters,l,n)}}prepareLights(e,t){let s;for(let o=0;o<t.length;o++){const r=t[o];if(this.shadowRenderer.needsShadowRendering(r)&&r.atlasViewportAllocated){e.push(r);for(let e=0;e<r.numShadowFaces;e++)s=this.shadowRenderer.prepareFace(r,null,e)}}return s}buildNonClusteredRenderPasses(e,t){for(let o=0;o<t.length;o++){const a=t[o];if(this.shadowRenderer.needsShadowRendering(a)){const t=a._type===s,o=a.numShadowFaces;for(let s=0;s<o;s++){const o=new r(this.device,this.shadowRenderer,a,s,t);e.addRenderPass(o)}}}}}export{a as ShadowRendererLocal};