UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 11.5 kB
import{_ as i}from"../../../../chunks/tslib.es6.js";import t from"../../../../core/Accessor.js";import{lerp as s}from"../../../../core/mathUtils.js";import{isNone as e,isSome as r}from"../../../../core/maybe.js";import o from"../../../../core/PooledArray.js";import{property as a}from"../../../../core/accessorSupport/decorators/property.js";import"../../../../core/accessorSupport/ensureType.js";import"../../../../core/arrayUtils.js";import{subclass as c}from"../../../../core/accessorSupport/decorators/subclass.js";import{p as n}from"../../../../chunks/mat4.js";import{c as l}from"../../../../chunks/mat4f64.js";import{a as h}from"../../../../chunks/vec2f64.js";import{m as p,g as u,s as d,c as f}from"../../../../chunks/vec3.js";import{Z as _,c as m}from"../../../../chunks/vec3f64.js";import{s as g,t as b,b as v}from"../../../../chunks/vec4.js";import{c as y}from"../../../../chunks/vec4f64.js";import{getReferenceEllipsoid as G}from"../../../../geometry/ellipsoidUtils.js";import{create as S,empty as B,offset as D,width as w,height as N,expand as I,intersects as j}from"../../../../geometry/support/aaBoundingRect.js";import{a as V,c as C,e as P}from"../../../../chunks/boundedPlane.js";import{create as A}from"../../../../geometry/support/ray.js";import{d as O,g as M,i as x,c as E}from"../../../../chunks/sphere.js";import{drawAccelerationStruct as T,prepare as z,drawPoly as F}from"./deconflictorDebug.js";import{VisibilityGroup as X,VisibilityFlag as L}from"./enums.js";import Y from"../../support/debugFlags.js";import{Camera as k}from"../../webgl-engine/lib/Camera.js";import{applyPrecomputedScaleFactor as R}from"../../webgl-engine/lib/screenSizePerspectiveUtils.js";import{VertexAttribute as U}from"../../webgl-engine/lib/VertexAttribute.js";import{HUDMaterial as W}from"../../webgl-engine/materials/HUDMaterial.js";import{ScaleInfo as H}from"../../webgl-engine/materials/ScaleInfo.js";const Z=m(),q=y(),J=y(),K=m(),Q=l(),$=E(),ii=A(),ti=m(),si=S();class ei{constructor(){this.aabr=S(),this.distance=0,this.culled=!1,this.visible=!1}}class ri{constructor(i,t){this.graphics3DGraphic=i,this.slicePlaneEnabled=t,this.info={}}}var oi;!function(i){i[i.Idle=0]="Idle",i[i.Process=1]="Process",i[i.Sort=2]="Sort",i[i.Deconflict=3]="Deconflict",i[i.NumStates=4]="NumStates"}(oi||(oi={}));class ai{constructor(){this.camera=new k,this.slicePlane=V(),this.slicePlaneEnabled=!1}copyFrom(i){this.camera.copyFrom(i.camera),C(i.slicePlane,this.slicePlane),this.slicePlaneEnabled=i.slicePlaneEnabled}}let ci=class extends t{get dirty(){return this._dirty}get state(){return this._state}constructor(i){super(i),this._dirty=!1,this._runningViewState=new ai,this._state=oi.Idle,this._active=new Map,this._visible=new Map,this._iterators=new ui,this._accBinsNumX=15,this._accBinsNumY=20,this._accBinsSizeX=0,this._accBinsSizeY=0,this._accBins=null,this.accNumTests=0}destroy(){this._active.clear(),this._visible.clear(),this._iterators=null}setDirty(){!this._dirty&&this._active.size>0&&(this._dirty=!0,this.notifyChange("updating"))}get updating(){return this._state!==oi.Idle||this._dirty}get updatingProgress(){if(!this.updating)return 1;const i=this._state/oi.NumStates;return this._dirty?.5*i:i}get running(){return this.view.ready&&null!=this.view.state&&this.updating}runTask(i){switch(this._state){case oi.Idle:this._startUpdate(),i.madeProgress();case oi.Process:if(this._state=oi.Process,!this._processActiveGraphics(i))return;case oi.Sort:if(this._state=oi.Sort,!this._sortVisibleGraphics(i))return;case oi.Deconflict:if(this._state=oi.Deconflict,!this._deconflictVisibleGraphics(i))return;default:T(this,this._visible),this._state=oi.Idle,this.notifyChange("updating")}}modifyGraphics(i,t){t?i.forEach((i=>this.addToActiveGraphics(i))):i.forEach((i=>this.removeFromActiveGraphics(i))),this.setDirty()}layerSupportsDeconfliction(i){if(e(i)||"object3d"!==i.type)return!1;const t=i.stageObject;if(1!==(t?t.geometries.length:0))return!1;const s=t?.geometries[0],r=s?.material;return r instanceof W}_startUpdate(){z(this.view),this._dirty=!1,this._runningViewState.copyFrom(this.viewState);const{fullWidth:i,fullHeight:t}=this._runningViewState.camera;this._initBins(i,t),this._resetIterators()}addToActiveGraphics(i){i.info[this.visibilityGroup]=new ei,this._active.set(i.graphics3DGraphic.graphic.uid,i),this.setDirty()}removeFromActiveGraphics(i){this._visible.delete(i.graphics3DGraphic.graphic.uid),ni(i,this.visibilityGroup),delete i.info[this.visibilityGroup],this._active.delete(i.graphics3DGraphic.graphic.uid),this.setDirty()}_processActiveGraphics(i){const t=this._ensureActiveGraphicsIterator(),s=n(Q,this._runningViewState.camera.projectionMatrix),e="global"===this.view.viewingMode&&1===this.view.map.ground.opacity&&this._runningViewState.camera.relativeElevation>0?$:null;let o=0;for(r(e)&&(p(e,_,this._runningViewState.camera.viewMatrix),e[3]=G(this.view.spatialReference).radius,o=O(e,_));!i.done;){i.madeProgress();const r=t.next();if(!0===r.done)return this._resetActiveGraphicsIterator(),!0;const a=r.value,c=a&&a.info[this.visibilityGroup];c&&(this._collectGraphics3DGraphics(a,s,e,o),c.culled?this._visible.delete(a.graphics3DGraphic.graphic.uid):this._visible.set(a.graphics3DGraphic.graphic.uid,a))}return!1}_sortVisibleGraphics(i){const t=this._ensureSortGraphicsIterator();for(;!i.done;){const s=t.next();if(i.madeProgress(),!0===s.done)return this._resetSortGraphicsIterator(),!0}return!1}_deconflictVisibleGraphics(i){const t=this._ensureVisibleGraphicsIterator(),s=this.visibilityGroup===X.LABEL;for(;!i.done;){i.madeProgress();const e=t.next();if(!0===e.done)return this._resetVisibleGraphicsIterator(),!0;const r=e.value,o=r.info[this.visibilityGroup];if(!o||o.culled)continue;const a=r.graphics3DGraphic,c=(!s||a.isVisible())&&!this._isConflicted(r);c&&this._addToBins(r),o.visible=c,this._setGraphicVisibility(r,c),F(o,c)}return!1}_resetIterators(){this._iterators.active=null,this._iterators.visible=null,this._iterators.sort=null}_ensureActiveGraphicsIterator(){return this._iterators.active||(this._iterators.active=li(this._active)),this._iterators.active}_resetActiveGraphicsIterator(){this._iterators.active=null}_ensureVisibleGraphicsIterator(){return this._iterators.visible||(this._iterators.visible=li(this._visible)),this._iterators.visible}_resetVisibleGraphicsIterator(){this._iterators.visible=null}_ensureSortGraphicsIterator(){return this._iterators.sort||(this._iterators.sort=hi(this._visible,this._iterators.sortArray,this.visibilityGroup)),this._iterators.sort}_resetSortGraphicsIterator(){this._iterators.sort=null}_collectGraphics3DGraphics(i,t,s,o){const a=i.graphics3DGraphic;if(a.destroyed)return;const c=i.info[this.visibilityGroup];if(!a.isVisible(X.GRAPHIC,L.DECONFLICTION))return void(c.culled=!0);const n=this.getGraphicsLayers(a);B(c.aabr);let l=null;for(const h of n){if(!this.layerSupportsDeconfliction(h))continue;const a=h.stageObject.geometries[0].material;if(e(l)){if(l=_i,this._getProjectionInfo(h,t,l),l.isOutsideScreen||this._isCulledBySlice(i,Z)||r(s)&&this._isCulledByHorizon(l,s,o))return void(c.culled=!0);!Y.TESTS_DISABLE_OPTIMIZATIONS&&c.visible&&(l.distance*=.7)}this._expandBoundingRect(c,h,a,l)}e(l)?c.culled=!0:(c.distance=l.distance,c.culled=!1)}_getProjectionInfo(i,t,s){const e=this._runningViewState.camera,r=i.stageObject,o=r.geometries[0],a=o.material,c=M(r.boundingVolumeWorldSpace.bounds);p(Z,c,e.viewMatrix);const n=o.vertexAttributes,l=n.get(U.NORMAL).data,h=n.get(U.AUXPOS1).data;a.applyShaderOffsetsView(Z,l,r.transformation,h,e,s.scaleInfo,Z),g(q,Z[0],Z[1],Z[2],1),b(J,q,e.projectionMatrix),u(s.positionNDC,J,1/J[3]),a.applyShaderOffsetsNDC(s.positionNDC,h,e,s.positionNDC,K),s.distanceWithoutPolygonOffset=e.depthNDCToWorld(K[2]),s.distance=K[2]===s.positionNDC[2]?s.distanceWithoutPolygonOffset:e.depthNDCToWorld(s.positionNDC[2]),g(J,s.positionNDC[0],s.positionNDC[1],s.positionNDC[2],1),b(q,J,t),v(q,q,1/q[3]),d(s.positionView,Z[0],Z[1],Z[2])}_isCulledByHorizon(i,t,s){return f(ii.direction,i.positionView),d(ii.origin,0,0,0),!!x(t,ii,ti)&&i.distanceWithoutPolygonOffset>s}_isCulledBySlice(i,t){return i.slicePlaneEnabled&&this._runningViewState.slicePlaneEnabled&&P(this._runningViewState.slicePlane,t)}_expandBoundingRect(i,t,e,{positionNDC:r,scaleInfo:o}){const a=this._runningViewState.camera,c=t.getScreenSize(di);R(c,o.factor,c),c[0]*=a.pixelRatio,c[1]*=a.pixelRatio;const n=D(e.calculateRelativeScreenBounds(c,o.factorAlignment.scale,si),s(0,a.fullWidth,.5+.5*r[0]),s(0,a.fullHeight,.5+.5*r[1])),l=this.iconMarginFactor;if(0!==l){const i=l*Math.min(w(n),N(n));n[0]-=i,n[1]-=i,n[2]+=i,n[3]+=i}I(i.aabr,n,i.aabr)}_isConflicted(i){const t=i.graphics3DGraphic.graphic.uid,s=i.info[this.visibilityGroup];for(let e=Math.floor(s.aabr[0]/this._accBinsSizeX);e<=Math.floor(s.aabr[2]/this._accBinsSizeX);e++)if(!(e<0||e>=this._accBinsNumX))for(let i=Math.floor(s.aabr[1]/this._accBinsSizeY);i<=Math.floor(s.aabr[3]/this._accBinsSizeY);i++){if(i<0||i>=this._accBinsNumY)continue;const r=this._accBins[e][i];for(let i=0;i<r.length;i++){const e=r.data[i],o=e.info[this.visibilityGroup];if(o&&o.visible&&e.graphics3DGraphic.graphic.uid!==t&&(this.accNumTests++,j(o.aabr,s.aabr)))return!0}}return!1}_initBins(i,t){if(null==this._accBins){this._accBins=[];for(let i=0;i<this._accBinsNumX;i++){this._accBins.push([]);const i=this._accBins[this._accBins.length-1];for(let t=0;t<this._accBinsNumY;t++)i.push(new o)}}else for(let s=0;s<this._accBinsNumX;s++)for(let i=0;i<this._accBinsNumY;i++)this._accBins[s][i].clear();this._accBinsSizeX=i/this._accBinsNumX,this._accBinsSizeY=t/this._accBinsNumY,this.accNumTests=0}_addToBins(i){const t=i.info[this.visibilityGroup],s=Math.floor(t.aabr[0]/this._accBinsSizeX),e=Math.floor(t.aabr[2]/this._accBinsSizeX),r=Math.floor(t.aabr[1]/this._accBinsSizeY),o=Math.floor(t.aabr[3]/this._accBinsSizeY);for(let a=s;a<=e;a++)if(!(a<0||a>=this._accBinsNumX))for(let t=r;t<=o;t++)t<0||t>=this._accBinsNumY||this._accBins[a][t].push(i)}_setGraphicVisibility(i,t){const s=i.graphics3DGraphic;s.destroyed||(s.setVisibilityFlag(L.DECONFLICTION,t,this.visibilityGroup),this.visibilityGroup===X.LABEL&&this.view.labeler.setLabelGraphicVisibility(s,t))}};function ni(i,t){const s=i.graphics3DGraphic;s.destroyed||s.clearVisibilityFlag(L.DECONFLICTION,t)}function*li(i){if(Map.prototype.entries){const t=i.entries();for(let i=t.next();!i.done;i=t.next())yield i.value[1]}else yield*i.values()}function*hi(i,t,s){t.clear(),i.forEach(((i,e)=>{const r=t.pushNew();r.id=e,r.visible=i.graphics3DGraphic.hasVisibilityFlag(L.DECONFLICTION,s),r.prio=i.info?i.info[s].distance:Number.MAX_VALUE})),yield;const e=t.iterableSort(((i,t)=>i.visible!==t.visible?i.visible?-1:1:i.prio!==t.prio?i.prio-t.prio:i.id-t.id));for(let r=e.next();!r.done;r=e.next())yield;t.forAll((t=>{const s=i.get(t.id);s&&(i.delete(t.id),i.set(t.id,s))})),t.clear()}i([a({constructOnly:!0})],ci.prototype,"view",void 0),i([a({type:Boolean,readOnly:!0})],ci.prototype,"updating",null),ci=i([c("esri.views.3d.layers.graphics.Deconflictor")],ci);class pi{}class ui{constructor(i=null,t=null,s=null){this.active=i,this.visible=t,this.sort=s,this.sortArray=new o({allocator:i=>i||new pi})}}const di=h();class fi{constructor(){this.positionView=m(),this.positionNDC=m(),this.distance=0,this.distanceWithoutPolygonOffset=0,this.scaleInfo=new H}get isOutsideScreen(){const i=this.positionNDC;return i[0]<-1||i[1]<-1||i[2]<-1||i[0]>=1||i[1]>=1}}const _i=new fi;export{ci as Deconflictor,ri as DeconflictorGraphic,ai as DeconflictorViewState,oi as State};