@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
30 lines (28 loc) • 4.26 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{create as e}from"../core/libs/gl-matrix-2/factories/vec2f64.js";import{create as o}from"../core/libs/gl-matrix-2/factories/vec3f64.js";import{SimpleAtmosphereGeometry as i}from"../views/3d/environment/SimpleAtmosphereTechniqueConfiguration.js";import{Transform as r}from"../views/3d/webgl-engine/core/shaderLibrary/Transform.glsl.js";import{addMainLightDirection as t}from"../views/3d/webgl-engine/core/shaderLibrary/shading/MainLighting.glsl.js";import{Float2PassUniform as n}from"../views/3d/webgl-engine/core/shaderModules/Float2PassUniform.js";import{Float3BindUniform as s}from"../views/3d/webgl-engine/core/shaderModules/Float3BindUniform.js";import{Float3PassUniform as a}from"../views/3d/webgl-engine/core/shaderModules/Float3PassUniform.js";import{FloatPassUniform as l}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{glsl as d}from"../views/3d/webgl-engine/core/shaderModules/glsl.js";import{Matrix4BindUniform as m}from"../views/3d/webgl-engine/core/shaderModules/Matrix4BindUniform.js";import{Texture2DPassUniform as c}from"../views/3d/webgl-engine/core/shaderModules/Texture2DPassUniform.js";import{VertexAttribute as f}from"../views/3d/webgl-engine/lib/VertexAttribute.js";import{NoParameters as g}from"../views/webgl/NoParameters.js";import{ShaderBuilder as p}from"../views/webgl/ShaderBuilder.js";class u extends g{constructor(){super(...arguments),this.texV=e(),this.altitudeFade=0,this.innerScale=0,this.undergroundFadeAlpha=0,this.silhouette=new h}}class h{constructor(){this.center=o(),this.v1=o(),this.v2=o()}}function v(e){const o=new p,{vertex:g,fragment:u}=o;if(t(g),e.geometry===i.Underground)o.attributes.add(f.POSITION,"vec2"),o.varyings.add("color","vec4"),g.uniforms.add(new s("cameraPosition",(e=>e.camera.eye)),new l("undergroundFadeAlpha",(e=>e.undergroundFadeAlpha))),g.main.add(d`float ndotl = dot(normalize(cameraPosition), mainLightDirection);
float lighting = max(0.0, smoothstep(-1.0, 0.8, 2.0 * ndotl));
color = vec4(vec3(lighting), undergroundFadeAlpha);
gl_Position = vec4(position.xy, 1.0, 1.0);`),u.main.add(d`fragColor = color;`);else{o.include(r,e),o.attributes.add(f.POSITION,"vec3"),o.varyings.add("vtc","vec2"),o.varyings.add("falloff","float");const t=e.geometry===i.Cylinder;g.uniforms.add(new m("proj",(e=>e.camera.projectionMatrix)),new m("view",(e=>e.camera.viewMatrix))),t||(o.varyings.add("innerFactor","float"),g.uniforms.add(new a("silCircleCenter",(e=>e.silhouette.center))),g.uniforms.add(new a("silCircleV1",(e=>e.silhouette.v1))),g.uniforms.add(new a("silCircleV2",(e=>e.silhouette.v2))),g.uniforms.add(new n("texV",(e=>e.texV))),g.uniforms.add(new l("innerScale",(e=>e.innerScale))));const s=6.2831853,p=1/128;g.main.add(d`
${t?d`
vec3 pos = position;
float ndotl = mainLightDirection.z;
vtc = vec2(0.0, position.z + 0.05);`:d`
innerFactor = clamp(-position.z, 0.0, 1.0);
float scale = position.y * (1.0 + innerFactor * innerScale);
float phi = position.x * ${d.float(s*p)} + 1.0;
vec3 pos = (silCircleCenter + sin(phi) * silCircleV1 + cos(phi) * silCircleV2) * scale;
float ndotl = dot(normalize(position.y > 0.0 ? pos: silCircleCenter), mainLightDirection);
vtc.x = position.x * ${d.float(p)};
vtc.y = texV.x * (1.0 - position.z) + texV.y * position.z;
`}
falloff = max(0.0, smoothstep(-1.0, 0.8, 2.0 * ndotl));
gl_Position = transformPosition(proj, view, pos);
gl_Position.z = gl_Position.w; // project atmosphere onto the far plane
`),u.uniforms.add(new c("tex",(e=>e.texture))),t||u.uniforms.add(new l("altitudeFade",(e=>e.altitudeFade))),u.main.add(d`
vec4 atmosphereColor = texture(tex, vtc) * falloff;
${t?d`fragColor = atmosphereColor;`:d`
vec4 innerColor = vec4(atmosphereColor.rgb, 1.0 - altitudeFade);
fragColor = mix(atmosphereColor, innerColor, smoothstep(0.0, 1.0, innerFactor));`}`)}return o}const w=Object.freeze(Object.defineProperty({__proto__:null,SilhouetteCircle:h,SimpleAtmospherePassParameters:u,build:v},Symbol.toStringTag,{value:"Module"}));export{u as S,w as a,h as b,v as c};