UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) • 6.22 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import t from"../../../core/Logger.js";import{floatEqualUlp as n}from"../../../core/mathUtils.js";import{getMetersPerCartesianUnitForSR as r,convertUnit as e}from"../../../core/unitUtils.js";import{normalFromMat4 as o}from"../../../core/libs/gl-matrix-2/math/mat3.js";import{create as i}from"../../../core/libs/gl-matrix-2/factories/mat3f64.js";import{invert as l,exactEquals as a,copy as s,multiply as c,scale as u}from"../../../core/libs/gl-matrix-2/math/mat4.js";import{IDENTITY as f,create as m}from"../../../core/libs/gl-matrix-2/factories/mat4f64.js";import{d as p,t as g,v as A}from"../../../chunks/vec32.js";import{create as R}from"../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{getSphericalPCPF as x,WGS84ECEFSpatialReference as E}from"../../spatialReferenceEllipsoidUtils.js";import{computeTranslationToOriginAndRotation as v}from"../../projection/computeTranslationToOriginAndRotation.js";import{projectPointToVector as T}from"../../projection/projectPointToVector.js";import{isRelativeVertexSpace as h,vertexSpaceEquals as j}from"../meshVertexSpaceUtils.js";import{isEarth as S}from"../spatialReferenceUtils.js";import{a as w,t as y,b as U}from"../../../chunks/vec3.js";import{logProjectionError as F,transformNormal as O,transformTangent as _,projectFromPCPF as b,projectNormalFromPCPF as C,projectTangentFromPCPF as d,projectToPCPF as G,projectNormalToPCPF as N,projectTangentToPCPF as D}from"./projection.js";const M=()=>t.getLogger("esri.geometry.support.meshUtils.vertexSpaceConversion");function k(t,n,{vertexSpace:r,spatialReference:e}){if("georeferenced"===r.type){const o=t;if(!T(n,o,e))return!1;const{origin:i}=r;return p(t,o,i),!0}const o=x(e),i=t;if(!T(n,i,o))return!1;const{origin:a}=r,s=lt;if(!v(e,a,s,o))return!1;const c=l(lt,s);return null!=c&&(g(t,i,c),!0)}function B(t,n,r){const{vertexSpace:e,transform:o,vertexAttributes:i}=t,l=h(e)?o:null,s=X(t.spatialReference,r,at.SOURCE_AND_TARGET);if(j(e,n)&&(!l||a(l.localMatrix,f))&&Y(s)){const{position:t,normal:n,tangent:e}=i,o=r?.allowBufferReuse;return{position:o?t:t.slice(),normal:o?n:n?.slice(),tangent:o?e:e?.slice()}}switch(t.vertexSpace.type){case"local":return"local"===n.type?H(t,t.vertexSpace,n.origin,r):P(t,t.vertexSpace,n.origin,r);case"georeferenced":return"local"===n.type?q(t,t.vertexSpace,n.origin,r):L(t,t.vertexSpace,n.origin,r)}}function L({vertexAttributes:t,transform:n,spatialReference:r},{origin:e},o,i){const l=X(r,i,at.SOURCE_AND_TARGET),a=e||!Y(l)?s(rt,n?.localMatrix??f):null;a&&W(a,r,i,at.SOURCE_AND_TARGET);const{position:c,normal:u,tangent:m}=a?I(t,a):t,p=i?.allowBufferReuse,g=p?c:new Float64Array(c.length);let R=c;if(e&&(R=w(g,R,e)),o){const t=A(it,o);R=w(g,R,t)}return{position:R!==t.position||p?R:R.slice(),normal:u!==t.normal||p?u:u?.slice(),tangent:m!==t.tangent||p?m:m?.slice()}}function V(t,n){return n?.useEllipsoid&&S(t)?E:x(t)}function P({spatialReference:t,vertexAttributes:n,transform:r},{origin:e},o,i){const l=V(t,i);if(!v(t,e,rt,l))return F(M(),t,l),null;r&&c(rt,rt,r.localMatrix),W(rt,t,i,at.SOURCE);const a=new Float64Array(n.position.length),s=J(n.position,rt,t,a,l);if(!s)return null;const u=K(s,t,a,l,n.normal,rt);if(n.normal&&!u)return null;const f=Q(s,t,a,l,n.tangent,rt);if(n.tangent&&!f)return null;if(o){const t=A(it,o);w(s,s,t)}return{position:s,normal:u,tangent:f}}function q({vertexAttributes:t,spatialReference:n,transform:r},{origin:e},i,a){const s=V(n,a);if(!v(n,i,rt,s))return F(M(),n,s),null;const c=1/X(n,a,at.TARGET);u(rt,rt,[c,c,c]);const f=l(et,rt),{position:m,normal:p,tangent:g}=z(t,e,r),A=new Float64Array(m.length),R=Z(m,n,f,A,s);if(!R)return null;const x=o(ot,f),E=$(p,m,n,A,s,x,p!==t.normal?p:void 0);if(!E&&p)return null;const T=tt(g,m,n,A,s,x,g!==t.tangent?g:void 0);return!T&&g?null:{position:R,normal:E,tangent:T}}function z(t,n,r){if(!n)return t;if(!r){const{position:r,normal:e,tangent:o}=t;return{position:w(new Float64Array(r.length),r,n),tangent:o,normal:e}}const e=I(t,r.localMatrix);return w(e.position,e.position,n),e}function H({vertexAttributes:t,spatialReference:n,transform:r},{origin:e},o,i){const a=V(n,i);if(!v(n,e,rt,a))return F(M(),n,a),null;if(r&&c(rt,rt,r.localMatrix),!v(n,o,et,a))return F(M(),a,n),null;l(et,et);const s=c(rt,et,rt);return W(s,n,i,at.SOURCE_AND_TARGET),I(t,s)}function I(t,n){const r=new Float64Array(t.position.length);y(r,t.position,n);const e=t.normal?new Float32Array(t.normal.length):null,o=t.tangent?new Float32Array(t.tangent.length):null;return e&&t.normal&&O(t.normal,e,n),o&&t.tangent&&_(t.tangent,o,n),{position:r,normal:e,tangent:o}}function J(t,n,r,e,o){y(e,t,n);const i=new Float64Array(t.length);return b(e,o,i,r)?i:(F(M(),o,r),null)}function K(t,n,r,e,o,i){if(null==o)return null;const l=new Float32Array(o.length);return O(o,l,i),C(l,t,n,r,e,l)?l:(F(M(),e,n),null)}function Q(t,n,r,e,o,i){if(null==o)return null;const l=new Float32Array(o.length);return _(o,l,i),d(l,t,n,r,e,l)?l:(F(M(),e,n),null)}function W(t,n,r,e){const o=X(n,r,e);Y(o)||u(t,t,[o,o,o])}function X(t,n,r){const e=!!(r&at.SOURCE),o=!!(r&at.TARGET),i=n?.sourceUnit,l=n?.targetUnit;if(!i&&!l)return 1;let a=nt(i,t);e||!i||Y(a)||(M().warn("source unit conversion not supported"),a=1);let s=1/nt(l,t);return o||!l||Y(s)||(M().warn("target unit conversion not supported"),s=1),a*s}function Y(t){return n(t,1)}function Z(t,n,r,e,o){const i=G(t,n,e,o);if(!i)return F(M(),n,o),null;const l=new Float64Array(i.length);return y(l,i,r),l}function $(t,n,r,e,o,i,l){if(null==t)return null;const a=l??new Float32Array(t.length);return N(t,n,r,e,o,a)?(U(a,a,i),a):(F(M(),r,o),null)}function tt(t,n,r,e,o,i,l){if(null==t)return null;const a=l??new Float32Array(t.length);return D(t,n,r,e,o,a)?(U(a,a,i,4),a):(F(M(),r,o),null)}function nt(t,n){if(null==t)return 1;const o=r(n);return 1/e(o,"meters",t)}const rt=m(),et=m(),ot=i(),it=R(),lt=m();var at;!function(t){t[t.NONE=0]="NONE",t[t.SOURCE=1]="SOURCE",t[t.TARGET=2]="TARGET",t[t.SOURCE_AND_TARGET=3]="SOURCE_AND_TARGET"}(at||(at={}));export{B as convertVertexSpace,nt as getUnitToSpatialReferenceScaleConversion,k as projectPointToVertexSpace};