UNPKG

@arcgis/core

Version:

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

60 lines (53 loc) 4.06 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{invert as e,translate as i}from"../../../../../../core/libs/gl-matrix-2/math/mat4.js";import{create as a}from"../../../../../../core/libs/gl-matrix-2/factories/mat4f64.js";import{VisualVariables as t}from"../shading/VisualVariables.glsl.js";import{ScreenSizePerspective as r,addScreenSizePerspective as o}from"../util/ScreenSizePerspective.glsl.js";import{addCameraPosition as c}from"../util/View.glsl.js";import{Float3PassUniform as l}from"../../shaderModules/Float3PassUniform.js";import{FloatPassUniform as s}from"../../shaderModules/FloatPassUniform.js";import{FloatsPassUniform as v}from"../../shaderModules/FloatsPassUniform.js";import{glsl as n,If as p}from"../../shaderModules/glsl.js";import{Matrix4DrawUniform as d}from"../../shaderModules/Matrix4DrawUniform.js";const u=8;function f(a,f){const{vertex:S,attributes:m}=a;S.uniforms.add(new s("intrinsicWidth",e=>e.width));const{hasScreenSizePerspective:y,spherical:O}=f;y?(a.include(r,f),o(S),c(S,f),S.uniforms.add(new d("inverseViewMatrix",(a,t)=>e(z,i(z,t.camera.viewMatrix,a.origin)))),S.code.add(n` float applyLineSizeScreenSizePerspective(float size, vec3 pos) { vec3 worldPos = (inverseViewMatrix * vec4(pos, 1)).xyz; vec3 groundUp = ${O?n`normalize(worldPos + localOrigin)`:n`vec3(0.0, 0.0, 1.0)`}; float absCosAngle = abs(dot(groundUp, normalize(worldPos - cameraPosition))); return screenSizePerspectiveScaleFloat(size, absCosAngle, length(pos), screenSizePerspective); } `)):S.code.add(n`float applyLineSizeScreenSizePerspective(float size, vec3 pos) { return size; }`),f.hasVVSize?(m.add("sizeFeatureAttribute","float"),S.uniforms.add(new l("vvSizeMinSize",e=>e.vvSize.minSize),new l("vvSizeMaxSize",e=>e.vvSize.maxSize),new l("vvSizeOffset",e=>e.vvSize.offset),new l("vvSizeFactor",e=>e.vvSize.factor),new l("vvSizeFallback",e=>e.vvSize.fallback)),S.code.add(n` float getSize(${p(y,"vec3 pos")}) { float size = isnan(sizeFeatureAttribute) ? vvSizeFallback.x : intrinsicWidth * clamp(vvSizeOffset + sizeFeatureAttribute * vvSizeFactor, vvSizeMinSize, vvSizeMaxSize).x; return ${p(y,"applyLineSizeScreenSizePerspective(size, pos)","size")}; } `)):(m.add("size","float"),S.code.add(n` float getSize(${p(y,"vec3 pos")}) { float fullSize = intrinsicWidth * size; return ${p(y,"applyLineSizeScreenSizePerspective(fullSize, pos)","fullSize")}; } `)),f.hasVVOpacity?(m.add("opacityFeatureAttribute","float"),S.constants.add("vvOpacityNumber","int",8),S.uniforms.add(new v("vvOpacityValues",u,e=>e.vvOpacity.values),new v("vvOpacityOpacities",u,e=>e.vvOpacity.opacityValues),new s("vvOpacityFallback",e=>e.vvOpacity.fallback,{supportsNaN:!0})),S.code.add(n` float interpolateOpacity(float value) { if (value <= vvOpacityValues[0]) { return vvOpacityOpacities[0]; } for (int i = 1; i < vvOpacityNumber; ++i) { if (vvOpacityValues[i] >= value) { float f = (value - vvOpacityValues[i-1]) / (vvOpacityValues[i] - vvOpacityValues[i-1]); return mix(vvOpacityOpacities[i-1], vvOpacityOpacities[i], f); } } return vvOpacityOpacities[vvOpacityNumber - 1]; } vec4 applyOpacity(vec4 color) { if (isnan(opacityFeatureAttribute)) { // If there is a color vv then it will already have taken care of applying the fallback return ${p(f.hasVVColor,"color","vec4(color.rgb, vvOpacityFallback)")}; } return vec4(color.rgb, interpolateOpacity(opacityFeatureAttribute)); } `)):S.code.add(n`vec4 applyOpacity(vec4 color) { return color; }`),f.hasVVColor?(a.include(t,f),m.add("colorFeatureAttribute","float"),S.code.add(n`vec4 getColor() { vec4 color = interpolateVVColor(colorFeatureAttribute); if (isnan(color.r)) { return vec4(0); } return applyOpacity(color); }`)):(m.add("color","vec4"),S.code.add(n`vec4 getColor() { return applyOpacity(color); }`))}const z=a();export{f as RibbonVertexPosition};