You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
8.3 KiB
81 lines
8.3 KiB
// All material copyright Esri, All Rights Reserved, unless otherwise specified. |
|
// See https://js.arcgis.com/4.30/esri/copyright.txt for details. |
|
//>>built |
|
define("exports ../core/mathUtils ../core/libs/gl-matrix-2/math/vec2 ../core/libs/gl-matrix-2/factories/vec2f64 ./vec32 ../core/libs/gl-matrix-2/factories/vec3f64 ./vec42 ../core/libs/gl-matrix-2/factories/vec4f64 ../geometry/support/lineSegment ../geometry/support/plane ./sphere ../views/3d/webgl-engine/core/shaderLibrary/Laserline.glsl ../views/3d/webgl-engine/core/shaderLibrary/ScreenSpacePass.glsl ../views/3d/webgl-engine/core/shaderModules/Float2PassUniform ../views/3d/webgl-engine/core/shaderModules/Float3PassUniform ../views/3d/webgl-engine/core/shaderModules/Float4PassUniform ../views/3d/webgl-engine/core/shaderModules/FloatPassUniform ../views/3d/webgl-engine/core/shaderModules/interfaces ../views/3d/webgl-engine/core/shaderModules/ShaderBuilder".split(" "), |
|
function(v,y,G,w,c,q,z,H,I,A,B,J,K,r,l,t,p,g,L){function C(e){const m=new L.ShaderBuilder;m.include(K.ScreenSpacePass);m.include(J.Laserline,e);const d=m.fragment;if(e.lineVerticalPlaneEnabled||e.heightManifoldEnabled)d.uniforms.add(new p.FloatPassUniform("maxPixelDistance",(a,b)=>e.heightManifoldEnabled?2*b.camera.computeScreenPixelSizeAt(a.heightManifoldTarget):2*b.camera.computeScreenPixelSizeAt(a.lineVerticalPlaneSegment.origin))),d.code.add(g.glsl`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.spherical?(d.uniforms.add(new t.Float4PassUniform("heightManifoldOrigin",(a,b)=>{c.transformMat4(k,a.heightManifoldTarget,b.camera.viewMatrix);c.transformMat4(n,[0,0,0],b.camera.viewMatrix);c.subtract(n,n,k);c.normalize(h,n);h[3]=c.length(n);return h}),new l.Float3PassUniform("globalOrigin",(a,b)=>c.transformMat4(k,[0,0,0],b.camera.viewMatrix)),new p.FloatPassUniform("cosSphericalAngleThreshold",(a,b)=>1-Math.max(2,c.distance(b.camera.eye,a.heightManifoldTarget)*b.camera.perRenderPixelRatio)/ |
|
c.length(a.heightManifoldTarget))),d.code.add(g.glsl`float globeDistancePixels(float posInGlobalOriginLength) { |
|
float dist = abs(posInGlobalOriginLength - heightManifoldOrigin.w); |
|
float width = fwidth(dist); |
|
dist /= min(width, maxPixelDistance); |
|
return abs(dist); |
|
} |
|
float heightManifoldDistancePixels(vec4 heightPlane, vec3 pos) { |
|
vec3 posInGlobalOriginNorm = normalize(globalOrigin - pos); |
|
float cosAngle = dot(posInGlobalOriginNorm, heightManifoldOrigin.xyz); |
|
vec3 posInGlobalOrigin = globalOrigin - pos; |
|
float posInGlobalOriginLength = length(posInGlobalOrigin); |
|
float sphericalDistance = globeDistancePixels(posInGlobalOriginLength); |
|
float planarDistance = planeDistancePixels(heightPlane, pos); |
|
return cosAngle < cosSphericalAngleThreshold ? sphericalDistance : planarDistance; |
|
}`)):d.code.add(g.glsl`float heightManifoldDistancePixels(vec4 heightPlane, vec3 pos) { |
|
return planeDistancePixels(heightPlane, pos); |
|
}`);e.pointDistanceEnabled&&(d.uniforms.add(new p.FloatPassUniform("maxPixelDistance",(a,b)=>2*b.camera.computeScreenPixelSizeAt(a.pointDistanceTarget))),d.code.add(g.glsl`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&&(d.uniforms.add(new p.FloatPassUniform("perScreenPixelRatio",(a,b)=>b.camera.perScreenPixelRatio)),d.code.add(g.glsl`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)&&d.code.add(g.glsl`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; |
|
}`);d.code.add(g.glsl`void main() { |
|
vec3 pos; |
|
vec3 normal; |
|
float angleCutoffAdjust; |
|
float depthDiscontinuityAlpha; |
|
if (!laserlineReconstructFromDepth(pos, normal, angleCutoffAdjust, depthDiscontinuityAlpha)) { |
|
discard; |
|
} |
|
vec4 color = vec4(0, 0, 0, 0);`);if(e.heightManifoldEnabled){d.uniforms.add(new r.Float2PassUniform("angleCutoff",b=>u(b)),new t.Float4PassUniform("heightPlane",(b,f)=>D(b.heightManifoldTarget,b.renderCoordsHelper.worldUpAtPosition(b.heightManifoldTarget,k),f.camera.viewMatrix)));const a=e.spherical?g.glsl`normalize(globalOrigin - pos)`:g.glsl`heightPlane.xyz`;d.code.add(g.glsl` |
|
{ |
|
vec2 angleCutoffAdjusted = angleCutoff - angleCutoffAdjust; |
|
|
|
// Fade out laserlines on flat surfaces |
|
float heightManifoldAlpha = 1.0 - smoothstep(angleCutoffAdjusted.x, angleCutoffAdjusted.y, abs(dot(normal, ${a}))); |
|
|
|
vec4 heightManifoldColor = laserlineProfile(heightManifoldDistancePixels(heightPlane, pos)); |
|
color = max(color, heightManifoldColor * heightManifoldAlpha); |
|
} |
|
`)}e.pointDistanceEnabled&&(d.uniforms.add(new r.Float2PassUniform("angleCutoff",a=>u(a)),new t.Float4PassUniform("pointDistanceSphere",(a,b)=>{c.transformMat4(B.getCenter(x),a.pointDistanceOrigin,b.camera.viewMatrix);x[3]=c.distance(a.pointDistanceOrigin,a.pointDistanceTarget);return x})),d.code.add(g.glsl`{ |
|
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&&(d.uniforms.add(new r.Float2PassUniform("angleCutoff",a=>u(a)),new t.Float4PassUniform("lineVerticalPlane",(a,b)=>{var f=I.pointAt(a.lineVerticalPlaneSegment,.5,k);f=a.renderCoordsHelper.worldUpAtPosition(f,M);const N=c.normalize(n,a.lineVerticalPlaneSegment.vector);f=c.cross(k,f,N);c.normalize(f,f);return D(a.lineVerticalPlaneSegment.origin,f,b.camera.viewMatrix)}),new l.Float3PassUniform("lineVerticalStart",(a,b)=>{const f=c.copy(k,a.lineVerticalPlaneSegment.origin); |
|
a.renderCoordsHelper.setAltitude(f,0);return c.transformMat4(f,f,b.camera.viewMatrix)}),new l.Float3PassUniform("lineVerticalEnd",(a,b)=>{const f=c.add(k,a.lineVerticalPlaneSegment.origin,a.lineVerticalPlaneSegment.vector);a.renderCoordsHelper.setAltitude(f,0);return c.transformMat4(f,f,b.camera.viewMatrix)})),d.code.add(g.glsl`{ |
|
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&&(d.uniforms.add(new r.Float2PassUniform("angleCutoff",a=>u(a)),new l.Float3PassUniform("intersectsLineStart",(a,b)=>c.transformMat4(k,a.lineStartWorld,b.camera.viewMatrix)),new l.Float3PassUniform("intersectsLineEnd",(a,b)=>c.transformMat4(k,a.lineEndWorld,b.camera.viewMatrix)),new l.Float3PassUniform("intersectsLineDirection",(a,b)=>{c.copy(h,a.intersectsLineSegment.vector);h[3]=0;return c.normalize(k,z.transformMat4(h,h,b.camera.viewMatrix))}),new p.FloatPassUniform("intersectsLineRadius", |
|
a=>a.intersectsLineRadius)),d.code.add(g.glsl`{ |
|
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); |
|
} |
|
}`));d.code.add(g.glsl`fragColor = laserlineOutput(color * depthDiscontinuityAlpha); |
|
}`);return m}function u(e){return G.set(O,Math.cos(e.angleCutoff),Math.cos(Math.max(0,e.angleCutoff-y.deg2rad(2))))}function D(e,m,d){c.transformMat4(E,e,d);c.copy(h,m);h[3]=0;z.transformMat4(h,h,d);return A.fromPositionAndNormal(E,h,P)}const F=y.deg2rad(6),O=w.create(),k=q.create(),h=H.create(),M=q.create(),n=q.create(),E=q.create(),P=A.create(),x=B.create();w=Object.freeze(Object.defineProperty({__proto__:null,build:C,defaultAngleCutoff:F},Symbol.toStringTag,{value:"Module"}));v.LaserlinesShader= |
|
w;v.build=C;v.defaultAngleCutoff=F}); |