#![allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum NormalEncoding {
Rgb,
RgDerived,
Spheremap,
}
#[derive(Debug, Clone)]
pub struct NormalEncodingViewConfig {
pub encoding: NormalEncoding,
pub flip_y: bool,
}
impl Default for NormalEncodingViewConfig {
fn default() -> Self {
Self { encoding: NormalEncoding::Rgb, flip_y: false }
}
}
#[derive(Debug, Clone)]
pub struct NormalEncodingView {
pub config: NormalEncodingViewConfig,
pub enabled: bool,
}
impl Default for NormalEncodingView {
fn default() -> Self {
Self { config: NormalEncodingViewConfig::default(), enabled: false }
}
}
pub fn nev_enable(view: &mut NormalEncodingView) {
view.enabled = true;
}
pub fn nev_disable(view: &mut NormalEncodingView) {
view.enabled = false;
}
pub fn nev_decode_rgb(r: f32, g: f32, b: f32) -> [f32; 3] {
[r * 2.0 - 1.0, g * 2.0 - 1.0, b * 2.0 - 1.0]
}
pub fn nev_encode_to_color(nx: f32, ny: f32, nz: f32) -> [f32; 4] {
[nx * 0.5 + 0.5, ny * 0.5 + 0.5, nz * 0.5 + 0.5, 1.0]
}
pub fn nev_set_encoding(view: &mut NormalEncodingView, enc: NormalEncoding) {
view.config.encoding = enc;
}
pub fn nev_to_json(view: &NormalEncodingView) -> String {
let enc = match view.config.encoding {
NormalEncoding::Rgb => "rgb",
NormalEncoding::RgDerived => "rg_derived",
NormalEncoding::Spheremap => "spheremap",
};
format!(r#"{{"encoding":"{}","flip_y":{},"enabled":{}}}"#, enc, view.config.flip_y, view.enabled)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_disabled() {
let v = NormalEncodingView::default();
assert!(!v.enabled);
}
#[test]
fn test_enable_disable() {
let mut v = NormalEncodingView::default();
nev_enable(&mut v);
assert!(v.enabled);
nev_disable(&mut v);
assert!(!v.enabled);
}
#[test]
fn test_decode_rgb_neutral() {
let n = nev_decode_rgb(0.5, 0.5, 1.0);
assert!(n[0].abs() < 1e-5);
assert!(n[1].abs() < 1e-5);
assert!((n[2] - 1.0).abs() < 1e-5);
}
#[test]
fn test_encode_to_color_neutral() {
let c = nev_encode_to_color(0.0, 0.0, 1.0);
assert!((c[0] - 0.5).abs() < 1e-6);
assert!((c[1] - 0.5).abs() < 1e-6);
assert!((c[2] - 1.0).abs() < 1e-6);
}
#[test]
fn test_encode_alpha_one() {
let c = nev_encode_to_color(0.0, 1.0, 0.0);
assert!((c[3] - 1.0).abs() < 1e-6);
}
#[test]
fn test_set_encoding() {
let mut v = NormalEncodingView::default();
nev_set_encoding(&mut v, NormalEncoding::Spheremap);
assert_eq!(v.config.encoding, NormalEncoding::Spheremap);
}
#[test]
fn test_roundtrip() {
let r = 0.6_f32;
let g = 0.4_f32;
let b = 0.8_f32;
let n = nev_decode_rgb(r, g, b);
let c = nev_encode_to_color(n[0], n[1], n[2]);
assert!((c[0] - r).abs() < 1e-5);
assert!((c[1] - g).abs() < 1e-5);
assert!((c[2] - b).abs() < 1e-5);
}
#[test]
fn test_to_json_encoding() {
let v = NormalEncodingView::default();
let json = nev_to_json(&v);
assert!(json.contains("rgb"));
}
#[test]
fn test_default_encoding() {
let v = NormalEncodingView::default();
assert_eq!(v.config.encoding, NormalEncoding::Rgb);
}
}