UNPKG

@arcgis/core

Version:

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

29 lines (28 loc) 3.53 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */ import{__decorate as t}from"tslib";import{hasNativeFloat16Array as n}from"../../../../../geometry/support/float16.js";import{FloatBindUniform as e}from"../shaderModules/FloatBindUniform.js";import{glsl as o,If as i}from"../shaderModules/glsl.js";import{ShaderTechniqueConfiguration as u,parameter as s}from"../shaderTechnique/ShaderTechniqueConfiguration.js";function a(t){switch(t.elementType){case"float":switch(t.elementCount){case 1:return o`float`;case 2:return o`vec2`;case 3:return o`vec3`;case 4:return o`vec4`;case 9:return o`mat3`;default:t.elementCount}break;case"int":switch(t.elementCount){case 1:return o`int`;case 2:return o`ivec2`;case 3:return o`ivec3`;case 4:return o`ivec4`;case 9:throw new Error("Invalid element count 9 for type int");default:t.elementCount}break;case"uint":switch(t.elementCount){case 1:return o`uint`;case 2:return o`uvec2`;case 3:return o`uvec3`;case 4:return o`uvec4`;case 9:throw new Error("Invalid element count 9 for type uint");default:t.elementCount}break;default:t.elementType}throw new Error("unsupported field")}const r=new e("const_NaN",()=>NaN,{supportsNaN:!0});class c extends u{constructor(t){super(),this.supportNaN=t}}function p(t,n){const e=n?.supportNaN;e&&(t.uniforms.add(r),t.code.add(o`bool bitsEncodeFloat16NaN(highp uint bits) { const highp uint nanExponent = 0x00007c00u; highp uint exponent = bits & nanExponent; highp uint mantissa = bits & 0x000003ffu; return exponent == nanExponent && mantissa != 0u; }`)),t.code.add(o` mediump float unpackHalf2x8(highp uint bits0, highp uint bits1) { highp uint halfBits = (bits1 << 8u) | bits0; ${i(e,o` if (bitsEncodeFloat16NaN(halfBits)) { return const_NaN; }`)} return unpackHalf2x16(halfBits).x; }`)}function l(t,n){const e=n?.supportNaN;e&&(t.uniforms.add(r),t.code.add(o`bool bitsEncodeFloat32NaN(highp uint bits) { const highp uint nanExponent = 0x7f800000u; highp uint exponent = bits & nanExponent; highp uint mantissa = bits & 0x007fffffu; return exponent == nanExponent && mantissa != 0u; }`)),t.code.add(o` highp float unpackFloat4x8(highp uint bits0, highp uint bits1, highp uint bits2, highp uint bits3) { highp uint floatBits = (bits3 << 24u) |(bits2 << 16u) | (bits1 << 8u) | bits0; ${i(e,o` if (bitsEncodeFloat32NaN(floatBits)) { return const_NaN; }`)} return uintBitsToFloat(floatBits); }`)}function h(t){const{fieldType:n}=t;return`${(0,f[n])(d(t))}`}t([s()],c.prototype,"supportNaN",void 0);const f={u8:t=>o`${t[0]}`,unorm8:t=>o`float(${t[0]})/255.0`,vec4unorm8:t=>o`vec4(${`${t[0]}, ${t[1]}, ${t[2]}, ${t[3]}`})/255.0`,f16:n?t=>o`unpackHalf2x8(${`${t[0]}, ${t[1]}`})`:t=>o`unpackFloat4x8(${`${t[0]}, ${t[1]}, ${t[2]}, ${t[3]}`})`,f32:t=>o`unpackFloat4x8(${`${t[0]}, ${t[1]}, ${t[2]}, ${t[3]}`})`,vec4u8:t=>o`uvec4(${`${t[0]}, ${t[1]}, ${t[2]}, ${t[3]}`})`,mat3f32:t=>{const n=t.reduce((t,n)=>{const e=t.at(-1);return null==e||e.length>=4?t.push([n]):e.push(n),t},new Array).map(t=>o`unpackFloat4x8(${`${t[0]}, ${t[1]}, ${t[2]}, ${t[3]}`})`);return o`mat3(${n.join(",\n")})`}};function d(t){const{startTexel:n,byteOffset:e,texelByteStride:i,byteSize:u}=t;let s=n,a=e%i;const r=new Array;for(let c=0;c<u;++c){const t=o`texel${o.int(s)}.${m[a]}`;r.push(t),++a,a>=i&&(a=0,++s)}return r}const m=["x","y","z","w"];export{c as TextureBufferNaNSupportConfiguration,h as glslDecodeField,a as glslType,l as unpackFloat4x8,p as unpackHalf2x8};