UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

3 lines (2 loc) 3.41 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{clone as e}from"../../../../../core/libs/gl-matrix-2/factories/mat3f32.js";import{collisionGridCellSize as t}from"./config.js";import{GridIndex as r}from"./util.js";class s{constructor(s,o,n,i,l,c){this._symbols=s,this._styleRepository=i,this._zoom=l,this._currentLayerCursor=0,this._currentSymbolCursor=0,this._styleProps=new Map,this._allNeededMatrices=new Map,this._gridIndex=new r(o,n,t),this._si=Math.sin(Math.PI*c/180),this._co=Math.cos(Math.PI*c/180),i.cachedStyles&&(this._styleProps=i.cachedStyles);for(const t of s)for(const r of t.symbols)this._allNeededMatrices.has(r.tile)||this._allNeededMatrices.set(r.tile,e(r.tile.transforms.tileUnitsToPixels))}work(e){const t=performance.now();for(;this._currentLayerCursor<this._symbols.length;this._currentLayerCursor++,this._currentSymbolCursor=0){const r=this._symbols[this._currentLayerCursor],s=this._getProperties(r.styleLayerUID),o=this._styleRepository.layerContexts?.get(r.styleLayerUID);for(;this._currentSymbolCursor<r.symbols.length;this._currentSymbolCursor++){if(this._currentSymbolCursor%100==99&&performance.now()-t>e)return!1;const n=r.symbols[this._currentSymbolCursor];if(!n.uniqueSymbol?.show)continue;const i=this._computeCoordinates(n,s,o),l=n.uniqueSymbol;if(!l.show)continue;const{iconAllowOverlap:c,textAllowOverlap:h}=s;for(const e of i){if(!e.enabled)continue;const t=l.parts[e.partIndex];if(!t.show)continue;!(e.partIndex?h:c)&&this._doesCollide(e)&&(e.hard?l.show=!1:t.show=!1)}l.show&&this._insertColliders(l.parts,i,s)}}return!0}_insertColliders(e,t,r){const{iconIgnorePlacement:s,textIgnorePlacement:o}=r;for(const n of t){if(!n.enabled)continue;if(n.partIndex?o:s)continue;if(!e[n.partIndex].show)continue;const t=n.xScreen+n.dxScreen,r=n.yScreen+n.dyScreen,i=t+n.width,l=r+n.height,[c,h,a,d]=this._gridIndex.getCellSpan(t,r,i,l);for(let e=h;e<=d;e++)for(let t=c;t<=a;t++){this._gridIndex.cells[e][t].push(n)}}}_computeCoordinates(e,t,r){const{iconRotationAlignment:s,textRotationAlignment:o,iconTranslate:n,iconTranslateAnchor:i,textTranslate:l,textTranslateAnchor:c}=t,h=this._si,a=this._co,d=this._zoom,y=this._allNeededMatrices.get(e.tile),u=e.uniqueSymbol,x=e.colliders(r);let _=0;for(const f of x){const[e,t]=0===f.partIndex?n:l,r=0===f.partIndex?i:c,u=f.minLod<=d&&d<=f.maxLod;_+=u?0:1,f.enabled=u,f.xScreen=f.xTile*y[0]+f.yTile*y[3]+y[6],f.yScreen=f.xTile*y[1]+f.yTile*y[4]+y[7],0===r?(f.xScreen+=a*e-h*t,f.yScreen+=h*e+a*t):(f.xScreen+=e,f.yScreen+=t),1===(0===f.partIndex?s:o)?(f.dxScreen=f.dxPixels,f.dyScreen=f.dyPixels):(f.dxScreen=a*(f.dxPixels+f.width/2)-h*(f.dyPixels+f.height/2)-f.width/2,f.dyScreen=h*(f.dxPixels+f.width/2)+a*(f.dyPixels+f.height/2)-f.height/2)}return x.length>0&&_===x.length&&u&&(u.show=!1),x}_getProperties(e){const t=this._styleProps.get(e);if(t)return t;const r=this._styleRepository.getLayerStyleProperties?.(e,this._zoom);return this._styleProps.set(e,r),r}_doesCollide(e){const t=e.xScreen+e.dxScreen,r=e.yScreen+e.dyScreen,s=t+e.width,o=r+e.height,[n,i,l,c]=this._gridIndex.getCellSpan(t,r,s,o);for(let h=i;h<=c;h++)for(let i=n;i<=l;i++){const n=this._gridIndex.cells[h][i];for(const i of n){if(null!=i.labelId&&null!=e.labelId&&i.labelId===e.labelId)continue;const n=i.xScreen+i.dxScreen,l=i.yScreen+i.dyScreen,c=n+i.width,h=l+i.height;if(!(s<n||t>c||o<l||r>h))return!0}}return!1}}export{s as CollisionJob};