playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
88 lines (87 loc) • 2.37 kB
JavaScript
var uncompressedSH_default = `
#if SH_BANDS > 0
fn unpack111011s(bits: u32) -> vec3f {
return (vec3f((vec3<u32>(bits) >> vec3<u32>(21u, 11u, 0u)) & vec3<u32>(0x7ffu, 0x3ffu, 0x7ffu)) / vec3f(2047.0, 1023.0, 2047.0)) * 2.0 - 1.0;
}
struct ScaleAndSH {
scale: f32,
a: vec3f,
b: vec3f,
c: vec3f
};
fn fetchScale(t_in: vec4<u32>) -> ScaleAndSH {
var result: ScaleAndSH;
result.scale = bitcast<f32>(t_in.x);
result.a = unpack111011s(t_in.y);
result.b = unpack111011s(t_in.z);
result.c = unpack111011s(t_in.w);
return result;
}
struct SH {
a: vec3f,
b: vec3f,
c: vec3f,
d: vec3f
};
fn fetch4(t_in: vec4<u32>) -> SH {
var result: SH;
result.a = unpack111011s(t_in.x);
result.b = unpack111011s(t_in.y);
result.c = unpack111011s(t_in.z);
result.d = unpack111011s(t_in.w);
return result;
}
fn fetch1(t_in: u32) -> vec3f {
return unpack111011s(t_in);
}
#if SH_BANDS == 1
fn readSHData(sh: ptr<function, array<half3, 3>>, scale: ptr<function, f32>) {
let result = fetchScale(loadSplatSH_1to3());
*scale = result.scale;
sh[0] = half3(result.a);
sh[1] = half3(result.b);
sh[2] = half3(result.c);
}
#elif SH_BANDS == 2
fn readSHData(sh: ptr<function, array<half3, 8>>, scale: ptr<function, f32>) {
let first: ScaleAndSH = fetchScale(loadSplatSH_1to3());
*scale = first.scale;
sh[0] = half3(first.a);
sh[1] = half3(first.b);
sh[2] = half3(first.c);
let second: SH = fetch4(loadSplatSH_4to7());
sh[3] = half3(second.a);
sh[4] = half3(second.b);
sh[5] = half3(second.c);
sh[6] = half3(second.d);
sh[7] = half3(fetch1(loadSplatSH_8to11().x));
}
#else
fn readSHData(sh: ptr<function, array<half3, 15>>, scale: ptr<function, f32>) {
let first: ScaleAndSH = fetchScale(loadSplatSH_1to3());
*scale = first.scale;
sh[0] = half3(first.a);
sh[1] = half3(first.b);
sh[2] = half3(first.c);
let second: SH = fetch4(loadSplatSH_4to7());
sh[3] = half3(second.a);
sh[4] = half3(second.b);
sh[5] = half3(second.c);
sh[6] = half3(second.d);
let third: SH = fetch4(loadSplatSH_8to11());
sh[7] = half3(third.a);
sh[8] = half3(third.b);
sh[9] = half3(third.c);
sh[10] = half3(third.d);
let fourth: SH = fetch4(loadSplatSH_12to15());
sh[11] = half3(fourth.a);
sh[12] = half3(fourth.b);
sh[13] = half3(fourth.c);
sh[14] = half3(fourth.d);
}
#endif
#endif
`;
export {
uncompressedSH_default as default
};