55#include < borealis/util/util.h>
66#include < glad/glad.h>
77
8+ #include < memory>
9+ #include < vector>
10+
811namespace brl
912{
1013 struct GfxShaderProgram ;
@@ -62,29 +65,32 @@ namespace brl
6265 glm::vec2 v2value;
6366 glm::vec3 v3value;
6467 glm::vec4 v4value;
65- std::shared_ptr<std::vector<glm::mat4>> m4value = nullptr ;
68+ std::shared_ptr<std::vector<glm::mat4>> m4value; // Shared ownership
6669 GfxTexture* txValue = nullptr ;
70+
71+ ~GfxShaderValue ();
6772 };
6873
6974 struct GfxShaderBinding
7075 {
7176 brl::GfxShaderUniform* uniform = nullptr ;
72- brl:: GfxShaderValue* value = nullptr ;
77+ std::shared_ptr< GfxShaderValue> value = nullptr ;
7378
7479 GfxShaderBinding () = default ;
75- GfxShaderBinding (brl::GfxShaderUniform* u, brl:: GfxShaderValue* v) : uniform(u), value(v) {}
80+ GfxShaderBinding (brl::GfxShaderUniform* u, std::shared_ptr< GfxShaderValue> v) : uniform(u), value(v) {}
7681
7782 ~GfxShaderBinding ();
83+
84+ private:
85+ bool real = true ;
7886 };
7987
80- struct GfxUniformList : public std ::vector<GfxShaderBinding>
88+ struct GfxUniformList : std::vector<GfxShaderBinding>
8189 {
8290 bool contains (GfxShaderUniform* uniform);
8391
84-
85-
8692// Non-const version for read/write access
87- GfxShaderValue* & operator [](GfxShaderUniform* uniform)
93+ std::shared_ptr< GfxShaderValue> & operator [](GfxShaderUniform* uniform)
8894 {
8995 for (auto & element1 : *this ) // Non-const loop for non-const method
9096 {
@@ -97,7 +103,7 @@ namespace brl
97103 }
98104
99105 // Const version for read-only access
100- GfxShaderValue* const & operator [](GfxShaderUniform* uniform) const
106+ std::shared_ptr< GfxShaderValue> const & operator [](GfxShaderUniform* uniform) const
101107 {
102108 for (const auto & element1 : *this )
103109 {
@@ -164,6 +170,8 @@ namespace brl
164170
165171 };
166172
173+ #define CONVERT_UNIFORM_MAT4 (m ) std::make_shared<std::vector<glm::mat4>>(m)
174+
167175 struct GfxMaterial
168176 {
169177
@@ -182,9 +190,11 @@ namespace brl
182190 if (!shader->getUniform (name))
183191 return ;
184192
185- GfxShaderValue* val = new GfxShaderValue ();
193+ auto val = std::make_shared< GfxShaderValue> ();
186194 val->intValue = value;
187- setOverride ({shader->getUniform (name), val});
195+
196+ auto override = GfxShaderBinding (shader->getUniform (name), val);
197+ setOverride (std::move (override ));
188198 }
189199
190200 void setFloat (std::string name, float value)
@@ -194,9 +204,11 @@ namespace brl
194204 if (!shader->getUniform (name))
195205 return ;
196206
197- GfxShaderValue* val = new GfxShaderValue ();
207+ auto val = std::make_shared< GfxShaderValue> ();
198208 val->floatValue = value;
199- setOverride ({shader->getUniform (name), val});
209+
210+ auto override = GfxShaderBinding (shader->getUniform (name), val);
211+ setOverride (std::move (override ));
200212 }
201213
202214 void setVec2 (std::string name, glm::vec2 value)
@@ -206,9 +218,11 @@ namespace brl
206218 if (!shader->getUniform (name))
207219 return ;
208220
209- GfxShaderValue* val = new GfxShaderValue ();
221+ auto val = std::make_shared< GfxShaderValue> ();
210222 val->v2value = value;
211- setOverride ({shader->getUniform (name), val});
223+
224+ auto override = GfxShaderBinding (shader->getUniform (name), val);
225+ setOverride (std::move (override ));
212226 }
213227
214228 void setVec3 (std::string name, glm::vec3 value)
@@ -217,9 +231,11 @@ namespace brl
217231 if (shader->getUniform (name) == nullptr )
218232 return ;
219233
220- GfxShaderValue* val = new GfxShaderValue ();
234+ auto val = std::make_shared< GfxShaderValue> ();
221235 val->v3value = value;
222- setOverride ({shader->getUniform (name), val});
236+
237+ auto override = GfxShaderBinding (shader->getUniform (name), val);
238+ setOverride (std::move (override ));
223239 }
224240
225241 void setVec4 (std::string name, glm::vec4 value)
@@ -229,9 +245,11 @@ namespace brl
229245 if (!shader->getUniform (name))
230246 return ;
231247
232- GfxShaderValue* val = new GfxShaderValue ();
248+ auto val = std::make_shared< GfxShaderValue> ();
233249 val->v4value = value;
234- setOverride ({shader->getUniform (name), val});
250+
251+ auto override = GfxShaderBinding (shader->getUniform (name), val);
252+ setOverride (std::move (override ));
235253 }
236254
237255 void setMat4 (std::string name, glm::mat4 value, int index=0 )
@@ -243,15 +261,17 @@ namespace brl
243261
244262 if (overrides.contains (uniform))
245263 {
246- overrides[uniform]->m4value ->operator [] (index) = value;
264+ overrides[uniform]->m4value ->at (index) = value;
247265 }
248266 else
249267 {
250268
251- GfxShaderValue* val = new GfxShaderValue ();
269+ auto val = std::make_shared< GfxShaderValue> ();
252270 val->m4value ->reserve (uniform->count );
253- val->m4value ->operator [](index) = value;
254- setOverride ({uniform, val});
271+ val->m4value ->at (index) = value;
272+
273+ auto override = GfxShaderBinding (uniform, val);
274+ setOverride ((override ));
255275 }
256276 }
257277
@@ -264,14 +284,16 @@ namespace brl
264284
265285 if (overrides.contains (uniform))
266286 {
267- overrides[uniform]->m4value = std::make_shared<std::vector<glm::mat4>> (value);
287+ overrides[uniform]->m4value = CONVERT_UNIFORM_MAT4 (value);
268288 }
269289 else
270290 {
271291
272- GfxShaderValue* val = new GfxShaderValue ();
273- val->m4value = std::make_shared<std::vector<glm::mat4>>(value);
274- setOverride ({uniform, val});
292+ auto val = std::make_shared<GfxShaderValue>();
293+ val->m4value = CONVERT_UNIFORM_MAT4 (value);
294+ ;
295+ auto override = GfxShaderBinding (uniform, val);
296+ setOverride (std::move (override ));
275297 }
276298 }
277299
@@ -280,20 +302,31 @@ namespace brl
280302 if (!shader->getUniform (name))
281303 return ;
282304
283- GfxShaderValue* val = new GfxShaderValue ();
305+ auto val = std::make_shared< GfxShaderValue> ();
284306 val->txValue = value;
285- setOverride ({shader->getUniform (name), val});
307+
308+ auto override = GfxShaderBinding (shader->getUniform (name), val);
309+ setOverride (override );
286310 }
287311
288312 GfxShaderValue* getUniform (std::string name)
289313 {
314+ if (!shader->getUniform (name))
315+ return nullptr ;
316+
290317 for (const auto & uniform : overrides)
291318 {
292319 if (uniform.uniform ->name == name)
293- return uniform.value ;
320+ return uniform.value . get () ;
294321 }
295322
296- return {};
323+ auto val = std::make_shared<GfxShaderValue>();
324+
325+
326+ auto override = GfxShaderBinding (shader->getUniform (name), val);
327+ setOverride (override );
328+
329+ return val.get ();
297330
298331 }
299332
@@ -310,6 +343,7 @@ namespace brl
310343 unsigned int registryIndex = UINT_MAX;
311344
312345 void setOverride (GfxShaderBinding pair);
346+ void applyUniform (const brl::GfxShaderBinding& _override, brl::GfxShaderProgram* shader);
313347 };
314348
315349 struct GfxMaterialMgr
0 commit comments