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

362 lines
No EOL
8.8 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 "EtEngine.h"
#include "EtObject.h"
#include "EtLight.h"
#include "EtTerrainArea.h"
#include "EtCamera.h"
#include "EtSaveMat.h"
#include "EtConvexVolume.h"
#include "EtBillboardEffect.h"
#include "EtShadowMap.h"
#include "EtBackBufferMng.h"
#include "EtPrimitiveDraw.h"
#include "EtOptionController.h"
#include "EtBaseEffect.h"
#include "EtEffectObject.h"
#include "EtEffectHelper.h"
#include "EtDecal.h"
#include "EtCustomRender.h"
#include "PerfCheck.h"
#include "EtLensFlare.h"
#include "EtMRTMng.h"
#include "EtWater.h"
#include "EtTextDraw.h"
#include "EtSprite.h"
#include "EtCollisionMng.h"
#include "EtBenchMark.h"
#include "EtRTTRenderer.h"
#include "EtSkyBoxRTT.h"
#include "HighResolutionCapture.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#define SKYBOX_RTT_SIZE 256
CEtEngine g_EtEngine;
float g_fElapsedTime = 0.0f;
float g_fTotalElapsedTime = 0.0f;
bool g_bSkipScene = false;
CSyncLock *g_pEtRenderLock = NULL;
CEtBenchMark g_Benchmark;
int g_nCurFrustumMask = 0;
CEtEngine::CEtEngine()
: m_pHRC( NULL )
{
}
CEtEngine::~CEtEngine()
{
}
bool CEtEngine::Initialize( HWND hWnd, int nWidth, int nHeight, SGraphicOption &Option,
bool bWindow, bool bEnableMultiThread, bool bVSync, bool bShaderDebug )
{
if( GetEtDevice()->Initialize( hWnd, nWidth, nHeight, bWindow, bEnableMultiThread, bVSync, bShaderDebug ) != ET_OK)
{
return false;
}
CEtTextDraw *pTextDraw = new CEtTextDraw();
pTextDraw->Initialize( GetEtDevice()->Width(), GetEtDevice()->Height() );
g_pRenderStack[ 0 ] = new CEtRenderStack();
g_pRenderStack[ 1 ] = new CEtRenderStack();
GetEtOptionController()->Initialize( Option );
if( CEtSprite::CreateInstance() )
CEtSprite::GetInstance().Initialize();
if( CEtMRTMng::CreateInstance() )
CEtMRTMng::GetInstance().Initialize();
CEtCollisionMng::CreateInstance();
if( g_pEtRenderLock == NULL )
{
g_pEtRenderLock = new CSyncLock();
}
CEtLight::InitializeClass();
CEtObject::InitializeClass();
SCameraInfo CameraInfo;
if( CEtSkyBoxRTT::CreateInstance() )
CEtSkyBoxRTT::GetInstance().Initialize( CameraInfo, SKYBOX_RTT_SIZE, SKYBOX_RTT_SIZE, nWidth, nHeight );
CEtTexture::CreateDebugRes();
// char szCurDir[ _MAX_PATH ];
// GetCurrentDirectory( _MAX_PATH, szCurDir );
// CEtResourceMng::GetInstance().AddResourcePath( szCurDir );
// AddResourceDir( szCurDir );
m_pHRC = new CHighResolutionCapture();
return true;
}
void CEtEngine::Reinitialize( int nWidth, int nHeight )
{
int i;
OutputDebug("Reinitialize %d:%d\n", nWidth, nHeight);
CEtResource::FlushWaitDelete();
CLostDeviceProcess::OnLostDeviceList();
GetEtDevice()->Reinitialize( nWidth, nHeight );
ScopeLock<CSyncLock> Lock( CEtCamera::s_SmartPtrLock );
for( i = 0; i < CEtCamera::GetItemCount(); i++ )
{
CEtCamera::GetItem( i )->Reset();
}
CLostDeviceProcess::OnResetDeviceList();
}
void CEtEngine::Finalize()
{
SAFE_DELETE( m_pHRC );
GetEtDevice()->SetGammaRamp( 1.0f, 0 );
if( CEtTextDraw::GetInstancePtr() )
{
delete CEtTextDraw::GetInstancePtr();
}
if( CEtSprite::GetInstancePtr() )
{
delete CEtSprite::GetInstancePtr();
}
if( CEtMRTMng::GetInstancePtr() )
{
delete CEtMRTMng::GetInstancePtr();
}
if( CEtCollisionMng::GetInstancePtr() )
{
delete CEtCollisionMng::GetInstancePtr();
}
if( CEtSkyBoxRTT::GetInstancePtr() )
{
delete CEtSkyBoxRTT::GetInstancePtr();
}
SAFE_DELETE( g_pRenderStack[ 0 ] );
SAFE_DELETE( g_pRenderStack[ 1 ] );
// Resource <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> Object<63><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CEtObject::DeleteAllObject();
CEtEffectObject::DeleteAllObject();
CEtBillboardEffect::DeleteAllObject();
CEtDecal::DeleteAllObject();
CEtResource::FlushWaitDelete();
FinializeEffect();
DeleteShadowMap();
DeleteWaterMap();
GetEtPostProcessMng()->Clear();
CEtLight::DeleteAllObject();
CEtCamera::DeleteAllObject();
/*CEtObject::DeleteAllObject();
CEtEffectObject::DeleteAllObject();
CEtBillboardEffect::DeleteAllObject();*/
CEtMaterial::DeleteEffectPool();
CEtMaterial::DeleteCompiledShaders();
CEtTerrainArea::DeleteAllObject();
CEtBaseEffect::DeleteAllObject();
GetEtBackBufferMng()->Clear();
CEtLight::FinalizeClass();
CEtObject::FinalizeClass();
CEtPrimitiveDraw::GetInstance().Clear();
CEtTexture::ReleaseDebugRes();
SAFE_DELETE( g_pEtRenderLock );
CEtResource::FlushWaitDelete();
}
int g_nRenderFrameCount = 0;
void CEtEngine::RenderFrame( float fElapsedTime )
{
EtDeviceCheck Check;
Check = GetEtDevice()->DeviceValidCheck();
g_bSkipScene = false;
if( Check == DC_CANNOT_RESET )
{
CEtEffectObject::ProcessDeleteEffectObjectList( fElapsedTime );
CEtDecal::ProcessDeleteDecalList( fElapsedTime );
CEtBillboardEffect::ProcessDeleteBillboardEffectList( fElapsedTime );
Sleep( 10 );
g_bSkipScene = true;
return;
}
else if( Check == DC_CAN_RESET )
{
Reinitialize( GetEtDevice()->Width(), GetEtDevice()->Height() );
g_bSkipScene = true;
return;
}
if( CEtCamera::GetProcessItemCount() <= 0 )
{
g_bSkipScene = true;
return;
}
// <20>̷<EFBFBD><CCB7><EFBFBD> Lock<63>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EtResource<63><65> SmartPtrMng<6E><67> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϵǸ鼭 <20><><EFBFBD>Ϳ<EFBFBD> push_back<63>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>޸<EFBFBD><DEB8><EFBFBD> realloc<6F><63> <20>Ͼ<CFBE><EEB3AA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20>ٿ<EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20>ִ<EFBFBD>..
if( g_pEtRenderLock )
{
g_pEtRenderLock->Lock();
}
ScopeLock< CSyncLock > Lock( CEtResource::s_SmartPtrLock );
CEtTerrainArea::CheckBakeLightMap();
g_Benchmark.Process();
int i;
CEtConvexVolume Frustum;
EtObjectHandle hObject;
EtCameraHandle hCamera;
EtViewPort OldViewPort;
g_fElapsedTime = fElapsedTime;
g_fTotalElapsedTime += fElapsedTime;
CEtObject::ClearFrustumMask();
CEtDecal::ClearFrustumMask();
for( i = 0; i < CEtCamera::GetProcessItemCount(); i++ )
{
hCamera = CEtCamera::GetProcessItem( i );
if( !hCamera ) continue;
if( hCamera->GetCameraTargetType() != CT_SCREEN )
{
continue;
}
hCamera->Activate();
Frustum.Initialize( *hCamera->GetViewProjMatForCull() );
CEtObject::MaskFrustumObjectList( &Frustum, 0x1 << i );
CEtDecal::MaskFrustumDecalList( &Frustum, 0x1 << i );
}
CEtObject::InitRenderObjectList();
GetEtDevice()->BeginScene();
GetEtDevice()->GetViewport( &OldViewPort );
// InitRenderObjectList ȣ<><C8A3><EFBFBD>Ŀ<EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
CEtRTTRenderer::RenderRTTList( fElapsedTime );
for( i = 0; i < CEtCamera::GetProcessItemCount(); i++ )
{
EtCameraHandle hCamera = CEtCamera::GetProcessItem(i);
switch( hCamera->GetCameraTargetType() )
{
case CT_RENDERTARGET:
hCamera->Activate();
hCamera->RenderObjectList();
break;
case CT_SCREEN:
hCamera->Activate();
Frustum.Initialize( *hCamera->GetViewProjMatForCull() );
g_nCurFrustumMask = 0x1 << i;
m_pHRC->BeginCapture();
// Make Shadow Buffer
if( CEtLight::GetDirLightCount() > 0 && GetEtOptionController()->IsEnableDynamicShadow() )
{
CEtObject::RenderShadowObjectList( 0x1 << i, GetEtShadowMap()->GetShadowRange() * 2.0f );
}
CEtObject::RenderObjectList( 0x1 << i );
CEtTerrainArea::RenderTerrainBlockList( &Frustum );
CEtEffectObject::RenderEffectObjectList( fElapsedTime );
CEtDecal::RenderDecalList( 0x1 << i, fElapsedTime );
CEtBaseEffect::RenderEffectList( fElapsedTime );
CEtBillboardEffect::RenderBillboardEffectList( fElapsedTime );
GetCurRenderStack()->SetElapsedTime( fElapsedTime );
GetCurRenderStack()->FlushRender();
m_pHRC->EndCapture();
break;
}
}
GetEtDevice()->SetViewport( &OldViewPort );
if( g_pEtRenderLock )
{
g_pEtRenderLock->UnLock();
}
g_nRenderFrameCount++;
}
void CEtEngine::ShowFrame( RECT *pTargetRect )
{
GetEtSaveMat()->Clear();
if( g_bSkipScene ) {
CEtPrimitiveDraw::GetInstance().Flush();
CEtTextDraw::GetInstance().Clear();
if( GetCurRenderStack() ) GetCurRenderStack()->EmptyRenderElement();
return;
}
CEtPrimitiveDraw::GetInstance().Render( CEtCamera::GetActiveCamera() );
CEtTextDraw::GetInstance().Render();
GetEtDevice()->EndScene();
GetEtDevice()->ShowFrame( pTargetRect );
}
#ifdef PRE_MOD_PRELOAD_SHADER
bool CEtEngine::PreLoadShader()
{
std::vector< SHADER_COMPILE_INFO > & CompiledShaders = CEtMaterial::GetShaderCompileInfo();
int nCount = (int)CompiledShaders.size();
if( nCount == 0 ) return false;
for( int i = 0; i < nCount; i++ )
{
EtMaterialHandle hMaterial;
hMaterial = ::LoadResource( CompiledShaders[i].szFileName, RT_SHADER, true );
if( !hMaterial )
{
return false;
}
m_hPreLoadMaterials.push_back( hMaterial );
}
return true;
}
void CEtEngine::ReleasePreLoadShader()
{
SAFE_RELEASE_SPTRVEC( m_hPreLoadMaterials );
}
#endif
#ifdef PRE_FIX_CLIENT_MEMOPTIMIZE
void CEtEngine::FlushBuffer()
{
return;
for( int i=0; i<2; i++ ) {
if( g_pRenderStack[i] ) g_pRenderStack[i]->FlushBuffer();
}
if( GetEtSaveMat() ) GetEtSaveMat()->FlushBuffer();
}
#endif
void CEtEngine::CaptureScreen( const char *szFileName, int nWidth, int nHeight )
{
m_pHRC->Capture( szFileName, nWidth, nHeight );
}
void CEtEngine::SetCaptureScreenClearColor( DWORD dwColor )
{
m_pHRC->SetClearColor( dwColor );
}