UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) 3.64 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.33/esri/copyright.txt for details. */ import{H as e,i as t,n as i,e as s,g as o,c as r,F as a}from"../../../../chunks/vec32.js";import{freeze as l,ZEROS as n,create as d}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{distance as c}from"../../../../geometry/support/aaBoundingRect.js";import{intersectsPoint as h}from"../../../../geometry/support/frustum.js";import{fromValues as m}from"../../../../geometry/support/ray.js";import{ViewingMode as p}from"../../../ViewingMode.js";import{FeatureTileVisibility3D as u,minTileLOD as _}from"./FeatureTileVisibility3D.js";import f from"../../webgl/RenderCamera.js";class v{constructor(e,t,i){this._renderCoordsHelper=e,this._tilingScheme=t,this._camera=new f,this._surfaceElevation=0,this._focusOnMap=[0,0],this._visibility=new u(e,i)}set opaqueGround(e){this._visibility.opaqueGround=e}setup(e,t,i){this._camera.copyFrom(e),this._surfaceElevation=i,this._focusOnMap[0]=t.x,this._focusOnMap[1]=t.y,this._visibility.setup(this._camera)}done(){this._visibility.done()}update(e){const{measures:t,extent:i,level:s}=e;t.visible=this._visibility.compute(e),t.distance=c(i,this._focusOnMap),t.mergeable=!0,t.lodLevel=_,t.splitPriority=Math.max(0,_-s),t.visible&&(this._isGlobal?this._updateSplitAndLodGlobal(e):this._updateSplitAndLodLocal(e))}_updateSplitAndLodGlobal(r){const a=r.level,l=this._renderCoordsHelper,{eye:n,fov:d}=this._camera,c=l.referenceEllipsoid.radius,h=e(n)-c;if(2*Math.atan(c/h)<d&&h>0)return void(r.measures.lodLevel=Math.max(a,_));const m=M,{extent:p}=r,{_surfaceElevation:u}=this;t(m[0],p[0],p[1],u),t(m[1],p[2],p[1],u),t(m[2],p[2],p[3],u),t(m[3],p[0],p[3],u);const f=t(y,.5*(p[0]+p[2]),.5*(p[1]+p[3]),u),v=this._tilingScheme.spatialReference;for(let e=0;e<4;++e)l.toRenderCoords(m[e],v,m[e]);l.toRenderCoords(f,v,f);const g=i(L.direction,f),x=s(n,g),S=o(b,g,x);this._updateSplitAndLod(r,m,f,S)}_updateSplitAndLodLocal(e){const i=M,{extent:s}=e,{_surfaceElevation:o}=this;t(i[0],s[0],s[1],o),t(i[1],s[2],s[1],o),t(i[2],s[2],s[3],o),t(i[3],s[0],s[3],o);const a=this._tilingScheme.spatialReference;for(let t=0;t<4;++t)this._renderCoordsHelper.toRenderCoords(i[t],a,i[t]);const l=t(y,.5*(i[0][0]+i[2][0]),.5*(i[0][1]+i[2][1]),.25*(i[0][2]+i[1][2]+i[2][2]+i[3][2])),n=t(g,l[0],l[1],0),{eye:d,far:c}=this._camera,h=t(b,n[0],n[1],d[2]);t(L.origin,n[0],n[1],d[2]-2*c),r(L.direction,x),this._updateSplitAndLod(e,i,l,h)}_updateSplitAndLod(e,t,i,o){const r=Math.max(a(t[0],t[2]),a(t[1],t[3]),a(t[0],i)+a(i,t[2]),a(t[1],i)+a(i,t[3])),{eye:l,near:n,fov:d,viewForward:c,width:m,height:p,pixelRatio:u,frustum:_}=this._camera,f=s(l,c),v=s(i,c)-f,M=a(i,l);let y=v,g=v,b=M,x=M;const L=(e,t)=>t<n?1:Math.sqrt(e*e-t*t)/t;let C=L(M,v);for(const h of t){const e=s(h,c)-f;y=Math.min(y,e),g=Math.max(g,e);const t=a(h,l);x=Math.max(x,t),b=Math.min(b,t);const i=L(t,e);C=Math.min(C,i)}if(g<n)return void(e.measures.lodLevel=0);const R=Math.cos(.5*d),A=a(l,o);C>R&&A>j*r&&(g=w*x,y=w*b);const G=.5*Math.sqrt(m*m+p*p)/u,E=2*Math.tan(.5*d),H=e=>Math.max(n,e)*S/G*E,q=e.level,F=r*2**q*Math.max(1,E),O=H(y),P=Math.ceil(Math.log2(Math.max(1,F/O)));if(e.measures.lodLevel=Math.max(P,e.measures.lodLevel),e.measures.splitPriority+=e.measures.lodLevel-q,q<P){const i=+h(_,t[0])+ +h(_,t[1])+ +h(_,t[2])+ +h(_,t[3]);e.measures.splitPriority+=i}const V=H(g)/O;V>2.5&&(e.measures.splitPriority+=V)}get _isGlobal(){return this._renderCoordsHelper.viewingMode===p.Global}}const M=[d(),d(),d(),d()],y=d(),g=d(),b=d(),x=l(0,0,1),L=m(n,x),S=312,j=.5,w=2;export{v as FeatureTileMeasurements3D};