@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 4.21 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{TranslateAnchor as t}from"../../vectorTiles/style/StyleDefinition.js";import{vtlTextureBindingUnitSprites as e,vtlHighResCutoff as i}from"../definitions.js";import n from"./WGLBrush.js";import{TextureSamplingMode as a,CompareFunction as l,PrimitiveType as r,DataType as o}from"../../../../webgl/enums.js";const s=1/65536;class f extends n{constructor(){super(...arguments),this._fillProgramOptions={id:!1,pattern:!1},this._outlineProgramOptions={id:!1}}dispose(){}drawMany(t,e){const{displayLevel:i,renderPass:n,spriteMosaic:a,styleLayerUID:l}=t;let r=!1;for(const _ of e)if(_.layerData.has(l)){const t=_.layerData.get(l);if(t.fillIndexCount>0||t.outlineIndexCount>0){r=!0;break}}if(!r)return;const o=t.styleLayer,s=o.getPaintProperty("fill-pattern"),f=void 0!==s,u=f&&s.isDataDriven;let c;if(f&&!u){const t=s.getValue(i);c=a.getMosaicItemPosition(t,!0)}const d=!f&&o.getPaintValue("fill-antialias",i);let p=!0,m=1;if(!f){const t=o.getPaintProperty("fill-color"),e=o.getPaintProperty("fill-opacity");if(!t?.isDataDriven&&!e?.isDataDriven){const t=o.getPaintValue("fill-color",i);m=o.getPaintValue("fill-opacity",i)*t[3],m>=1&&(p=!1)}}if(p&&"opaque"===n)return;const y=o.getPaintValue("fill-translate",i),g=o.getPaintValue("fill-translate-anchor",i);(p||"translucent"!==n)&&this._drawFill(t,l,o,e,y,g,f,c,u);const M=!o.hasDataDrivenOutlineColor&&o.outlineUsesFillColor&&m<1;d&&"opaque"!==n&&!M&&this._drawOutline(t,l,o,e,y,g)}_drawFill(n,f,u,c,d,p,m,y,g){if(m&&!g&&null==y)return;const{context:M,displayLevel:_,state:E,painter:v,pixelRatio:P,spriteMosaic:U,requestRender:I,allowDelayedRender:x}=n,D=u.fillMaterial,R=v.vectorTilesMaterialManager,S=P>i?2:1,T=this._fillProgramOptions;T.pattern=m;const h=R.getMaterialProgram(M,D,T);if(x&&null!=I&&!h.compiled)return void I();if(M.useProgram(h),null!=y){const{page:t}=y,i=U.getPageSize(t);null!=i&&(U.bind(M,a.LINEAR,t,e),h.setUniform2fv("u_mosaicSize",i),h.setUniform1i("u_texture",e))}h.setUniformMatrix3fv("u_displayMat3",p===t.VIEWPORT?E.displayMat3:E.displayViewMat3),h.setUniform2fv("u_fillTranslation",d),h.setUniform1f("u_depth",u.z+s);let w=-1;for(const t of c){if(!t.layerData.has(f))continue;t.key.level!==w&&(w=t.key.level,D.setDataUniforms(h,_,u,w,U));const i=t.layerData.get(f);if(!i.fillIndexCount)continue;i.prepareForRendering(M);const n=i.fillVAO;if(null!=n){if(M.bindVAO(n),h.setUniformMatrix3fv("u_dvsMat3",t.transforms.displayViewScreenMat3),M.setStencilFunction(l.EQUAL,t.stencilRef,255),m){const e=Math.max(2**(Math.round(_)-t.key.level),1),i=t.rangeX/(S*t.width*e);h.setUniform1f("u_patternFactor",i)}if(g){const t=i.patternMap;if(!t)continue;for(const[i,n]of t){const t=U.getPageSize(i);null!=t&&(U.bind(M,a.LINEAR,i,e),h.setUniform2fv("u_mosaicSize",t),h.setUniform1i("u_texture",e),M.drawElements(r.TRIANGLES,n[1],o.UNSIGNED_INT,Uint32Array.BYTES_PER_ELEMENT*n[0]))}}else M.drawElements(r.TRIANGLES,i.fillIndexCount,o.UNSIGNED_INT,Uint32Array.BYTES_PER_ELEMENT*i.fillIndexStart);t.triangleCount+=i.fillIndexCount/3}}}_drawOutline(e,i,n,a,f,u){const{context:c,displayLevel:d,state:p,painter:m,pixelRatio:y,spriteMosaic:g,requestRender:M,allowDelayedRender:_}=e,E=n.outlineMaterial,v=m.vectorTilesMaterialManager,P=.75/y,U=this._outlineProgramOptions,I=v.getMaterialProgram(c,E,U);if(_&&null!=M&&!I.compiled)return void M();c.useProgram(I),I.setUniformMatrix3fv("u_displayMat3",u===t.VIEWPORT?p.displayMat3:p.displayViewMat3),I.setUniform2fv("u_fillTranslation",f),I.setUniform1f("u_depth",n.z+s),I.setUniform1f("u_outline_width",P);let x=-1;for(const t of a){if(!t.layerData.has(i))continue;t.key.level!==x&&(x=t.key.level,E.setDataUniforms(I,d,n,x,g));const e=t.layerData.get(i);if(e.prepareForRendering(c),!e.outlineIndexCount)continue;const a=e.outlineVAO;null!=a&&(c.bindVAO(a),I.setUniformMatrix3fv("u_dvsMat3",t.transforms.displayViewScreenMat3),c.setStencilFunction(l.EQUAL,t.stencilRef,255),c.drawElements(r.TRIANGLES,e.outlineIndexCount,o.UNSIGNED_INT,Uint32Array.BYTES_PER_ELEMENT*e.outlineIndexStart),t.triangleCount+=e.outlineIndexCount/3)}}}export{f as WGLBrushVTLFill};