UNPKG

playcanvas

Version:

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

3 lines (2 loc) 1.87 kB
declare const _default: "\n// Required call order: getCenter() first, then getOpacity() for early culling (no extra loads),\n// then getColor() (returns RGB only). getRotation(), getScale() can follow in any order.\nuvec4 cachedTransformA;\n\nvec3 getCenter() {\n cachedTransformA = loadDataTransformA();\n return vec3(uintBitsToFloat(cachedTransformA.r), uintBitsToFloat(cachedTransformA.g), uintBitsToFloat(cachedTransformA.b));\n}\n\nfloat getOpacity() {\n return float(cachedTransformA.a >> 24u) / 255.0;\n}\n\nvec3 getColor() {\n uint data = loadDataColor().x;\n float r = float(data & 0x7FFu) * (4.0 / 2047.0);\n float g = float((data >> 11u) & 0x7FFu) * (4.0 / 2047.0);\n float b = float((data >> 22u) & 0x3FFu) * (4.0 / 1023.0);\n return vec3(r, g, b);\n}\n\nvec4 getRotation() {\n uint data = loadDataTransformB().x;\n\n // dequantize half-angle projected quaternion: 11+11+10 bits to [-1, 1]\n vec3 p = vec3(\n float(data & 0x7FFu) / 2047.0 * 2.0 - 1.0,\n float((data >> 11u) & 0x7FFu) / 2047.0 * 2.0 - 1.0,\n float((data >> 22u) & 0x3FFu) / 1023.0 * 2.0 - 1.0\n );\n\n // inverse half-angle transform, returns (w, x, y, z) format\n float d = dot(p, p);\n return vec4(1.0 - d, sqrt(max(0.0, 2.0 - d)) * p);\n}\n\nvec3 getScale() {\n uint data = cachedTransformA.a;\n float sx = float(data & 0xFFu);\n float sy = float((data >> 8u) & 0xFFu);\n float sz = float((data >> 16u) & 0xFFu);\n\n // decode log-encoded scale: 0 = true zero, 1-255 maps linearly in log-space to e^-12..e^9\n const float logRange = 21.0 / 255.0;\n const float logMin = -12.0;\n return vec3(\n sx == 0.0 ? 0.0 : exp(sx * logRange + logMin),\n sy == 0.0 ? 0.0 : exp(sy * logRange + logMin),\n sz == 0.0 ? 0.0 : exp(sz * logRange + logMin)\n );\n}\n"; export default _default;