#include "ShadowMapping_shader.h"
#include <math.h>
#define SHADOWMAPPING__CLASS SHADOWMAPPING__CLASSNAME
#define SHADOWMAPPING__DESC "Shadow Mapping Plugin" // This is what shows up in the shader window ...
SHADOWMAPPING__CLASS,
SHADOWMAPPING__DESCSTR,
SHADOWMAPPING__DESC,
bool ShadowMapping::mbShadowPass(false);
bool ShadowMapping::FBCreate()
{
return true;
}
void ShadowMapping::FBDestroy()
{
delete mpShadowShader;
}
bool ShadowMapping::ShaderNeedBeginRender()
{
return true;
}
void ShadowMapping::ShaderBeginRender( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo )
{
}
void ShadowMapping::ShadeModel( FBRenderOptions* pRenderOptions, FBShaderModelInfo* pShaderModelInfo,
FBRenderingPass pPass )
{
if ( !mpShadowShader )
{
FBSystem lSystem;
FBString lVertexShader;
lVertexShader = lSystem.ApplicationPath ;
FBString lPixelShader;
lPixelShader = lSystem.ApplicationPath ;
FBString lProjVertexShader;
lProjVertexShader = lSystem.ApplicationPath ;
#ifdef _MB_INTERNAL
lVertexShader += "\\..\\system\\shaders\\ShadowMapVS.cg";
lPixelShader += "\\..\\system\\shaders\\ShadowMapPS.cg";
lProjVertexShader += "\\..\\system\\shaders\\ShadowProjVS.cg";
#else
lVertexShader += "\\plugins\\ShadowMapVS.cg";
lPixelShader += "\\plugins\\ShadowMapPS.cg";
lProjVertexShader += "\\plugins\\ShadowProjVS.cg";
#endif
mpShadowShader = new Graphics::ShadowMappingShader();
if( !mpShadowShader->Initialize(lVertexShader, lPixelShader, lProjVertexShader) )
{
return;
}
}
if( pShaderModelInfo !=
NULL )
{
FBModelVertexData* lModelVertexData = pShaderModelInfo->GetFBModel()->ModelVertexData;
if (lModelVertexData)
{
const int lSubRegionCount = lModelVertexData->GetSubRegionCount();
if (lSubRegionCount)
{
mpShadowShader->BeginShading(pRenderOptions,
NULL);
mpShadowShader->BeginShadowPass( pRenderOptions, pShaderModelInfo, pPass );
lModelVertexData->EnableOGLVertexData();
for (int lSubRegionIndex = 0; lSubRegionIndex < lSubRegionCount; lSubRegionIndex++)
{
FBMaterial* lMaterial = lModelVertexData->GetSubRegionMaterial(lSubRegionIndex);
mpShadowShader->SwitchMaterial(pRenderOptions, pShaderModelInfo, lMaterial, 1.0);
lModelVertexData->DrawSubRegion(lSubRegionIndex);
}
mpShadowShader->SwitchMaterial(pRenderOptions, pShaderModelInfo,
NULL, 1.0);
lModelVertexData->DisableOGLVertexData();
mpShadowShader->EndShadowPass();
mpShadowShader->EndShading();
}
}
}
}