Files
2026-05-07 21:38:27 +03:00

56 lines
1.3 KiB
GLSL

#if !defined PACKING_FILE_INCLUDED
#define PACKING_FILE_INCLUDED
// Structs
struct vec6 {
vec3 a;
vec3 b;
};
// the packing / unpacking assumes normalized floats
float pack2x16(float a, float b) {
a = clamp(a, 0.0, 0.99);
b = clamp(b, 0.0, 0.99);
uint low = uint(a * 65535.0);
uint high = uint(b * 65535.0);
return (low | (high << 16)) / 4294967295.0;
}
vec3 pack2x16(vec3 a, vec3 b) {
a = clamp(a, 0.0, 0.99);
b = clamp(b, 0.0, 0.99);
uvec3 low = uvec3(a * 65535.0);
uvec3 high = uvec3(b * 65535.0);
return (low | (high << 16)) / 4294967295.0;
}
vec2 unpack2x16(float val) {
uint temp = uint(val * 4294967295.0);
return vec2(float(temp & 65535u), (temp >> 16u)) / 65535.0;
}
vec6 unpack2x16(vec3 val) {
uvec3 temp = uvec3(val * 4294967295.0);
return vec6(vec3(temp & 65535u) / 65535.0, (temp >> 16u) / 65535.0);
}
struct vec8 {
vec4 a;
vec4 b;
};
vec4 pack2x16(vec4 a, vec4 b) {
a = clamp(a, 0.0, 0.99);
b = clamp(b, 0.0, 0.99);
uvec4 low = uvec4(a * 65535.0);
uvec4 high = uvec4(b * 65535.0);
return (low | (high << 16)) / 4294967295.0;
}
vec8 unpack2x16(vec4 val) {
uvec4 temp = uvec4(val * 4294967295.0);
return vec8(vec4(temp & 65535u) / 65535.0, (temp >> 16u) / 65535.0);
}
#endif