@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 6.11 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 t from"../../../core/Logger.js";import{clamp as e,lerp 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{i as d,m as f,n as h,g as b,t as p,f as y,c as A}from"../../../chunks/vec32.js";import{fromValues as w,clone as v,create as x}from"../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{ViewingMode as M}from"../../ViewingMode.js";import{S as N}from"../../../chunks/SunCalc.js";import{angle as T}from"./mathUtils.js";const O={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 j{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=O.global.ambient,d(l.direct.color,1,1,1),l.direct.intensity=O.global.direct;const c=o[2],s=e((Math.abs(c)-O.local.altitude)/(O.global.altitude-O.local.altitude),0,1);let m;if(l.globalFactor=s,null!=t&&(m=N.getTimes(t,o[1],o[0])),s<1){let e;if(null!=t)e=nt(t,m,a);else{const t=R(a);e={direct:{intensity:O.local.directAtNoon*t.direct,color:w(1,1,1)},ambient:{intensity:O.local.ambientAtNoon*t.ambient,color:w(1,1,1)},timeOfDay:"early afternoon"}}f(l.ambient.color,e.ambient.color,l.ambient.color,s),l.ambient.intensity=i(e.ambient.intensity,l.ambient.intensity,s),f(l.direct.color,e.direct.color,l.direct.color,s),l.direct.intensity=i(e.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?z(t,o,n,l.direct.directionToLightSource):P(r,n,l.direct.directionToLightSource)}function P(t,e,i){e===M.Global?h(lt,t.eye):d(lt,0,0,1),b(ct,t.viewForward,-1);const n=T(ct,lt),a=Math.max(n-2*mt,0),r=.85*a/(a+1),l=Math.max(mt,n-mt-r);o(rt,-l,t.viewRight),p(i,ct,rt),y(i,i,b(st,t.viewRight,ut)),h(i,i)}function z(t,i,o,c){const s=H,m=n(L);if(o===M.Global)N.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=O.planarDirection,n=o.globalAngles,r=i[2];let u=(Math.abs(r)-o.localAltitude)/(o.globalAltitude-o.localAltitude);u=e(u,0,1),u<1?(N.getPosition(t,i[1],i[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 D(t,e){if(e===M.Global)return!0;const i=O.planarDirection;return Math.abs(t)<i.localAltitude}function E(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)at.setTime(l+g*t),u[t]=x(),z(at,n,a,u[t]);return u}const I=w(.5773502691896258,-.5773502691896258,.5773502691896258);class G{constructor(){this.ambient={color:w(1,1,1),intensity:.55},this.direct={color:w(1,1,1),intensity:.55,directionToLightSource:v(I)},this.noonFactor=.5,this.globalFactor=0,this.specularStrength=1,this.environmentStrength=1}}const L=c(),H={azimuth:0,altitude:0};function F(t,i){const o=t.valueOf();let n,a;i.polarException===N.PolarException.MIDNIGHT_SUN?(n=o-60*(t.getHours()+48)*60*1e3-60*t.getMinutes()*1e3,a=n+432e6):i.polarException===N.PolarException.POLAR_NIGHT?(n=o-2,a=o-1):(n=i.sunrise.valueOf(),a=i.sunset.valueOf());const r=n+(a-n)/2;return 1-e(Math.abs(o-r)/432e5,0,1)}function R(t){switch(t){case"disabled":case"sunny":case"cloudy":return new j(1,1);case"rainy":return new j(.4,1.2);case"snowy":return new j(.5,1.3);case"foggy":return new j(.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 _=w(.01,.01,.01),k=w(1,.6,.5),V=w(1,.98,.98),$=w(1,1,1),q=w(.8,.8,1),C=w(.8,.8,1),B=w(.98,.98,1),J=w(1,1,1),K=u(.01,O.local.ambientAtNight),Q=u(O.local.directAtTwilight,O.local.ambientAtTwilight),W=u(.9*O.local.directAtNoon,O.local.ambientAtNoon),X=u(O.local.directAtNoon,O.local.ambientAtNoon),Y=W,Z=V,tt=B,et=Q,it=k,ot=C;function nt(t,e,i){const o=t.valueOf();let n,a;e.polarException===N.PolarException.MIDNIGHT_SUN?(n=o-60*(t.getHours()+48)*60*1e3-60*t.getMinutes()*1e3,a=n+432e6):e.polarException===N.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(),M=x(),T=x();let O="";if(o<b||o>w)s(v,K),A(M,_),A(T,q),O="night";else if(o<p){const t=(o-b)/(p-b);m(v,K,Q,t),f(M,_,k,t),f(T,q,C,t),O="sun rising"}else if(o<u){const t=(o-p)/(u-p);m(v,Q,W,t),f(M,k,V,t),f(T,C,B,t),O="early morning"}else if(o<l){const t=(o-u)/(l-u);m(v,W,X,t),f(M,V,$,t),f(T,B,J,t),O="late morning"}else if(o<d){const t=(o-l)/(d-l);m(v,X,Y,t),f(M,$,Z,t),f(T,J,tt,t),O="early afternoon"}else if(o<y){const t=(o-d)/(y-d);m(v,Y,et,t),f(M,Z,it,t),f(T,tt,ot,t),O="late afternoon"}else if(o<w){const t=(o-y)/(w-y);m(v,et,K,t),f(M,it,_,t),f(T,ot,q,t),O="sun setting"}let j=0;switch(i){case"rainy":case"foggy":j=.8;break;case"snowy":j=.5}j>0&&(U(M,j),U(T,j));const S=R(i);return{direct:{intensity:v[0]*S.direct,color:M},ambient:{intensity:v[1]*S.ambient,color:T},timeOfDay:O}}const at=new Date(0),rt=c(),lt=x(),ct=x(),st=x(),mt=.25,ut=.2;export{G as ColorAndIntensity,S as computeColorAndIntensity,E as computeDirectionsOverTime,D as computeShadowsEnabled,P as computeVirtualLightDirection};