
#ifndef SPECTRE_GFXDRIVER_SHADERPROGRAM_H
#define SPECTRE_GFXDRIVER_SHADERPROGRAM_H

#include <Spectre/Math/Matrix4.h>
#include <Spectre/Math/Color.h>

namespace sp {

enum ShaderType {
	Vertex,
	Fragment
};

class ShaderProgram
{
public:
	virtual ~ShaderProgram();

	// Load a shader program from file.
	virtual bool loadFromFile(const std::string& filename);

	// Load a shader from file.
	virtual bool loadFromFile(const std::string& filename, ShaderType type);

	// Load a shader from memory.
	virtual bool loadFromMemory(const std::string& source, ShaderType type) = 0;

	// Link the program.
	virtual bool link() = 0;

	// Returns true if the program was linked successfully
	virtual bool isLinked() const;

	// Enable this shader
	// All shader operations after this call will affect this shader.
	virtual void enable() const = 0;

	// Disable this shader
	// Operations will no longer affect this shader after this call.
	virtual void disable() const = 0;

	// Get the last shader error.
	virtual std::string getLastError() const;

	// ---------------------
	// Variables.
	// ---------------------
	// TODO: Move this to a ShaderParameter class

	virtual bool setMVPMatrix(const Matrix4f& matrix) = 0;

	// ---------------------
	//  General Variables.
	// ---------------------

	virtual bool setAttribute(const std::string& name, float value) const = 0;

	virtual bool setAttribute(const std::string& name, const Matrix4f& matrix) const = 0;

	virtual bool setUniform(const std::string& name, const Matrix4f& matrix) const = 0;

	virtual bool setUniform(const std::string& name, const Color& color) const = 0;


protected:

	std::string m_extension;

	mutable std::string m_error;

	bool m_linked;
};

} // namespace sp

#endif /* SECTRE_GRAPHICS_SHADERPROGRAM_H */ 
