277 lines
7.3 KiB
C++
277 lines
7.3 KiB
C++
#include "StdAfx.h"
|
||
#include "EtRTTRenderer.h"
|
||
#include "EtBackBufferMng.h"
|
||
#include "EtDrawQuad.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
|
||
#endif
|
||
|
||
DECL_SMART_PTR_STATIC( CEtRTTRenderer, 200 )
|
||
|
||
CEtRTTRenderer::CEtRTTRenderer(void)
|
||
{
|
||
m_nWidth = -1;
|
||
m_nHeight = -1;
|
||
m_Format = FMT_A8B8G8R8;
|
||
m_nRenderFrameCount = 0;
|
||
m_bRenderChild = true;
|
||
}
|
||
|
||
CEtRTTRenderer::~CEtRTTRenderer(void)
|
||
{
|
||
SAFE_RELEASE_SPTR( m_hCamera );
|
||
SAFE_RELEASE_SPTR( m_hRenderTarget );
|
||
SAFE_RELEASE_SPTR( m_hDepthTarget );
|
||
ClearRenderObject();
|
||
}
|
||
|
||
void CEtRTTRenderer::Initialize( SCameraInfo &CameraInfo, int nWidth, int nHeight, int nViewPortWidth, int nViewPortHeight, EtFormat Format )
|
||
{
|
||
m_nWidth = nWidth;
|
||
m_nHeight = nHeight;
|
||
m_Format = Format;
|
||
|
||
m_hRenderTarget = CEtTexture::CreateRenderTargetTexture( m_nWidth, m_nHeight, m_Format );
|
||
m_hDepthTarget = CEtDepth::CreateDepthStencil( m_nWidth, m_nHeight, FMT_D24S8 );//, GetEtDevice()->GetSupportedAAType() );
|
||
|
||
CameraInfo.Target = CT_RENDERTARGET_NO_GENERATE_BACKBUFFER;
|
||
if( ( nViewPortWidth == -1 ) || ( nViewPortHeight == -1 ) )
|
||
{
|
||
CameraInfo.fWidth = ( float )m_nWidth;
|
||
CameraInfo.fHeight = ( float )m_nHeight;
|
||
}
|
||
else
|
||
{
|
||
CameraInfo.fViewWidth = ( float )nViewPortWidth;
|
||
CameraInfo.fViewHeight = ( float )nViewPortHeight;
|
||
}
|
||
m_hCamera = EternityEngine::CreateCamera( &CameraInfo );
|
||
}
|
||
|
||
void CEtRTTRenderer::InitCamera( SCameraInfo &CameraInfo )
|
||
{
|
||
CameraInfo.Target = CT_RENDERTARGET_NO_GENERATE_BACKBUFFER;
|
||
CameraInfo.fWidth = ( float )m_nWidth;
|
||
CameraInfo.fHeight = ( float )m_nHeight;
|
||
m_hCamera->Initialize( &CameraInfo );
|
||
}
|
||
|
||
void CEtRTTRenderer::ClearRenderObject()
|
||
{
|
||
SAFE_RELEASE_SPTRVEC( m_vecEffectObject );
|
||
SAFE_RELEASE_SPTRVEC( m_vecParticle );
|
||
int i;
|
||
for( i = 0; i < ( int )m_vecObject.size(); i++ )
|
||
{
|
||
if( m_vecObject[ i ].bDelete )
|
||
{
|
||
SAFE_RELEASE_SPTR( m_vecObject[ i ].hHandle );
|
||
}
|
||
}
|
||
m_vecObject.clear();
|
||
}
|
||
|
||
EtObjectHandle CEtRTTRenderer::CreateStaticObject( const char *pSkinName )
|
||
{
|
||
EtObjectHandle hObject = EternityEngine::CreateStaticObject( pSkinName, false );
|
||
if( hObject )
|
||
{
|
||
SRTTObject RTTObject;
|
||
RTTObject.hHandle = hObject;
|
||
RTTObject.bDelete = true;
|
||
m_vecObject.push_back( RTTObject );
|
||
hObject->SetRenderType( RT_TARGET );
|
||
}
|
||
|
||
return hObject;
|
||
}
|
||
|
||
EtAniObjectHandle CEtRTTRenderer::CreateAniObject( const char *pSkinName, const char *pAniName )
|
||
{
|
||
EtAniObjectHandle hObject = EternityEngine::CreateAniObject( pSkinName, pAniName, false );
|
||
if( hObject )
|
||
{
|
||
SRTTObject RTTObject;
|
||
RTTObject.hHandle = hObject;
|
||
RTTObject.bDelete = true;
|
||
m_vecObject.push_back( RTTObject );
|
||
hObject->SetRenderType( RT_TARGET );
|
||
}
|
||
|
||
return hObject;
|
||
}
|
||
|
||
EtAniObjectHandle CEtRTTRenderer::CreateAniObject( EtSkinHandle hSkin, const char *pAniName )
|
||
{
|
||
EtAniObjectHandle hObject = EternityEngine::CreateAniObject( hSkin, pAniName, false );
|
||
if( hObject )
|
||
{
|
||
SRTTObject RTTObject;
|
||
RTTObject.hHandle = hObject;
|
||
RTTObject.bDelete = true;
|
||
m_vecObject.push_back( RTTObject );
|
||
hObject->SetRenderType( RT_TARGET );
|
||
}
|
||
|
||
return hObject;
|
||
}
|
||
|
||
void CEtRTTRenderer::AddObject( EtObjectHandle hObject, bool bAutoDelete )
|
||
{
|
||
if( hObject )
|
||
{
|
||
SRTTObject RTTObject;
|
||
RTTObject.hHandle = hObject;
|
||
RTTObject.bDelete = bAutoDelete;
|
||
m_vecObject.push_back( RTTObject );
|
||
// <20>ܺο<DCBA><CEBF><EFBFBD> Add<64><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ٸ<EFBFBD><D9B8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> RT_TARGET<45><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>..
|
||
// hObject->SetRenderType( RT_TARGET );
|
||
}
|
||
}
|
||
|
||
EtBillboardEffectHandle CEtRTTRenderer::CreateBillboardEffect( int nParticleDataIndex, EtMatrix *pWorldMat, bool bReuseParticleInstance)
|
||
{
|
||
EtBillboardEffectHandle hParticle = EternityEngine::CreateBillboardEffect( nParticleDataIndex, pWorldMat, bReuseParticleInstance );
|
||
if( hParticle )
|
||
{
|
||
m_vecParticle.push_back( hParticle );
|
||
hParticle->SetRenderType( RT_TARGET );
|
||
}
|
||
|
||
return hParticle;
|
||
}
|
||
|
||
EtEffectObjectHandle CEtRTTRenderer::CreateEffectObject( int nEffectDataIndex, EtMatrix *pWorldMat )
|
||
{
|
||
EtEffectObjectHandle hEffectObject = EternityEngine::CreateEffectObject( nEffectDataIndex, pWorldMat );
|
||
if( hEffectObject )
|
||
{
|
||
m_vecEffectObject.push_back( hEffectObject );
|
||
hEffectObject->SetRenderType( RT_TARGET );
|
||
}
|
||
|
||
return hEffectObject;
|
||
}
|
||
|
||
void CEtRTTRenderer::InitRenderObject()
|
||
{
|
||
for( DWORD itr = 0; itr < m_vecObject.size(); ++itr )
|
||
{
|
||
if( m_vecObject[ itr ].hHandle )
|
||
m_vecObject[ itr ].hHandle->InitRender();
|
||
}
|
||
}
|
||
|
||
void CEtRTTRenderer::BeginRTT()
|
||
{
|
||
m_hCamera->Activate();
|
||
GetEtDevice()->SetRenderTarget( m_hRenderTarget->GetSurfaceLevel() );
|
||
GetEtDevice()->SetDepthStencilSurface( m_hDepthTarget->GetDepthBuffer() );
|
||
GetEtDevice()->ClearBuffer( 0x0, 1.0f, 0, true, true, false );
|
||
|
||
// <20><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD>
|
||
// GetEtBackBufferMng()->DumpBackBuffer();
|
||
// DrawQuadWithTex( &EtVector2( 0.f, 0.f ), &EtVector2( 1.f, 1.f ), &EtVector2( 0.f, 0.f ), &EtVector2( 1.f, 1.f ),
|
||
// GetEtBackBufferMng()->GetBackBuffer()->GetTexturePtr() , 1.0f );
|
||
|
||
}
|
||
|
||
void CEtRTTRenderer::Render( float fElapsedTime )
|
||
{
|
||
EtViewPort OldViewPort;
|
||
GetEtDevice()->GetViewport( &OldViewPort );
|
||
BeginRTT();
|
||
RenderRTT( fElapsedTime );
|
||
EndRTT();
|
||
if( m_nRenderFrameCount > 0 )
|
||
{
|
||
m_nRenderFrameCount--;
|
||
if( m_nRenderFrameCount <= 0 )
|
||
{
|
||
ClearRenderObject();
|
||
}
|
||
}
|
||
GetEtDevice()->SetViewport( &OldViewPort );
|
||
}
|
||
|
||
void CEtRTTRenderer::EndRTT()
|
||
{
|
||
GetEtDevice()->RestoreDepthStencil();
|
||
GetEtDevice()->RestoreRenderTarget();
|
||
}
|
||
|
||
void CEtRTTRenderer::RenderRTT( float fElapsedTime )
|
||
{
|
||
int i;
|
||
|
||
for( i = 0; i < ( int )m_vecObject.size(); i++ )
|
||
{
|
||
if( m_vecObject[ i ].hHandle )
|
||
m_vecObject[ i ].hHandle->RenderImmediate( m_bRenderChild );
|
||
}
|
||
|
||
// 0x0<78><30> <20><EFBFBD><D7B8>°ű<C5B1><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD>İ<EFBFBD><C4B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>︰<EFBFBD><EFB8B0>.(SrcAlpha-InvSrcAlpha<68><61><EFBFBD><EFBFBD> <20>̰<EFBFBD> <20><> <20><> <20><><EFBFBD>̰<EFBFBD> <20>ȴ<EFBFBD>.)
|
||
// <20><EFBFBD><D7B7><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ĸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
// D3DBLENDOP_MAX <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20>ȼ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ĸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> One-One <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>帮<EFBFBD><EFBFBD><E2B6A7><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
||
bool bAlphaBlend = GetEtDevice()->EnableAlphaBlend( true );
|
||
GetEtDevice()->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, TRUE );
|
||
GetEtDevice()->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
|
||
GetEtDevice()->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ONE );
|
||
bool bZWrite = GetEtDevice()->EnableZWrite( false );
|
||
|
||
// <20>Ϲ<EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>θ<D7B5> <20>Ⱥ<EFBFBD><C8BA><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>.
|
||
// <20>̰ͱ<CCB0><CDB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD> <20>Ʒ<EFBFBD> <20><><EFBFBD>İ<EFBFBD>ü<EFBFBD><C3BC> <20><EFBFBD><D7B8><EFBFBD> <20>Ÿ<EFBFBD> <20><> <20>ͺ<EFBFBD><CDBA><EFBFBD> <20><EFBFBD><D7B8><EFBFBD> <20>ȴ<EFBFBD>.
|
||
for( i = 0; i < ( int )m_vecObject.size(); i++ )
|
||
{
|
||
if( m_vecObject[ i ].hHandle )
|
||
{
|
||
m_vecObject[ i ].hHandle->RenderAlphaImmediate( m_bRenderChild );
|
||
}
|
||
}
|
||
|
||
for( i = 0; i < ( int )m_vecEffectObject.size(); i++ )
|
||
{
|
||
if( m_vecEffectObject[ i ] )
|
||
{
|
||
m_vecEffectObject[ i ]->RenderImmediate( fElapsedTime );
|
||
}
|
||
}
|
||
|
||
for( i = 0; i < ( int )m_vecParticle.size(); i++ )
|
||
{
|
||
if( m_vecParticle[ i ] )
|
||
{
|
||
m_vecParticle[ i ]->RenderImmediate();
|
||
}
|
||
}
|
||
|
||
GetEtDevice()->EnableZWrite( bZWrite );
|
||
|
||
GetEtDevice()->EnableAlphaBlend( bAlphaBlend );
|
||
GetEtDevice()->SetRenderState( D3DRS_SEPARATEALPHABLENDENABLE, FALSE );
|
||
GetEtDevice()->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
|
||
GetEtDevice()->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO );
|
||
}
|
||
|
||
void CEtRTTRenderer::RenderRTTList( float fElapsedTime )
|
||
{
|
||
ScopeLock<CSyncLock> Lock( s_SmartPtrLock );
|
||
|
||
int i, nCount;
|
||
|
||
nCount = GetItemCount();
|
||
for( i = 0; i < nCount; i++ )
|
||
{
|
||
EtRTTHandle hHandle = GetItem( i );
|
||
if( !hHandle )
|
||
{
|
||
continue;
|
||
}
|
||
if( hHandle->m_nRenderFrameCount == 0 )
|
||
{
|
||
continue;
|
||
}
|
||
hHandle->Render( fElapsedTime );
|
||
}
|
||
}
|