wgpu_rust_renderer/material/node/
srgb_to_linear.rs

1use std::collections::HashMap;
2use crate::{
3	material::node::node::{
4		MaterialNode,
5		UniformContents,
6	},
7	resource::resource::{
8		ResourceId,
9		ResourcePool,
10	},
11};
12
13pub struct SRGBToLinearNode {
14	node: ResourceId<Box<dyn MaterialNode>>,
15}
16
17impl SRGBToLinearNode {
18	pub fn new(
19		node: ResourceId<Box<dyn MaterialNode>>,
20	) -> Self {
21		SRGBToLinearNode {
22			node: node,
23		}
24	}
25}
26
27impl MaterialNode for SRGBToLinearNode {
28	fn collect_nodes (
29		&self,
30		pool: &ResourcePool<Box<dyn MaterialNode>>,
31		nodes: &mut Vec<ResourceId<Box<dyn MaterialNode>>>,
32		visited: &mut HashMap<ResourceId<Box<dyn MaterialNode>>, bool>,
33		self_rid: ResourceId<Box<dyn MaterialNode>>,
34	) {
35		pool.borrow(&self.node).unwrap().collect_nodes(
36			pool, nodes, visited, self.node,
37		);
38		if !visited.contains_key(&self_rid) {
39			visited.insert(self_rid, true);
40			nodes.push(self_rid);
41		}
42	}
43
44	fn borrow_contents(&self) -> Option<&UniformContents> {
45		None
46	}
47
48	fn build_declaration(&self, _self_id: usize) -> String {
49		format!("")
50	}
51
52	fn build_functions(&self, _self_id: usize) -> String {
53		format!("")
54	}
55
56	fn build_fragment_shader(
57		&self,
58		pool: &ResourcePool<Box<dyn MaterialNode>>,
59		visited: &mut HashMap<usize, bool>,
60		self_id: usize,
61	) -> String {
62		if visited.contains_key(&self_id) {
63			return "".to_string();
64		}
65		visited.insert(self_id, true);
66
67		let node = pool.borrow(&self.node).unwrap();
68
69		node.build_fragment_shader(pool, visited, self.node.id) +
70		&format!("let {} = srgb_to_linear({});\n",
71			self.get_fragment_output(self_id),
72			node.get_fragment_output(self.node.id),
73		)
74	}
75
76	fn get_fragment_output(&self, self_id: usize) -> String {
77		format!("srgb_to_linear_output_{}", self_id)
78	}
79}