@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.54 kB
JavaScript
import{isSome as t,isNone as e}from"../../../../../core/maybe.js";import{HITTEST_RADIUS as i,ATTRIBUTE_DATA_GPGPU as s}from"../definitions.js";import{Effect as r}from"./Effect.js";import{PixelFormat as o,PixelType as n}from"../../../../webgl/enums.js";class c extends r{constructor(){super(...arguments),this.name=this.constructor.name,this.defines=["hittest"]}dispose(){t(this._fbo)&&this._fbo.dispose()}createOptions({pixelRatio:t},e,s=i){if(!e.length)return null;const r=e.shift(),o=r.x,n=r.y;return this._outstanding=r,{type:"hittest",distance:s*t,position:[o,n]}}bind(t){const{context:i,attributeView:r}=t;if(!r.size)return;const o=r.getBlock(s);if(e(o))return;const n=o.getFBO(i);i.setViewport(0,0,r.size,r.size),i.bindFramebuffer(n),i.setColorMask(!0,!0,!0,!0),i.setClearColor(0,0,0,0),i.clear(i.gl.COLOR_BUFFER_BIT|i.gl.DEPTH_BUFFER_BIT)}unbind(t){}draw(t){if(e(this._outstanding))return;const i=this._outstanding;this._outstanding=null,this._resolve(t,i.resolvers)}async _resolve(t,i){const{context:r,attributeView:c}=t,a=c.getBlock(s);if(e(a))return void i.forEach((t=>t.resolve([])));const d=a.getFBO(r),h=new Uint8Array(d.width*d.height*4);try{await d.readPixelsAsync(0,0,d.width,d.height,o.RGBA,n.UNSIGNED_BYTE,h)}catch(u){return void i.forEach((t=>t.resolve([])))}const l=[];for(let e=0;e<h.length;e+=4){const t=h[e],i=h[e+3];t&&l.push({id:e/4,directHits:i})}l.sort(((t,e)=>e.directHits===t.directHits?e.id-t.id:e.directHits-t.directHits));const f=l.map((t=>t.id));i.forEach((t=>t.resolve(f)))}}export{c as HittestEffect};