#![allow(dead_code)]
#[derive(Debug, Clone)]
pub struct GiIrradianceViewConfig {
pub exposure: f32,
pub enabled: bool,
pub show_probes: bool,
pub show_direct: bool,
}
impl Default for GiIrradianceViewConfig {
fn default() -> Self {
GiIrradianceViewConfig {
exposure: 1.0,
enabled: true,
show_probes: true,
show_direct: false,
}
}
}
pub fn new_gi_irradiance_view() -> GiIrradianceViewConfig {
GiIrradianceViewConfig::default()
}
pub fn giv_set_exposure(cfg: &mut GiIrradianceViewConfig, exposure: f32) {
cfg.exposure = exposure.max(0.0);
}
pub fn giv_set_enabled(cfg: &mut GiIrradianceViewConfig, enabled: bool) {
cfg.enabled = enabled;
}
pub fn giv_toggle_probes(cfg: &mut GiIrradianceViewConfig) {
cfg.show_probes = !cfg.show_probes;
}
pub fn giv_toggle_direct(cfg: &mut GiIrradianceViewConfig) {
cfg.show_direct = !cfg.show_direct;
}
pub fn giv_tonemap(irradiance: f32, exposure: f32) -> f32 {
let v = irradiance * exposure;
v / (1.0 + v)
}
pub fn giv_to_json(cfg: &GiIrradianceViewConfig) -> String {
format!(
r#"{{"exposure":{:.4},"enabled":{},"show_probes":{},"show_direct":{}}}"#,
cfg.exposure, cfg.enabled, cfg.show_probes, cfg.show_direct
)
}
pub fn giv_irradiance_to_color(irradiance: f32, exposure: f32) -> [f32; 3] {
let v = giv_tonemap(irradiance, exposure);
[v, v * 0.9, v * 0.8]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_enabled() {
let c = new_gi_irradiance_view();
assert!(c.enabled ,);
}
#[test]
fn test_set_exposure() {
let mut c = new_gi_irradiance_view();
giv_set_exposure(&mut c, 2.5);
assert!((c.exposure - 2.5).abs() < 1e-5, );
}
#[test]
fn test_set_exposure_negative_clamps() {
let mut c = new_gi_irradiance_view();
giv_set_exposure(&mut c, -1.0);
assert!((c.exposure).abs() < 1e-6, );
}
#[test]
fn test_set_enabled_false() {
let mut c = new_gi_irradiance_view();
giv_set_enabled(&mut c, false);
assert!(!c.enabled ,);
}
#[test]
fn test_toggle_probes() {
let mut c = new_gi_irradiance_view();
giv_toggle_probes(&mut c);
assert!(!c.show_probes ,);
}
#[test]
fn test_toggle_direct() {
let mut c = new_gi_irradiance_view();
giv_toggle_direct(&mut c);
assert!(c.show_direct ,);
}
#[test]
fn test_tonemap_zero_is_zero() {
let v = giv_tonemap(0.0, 1.0);
assert!((v).abs() < 1e-6 ,);
}
#[test]
fn test_tonemap_positive() {
let v = giv_tonemap(1.0, 1.0);
assert!(v > 0.0 && v < 1.0, );
}
#[test]
fn test_to_json_contains_exposure() {
let c = new_gi_irradiance_view();
let j = giv_to_json(&c);
assert!(j.contains("exposure") ,);
}
#[test]
fn test_irradiance_to_color_returns_three() {
let color = giv_irradiance_to_color(1.0, 1.0);
assert_eq!(color.len(), 3 ,);
}
}