UNPKG

@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
/* 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};