New shader API in Residual Decay

Posted 2009-10-22

   Soon shader API in Residual Decay will be updated once again - this time codebase will be common to all rendering devices (OpenGL, Direct3D 9 and Direct3D 10). The main advantage of this solution is that all function calls will be made in base rendering device code, so implementation in OGL/D3D will require calling only one function (and render specific code to compile a shader of course). Below code snippet:

#ifndef __NMSHADERAPI__
#define __NMSHADERAPI__

#define TEX_SCREEN1 0
#define TEX_SCREEN2 1
#define TEX_DIFF 2

//shader state
enum eShaderState
{
	SHADER_Activated,
	SHADER_Deactivated
};
//shader type
enum eShaderForm
{
	SHADER_Fragment,
	SHADER_Vertex
};

class NEMESISCORE_API UNMShaderProgram
{
public:
	UBOOL bRequestedDestroy;
	//empty constructor
	UNMShaderProgram(){}
	//main contructor
	UNMShaderProgram( FString TargetClass, UViewport* nViewport, UNMSceneShader* nSceneShader )
	{
		bRequestedDestroy=0;
		SceneShader=nSceneShader;
		ApplyShaderClass(TargetClass);
		ImportShader();
		Viewport=nViewport;
		CompileShader();
		SetColor();
	}
	//true if shader is compiled
	virtual UBOOL IsValid()
	{
		return bCompiled;
	}
	//applies shader name
	void ApplyShaderClass(FString TargetClass)
	{
		if( ShaderClass != FString(TEXT("")) )
			ReleaseShaderProgram();
		ShaderClass=TargetClass;
	}
	//imports shader from nsh file
	void ImportShader()
	{
		Shader = LoadObject( NULL, *ShaderClass, NULL, LOAD_NoWarn, NULL );
	}
	//set current color
	void SetColor(FColor nColor=FColor(1,1,1,1))
	{
		Color=nColor;
	}
//extended in subclasses	
	//generates empty texture
	virtual void GenerateEmptyTexture(int Texture){}
	//captures depth component
	virtual void CaptureDepthTexture(int Texture){}
	//render to texture
	virtual void CaptureScreen(int Texture){}
	//destroys texture
	virtual void DestroyTexture(int Texture){}
	//compiles shader
	virtual void CompileShader(){ bCompiled=1; }
	//release shader program
	virtual void ReleaseShaderProgram(){}
	//draw shader
	virtual void DrawShader(ANMPlayerPawn* POwner){}
	//To acces Render Device use:
	// POwner->XLevel->Engine->GameRenderDeviceClass

protected:
	UViewport* Viewport;
	//current shader class
	FString ShaderClass;
	//shader pointer (use Shader->Data)
	UNMShaderObject* Shader;
	//Scene shader definition
	UNMSceneShader* SceneShader;
	//shader state
	eShaderState CurrentState;
	//shader type
	eShaderForm CurrentType;
	//color
	FColor Color;	
};
#endif