@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.22 kB
JavaScript
import{throwIfAborted as t}from"../../../../../core/promiseUtils.js";import{timeExtentsEqual as a,setUniforms as e}from"../utils.js";import{BufferObject as r}from"../../../../webgl/BufferObject.js";import{DataType as s,BlendFactor as i,PrimitiveType as o,Usage as n,PixelFormat as m,TextureSamplingMode as l,PixelType as p,TextureWrapMode as c}from"../../../../webgl/enums.js";import{Texture as h}from"../../../../webgl/Texture.js";import{VertexArrayObject as _}from"../../../../webgl/VertexArrayObject.js";import{VertexElementDescriptor as f}from"../../../../webgl/VertexElementDescriptor.js";class d{constructor(t){this._params=t,this.animated=!1}isCompatible(t){if(!(t instanceof d))return!1;if(!a(this._params.timeExtent,t._params.timeExtent))return!1;let e=!0;return e=e&&this._params.loadImagery===t._params.loadImagery,e=e&&this._params.color.kind===t._params.color.kind,e=e&&this._params.opacity.kind===t._params.opacity.kind,e}async load(a,e){const{extent:r,size:s}=a;t(e);const i=await this._params.loadImagery(r,s[0],s[1],this._params.timeExtent,e);return new y(i,{color:this._params.color,opacity:this._params.opacity})}render(t,a,r){const{context:s}=t,{program:n}=r;s.setFaceCullingEnabled(!1),s.setBlendingEnabled(!0),s.setBlendFunction(i.ONE,i.ONE_MINUS_SRC_ALPHA),s.useProgram(n),n.setUniformMatrix3fv("u_dvsMat3",a.dvsMat3),s.bindTexture(r.texture,0),n.setUniform1i("u_texture",0),n.setUniform1f("u_Min",r.min),n.setUniform1f("u_Max",r.max),e(n,"color","vec4",this._params.color),e(n,"opacity","float",this._params.opacity),s.bindVAO(r.vertexArray),s.drawArrays(o.TRIANGLE_STRIP,0,4)}}const u=new Map;u.set("a_position",0),u.set("a_texcoord",1);const w={geometry:[new f("a_position",2,s.UNSIGNED_SHORT,0,8),new f("a_texcoord",2,s.UNSIGNED_SHORT,4,8)]},x={vsPath:"raster/flow/imagery",fsPath:"raster/flow/imagery",attributes:u};class y{constructor(t,a){this._flowData=t,this._values=a}attach(t){const{context:a}=t,{width:e,height:s}=this._flowData,i=r.createVertex(a,n.STATIC_DRAW,new Uint16Array([0,0,0,1,e,0,1,1,0,s,0,0,e,s,1,0])),o=new _(a,u,w,{geometry:i}),f=[];"ramp"===this._values.color.kind&&f.push("vvColor"),"ramp"===this._values.opacity.kind&&f.push("vvOpacity");const d=t.painter.materialManager.getProgram(x,f);let y=1e6,g=-1e6;for(let r=0;r<s;r++)for(let t=0;t<e;t++)if(0!==this._flowData.mask[r*e+t]){const a=this._flowData.data[2*(r*e+t)+0],s=this._flowData.data[2*(r*e+t)+1],i=Math.sqrt(a*a+s*s);y=Math.min(y,i),g=Math.max(g,i)}const A=new Uint8Array(4*e*s);for(let r=0;r<s;r++)for(let t=0;t<e;t++)if(0!==this._flowData.mask[r*e+t]){const a=this._flowData.data[2*(r*e+t)+0],s=this._flowData.data[2*(r*e+t)+1],i=(Math.sqrt(a*a+s*s)-y)/(g-y);A[4*(r*e+t)+0]=255*i,A[4*(r*e+t)+1]=0,A[4*(r*e+t)+2]=0,A[4*(r*e+t)+3]=255}else A[4*(r*e+t)+0]=0,A[4*(r*e+t)+1]=0,A[4*(r*e+t)+2]=0,A[4*(r*e+t)+3]=0;const E=new h(a,{pixelFormat:m.RGBA,internalFormat:m.RGBA,samplingMode:l.LINEAR,dataType:p.UNSIGNED_BYTE,wrapMode:c.CLAMP_TO_EDGE,flipped:!0,width:e,height:s},A);this.vertexArray=o,this.program=d,this.texture=E,this.min=y,this.max=g,this._flowData=null}detach(){this.vertexArray.dispose(),this.texture.dispose()}get ready(){return this.program.compiled}}export{d as Imagery,y as ImageryResources};