@doegis/core
Version:
DOE GIS API
19 lines (16 loc) • 1.99 kB
JavaScript
import{s as e}from"../../../../../../chunks/vec4.js";import{c as r}from"../../../../../../chunks/vec4f64.js";import{ScreenSizePerspective as t,addScreenSizePerspectiveAlignment as l}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 s}from"../../shaderModules/interfaces.js";function a(e,r){const c=e.vertex;r.hasVerticalOffset?(f(c),r.hasScreenSizePerspective&&(e.include(t),l(c),o(e.vertex,r)),c.code.add(s`
vec3 calculateVerticalOffset(vec3 worldPos, vec3 localOrigin) {
float viewDistance = length((view * vec4(worldPos, 1.0)).xyz);
${r.spherical?s`vec3 worldNormal = normalize(worldPos + localOrigin);`:s`vec3 worldNormal = vec3(0.0, 0.0, 1.0);`}
${r.hasScreenSizePerspective?s`
float cosAngle = dot(worldNormal, normalize(worldPos - cameraPosition));
float verticalOffsetScreenHeight = screenSizePerspectiveScaleFloat(verticalOffset.x, abs(cosAngle), viewDistance, screenSizePerspectiveAlignment);`:s`
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(s`vec3 addVerticalOffset(vec3 worldPos, vec3 localOrigin) { return worldPos; }`)}const i=r();function f(r){r.uniforms.add(new c("verticalOffset",((r,t)=>{const{minWorldLength:l,maxWorldLength:o,screenLength:c}=r.verticalOffset,s=Math.tan(.5*t.camera.fovY)/(.5*t.camera.fullViewport[3]),a=t.camera.pixelRatio||1;return e(i,c*a,s,l,o)})))}export{a as VerticalOffset,f as addVerticalOffset};