UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

3 lines (2 loc) 2.56 kB
declare const _default: "\n#include \"gsplatPackingPS\"\n\n// manual texture declaration - uses custom UV, not splatUV\nuniform highp sampler2D chunkTexture;\n\n// work values\nvec4 chunkDataA; // x: min_x, y: min_y, z: min_z, w: max_x\nvec4 chunkDataB; // x: max_y, y: max_z, z: scale_min_x, w: scale_min_y\nvec4 chunkDataC; // x: scale_min_z, y: scale_max_x, z: scale_max_y, w: scale_max_z\nvec4 chunkDataD; // x: min_r, y: min_g, z: min_b, w: max_r\nvec4 chunkDataE; // x: max_g, y: max_b, z: unused, w: unused\nuvec4 packedData; // x: position bits, y: rotation bits, z: scale bits, w: color bits\n\nvec3 unpack111011(uint bits) {\n return vec3(\n float(bits >> 21u) / 2047.0,\n float((bits >> 11u) & 0x3ffu) / 1023.0,\n float(bits & 0x7ffu) / 2047.0\n );\n}\n\nconst float norm = sqrt(2.0);\n\nvec4 unpackRotation(uint bits) {\n float a = (float((bits >> 20u) & 0x3ffu) / 1023.0 - 0.5) * norm;\n float b = (float((bits >> 10u) & 0x3ffu) / 1023.0 - 0.5) * norm;\n float c = (float(bits & 0x3ffu) / 1023.0 - 0.5) * norm;\n float m = sqrt(1.0 - (a * a + b * b + c * c));\n\n uint mode = bits >> 30u;\n if (mode == 0u) return vec4(m, a, b, c);\n if (mode == 1u) return vec4(a, m, b, c);\n if (mode == 2u) return vec4(a, b, m, c);\n return vec4(a, b, c, m);\n}\n\n// read center\nvec3 getCenter() {\n uint w = uint(textureSize(chunkTexture, 0).x) / 5u;\n uint chunkId = splat.index / 256u;\n ivec2 chunkUV = ivec2((chunkId % w) * 5u, chunkId / w);\n\n // read chunk data with custom UV (manual texture access)\n chunkDataA = texelFetch(chunkTexture, chunkUV, 0);\n chunkDataB = texelFetch(chunkTexture, chunkUV + ivec2(1, 0), 0);\n chunkDataC = texelFetch(chunkTexture, chunkUV + ivec2(2, 0), 0);\n chunkDataD = texelFetch(chunkTexture, chunkUV + ivec2(3, 0), 0);\n chunkDataE = texelFetch(chunkTexture, chunkUV + ivec2(4, 0), 0);\n\n // read packed data using generated load function (uses global splat.uv)\n packedData = loadPackedTexture();\n\n return mix(chunkDataA.xyz, vec3(chunkDataA.w, chunkDataB.xy), unpack111011(packedData.x));\n}\n\nvec4 getColor() {\n vec4 r = unpack8888(packedData.w);\n return vec4(mix(chunkDataD.xyz, vec3(chunkDataD.w, chunkDataE.xy), r.rgb), r.w);\n}\n\nvec4 getRotation() {\n return unpackRotation(packedData.y);\n}\n\nvec3 getScale() {\n return exp(mix(vec3(chunkDataB.zw, chunkDataC.x), chunkDataC.yzw, unpack111011(packedData.z)));\n}\n\n#include \"gsplatCompressedSHVS\"\n"; export default _default;