@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 4.5 kB
JavaScript
import{isSome as s}from"../../../../../core/maybe.js";import{f as e,t as a,e as t}from"../../../../../chunks/mat3.js";import{c as r}from"../../../../../chunks/mat3f64.js";import{c as i}from"../../../../../chunks/mat4.js";import{s as h,c as o}from"../../../../../chunks/vec3.js";import{c as n}from"../../../../../chunks/vec3f64.js";import{MaterialPassParameters as m,ShadowMapPassParameters as d,HighlightPassParameters as c,RenderPassIdentifier as p}from"./AllRenderPasses.js";import{RenderPass as l,RenderPassSorting as u}from"./RenderPass.js";import{ShaderOutput as P}from"../shaderLibrary/ShaderOutput.js";import{TwoVectorPosition as g}from"../util/TwoVectorPosition.js";import{union as _}from"../../lib/depthRange.js";import{RenderSlot as w}from"../../lib/RenderSlot.js";class f{constructor(s,e){this.rctx=s,this.shaderTechniqueRepository=e,this.canRender=!0,this._materialPassParameters=new m,this._shadowPassParameters=new d,this._highlightPassParameters=new c,this._systems=new Set,this._passes={materialOpaque:new l(s,e),materialTransparent:new l(s,e,u.BackToFront),materialIntegratedMesh:new l(s,e),shadowMap:new l(s,e),highlight:new l(s,e),highlightIntegratedMesh:new l(s,e),highlightShadowMap:new l(s,e),defaultShadowMap:new l(s,e)}}register(s){this._systems.add(s)}prepareRender(s){if(0!==this._systems.size){for(const s of Object.values(this._passes))s.prepareSubmit();this._systems.forEach((e=>e.submit(this._passes,s.bindParameters)));for(const s of Object.values(this._passes))s.finishSubmit();this.shaderTechniqueRepository.frameUpdate()}}render(s){if(0!==this._systems.size)switch(this._configure(s),this._materialPassParameters.output=s.output,s.bindParameters.slot){case w.OPAQUE_MATERIAL:switch(s.output){case P.Color:case P.Depth:case P.Normal:return this._passes.materialOpaque.dispatch(this._materialPassParameters,s.bindParameters);case P.Highlight:return this._passes.highlight.dispatch(this._highlightPassParameters,s.bindParameters);case P.Shadow:return this._passes.shadowMap.dispatch(this._shadowPassParameters,s.bindParameters);case P.ShadowHighlight:return this._passes.highlightShadowMap.dispatch(this._shadowPassParameters,s.bindParameters);case P.ShadowExcludeHighlight:return this._passes.defaultShadowMap.dispatch(this._shadowPassParameters,s.bindParameters);case P.ObjectAndLayerIdColor:return this._passes.materialOpaque.dispatch(this._materialPassParameters,s.bindParameters)}return;case w.TRANSPARENT_MATERIAL:switch(s.output){case P.Color:case P.Alpha:case P.Depth:case P.Normal:case P.ObjectAndLayerIdColor:return this._passes.materialTransparent.dispatch(this._materialPassParameters,s.bindParameters)}return;case w.INTEGRATED_MESH:switch(s.output){case P.Color:case P.Depth:case P.Normal:return this._passes.materialIntegratedMesh.dispatch(this._materialPassParameters,s.bindParameters);case P.Highlight:return this._passes.highlightIntegratedMesh.dispatch(this._highlightPassParameters,s.bindParameters);case P.ObjectAndLayerIdColor:return this._passes.materialIntegratedMesh.dispatch(this._materialPassParameters,s.bindParameters)}return}}notifyDirty(){this._context.requestRender()}slots(){return[w.OPAQUE_MATERIAL,w.TRANSPARENT_MATERIAL,w.INTEGRATED_MESH]}initializeRenderContext(s){this._context=s}uninitializeRenderContext(){}queryDepthRange(e){const a={near:1/0,far:-1/0};return this._systems.forEach((t=>{const r=t.queryShadowCasterDepthRange(e);s(r)&&_(a,r,a)})),a}_configure(s){const e=s.output===P.Shadow||s.output===P.ShadowHighlight||s.output===P.ShadowExcludeHighlight?this._shadowPassParameters:s.output===P.Highlight?this._highlightPassParameters:this._materialPassParameters;this._updateParameters(s,e)}_updateParameters(s,r){const n=s.bindParameters.camera,m=n.viewInverseTransposeMatrix;h(R,m[3],m[7],m[11]),T.set(R),o(r.transformWorldFromViewTH,T.high),o(r.transformWorldFromViewTL,T.low),o(r.slicePlaneLocalOrigin,R),e(r.transformViewFromCameraRelativeRS,n.viewMatrix),i(r.transformProjFromView,n.projectionMatrix),r.identifier===p.Material&&(this._materialPassParameters.transparent=s.bindParameters.slot===w.TRANSPARENT_MATERIAL,this._materialPassParameters.integratedMesh=s.bindParameters.slot===w.INTEGRATED_MESH,a(b,r.transformViewFromCameraRelativeRS),t(r.transformNormalViewFromGlobal,b))}get needsHighlight(){return this._passes.highlight.count>0||this._passes.highlightIntegratedMesh.count>0}get needsTransparentPass(){return this._passes.materialTransparent.count>0}}const R=n(),b=r(),T=new g;export{f as RenderPassManager};