@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */
import t from"../../../core/Logger.js";import{lerp as e,clamp as i}from"../../../core/mathUtils.js";import{fromRotation as o,identity as n,rotateX as a,rotateY as r,rotateZ as l}from"../../../core/libs/gl-matrix-2/math/mat4.js";import{create as c}from"../../../core/libs/gl-matrix-2/factories/mat4f64.js";import{copy as s,lerp as m}from"../../../core/libs/gl-matrix-2/math/vec2.js";import{fromValues as u,create as g}from"../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{set as d,lerp as f,normalize as h,scale as b,transformMat4 as p,add as y,copy as A}from"../../../core/libs/gl-matrix-2/math/vec3.js";import{fromValues as w,clone as v,create as x}from"../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{S as M}from"../../../chunks/SunCalc.js";import{angle as N}from"./mathUtils.js";const T={local:{altitude:1500,ambientAtNight:.1,ambientAtNoon:.45,ambientAtTwilight:.2,directAtNoon:.65,directAtTwilight:.7},global:{altitude:8e5,ambient:.015,direct:.75},planarDirection:{localAltitude:1e4,globalAltitude:1e6,globalAngles:{azimuth:1.3*Math.PI,altitude:.6*Math.PI}}};class O{constructor(t,e){this.direct=t,this.ambient=e}}function S(t,o,n,a,r,l){d(l.ambient.color,1,1,1),l.ambient.intensity=T.global.ambient,d(l.direct.color,1,1,1),l.direct.intensity=T.global.direct;const c=o[2],s=i((Math.abs(c)-T.local.altitude)/(T.global.altitude-T.local.altitude),0,1);let m;if(l.globalFactor=s,null!=t&&(m=M.getTimes(t,o[1],o[0])),s<1){let i;if(null!=t)i=ot(t,m,a);else{const t=R(a);i={direct:{intensity:T.local.directAtNoon*t.direct,color:w(1,1,1)},ambient:{intensity:T.local.ambientAtNoon*t.ambient,color:w(1,1,1)},timeOfDay:"early afternoon"}}f(l.ambient.color,i.ambient.color,l.ambient.color,s),l.ambient.intensity=e(i.ambient.intensity,l.ambient.intensity,s),f(l.direct.color,i.direct.color,l.direct.color,s),l.direct.intensity=e(i.direct.intensity,l.direct.intensity,s),l.specularStrength="rainy"===a||"snowy"===a||"foggy"===a?0:1,l.environmentStrength="rainy"===a?.7:"snowy"===a||"foggy"===a?.75:1}l.noonFactor=null!=t?F(t,m):1,null!=t?P(t,o,n,l.direct.directionToLightSource):j(r,n,l.direct.directionToLightSource)}function j(t,e,i){1===e?h(rt,t.eye):d(rt,0,0,1),b(lt,t.viewForward,-1);const n=N(lt,rt),a=Math.max(n-2*st,0),r=.85*a/(a+1),l=Math.max(st,n-st-r);o(at,-l,t.viewRight),p(i,lt,at),y(i,i,b(ct,t.viewRight,mt)),h(i,i)}function P(t,e,o,c){const s=H,m=n(L);if(1===o)M.getPosition(t,0,0,s),d(c,0,0,-1),a(m,m,-s.azimuth),r(m,m,-s.altitude),p(c,c,m);else{const o=T.planarDirection,n=o.globalAngles,r=e[2];let u=(Math.abs(r)-o.localAltitude)/(o.globalAltitude-o.localAltitude);u=i(u,0,1),u<1?(M.getPosition(t,e[1],e[0],s),s.azimuth=(1-u)*s.azimuth+u*n.azimuth,s.altitude=(1-u)*s.altitude+u*n.altitude):(s.azimuth=n.azimuth,s.altitude=n.altitude),d(c,0,-1,0),l(m,m,-s.azimuth),a(m,m,-s.altitude),p(c,c,m)}}function z(t,e){if(1===e)return!0;const i=T.planarDirection;return Math.abs(t)<i.localAltitude}function D(e,i,o,n,a,r){const l=e.getTime(),c=Math.max(0,i.getTime()-l),s=Math.floor(c/o)+1,m=Math.min(r,s),u=new Array(m),g=1===m?0:c/(m-1);s>m&&t.getLogger("esri.views.3d.support.sunUtils").warnOnce("computeDirectionsOverTime",`Requested interval ${o} exceeds maximum supported interval of ${Math.floor(g)} based on the provided time range.`);for(let t=0;t<m;++t)nt.setTime(l+g*t),u[t]=x(),P(nt,n,a,u[t]);return u}const E=w(.5773502691896258,-.5773502691896258,.5773502691896258);class I{constructor(){this.ambient={color:w(1,1,1),intensity:.55},this.direct={color:w(1,1,1),intensity:.55,directionToLightSource:v(E)},this.noonFactor=.5,this.globalFactor=0,this.specularStrength=1,this.environmentStrength=1}}const L=c(),H={azimuth:0,altitude:0};function F(t,e){const o=t.valueOf();let n,a;e.polarException===M.PolarException.MIDNIGHT_SUN?(n=o-60*(t.getHours()+48)*60*1e3-60*t.getMinutes()*1e3,a=n+432e6):e.polarException===M.PolarException.POLAR_NIGHT?(n=o-2,a=o-1):(n=e.sunrise.valueOf(),a=e.sunset.valueOf());const r=n+(a-n)/2;return 1-i(Math.abs(o-r)/432e5,0,1)}function R(t){switch(t){case"disabled":case"sunny":case"cloudy":return new O(1,1);case"rainy":return new O(.4,1.2);case"snowy":return new O(.5,1.3);case"foggy":return new O(.2,1.6)}}function U(t,e){const i=(t[0]+t[1]+t[2])/3;t[0]+=(i-t[0])*e,t[1]+=(i-t[1])*e,t[2]+=(i-t[2])*e}const G=w(.01,.01,.01),_=w(1,.6,.5),k=w(1,.98,.98),$=w(1,1,1),q=w(.8,.8,1),C=w(.8,.8,1),V=w(.98,.98,1),B=w(1,1,1),J=u(.01,T.local.ambientAtNight),K=u(T.local.directAtTwilight,T.local.ambientAtTwilight),Q=u(.9*T.local.directAtNoon,T.local.ambientAtNoon),W=u(T.local.directAtNoon,T.local.ambientAtNoon),X=Q,Y=k,Z=V,tt=K,et=_,it=C;function ot(t,e,i){const o=t.valueOf();let n,a;e.polarException===M.PolarException.MIDNIGHT_SUN?(n=o-60*(t.getHours()+48)*60*1e3-60*t.getMinutes()*1e3,a=n+432e6):e.polarException===M.PolarException.POLAR_NIGHT?(n=o-2,a=o-1):(n=e.sunrise.valueOf(),a=e.sunset.valueOf());const r=a-n,l=n+r/2,c=r/4,u=l-c,d=l+c,h=.06*r,b=n-h/2,p=n+h/2,y=a-h/2,w=a+h/2,v=g(),N=x(),T=x();let O="";if(o<b||o>w)s(v,J),A(N,G),A(T,q),O="night";else if(o<p){const t=(o-b)/(p-b);m(v,J,K,t),f(N,G,_,t),f(T,q,C,t),O="sun rising"}else if(o<u){const t=(o-p)/(u-p);m(v,K,Q,t),f(N,_,k,t),f(T,C,V,t),O="early morning"}else if(o<l){const t=(o-u)/(l-u);m(v,Q,W,t),f(N,k,$,t),f(T,V,B,t),O="late morning"}else if(o<d){const t=(o-l)/(d-l);m(v,W,X,t),f(N,$,Y,t),f(T,B,Z,t),O="early afternoon"}else if(o<y){const t=(o-d)/(y-d);m(v,X,tt,t),f(N,Y,et,t),f(T,Z,it,t),O="late afternoon"}else if(o<w){const t=(o-y)/(w-y);m(v,tt,J,t),f(N,et,G,t),f(T,it,q,t),O="sun setting"}let S=0;switch(i){case"rainy":case"foggy":S=.8;break;case"snowy":S=.5}S>0&&(U(N,S),U(T,S));const j=R(i);return{direct:{intensity:v[0]*j.direct,color:N},ambient:{intensity:v[1]*j.ambient,color:T},timeOfDay:O}}const nt=new Date(0),at=c(),rt=x(),lt=x(),ct=x(),st=.25,mt=.2;export{I as ColorAndIntensity,S as computeColorAndIntensity,D as computeDirectionsOverTime,z as computeShadowsEnabled,j as computeVirtualLightDirection};