diff options
author | Yann Herklotz <git@yannherklotz.com> | 2020-04-30 02:04:41 +0100 |
---|---|---|
committer | Yann Herklotz <git@yannherklotz.com> | 2020-04-30 02:04:41 +0100 |
commit | cd63b41fd6fe7586a099364d21b69199f8361031 (patch) | |
tree | 6b3b33076a5b07745f124bbdb85fe3bf39b8e259 | |
parent | 9087362822ef3462743f2c8c6e464cbdffb1a0a2 (diff) | |
download | leela-cd63b41fd6fe7586a099364d21b69199f8361031.tar.gz leela-cd63b41fd6fe7586a099364d21b69199f8361031.zip |
Create utils instead
-rw-r--r-- | src/colour.rs | 15 | ||||
-rw-r--r-- | src/random.rs | 28 | ||||
-rw-r--r-- | src/utils.rs | 68 |
3 files changed, 68 insertions, 43 deletions
diff --git a/src/colour.rs b/src/colour.rs deleted file mode 100644 index 0d5e705..0000000 --- a/src/colour.rs +++ /dev/null @@ -1,15 +0,0 @@ -use cgmath::Vector3; - -pub fn clamp(x: f64, min: f64, max: f64) -> f64 { - if x < min { min } - else if x > max { max } - else { x } -} - -pub fn print_colour(colour: &Vector3<f64>, samples: i32) { - let scolour = colour.map(|x| (x / samples as f64).sqrt()); - println!("{} {} {}" - , (256.0 * clamp(scolour.x, 0.0, 0.999)) as i32 - , (256.0 * clamp(scolour.y, 0.0, 0.999)) as i32 - , (256.0 * clamp(scolour.z, 0.0, 0.999)) as i32) -} diff --git a/src/random.rs b/src/random.rs deleted file mode 100644 index 66c637a..0000000 --- a/src/random.rs +++ /dev/null @@ -1,28 +0,0 @@ -use cgmath::prelude::*; -use cgmath::{Vector3, vec3, dot}; -use rand::prelude::*; -use std::f64::consts::PI; - -pub fn random_vector3(rng: &mut ThreadRng, min: f64, max: f64) -> Vector3<f64> { - vec3(rng.gen_range(min, max), rng.gen_range(min, max), rng.gen_range(min, max)) -} - -pub fn random_in_unit_sphere(rng: &mut ThreadRng) -> Vector3<f64> { - loop { - let p = random_vector3(rng, -1.0, 1.0); - if p.magnitude2() <= 1.0 { return p } - } -} - -pub fn random_unit_vector(rng: &mut ThreadRng) -> Vector3<f64> { - let a = rng.gen_range(0.0, 2.0*PI); - let z = rng.gen_range(-1.0, 1.0); - let r = ((1.0 - z*z) as f64).sqrt(); - vec3(r*a.cos(), r*a.sin(), z) -} - -pub fn random_in_hemisphere(rng: &mut ThreadRng, normal: &Vector3<f64>) -> Vector3<f64> { - let in_unit_sphere = random_in_unit_sphere(rng); - if dot(in_unit_sphere, *normal) > 0.0 { in_unit_sphere } - else { -in_unit_sphere } -} diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..659de7d --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,68 @@ +use cgmath::prelude::*; +use cgmath::{Vector3, vec3, dot}; +use rand::prelude::*; +use std::f64::consts::PI; + +pub fn clamp(x: f64, min: f64, max: f64) -> f64 { + if x < min { min } + else if x > max { max } + else { x } +} + +pub fn print_colour(colour: &Vector3<f64>, samples: i32) { + let scolour = colour.map(|x| (x / samples as f64).sqrt()); + println!("{} {} {}" + , (256.0 * clamp(scolour.x, 0.0, 0.999)) as i32 + , (256.0 * clamp(scolour.y, 0.0, 0.999)) as i32 + , (256.0 * clamp(scolour.z, 0.0, 0.999)) as i32) +} + +pub fn random_vector3(rng: &mut ThreadRng, min: f64, max: f64) -> Vector3<f64> { + vec3(rng.gen_range(min, max), rng.gen_range(min, max), rng.gen_range(min, max)) +} + +pub fn random_in_unit_sphere(rng: &mut ThreadRng) -> Vector3<f64> { + loop { + let p = random_vector3(rng, -1.0, 1.0); + if p.magnitude2() <= 1.0 { return p } + } +} + +pub fn random_unit_vector(rng: &mut ThreadRng) -> Vector3<f64> { + let a = rng.gen_range(0.0, 2.0*PI); + let z = rng.gen_range(-1.0, 1.0); + let r = ((1.0 - z*z) as f64).sqrt(); + vec3(r*a.cos(), r*a.sin(), z) +} + +pub fn random_in_hemisphere(rng: &mut ThreadRng, normal: &Vector3<f64>) -> Vector3<f64> { + let in_unit_sphere = random_in_unit_sphere(rng); + if dot(in_unit_sphere, *normal) > 0.0 { in_unit_sphere } + else { -in_unit_sphere } +} + +pub fn random_in_unit_disk(rng: &mut ThreadRng) -> Vector3<f64> { + loop { + let p = vec3(rng.gen_range(-1.0, 1.0), rng.gen_range(-1.0, 1.0), 0.0); + if p.magnitude2() < 1.0 { + return p + } + } +} + +pub fn reflect(v: &Vector3<f64>, n: &Vector3<f64>) -> Vector3<f64> { + v - 2.0 * dot(*v, *n) * n +} + +pub fn refract(uv: &Vector3<f64>, n: &Vector3<f64>, etai_over_etat: f64) -> Vector3<f64> { + let cos_theta = dot(-1.0 * uv, *n); + let r_out_parallel = etai_over_etat * (uv + cos_theta*n); + let r_out_perp = -(1.0 - r_out_parallel.magnitude2()).sqrt() * n; + r_out_parallel + r_out_perp +} + +pub fn schlick(cosine: f64, ref_idx: f64) -> f64 { + let r0 = (1.0 - ref_idx) / (1.0 + ref_idx); + let r0sq = r0*r0; + r0sq + (1.0 - r0) * (1.0 - cosine).powi(5) +} |