@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.47 kB
JavaScript
import{isSome as e}from"../../../../core/maybe.js";import{createResolver as t,throwIfAborted as s,onAbortOrThrow as o}from"../../../../core/promiseUtils.js";import{TEXTURE_UPLOAD_MANAGER_BUDGET as r,TEXTURE_UPLOAD_MANAGER_CHUNK_SIZE as u}from"./definitions.js";import{ContextType as n}from"../../../webgl/context-util.js";class i{constructor(e,t){this._queue=[],this._context=e,this._refreshable=t}destroy(){this._queue=[]}enqueueTextureUpdate(e,r){const i=t(),h=e,a=u,c=Math.ceil(h.height/a);if(s(r),this._context.type===n.WEBGL1)this._queue.push({type:"no-chunk",request:e,resolver:i,options:r});else for(let t=0;t<c;t++){const s=t*a,o=t===c-1,u=o?h.height-a*t:a;this._queue.push({type:"chunk",request:e,resolver:i,chunk:t,chunkOffset:s,destHeight:u,chunkIsLast:o,options:r})}return o(r,(e=>i.reject(e))),i.promise}upload(){let t=0;for(;this._queue.length;){const s=performance.now(),o=this._queue.shift();if(o){if(e(o.options.signal)&&o.options.signal.aborted)continue;switch(o.type){case"chunk":this._uploadChunk(o);break;case"no-chunk":this._uploadNoChunk(o)}const u=performance.now()-s;if(t+=u,t+u>=r)break}}this._queue.length&&this._refreshable.requestRender()}_uploadChunk(t){const{request:s,resolver:o,chunkOffset:r,chunkIsLast:u,destHeight:n}=t,{data:i,texture:h,width:a}=s;e(i)&&(h.updateData(0,0,r,a,n,i,r),u&&o.resolve())}_uploadNoChunk(e){const{request:t,resolver:s}=e,{data:o,texture:r}=t;r.setData(o),s.resolve()}}export{i as TextureUploadManager};