DragonNest/Common/EternityEngine/HighResolutionCapture.cpp

139 lines
9 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "HighResolutionCapture.h"
#include <shellapi.h>
#include <Shlwapi.h>
#include "shlobj.h"
#include <time.h>
#include <Direct.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CHighResolutionCapture::CHighResolutionCapture()
: m_bCapture( false )
, m_pColorAdjFilter( NULL )
, m_dwClearColor( 0xFF000000 )
, m_fTempAspectRatio( 0.0f )
{
}
CHighResolutionCapture::~CHighResolutionCapture()
{
SAFE_DELETE( m_pColorAdjFilter );
}
void CHighResolutionCapture::Capture( const char *szFilePrefix, int nWidth, int nHeight )
{
if( !m_pColorAdjFilter )
{
// 8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>8<EFBFBD>@<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_pColorAdjFilter = (CEtColorAdjustTexFilter*)EternityEngine::CreateFilter( SF_COLORADJUSTTEX );
m_pColorAdjFilter->SetParam( EtVector4(-0.071f, -0.107f, -0.107f, 0.0f), EtVector4(0.25f, 0.286f, 0.357f, 0.0f), EtVector4(0.357f, 0.357f, 0.536f, 0.0f), 0.9f );
m_pColorAdjFilter->Enable( false );
}
if( m_bCapture )
return;
if( nWidth <= 0 || nWidth == INT_MAX ) nWidth = GetEtDevice()->GetMaxTextureWidth();
if( nHeight <= 0 || nHeight == INT_MAX ) nHeight = GetEtDevice()->GetMaxTextureHeight();
// D<EFBFBD><EFBFBD>$<EFBFBD>t<EFBFBD>ܴ T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8<EFBFBD><EFBFBD>x<EFBFBD><EFBFBD>.. ˜<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD>@<EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD>Ŕ<EFBFBD>p<EFBFBD> Save`<EFBFBD>L<EFBFBD> D<EFBFBD><EFBFBD><EFBFBD>$<EFBFBD> <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD>\<EFBFBD> x<EFBFBD><EFBFBD><EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>.
if( nWidth > 7200 ) nWidth = 7200;
if( nHeight > 7200 ) nHeight = 7200;
m_hRenderTarget = CEtTexture::CreateRenderTargetTexture( nWidth, nHeight, FMT_X8R8G8B8 );
m_hDepthTarget = CEtDepth::CreateDepthStencil( nWidth, nHeight, FMT_D24S8 );
m_hTempTarget = CEtTexture::CreateRenderTargetTexture( nWidth, nHeight, FMT_X8R8G8B8 );
m_szFilePrefix = szFilePrefix;
// 1<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x0<<EFBFBD>\<EFBFBD> tЬ<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> L<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>T<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD>а<EFBFBD><EFBFBD> <EFBFBD>ƭ<EFBFBD>t<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FMT_A8R8G8B8\<EFBFBD> <EFBFBD>П<EFBFBD> $<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD>Ќ<EFBFBD> <EFBFBD><EFBFBD>T<EFBFBD>Ȳ,
// L<EFBFBD> <EFBFBD> <EFBFBD>T<EFBFBD>`<EFBFBD>L<EFBFBD> <EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> L<EFBFBD> <EFBFBD> 0<EFBFBD>]<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>t<EFBFBD> t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>$<EFBFBD><EFBFBD>ɔ<EFBFBD> a|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD>]<EFBFBD>)
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>,҅<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ̔<EFBFBD> L<EFBFBD> Ӏ<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> a<EFBFBD>t<EFBFBD> 255<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD><EFBFBD>ɔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// D<EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>ij <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> X8R8G8B8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>$<EFBFBD><EFBFBD>ɔ<EFBFBD>x<EFBFBD> 0<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> P<EFBFBD>t<EFBFBD>T<EFBFBD>|<EFBFBD> /<EFBFBD>D<EFBFBD><EFBFBD>ij <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// D3DRS_SEPARATEALPHABLENDENABLE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>T<EFBFBD>|<EFBFBD>ij <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> L<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>)<EFBFBD> `<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> T<EFBFBD>T<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> )<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD>Ŵ<EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>,҅<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij]<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD>T<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>t<EFBFBD><EFBFBD> L<EFBFBD> <EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>$<EFBFBD>X<EFBFBD>p<EFBFBD> <EFBFBD>Ǵ<EFBFBD><EFBFBD> <EFBFBD>ǻ<EFBFBD><EFBFBD>p<EFBFBD> <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>.
m_bCapture = true;
}
void CHighResolutionCapture::BeginCapture()
{
if( !m_bCapture ) return;
EtCameraHandle hCamera = CEtCamera::GetActiveCamera();
if( hCamera )
{
m_fTempAspectRatio = hCamera->GetAspectRatio();
hCamera->SetAspectRatio( (float)m_hRenderTarget->Width() / (float)m_hRenderTarget->Height() );
}
GetEtDevice()->SetRenderTarget( m_hRenderTarget->GetSurfaceLevel() );
GetEtDevice()->SetDepthStencilSurface( m_hDepthTarget->GetDepthBuffer() );
GetEtDevice()->ClearBuffer( m_dwClearColor, 1.0f, 0 );
}
void CHighResolutionCapture::EndCapture()
{
if( !m_bCapture ) return;
GetEtDevice()->RestoreDepthStencil();
GetEtDevice()->RestoreRenderTarget();
EtCameraHandle hCamera = CEtCamera::GetActiveCamera();
if( hCamera )
{
hCamera->SetAspectRatio( m_fTempAspectRatio );
}
if( m_pColorAdjFilter && 0 )
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˜<EFBFBD><EFBFBD><EFBFBD> ֬<EFBFBD> RTT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>
m_hTempTarget->Copy( m_hRenderTarget );
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ĕ<EFBFBD>x<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD>|<EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
float fSat = 0.f;
fSat = m_pColorAdjFilter->GetSceneSaturation();
m_pColorAdjFilter->SetSceneSaturation( 1.0f );
bool bEnableZ = GetEtDevice()->EnableZ( false );
bool bAlphaEnable = GetEtDevice()->EnableAlphaBlend( true );
GetEtDevice()->SetDepthStencilSurface( NULL );
m_pColorAdjFilter->SetTexture( m_hTempTarget->GetMyIndex() );
m_pColorAdjFilter->DrawFilter( m_hRenderTarget, 1, EtVector2(0, 0), EtVector2(1, 1) , true );
GetEtDevice()->RestoreRenderTarget();
GetEtDevice()->RestoreDepthStencil();
GetEtDevice()->EnableZ( bEnableZ );
GetEtDevice()->EnableAlphaBlend( bAlphaEnable );
m_pColorAdjFilter->SetSceneSaturation( fSat );
}
char szPath[MAX_PATH]={0,};
SHGetSpecialFolderPath(GetEtDevice()->GetHWnd(), szPath, CSIDL_PERSONAL, 0);
__time64_t ltime;
char szBuf[256] = { 0, }, szFile[256] = { 0, };
struct tm *tm_ptr;
time(&ltime);
tm_ptr = localtime(&ltime);
strftime(szBuf, 256, "%Y-%m-%d %H-%M-%S %a", tm_ptr);
sprintf(szFile, "%s %s.tga", m_szFilePrefix.c_str(), szBuf);
char szResultName[MAX_PATH] = { 0, };
sprintf( szResultName, "%s\\ToolScreenshot", szPath );
if( !PathFileExists( szResultName ) ) _mkdir( szResultName );
sprintf( szResultName, "%s\\ToolScreenshot\\%s", szPath, szFile );
HRESULT hr = D3DXSaveSurfaceToFile( szResultName, D3DXIFF_TGA, m_hRenderTarget->GetSurfaceLevel(), NULL, NULL );
SAFE_RELEASE_SPTR( m_hRenderTarget );
SAFE_RELEASE_SPTR( m_hDepthTarget );
SAFE_RELEASE_SPTR( m_hTempTarget );
m_bCapture = false;
}