#ifndef SHADOWMAPPINGSHADER_H
#define SHADOWMAPPINGSHADER_H
#include <Shader.h>
#include <Cg/cg.h>
namespace Graphics
{
class ShadowMappingShader : public Shader
{
public:
ShadowMappingShader();
virtual ~ShadowMappingShader();
virtual bool Initialize(const char* pVertexShaderPath, const char* pPixelShaderPath, const char* pShadowShaderPath);
void BeginShading(FBRenderOptions* pRenderOptions, FBArrayTemplate<FBLight*>* pAffectingLightList);
void EndShading();
void ShaderPassModelDraw ( FBRenderOptions* pRenderOptions,
FBRenderingPass pPass, FBShaderModelInfo* pInfo );
bool RenderShadowMaps( int pShadowMapSize, FBRenderOptions* pRenderOptions, double pOffsetScale, double pOffsetBias, FBArrayTemplate<FBLight*>* pAffectingLightList, FBArrayTemplate<FBModel*>* pShadowCasters );
void SetShadowPCFKernelSize( int pShadowPCFKernelSize );
void SetShadowStrength( float pShadowStrength );
protected:
bool InitializeBuffers( int pShadowMapSize, FBArrayTemplate<FBLight*>* pAffectingLightList );
bool InitializeBuffer( int pIndex, int pShadowMapSize );
bool UninitializeBuffers();
bool UninitializeBuffer( int pIndex );
void BindShadowPrograms();
void UnbindShadowPrograms();
void UploadParameters( FBRenderOptions* pRenderOptions, FBArrayTemplate<FBLight*>* pAffectingLightList =
NULL);
void UploadShadowParameters( int pLightIndex, FBRenderOptions* pRenderOptions );
void UnsetTextures();
void SaveFrameBuffer();
void RestoreFrameBuffer();
void RenderShadowModels( FBArrayTemplate<FBModel*>* pShadowCasters );
void RenderShadowModel( FBModel* pModel );
bool ComputeLightMatrices( FBLight* pLight, FBMatrix& pLightView, FBMatrix& pLightProj );
bool ComputeSpotLightMatrices( FBLight* pLight, FBMatrix& pLightView, FBMatrix& pLightProj );
bool ComputeInfiniteLightMatrices( FBLight* pLight, FBMatrix& pLightView, FBMatrix& pLightProj );
void ComputeWorldBounds();
void ComputeWorldBounds( FBModel* pModel, bool pRecursive = true );
void GetWorldBounds( FBLight* pLight,
double& pRadius,
FBVector4d& pPos );
private:
#define MAX_DRAW_BUFFERS 10
GLenum mDrawBuffers[MAX_DRAW_BUFFERS];
GLint mMaxDrawBuffers;
GLint mLastFramebuffer;
GLuint mFrameBuffer[kMaxLight];
GLuint mDepthRenderBuffer[kMaxLight];
GLuint mShadowMap[kMaxLight];
int mShadowMapSize[kMaxLight];
int mShadowPCFKernelSize;
float mShadowStrength;
CGprogram mShadowProjVertexShader;
CGparameter mParamShadowProjModel;
CGparameter mParamShadowProjViewProjection;
CGparameter mParamShadowMVP[kMaxLight];
CGparameter mParamShadowMap[kMaxLight];
CGparameter mParamShadowMapSize[kMaxLight];
CGparameter mParamShadowPCFKernelSize;
CGparameter mParamShadowStrength;
int mShadowCaster[kMaxLight];
FBMatrix mLightViewMatrix[kMaxLight];
FBMatrix mLightProjMatrix[kMaxLight];
bool mUseHardwarePCF;
};
}
#endif // SHADOWMAPPINGSHADER_H