85 lines
2.5 KiB
C++
85 lines
2.5 KiB
C++
#include "StdAfx.h"
|
|
#include "EtBackBufferMng.h"
|
|
#include "EtMRTMng.h"
|
|
#include "EtDrawQuad.h"
|
|
#include "EtLightShaftFilter.h"
|
|
|
|
CEtLightShaftFilter::CEtLightShaftFilter()
|
|
{
|
|
m_vSunPosition = EtVector2( 0.5f, 0.5f );
|
|
}
|
|
|
|
CEtLightShaftFilter::~CEtLightShaftFilter()
|
|
{
|
|
SAFE_RELEASE_SPTR( m_hLightShaftSour );
|
|
SAFE_RELEASE_SPTR( m_hLightShaftDest );
|
|
}
|
|
|
|
void CEtLightShaftFilter::Initialize()
|
|
{
|
|
Clear();
|
|
|
|
m_hMaterial = LoadResource( "LightShaftFilter.fx", RT_SHADER );
|
|
if( !m_hMaterial ) return;
|
|
m_hLightShaftSour = AddRenderTarget( -4, -4, "g_LightShaftSourBuffer" );
|
|
m_hLightShaftDest = AddRenderTarget( -4, -4, "g_LightShaftDestBuffer" );
|
|
|
|
int nTexIndex = GetEtBackBufferMng()->GetBackBufferIndex();
|
|
AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_BackBuffer", &nTexIndex );
|
|
nTexIndex = CEtMRTMng::GetInstance().GetDepthTarget()->GetMyIndex();
|
|
AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_DepthTex", &nTexIndex );
|
|
}
|
|
|
|
void CEtLightShaftFilter::Render( float fElapsedTime )
|
|
{
|
|
CEtPostProcessFilter::DrawFilter( m_hLightShaftSour, 2, EtVector2( 0.0f, 0.0f ), EtVector2( 1.0f, 1.0f ), true );
|
|
int i;
|
|
float fSize = 0.4f;
|
|
for( i = 0; i < 6; i++ )
|
|
{
|
|
EtVector2 vStart, vEnd, vOffset;
|
|
|
|
vStart.x = -fSize;
|
|
vStart.y = -fSize;
|
|
vEnd.x = fSize + 1.0f;
|
|
vEnd.y = fSize + 1.0f;
|
|
vOffset = EtVector2( 0.5f, 0.5f ) - m_vSunPosition;
|
|
vOffset *= fSize;
|
|
vStart += vOffset;
|
|
vEnd += vOffset;
|
|
fSize *= 0.5f;
|
|
|
|
CEtPostProcessFilter::DrawFilter( m_hLightShaftDest, 0 );
|
|
bool bEnableAlphaBlend = GetEtDevice()->EnableAlphaBlend( true );
|
|
DrawFilter( m_hLightShaftSour, 1, vStart, vEnd, EtVector2( 0.0f, 0.0f ), EtVector2( 1.0f, 1.0f ) );
|
|
GetEtDevice()->EnableAlphaBlend( bEnableAlphaBlend );
|
|
}
|
|
bool bEnableAlphaBlend = GetEtDevice()->EnableAlphaBlend( true );
|
|
CEtPostProcessFilter::DrawFilter( CEtTexture::Identity(), 3 );
|
|
GetEtDevice()->EnableAlphaBlend( bEnableAlphaBlend );
|
|
}
|
|
|
|
void CEtLightShaftFilter::DrawFilter( EtTextureHandle hTarget, int nTechnique, EtVector2 vStart, EtVector2 vEnd, EtVector2 vStartUV, EtVector2 vEndUV )
|
|
{
|
|
if( hTarget )
|
|
{
|
|
GetEtDevice()->SetRenderTarget( hTarget->GetSurfaceLevel() );
|
|
}
|
|
else
|
|
{
|
|
GetEtDevice()->RestoreRenderTarget();
|
|
}
|
|
|
|
int nPasses = 0;
|
|
if( !m_hMaterial )
|
|
return;
|
|
m_hMaterial->SetTechnique( nTechnique );
|
|
m_hMaterial->BeginEffect( nPasses );
|
|
m_hMaterial->BeginPass( 0 );
|
|
m_hMaterial->SetCustomParamList( m_vecCustomParam );
|
|
m_hMaterial->CommitChanges();
|
|
GetEtDevice()->SetVertexShader( NULL );
|
|
DrawQuad( &vStart, &vEnd, &vStartUV, &vEndUV );
|
|
m_hMaterial->EndPass();
|
|
m_hMaterial->EndEffect();
|
|
}
|