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>
465 lines
10 KiB
C++
465 lines
10 KiB
C++
// X3DEffect.cpp: implementation of the CX3DEffect class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "X3DEffect.h"
|
||
#include "X3DEffectParticle.h"
|
||
#include "X3DEffectBillboard.h"
|
||
#include "X3DEffectCylinder.h"
|
||
#include "X3DEffectPlane.h"
|
||
#include "X3DEffectSphere.h"
|
||
#include "X3DEffectMesh.h"
|
||
#include "EffDebugLog.h"
|
||
#include "SceneStateMgr.h"
|
||
|
||
//#define __EFF_WCREATOR__
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
CX3DEffect::CX3DEffect()
|
||
{
|
||
m_dwMinFrame = 0.0f;
|
||
m_fFrame = 0.0f;
|
||
m_fBeforeFrame = 0.0f;
|
||
m_bImportCenter = FALSE;
|
||
m_lpCenter = NULL;
|
||
m_bImportAxis = FALSE;
|
||
m_lpAxis = NULL;
|
||
m_dwKindMove = 0;
|
||
m_dwCount = 0;
|
||
m_SectorX = -1;
|
||
m_SectorY = -1;
|
||
map_effect = false;
|
||
m_StartEffect = false;
|
||
m_dwFrameTick = 33;
|
||
m_MoveState = false;
|
||
m_Mine = true;
|
||
m_GemScale[0] = m_GemScale[1] = m_GemScale[2] = 1.0f;
|
||
m_bLight = false;
|
||
|
||
}
|
||
|
||
CX3DEffect::~CX3DEffect()
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
delete pEffect;
|
||
pEffect = NULL;
|
||
}
|
||
|
||
m_lstEffect.clear();
|
||
|
||
if(!m_bImportCenter) if(m_lpCenter) { delete m_lpCenter; m_lpCenter = NULL; }
|
||
if(m_lpAxis) { delete m_lpAxis; m_lpAxis = NULL; }
|
||
}
|
||
void CX3DEffect::SetScale(float x,float y,float z) {
|
||
|
||
m_GemScale[0] = x;m_GemScale[1] = y;m_GemScale[2] = z;
|
||
if(m_lstEffect.size() > 0) {
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
if(pEffect != NULL)
|
||
pEffect->SetEffectScale(x,y,z);
|
||
}
|
||
}
|
||
}
|
||
unsigned long CX3DEffect::AddEffect(CX3DEffectBase *pNewEffect)
|
||
{
|
||
pNewEffect->SetLocalDevice(m_lpD3DDevice);
|
||
pNewEffect->SetLocalView(m_lpViewMatrix);
|
||
pNewEffect->SetLocalEffect((void *)this);
|
||
pNewEffect->SetLocalCenter(m_lpCenter);
|
||
pNewEffect->SetLocalAxis(m_lpAxis);
|
||
|
||
m_lstEffect.push_back(pNewEffect);
|
||
|
||
return m_lstEffect.size() - 1;
|
||
}
|
||
|
||
BOOL CX3DEffect::Interpolation(unsigned long dwTick, float fFrame)
|
||
{
|
||
|
||
if((m_fFrame > m_dwMaxFrame) && !m_bLoop)
|
||
return FALSE;
|
||
|
||
switch(m_dwKindMove)
|
||
{
|
||
case 1:
|
||
if(m_dwCount == 30)
|
||
return FALSE;
|
||
m_lpCenter->x += m_vecPower.x;
|
||
m_lpCenter->y += m_vecPower.y;
|
||
m_lpCenter->z += m_vecPower.z;
|
||
m_dwCount++;
|
||
break;
|
||
|
||
case 2:
|
||
break;
|
||
}
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
if(-1.0f == fFrame)
|
||
{
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
|
||
if(!pEffect->Interpolation(m_fFrame))
|
||
return FALSE;
|
||
}
|
||
m_fBeforeFrame = m_fFrame;
|
||
m_fFrame += ((dwTick / m_dwFrameTick) * m_fIncFrame);
|
||
if(m_bLoop && (m_fFrame >= m_dwMaxFrame)) {
|
||
m_fFrame -= m_dwMaxFrame;
|
||
m_fFrame += m_dwMinFrame;
|
||
}
|
||
} else
|
||
{
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
|
||
if(!pEffect->Interpolation(fFrame))
|
||
return FALSE;
|
||
}
|
||
m_fBeforeFrame = m_fFrame;
|
||
|
||
m_fFrame = fFrame;
|
||
}
|
||
return TRUE;
|
||
}
|
||
void CX3DEffect::SetVisibility(bool bVis)
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetVisibility(bVis);
|
||
}
|
||
|
||
}
|
||
void CX3DEffect::Render(void)
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
|
||
if(m_StartEffect) {
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->Render();
|
||
}
|
||
}
|
||
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
||
}
|
||
|
||
CX3DEffectBase *CX3DEffect::GetEffect(unsigned long dwEffectNumber)
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
unsigned long dwEffectCount = 0;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
if(dwEffectCount == dwEffectNumber) { return (CX3DEffectBase *)(*it); }
|
||
dwEffectCount++;
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
BOOL CX3DEffect::DeleteEffect(unsigned long dwEffectNumber)
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
unsigned long dwEffectCount = 0;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
if(dwEffectCount == dwEffectNumber)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
m_lstEffect.erase(it);
|
||
delete pEffect;
|
||
pEffect = NULL;
|
||
return TRUE;
|
||
}
|
||
dwEffectCount++;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
void CX3DEffect::SetAxis(quaternion *pAxis) {
|
||
m_bImportAxis = TRUE;
|
||
if(!m_lpAxis) m_lpAxis = new quaternion;
|
||
|
||
m_lpAxis->x = pAxis->x;
|
||
m_lpAxis->y = pAxis->y;
|
||
m_lpAxis->z = pAxis->z;
|
||
m_lpAxis->w = pAxis->w;
|
||
|
||
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetAxis(*pAxis);
|
||
}
|
||
}
|
||
void CX3DEffect::SetAxis(float fAxisX, float fAxisY, float fAxisZ){
|
||
|
||
m_bImportAxis = TRUE;
|
||
|
||
if(!m_lpAxis) m_lpAxis = new quaternion;
|
||
m_lpAxis->Identity();
|
||
m_lpAxis->Pitch(FLOAT_DEG(fAxisX - (((unsigned long)(fAxisX / 360)) * 360.0f)));
|
||
m_lpAxis->Yaw(FLOAT_DEG(fAxisY - (((unsigned long)(fAxisY / 360)) * 360.0f)));
|
||
m_lpAxis->Roll(FLOAT_DEG(fAxisZ - (((unsigned long)(fAxisZ / 360)) * 360.0f)));
|
||
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetAxis(*m_lpAxis);
|
||
}
|
||
}
|
||
|
||
|
||
void CX3DEffect::SetEffectSetting(void)
|
||
{
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetLocalDevice(m_lpD3DDevice);
|
||
pEffect->SetLocalView(m_lpViewMatrix);
|
||
}
|
||
}
|
||
void CX3DEffect::SetMine(bool b) {
|
||
m_Mine = b;
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetMine(m_Mine);
|
||
}
|
||
}
|
||
void CX3DEffect::Load(const char *strFilePath, const char *strFileName,bool bLoad)
|
||
{
|
||
FILE *fp;
|
||
char strFile[MAX_PATH];
|
||
strcpy(strFile, strFilePath);
|
||
strcat(strFile, strFileName);
|
||
fp = fopen(strFile, "rb");
|
||
if(!fp) {
|
||
#ifdef __EFF_WCREATOR__
|
||
WriteDebug(strFile); // File Converting<6E><67> Log File Write <20><>ƾ
|
||
#endif
|
||
return;
|
||
}
|
||
|
||
CX3DEffectBase *lpEffect;
|
||
unsigned short Size, Kind;
|
||
unsigned long i, dwStartFrame, dwEndFrame;
|
||
unsigned char len;
|
||
char strTextureFile[MAX_PATH], strTemp[MAX_PATH];
|
||
|
||
fread(&m_dwMaxFrame, 4, 1, fp);
|
||
fread(&m_dwFrameTick, 4, 1, fp);
|
||
fread(&m_fIncFrame, 4, 1, fp);
|
||
fread(&Size, 2, 1, fp);
|
||
for(i = 0; i < Size; i++)
|
||
{
|
||
bool bParticle = false;
|
||
|
||
fread(&Kind, 2, 1, fp);
|
||
|
||
switch(Kind)
|
||
{
|
||
case EFFECT_PARTICLE:
|
||
lpEffect = new CX3DEffectParticle;
|
||
bParticle = true;
|
||
break;
|
||
|
||
case EFFECT_BILLBOARD:
|
||
lpEffect = new CX3DEffectBillboard;
|
||
break;
|
||
|
||
case EFFECT_CYLINDER:
|
||
lpEffect = new CX3DEffectCylinder;
|
||
break;
|
||
|
||
case EFFECT_PLANE:
|
||
lpEffect = new CX3DEffectPlane;
|
||
break;
|
||
|
||
case EFFECT_SPHERE:
|
||
lpEffect = new CX3DEffectSphere;
|
||
break;
|
||
|
||
case EFFECT_MESH:
|
||
lpEffect = new CX3DEffectMesh;
|
||
break;
|
||
|
||
default:
|
||
MessageBox(NULL, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", MB_OK);
|
||
fclose(fp);
|
||
return;
|
||
}
|
||
|
||
fread(&len, 1, 1, fp);
|
||
if(len)
|
||
{
|
||
char *t_ptr = NULL;
|
||
fread(strTemp, len, 1, fp);
|
||
t_ptr = strrchr(strTemp,'\\');
|
||
if(t_ptr != NULL) {
|
||
t_ptr++;
|
||
strcpy(strTextureFile,t_ptr);
|
||
}
|
||
else {
|
||
strcpy(strTextureFile,strTemp);
|
||
}
|
||
//strcpy(strTextureFile, strFilePath);
|
||
//strcat(strTextureFile, strTemp);
|
||
|
||
} else
|
||
{
|
||
strcpy(strTextureFile, "");
|
||
}
|
||
|
||
AddEffect(lpEffect);
|
||
if(bLoad)
|
||
if(strTextureFile) lpEffect->LoadTexture(strTextureFile);
|
||
fread(&dwStartFrame, 4, 1, fp);
|
||
fread(&dwEndFrame, 4, 1, fp);
|
||
lpEffect->SetVisibility(bLoad);
|
||
lpEffect->Create(dwStartFrame, dwEndFrame);
|
||
lpEffect->SetEffectKind(Kind);
|
||
lpEffect->SetEffectScale(m_GemScale[0],m_GemScale[1],m_GemScale[2]);
|
||
lpEffect->SetLight(m_bLight);
|
||
lpEffect->Load(fp, strFilePath);
|
||
if(bLoad || bParticle)
|
||
lpEffect->CreateBuffer();
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
|
||
}
|
||
|
||
fclose(fp);
|
||
}
|
||
|
||
void CX3DEffect::Save(const char *strFilePath, const char *strFileName)
|
||
{
|
||
FILE *fp;
|
||
char strFile[MAX_PATH];
|
||
strcpy(strFile, strFilePath);
|
||
strcat(strFile, strFileName);
|
||
fp = fopen(strFile, "wb");
|
||
if(!fp) return;
|
||
|
||
list<CX3DEffectBase *>::iterator it;
|
||
CX3DEffectBase *pEffect;
|
||
|
||
unsigned short Size = m_lstEffect.size(), Kind;
|
||
unsigned char len;
|
||
unsigned long StartFrame, EndFrame;
|
||
|
||
fwrite(&m_dwMaxFrame, 4, 1, fp);
|
||
fwrite(&m_dwFrameTick, 4, 1, fp);
|
||
fwrite(&m_fIncFrame, 4, 1, fp);
|
||
fwrite(&Size, 2, 1, fp);
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
|
||
Kind = (unsigned short)pEffect->GetEffectKind();
|
||
StartFrame = pEffect->GetStartFrame();
|
||
EndFrame = pEffect->GetEndFrame();
|
||
len = strlen(pEffect->GetTextureFileName()) + 1;
|
||
|
||
fwrite(&Kind, 2, 1, fp);
|
||
if(len == 1)
|
||
{
|
||
len = 0;
|
||
fwrite(&len, 1, 1, fp);
|
||
} else
|
||
{
|
||
fwrite(&len, 1, 1, fp);
|
||
fwrite(pEffect->GetTextureFileName(), len, 1, fp);
|
||
}
|
||
fwrite(&StartFrame, 4, 1, fp);
|
||
fwrite(&EndFrame, 4, 1, fp);
|
||
|
||
pEffect->Save(fp);
|
||
}
|
||
|
||
fclose(fp);
|
||
}
|
||
|
||
void CX3DEffect::SetDirectMove(vector3 &vecDest, vector3 &vecPower, vector3 &vecEForce)
|
||
{
|
||
m_dwKindMove = 1;
|
||
m_vecDest = vecDest;
|
||
m_vecPower = (m_vecDest - *m_lpCenter) / 30.0f;
|
||
m_vecEForce = vecEForce;
|
||
}
|
||
void CX3DEffect::SetLoop(BOOL bLoop) {
|
||
m_bLoop = bLoop;
|
||
list<CX3DEffectBase *>::iterator it;
|
||
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetGemClearBuffer(!bLoop); // clear buffer setting
|
||
}
|
||
|
||
}
|
||
void CX3DEffect::SetWorldEffect(bool t) {
|
||
|
||
list<CX3DEffectBase *>::iterator it;
|
||
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetWorldEffect(t);
|
||
}
|
||
|
||
}
|
||
void CX3DEffect::SetStopParticle(int t) {
|
||
|
||
list<CX3DEffectBase *>::iterator it;
|
||
|
||
CX3DEffectBase *pEffect;
|
||
|
||
for(it = m_lstEffect.begin(); it != m_lstEffect.end(); it++)
|
||
{
|
||
pEffect = (CX3DEffectBase *)(*it);
|
||
pEffect->SetStopParticle(t);
|
||
}
|
||
|
||
} |