text: #pragma once
  
  #include "Raybyte/Graphics/API/Shader.h"
  
  namespace Raybyte {
  
  	class OpenGLShader : public Shader
  	{
  	public:
  		OpenGLShader();
  		virtual ~OpenGLShader();
  
  		virtual void Bind() const override;
  		virtual void Unbind() const override;
  
  		virtual void RT_Bind() const override;
  		virtual void RT_Unbind() const override;
  
  		virtual void SetUniform(const std::string& name, float value) const override;
  		virtual void SetUniform(const std::string& name, int32 value) const override;
  		virtual void SetUniform(const std::string& name, uint32 value) const override;
  		virtual void SetUniform(const std::string& name, const glm::vec2& value) const override;
  		virtual void SetUniform(const std::string& name, const glm::vec3& value) const override;
  		virtual void SetUniform(const std::string& name, const glm::vec4& value) const override;
  		virtual void SetUniform(const std::string& name, const glm::mat4& data) const override;
  		virtual void SetUniform(const std::string& name, const glm::mat4* data, uint32 count) const override;
  
  		virtual void RT_SetUniform(const std::string& name, float value) const override;
  		virtual void RT_SetUniform(const std::string& name, int32 value) const override;
  		virtual void RT_SetUniform(const std::string& name, uint32 value) const override;
  		virtual void RT_SetUniform(const std::string& name, const glm::vec2& value) const override;
  		virtual void RT_SetUniform(const std::string& name, const glm::vec3& value) const override;
  		virtual void RT_SetUniform(const std::string& name, const glm::vec4& value) const override;
  		virtual void RT_SetUniform(const std::string& name, const glm::mat4& data) const override;
  		virtual void RT_SetUniform(const std::string& name, const glm::mat4* data, uint32 count) const override;
  	protected:
  		virtual void Compile(const std::unordered_map<ShaderStage, SPIRVBinary>& vulkanBinaries, bool hasChanged) override;
  		virtual void CreateProgram() override;
  		virtual void GetMacroDefinitions(std::vector<std::string>& macroDefinitions) const override;
  
  		virtual const char* GetCacheDirectory() const override;
  		virtual const char* GetCachedFileExtension(ShaderStage stage) const override;
  	private:
  		uint32 m_ProgramID = 0;
  		std::string m_EntryPoint = "main";
  
  		std::unordered_map<ShaderStage, SPIRVBinary> m_SPIRVBinaries;
  		mutable std::unordered_map<std::string, int32> m_UniformLocations;
  	};
  
  }