Files
Client/Engine/Zalla3D Scene Class/Z3DGlowHandler.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

470 lines
12 KiB
C++
Raw 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 "Z3DGlowHandler.h"
#include "misc.h"
#include "matrix.h"
#include "GMMemory.h"
#define Z3D_GLOW_MAX_LEVEL 7
IDirect3DDevice8* CZ3DGlowHandler::ms_pDevice = NULL;
IDirect3DTexture8* CZ3DGlowHandler::ms_pRenderTargetTexture = NULL;
IDirect3DSurface8* CZ3DGlowHandler::ms_pRenderTargetDepth = NULL;
IDirect3DSurface8* CZ3DGlowHandler::ms_pOldBackBuffer = NULL;
IDirect3DSurface8* CZ3DGlowHandler::ms_pOldDepthBuffer = NULL;
Z3D_GLOW_CONSTANTS CZ3DGlowHandler::ms_aGlowParameter[Z3D_GLOW_MAX_LEVEL];
std::list< CZ3DGlowHandler* > CZ3DGlowHandler::ms_listInstance;
CUSTOM_TLVERTEX CZ3DGlowHandler::ms_Vert[4];
D3DVIEWPORT8 CZ3DGlowHandler::ms_RenderViewport;
D3DVIEWPORT8 CZ3DGlowHandler::ms_SaveViewport;
D3DMATRIX CZ3DGlowHandler::ms_RenderProjectionMatrix;
D3DMATRIX CZ3DGlowHandler::ms_SaveProjectionMatrix;
bool CZ3DGlowHandler::ms_b16bitMode = false;
bool CZ3DGlowHandler::ms_bSkipGlow = false;
CZ3DGlowHandler::CZ3DGlowHandler()
{
SetLevel(0);
ms_listInstance.push_back( this );
m_itrThis = --ms_listInstance.end();
}
CZ3DGlowHandler::~CZ3DGlowHandler()
{
ms_listInstance.erase( m_itrThis );
}
void CZ3DGlowHandler::SetLevel( int nLevel )
{
if( nLevel <= Z3D_GLOW_MAX_LEVEL )
{
m_nLevelIndex = nLevel;
}
else
{
m_nLevelIndex = Z3D_GLOW_MAX_LEVEL;
}
if( nLevel > 0 )
{
m_CurrentColor = ms_aGlowParameter[m_nLevelIndex-1].vecGlowKeyData[0].c;
}
else
{
m_CurrentColor = D3DXCOLOR( 0, 0, 0, 1.0f );
}
m_nCurrentFrame = 0;
}
void CZ3DGlowHandler::ApplySetting( IDirect3DDevice8* pDevice )
{
if( m_nLevelIndex == 0 )
{
ms_pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB(0xFF,0,0,0) );
return;
}
D3DCOLOR cTemp;
if( ms_b16bitMode )
{
cTemp = D3DCOLOR_COLORVALUE( m_CurrentColor.r/2, m_CurrentColor.g/2, m_CurrentColor.b/2, m_CurrentColor.a );
}
else
{
cTemp = D3DCOLOR_COLORVALUE( m_CurrentColor.r/6, m_CurrentColor.g/6, m_CurrentColor.b/6, m_CurrentColor.a );
}
ms_pDevice->SetRenderState( D3DRS_TEXTUREFACTOR, cTemp );
}
void CZ3DGlowHandler::_Process()
{
std::list< CZ3DGlowHandler* >::iterator it;
for( it = ms_listInstance.begin(); it != ms_listInstance.end(); ++it )
{
(*it)->FrameMove();
}
}
bool CZ3DGlowHandler::_Init( IDirect3DDevice8* pDevice, bool bLowSpec )
{
ms_pDevice = pDevice;
HRESULT hr;
float fWidth, fHeight;
if( bLowSpec )
{
fWidth = 256;
fHeight = 256;
}
else
{
fWidth = 512;
fHeight = 512;
}
ms_RenderViewport.MinZ = 0.0f; ms_RenderViewport.MaxZ = 1.0f;
ms_RenderViewport.X = 0; ms_RenderViewport.Y = 0;
ms_RenderViewport.Width = DWORD(fWidth);
ms_RenderViewport.Height = DWORD(fHeight);
IDirect3DSurface8* pCurrentDepth;
ms_pDevice->GetDepthStencilSurface( &pCurrentDepth );
D3DSURFACE_DESC sd;
pCurrentDepth->GetDesc(&sd);
pCurrentDepth->Release();
hr = ms_pDevice->CreateDepthStencilSurface( (UINT)fWidth, (UINT)fHeight,
sd.Format, D3DMULTISAMPLE_NONE, &ms_pRenderTargetDepth );
if( FAILED(hr) )
{
ms_bSkipGlow = true;
return false;
}
D3DDISPLAYMODE dm;
ms_pDevice->GetDisplayMode( &dm );
if( D3DFMT_R5G6B5 == dm.Format ||
D3DFMT_X1R5G5B5 == dm.Format ||
D3DFMT_A1R5G5B5 == dm.Format ||
D3DFMT_A4R4G4B4 == dm.Format ||
D3DFMT_X4R4G4B4 == dm.Format )
{
ms_b16bitMode = true;
}
hr = ms_pDevice->CreateTexture( (UINT)fWidth, (UINT)fHeight, 1, D3DUSAGE_RENDERTARGET, dm.Format,
D3DPOOL_DEFAULT, &ms_pRenderTargetTexture );
if( FAILED(hr) )
{
ms_bSkipGlow = true;
return false;
}
if( 0 == ms_pRenderTargetTexture )
{
ms_bSkipGlow = true;
}
ms_Vert[0] = CUSTOM_TLVERTEX( 0.0f, 0.0f, .1f, .1f, 0.0f, 0.0f );
ms_Vert[1] = CUSTOM_TLVERTEX( 800, 0.0f, .1f, .1f, 1.0f, 0.0f );
ms_Vert[2] = CUSTOM_TLVERTEX( 0.0f, 600, .1f, .1f, 0.0f, 1.0f );
ms_Vert[3] = CUSTOM_TLVERTEX( 800, 600, .1f, .1f, 1.0f, 1.0f );
// glow <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// level 1 : A-grade
_AddGlowConstantKeyframe( 1, D3DXCOLOR(0xFF2F2D27), 60 );
_AddGlowConstantKeyframe( 1, D3DXCOLOR(0xFF6F3107), 30 );
_AddGlowConstantKeyframe( 1, D3DXCOLOR(0xFF000000), 150 );
_AddGlowConstantKeyframe( 1, D3DXCOLOR(0xFF000000), 30 );
// level 2 : AA-grade
_AddGlowConstantKeyframe( 2, D3DXCOLOR(0xFF2F2D27), 60 );
_AddGlowConstantKeyframe( 2, D3DXCOLOR(0xFF416E6F), 30 );
_AddGlowConstantKeyframe( 2, D3DXCOLOR(0xFF000000), 150 );
_AddGlowConstantKeyframe( 2, D3DXCOLOR(0xFF000000), 30 );
// level 3 : AAA-grade
_AddGlowConstantKeyframe( 3, D3DXCOLOR(0xFF2F2D27), 60 );
_AddGlowConstantKeyframe( 3, D3DXCOLOR(0xFF836725), 30 );
_AddGlowConstantKeyframe( 3, D3DXCOLOR(0xFF000000), 150 );
_AddGlowConstantKeyframe( 3, D3DXCOLOR(0xFF000000), 30 );
// level 4
_AddGlowConstantKeyframe( 4, D3DXCOLOR(0xFF263872), 40 );
_AddGlowConstantKeyframe( 4, D3DXCOLOR(0xFF89767A), 15 );
// level 5
_AddGlowConstantKeyframe( 5, D3DXCOLOR(0xFF5F0D77), 46 );
_AddGlowConstantKeyframe( 5, D3DXCOLOR(0xFFA40E51), 19 );
// level 6
_AddGlowConstantKeyframe( 6, D3DXCOLOR(0xFF879E0D), 48 );
_AddGlowConstantKeyframe( 6, D3DXCOLOR(0xFF323233), 53 );
_AddGlowConstantKeyframe( 6, D3DXCOLOR(0xFF101375), 21 );
_AddGlowConstantKeyframe( 6, D3DXCOLOR(0xFF800B8A), 49 );
// level 7
_AddGlowConstantKeyframe( 7, D3DXCOLOR(0xFF3B828F), 56 );
_AddGlowConstantKeyframe( 7, D3DXCOLOR(0xFF918288), 28 );
return true;
}
void CZ3DGlowHandler::_Close()
{
SAFE_RELEASE( ms_pRenderTargetDepth );
SAFE_RELEASE( ms_pRenderTargetTexture );
}
void CZ3DGlowHandler::_PrepareGlowRender()
{
if( ms_bSkipGlow )
{
ms_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
ms_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ZERO );
ms_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
ms_pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
return;
}
ms_pDevice->GetViewport( &ms_SaveViewport );
ms_pDevice->GetTransform( D3DTS_PROJECTION, &ms_SaveProjectionMatrix );
// <20><><EFBFBD><EFBFBD> render target <20><><EFBFBD><EFBFBD>
ms_pDevice->GetRenderTarget( &ms_pOldBackBuffer );
ms_pDevice->GetDepthStencilSurface( &ms_pOldDepthBuffer );
// glow <20><> render target texture <20><><EFBFBD><EFBFBD>
IDirect3DSurface8* pRenderTarget = NULL;
ms_pRenderTargetTexture->GetSurfaceLevel( 0, &pRenderTarget );
HRESULT hr = ms_pDevice->SetRenderTarget( pRenderTarget, ms_pRenderTargetDepth );
SAFE_RELEASE( pRenderTarget );
// ms_pDevice->SetViewport( &ms_RenderViewport );
// ms_pDevice->SetTransform( D3DTS_PROJECTION, &ms_RenderProjectionMatrix );
// render states <20><><EFBFBD><EFBFBD>
ms_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
ms_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
ms_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
ms_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
/*
ms_pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_TRUE );
ms_pDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_USEW );
ms_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
ms_pDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_LESSEQUAL );
*/
ms_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
ms_pDevice->SetRenderState( D3DRS_AMBIENT, 0xFFFFFFFF );
ms_pDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
ms_pDevice->SetTexture( 0, NULL );
ms_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xFF000000, 1.0f, 0L );
// ms_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0xFF000000, 1.0f, 0L );
}
void CZ3DGlowHandler::_EndGlowRender()
{
if( ms_bSkipGlow )
{
return;
}
ms_pDevice->SetRenderTarget( ms_pOldBackBuffer, ms_pOldDepthBuffer );
SAFE_RELEASE( ms_pOldBackBuffer );
SAFE_RELEASE( ms_pOldDepthBuffer );
ms_pDevice->SetViewport( &ms_SaveViewport );
// ms_pDevice->SetTransform( D3DTS_PROJECTION, &ms_SaveProjectionMatrix );
}
void CZ3DGlowHandler::_ProcessGlow()
{
if( ms_bSkipGlow )
{
return;
}
//Minotaurs <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Glow
ms_pDevice->SetViewport( &ms_SaveViewport );
ms_pDevice->SetTransform( D3DTS_PROJECTION, &ms_SaveProjectionMatrix );
// post-process panel render<65><72> <20><><EFBFBD><EFBFBD> render state <20><><EFBFBD><EFBFBD>
ms_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
ms_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
ms_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
ms_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
ms_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
ms_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
ms_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
ms_pDevice->SetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD );
ms_pDevice->SetRenderState( D3DRS_ALPHAREF, 0x00 );
ms_pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_ALWAYS );
ms_pDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
matrix mmm;
mmm.MakeIdent();
ms_pDevice->SetTransform( D3DTS_WORLD, mmm );
ms_pDevice->SetVertexShader( (D3DFVF_XYZRHW | D3DFVF_TEX1) );
ms_pDevice->SetTexture( 0, ms_pRenderTargetTexture );
static float aFd[][2] =
{
/* {-0.005f,0}, {0.005f,0},
{ -0.01f,0}, { 0.01f,0},
{0,-0.0075f}, {0,0.0075f},*/
{-0.0025f,0}, {0.0025f,0},
{-0.005f,0}, {0.005f,0},
{0,-0.0038f}, {0,0.0038f},
};
// Minotaurs Glow <20>׽<EFBFBD>Ʈ
//ms_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
//ms_Vert[0].x=0;
//ms_Vert[1].x=512;
//ms_Vert[2].x=0;
//ms_Vert[3].x=512;
//ms_Vert[0].y=0;
//ms_Vert[1].y=0;
//ms_Vert[2].y=512;
//ms_Vert[3].y=512;
//ms_pDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, ms_Vert, sizeof(CUSTOM_TLVERTEX) );
//return;
float fWidth = float(ms_SaveViewport.Width);
float fHeight = float(ms_SaveViewport.Height);
int nRenderPass = ms_b16bitMode ? 2 : 6;
for( int j = 0; j < nRenderPass; ++j )
{
float fdx = aFd[j][0];
float fdy = aFd[j][1];
ms_Vert[0].x=fWidth*fdx;
ms_Vert[1].x=fWidth*(1.0f+fdx);
ms_Vert[2].x=fWidth*fdx;
ms_Vert[3].x=fWidth*(1.0f+fdx);
ms_Vert[0].y=fHeight*fdy;
ms_Vert[1].y=fHeight*fdy;
ms_Vert[2].y=fHeight*(1.0f+fdy);
ms_Vert[3].y=fHeight*(1.0f+fdy);
ms_pDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, ms_Vert, sizeof(CUSTOM_TLVERTEX) );
}
}
Z3D_GLOW_CONSTANTS& CZ3DGlowHandler::_GetGlowConstantField( int nLevelIndex )
{
static Z3D_GLOW_CONSTANTS tmp;
if( 0 == nLevelIndex || nLevelIndex > Z3D_GLOW_MAX_LEVEL )
{
return tmp;
}
return ms_aGlowParameter[nLevelIndex-1];
}
void CZ3DGlowHandler::_AddGlowConstantKeyframe( int nLevelndex, D3DXCOLOR& c, int nDuration )
{
if( nLevelndex == 0 || nLevelndex > Z3D_GLOW_MAX_LEVEL )
{
return;
}
Z3D_GLOW_CONSTANTS& rParam = ms_aGlowParameter[nLevelndex-1];
Z3D_GLOW_KEY glowKey;
glowKey.nKeyFrame = rParam.nTotalFrame;
glowKey.c = c;
if( 0 == rParam.vecGlowKeyData.size() )
{
rParam.vecGlowKeyData.push_back(glowKey);
}
else
{
rParam.vecGlowKeyData[rParam.vecGlowKeyData.size()-1] = glowKey;
}
rParam.nTotalFrame += nDuration;
// <20><><EFBFBD>ν<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ű<><C5B0> ù <20><><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ű
glowKey.nKeyFrame = rParam.nTotalFrame;
glowKey.c = rParam.vecGlowKeyData[0].c;
rParam.vecGlowKeyData.push_back( glowKey );
}
void CZ3DGlowHandler::FrameMove()
{
if( 0 == m_nLevelIndex )
{
return;
}
++m_nCurrentFrame;
Z3D_GLOW_CONSTANTS& rConstants = ms_aGlowParameter[m_nLevelIndex-1];
if( m_nCurrentFrame >= rConstants.nTotalFrame )
{
m_nCurrentFrame %= rConstants.nTotalFrame;
}
if( m_nCurrentFrame < rConstants.vecGlowKeyData[0].nKeyFrame )
{
// ù element <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
m_CurrentColor = rConstants.vecGlowKeyData[0].c;
}
else
{
int i = 0;
for(; i < (int)rConstants.vecGlowKeyData.size()-1; ++i )
{
// element <20><><EFBFBD><EFBFBD> <20><>
if( rConstants.vecGlowKeyData[i].nKeyFrame <= m_nCurrentFrame &&
m_nCurrentFrame < rConstants.vecGlowKeyData[i+1].nKeyFrame )
{
float fFactor = float(m_nCurrentFrame - rConstants.vecGlowKeyData[i].nKeyFrame) /
float(rConstants.vecGlowKeyData[i+1].nKeyFrame - rConstants.vecGlowKeyData[i].nKeyFrame);
D3DXColorLerp( &m_CurrentColor,
&(rConstants.vecGlowKeyData[i].c),
&(rConstants.vecGlowKeyData[i+1].c),
fFactor );
break;
}
}
if( i == rConstants.vecGlowKeyData.size()-1 )
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> element <20><><EFBFBD><EFBFBD>
m_CurrentColor = rConstants.vecGlowKeyData[rConstants.vecGlowKeyData.size()-1].c;
}
}
}
void CZ3DGlowHandler::_SetRenderViewport( D3DVIEWPORT8& vp )
{
ms_RenderViewport = vp;
}
void CZ3DGlowHandler::_SetRenderProjectionMatrix( D3DMATRIX& mat )
{
ms_RenderProjectionMatrix = mat;
}