ray_tracing_utility/serialization/texture/
color_filter.rs1use 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}