UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

22 lines (20 loc) 2.16 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{s as e}from"../../../../../../chunks/vec42.js";import{create as r}from"../../../../../../core/libs/gl-matrix-2/factories/vec4f64.js";import{ScreenSizePerspective as l,addScreenSizePerspectiveAlignment as t}from"../util/ScreenSizePerspective.glsl.js";import{addCameraPosition as o}from"../util/View.glsl.js";import{Float4PassUniform as c}from"../../shaderModules/Float4PassUniform.js";import{glsl as i}from"../../shaderModules/glsl.js";function s(e,r){const c=e.vertex;r.hasVerticalOffset?(f(c),r.hasScreenSizePerspective&&(e.include(l),t(c),o(e.vertex,r)),c.code.add(i` vec3 calculateVerticalOffset(vec3 worldPos, vec3 localOrigin) { float viewDistance = length((view * vec4(worldPos, 1.0)).xyz); ${r.spherical?i`vec3 worldNormal = normalize(worldPos + localOrigin);`:i`vec3 worldNormal = vec3(0.0, 0.0, 1.0);`} ${r.hasScreenSizePerspective?i` float cosAngle = dot(worldNormal, normalize(worldPos - cameraPosition)); float verticalOffsetScreenHeight = screenSizePerspectiveScaleFloat(verticalOffset.x, abs(cosAngle), viewDistance, screenSizePerspectiveAlignment);`:i` float verticalOffsetScreenHeight = verticalOffset.x;`} // Screen sized offset in world space, used for example for line callouts float worldOffset = clamp(verticalOffsetScreenHeight * verticalOffset.y * viewDistance, verticalOffset.z, verticalOffset.w); return worldNormal * worldOffset; } vec3 addVerticalOffset(vec3 worldPos, vec3 localOrigin) { return worldPos + calculateVerticalOffset(worldPos, localOrigin); } `)):c.code.add(i`vec3 addVerticalOffset(vec3 worldPos, vec3 localOrigin) { return worldPos; }`)}const a=r();function f(r){r.uniforms.add(new c("verticalOffset",((r,l)=>{const{minWorldLength:t,maxWorldLength:o,screenLength:c}=r.verticalOffset,i=Math.tan(.5*l.camera.fovY)/(.5*l.camera.fullViewport[3]),s=l.camera.pixelRatio||1;return e(a,c*s,i,t,o)})))}export{s as VerticalOffset,f as addVerticalOffset};