UNPKG

@arcgis/core

Version:

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

3 lines (2 loc) • 6.63 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{sub as n,set as t,copy as i,cross as o,normalize as e}from"../../../../core/libs/gl-matrix-2/math/vec3.js";import{create as c}from"../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{setMin as s,setMax as f,create as r}from"../../../../geometry/support/aaBoundingBox.js";import{assert as u}from"./Util.js";class a{constructor(n=0,t=!1,i=!0){this.tolerance=n,this.isVerticalRay=t,this.normalRequired=i}}const l=r();function h(t,i,o,e,c,s){if(!t.visible)return;const f=n(F,e,o),r=(n,t,i)=>s(n,i,t),{tolerance:l}=i,h=new a(l,!1,i.options.normalRequired);if(t.boundingInfo)u(0===t.type),p(t.boundingInfo,o,f,l,c,h,r);else{const n=t.positionAttribute,i=n.indices;V(o,f,0,i.length/3,i,n.data,n.stride,c,h,r)}}const m=c();function p(n,t,i,o,e,c,r){if(null==n)return;const u=U(i,m);if(s(l,n.bbMin),f(l,n.bbMax),null!=e&&e.applyToAabb(l),k(l,t,u,o)){const{primitiveIndices:s,position:f}=n,u=s?s.length:f.indices.length/3;if(u>D){const s=n.getChildren();if(void 0!==s){for(const n of s)p(n,t,i,o,e,c,r);return}}T(t,i,0,u,f.indices,f.data,f.stride,s,e,c,r)}}const b=c();function M(t,i,o,e,c,s,f,r,u){const{data:a,stride:l}=s;V(t,n(F,i,t),o,e,c,a,l,f,r,u)}function d(n,t,i,o){if(!i.visible)return;const e=(n,t,i)=>o(n,i,t),{boundingInfo:c}=i;if(c){const{bbMin:i,bbMax:o}=c;if(n<i[0]||n>o[0]||t<i[1]||t>o[1])return}const s=i.positionAttribute,f=s.indices;x(n,t,0,f.length/3,f,s,e)}function x(n,t,i,o,e,c,s){const{data:f,stride:r}=c;for(let u=i;u<o;++u){const i=3*u,o=r*e[i],c=r*e[i+1],a=r*e[i+2],l=f[o+0]-n,h=f[o+1]-t,m=f[c+0]-n,p=f[c+1]-t,b=f[a+0]-n,M=f[a+1]-t,d=b*p-M*m,x=l*M-h*b,g=m*h-p*l;(d<0||x<0||g<0)&&(d>0||x>0||g>0)||s(0,u,null)}}function g(n,t,i,o,e,c,s,f,r,u=null,a=0){const l=n[0],h=n[1],m=n[2],p=t[0],M=t[1],d=t[2];for(let x=i;x<o;++x){const n=a+(u?.[x]??x),t=3*n,i=s*e[t],o=c[i],g=c[i+1],y=c[i+2],q=s*e[t+1],T=c[q],V=c[q+1],v=c[q+2],R=s*e[t+2],j=T-o,A=V-g,B=v-y,w=c[R]-o,C=c[R+1]-g,U=c[R+2]-y,k=M*U-C*d,z=d*w-U*p,D=p*C-w*M,F=j*k+A*z+B*D;if(Math.abs(F)<=E)continue;const G=l-o,H=h-g,J=m-y,K=G*k+H*z+J*D;if(F>0){if(K<0||K>F)continue}else if(K>0||K<F)continue;const L=H*B-A*J,N=J*j-B*G,O=G*A-j*H,P=p*L+M*N+d*O;if(F>0){if(P<0||K+P>F)continue}else if(P>0||K+P<F)continue;const Q=(w*L+C*N+U*O)/F;if(Q>=0){r(Q,n,f?I(j,A,B,w,C,U,b):null)}}}function y(n,t,i,o,e,c,s,f){const r=n[0],u=n[1],a=n[2],l=t[0],h=t[1],m=t[2];for(let p=i;p<o;++p){const n=3*p,t=n+1,i=n+2,o=c*n,M=e[o],d=e[o+1],x=e[o+2],g=c*t,y=c*i,q=e[g]-M,T=e[g+1]-d,V=e[g+2]-x,v=e[y]-M,R=e[y+1]-d,j=e[y+2]-x,A=h*j-R*m,B=m*v-j*l,w=l*R-v*h,C=q*A+T*B+V*w;if(Math.abs(C)<=E)continue;const U=r-M,k=u-d,z=a-x,D=U*A+k*B+z*w;if(C>0){if(D<0||D>C)continue}else if(D>0||D<C)continue;const F=k*V-T*z,G=z*q-V*U,H=U*T-q*k,J=l*F+h*G+m*H;if(C>0){if(J<0||D+J>C)continue}else if(J>0||D+J<C)continue;const K=(v*F+R*G+j*H)/C;if(K>=0){f(K,p,s?I(q,T,V,v,R,j,b):null)}}}function q(n,t,i,o,e,c,s,f,r,u,a,l=null,h=0){const m=n[0],p=n[1],M=n[2],d=t[0],x=t[1],g=t[2];for(let y=i;y<o;++y){const n=h+(l?.[y]??y),t=3*n,i=s*e[t],o=c[i],q=c[i+1],T=c[i+2],V=s*e[t+1],v=c[V],R=c[V+1],j=c[V+2],A=s*e[t+2],B=c[A],w=c[A+1],C=c[A+2],U=T-r,k=f/Math.sqrt(o*o+q*q+U*U),z=o+o*k,D=q+q*k,F=T+U*k,G=j-r,H=f/Math.sqrt(v*v+R*R+G*G),J=v+v*H,K=R+R*H,L=j+G*H,N=C-r,O=f/Math.sqrt(B*B+w*w+N*N),P=J-z,Q=K-D,S=L-F,W=B+B*O-z,X=w+w*O-D,Y=C+N*O-F,Z=x*Y-X*g,$=g*W-Y*d,_=d*X-W*x,nn=P*Z+Q*$+S*_;if(Math.abs(nn)<=E)continue;const tn=m-z,on=p-D,en=M-F,cn=tn*Z+on*$+en*_;if(nn>0){if(cn<0||cn>nn)continue}else if(cn>0||cn<nn)continue;const sn=on*S-Q*en,fn=en*P-S*tn,rn=tn*Q-P*on,un=d*sn+x*fn+g*rn;if(nn>0){if(un<0||cn+un>nn)continue}else if(un>0||cn+un<nn)continue;const an=(W*sn+X*fn+Y*rn)/nn;if(an>=0){a(an,n,u?I(P,Q,S,W,X,Y,b):null)}}}function T(n,t,i,o,e,c,s,f,r,u,a){const l=n[0],h=n[1],m=n[2],p=t[0],M=t[1],d=t[2],{normalRequired:x}=u;for(let g=i;g<o;++g){const n=f[g],t=3*n,i=s*e[t];let o=c[i],u=c[i+1],y=c[i+2];const q=s*e[t+1];let T=c[q],V=c[q+1],v=c[q+2];const R=s*e[t+2];let j=c[R],A=c[R+1],B=c[R+2];null!=r&&([o,u,y]=r.applyToVertex(o,u,y,g),[T,V,v]=r.applyToVertex(T,V,v,g),[j,A,B]=r.applyToVertex(j,A,B,g));const w=T-o,C=V-u,U=v-y,k=j-o,z=A-u,D=B-y,F=M*D-z*d,G=d*k-D*p,H=p*z-k*M,J=w*F+C*G+U*H;if(Math.abs(J)<=E)continue;const K=l-o,L=h-u,N=m-y,O=K*F+L*G+N*H;if(J>0){if(O<0||O>J)continue}else if(O>0||O<J)continue;const P=L*U-C*N,Q=N*w-U*K,S=K*C-w*L,W=p*P+M*Q+d*S;if(J>0){if(W<0||O+W>J)continue}else if(W>0||O+W<J)continue;const X=(k*P+z*Q+D*S)/J;if(X>=0){a(X,n,x?I(w,C,U,k,z,D,b):null)}}}function V(o,e,c,s,f,r,u,a,l,h){const m=e,p=G,b=Math.abs(m[0]),M=Math.abs(m[1]),d=Math.abs(m[2]),x=b>=M?b>=d?0:2:M>=d?1:2,g=x,y=m[g]<0?2:1,q=(x+y)%3,T=(x+(3-y))%3,V=m[q]/m[g],I=m[T]/m[g],B=1/m[g],w=v,C=R,U=j,{normalRequired:k}=l;for(let v=c;v<s;++v){const e=3*v,c=u*f[e];t(p[0],r[c+0],r[c+1],r[c+2]);const s=u*f[e+1];t(p[1],r[s+0],r[s+1],r[s+2]);const l=u*f[e+2];t(p[2],r[l+0],r[l+1],r[l+2]),a&&(i(p[0],a.applyToVertex(p[0][0],p[0][1],p[0][2],v)),i(p[1],a.applyToVertex(p[1][0],p[1][1],p[1][2],v)),i(p[2],a.applyToVertex(p[2][0],p[2][1],p[2][2],v))),n(w,p[0],o),n(C,p[1],o),n(U,p[2],o);const m=w[q]-V*w[g],b=w[T]-I*w[g],M=C[q]-V*C[g],d=C[T]-I*C[g],x=U[q]-V*U[g],y=U[T]-I*U[g],R=x*d-y*M,j=m*y-b*x,z=M*b-d*m;if((R<0||j<0||z<0)&&(R>0||j>0||z>0))continue;const D=R+j+z;if(0===D)continue;const E=R*(B*w[g])+j*(B*C[g])+z*(B*U[g]);if(E*Math.sign(D)<0)continue;const F=E/D;if(F>=0){h(F,v,k?A(p):null)}}}const v=c(),R=c(),j=c();function I(n,i,c,s,f,r,u){return t(B,n,i,c),t(w,s,f,r),o(u,B,w),e(u,u),u}function A(t){return n(B,t[1],t[0]),n(w,t[2],t[0]),o(b,B,w),e(b,b),b}const B=c(),w=c();function C(n,i,o){return t(o,1/(i[0]-n[0]),1/(i[1]-n[1]),1/(i[2]-n[2]))}function U(n,i){return t(i,1/n[0],1/n[1],1/n[2])}function k(n,t,i,o){return z(n,t,i,o,1/0)}function z(n,t,i,o,e){const c=(n[0]-o-t[0])*i[0],s=(n[3]+o-t[0])*i[0];let f=Math.min(c,s),r=Math.max(c,s);const u=(n[1]-o-t[1])*i[1],a=(n[4]+o-t[1])*i[1];if(r=Math.min(r,Math.max(u,a)),r<0)return!1;if(f=Math.max(f,Math.min(u,a)),f>r)return!1;const l=(n[2]-o-t[2])*i[2],h=(n[5]+o-t[2])*i[2];return r=Math.min(r,Math.max(l,h)),!(r<0)&&(f=Math.max(f,Math.min(l,h)),!(f>r)&&f<e)}const D=1e3,E=1e-7,F=c(),G=[c(),c(),c()];export{a as MeshIntersectionOptions,C as computeInvDir,U as computeInvDirFromDirection,I as computeNormalFromBarycentric,k as intersectAabbInvDir,z as intersectAabbInvDirBefore,g as intersectRayTriangles,V as intersectRayTrianglesWithDisplacementWatertight,q as intersectRayTrianglesWithVerticalOffsetENUGlobal,y as intersectRenderGeometryTriangles,h as intersectTriangleGeometry,d as intersectTriangleGeometry2d,M as intersectTriangles,x as intersectTriangles2d,E as triangleRayParallelTolerance};