LkEngine 0.1.2
 
Loading...
Searching...
No Matches
OpenGLShader.h
1#pragma once
2
3#include "LkEngine/Renderer/Shader.h"
4
5#include "LkOpenGL.h"
6
7
8namespace LkEngine {
9
10 class LOpenGLShader : public LShader
11 {
12 public:
13 LOpenGLShader(const std::filesystem::path& InFilePath);
14 LOpenGLShader(const FShaderProgramSource& ShaderProgramSource);
15 LOpenGLShader() = delete;
17
18 FORCEINLINE virtual void Bind() const override
19 {
20 LK_OpenGL_Verify(glUseProgram(RendererID));
21 }
22
23 FORCEINLINE virtual void Unbind() const override
24 {
25 LK_OpenGL_Verify(glUseProgram(0));
26 }
27
28 FORCEINLINE virtual LRendererID GetRendererID() const override { return RendererID; }
29 FORCEINLINE virtual LRendererID& GetRendererID() override { return RendererID; }
30
31 virtual void Get(std::string_view Uniform, int& Value) override;
32 virtual void Get(std::string_view Uniform, bool& Value) override;
33 virtual void Get(std::string_view Uniform, float& Value) override;
34 virtual void Get(std::string_view Uniform, uint32_t& Value) override;
35 virtual void Get(std::string_view Uniform, glm::vec3& Value) override;
36 virtual void Get(std::string_view Uniform, glm::vec4& Value) override;
37
38 virtual void Set(std::string_view Uniform, const int Value) override;
39 virtual void Set(std::string_view Uniform, const bool Value) override;
40 virtual void Set(std::string_view Uniform, const float Value) override;
41 virtual void Set(std::string_view Uniform, const uint32_t Value) override;
42 virtual void Set(std::string_view Uniform, const glm::vec2& Value) override;
43 virtual void Set(std::string_view Uniform, const glm::vec3& Value) override;
44 virtual void Set(std::string_view Uniform, const glm::vec4& Value) override;
45 virtual void Set(std::string_view Uniform, const glm::ivec2& Value) override;
46 virtual void Set(std::string_view Uniform, const glm::ivec3& Value) override;
47 virtual void Set(std::string_view Uniform, const glm::ivec4& Value) override;
48 virtual void Set(std::string_view Uniform, const glm::mat4& Value) override;
49
50 virtual std::size_t GetHash() const override
51 {
52 return LHash::Generate<EHash::FNV>(FilePath.string());
53 }
54
55 virtual std::string GetName() const override
56 {
57 if (FilePath.has_filename())
58 {
59 return FilePath.filename().string();
60 }
61 return "UNKNOWN";
62 }
63
64 FORCEINLINE virtual const FShaderProgramSource& GetSource() const override
65 {
66 return Source;
67 }
68
69 private:
76 FORCEINLINE int GetUniformLocation(const std::string& Uniform)
77 {
78 if (UniformLocationCache.find(Uniform) != UniformLocationCache.end())
79 {
80 return UniformLocationCache[Uniform];
81 }
82
83 int UniformLocation;
84 LK_OpenGL_Verify(UniformLocation = glGetUniformLocation(RendererID, Uniform.c_str()));
85 if (UniformLocation == -1)
86 {
87 LK_CORE_WARN_TAG("Shader", "Uniform '{}' is not in use ({})", Uniform, FilePath.filename().string());
88 }
89
90 /* TODO: Should caching be placed in 'else' statement here? */
91 UniformLocationCache[Uniform] = UniformLocation;
92
93 return UniformLocation;
94 }
95
96 virtual uint32_t CompileShader(const uint32_t InShaderType, const std::string& Source) override;
97 virtual uint32_t CreateShader(const FShaderProgramSource& ShaderProgramSource) override;
98
99 private:
100 LRendererID RendererID = 0;
101
102 std::unordered_map<std::string, int> UniformLocationCache;
103 std::filesystem::path FilePath{};
104
105 FShaderProgramSource Source{};
106
108 };
109}
Definition OpenGLShader.h:11
Definition Shader.h:44
#define LCLASS(Class)
Definition CoreMacros.h:226
uint32_t LRendererID
Definition CoreTypes.h:30
Definition Asset.h:11
Definition ShaderResource.h:11