@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 6.33 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{_ as e}from"../../../../../../chunks/tslib.es6.js";import r from"../../../../../../core/Accessor.js";import{makeHandle as t}from"../../../../../../core/handleUtils.js";import{releaseMaybe as s}from"../../../../../../core/maybe.js";import{property as i}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{ONES as a}from"../../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{ONES as n}from"../../../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{ViewingMode as d}from"../../../../../ViewingMode.js";import{namedAnchorToHUDMaterialAnchorPos as c}from"../../placementUtils.js";import{DirectRenderer as l}from"./DirectRenderer.js";import{LodRenderer as m}from"./LodRenderer.js";import{defaultBoundingBox as u,createTexture as h,requiresHalfTexelOffset as p}from"../../../../support/engineContent/sdfPrimitives.js";import{CullFaceOptions as f}from"../../../../webgl-engine/lib/basicInterfaces.js";import{DefaultMaterial as w}from"../../../../webgl-engine/materials/DefaultMaterial.js";import{HUDMaterial as g}from"../../../../webgl-engine/materials/HUDMaterial.js";import{schematicMRRFactors as y}from"../../../../webgl-engine/materials/pbrUtils.js";let _=class extends r{constructor(e){super(),this.view=null,this.layerUid=null,this._renderGeometries=new Map,this._materials=new Map,this._directRenderers=new Map,this._lodRenderers=new Map,this.totalFeatures=0,this.view=e.view,this.layerUid=e.layerUid}initialize(){}destroy(){this.removeAllHandles(),this._lodRenderers.forEach((e=>e.destroy()))}async executeRenderCommands(e){for(const r of e)switch(r.id){case"create-material":await this._createMaterial(r);break;case"create-direct-renderer":await this._createDirectRenderer(r);break;case"add-direct-renderer-geometry":await this._addDirectRendererGeometry(r),this._updateFeatureCount();break;case"remove-direct-renderer-geometry":await this._removeDirectRendererGeometry(r),this._updateFeatureCount();break;case"create-lod-renderer":await this._createLodRenderer(r);break;case"add-lod-instances":await this._addLodInstances(r),this._updateFeatureCount();break;case"remove-lod-instances":await this._removeLodInstances(r),this._updateFeatureCount()}}_updateFeatureCount(){let e=0;for(const r of this._directRenderers.values())e+=r.numFeatures;for(const r of this._lodRenderers.values())e+=r.numFeatures;this._set("totalFeatures",e)}get usedMemory(){let e=0;for(const r of this._directRenderers.values())e+=r.usedMemory;for(const r of this._lodRenderers.values())e+=r.usedMemory;return e}async _createMaterial(e){const{view:r}=this,{sharedSymbolResources:i}=r;if(null==i)throw new Error("No shared symbol resources found!");const{textures:o}=i,a=r.state.viewingMode===d.Global;let n=null;switch(e.type){case"default":n=v(i,{physicalBasedRenderingEnabled:!0,slicePlaneEnabled:!1,castShadows:!0,isPrimitive:!0,screenSizePerspectiveEnabled:!0,doublePrecisionRequiresObfuscation:r._stage.renderView.renderingContext.driverTest.doublePrecisionRequiresObfuscation.result},a);break;case"hud":{const[e,r]=R(o,a);this.addHandles([t((()=>s(r)))]),n=e}break;default:throw new Error(`unable to create unknown material type ${e.type}`)}this._materials.set(e.materialId,n)}_getMaterial(e){return this._materials.get(e)}async _createDirectRenderer(e){const r=e.materialId,t=this._getMaterial(r);if(null==t)throw new Error(`material not found ${r}`);const{view:s}=this,i=new l({material:t});this._directRenderers.set(r,i),s._stage.addRenderPlugin(i),s._stage.renderView.renderer.updateHasFlags()}async _addDirectRendererGeometry(e){const r=e.renderGeometryId,t=e.materialId;await this._removeDirectRendererGeometry({renderGeometryId:r});const s=this._directRenderers.get(t);if(null==s)return void console.error("no renderer assigned to provided material");const i=s.addRenderGeometry(r,e.renderGeometryBuffer,e.localOrigin);this._renderGeometries.set(r,{renderGeometry:i,materialId:t}),this.view._stage.renderView.requestRender()}async _removeDirectRendererGeometry(e){const r=e.renderGeometryId,t=this._renderGeometries.get(r);if(null==t)return;const s=t.materialId,i=this._directRenderers.get(s);null!=i?i.removeRenderGeometry(e.renderGeometryId):console.error("no renderer assigned to provided material")}async _createLodRenderer(e){const r=new m({view:this.view,layerUid:this.layerUid}),t=new AbortController,s=e=>this._getMaterial(e);await r.doLoad(e.lodRenderGeometry,s,t.signal),this._lodRenderers.set(e.lodRendererId,r)}async _addLodInstances(e){const r=this._lodRenderers.get(e.lodRendererId);if(null==r)throw new Error("no lod renderer assigned to provided lod renderer Id");r.addInstances(e.data)}async _removeLodInstances(e){const r=this._lodRenderers.get(e.lodRendererId);if(null==r)throw new Error("no lod renderer assigned to provided lod renderer Id");r.removeInstances(e.featureIds)}};function R(e,r){const t={anchorPosition:c.center,occlusionTest:!0,hasSlicePlane:!1,color:[1,0,0,1],outlineColor:[0,0,0,1],outlineSize:1,distanceFieldBoundingBox:u},s=null;if(null!=e){const r=e.fromData("circle-icon",(()=>h("circle")));t.textureId=r.texture.id,t.textureIsSignedDistanceField=!0,t.sampleSignedDistanceFieldTexelCenter=p("circle")}return[new g(t,r),s]}function v(e,r,t){const s={usePBR:r.physicalBasedRenderingEnabled,isSchematic:!0,mrrFactors:y,ambient:a,diffuse:a,hasSlicePlane:r.slicePlaneEnabled,castShadows:r.castShadows,offsetTransparentBackfaces:!r.isPrimitive};return b(s),r.screenSizePerspectiveEnabled&&(s.screenSizePerspective=e.screenSizePerspectiveSettings),s.externalColor=n,s.isInstanced=!0,new w(s,{spherical:t,doublePrecisionRequiresObfuscation:!0})}function b(e){const r=e.opacity??1,t=r<1;return e.transparent=t,e.opacity=r,e.cullFace=t?f.None:f.Back,e}e([i({readOnly:!0})],_.prototype,"totalFeatures",void 0),_=e([o("esri.views.3d.layers.graphics.pipeline.rendering.FeaturePipelineRenderManager")],_);export{_ as FeaturePipelineRenderManager,v as createDefaultMaterial,R as createHudMaterial};