// // Created by jie on 2023/10/11. // #ifndef LEARNOPENGL_SHADERHELPER_H #define LEARNOPENGL_SHADERHELPER_H #include "glad/glad.h" #include #include #include class ShaderService { private: unsigned int programId; public: ShaderService(const std::filesystem::path &vertexShaderPath, const std::filesystem::path &fragShaderPath); bool CheckShader(unsigned int shaderIndex, bool isProgram = false); void Use(); inline unsigned int GetId() { return this->programId; } template requires std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v void SetUniform(std::string_view name, T value); }; template requires std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v void ShaderService::SetUniform(std::string_view name, T value) { if constexpr (std::is_same_v) { glUniform1i(glGetUniformLocation(programId, name.data()), (int)value); } else if constexpr (std::is_same_v) { glUniform1i(glGetUniformLocation(programId, name.data()), value); } else if constexpr (std::is_same_v) { glUniform1f(glGetUniformLocation(programId, name.data()), value); } else if constexpr (std::is_same_v) { const auto index = glGetUniformLocation(this->programId, name.data()); glUniformMatrix4fv(index, 1, GL_FALSE, &value[0][0]); } else if constexpr (std::is_same_v){ glUniform3fv(glGetUniformLocation(programId, name.data()), 1, &value[0]); } } #endif // LEARNOPENGL_SHADERHELPER_H