ray_tracing_utility/serialization/texture/
color_filter.rs

1use crate::serialization::Value;
2use crate::serialization::{IdConstructor, IdReference};
3use ray_tracing_core::texture;
4use serde::{Deserialize, Serialize};
5use std::error::Error;
6use std::sync::Arc;
7
8#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
9pub struct ColorFilter {
10    pub id: IdConstructor,
11    pub a: Value,
12    pub b: Value,
13    pub c: Value,
14    pub texture: IdReference,
15}
16
17impl ColorFilter {
18    pub fn from_texture(f: &texture::ColorFilter) -> Result<ColorFilter, Box<dyn Error>> {
19        Ok(ColorFilter {
20            id: IdConstructor::Single(f.id),
21            a: Value::from_color_rgba(f.a)?,
22            b: Value::from_color_rgba(f.b)?,
23            c: Value::from_color_rgba(f.c)?,
24            texture: IdReference::Single(f.texture.get_id()),
25        })
26    }
27
28    pub fn to_texture(
29        &self,
30        index: usize,
31        texture: Arc<dyn texture::Texture>,
32    ) -> Result<texture::ColorFilter, Box<dyn Error>> {
33        Ok(texture::ColorFilter {
34            id: self.id.get_id(index),
35            a: self.a.to_color_rgba()?,
36            b: self.b.to_color_rgba()?,
37            c: self.c.to_color_rgba()?,
38            texture,
39        })
40    }
41}
42
43#[cfg(test)]
44mod filter_test {
45    use super::*;
46    use ray_tracing_core::random;
47    use ray_tracing_core::test;
48    use ray_tracing_core::texture::ConstantTexture;
49    use ray_tracing_core::types::ColorRGBA;
50
51    #[test]
52    fn color_filter_test_form_texture() {
53        let ct = Arc::new(ConstantTexture::new(ColorRGBA::new(0.0, 0.0, 0.0, 1.0)));
54        let ct_id = ct.id;
55        let cf = Arc::new(texture::ColorFilter::new(
56            ColorRGBA::new(1.0, 1.0, 1.0, 1.0),
57            ColorRGBA::new(2.0, 2.0, 2.0, 2.0),
58            ColorRGBA::new(3.0, 3.0, 3.0, 3.0),
59            ct,
60        ));
61        let f = ColorFilter::from_texture(&cf).unwrap();
62        assert_eq!(f.a, Value::Vector4((1.0, 1.0, 1.0, 1.0)));
63        assert_eq!(f.b, Value::Vector4((2.0, 2.0, 2.0, 2.0)));
64        assert_eq!(f.c, Value::Vector4((3.0, 3.0, 3.0, 3.0)));
65        assert_eq!(f.texture, IdReference::Single(ct_id));
66    }
67
68    #[test]
69    fn color_filter_test_to_texture() {
70        let cf = ColorFilter {
71            id: IdConstructor::Single(1),
72            a: Value::Vector4((1.0, 1.0, 1.0, 1.0)),
73            b: Value::Vector4((2.0, 2.0, 2.0, 2.0)),
74            c: Value::Vector4((3.0, 3.0, 3.0, 3.0)),
75            texture: IdReference::Single(0),
76        };
77        let f = cf
78            .to_texture(
79                0,
80                Arc::new(ConstantTexture::new(ColorRGBA::new(0.0, 0.0, 0.0, 1.0))),
81            )
82            .unwrap();
83        let c = f
84            .texture
85            .value(&random::generate_uv(), &random::generate_vector3());
86        test::assert_eq_vector4(&c, &ColorRGBA::new(0.0, 0.0, 0.0, 1.0), 0.001);
87    }
88}