@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 3.87 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.32/esri/copyright.txt for details.
*/
import{copy as t}from"../../../../core/libs/gl-matrix-2/math/mat4.js";import{create as e}from"../../../../core/libs/gl-matrix-2/factories/mat4f64.js";import{i as o}from"../../../../chunks/vec32.js";import{create as n}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{computeTranslationToOriginAndRotation as r}from"../../../../geometry/projection/computeTranslationToOriginAndRotation.js";import{projectBuffer as a}from"../../../../geometry/projection/projectBuffer.js";import{updateVertexPointGroundDistance as s,SampleElevationInfo as i}from"./elevationAlignmentUtils.js";import{debugFlags as l}from"../../support/debugFlags.js";import{SamplePosition as m}from"../../support/ElevationProvider.js";import{isGeometryWithMapPositions as f}from"../../webgl-engine/lib/GeometryWithMapPositions.js";import{VertexAttribute as c}from"../../webgl-engine/lib/VertexAttribute.js";function u(t,e,o,n,r){const a=t.stageObject,s=a.geometries;let i=0;for(const l of s){if(!f(l))continue;const{update:t,averageGeometrySampledElevation:s}=M(l,e,o,n,r);i+=s,t&&a.geometryVertexAttributeUpdated(l,c.POSITION)}return i/s.length}function p(e,n,a,i,m,f){const c=e.stageObject,u=n.centerPointInElevationSR;let p=0;if(c.usesVerticalDistanceToGround)i(u,E),s(c,E.verticalDistanceToGround),p=E.sampledElevation;else{i(u,E);"absolute-height"!==n.mode&&(p=E.sampledElevation)}const b=t(g,f??c.transformation),I=o(v,b[12],b[13],b[14]);l.TESTS_DISABLE_OPTIMIZATIONS?(T[0]=u.x,T[1]=u.y,T[2]=E.z,r(u.spatialReference,T,b,m.spatialReference)&&(f?t(f,b):c.transformation=b)):m.setAltitudeOfTransformation(E.z,b);const S=d/m.unitInMeters;return(Math.abs(b[12]-I[0])>=S||Math.abs(b[13]-I[1])>=S||Math.abs(b[14]-I[2])>=S)&&(f?t(f,b):c.transformation=b),p}const g=e();function b(t,e,n,a,s){const i=t.graphics3DSymbolLayer.lodRenderer;if(null==i)return 0;const m=e.centerPointInElevationSR;a(m,E);const f="absolute-height"!==e.mode?E.sampledElevation:0,c=i.instanceData,u=t.instanceIndex,p=h;c.getGlobalTransform(u,p);const g=o(v,p[12],p[13],p[14]);l.TESTS_DISABLE_OPTIMIZATIONS?(T[0]=m.x,T[1]=m.y,T[2]=E.z,r(m.spatialReference,T,p,s.spatialReference)&&c.setGlobalTransform(u,p)):s.setAltitudeOfTransformation(E.z,p);const b=d/s.unitInMeters;return(l.TESTS_DISABLE_OPTIMIZATIONS||Math.abs(p[12]-g[0])>=b||Math.abs(p[13]-g[1])>=b||Math.abs(p[14]-g[2])>=b)&&c.setGlobalTransform(u,p),f}function I(t,e,o,n,r){const a=t.stageObject,s=a.geometries;if(0===s.length)return 0;let i=0,l=null,m=0,u=!1;for(const p of s){if(!f(p))continue;const t=p.attributes.get(c.POSITION);if(t!==l){const{update:a,averageGeometrySampledElevation:s}=M(p,e,o,n,r);m=s,l=t,u=a}u&&a.geometryVertexAttributeUpdated(p,c.POSITION),i+=m}return i/s.length}const d=.01,T=n(),S=n(),O=n(),h=e(),v=n(),E=new i;function M(t,e,o,n,r){let s=!1;const i=t.transformation,f=e.requiresSampledElevationInfo;S[0]=i[12],S[1]=i[13],S[2]=i[14],t.invalidateBoundingInfo();const u=t.getMutableAttribute(c.POSITION),p=u.data,g=u.size,b=p.length/g,I=new m(t.mapPositions,o);let h=0,v=0;for(let m=0;m<b;m++){if(O[0]=p[h],O[1]=p[h+1],O[2]=p[h+2],n(I,E),f&&(v+=E.sampledElevation),l.TESTS_DISABLE_OPTIMIZATIONS)p[h]=I.array[I.offset],p[h+1]=I.array[I.offset+1],p[h+2]=E.z,a(p,o,h,p,r.spatialReference,h,1),p[h]-=S[0],p[h+1]-=S[1],p[h+2]-=S[2],s=!0;else{T[0]=p[h]+S[0],T[1]=p[h+1]+S[1],T[2]=p[h+2]+S[2],r.setAltitude(T,E.z),p[h]=T[0]-S[0],p[h+1]=T[1]-S[1],p[h+2]=T[2]-S[2];const t=d/r.unitInMeters;(Math.abs(O[0]-p[h])>=t||Math.abs(O[1]-p[h+1])>=t||Math.abs(O[2]-p[h+2])>=t)&&(s=!0)}h+=g,I.offset+=3}return v/=b,{update:s,averageGeometrySampledElevation:v}}export{b as perLodInstanceElevationAligner,p as perObjectElevationAligner,u as perVertexElevationAligner,I as sharedGeometryElevationAligner};