wgpu_rust_renderer/material/node/
srgb_to_linear.rs1use 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}