Clean up oct32norm code a bit.

This commit is contained in:
Nathan Vegdahl 2020-09-20 10:37:26 +09:00
parent 3eff608493
commit 161e47fc44

View File

@ -10,21 +10,19 @@
/// matters to the encoding process, not the length. /// matters to the encoding process, not the length.
#[inline] #[inline]
pub fn encode(vec: (f32, f32, f32)) -> u32 { pub fn encode(vec: (f32, f32, f32)) -> u32 {
let inv_l1_norm = 1.0f32 / (vec.0.abs() + vec.1.abs() + vec.2.abs()); let l1_norm = vec.0.abs() + vec.1.abs() + vec.2.abs();
let v0_norm = vec.0 / l1_norm;
let v1_norm = vec.1 / l1_norm;
let (u, v) = if vec.2 < 0.0 { let (u, v) = if vec.2 < 0.0 {
( (
u32::from(to_snorm_16( u32::from(to_snorm_16((1.0 - v1_norm.abs()) * sign(vec.0))),
(1.0 - (vec.1 * inv_l1_norm).abs()) * sign(vec.0), u32::from(to_snorm_16((1.0 - v0_norm.abs()) * sign(vec.1))),
)),
u32::from(to_snorm_16(
(1.0 - (vec.0 * inv_l1_norm).abs()) * sign(vec.1),
)),
) )
} else { } else {
( (
u32::from(to_snorm_16(vec.0 * inv_l1_norm)), u32::from(to_snorm_16(v0_norm)),
u32::from(to_snorm_16(vec.1 * inv_l1_norm)), u32::from(to_snorm_16(v1_norm)),
) )
}; };
@ -52,15 +50,12 @@ pub fn decode(n: u32) -> (f32, f32, f32) {
#[inline(always)] #[inline(always)]
fn to_snorm_16(n: f32) -> u16 { fn to_snorm_16(n: f32) -> u16 {
(n.max(-1.0).min(1.0) * ((1u32 << (16 - 1)) - 1) as f32).round() as i16 as u16 (n * ((1u32 << (16 - 1)) - 1) as f32).round() as i16 as u16
} }
#[inline(always)] #[inline(always)]
fn from_snorm_16(n: u16) -> f32 { fn from_snorm_16(n: u16) -> f32 {
f32::from(n as i16) f32::from(n as i16) * (1.0f32 / ((1u32 << (16 - 1)) - 1) as f32)
* (1.0f32 / ((1u32 << (16 - 1)) - 1) as f32)
.max(-1.0)
.min(1.0)
} }
#[inline(always)] #[inline(always)]