// GlareManager.cpp: implementation of the CGlareManager class. // ////////////////////////////////////////////////////////////////////// #include "d3dx8.h" #include "dxutil.h" #include "RenderOption.h" #include "BaseGraphicsLayer.h" #include "CharacterLightShadowManager.h" #include "SceneManager.h" #include "GlareManager.h" #include "SceneStateMgr.h" #include "FullSceneEffect.h" //======================= // Sample Value //======================= #define HIGH_WEIGHT_16 0.6f #define HIGH_WEIGHT_32 0.34f #define HIGH_WEIGHT_64 0.15f #define HIGH_WEIGHT_128 0.1f #define MEDIUM_WEIGHT_16 0.3f #define MEDIUM_WEIGHT_32 0.4f #define MEDIUM_WEIGHT_64 0.36f #define MEDIUM_WEIGHT_128 0.2f #define LOW_WEIGHT_16 0.3f #define LOW_WEIGHT_32 0.3f #define LOW_WEIGHT_64 0.2f #define LOW_WEIGHT_128 0.2f CGlareManager::CGlareManager() { m_pd3dDevice = BaseGraphicsLayer::GetDevice(); HighBlendWeight = D3DXVECTOR4( HIGH_WEIGHT_16, HIGH_WEIGHT_32, HIGH_WEIGHT_64, HIGH_WEIGHT_128); MediumBlendWeight = D3DXVECTOR4( MEDIUM_WEIGHT_16, MEDIUM_WEIGHT_32, MEDIUM_WEIGHT_64, MEDIUM_WEIGHT_128 ); LowBlendWeight = D3DXVECTOR4( LOW_WEIGHT_16, LOW_WEIGHT_32, LOW_WEIGHT_64, LOW_WEIGHT_128 ); SetDefault(); } CGlareManager::~CGlareManager() { Destroy(); } void CGlareManager::SetDefault() { m_vBlendWeight_fullscene = MediumBlendWeight; m_vBlendWeight_character = D3DXVECTOR4(1.0F,1.0F,1.0F,1.0F); m_dwColor_fullscene = 0x88888888; m_dwColor_character = 0x88888888; } void CGlareManager::Create() { // if( CRenderOption::m_FullSceneGlare ) // { m_FullSceneGlare.Create( BaseGraphicsLayer::GetDevice() ); // } // if( CRenderOption::m_FullSceneSpecularGlare ) // { m_CharacterGlare.Create( BaseGraphicsLayer::GetDevice() ); // } } void CGlareManager::Destroy() { // if( CRenderOption::m_FullSceneGlare ) // { m_FullSceneGlare.Destroy(); // } // if( CRenderOption::m_FullSceneSpecularGlare ) // { m_CharacterGlare.Destroy(); // } } void CGlareManager::RenderFullSceneGlare() { m_FullSceneGlare.BeginRenderToTexture(); m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0L ); CSceneManager::m_pFullSceneEffect->Render(0,GLARETEXTURE_WIDTH,GLARETEXTURE_HEIGHT,true); /* CSceneManager::m_WeatherManager.Render(m_pd3dDevice); CSceneManager::m_HeightField.Render( m_pd3dDevice ); CSceneManager::m_HeightField.RenderWater( m_pd3dDevice ); CSceneManager::m_CharacterManager.Render( m_pd3dDevice ); */ m_FullSceneGlare.EndRenderToTexture(); m_FullSceneGlare.ShakeGlareImage( m_vBlendWeight_fullscene.x, m_vBlendWeight_fullscene.y, m_vBlendWeight_fullscene.z, m_vBlendWeight_fullscene.w ); CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, m_dwColor_fullscene ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); m_pd3dDevice->SetVertexShader( GLAREDISPLAY_VERTEX::FVF ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ZENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE, FALSE ); m_pd3dDevice->SetVertexShader( GLAREDISPLAY_VERTEX::FVF ); RenderQuad( 0.0f, 0.0f, m_FullSceneGlare.m_RenderTarget256[1].pTexture ); // Set things back to normal CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ZENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE, TRUE ); } void CGlareManager::RenderCharacterGlare() { m_CharacterGlare.BeginRenderToTexture(); m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0L ); //-------------------------------- // Draw Character specularImage CSceneManager::m_CharacterManager.Render( m_pd3dDevice ); m_CharacterGlare.EndRenderToTexture(); m_CharacterGlare.ShakeGlareImage( m_vBlendWeight_character.x, m_vBlendWeight_character.y, m_vBlendWeight_character.z, m_vBlendWeight_character.w ); CSceneStateMgr::_SetD3DRenderState( D3DRS_TEXTUREFACTOR, m_dwColor_character ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE4X ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR ); m_pd3dDevice->SetVertexShader( GLAREDISPLAY_VERTEX::FVF ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); CSceneStateMgr::_SetD3DRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ZENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE, FALSE ); m_pd3dDevice->SetVertexShader( GLAREDISPLAY_VERTEX::FVF ); RenderQuad( 0.0f, 0.0f, m_CharacterGlare.m_RenderTarget256[1].pTexture ); //====================== // TEST SCREEN //====================== /* CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); D3DVIEWPORT8 TempViewport; m_pd3dDevice->GetViewport( &TempViewport ); float center = 0.0f; GLAREDISPLAY_VERTEX pVertex[4]; pVertex[0].x = center; pVertex[0].y = center; pVertex[0].z = 0.5f; pVertex[0].rhw = 1.0f; pVertex[0].u = 0.0f; pVertex[0].v = 0.0f; pVertex[0].color = 0x55ffffff; pVertex[1].x = 300.0f + center; pVertex[1].y = center; pVertex[1].z = 0.5f; pVertex[1].rhw = 1.0f; pVertex[1].u = 1.0f; pVertex[1].v = 0.0f; pVertex[1].color = 0x55ffffff; pVertex[2].x = center; pVertex[2].y = 300.0f + center; pVertex[2].z = 0.5f; pVertex[2].rhw = 1.0f; pVertex[2].u = 0.0f; pVertex[2].v = 1.0f; pVertex[2].color = 0x55ffffff; pVertex[3].x = 300.0f + center; pVertex[3].y = 300.0f + center; pVertex[3].z = 0.5f; pVertex[3].rhw = 1.0f; pVertex[3].u = 1.0f; pVertex[3].v = 1.0f; pVertex[3].color = 0x55ffffff; m_pd3dDevice->SetTexture(0, m_CharacterGlare.m_RenderTarget256[0].pTexture ); m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertex, sizeof(GLAREDISPLAY_VERTEX) ); //================================================================================================ */ //Set things back to normal CSceneStateMgr::_SetD3DRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE, FALSE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_ZENABLE, TRUE ); CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE, TRUE ); } void CGlareManager::RenderQuad( float moveX, float moveY, LPDIRECT3DTEXTURE8 pTexture ) { D3DVIEWPORT8 TempViewport; m_pd3dDevice->GetViewport( &TempViewport ); float center = 0.0f; GLAREDISPLAY_VERTEX pVertex[4]; pVertex[0].x = center + moveX; pVertex[0].y = center + moveY; pVertex[0].z = 0.5f; pVertex[0].rhw = 1.0f; pVertex[0].u = 0.0f; pVertex[0].v = 0.0f; pVertex[0].color = 0x55ffffff; pVertex[1].x = (float)TempViewport.Width + center + moveX; pVertex[1].y = center + moveY; pVertex[1].z = 0.5f; pVertex[1].rhw = 1.0f; pVertex[1].u = 1.0f; pVertex[1].v = 0.0f; pVertex[1].color = 0x55ffffff; pVertex[2].x = center + moveX; pVertex[2].y = (float)TempViewport.Height + center + moveY; pVertex[2].z = 0.5f; pVertex[2].rhw = 1.0f; pVertex[2].u = 0.0f; pVertex[2].v = 1.0f; pVertex[2].color = 0x55ffffff; pVertex[3].x = (float)TempViewport.Width + center + moveX; pVertex[3].y = (float)TempViewport.Height + center + moveY; pVertex[3].z = 0.5f; pVertex[3].rhw = 1.0f; pVertex[3].u = 1.0f; pVertex[3].v = 1.0f; pVertex[3].color = 0x55ffffff; m_pd3dDevice->SetTexture(0, pTexture ); m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertex, sizeof(GLAREDISPLAY_VERTEX) ); } void CGlareManager::SetBlendWeight( GLARE_TYPE type, D3DXVECTOR4 weight ) { switch( type ) { case GLARE_FULLSCENE: { m_vBlendWeight_fullscene = weight; } break; case GLARE_CHARACTER: { m_vBlendWeight_character = weight; } break; } } D3DXVECTOR4 CGlareManager::GetBlendWeight( GLARE_TYPE type ) { switch( type ) { case GLARE_FULLSCENE: { return m_vBlendWeight_fullscene; } break; case GLARE_CHARACTER: { return m_vBlendWeight_character; } break; } return 0; } void CGlareManager::SetColor( GLARE_TYPE type, DWORD color ) { switch( type ) { case GLARE_FULLSCENE: { m_dwColor_fullscene = color; } break; case GLARE_CHARACTER: { m_dwColor_character = color; } break; } } DWORD CGlareManager::GetColor( GLARE_TYPE type ) { switch( type ) { case GLARE_FULLSCENE: { return m_dwColor_fullscene; } break; case GLARE_CHARACTER: { return m_dwColor_character; } break; } return 0; }