DragonNest/Common/EternityEngine/EtGaussianFilter.cpp

79 lines
2.2 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "EtGaussianFilter.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
std::vector< CEtGaussianFilter::STempRenderTarget > CEtGaussianFilter::s_vecTempRenderTarget;
CEtGaussianFilter::CEtGaussianFilter()
{
m_nTexParamIndex = -1;
m_nBlurRadiusIndex = 0;
}
CEtGaussianFilter::~CEtGaussianFilter()
{
Clear();
}
void CEtGaussianFilter::Clear()
{
SAFE_RELEASE_SPTR( m_hCurRenderTarget );
CEtPostProcessFilter::Clear();
}
void CEtGaussianFilter::Initialize()
{
Clear();
m_hMaterial = LoadResource( "GaussianFilter.fx", RT_SHADER );
if( !m_hMaterial ) return;
int nTexIndex = -1;
m_nTexParamIndex = AddCustomParam( m_vecCustomParam, EPT_TEX, m_hMaterial, "g_GaussianSource", &nTexIndex );
m_nBlurRadiusIndex = AddCustomParam( m_vecCustomParam, EPT_VECTOR_PTR, m_hMaterial, "g_fBlurRadius", &m_vBlurRadius );
}
void CEtGaussianFilter::CreateRenderTarget( int nWidth, int nHeight )
{
int i;
SAFE_RELEASE_SPTR( m_hCurRenderTarget );
for( i = 0; i < ( int )s_vecTempRenderTarget.size(); i++ )
{
if( ( s_vecTempRenderTarget[ i ].nWidth == nWidth ) && ( s_vecTempRenderTarget[ i ].nHeight == nHeight ) )
{
m_hCurRenderTarget = s_vecTempRenderTarget[ i ].hRenderTarget;
m_hCurRenderTarget->AddRef();
return;
}
}
EtTextureHandle hTexture;
STempRenderTarget TempRenderTarget;
hTexture = CEtTexture::CreateRenderTargetTexture( nWidth, nHeight );
TempRenderTarget.nWidth = nWidth;
TempRenderTarget.nHeight = nHeight;
TempRenderTarget.hRenderTarget = hTexture;
s_vecTempRenderTarget.push_back( TempRenderTarget );
m_hCurRenderTarget = hTexture;
}
void CEtGaussianFilter::RenderGaussianFilter( CEtTexture *pSourTex, CEtTexture *pTargetTex, float fBlurSize )
{
if( !m_hCurRenderTarget )
{
CreateRenderTarget( pTargetTex->Width(), pTargetTex->Height() );
}
m_vBlurRadius.x = fBlurSize / 1024.0f;
m_vBlurRadius.y = m_vBlurRadius.x * ( GetEtDevice()->Width() / ( float )GetEtDevice()->Height() );
m_vecCustomParam[ m_nTexParamIndex ].nTextureIndex = pSourTex->GetMyIndex();
DrawFilter( m_hCurRenderTarget, 0 );
m_vecCustomParam[ m_nTexParamIndex ].nTextureIndex = m_hCurRenderTarget->GetMyIndex();
DrawFilter( pTargetTex->GetMySmartPtr(), 1 );
}