123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.24/esri/copyright.txt for details.
- */
- import{deg2rad as e}from"../core/mathUtils.js";import{isSome as i}from"../core/maybe.js";import{a as n}from"./vec2.js";import{a as t}from"./vec2f64.js";import{Laserline as a}from"../views/3d/webgl-engine/core/shaderLibrary/Laserline.glsl.js";import{ScreenSpacePass as o}from"../views/3d/webgl-engine/core/shaderLibrary/ScreenSpacePass.js";import{Float2PassUniform as s}from"../views/3d/webgl-engine/core/shaderModules/Float2PassUniform.js";import{Float3Uniform as l}from"../views/3d/webgl-engine/core/shaderModules/Float3Uniform.js";import{Float4Uniform as r}from"../views/3d/webgl-engine/core/shaderModules/Float4Uniform.js";import{FloatPassUniform as d}from"../views/3d/webgl-engine/core/shaderModules/FloatPassUniform.js";import{FloatUniform as c}from"../views/3d/webgl-engine/core/shaderModules/FloatUniform.js";import{glsl as f}from"../views/3d/webgl-engine/core/shaderModules/interfaces.js";import{ShaderBuilder as p}from"../views/3d/webgl-engine/core/shaderModules/ShaderBuilder.js";const h=e(6);function m(e){const i=new p;i.extensions.add("GL_OES_standard_derivatives"),i.include(o),i.include(a,e);const n=i.fragment;return e.heightManifoldEnabled&&n.uniforms.add(new r("heightPlane")),e.pointDistanceEnabled&&n.uniforms.add(new r("pointDistanceSphere")),e.lineVerticalPlaneEnabled&&(n.uniforms.add(new r("lineVerticalPlane")),n.uniforms.add(new l("lineVerticalStart")),n.uniforms.add(new l("lineVerticalEnd"))),(e.heightManifoldEnabled||e.pointDistanceEnabled||e.lineVerticalPlaneEnabled)&&n.uniforms.add(new c("maxPixelDistance")),(e.lineVerticalPlaneEnabled||e.heightManifoldEnabled)&&n.code.add(f`float planeDistancePixels(vec4 plane, vec3 pos) {
- float dist = dot(plane.xyz, pos) + plane.w;
- float width = fwidth(dist);
- dist /= min(width, maxPixelDistance);
- return abs(dist);
- }`),e.pointDistanceEnabled&&n.code.add(f`float sphereDistancePixels(vec4 sphere, vec3 pos) {
- float dist = distance(sphere.xyz, pos) - sphere.w;
- float width = fwidth(dist);
- dist /= min(width, maxPixelDistance);
- return abs(dist);
- }`),e.intersectsLineEnabled&&(n.uniforms.add(new l("intersectsLineStart")),n.uniforms.add(new l("intersectsLineEnd")),n.uniforms.add(new l("intersectsLineDirection")),n.uniforms.add(new c("intersectsLineRadius")),n.uniforms.add(new d("perScreenPixelRatio",((e,i)=>i.camera.perScreenPixelRatio))),n.code.add(f`float lineDistancePixels(vec3 start, vec3 dir, float radius, vec3 pos) {
- float dist = length(cross(dir, pos - start)) / (length(pos) * perScreenPixelRatio);
- return abs(dist) - radius;
- }`)),(e.lineVerticalPlaneEnabled||e.intersectsLineEnabled)&&n.code.add(f`bool pointIsWithinLine(vec3 pos, vec3 start, vec3 end) {
- vec3 dir = end - start;
- float t2 = dot(dir, pos - start);
- float l2 = dot(dir, dir);
- return t2 >= 0.0 && t2 <= l2;
- }`),n.code.add(f`void main() {
- vec3 pos;
- vec3 normal;
- float depthDiscontinuityAlpha;
- if (!laserlineReconstructFromDepth(pos, normal, depthDiscontinuityAlpha)) {
- discard;
- }
- vec4 color = vec4(0, 0, 0, 0);`),e.heightManifoldEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
- float heightManifoldAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, heightPlane.xyz)));
- vec4 heightManifoldColor = laserlineProfile(planeDistancePixels(heightPlane, pos));
- color = max(color, heightManifoldColor * heightManifoldAlpha);
- }`)),e.pointDistanceEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
- float pointDistanceSphereDistance = sphereDistancePixels(pointDistanceSphere, pos);
- vec4 pointDistanceSphereColor = laserlineProfile(pointDistanceSphereDistance);
- float pointDistanceSphereAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, normalize(pos - pointDistanceSphere.xyz))));
- color = max(color, pointDistanceSphereColor * pointDistanceSphereAlpha);
- }`)),e.lineVerticalPlaneEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
- if (pointIsWithinLine(pos, lineVerticalStart, lineVerticalEnd)) {
- float lineVerticalDistance = planeDistancePixels(lineVerticalPlane, pos);
- vec4 lineVerticalColor = laserlineProfile(lineVerticalDistance);
- float lineVerticalAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, lineVerticalPlane.xyz)));
- color = max(color, lineVerticalColor * lineVerticalAlpha);
- }
- }`)),e.intersectsLineEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
- if (pointIsWithinLine(pos, intersectsLineStart, intersectsLineEnd)) {
- float intersectsLineDistance = lineDistancePixels(intersectsLineStart, intersectsLineDirection, intersectsLineRadius, pos);
- vec4 intersectsLineColor = laserlineProfile(intersectsLineDistance);
- float intersectsLineAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, 1.0 - abs(dot(normal, intersectsLineDirection)));
- color = max(color, intersectsLineColor * intersectsLineAlpha);
- }
- }`)),n.code.add(f`gl_FragColor = laserlineOutput(color * depthDiscontinuityAlpha);
- }`),i}function u(t){const a=i(t.angleCutoff)?t.angleCutoff:h;return n(g,Math.cos(a),Math.cos(Math.max(0,a-e(2))))}const g=t(),w=Object.freeze(Object.defineProperty({__proto__:null,defaultAngleCutoff:h,build:m},Symbol.toStringTag,{value:"Module"}));export{w as L,m as b,h as d};
|