@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 3.63 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */
import t from"../../../../../core/PooledArray.js";import{fromQuat as e,scale as r}from"../../../../../core/libs/gl-matrix-2/math/mat3.js";import{create as n}from"../../../../../core/libs/gl-matrix-2/factories/mat3f64.js";import{conjugate as o}from"../../../../../core/libs/gl-matrix-2/math/quat.js";import{create as a}from"../../../../../core/libs/gl-matrix-2/factories/quatf64.js";import{dot as i,sub as l,transformQuat as s,set as c,transformMat3 as f,add as u,lerp as m,copy as h}from"../../../../../core/libs/gl-matrix-2/math/vec3.js";import{create as b}from"../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{signedDistance as p}from"../../../../../geometry/support/plane.js";import{DepthRange as g}from"../../lib/DepthRange.js";function j(t,e){const r=new g,{eye:n,frustum:o,viewForward:a}=t;e.forAll(t=>{const e=null!=t.offsetObb?t.offsetObb:t.obb,s=i(l(M,e.center,n),a),c=e.projectedRadius(a);if(r.within(s-c)&&r.within(s+c))return;const f=S(e,o);if(-1===f)return;if(0===f)return w.far=s+c,w.near=s-c,void r.union(w);const u=d.pushNew();u.near=s-c,u.far=s+c,u.mask=f,u.object=t});for(let s=0;s<d.length;s++){const t=d.data[s];if(r.within(t.near)&&r.within(t.far))continue;w.far=t.far,w.near=1/0;const e=z(null!=t.object.offsetObb?t.object.offsetObb:t.object.obb,n,v,e=>{let r=y;for(let n=0;n<R&&e.length>0;n++){if(!(t.mask&1<<n))continue;O(o[n],e,r);const a=e;e=r,r=a}for(let t=0;t<e.length;t+=3){c(x,e.data[t],e.data[t+1],e.data[t+2]);const r=i(l(x,x,n),a);w.near=Math.min(w.near,r)}});0===e&&(w.near=0),r.union(w)}return d.length=0,r}const d=new t({allocator:t=>t||{near:1/0,far:-1/0,mask:0,object:null},deallocator:t=>(t.object=null,t)}),w=new g,x=b(),q=b(),v=new t({deallocator:null}),y=new t({deallocator:null});function O(t,e,r){r.length=0;const n=e.length-3;k(x,e,n);const o=p(t,x);o<=0&&(r.push(x[0]),r.push(x[1]),r.push(x[2]));let a=0,i=o;for(;a<n;a+=3){k(q,e,a);const n=p(t,q);if(i*n<0){m(x,q,x,n/(n-i)),A(r,x)}n<=0&&A(r,q),i=n,h(x,q)}if(i*o<0){k(q,e,n);m(x,q,x,o/(o-i)),A(r,x)}}function k(t,e,r){return c(t,e.data[r],e.data[r+1],e.data[r+2])}function A(t,e){t.push(e[0]),t.push(e[1]),t.push(e[2])}function z(t,n,a,i){o(F,t.quaternion),l(M,n,t.center),s(M,M,F);const m=t.halfSize,h=8*((M[0]<-m[0]?-1:M[0]>m[0]?1:0)+3*(M[1]<-m[1]?-1:M[1]>m[1]?1:0)+9*(M[2]<-m[2]?-1:M[2]>m[2]?1:0)+13),b=P[h];if(0===b)return b;e(D,t.quaternion),r(D,D,t.halfSize);const p=(e,r)=>{const n=P[h+r+1];return c(e,((1&n)<<1)-1,(2&n)-1,((4&n)>>1)-1),f(e,e,D),u(e,t.center,e)};return a.length=0,A(a,p(N,0)),A(a,p(B,1)),A(a,p(M,2)),A(a,p(C,3)),i(a),1===b?b:(a.length=0,A(a,N),A(a,C),A(a,p(M,4)),A(a,p(E,5)),i(a),2===b||(a.length=0,A(a,N),A(a,E),A(a,p(M,6)),A(a,B),i(a)),b)}const P=(()=>{const t=new Array(216);let e=0;const r=r=>{for(let n=0;n<r.length;n++)t[e+n]=r[n];e+=8};return r([3,0,6,2,3,1,5,4]),r([2,0,2,3,1,5,4,0]),r([3,1,0,2,3,7,5,4]),r([2,0,1,3,2,6,4,0]),r([1,0,1,3,2,0,0,0]),r([2,1,5,7,3,2,0,0]),r([3,2,0,1,3,7,6,4]),r([2,2,0,1,3,7,6,0]),r([3,3,0,1,5,7,6,2]),r([2,0,1,5,4,6,2,0]),r([1,0,1,5,4,0,0,0]),r([2,1,3,7,5,4,0,0]),r([1,0,2,6,4,0,0,0]),r([0,0,0,0,0,0,0,0]),r([1,1,3,7,5,0,0,0]),r([2,2,3,7,6,4,0,0]),r([1,2,3,7,6,0,0,0]),r([2,3,1,5,7,6,2,0]),r([3,4,0,1,5,7,6,2]),r([2,5,7,6,4,0,1,0]),r([3,5,0,1,3,7,6,4]),r([2,4,5,7,6,2,0,0]),r([1,4,5,7,6,0,0,0]),r([2,5,1,3,7,6,4,0]),r([3,6,0,2,3,7,5,4]),r([2,6,2,3,7,5,4,0]),r([3,7,6,2,3,1,5,4]),t})(),R=4;function S(t,e){let r=0;for(let n=0;n<R;n++){const o=t.intersectPlane(e[n]);if(o>0)return-1;0===o&&(r|=1<<n)}return r}const D=n(),F=a(),M=b(),N=b(),B=b(),C=b(),E=b();export{j as computeDepthRange};