@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 2.77 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{disposeMaybe as t}from"../../../../core/maybe.js";import{toRadian as i}from"../../../../core/libs/gl-matrix-2/math/common.js";import{fromTranslation as e,scale as r,rotate as s,translate as o}from"../../../../core/libs/gl-matrix-2/math/mat3.js";import{create as a}from"../../../../core/libs/gl-matrix-2/factories/mat3f32.js";import{fromValues as n}from"../../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{i as l}from"../../../../chunks/vec32.js";import{create as m}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{backbufferStencilVisible as c,backbufferStencilClipped as h}from"./definitions.js";import d from"./VertexStream.js";import{stencil as _}from"./shaders/StencilPrograms.js";import{CompareFunction as p,StencilOperation as f}from"../../../webgl/enums.js";import{createProgram as u}from"../../../webgl/ProgramTemplate.js";const g=n(-.5,-.5);class b{constructor(){this._centerNdc=m(),this._pxToNdc=m(),this._worldDimensionsPx=m(),this._mat3=a(),this._initialized=!1}dispose(){this._program=t(this._program),this._quad=t(this._quad)}render(t,i,e){const{context:r}=t,s=this._updateGeometry(t,e);if(null!=i){const{r:t,g:e,b:s,a:o}=i;r.setClearColor(o*t/255,o*e/255,o*s/255,o)}else r.setClearColor(0,0,0,0);if(r.setStencilFunction(p.ALWAYS,0,255),r.setStencilWriteMask(255),!s)return r.setClearStencil(c),void r.clear(r.gl.STENCIL_BUFFER_BIT|r.gl.COLOR_BUFFER_BIT);r.setClearStencil(h),r.clear(r.gl.STENCIL_BUFFER_BIT|r.gl.COLOR_BUFFER_BIT),this._initialized||this._initialize(r),r.setDepthWriteEnabled(!1),r.setDepthTestEnabled(!1),r.setColorMask(!1,!1,!1,!1),r.setBlendingEnabled(!1),r.setStencilOp(f.KEEP,f.KEEP,f.REPLACE),r.setStencilFunction(p.ALWAYS,c,255),r.setStencilTestEnabled(!0),r.useProgram(this._program),this._program.setUniformMatrix3fv("u_worldExtent",this._mat3),this._quad.bind(),this._quad.draw(),this._quad.unbind()}_initialize(t){if(this._initialized)return;const i=u(t,_);i&&(this._program=i,this._quad=new d(t,[0,0,1,0,0,1,1,1]),this._initialized=!0)}_updateGeometry(t,a){const{state:n,pixelRatio:m}=t,{size:c,rotation:h}=n,d=Math.round(c[0]*m),_=Math.round(c[1]*m);if(!n.spatialReference.isWrappable)return!1;const p=i(h),f=Math.abs(Math.cos(p)),u=Math.abs(Math.sin(p)),b=Math.round(d*f+_*u),x=Math.round(m*n.worldScreenWidth);if(b<=x)return!1;const E=d*u+_*f,S=(a.left-a.right)*m/d,j=(a.bottom-a.top)*m/_;l(this._worldDimensionsPx,x,E,1),l(this._pxToNdc,2/d,-2/_,1),l(this._centerNdc,S,j,1);const C=this._mat3;return e(C,this._centerNdc),r(C,C,this._pxToNdc),0!==h&&s(C,C,p),r(C,C,this._worldDimensionsPx),o(C,C,g),!0}}export{b as WorldExtentRenderer};