UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.51 kB
import{create as e,contains as t,intersects as s}from"../../../../geometry/support/aaBoundingBox.js";import{transformObb as n}from"./I3SUtil.js";import{set as i,toAaBoundingBox as r,intersectPlane as o,ObbArray as p}from"../../support/orientedBoundingBox.js";class h{constructor(e,t,s){this._pages=[],this.pageSize=0,this._nodeSR=null,this._renderSR=null,this._nodeSR=e,this._renderSR=t,this.pageSize=s}addPage(e,t,s=0){for(;this._pages.length<e;)this._pages.push(null);const n=g(t,this._nodeSR,this._renderSR,s);this._pages[e]={nodes:t,renderObbs:n,parents:new Uint32Array(this.pageSize)},u(this._pages,this.pageSize)}hasPage(e){return!!this._pages[e]}getNode(e){const t=this.pageSize;return this._pages[l(e,t)].nodes[c(e,t)]}getRenderObb(e){const t=this.pageSize;return this._pages[l(e,t)].renderObbs[c(e,t)]}getRenderCenter(e){return this.getRenderObb(e).center}setRenderObb(e,t){const s=this.pageSize;i(t,this._pages[l(e,s)].renderObbs[c(e,s)])}getParentId(e){const t=this.pageSize;return this._pages[l(e,t)].parents[c(e,t)]}hasNodes(e,t){const s=l(e,this.pageSize),n=l(e+t-1,this.pageSize);for(let i=s;i<=n;i++)if(null==this._pages[i])return!1;return!0}forEachNodeId(e){for(let t=0;t<this._pages.length;t++){const s=this._pages[t];if(s)for(let n=0;n<s.nodes.length;n++)e(t*this.pageSize+n)}}createVisibilityTraverse(){const t={index:this,queue:[],masks:[],tempAabb:e()};return(e,s)=>a(t,e,s)}}function a(e,n,i){const p=e.index;if(!p.hasNodes(0,1))return;const h=e.queue;h.length=0,h.push(0);const a=e.masks;for(a.length=0,a.push(0);h.length>0;){const g=h.pop();let u=a.pop();const c=p.getNode(g),d=p.getRenderObb(g);let f=!0;if(null!=n.clippingBox){const i=1<<n.frustum.length;if(0==(u&i)){const o=r(d,e.tempAabb);t(n.clippingBox,o)?u|=i:s(n.clippingBox,o)||(f=!1)}}for(let e=0;e<n.frustum.length&&f;e++){const t=1<<e;if(0==(u&t)){const s=o(d,n.frustum[e]);s>0?f=!1:s<0&&(u|=t)}}if(i.predicate(g,c,f)){const e=c.firstChild,t=c.childCount;let s=!1;const n=l(e,p.pageSize),r=l(e+t-1,p.pageSize);for(let o=n;o<=r;o++)if(!p.hasPage(o)){i.pageMiss(g,o),s=!0;break}if(!s)for(let i=0;i<t;i++)h.push(e+i),a.push(u)}}}function g(e,t,s,i){const r=new p(e.length);for(let o=0;o<e.length;o++)n(e[o].obb,t,r.obbs[o],s,i);return r.obbs}function u(e,t){const s=[0];for(;s.length;){const n=s.pop(),i=e[l(n,t)].nodes[c(n,t)];for(let r=0;r<i.childCount;r++){const o=i.firstChild+r;null!=e[l(o,t)]&&(e[l(o,t)].parents[c(o,t)]=n,s.push(o))}}}function l(e,t){return e/t|0}function c(e,t){return e%t}export{h as default};