Laserlines.glsl.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/esri/copyright.txt for details.
  4. */
  5. 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) {
  6. float dist = dot(plane.xyz, pos) + plane.w;
  7. float width = fwidth(dist);
  8. dist /= min(width, maxPixelDistance);
  9. return abs(dist);
  10. }`),e.pointDistanceEnabled&&n.code.add(f`float sphereDistancePixels(vec4 sphere, vec3 pos) {
  11. float dist = distance(sphere.xyz, pos) - sphere.w;
  12. float width = fwidth(dist);
  13. dist /= min(width, maxPixelDistance);
  14. return abs(dist);
  15. }`),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) {
  16. float dist = length(cross(dir, pos - start)) / (length(pos) * perScreenPixelRatio);
  17. return abs(dist) - radius;
  18. }`)),(e.lineVerticalPlaneEnabled||e.intersectsLineEnabled)&&n.code.add(f`bool pointIsWithinLine(vec3 pos, vec3 start, vec3 end) {
  19. vec3 dir = end - start;
  20. float t2 = dot(dir, pos - start);
  21. float l2 = dot(dir, dir);
  22. return t2 >= 0.0 && t2 <= l2;
  23. }`),n.code.add(f`void main() {
  24. vec3 pos;
  25. vec3 normal;
  26. float depthDiscontinuityAlpha;
  27. if (!laserlineReconstructFromDepth(pos, normal, depthDiscontinuityAlpha)) {
  28. discard;
  29. }
  30. vec4 color = vec4(0, 0, 0, 0);`),e.heightManifoldEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
  31. float heightManifoldAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, heightPlane.xyz)));
  32. vec4 heightManifoldColor = laserlineProfile(planeDistancePixels(heightPlane, pos));
  33. color = max(color, heightManifoldColor * heightManifoldAlpha);
  34. }`)),e.pointDistanceEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
  35. float pointDistanceSphereDistance = sphereDistancePixels(pointDistanceSphere, pos);
  36. vec4 pointDistanceSphereColor = laserlineProfile(pointDistanceSphereDistance);
  37. float pointDistanceSphereAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, normalize(pos - pointDistanceSphere.xyz))));
  38. color = max(color, pointDistanceSphereColor * pointDistanceSphereAlpha);
  39. }`)),e.lineVerticalPlaneEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
  40. if (pointIsWithinLine(pos, lineVerticalStart, lineVerticalEnd)) {
  41. float lineVerticalDistance = planeDistancePixels(lineVerticalPlane, pos);
  42. vec4 lineVerticalColor = laserlineProfile(lineVerticalDistance);
  43. float lineVerticalAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, abs(dot(normal, lineVerticalPlane.xyz)));
  44. color = max(color, lineVerticalColor * lineVerticalAlpha);
  45. }
  46. }`)),e.intersectsLineEnabled&&(n.uniforms.add(new s("angleCutoff",(e=>u(e)))),n.code.add(f`{
  47. if (pointIsWithinLine(pos, intersectsLineStart, intersectsLineEnd)) {
  48. float intersectsLineDistance = lineDistancePixels(intersectsLineStart, intersectsLineDirection, intersectsLineRadius, pos);
  49. vec4 intersectsLineColor = laserlineProfile(intersectsLineDistance);
  50. float intersectsLineAlpha = 1.0 - smoothstep(angleCutoff.x, angleCutoff.y, 1.0 - abs(dot(normal, intersectsLineDirection)));
  51. color = max(color, intersectsLineColor * intersectsLineAlpha);
  52. }
  53. }`)),n.code.add(f`gl_FragColor = laserlineOutput(color * depthDiscontinuityAlpha);
  54. }`),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};