#ifndef SHADER_H
#define SHADER_H
#ifdef _WIN32
#ifndef APIENTRY
#define MAYA_APIENTRY_DEFINED
#define APIENTRY __stdcall
#define WINGDIAPI
#endif
#ifndef CALLBACK
#define MAYA_CALLBACK_DEFINED
#define CALLBACK __stdcall
#endif
#ifndef WINGDIAPI
#define MAYA_WINGDIAPI_DEFINED
#define WINGDIAPI __declspec(dllimport)
#endif
#ifndef QT_WINDOWS_H
#define QT_WINDOWS_H // No need for windows.h
#endif
#endif
#include <QtGui/qopenglextrafunctions.h>
#include <Cg/cg.h>
#define kMaxDrawInstancedSize 100
namespace Graphics
{
class Shader : public QOpenGLExtraFunctions
{
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