Skip to content

Commit 572f105

Browse files
committed
material handlers
1 parent b82f88a commit 572f105

File tree

3 files changed

+51
-21
lines changed

3 files changed

+51
-21
lines changed

Sources/Render/Material.cpp

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,16 @@ using namespace RED_LILIUM_NAMESPACE;
1111

1212
Material::Material(ptr<RenderDevice> renderDevice, std::string_view filename)
1313
: RedLiliumObject()
14-
, m_renderDevice(renderDevice)
15-
, m_filename(filename)
16-
, m_vertexDeclaration(nullptr)
1714
{
18-
SetShaderProgram(m_renderDevice->GetShaderManager()->GetShaderProgram(filename));
15+
SetShaderProgram(renderDevice->GetShaderManager()->GetShaderProgram(filename));
1916
}
2017

2118
Material::~Material()
2219
{}
2320

24-
sptr<Material> Material::Create(ptr<RenderDevice> renderDevice, std::string_view filename)
21+
const std::string& Material::GetName() const
2522
{
26-
return smake<Material>(renderDevice, filename);
27-
}
28-
29-
ptr<VertexDeclaration> Material::GetVertexDeclaration()
30-
{
31-
RED_LILIUM_ASSERT(m_vertexDeclaration != nullptr);
32-
return m_vertexDeclaration;
23+
return m_shaderProgram->GetName();
3324
}
3425

3526
const sptr<ShaderProgram>& Material::GetShaderProgram()
@@ -41,8 +32,6 @@ const sptr<ShaderProgram>& Material::GetShaderProgram()
4132
void Material::SetShaderProgram(const sptr<ShaderProgram>& shaderProgram)
4233
{
4334
m_shaderProgram = shaderProgram;
44-
m_vertexDeclaration = m_shaderProgram->GetVertexDeclaration();
45-
4635
m_uniforms = shaderProgram->GetUniforms();
4736
m_nameToUniform.clear();
4837
for (size_t i = 0; i < m_uniforms.size(); i++)

Sources/Render/Material.h

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,64 @@ class Material : public RedLiliumObject
1212
Material(ptr<RenderDevice> renderDevice, std::string_view filename);
1313
~Material() override;
1414

15+
template<class T = Material>
16+
static sptr<T> Create(ptr<RenderDevice> renderDevice, std::string_view filename)
17+
{
18+
return smake<T>(renderDevice, filename);
19+
}
20+
1521
template<class T>
1622
bool Set(std::string_view name, T& value);
1723

18-
static sptr<Material> Create(ptr<RenderDevice> renderDevice, std::string_view filename);
24+
const std::string& GetName() const;
25+
26+
public:
27+
template <class T>
28+
struct Handler
29+
{
30+
Handler(ptr<Material> material, std::string_view name, const T& defaultValue)
31+
: m_uniform(nullptr)
32+
{
33+
auto i = m_nameToUniform.find(name);
34+
if (i != m_nameToUniform.end())
35+
{
36+
m_uniform = &m_uniforms[i->second];
37+
}
38+
}
1939

20-
/*internal*/ public:
40+
Handler& operator=(const T& value)
41+
{
42+
if (m_uniform != nullptr)
43+
{
44+
m_uniform->Set(value);
45+
}
46+
return *this;
47+
}
48+
49+
ptr<Uniform> m_uniform;
50+
};
51+
52+
using Sampler = Handler<sptr<GpuTexture>>;
53+
using Float = Handler<sptr<float>>;
54+
using Vec2 = Handler<sptr<vec2>>;
55+
using Vec3 = Handler<sptr<vec3>>;
56+
using Vec4 = Handler<sptr<vec4>>;
57+
using Mat2 = Handler<sptr<mat2>>;
58+
using Mat3 = Handler<sptr<mat3>>;
59+
using Mat4 = Handler<sptr<mat4>>;
60+
61+
RED_LILIUM_INTERNAL:
2162
void Use(ptr<RenderContext> context);
22-
ptr<VertexDeclaration> GetVertexDeclaration();
2363
const sptr<ShaderProgram>& GetShaderProgram();
2464

65+
template<class T>
66+
friend struct Handler;
67+
2568
private:
2669
void SetShaderProgram(const sptr<ShaderProgram>& shaderProgram);
2770

2871
std::vector<Uniform> m_uniforms;
2972
std::map<std::string, size_t, std::less<>> m_nameToUniform;
30-
ptr<RenderDevice> m_renderDevice;
31-
std::string m_filename;
32-
ptr<VertexDeclaration> m_vertexDeclaration;
3373
sptr<ShaderProgram> m_shaderProgram;
3474
};
3575

Sources/Render/RenderContext.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ void RenderContext::Draw(const sptr<GpuMesh>& mesh, const sptr<Material>& materi
2525
UpdateUniformBlocks();
2626
material->Use(this);
2727

28-
ptr<VertexArrayObject> vao = mesh->GetVertexArrayObject(material->GetVertexDeclaration());
28+
const sptr<ShaderProgram>& shaderProgram = material->GetShaderProgram();
29+
ptr<VertexArrayObject> vao = mesh->GetVertexArrayObject(shaderProgram->GetVertexDeclaration());
2930
glBindVertexArray(vao->GetNative());
3031
glDrawElements(GL_TRIANGLES, mesh->GetIndicesSize(), GL_UNSIGNED_INT, 0);
3132
glBindVertexArray(0);

0 commit comments

Comments
 (0)