UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 3.55 kB
import{nullifyNonNullableForDispose as t,isSome as o}from"../../../../../core/maybe.js";import e from"../../../../../core/PooledArray.js";import{c as n,d as r}from"../../../../../chunks/mat3.js";import{c as a}from"../../../../../chunks/mat3f64.js";import{c as s}from"../../../../../chunks/quat.js";import{a as f}from"../../../../../chunks/quatf64.js";import{e as c,w as l,q as u,s as i,h,c as m,t as p,a as b}from"../../../../../chunks/vec3.js";import{c as j}from"../../../../../chunks/vec3f64.js";import{signedDistance as d}from"../../../../../geometry/support/plane.js";import{projectedRadius as g,intersectPlane as k}from"../../../support/orientedBoundingBox.js";import{empty as w,within as z,union as S}from"../../lib/depthRange.js";function q(t,e){const n=w(),{eye:r,frustum:a,viewForward:s}=t;e.forAll((t=>{const e=o(t.offsetObb)?t.offsetObb:t.obb,f=c(l(G,e.center,r),s),u=g(e,s);if(z(n,f-u)&&z(n,f+u))return;const i=C(e,a);if(-1===i)return;if(0===i)return v.far=f+u,v.near=f-u,void S(n,v);const h=y.pushNew();h.near=f-u,h.far=f+u,h.mask=i,h.object=t}));for(let f=0;f<y.length;f++){const t=y.data[f];if(z(n,t.near)&&z(n,t.far))continue;v.far=t.far,v.near=1/0;const e=N(o(t.object.offsetObb)?t.object.offsetObb:t.object.obb,r,x,(o=>{let e=B;for(let n=0;n<R&&o.length>0;n++){if(0==(t.mask&1<<n))continue;F(a[n],o,e);const r=o;o=e,e=r}for(let t=0;t<o.length;t+=3){i(O,o.data[t+0],o.data[t+1],o.data[t+2]);const e=c(l(O,O,r),s);v.near=Math.min(v.near,e)}}));0===e&&(v.near=0),S(n,v)}return y.length=0,n}const y=new e({allocator:t=>t||{near:1/0,far:-1/0,mask:0,object:null},deallocator:o=>(o.object=t(o.object),o)}),v=w(),O=j(),A=j(),x=new e({deallocator:null}),B=new e({deallocator:null});function F(t,o,e){e.length=0;const n=o.length-3;I(O,o,n);const r=d(t,O);r<=0&&(e.push(O[0]),e.push(O[1]),e.push(O[2]));let a=0,s=r;for(;a<n;a+=3){I(A,o,a);const n=d(t,A);if(s*n<0){h(O,A,O,n/(n-s)),M(e,O)}n<=0&&M(e,A),s=n,m(O,A)}if(s*r<0){I(A,o,n);h(O,A,O,r/(r-s)),M(e,O)}}function I(t,o,e){return i(t,o.data[e+0],o.data[e+1],o.data[e+2])}function M(t,o){t.push(o[0]),t.push(o[1]),t.push(o[2])}function N(t,o,e,a){s(E,t.quaternion),l(G,o,t.center),u(G,G,E);const f=8*((G[0]<-t.halfSize[0]?-1:G[0]>t.halfSize[0]?1:0)+3*(G[1]<-t.halfSize[1]?-1:G[1]>t.halfSize[1]?1:0)+9*(G[2]<-t.halfSize[2]?-1:G[2]>t.halfSize[2]?1:0)+13),c=P[f];if(0===c)return c;n(D,t.quaternion),r(D,D,t.halfSize);const h=(o,e)=>{const n=P[f+e+1];return i(o,((1&n)<<1)-1,(2&n)-1,((4&n)>>1)-1),p(o,o,D),b(o,t.center,o)};return e.length=0,M(e,h(H,0)),M(e,h(J,1)),M(e,h(G,2)),M(e,h(K,3)),a(e),1===c?c:(e.length=0,M(e,H),M(e,K),M(e,h(G,4)),M(e,h(L,5)),a(e),2===c||(e.length=0,M(e,H),M(e,L),M(e,h(G,6)),M(e,J),a(e)),c)}const P=(()=>{const t=new Int8Array(216);let o=0;const e=e=>{for(let n=0;n<e.length;n++)t[o+n]=e[n];o+=8};return e([3,0,6,2,3,1,5,4]),e([2,0,2,3,1,5,4,0]),e([3,1,0,2,3,7,5,4]),e([2,0,1,3,2,6,4,0]),e([1,0,1,3,2,0,0,0]),e([2,1,5,7,3,2,0,0]),e([3,2,0,1,3,7,6,4]),e([2,2,0,1,3,7,6,0]),e([3,3,0,1,5,7,6,2]),e([2,0,1,5,4,6,2,0]),e([1,0,1,5,4,0,0,0]),e([2,1,3,7,5,4,0,0]),e([1,0,2,6,4,0,0,0]),e([0,0,0,0,0,0,0,0]),e([1,1,3,7,5,0,0,0]),e([2,2,3,7,6,4,0,0]),e([1,2,3,7,6,0,0,0]),e([2,3,1,5,7,6,2,0]),e([3,4,0,1,5,7,6,2]),e([2,5,7,6,4,0,1,0]),e([3,5,0,1,3,7,6,4]),e([2,4,5,7,6,2,0,0]),e([1,4,5,7,6,0,0,0]),e([2,5,1,3,7,6,4,0]),e([3,6,0,2,3,7,5,4]),e([2,6,2,3,7,5,4,0]),e([3,7,6,2,3,1,5,4]),t})(),R=4;function C(t,o){let e=0;for(let n=0;n<R;n++){const r=k(t,o[n]);if(r>0)return-1;0===r&&(e|=1<<n)}return e}const D=a(),E=f(),G=j(),H=j(),J=j(),K=j(),L=j();export{q as computeDepthRange};