UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

3 lines (2 loc) 1.84 kB
declare const _default: "\nuniform highp usampler2D packedTexture;\n\nuniform vec3 means_mins;\nuniform vec3 means_maxs;\n\nuniform vec3 scales_mins;\nuniform vec3 scales_maxs;\n\nvec4 unpackU32(uint v) {\n return vec4(\n float((v >> 24u) & 0xFFu) / 255.0,\n float((v >> 16u) & 0xFFu) / 255.0,\n float((v >> 8u) & 0xFFu) / 255.0,\n float(v & 0xFFu) / 255.0\n );\n}\n\nuvec4 packedSample;\n\n// read the model-space center of the gaussian\nvec3 readCenter(SplatSource source) {\n\n // read the packed texture sample\n packedSample = texelFetch(packedTexture, source.uv, 0);\n\n vec3 l = unpackU32(packedSample.x).xyz;\n vec3 u = unpackU32(packedSample.y).xyz;\n vec3 n = (l * 255.0 + u * 255.0 * 256.0) / 65535.0;\n vec3 v = mix(means_mins, means_maxs, n);\n\n return sign(v) * (exp(abs(v)) - 1.0);\n}\n\nconst float norm = 2.0 / sqrt(2.0);\n\n// sample covariance vectors\nvoid readCovariance(in SplatSource source, out vec3 covA, out vec3 covB) {\n vec4 qdata = unpackU32(packedSample.z);\n vec3 sdata = unpackU32(packedSample.w).xyz;\n\n vec3 abc = (qdata.xyz - 0.5) * norm;\n float d = sqrt(max(0.0, 1.0 - dot(abc, abc)));\n\n uint mode = uint(qdata.w * 255.0 + 0.5) - 252u;\n\n vec4 quat = (mode == 0u) ? vec4(d, abc) :\n ((mode == 1u) ? vec4(abc.x, d, abc.yz) :\n ((mode == 2u) ? vec4(abc.xy, d, abc.z) : vec4(abc, d)));\n\n mat3 rot = quatToMat3(quat);\n vec3 scale = exp(mix(scales_mins, scales_maxs, sdata));\n\n // M = S * R\n mat3 M = transpose(mat3(\n scale.x * rot[0],\n scale.y * rot[1],\n scale.z * rot[2]\n ));\n\n covA = vec3(dot(M[0], M[0]), dot(M[0], M[1]), dot(M[0], M[2]));\n covB = vec3(dot(M[1], M[1]), dot(M[1], M[2]), dot(M[2], M[2]));\n}\n"; export default _default;