wrend/uniforms/
uniform_link.rs1use crate::Bridge;
2use crate::Id;
3use crate::UniformCreateUpdateCallback;
4use crate::UniformShouldUpdateCallback;
5use std::fmt::Debug;
6use std::hash::Hash;
7
8#[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 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 pub fn program_ids(&self) -> &Vec<ProgramId> {
41 &self.program_ids
42 }
43
44 pub fn uniform_id(&self) -> &UniformId {
46 &self.uniform_id
47 }
48
49 pub fn initialize_callback(&self) -> UniformCreateUpdateCallback {
51 self.initialize_callback.clone()
52 }
53
54 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 pub fn should_update_callback(&self) -> Option<UniformShouldUpdateCallback> {
65 self.should_update_callback.as_ref().map(Clone::clone)
66 }
67
68 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 pub fn update_callback(&self) -> Option<UniformCreateUpdateCallback> {
79 self.update_callback.as_ref().map(Clone::clone)
80 }
81
82 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 pub fn use_init_callback_for_update(&self) -> bool {
93 self.use_init_callback_for_update
94 }
95
96 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> {}