Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
348 lines
9.6 KiB
C++
348 lines
9.6 KiB
C++
// 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;
|
|
}
|
|
|