UNPKG

@expofp/floorplan

Version:

Interactive floor plan library for expos and events

2 lines (1 loc) 1.4 kB
import{reaction as P}from"mobx";import d from"../../core/Rect";import{getTrianglesFromFpPaths as y}from"../../data/svg";import{boothStore as b,layersStore as h}from"../../store";import{LayersMode as S}from"../../store/LayerStore";import T from"../../tools/logger";import{pointInTriangle as F}from"../../utils/geometry";let g=new Map,p=[],M=[],u=[],c=new Map,l;function I(){const r=b.booths.filter(t=>t.visible&&t.rect&&t.rect.w>0&&t.rect.h>0);if(g=new Map,p=[],u=[],l=null,c=new Map,!r.length)return;M=r.filter(t=>t.paths);let n=d.fromMultiple(r.map(t=>t.rect));for(const t of r){let o=t.rect;Math.abs(t.rotate)===90*Math.PI/180&&(o=o.getRotated90()),p.push(o),g.set(o,t)}const s=2,i=Math.ceil(n.w/s),e=Math.ceil(n.h/s);for(let t=0;t<s;t++)for(let o=0;o<s;o++){const f=n.x1+t*i,a=n.y1+o*e,m=d.fromXywh(f,a,i,e);u.push(m);const w=p.filter(v=>m.intersects(v));c.set(m,w)}T.log("hover segmentToRects",c)}P(()=>[b.booths,h.loaded,h.visible],()=>I());function R(r,n){let s;l&&l.containsPoint(r,n)?s=l:s=u.find(e=>e.containsPoint(r,n)),s&&(l=s);const i=c.get(s);if(i){const e=i.filter(t=>t.containsPoint(r,n));if(e.length){let t;e.length>1?t=e.sort((f,a)=>f.w-a.w)[0]:t=e[0];let o=g.get(t);return o.visible?o:null}}for(const e of M)for(const t of e.paths)for(const o of y(t.index,h.mode!==S.Default?e.layer.name:""))if(F(r,n,o))return e.visible?e:null;return null}export default function X(r,n){return R(r,n)}