// Eigene Handler können erstellt werden indem sie entweder von ICallbackHandler abgeleitet werden.
class DiffuseLightCallbackHandler
	: public ICallbackHandler
{
public:
	DiffuseLightCallbackHandler()
		: Name("DiffuseLightCallback")
		, LightNumber(0)
	{}

	virtual ~DiffuseLightCallbackHandler() {}

	virtual RenderPassReturnValue::Enumeration OnHandle(IShader* inShader, D3DXHANDLE Handle)
	{
		if (LightNumber>=LightList.size())
			RenderPassReturnValue::RenderAndCallNot;

		IShaderParameter* Parameter;
		Parameter = inShader->get_ParameterByName("DiffuseColor", ShaderParameter::get_Float4());
		if (Parameter)
			Parameter->set_Float4(LightList[LightNumber]->DiffuseColor);
		Parameter = inShader->get_ParameterByName("LightPosition", ShaderParameter::get_Float4());
		if (Parameter)
			Parameter->set_Float4(LightList[LightNumber]->Position);

		++LightNumber;
		if (LightNumber>LightList.size())
		{
			LightNumber = 0;
			RenderPassReturnValue::RenderAndCallOnce;
		}

		return RenderPassReturnValue::RenderAndCallAgain;
	}

	virtual void OnShaderSystemRefresh(IShader* inShader) {}

	virtual const std::string& get_Name() const
	{
		return Name;
	}

private:
	std::string Name;
	int LightNumber;
};


IShaderSystem* myShaderSystem;
...

// Dem ShaderSystem kann nun der neue SemanticHandler hinzugefügt werden
myShaderSystem->AddCallbackHandler(new DiffuseLightCallbackHandler());

// CallbackHandler können auch einem Shader direkt zugewiesen werden, damit
// kann verhindert werden das alle Shader diesen CallbackHandler bearbeiten.
IShader* myShader;
...

// Sollte ein CallbackHandler mit dem gleichen get_Name() Ergebniss wie der neue
// CallbackHandler existieren so wird der neue Handler den alten Handler ersetzen,
// vorrausgesetzt der alte Handler war ein Handler vom ShaderSystem.
myShader->AddCallbackHandler(new DiffuseLightCallbackHandler());

