#pragma once

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

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


/// <summary>
/// SemanticHandler Hilfsklasse für Texture Typen.
/// </summary>
class TextureSemanticHandler
	: 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>
	TextureSemanticHandler(const std::string& inName, IDirect3DBaseTexture9* inValue);
	
	/// <summary>
	/// Destruktor des SemanticHandlers.
	/// </summary>
	virtual ~TextureSemanticHandler();

	/// <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(IDirect3DBaseTexture9* inValue) {Value = inValue;}

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

protected:
	IDirect3DBaseTexture9* Value;
};