@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 2.31 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import e from"../../../../core/Logger.js";import o from"../../../../core/PooledArray.js";import{isManagedFBO as r}from"../../webgl/utils.js";import{defaultWebGLFBO as s}from"../core/FBOCache.js";import{hasFeatureFlagWebGLDebug as t}from"../../../webgl/checkWebGLError.js";class n{constructor(e){this._context=e,this._nodes=new o}destroy(){this._nodes.forEach((e=>e.destroy())),this._nodes.clear()}add(e){this._nodes.push(e),t&&console.log(`Registered render nodes: ${this._nodes.map((({declaredClass:e})=>e)).join(", ")}`)}remove(e){this._nodes.remove(e),t&&console.log(`Registered render nodes: ${this._nodes.map((({declaredClass:e})=>e)).join(", ")}`)}produces(e){return this._nodes.some((({produces:o})=>o===e))}require(e,...o){const r=this._nodes,s=o=>r.reduce(((r,{consumes:s,produces:t})=>r+(!s.required.includes(e)||null!=o&&t!==o?0:1)),0);return 0===o.length?s():o.reduce(((e,o)=>e+s(o)),0)}optional(e,...o){const r=this._nodes,s=o=>r.reduce(((r,{consumes:s,produces:t})=>r+(!s.optional?.includes(e)||null!=o&&t!==o?0:1)),0);return 0===o.length?s():o.reduce(((e,o)=>e+s(o)),0)}updateAnimation(e){return this._nodes.reduce(((o,r)=>r.updateAnimation(e)||o),!1)}precompile(...e){++this._context.techniques.precompiling;for(const o of e)this._nodes.forEach((e=>{e.produces===o&&e.precompile()}));--this._context.techniques.precompiling}render(o,t,n=()=>{}){const c=o.name,i=this._nodes.filter((({produces:e})=>e===c));return 0===i.length?r(o)?o:s:(i.forEach((r=>{const s=[o];for(const e of r.consumes.required){if(e===c)continue;const o=t.get(e);if(o)s.push(o);else if("emissive"!==e||!t.get(c)?.hasAttachment(e))return void(n&&n(s))}if(r.consumes.optional)for(const e of r.consumes.optional){if(e===c)continue;const o=t.get(e);o&&s.push(o)}try{const n=r.doRender(s);n&&n!==o&&(c!==n.name&&(e.getLogger(r).errorOnce(`RenderNode produced ${n.name}, expected ${c}`),n.setName(c)),o.release(),o=n,t.set(c,o))}catch(i){e.getLogger(r).errorOnce(i)}n&&n(s)})),this._context.rctx.enforceState(),o)}requireGeometryDepth(){return this._nodes.some((e=>"disabled"!==e.produces&&e.requireGeometryDepth))}get test(){return{nodes:this._nodes}}}export{n as RenderNodes};