UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.1 kB
import{lerp as e,clamp as t}from"../../../core/mathUtils.js";import{isSome as i}from"../../../core/maybe.js";import{getMetersPerUnitForSR as r}from"../../../core/unitUtils.js";import{b as s,n,e as a,l as m}from"../../../chunks/vec3.js";import{c as o}from"../../../chunks/vec3f64.js";import{getReferenceEllipsoid as h}from"../../../geometry/ellipsoidUtils.js";import l from"../../../geometry/Extent.js";import{ViewingMode as x}from"../../ViewingMode.js";import{computeInnerAltitudeFade as c}from"../environment/atmosphereUtils.js";function u(e,t,i){return e===x.Global?new f(i):new M(t,i)}class M{constructor(e,t){this._elevationProvider=e,this._referenceEllipsoid=h(t),this._unitInMeters=r(t,this._referenceEllipsoid.metersPerDegree)}compute(r,m,o,h,x){x||(x={near:0,far:0});let c=r[2]*this._unitInMeters;const u=c,M=c-h,f=this._elevationProvider?.visibleElevationBounds;f&&(c=M>=0?u-this._unitInMeters*f.min:this._unitInMeters*f.max-u);const d={x:(o=i(o)?o:new l({xmin:0,ymin:0,zmin:0,xmax:0,ymax:0,zmax:0})).xmax-o.xmin,y:o.ymax-o.ymin,z:4*Math.max(o.xmax-o.xmin,o.ymax-o.ymin)},I=Math.max(d.x,d.y,d.z);s(E,m,r),v[0]=E[0]>0?o.xmax:o.xmin,v[1]=E[1]>0?o.ymax:o.ymin,v[2]=E[2]>0?I/2:-I/2,s(v,v,r),n(E,E);const b=1.1*a(v,E)*this._unitInMeters,g=Math.sqrt(c*(c+2*this._referenceEllipsoid.radius)),w=Math.max(o.xmax-o.xmin,o.ymax-o.ymin),z=w*y*this._unitInMeters,U=w*j*this._unitInMeters,P=t((c-U)/(z-U),0,1)**3,k=Math.min(e(g,b,P),g)*Math.max(Math.log(Math.abs(M)),1);return p(Math.min(k,Math.max(34064e4,I))/this._unitInMeters,_,this._unitInMeters,x)}}class f{constructor(e){this._referenceEllipsoid=h(e)}compute(i,r,s,n,a){a||(a={near:0,far:0});const o=m(i),h=o-this._referenceEllipsoid.radius,l=this._referenceEllipsoid.radius+Math.min(0,n),x=Math.abs(h-n),u=Math.max(x,Math.abs(h)),M=Math.sqrt(u*(u+2*l)),f=o+this._referenceEllipsoid.radius;return p(1.2*e(M,f,c(u)),t(2e4-(Math.log(u)-7.983)/9.011*19e3,1e3,2e4),1,a)}}function p(e,t,i,r){const s=d/i;return e/t>s?(r.far=e,r.near=r.far/t):(r.near=s,r.far=r.near*t),r}const _=2e4,d=2,y=.001,j=1e-4,v=o(),E=o();export{u as createNearFarHeuristic};