#pragma once

#include <d3dx9.h>
#include <string>

#include "../ShaderParameter/ShaderParameter.h"
#include "BaseSemanticHandler.h"

/// <summary>
/// SemanticHandler Hilfsklasse für Float4 Typen.
/// </summary>
class Float4SemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float4SemanticHandler(const std::string& inName, D3DXVECTOR4* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float4SemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(D3DXVECTOR4* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	D3DXVECTOR4* get_Value() const {return Value;}

protected:
	D3DXVECTOR4* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float3 Typen.
/// </summary>
class Float3SemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float3SemanticHandler(const std::string& inName, D3DXVECTOR3* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float3SemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(D3DXVECTOR3* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	D3DXVECTOR3* get_Value() const {return Value;}

protected:
	D3DXVECTOR3* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float2 Typen.
/// </summary>
class Float2SemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float2SemanticHandler(const std::string& inName, D3DXVECTOR2* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float2SemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(D3DXVECTOR2* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	D3DXVECTOR2* get_Value() const {return Value;}

protected:
	D3DXVECTOR2* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float Typen.
/// </summary>
class FloatSemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	FloatSemanticHandler(const std::string& inName, float* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~FloatSemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(float* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	float* get_Value() const {return Value;}

protected:
	float* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float4Array Typen.
/// </summary>
class Float4ArraySemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float4ArraySemanticHandler(const std::string& inName, std::vector<D3DXVECTOR4>* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float4ArraySemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(std::vector<D3DXVECTOR4>* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	std::vector<D3DXVECTOR4>* get_Value() const {return Value;}

protected:
	std::vector<D3DXVECTOR4>* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float3Array Typen.
/// </summary>
class Float3ArraySemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float3ArraySemanticHandler(const std::string& inName, std::vector<D3DXVECTOR3>* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float3ArraySemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(std::vector<D3DXVECTOR3>* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	std::vector<D3DXVECTOR3>* get_Value() const {return Value;}

protected:
	std::vector<D3DXVECTOR3>* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für Float2Array Typen.
/// </summary>
class Float2ArraySemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	Float2ArraySemanticHandler(const std::string& inName, std::vector<D3DXVECTOR2>* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~Float2ArraySemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(std::vector<D3DXVECTOR2>* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	std::vector<D3DXVECTOR2>* get_Value() const {return Value;}

protected:
	std::vector<D3DXVECTOR2>* Value;
};

/// <summary>
/// SemanticHandler Hilfsklasse für FloatArray Typen.
/// </summary>
class FloatArraySemanticHandler
	: public BaseSemanticHandler
{
public:
	/// <summary>
	/// Konstruktor des SemanticHandlers.
	/// </summary>
	/// <param name="inName">Der Name der Semantic.</param>
	/// <param name="inValue">Ein Pointer auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	FloatArraySemanticHandler(const std::string& inName, std::vector<float>* inValue);

	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~FloatArraySemanticHandler();

	/// <summary>
	///	Wird aufgerufen wenn eine Semantic behandelt werden soll.
	/// </summary>
	/// <param name="inShader">Der Shader welcher den Handler aufgerufen hat.</param>
	/// <param name="inParameter">Ein Handle zum zu verarbeitenden Parameter.</param>
	virtual void OnHandle(IShader* inShader, IShaderParameter* inParameter);

	/// <summary>
	///	Wird aufgerufen wenn eine ShaderSystem Refresh geschehen ist.
	/// </summary>
	/// <param name="inShader">Der Shader der sich auffrischen soll.</param>
	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	/// <summary>
	/// Setzt die Quellvariable für die Benutzung mit dem Handler.
	/// </summary>
	/// <param name="inValue">Ein Zeiger auf die Quellvariable welche benutzt werden soll um mit dem Shaderparameter zu arbeiten.</param>
	void set_Value(std::vector<float>* inValue) {Value = inValue;}

	/// <summary>
	/// Gibt die Quallvariable zurück.
	/// </summary>
	/// <returns>Einen Zeiger zur aktuellen Quellvariable des Handlers.</returns>
	std::vector<float>* get_Value() const {return Value;}

protected:
	std::vector<float>* Value;
};