aboutsummaryrefslogtreecommitdiff
path: root/src/core/spectrum.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/spectrum.rs')
-rw-r--r--src/core/spectrum.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/core/spectrum.rs b/src/core/spectrum.rs
index 41b3342..727a1b6 100644
--- a/src/core/spectrum.rs
+++ b/src/core/spectrum.rs
@@ -6,7 +6,7 @@ use std::ops;
// TODO implement SampledSpectrum instead for nicer images
-#[derive(Clone, Default)]
+#[derive(Clone, Copy, Default)]
pub struct Spectrum {
c: [Float; 3],
}
@@ -19,9 +19,17 @@ impl Spectrum {
pub fn to_rgb(&self, scale: Float) -> (Float, Float, Float) {
(self.c[0] * scale, self.c[1] * scale, self.c[2] * scale)
}
+
+ pub fn gamma_correct(&self) -> Self {
+ Self::new_rgb(
+ self.c[0].sqrt(),
+ self.c[1].sqrt(),
+ self.c[2].sqrt(),
+ )
+ }
}
-impl std::ops::Mul<Float> for &Spectrum {
+impl std::ops::Mul<Float> for Spectrum {
type Output = Spectrum;
fn mul(self, op: Float) -> Self::Output {
@@ -33,7 +41,7 @@ impl std::ops::Mul<Float> for &Spectrum {
}
}
-impl std::ops::Div<Float> for &Spectrum {
+impl std::ops::Div<Float> for Spectrum {
type Output = Spectrum;
fn div(self, op: Float) -> Self::Output {
@@ -45,6 +53,18 @@ impl std::ops::Div<Float> for &Spectrum {
}
}
+impl std::ops::Add for Spectrum {
+ type Output = Spectrum;
+
+ fn add(self, op: Self) -> Self::Output {
+ Self::Output::new_rgb(
+ self.c[0] + op.c[0],
+ self.c[1] + op.c[1],
+ self.c[2] + op.c[2],
+ )
+ }
+}
+
impl std::ops::AddAssign<&Self> for Spectrum {
fn add_assign(&mut self, op: &Self) {
self.c[0] += op.c[0];