UNPKG

@arcgis/core

Version:

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

12 lines (11 loc) 2.04 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{generateUID as e}from"../../../../../core/uid.js";import{TextureBufferNaNSupportConfiguration as t,unpackFloat4x8 as o,unpackHalf2x8 as d,glslType as n,glslDecodeField as i}from"./TextureBackedBufferFields.glsl.js";import{glsl as r}from"../shaderModules/glsl.js";import{assert as a}from"../../lib/Util.js";const c=new t(!0),s=new t(!1);class u{constructor(t){this.moduleId=e(),this.namespace=`_tbb_${this.moduleId}_`;const{itemIndexAttribute:o,bufferUniform:d,layout:n}=t,i=t.fieldFilter??(()=>!0),r=t.enableNaNSupport?c:s;this.TextureBackedBufferModule=(e,t)=>f(this.namespace,e,t,o,d,n,i,r),this.getTextureAttribute=l(this.namespace)}}function f(e,t,c,s,u,f,l,h){const{vertex:$}=t;$.include(o,h),$.include(d,h);const x=`${e}tbbStride`,p=`${e}TextureBackedBufferItemData`,g=`${e}fetchTextureBackedBufferItemData`,b=m(e);for(const o of[x,p,g,b])a(o.length<1024,"Identifiers do not have a valid length");$.constants.add(x,"uint",f.texelStride),$.uniforms.add(u);const I=new Array;for(const o of f.fields.values())l(o.name,c)&&I.push(o);if(0===I.length)return;const B=[];for(let o=0;o<f.texelStride;++o)B.push(!1);for(const o of I)for(let e=0;e<o.numTexels;++e)B[o.startTexel+e]=!0;$.code.add(r` struct ${p} {`);for(const o of I)$.code.add(r`\t${n(o)} ${o.name};`);$.code.add(r`};`),$.code.add(r` ${p} ${g}(highp uint itemIndex) { ${p} itemData; highp uint index = itemIndex * ${x}; highp uint rowWidth = uint(textureSize(${u.name}, 0).x); int coordX = int(index % rowWidth); int coordY = int(index / rowWidth); `);for(let o=0;o<B.length;++o)!1!==B[o]&&$.code.add(r`lowp uvec4 texel${r.int(o)} = texelFetch(${u.name}, ivec2(coordX + ${r.int(o)}, coordY), 0);`);for(const o of I)$.code.add(r`itemData.${o.name} = ${i(o)};`);$.code.add(r`return itemData; }`),$.code.add(r`${p} ${b};`),$.main.add(r`${b} = ${g}(${s});`)}function l(e){const t=m(e);return e=>r`${t}.${e}`}function m(e){return`${e}ItemData`}export{u as TextureBackedBufferModule};