2024-12-21 10:04:04 +08:00
|
|
|
|
#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 )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̺첨 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><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();
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ī<EFBFBD><C4AB> <20><EFBFBD><DEB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD>.. <20>ؽ<EFBFBD>ó <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD> Save<76>Ҷ<EFBFBD> <20>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8><F0B8AEB6><EFBFBD> <20>ִ<EFBFBD>ġ <20><><EFBFBD><EFBFBD> <20>ɾ<EFBFBD><C9BE>д<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;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD> <20>÷<EFBFBD><C3B7><EFBFBD> 0x0<78><30><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֳİ<D6B3> <20><>û<EFBFBD><C3BB> <20>Ծ<EFBFBD><D4BE><EFBFBD>.
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD> FMT_A8R8G8B8<42><38> Ÿ<><C5B8> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE> <20>⺻ <20>״<EFBFBD><D7B4><EFBFBD> Ÿ<><C5B8> <20>ߴ<EFBFBD><DFB4><EFBFBD>,
|
|
|
|
|
|
// <20><><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD>Ҷ<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>κп<CEBA><D0BF><EFBFBD> a<><61><EFBFBD><EFBFBD> <20>̻<EFBFBD><CCBB>ϰ<EFBFBD> <20><><EFBFBD>ϵǾ<CFB5><C7BE><EFBFBD>.(<28><><EFBFBD>߿<EFBFBD> <20><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> a<><61> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
|
|
|
|
|
|
// <20><EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ĺκ<C4BA><CEBA><EFBFBD> a<><61><EFBFBD><EFBFBD> 255<35><35><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DFBB>ߴ<EFBFBD>.
|
|
|
|
|
|
// <20>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE> X8R8G8B8<42><38> <20><EFBFBD><D7B7><EFBFBD><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD><DBBC>Ǽ<EFBFBD> <20><EFBFBD><D7B7><EFBFBD>..
|
|
|
|
|
|
// <20><EFBFBD><D7B7>ٰ<EFBFBD> <20><><EFBFBD>̴<EFBFBD><CCB4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>,
|
|
|
|
|
|
// D3DRS_SEPARATEALPHABLENDENABLE<4C><45><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF>ٸ<EFBFBD> <20><EFBFBD><D7B8><EFBFBD><EFBFBD><EFBFBD> <20>ߴ<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ鼭 <20><><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD>ۿ<EFBFBD> <20><EFBFBD><D7B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>߸<EFBFBD><DFB8>Ȱ<EFBFBD> <20><><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 )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ӽ<EFBFBD><D3BD>ؽ<EFBFBD>ó<EFBFBD><C3B3> <20><><EFBFBD><EFBFBD> RTT <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|
|
|
|
|
m_hTempTarget->Copy( m_hRenderTarget );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°ɷ<C2B0> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><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(<ime);
|
|
|
|
|
|
tm_ptr = localtime(<ime);
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|