Skip to content

Commit 07398b8

Browse files
Refactor shader uniform handling to use smart pointers
Replaces raw pointers with std::shared_ptr for GfxShaderValue and related uniform binding logic, improving memory management and safety. Updates GfxUniformList, GfxShaderBinding, and GfxMaterial to use smart pointers, and centralizes uniform application logic in GfxMaterial::applyUniform. Also adds bone world matrix calculation and skin initialization, and fixes GLM quaternion initialization for model nodes and bones.
1 parent 6eda1d0 commit 07398b8

File tree

9 files changed

+237
-273
lines changed

9 files changed

+237
-273
lines changed

include/borealis/gfx/engine.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ namespace brl
5858
void update();
5959
bool isRunning() {return mainWindow->isOpen();}
6060
void insertCall(GfxMaterial* material, GfxAttribBuffer* buffer, const glm::mat4& transform,
61-
std::vector<GfxShaderBinding>& uniqueOverrides, int instancingIdx = 0);
61+
GfxUniformList& uniqueOverrides, int instancingIdx = 0);
6262
int getFrameCount();
6363

6464
float getAspectRatio();

include/borealis/gfx/model.hpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ namespace brl
7676
struct GfxModelNode {
7777
std::string name;
7878
glm::vec3 position = glm::vec3(0);
79-
glm::quat rotation = glm::quat();
79+
glm::quat rotation = glm::identity<glm::quat>();
8080
glm::vec3 scale = glm::vec3(1);
8181

8282
int mesh = -1;
@@ -115,7 +115,7 @@ namespace brl
115115

116116
static GfxModel* loadModel(std::string path);
117117

118-
EcsEntity* createEntity();
118+
GfxModelEntity* createEntity();
119119

120120
private:
121121
friend GfxEngine;
@@ -152,9 +152,10 @@ namespace brl
152152
{
153153
std::string name;
154154
glm::vec3 position = glm::vec3(0);
155-
glm::quat rotation = glm::quat();
155+
glm::quat rotation = glm::identity<glm::quat>();
156156
glm::vec3 scale = glm::vec3(1);
157157
glm::mat4 inverseBindMatrix = glm::mat4(1.0);
158+
glm::mat4 worldMatrix = glm::mat4(1.0);
158159

159160
int parent = -1;
160161

@@ -171,6 +172,11 @@ namespace brl
171172
{
172173
std::string name;
173174
std::vector<GfxBone*> bones;
175+
176+
private:
177+
friend GfxModel;
178+
void initialize();
179+
void _calcTransform(brl::GfxBone* bone, const glm::mat4& parentTransform, int index);
174180
};
175181

176182
struct GfxSkeleton : EcsEntity
@@ -184,7 +190,7 @@ namespace brl
184190
private:
185191

186192
std::vector<glm::mat4> jointMatrices;
187-
void _calcTransform(brl::GfxBone* bone, glm::mat4 parentTransform, int index,
193+
void _calcTransform(brl::GfxBone* bone, const glm::mat4& parentTransform, int index,
188194
bool parentChanged);
189195

190196
};

include/borealis/gfx/shader.hpp

Lines changed: 64 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
#include <borealis/util/util.h>
66
#include <glad/glad.h>
77

8+
#include <memory>
9+
#include <vector>
10+
811
namespace 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

src/brl/gfx/camera.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ void brl::GfxCamera::draw(std::vector<GfxDrawCall>& calls, const GfxInstancedDra
2525
cachedFramebuffer->use();
2626
cachedFramebuffer->clear();
2727

28-
GfxShaderValue* viewValue = new GfxShaderValue;
29-
GfxShaderValue* projValue = new GfxShaderValue;
30-
GfxShaderValue* timeValue = new GfxShaderValue;
31-
GfxShaderValue* cameraPosValue = new GfxShaderValue;
28+
auto viewValue = std::make_shared<GfxShaderValue>();
29+
auto projValue = std::make_shared<GfxShaderValue>();
30+
auto timeValue = std::make_shared<GfxShaderValue>();
31+
auto cameraPosValue = std::make_shared<GfxShaderValue>();
3232

33-
viewValue->m4value = std::make_shared<std::vector<glm::mat4>>(std::vector<glm::mat4>{GetViewMatrix()});
34-
projValue->m4value = std::make_shared<std::vector<glm::mat4>>(std::vector<glm::mat4>{GetProjMatrix()});
33+
viewValue->m4value = CONVERT_UNIFORM_MAT4(std::vector<glm::mat4>{GetViewMatrix()});
34+
projValue->m4value = CONVERT_UNIFORM_MAT4(std::vector<glm::mat4>{GetProjMatrix()});
3535
timeValue->floatValue = glfwGetTime();
3636
cameraPosValue->v3value = position;
3737

3838
for (GfxDrawCall& call : calls)
3939
{
40-
GfxShaderValue* modelValue = new GfxShaderValue;
41-
modelValue->m4value = std::make_shared<std::vector<glm::mat4>>(std::vector<glm::mat4>{call.transform});
40+
auto modelValue = std::make_shared<GfxShaderValue>();
41+
modelValue->m4value = CONVERT_UNIFORM_MAT4(std::vector<glm::mat4>{call.transform});
4242
GfxUniformList overrides;
4343
overrides.push_back({call.material->getShader()->getUniform("_internalView"), viewValue});
4444
overrides.push_back({call.material->getShader()->getUniform("_internalProj"), projValue});

src/brl/gfx/engine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ void brl::GfxEngine::update()
336336
}
337337

338338
void brl::GfxEngine::insertCall(::brl::GfxMaterial* material, ::brl::GfxAttribBuffer* buffer, const glm::mat4& transform,
339-
std::vector<GfxShaderBinding>& uniqueOverrides, int instancingIdx)
339+
GfxUniformList& uniqueOverrides, int instancingIdx)
340340
{
341341
auto shader = material->getShader();
342342
if (shader->instancingEnabled)

src/brl/gfx/framebuffer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ void brl::GfxFramebufferAttachment::draw(GfxMaterial* material)
3030

3131
GfxUniformList uniforms = {};
3232

33-
GfxShaderValue* sourceValue = new GfxShaderValue;
33+
auto sourceValue = std::make_shared<GfxShaderValue>();
3434
sourceValue->txValue = this;
3535
uniforms.push_back({material->getShader()->getUniform("_sourceTexture"), sourceValue});
3636

0 commit comments

Comments
 (0)