UNPKG

@arcgis/core

Version:

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

57 lines (56 loc) 2.89 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.19/LICENSE.txt */ import{create as a}from"../../../../../../core/libs/gl-matrix-2/factories/vec3f64.js";import{Float3PassUniform as e}from"../../shaderModules/Float3PassUniform.js";import{glsl as i}from"../../shaderModules/glsl.js";import{NoParameters as t}from"../../../../../webgl/NoParameters.js";class o extends t{constructor(){super(...arguments),this.tileCameraPosition=a(),this.cameraDelta=a()}}function n(a){a.code.add(i`vec4 unpackColor(uvec4 packedGaussian) { vec4 color; color.r = float((packedGaussian.w >> 1u) & 0xfeu); color.g = float((packedGaussian.w >> 9u) & 0xffu); color.b = float((packedGaussian.w >> 16u) & 0xfeu); color.a = float((packedGaussian.w >> 24u) & 0xffu); return color / 255.0; }`),a.code.add(i`vec3 unpackScale(uvec4 packedGaussian) { uint sx = (packedGaussian.z >> 10u) & 0xffu; uint sy = (packedGaussian.z >> 18u) & 0xffu; uint szLow = (packedGaussian.z >> 26u) & 0x3fu; uint szHigh = packedGaussian.a & 0x3u; uint sz = szLow | (szHigh << 6u); return exp(vec3(sx, sy, sz) / 16.0 - 10.0); }`),a.code.add(i`const uint MASK_9_BITS = 0x1FFu; const float SQRT_HALF = 0.7071067811865476; const ivec3 COMPONENT_ORDER[4] = ivec3[4]( ivec3(3, 2, 1), ivec3(3, 2, 0), ivec3(3, 1, 0), ivec3(2, 1, 0) ); vec4 unpackQuaternion(uvec4 packedGaussian) { uint packedRotation = packedGaussian.x; uint largestComponent = packedRotation >> 30u; vec4 quaternion = vec4(0.0); float sumSquares = 0.0; uint bitfield = packedRotation; for (int j = 0; j < 3; ++j) { int index = COMPONENT_ORDER[int(largestComponent)][j]; uint magnitude = bitfield & MASK_9_BITS; uint signBit = (bitfield >> 9u) & 1u; bitfield = bitfield >> 10u; float value = SQRT_HALF * float(magnitude) / float(MASK_9_BITS); quaternion[index] = signBit == 1u ? -value : value; sumSquares += value * value; } quaternion[int(largestComponent)] = sqrt(1.0 - sumSquares); return quaternion; }`),a.code.add(i`vec3 unpackTileOriginRelativePosition(uvec4 packedGaussian) { uint packedPositionLow = packedGaussian.y; uint packedPositionHigh = packedGaussian.z; uint x = packedPositionLow & 0x3FFFu; uint y = (packedPositionLow >> 14u) & 0x3FFFu; uint zLow = (packedPositionLow >> 28u) & 0xFu; uint zHigh = packedPositionHigh & 0x3FFu; uint z = zLow | (zHigh << 4u); return vec3(float(x), float(y), float(z)); }`),a.uniforms.add(new e("tileCameraPosition",a=>a.tileCameraPosition),new e("cameraDelta",a=>a.cameraDelta)).code.add(i`vec3 unpackCameraRelativeGaussianPosition(uvec4 packedHeader, highp vec3 position) { vec3 tileOrigin = uintBitsToFloat(packedHeader.xyz); float invPosScale = 1.0 / exp2(float(packedHeader.w & 0xfu)); vec3 delta = tileOrigin.xyz - tileCameraPosition; vec3 cameraRelativePosition = position * invPosScale + delta * 2.048 - cameraDelta; return cameraRelativePosition; }`)}export{n as GaussianSplatUnpacking,o as GaussianSplatUnpackingPassParameters};