UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.07 kB
import{isSome as e,isNone as t}from"../../../../core/maybe.js";import{ViewingMode as r}from"../../../ViewingMode.js";import{isValidObb as i,isValidMbs as s}from"./I3SUtil.js";import{I3sTarget as n}from"./Intersector.js";import{intersectLine as o}from"../../support/orientedBoundingBox.js";import{newIntersectorResult as l}from"../../webgl-engine/lib/Intersector.js";import{IntersectorType as c,StoreResults as d}from"../../webgl-engine/lib/IntersectorInterfaces.js";import{getVerticalOffsetI3S as a}from"../../webgl-engine/lib/verticalOffsetUtils.js";class f{constructor(e){this.type=c.I3S,this._needVerticalOffset=!1,this.layerUid=e.layerUid,this.sublayerUid=e.sublayerUid,this._collection=e.collection,this._traverseNodeHierarchy=e.traverseNodeHierarchy,this.slicePlaneEnabled=e.slicePlaneEnabled,this.isGround=e.isGround}updateElevationAlignState(e,t){this._needVerticalOffset=e&&t===r.Global}intersect(r,c,f,u){const m=r.results,h=r.options.store===d.ALL,p=r.ray.direction,y=r.tolerance;let g=e=>e,O=e=>e;const v=a(e(r.verticalOffset)?r.verticalOffset:this._needVerticalOffset?0:null);e(r.verticalOffset)&&e(v)&&(g=e=>v.applyToMbs(e),O=e=>v.applyToObb(e)),this._traverseNodeHierarchy(((d,a)=>{if(0===d.childrenLoaded)return!1;const I=e(d.serviceObbInRenderSR)&&i(d.serviceObbInRenderSR)?d.serviceObbInRenderSR:null;return!(e(I)&&!o(O(I),f,p,y))&&(a&&(e(I)||!s(d.renderMbs)||b(g(d.renderMbs),f,p,y))&&(t(d.geometryObb)||o(O(d.geometryObb),f,p,y))&&this._collection.intersect(a,f,u,y,v,((e,t,i,s)=>{if(t>=0){if(null!=c&&!c(f,u,t))return;const o=r=>{const o=new n(this.layerUid,this.sublayerUid,d.index,e,s);r.set(this.type,o,t,i)};if(this.isGround&&(null==m.ground.dist||t<m.ground.dist)&&o(m.ground),r.options.isFiltered)return;if((null==m.min.dist||t<m.min.dist)&&o(m.min),(null==m.max.dist||t>m.max.dist)&&o(m.max),h){const e=l(r.ray);o(e),r.results.all.push(e)}}})),!0)}))}}function b(e,t,r,i=0){const s=e[3]+i,n=t[0]-e[0],o=t[1]-e[1],l=t[2]-e[2],c=r[0],d=r[1],a=r[2],f=c*n+d*o+a*l;return f*f-(c*c+d*d+a*a)*(n*n+o*o+l*l-s*s)>=0}export{f as I3SIntersectionHandler};