UNPKG

@arcgis/core

Version:

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

86 lines (81 loc) 4.72 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{fromValues as e}from"../../../../../../core/libs/gl-matrix-2/factories/vec2f64.js";import{PositionAttribute as o}from"./PositionAttribute.glsl.js";import{Float2PassUniform as i}from"../../shaderModules/Float2PassUniform.js";import{Float3PassUniform as r}from"../../shaderModules/Float3PassUniform.js";import{Float4sPassUniform as t}from"../../shaderModules/Float4sPassUniform.js";import{FloatsPassUniform as a}from"../../shaderModules/FloatsPassUniform.js";import{glsl as l}from"../../shaderModules/glsl.js";import{VertexAttribute as v}from"../../../lib/VertexAttribute.js";import{vvColorNumber as s,VisualVariablePassParameters as c}from"../../../materials/VisualVariablePassParameters.js";const p=8;function f(e,c){const f=v.FEATUREVALUE;e.attributes.add(f,"vec4");const n=e.vertex;n.code.add(l` bool isCapVertex() { return ${f}.w == 1.0; } `),n.uniforms.add(new i("size",(e=>e.size))),c.vvSize?(n.uniforms.add(new r("vvSizeMinSize",(e=>e.vvSize.minSize)),new r("vvSizeMaxSize",(e=>e.vvSize.maxSize)),new r("vvSizeOffset",(e=>e.vvSize.offset)),new r("vvSizeFactor",(e=>e.vvSize.factor))),n.code.add(l` vec2 getSize() { return size * clamp(vvSizeOffset + ${f}.x * vvSizeFactor, vvSizeMinSize, vvSizeMaxSize).xz; } `)):n.code.add(l`vec2 getSize(){ return size; }`),c.vvOpacity?(n.constants.add("vvOpacityNumber","int",p),n.uniforms.add(new a("vvOpacityValues",(e=>e.vvOpacity.values),p),new a("vvOpacityOpacities",(e=>e.vvOpacity.opacityValues),p)),n.code.add(l` vec4 applyOpacity(vec4 color) { float value = ${f}.z; if (value <= vvOpacityValues[0]) { return vec4( color.xyz, 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 vec4( color.xyz, mix(vvOpacityOpacities[i-1], vvOpacityOpacities[i], f)); } } return vec4( color.xyz, vvOpacityOpacities[vvOpacityNumber - 1]); } `)):n.code.add(l`vec4 applyOpacity(vec4 color){ return color; }`),c.vvColor?(n.constants.add("vvColorNumber","int",s),n.uniforms.add(new a("vvColorValues",(e=>e.vvColor.values),s),new t("vvColorColors",(e=>e.vvColor.colors),s)),n.code.add(l` vec4 getColor() { float value = ${f}.y; if (value <= vvColorValues[0]) { return applyOpacity(vvColorColors[0]); } for (int i = 1; i < vvColorNumber; ++i) { if (vvColorValues[i] >= value) { float f = (value - vvColorValues[i-1]) / (vvColorValues[i] - vvColorValues[i-1]); return applyOpacity(mix(vvColorColors[i-1], vvColorColors[i], f)); } } return applyOpacity(vvColorColors[vvColorNumber - 1]); } `)):n.code.add(l`vec4 getColor(){ return applyOpacity(vec4(1, 1, 1, 1)); }`),e.include(o),e.attributes.add(v.PROFILERIGHT,"vec4"),e.attributes.add(v.PROFILEUP,"vec4"),e.attributes.add(v.PROFILEVERTEXANDNORMAL,"vec4"),n.code.add(l`vec3 calculateVPos() { vec2 size = getSize(); vec3 origin = position; vec3 right = profileRight.xyz; vec3 up = profileUp.xyz; vec3 forward = cross(up, right); vec2 profileVertex = profileVertexAndNormal.xy * size; vec2 profileNormal = profileVertexAndNormal.zw; float positionOffsetAlongProfilePlaneNormal = 0.0; float normalOffsetAlongProfilePlaneNormal = 0.0;`),n.code.add(l`if(!isCapVertex()) { vec2 rotationRight = vec2(profileRight.w, profileUp.w); float maxDistance = length(rotationRight);`),n.code.add(l`rotationRight = maxDistance > 0.0 ? normalize(rotationRight) : vec2(0, 0); float rx = dot(profileVertex, rotationRight); if (abs(rx) > maxDistance) { vec2 rotationUp = vec2(-rotationRight.y, rotationRight.x); float ry = dot(profileVertex, rotationUp); profileVertex = rotationRight * maxDistance * sign(rx) + rotationUp * ry; } }else{ positionOffsetAlongProfilePlaneNormal = profileRight.w * size[0]; normalOffsetAlongProfilePlaneNormal = profileUp.w; } vec3 offset = right * profileVertex.x + up * profileVertex.y + forward * positionOffsetAlongProfilePlaneNormal; return origin + offset; }`),n.code.add(l`vec3 localNormal() { vec3 right = profileRight.xyz; vec3 up = profileUp.xyz; vec3 forward = cross(up, right); vec2 profileNormal = profileVertexAndNormal.zw; vec3 normal = right * profileNormal.x + up * profileNormal.y; if(isCapVertex()) { normal += forward * profileUp.w; } return normal; }`)}class n extends c{constructor(){super(...arguments),this.size=e(1,1)}}export{f as PathVertexPosition,n as PathVertexPositionPassParameters};