DragonNest/Common/EternityEngine/EtRTTRenderer.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

277 lines
7.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 );
}
}