#include "StdAfx.h" #include "RenderBase.h" #include "FileServer.h" #include "TEtWorld.h" #include "InputDevice.h" #include "GlobalValue.h" #include "MainFrm.h" #include "EtWorldPainter.h" #include "EtWorldPainterDoc.h" #include "EtWorldPainterView.h" #include "DummyView.h" #include "UserMessage.h" #include "TdDummyActor.h" #include "EnviControl.h" #include "EtSoundEngine.h" #include "TEtWorldGrid.h" #include "TEtWorldSector.h" #include "TEtWorldSound.h" #include "EtResourceMng.h" #include "EtWater.h" #include "EventCustomRender.h" #include "GlobalValue.h" #include "EtActionCoreMng.h" #include CRenderBase g_RenderBase; bool CRenderBase::s_bRenderMainScene = false; bool CRenderBase::s_bThreadRenderTarget = false; CRenderBase::CRenderBase() { m_bActivate = false; m_pEtSound = NULL; m_pColorAdjFilter = NULL; m_pBloomFilter = NULL; m_pHeatHazeFilter = NULL; m_pDOFFilter = NULL; m_PrevLocalTime = 0; m_fDelta = 0.f; char szStr[2048] = { 0, }; GetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "ShaderFolder", szStr, 2048 ); m_szShaderFolder = szStr; /* memset( szStr, 0, sizeof(szStr) ); GetRegistryString( HKEY_CURRENT_USER, REG_SUBKEY, "ResourceFolder", szStr, 2048 ); m_szResourceFolder = szStr; */ m_bEnableColorFilter = true; m_bEnableBloomFilter = true; m_bEnableWeather = true; m_bEnableSplashDrop = true; m_bEnableHeatHazeFilter = true; m_bEnableDOFFilter = true; m_bEnableSnow = true; m_nEnviBGMIndex = -1; m_bToggleCameraTopView = false; } CRenderBase::~CRenderBase() { Finalize(); } void CRenderBase::Finalize() { if( m_bActivate == false ) return; CEventCustomRender::UnregisterClass(); SAFE_RELEASE_SPTRVEC( m_hVecLight ); SAFE_RELEASE_SPTRVEC( m_hVecLensFlare ); SAFE_RELEASE_SPTR( m_CameraHandle ); m_FrameSync.End(); CTdDummyActor::GetInstance().Destroy(); SAFE_DELETE( m_pColorAdjFilter ); SAFE_DELETE( m_pBloomFilter ); SAFE_DELETE( m_pHeatHazeFilter ); SAFE_DELETE( m_pDOFFilter ); if( m_nEnviBGMIndex != -1 ) { CEtSoundEngine::GetInstance().RemoveSound( m_nEnviBGMIndex ); m_nEnviBGMIndex = -1; } SAFE_RELEASE_SPTR( m_hEnviBGMChannel ); SAFE_RELEASE_SPTR( m_hEnvironmentTexture ); SAFE_RELEASE_SPTR( m_hWeather ); SAFE_RELEASE_SPTR( m_hSplashDrop ); SAFE_RELEASE_SPTR( m_hSnow ); CEtActionCoreMng::GetInstance().FlushWaitDelete(); SAFE_DELETE( m_pEtSound ); EternityEngine::FinalizeEngine(); m_bActivate = false; } void CRenderBase::Initialize( HWND hWnd ) { CGlobalValue::GetInstance().UpdateInitDesc( "Initialize Engine.." ); CRect rcRect; m_hWnd = hWnd; CalcRenderRect( rcRect ); SGraphicOption Option; Option.DynamicShadowType = ST_DEPTHSHADOWMAP; Option.bEnableDOF = true; EternityEngine::InitializeEngine( m_hWnd, rcRect.Width(), rcRect.Height(), true, true, &Option ); GetEtStateManager()->SetEnable( false ); CEtRenderStack::EnableDepthRender( true ); // CEtRenderStack::EnableSkyFog( false ); CEtRenderStack::EnableOcclusion( false ); char szStr[1024] = { 0, }; GetCurrentDirectory( 1024, szStr ); strcat_s( szStr, "\\" ); CGlobalValue::GetInstance().UpdateInitDesc( "Initialize Shader.." ); CEtResourceMng::GetInstance().AddResourcePath( m_szShaderFolder, true ); std::vector szVecFileList; FindFileListInDirectory( m_szShaderFolder.GetBuffer(), "*.fx", szVecFileList, false, true, false ); for( DWORD i=0; iInitialize( CEtSoundEngine::AutoDetected ) == false ) { // MessageBox( m_hWnd, "m_pEtSound->Initialize() Failed", "Error", MB_OK ); } m_pEtSound->CreateChannelGroup( "SoundManager" ); m_pEtSound->CreateChannelGroup( "3D" ); m_pEtSound->CreateChannelGroup( "BGM" ); CGlobalValue::GetInstance().UpdateInitDesc( "Initialize Dummy.." ); CEventCustomRender::RegisterClass(); CTdDummyActor::GetInstance().Initialize(); CGlobalValue::GetInstance().UpdateInitDesc( "Finish.." ); } void CRenderBase::InitializeEnvi( CEnviElement *pElement ) { SAFE_RELEASE_SPTR( m_CameraHandle ); CEnvInfo& envInfo = pElement->GetInfo(); SCameraInfo CamInfo; EtColor Color; CamInfo.fFogFar = envInfo.GetFogFar(); CamInfo.fFogNear = envInfo.GetFogNear(); Color = envInfo.GetFogColor(); CamInfo.FogColor = EtColor( Color.b, Color.g, Color.r, 1.f ); CamInfo.fNear = CGlobalValue::GetInstance().m_fCamNear; CamInfo.fFar = CGlobalValue::GetInstance().m_fCamFar; CamInfo.fFOV = CGlobalValue::GetInstance().m_fCamFOV; m_CameraHandle = EternityEngine::CreateCamera( &CamInfo ); Color = envInfo.GetAmbient(); SetGlobalAmbient( &EtColor( Color.b, Color.g, Color.r, 1.f ) ); CString szBoxName = envInfo.GetSkyBox(); if( !szBoxName.IsEmpty() ) { EtObjectHandle hTemp = m_hSkyBox; m_hSkyBox = CreateStaticObject( szBoxName ); if( m_hSkyBox ) { m_hSkyBox->EnableCull( false ); m_hSkyBox->EnableWaterCast( true ); } SAFE_RELEASE_SPTR( hTemp ); } else SAFE_RELEASE_SPTR( m_hSkyBox ); UpdateCamera( m_matExWorld ); m_bEnableColorFilter = envInfo.IsEnableColorFilter(); m_bEnableBloomFilter = envInfo.IsEnableBloomFilter(); m_bEnableHeatHazeFilter = envInfo.IsEnableHeatHaze(); m_bEnableWeather = envInfo.IsEnableWeather(); m_bEnableSplashDrop = envInfo.IsEnableSplashDrop(); m_bEnableDOFFilter = envInfo.IsEnableDOF(); m_bEnableSnow = envInfo.IsEnableSnow(); if( m_bEnableColorFilter == true ) { if( !m_pColorAdjFilter ) m_pColorAdjFilter = (CEtColorAdjustTexFilter*)CreateFilter( SF_COLORADJUSTTEX ); m_pColorAdjFilter->SetParam( *envInfo.GetColorAdjShadow(), *envInfo.GetColorAdjMidtones(), *envInfo.GetColorAdjHighlights(), envInfo.GetColorAdjSaturation() ); } else { SAFE_DELETE( m_pColorAdjFilter ); } if( m_bEnableBloomFilter == true ) { if( !m_pBloomFilter ) m_pBloomFilter = (CEtBloomFilter*)CreateFilter( SF_BLOOM ); m_pBloomFilter->SetBloomScale( envInfo.GetBloomScale() ); m_pBloomFilter->SetBloomSensitivity( envInfo.GetBloomSensitivity() ); } else { SAFE_DELETE( m_pBloomFilter ); } if( envInfo.GetEnvironmentTexture() && strlen(envInfo.GetEnvironmentTexture()) > 0 ) { EtTextureHandle hTemp = m_hEnvironmentTexture; m_hEnvironmentTexture = EternityEngine::LoadEnvTexture( envInfo.GetEnvironmentTexture() ); SAFE_RELEASE_SPTR( hTemp ); } else { SAFE_RELEASE_SPTR( m_hEnvironmentTexture ); } if( m_bEnableWeather ) { EtRainHandle hTemp; if( m_hWeather ) hTemp = m_hWeather; m_hWeather = CEtRainEffect::CreateRainEffect( envInfo.GetWeatherTexture() ); SAFE_RELEASE_SPTR( hTemp ); if( m_hWeather ) { m_hWeather->SetRainSpeed( envInfo.GetWeatherSpeed() ); m_hWeather->SetStretchValue( envInfo.GetWeatherStretch() ); m_hWeather->SetLayerCount( envInfo.GetWeatherLayerCount() ); m_hWeather->SetRainSpeedDecreaseRate( envInfo.GetWeatherLayerDecreaseRate() ); m_hWeather->SetRainDir( *envInfo.GetWeatherLayerDir() ); } } else { SAFE_RELEASE_SPTR( m_hWeather ); } if( m_bEnableSplashDrop ) { EtRainDropSplashHandle hTemp; if( m_hSplashDrop ) hTemp = m_hSplashDrop; m_hSplashDrop = CEtRainDropSplash::CreateRainDropSplash( envInfo.GetSplashDropTexture(), envInfo.GetSplashDropSize() ); SAFE_RELEASE_SPTR( hTemp ); if( m_hSplashDrop ) { m_hSplashDrop->SetLifeTime( envInfo.GetSplashDropLifeTime() ); m_hSplashDrop->SetCreationRadius( (float)envInfo.GetSplashDropRadius() ); m_hSplashDrop->SetSplashPerSecond( envInfo.GetSplashDropCount() ); } } else { SAFE_RELEASE_SPTR( m_hSplashDrop ); } if( m_bEnableHeatHazeFilter ) { if( !m_pHeatHazeFilter ) m_pHeatHazeFilter = (CEtHeatHazeFilter*)CreateFilter( SF_HEATHAZE ); if( m_pHeatHazeFilter ) { m_pHeatHazeFilter->SetDistortionPower( envInfo.GetHeatHazeDistortionPower() ); m_pHeatHazeFilter->SetWaveSpeed( envInfo.GetHeatHazeWaveSpeed() ); } } else { SAFE_DELETE( m_pHeatHazeFilter ); } if( m_bEnableDOFFilter ) { if( !m_pDOFFilter ) m_pDOFFilter = (CEtDOFFilter*)CreateFilter( SF_DOF ); if( m_pDOFFilter ) { m_pDOFFilter->SetFocusDistance( envInfo.GetDOFFocusDistance() ); m_pDOFFilter->SetNearDOFStart( envInfo.GetDOFNearStart() ); m_pDOFFilter->SetNearDOFEnd( envInfo.GetDOFNearEnd() ); m_pDOFFilter->SetFarDOFStart( envInfo.GetDOFFarStart() ); m_pDOFFilter->SetFarDOFEnd( envInfo.GetDOFFarEnd() ); m_pDOFFilter->SetNearBlurSize( envInfo.GetDOFNearBlur() ); m_pDOFFilter->SetFarBlurSize( envInfo.GetDOFFarBlur() ); } } else { SAFE_DELETE( m_pDOFFilter ); } if( m_bEnableSnow ) { EtSnowHandle hTemp; if( m_hSnow ) hTemp = m_hSnow; m_hSnow = CEtSnowEffect::CreateSnowEffect( envInfo.GetSnowTexture(), envInfo.GetSnowCount(), envInfo.GetSnowSize() ); SAFE_RELEASE_SPTR( hTemp ); if( m_hSnow ) { m_hSnow->SetSnowTimeOut( envInfo.GetSnowTimeOut() ); m_hSnow->SetSnowHeight( envInfo.GetSnowHeight() ); m_hSnow->SetIsUp(envInfo.GetIsUp()); m_hSnow->SetSnowAniSpeed(envInfo.GetSnowAniSpeed()); } } else { SAFE_RELEASE_SPTR( m_hSnow ); } } void CRenderBase::InitializeEnviLight( CEnviElement *pElement, bool bRefreshAll ) { EtLightHandle hLight; CEnvInfo& envInfo = pElement->GetInfo(); if( bRefreshAll == false && envInfo.GetLightCount() != m_hVecLight.size() ) bRefreshAll = true; if( bRefreshAll ) { SAFE_RELEASE_SPTRVEC( m_hVecLight ); for( DWORD i=0; ipInfo; Info.Diffuse.r *= Info.Diffuse.a; Info.Diffuse.g *= Info.Diffuse.a; Info.Diffuse.b *= Info.Diffuse.a; Info.Specular.r *= Info.Specular.a; Info.Specular.g *= Info.Specular.a; Info.Specular.b *= Info.Specular.a; hLight = EternityEngine::CreateLight( &Info ); m_hVecLight.push_back( hLight ); } } else { for( DWORD i=0; ipInfo; Info.Diffuse.r *= Info.Diffuse.a; Info.Diffuse.g *= Info.Diffuse.a; Info.Diffuse.b *= Info.Diffuse.a; Info.Specular.r *= Info.Specular.a; Info.Specular.g *= Info.Specular.a; Info.Specular.b *= Info.Specular.a; *m_hVecLight[i]->GetLightInfo() = Info; } } } void CRenderBase::InitializeEnviLensFlare( CEnviElement *pElement, bool bRefreshAll ) { CEnvInfo& envInfo = pElement->GetInfo(); if( bRefreshAll == false && envInfo.GetLightCount() != m_hVecLight.size() ) bRefreshAll = true; if( bRefreshAll ) { SAFE_RELEASE_SPTRVEC( m_hVecLensFlare ); MatrixEx CrossTemp; for( DWORD i=0; ibEnable == true ) { hLensFlare = CEtLensFlare::CreateLensFlare( pStruct->pInfo->Direction, pStruct->szSunTexture.c_str(), pStruct->szLensFlareTexture.c_str() ); hLensFlare->SetFlareRadius( pStruct->fSunScale, pStruct->fLensScale ); CrossTemp.Identity(); CrossTemp.m_vZAxis = pStruct->pInfo->Direction; CrossTemp.MakeUpCartesianByZAxis(); CrossTemp.RotateYAxis( pStruct->fRevisionYAxisAngle ); CrossTemp.RotatePitch( pStruct->fRevisionXAxisAngle ); hLensFlare->SetDirection( CrossTemp.m_vZAxis ); } m_hVecLensFlare.push_back( hLensFlare ); } } else { MatrixEx CrossTemp; for( DWORD i=0; ibEnable ) { CrossTemp.Identity(); CrossTemp.m_vZAxis = pStruct->pInfo->Direction; CrossTemp.MakeUpCartesianByZAxis(); CrossTemp.RotateYAxis( pStruct->fRevisionYAxisAngle ); CrossTemp.RotatePitch( pStruct->fRevisionXAxisAngle ); if( pStruct->fSunScale != m_hVecLensFlare[i]->GetSunRadius() || pStruct->fLensScale != m_hVecLensFlare[i]->GetFlareRadius() || pStruct->pInfo->Direction != CrossTemp.m_vZAxis ) m_hVecLensFlare[i]->SetFlareRadius( pStruct->fSunScale, pStruct->fLensScale ); m_hVecLensFlare[i]->SetSunTexture( pStruct->szSunTexture.c_str() ); m_hVecLensFlare[i]->SetFlareTexture( pStruct->szLensFlareTexture.c_str() ); m_hVecLensFlare[i]->SetDirection( CrossTemp.m_vZAxis ); } } } } void CRenderBase::InitializeEnviBGM( CEnviElement *pElement, bool bRefreshAll ) { CEnvInfo& envInfo = pElement->GetInfo(); if( bRefreshAll ) { if( m_nEnviBGMIndex != -1 ) { CEtSoundEngine::GetInstance().RemoveSound( m_nEnviBGMIndex ); m_nEnviBGMIndex = -1; } SAFE_RELEASE_SPTR( m_hEnviBGMChannel ); } // Envi BGM Setting SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( pSector ) { if( pSector->GetSoundInfo() ) { pSector->GetSoundInfo()->SetVolume( pSector->GetSoundInfo()->GetVolume() ); if( envInfo.GetEnviBGM() && strlen(envInfo.GetEnviBGM()) > 0 ) { if( bRefreshAll ) m_nEnviBGMIndex = CEtSoundEngine::GetInstance().LoadSound( envInfo.GetEnviBGM(), false, true ); if( m_nEnviBGMIndex != -1 ) { if( bRefreshAll ) m_hEnviBGMChannel = CEtSoundEngine::GetInstance().PlaySound( "BGM", m_nEnviBGMIndex, true, false ); if( m_hEnviBGMChannel ) { float fBGMVolume = pSector->GetSoundInfo()->GetVolume(); m_hEnviBGMChannel->SetVolume( fBGMVolume * envInfo.GetEnviBGMRatio() ); pSector->GetSoundInfo()->SetVolume( fBGMVolume * ( 1.f - envInfo.GetEnviBGMRatio() ) ); } } } } } } void CRenderBase::Render( CGlobalValue::VIEW_TYPE Type ) { if( m_bActivate == false ) return; if( CFileServer::GetInstance().IsConnect() == false ) return; if( m_FrameSync.CheckSync() == true ) { LOCAL_TIME LocalTime = m_FrameSync.GetMSTime(); if( CGlobalValue::GetInstance().m_bSimulation == true ) { CTdDummyActor::GetInstance().Render( LocalTime ); } if( CGlobalValue::GetInstance().m_pParentView ) { ((CEtWorldPainterView*)CGlobalValue::GetInstance().m_pParentView)->GetDummyView()->SendMessage( UM_CUSTOM_RENDER ); } switch( Type ) { case CGlobalValue::GRID: CTEtWorld::GetInstance().RenderGrid(); break; case CGlobalValue::BRUSH: case CGlobalValue::PROP: case CGlobalValue::WATER: case CGlobalValue::NAVIGATION: case CGlobalValue::EVENT: case CGlobalValue::SOUND: case CGlobalValue::TRIGGER: CTEtWorld::GetInstance().RenderHeightmap( CGlobalValue::GetInstance().m_SelectGrid ); break; } CPoint p; GetCursorPos( &p ); ScreenToClient( CGlobalValue::GetInstance().m_pParentView->m_hWnd, &p ); EtVector3 Direction, Origin, vPickPos; int nCameraIndex = 0; if( m_CameraHandle ) { nCameraIndex = m_CameraHandle->GetMyItemIndex(); } CEtCamera::GetItem( nCameraIndex )->CalcPositionAndDir( p.x, p.y, Origin, Direction ); bool bPick = CTEtWorld::GetInstance().Pick( Origin, Direction, vPickPos ); CString szFrame; if( bPick == true ) szFrame.Format( "FPS : %.2f ( %.2f, %.2f, %.2f )", m_FrameSync.GetFps(), vPickPos.x, vPickPos.y, vPickPos.z ); else szFrame.Format( "FPS : %.2f ( N/A )", m_FrameSync.GetFps() ); EternityEngine::DrawText2D( EtVector2( 0.f, 0.f ), szFrame ); if( !CGlobalValue::GetInstance().IsCheckOutMe() ) { CString szFrame; szFrame.Format( "Can't CheckOut! View Only", m_FrameSync.GetFps() ); EternityEngine::DrawText2D( EtVector2( 0.f, 0.03f ), szFrame, 0xffff0000 ); } if( m_hSkyBox ) { EtMatrix mat; EtMatrixIdentity( &mat ); memcpy( &mat._41, &m_matExWorld.m_vPosition.x, sizeof(EtVector3) ); m_hSkyBox->Update( &mat ); } CRect rcRect; CalcRenderRect( rcRect ); if( s_bThreadRenderTarget == false ) { // Lock(); s_bRenderMainScene = true; EternityEngine::ClearScreen( D3DCOLOR_ARGB( 0, 40, 40, 40 ) ); m_fDelta = ( LocalTime - m_PrevLocalTime ) * 0.001f; EternityEngine::RenderFrame( m_fDelta ); EternityEngine::ShowFrame( &rcRect ); s_bRenderMainScene = false; // Unlock(); } m_PrevLocalTime = LocalTime; } } void CRenderBase::Process( CGlobalValue::VIEW_TYPE Type ) { if( m_bActivate == false ) return; if( CFileServer::GetInstance().IsConnect() == false ) return; if( m_pEtSound ) { if( !CGlobalValue::GetInstance().m_bSimulation ) m_pEtSound->SetListener( m_matExWorld.m_vPosition, m_matExWorld.m_vZAxis, m_matExWorld.m_vYAxis ); m_pEtSound->Process( 0.f ); } m_FrameSync.UpdateTime(); CGlobalValue::GetInstance().ProcessAsyncKey(); LOCAL_TIME LocalTime = m_FrameSync.GetMSTime(); CInputDevice::GetInstance().Process( LocalTime, m_fDelta ); } void CRenderBase::Reconstruction() { if( m_bActivate == false ) return; CRect rcRect; CalcRenderRect( rcRect ); EternityEngine::ReinitializeEngine( rcRect.Width(), rcRect.Height() ); CGlobalValue::GetInstance().RefreshRender(); } void CRenderBase::CalcRenderRect( CRect &rcRect ) { GetClientRect( m_hWnd, &rcRect ); if( CGlobalValue::GetInstance().m_pParentView ) { CRect rcTabRect; CDummyView *pDummyView = ((CEtWorldPainterView*)CGlobalValue::GetInstance().m_pParentView)->GetDummyView(); CDummyView::TabViewStruct *pStruct = pDummyView->GetTabViewStruct( CGlobalValue::GetInstance().m_nActiveView ); if( pStruct->pView == NULL ) return; pStruct->pView->GetClientRect( &rcTabRect ); pDummyView->ClientToScreen( &rcRect ); pStruct->pView->ClientToScreen( &rcTabRect ); int nLeft = rcRect.left - rcTabRect.left; int nTop = rcRect.top - rcTabRect.top; int nRight = rcRect.right - rcTabRect.right; int nBottom = rcRect.bottom - rcTabRect.bottom; GetClientRect( m_hWnd, &rcRect ); rcRect += CRect( nLeft, nTop, -nRight, -nBottom ); } } void CRenderBase::UpdateCamera( MatrixEx &Cross ) { m_matExWorld = Cross; if( !m_CameraHandle ) return; m_CameraHandle->Update( Cross ); } void CRenderBase::ChangeShaderFolder( const char *szFullPath ) { CEtResourceMng::GetInstance().RemoveResourcePath( m_szShaderFolder, true ); m_szShaderFolder = szFullPath; CEtResourceMng::GetInstance().AddResourcePath( m_szShaderFolder, true ); } /* void CRenderBase::ChangeResourceFolder( const char *szFullPath ) { CEtResourceMng::GetInstance().RemoveResourcePath( m_szResourceFolder, true ); m_szResourceFolder = szFullPath; CEtResourceMng::GetInstance().AddResourcePath( m_szResourceFolder, true ); } */ void CRenderBase::SetDummyMovement( EtVector3 &vMovement ) { if( m_bEnableWeather && m_hWeather ) { m_hWeather->SetMovement( vMovement ); } } void CRenderBase::ToggleCameraTopView() { m_bToggleCameraTopView = !m_bToggleCameraTopView; if( m_bToggleCameraTopView ) { SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid; if( Sector == -1 ) return; CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector ); if( !pSector ) return; m_matExWorldBackup = m_matExWorld; float fSizeX = pSector->GetParentGrid()->GetGridWidth() * 100.f; float fSizeY = pSector->GetParentGrid()->GetGridHeight() * 100.f; m_matExWorld.Identity(); m_matExWorld.RotatePitch( 90.f ); m_matExWorld.m_vPosition = *pSector->GetOffset(); m_matExWorld.m_vPosition.y = min( fSizeX, fSizeY ) * 1.2f; } else { m_matExWorld = m_matExWorldBackup; } CGlobalValue::GetInstance().RefreshRender(); }