@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.42 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{_ as e}from"../../../../../chunks/tslib.es6.js";import r from"../../../../../core/PooledArray.js";import{property as t}from"../../../../../core/accessorSupport/decorators/property.js";import"../../../../../core/has.js";import"../../../../../core/Logger.js";import"../../../../../core/RandomLCG.js";import{subclass as o}from"../../../../../core/accessorSupport/decorators/subclass.js";import{ZEROS as s}from"../../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{InternalRenderCategory as i}from"../../../webgl.js";import n from"../../../webgl/RenderNode.js";import{DepthFormat as c}from"../../core/FBOCacheFormats.js";import{Blit as l}from"../blit/Blit.js";import{RenderOccludedFlag as d}from"../../lib/Material.js";import{RenderSlot as a}from"../../lib/RenderSlot.js";import{BlitMode as p}from"../../shaders/CompositingTechniqueConfiguration.js";import{DepthStencilAttachment as m,FramebufferBit as h}from"../../../../webgl/enums.js";let u=class extends n{constructor(e){super(e),this.consumes={required:[i.OCCLUDED]},this.produces=i.OCCLUDED,this._blit=new l(e.view.stage.renderView.techniques,p.PremultipliedAlpha)}precompile(){const e=this.view.stage.renderer;e.plugins.plugins.forAll((r=>{e.precompileSlots(r,a.OCCLUDED_GROUND,a.TRANSPARENT_OCCLUDER_MATERIAL),r.material&&e.precompileOccludedSlots(r,g)}))}render(e){const r=e.find((({name:e})=>e===this.produces));return this._renderOccludedAndTransparentStencil(r),this._renderOccludedComposite(r),r}_renderOccludedAndTransparentStencil(e){const r=this.view.stage.renderer,t=f;t.clear();for(const o of r.plugins.plugins)o.renderOccludedFlags&d.OccludeAndTransparentStencil&&t.push(o);0!==t.length&&(r.renderSlots(t,a.OCCLUDER_MATERIAL),this._renderAndComposite(e,e.getAttachment(m),.5,(()=>r.renderSlots(t,a.TRANSPARENT_OCCLUDER_MATERIAL)),!1,!1),t.clear())}_renderOccludedComposite(e){const r=this.view.stage.renderer,t=f;t.clear();let o=0;for(const n of r.plugins.plugins){const e=n.renderOccludedFlags&C;o|=e,e&&t.push(n)}if(!o)return void t.clear();const s=this._getDepthStencilAttachment(e);let i=s.clearStencil;for(const n of g)o&n&&(this._renderAndComposite(e,s.depth,n===d.Opaque?1:.5,(()=>r.renderOccludedSlots(t,n)),!0,i),i=!1);s.release(),t.clear()}_renderAndComposite(e,r,t,o,i,n){const c=this.renderingContext,{width:l,height:d}=e.fbo,a=this.fboCache.acquire(l,d,"tmp color");a.attachDepth(r),c.bindFramebuffer(a.fbo),c.clearFramebuffer(s,i,n),o(),a.detachDepth(),this._blit.blend(c,a,e,this.bindParameters,t),a.release()}_getDepthStencilAttachment(e){const{width:r,height:t}=e.fbo;if(!this.view.stage.renderer.occludedRequiresIntegratedMeshStencil){const e=this.fboCache.acquireDepth(c.DEPTH24_STENCIL8,r,t,"retained stencil");return{depth:e,release:()=>e.release(),clearStencil:!0}}const o=this.fboCache.acquire(r,t,"retained stencil",c.DEPTH24_STENCIL8);return this.renderingContext.blitFramebuffer(e.fbo,o.fbo,h.STENCIL),{depth:o.getAttachment(m),release:()=>o.release(),clearStencil:!1}}};e([t()],u.prototype,"consumes",void 0),e([t()],u.prototype,"produces",void 0),u=e([o("esri.views.3d.webgl-engine.effects.geometry.RenderOccludedRenderNode")],u);const f=new r,g=[d.OccludeAndTransparent,d.Transparent,d.Opaque],C=g.reduce(((e,r)=>e|r),d.None);export{u as RenderOccludedRenderNode};