#ifndef SHADER_H
#define SHADER_H
#include <Cg/cg.h>
#define kMaxDrawInstancedSize 100
namespace Graphics
{
class Shader
{
public:
static const int kMaxLight = 8;
Shader();
virtual ~Shader();
bool Initialize(
const char* pVertexShaderPath,
const char* pPixelShaderPath,
const char* pVertexShaderOptions =
NULL,
const char* pPixelShaderOptions =
NULL);
void BeginShading(FBRenderOptions* pRenderOptions, FBArrayTemplate<FBLight*>* pAffectingLightList =
NULL);
void EndShading();
void UploadParameters( FBRenderOptions* pRenderOptions, FBArrayTemplate<FBLight*>* pAffectingLightList =
NULL);
void SwitchMaterial(FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo, FBMaterial* pMaterial, double pShaderTransparencyFactor);
void UploadModelViewMatrixArrayForDrawInstanced(const double* pModelViewMatrixArray, int pCount);
void ShaderPassModelDraw ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass, FBShaderModelInfo* pInfo);
protected:
static void ShowError(const char* pText);
virtual void BindShaderPrograms();
virtual void UnbindShaderPrograms();
virtual void UnsetTextures();
CGprogram CreateShader(CGprofile pProfile, const char* pPath, const char** pArgs);
bool CreateVertexShader( const char* pPath, const char* pOptions );
bool CreatePixelShader( const char* pPath, const char* pOptions );
CGcontext mContext;
CGprofile mVertexProfile;
CGprofile mPixelProfile;
CGprogram mVertexShader;
CGprogram mPixelShader;
CGbuffer mParamModelViewArrayBuffer;
int mParamModelViewArrayBufferOffset;
CGparameter mParamMatEmissive;
CGparameter mParamMatAmbient;
CGparameter mParamMatDiffuse;
CGparameter mParamMatSpecular;
CGparameter mParamLightAmbient;
CGparameter mParamLightCount;
CGparameter mParamLightPositions[kMaxLight];
CGparameter mParamLightDirections[kMaxLight];
CGparameter mParamLightColours[kMaxLight];
CGparameter mParamLightAttenuations[kMaxLight];
CGparameter mParamColorTexture;
CGparameter mParamColorTextureMatrix;
CGparameter mParamColorTextureValidVS;
CGparameter mParamColorTextureValidPS;
CGparameter mParamNormalMap;
CGparameter mParamNormalMapMatrix;
CGparameter mParamNormalMapValidVS;
CGparameter mParamNormalMapValidPS;
CGparameter mParamIDBufferRender;
float mAlpha;
private:
Shader(const Shader&);
Shader& operator = (const Shader&);
};
}
#endif // SHADER_H