wrend/uniforms/
uniform_link.rs

1use crate::Bridge;
2use crate::Id;
3use crate::UniformCreateUpdateCallback;
4use crate::UniformShouldUpdateCallback;
5use std::fmt::Debug;
6use std::hash::Hash;
7
8/// This link is used to associated a one or more `ProgramId`s with a conceptual uniform.
9/// This allows sharing uniforms across programs, even when each uniform's location differs between programs.
10#[derive(Clone)]
11pub struct UniformLink<ProgramId: Id, UniformId: Id> {
12    program_ids: Vec<ProgramId>,
13    uniform_id: UniformId,
14    initialize_callback: UniformCreateUpdateCallback,
15    update_callback: Option<UniformCreateUpdateCallback>,
16    should_update_callback: Option<UniformShouldUpdateCallback>,
17    use_init_callback_for_update: bool,
18}
19
20impl<ProgramId: Id, UniformId: Id> UniformLink<ProgramId, UniformId> {
21    /// Creates a new uniform link
22    pub fn new(
23        program_ids: impl Into<Bridge<ProgramId>>,
24        uniform_id: UniformId,
25        initialize_callback: impl Into<UniformCreateUpdateCallback>,
26    ) -> Self {
27        let program_id_bridge: Bridge<ProgramId> = program_ids.into();
28        let program_ids = program_id_bridge.into();
29        Self {
30            program_ids,
31            uniform_id,
32            initialize_callback: initialize_callback.into(),
33            use_init_callback_for_update: false,
34            should_update_callback: None,
35            update_callback: None,
36        }
37    }
38
39    /// Gets all program ids that this link is associated with
40    pub fn program_ids(&self) -> &Vec<ProgramId> {
41        &self.program_ids
42    }
43
44    /// Gets the id of the uniform link
45    pub fn uniform_id(&self) -> &UniformId {
46        &self.uniform_id
47    }
48
49    /// See [crate::Uniform::initialize_callback]
50    pub fn initialize_callback(&self) -> UniformCreateUpdateCallback {
51        self.initialize_callback.clone()
52    }
53
54    /// See [crate::Uniform::initialize_callback]
55    pub fn set_initialize_callback(
56        &mut self,
57        callback: impl Into<UniformCreateUpdateCallback>,
58    ) -> &mut Self {
59        self.initialize_callback = callback.into();
60        self
61    }
62
63    /// See [crate::Uniform::should_update_callback]
64    pub fn should_update_callback(&self) -> Option<UniformShouldUpdateCallback> {
65        self.should_update_callback.as_ref().map(Clone::clone)
66    }
67
68    /// See [crate::Uniform::should_update_callback]
69    pub fn set_should_update_callback(
70        &mut self,
71        callback: impl Into<UniformShouldUpdateCallback>,
72    ) -> &mut Self {
73        self.should_update_callback.replace(callback.into());
74        self
75    }
76
77    /// See [crate::Uniform::update_callback]
78    pub fn update_callback(&self) -> Option<UniformCreateUpdateCallback> {
79        self.update_callback.as_ref().map(Clone::clone)
80    }
81
82    /// See [crate::Uniform::update_callback]
83    pub fn set_update_callback(
84        &mut self,
85        callback: impl Into<UniformCreateUpdateCallback>,
86    ) -> &mut Self {
87        self.update_callback.replace(callback.into());
88        self
89    }
90
91    /// See [Uniform::use_init_callback_for_update]
92    pub fn use_init_callback_for_update(&self) -> bool {
93        self.use_init_callback_for_update
94    }
95
96    /// See [Uniform::use_init_callback_for_update]
97    pub fn set_use_init_callback_for_update(
98        &mut self,
99        use_init_callback_for_update: bool,
100    ) -> &mut Self {
101        self.use_init_callback_for_update = use_init_callback_for_update;
102        self
103    }
104}
105
106impl<ProgramId: Id, UniformId: Id> Debug for UniformLink<ProgramId, UniformId> {
107    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
108        f.debug_struct("UniformLink")
109            .field("program_ids", &self.program_ids)
110            .field("uniform_id", &self.uniform_id)
111            .field("initialize_callback", &self.initialize_callback)
112            .field("update_callback", &self.update_callback)
113            .field("should_update_callback", &self.should_update_callback)
114            .field(
115                "use_init_callback_for_update",
116                &self.use_init_callback_for_update,
117            )
118            .finish()
119    }
120}
121
122impl<ProgramId: Id, UniformId: Id> Hash for UniformLink<ProgramId, UniformId> {
123    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
124        self.program_ids.hash(state);
125        self.uniform_id.hash(state);
126    }
127}
128
129impl<ProgramId: Id, UniformId: Id> PartialEq for UniformLink<ProgramId, UniformId> {
130    fn eq(&self, other: &Self) -> bool {
131        self.program_ids == other.program_ids && self.uniform_id == other.uniform_id
132    }
133}
134
135impl<ProgramId: Id, UniformId: Id> Eq for UniformLink<ProgramId, UniformId> {}