📄 objectfx.cpp
字号:
DFLOAT mag;
DDWORD count, num = 1;
VEC_SET(up, 0.0f, 1.0f, 0.0f);
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
m_pClientDE->GetObjectPos(m_hObj, &dif);
VEC_SUB(dif, dif, m_vPos);
mag = VEC_MAG(dif) * 2.0f;
num = (DDWORD)(mag / (m_fDensity * m_fRadius / 1000.0f));
if(num < 1) num = 1;
m_pClientDE->AlignRotation(&tempRot, &dif, &up);
m_pClientDE->GetRotationVectors(&tempRot, &vU, &vR, &dif);
VEC_MULSCALAR(dif, dif, mag / (DFLOAT)num);
for(count = 0; count < num; count++)
{
for(i = 0; i < m_nNumParticles; i++)
{
m_pClientDE->GetRotationVectors(&tempRot, &vU, &vR, &vF);
m_pClientDE->RotateAroundAxis(&tempRot, &vF, GetRandom(-MATH_PI, MATH_PI));
VEC_NORM(vR);
VEC_COPY(start, vR);
VEC_COPY(vel, vR);
VEC_MULSCALAR(vel, vel, GetRandom(m_fMinVelocity, m_fMaxVelocity));
if(m_nEmitType == OBJPSFX_EMITFILLEDCYLINDER)
{ VEC_MULSCALAR(start, start, GetRandom(0.0f, m_fPosRadius)); }
else
{ VEC_MULSCALAR(start, start, m_fPosRadius); }
if(m_nFXFlags & OBJPSFX_MOVINGSOURCE)
{
VEC_SUB(color, m_vPos, m_vOrigin);
VEC_ADD(start, start, color);
}
VEC_ADD(start, start, offset);
GetRandomColor(color);
life = GetRandom(m_fMinLifetime, m_fMaxLifetime);
m_pClientDE->AddParticle(m_hObject, &start, &vel, &color, life);
}
VEC_ADD(offset, offset, dif);
}
break;
}
case OBJPSFX_EMITCOMETTAIL:
{
DVector dif, offset;
DFLOAT mag;
DDWORD count, num = 1;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
if(m_nFXFlags & OBJPSFX_MOVINGSTREAM)
{
VEC_SUB(dif, m_vLastPos, m_vPos);
mag = VEC_MAG(dif);
num = (DDWORD)(mag / (m_fDensity * m_fRadius / 1000.0f));
VEC_DIVSCALAR(dif, dif, (DFLOAT)num);
}
for(count = 0; count < num; count++)
{
for(i = 0; i < m_nNumParticles; i++)
{
m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
m_pClientDE->RotateAroundAxis(&rRot, &vF, GetRandom(-MATH_PI, MATH_PI));
m_pClientDE->RotateAroundAxis(&rRot, &vR, GetRandom(-MATH_PI, MATH_PI));
VEC_NORM(vR);
VEC_COPY(start, vR);
VEC_COPY(vel, vR);
VEC_MULSCALAR(vel, vel, GetRandom(m_fMinVelocity, m_fMaxVelocity));
mag = GetRandom(0.0f, m_fPosRadius);
VEC_MULSCALAR(start, start, mag);
if(m_nFXFlags & OBJPSFX_MOVINGSOURCE)
{
VEC_SUB(color, m_vPos, m_vOrigin);
VEC_ADD(start, start, color);
}
if(m_nFXFlags & OBJPSFX_MOVINGSTREAM)
{
VEC_ADD(start, start, offset);
}
GetRandomColor(color);
life = m_fMaxLifetime - ((m_fMaxLifetime - m_fMinLifetime) * (mag / m_fPosRadius));
m_pClientDE->AddParticle(m_hObject, &start, &vel, &color, life);
}
VEC_ADD(offset, offset, dif);
}
break;
}
case OBJPSFX_EMITPOWERRING:
{
DVector dif, offset;
DFLOAT mag;
DDWORD count, num = 1;
DFLOAT rotate = (MATH_PI * 2.0f) / (float)m_nNumParticles;
VEC_SET(offset, 0.0f, 0.0f, 0.0f);
if(m_nFXFlags & OBJPSFX_MOVINGSTREAM)
{
VEC_SUB(dif, m_vLastPos, m_vPos);
mag = VEC_MAG(dif);
num = (DDWORD)(mag / (m_fDensity * m_fRadius / 1000.0f));
VEC_DIVSCALAR(dif, dif, (DFLOAT)num);
}
if(m_nFXFlags & OBJPSFX_ALIGNROTATION)
{
DVector forward;
VEC_SET(forward, 0.0f, 0.0f, 1.0f);
m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
m_pClientDE->AlignRotation(&rRot, &forward, &vU);
// ROT_INIT(rRot);
}
for(count = 0; count < num; count++)
{
for(i = 0; i < m_nNumParticles; i++)
{
m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
m_pClientDE->RotateAroundAxis(&rRot, &vF, rotate);
VEC_NORM(vR);
VEC_MULSCALAR(start, vR, m_fPosRadius);
VEC_MULSCALAR(vel, vF, m_fMaxVelocity);
VEC_MULSCALAR(vR, vR, m_fMinVelocity);
VEC_ADD(vel, vel, vR);
if(m_nFXFlags & OBJPSFX_MOVINGSOURCE)
{
VEC_SUB(color, m_vPos, m_vOrigin);
VEC_ADD(start, start, color);
}
if(m_nFXFlags & OBJPSFX_MOVINGSTREAM)
{
VEC_ADD(start, start, offset);
}
GetRandomColor(color);
life = GetRandom(m_fMinLifetime, m_fMaxLifetime);
m_pClientDE->AddParticle(m_hObject, &start, &vel, &color, life);
}
VEC_ADD(offset, offset, dif);
}
break;
}
default:
{
for(i = 0; i < m_nNumParticles; i++)
{
m_pClientDE->GetRotationVectors(&rRot, &vU, &vR, &vF);
m_pClientDE->RotateAroundAxis(&rRot, &vF, GetRandom(-MATH_PI, MATH_PI));
VEC_NORM(vR);
VEC_COPY(start, vR);
VEC_COPY(vel, vR);
VEC_MULSCALAR(vel, vel, GetRandom(m_fMinVelocity, m_fMaxVelocity));
VEC_MULSCALAR(start, start, m_fPosRadius);
if(m_nFXFlags & OBJPSFX_MOVINGSOURCE)
{
VEC_SUB(color, m_vPos, m_vOrigin);
VEC_ADD(start, start, color);
}
GetRandomColor(color);
life = GetRandom(m_fMinLifetime, m_fMaxLifetime);
m_pClientDE->AddParticle(m_hObject, &start, &vel, &color, life);
}
break;
}
}
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CObjectParticleFX::GetRandomColor
//
// PURPOSE: Get a random color from Min to Max
//
// ----------------------------------------------------------------------- //
void CObjectParticleFX::GetRandomColor(DVector &vector)
{
DFLOAT ratio = GetRandom(0.0f, 1.0f);
vector.x = m_vColor1.x + ((m_vColor2.x - m_vColor1.x) * ratio);
vector.y = m_vColor1.y + ((m_vColor2.y - m_vColor1.y) * ratio);
vector.z = m_vColor1.z + ((m_vColor2.z - m_vColor1.z) * ratio);
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CObjectGeneralFX::Init
//
// PURPOSE: Init the FX location and type
//
// ----------------------------------------------------------------------- //
DBOOL CObjectGeneralFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
if (!psfxCreateStruct) return DFALSE;
CSpecialFX::Init(psfxCreateStruct);
OBJECTFXCS* pOFXCS = (OBJECTFXCS*)psfxCreateStruct;
m_hObj = pOFXCS->hObj;
VEC_COPY(m_vOffset, pOFXCS->vOffset);
m_fScale = pOFXCS->fScale;
m_nScaleFlags = pOFXCS->nScaleFlags;
m_nFXType = pOFXCS->nFXType;
m_nFXFlags = pOFXCS->nFXFlags;
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CObjectGeneralFX::CreateObject
//
// PURPOSE: Create object associated the particle system.
//
// ----------------------------------------------------------------------- //
DBOOL CObjectGeneralFX::CreateObject(CClientDE *pClientDE)
{
CBloodClientShell *pShell = (CBloodClientShell*)pClientDE->GetClientShell();
if (!pClientDE || !pShell) return DFALSE;
CSFXMgr* psfxMgr = pShell->GetSFXMgr();
if (!psfxMgr) return DFALSE;
OBJECTPARTICLEFXCS ops;
HCONSOLEVAR hVar = pClientDE->GetConsoleVar("ObjectParticles");
DBYTE detail = (DBYTE)pClientDE->GetVarValueFloat(hVar);
pClientDE->SetObjectClientFlags(m_hObj, 0);
if(detail >= 2)
{
switch(m_nFXType)
{
case OBJFX_SMOKETRAIL_1:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.01f;
ops.fRadius = 2000.0f;
ops.fGravity = 25.0f;
ops.nEmitType = OBJPSFX_EMITLOCATION;
ops.nNumParticles = 12;
ops.fDensity = 1.0f;
ops.fAlpha = 0.25f;
VEC_SET(ops.vMinColor, 96.0f, 96.0f, 96.0f);
VEC_SET(ops.vMaxColor, 192.0f, 192.0f, 192.0f);
ops.fMinVelocity = 20.0f;
ops.fMaxVelocity = 50.0f;
ops.fMinLifetime = 0.5f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_ALL;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\smoke64_2.dtx");
break;
}
case OBJFX_SMOKETRAIL_2:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.05f;
ops.fRadius = 1200.0f;
ops.fPosRadius = 12.5f;
ops.fGravity = 25.0f;
ops.nEmitType = OBJPSFX_EMITCOMETTAIL;
ops.nNumParticles = 8;
ops.fDensity = 3.5f;
ops.fAlpha = 0.25f;
VEC_SET(ops.vMinColor, 96.0f, 96.0f, 96.0f);
VEC_SET(ops.vMaxColor, 192.0f, 192.0f, 192.0f);
ops.fMinLifetime = 0.15f;
ops.fMaxLifetime = 0.35f;
ops.nFXFlags = OBJPSFX_ALL;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\smoke64_2.dtx");
break;
}
case OBJFX_FIRETRAIL_1:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.025f;
ops.fRadius = 200.0f;
ops.fPosRadius = 6.0f;
ops.nEmitType = OBJPSFX_EMITCOMETTAIL;
ops.nNumParticles = 1;
ops.fDensity = 10.0f;
ops.fAlpha = 0.5f;
VEC_SET(ops.vMinColor, 255.0f, 192.0f, 0.0f);
VEC_SET(ops.vMaxColor, 255.0f, 255.0f, 0.0f);
ops.fMinLifetime = 0.25f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_REMOVESTOPPED | OBJPSFX_RAMPDOWNSTOPPED | OBJPSFX_MOVINGSOURCE | OBJPSFX_MOVINGSTREAM;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\Firepart64.dtx");
break;
}
case OBJFX_FIRETRAIL_2:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.025f;
ops.fRadius = 250.0f;
ops.fPosRadius = 6.0f;
ops.nEmitType = OBJPSFX_EMITCOMETTAIL;
ops.nNumParticles = 1;
ops.fDensity = 10.0f;
ops.fAlpha = 0.5f;
VEC_SET(ops.vMinColor, 0.0f, 0.0f, 255.0f);
VEC_SET(ops.vMaxColor, 255.0f, 255.0f, 255.0f);
ops.fMinLifetime = 0.25f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_REMOVESTOPPED | OBJPSFX_RAMPDOWNSTOPPED | OBJPSFX_MOVINGSOURCE | OBJPSFX_MOVINGSTREAM;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\Lensflare32_1.dtx");
break;
}
case OBJFX_FIRETRAIL_3:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.025f;
ops.fRadius = 250.0f;
ops.fPosRadius = 6.0f;
ops.nEmitType = OBJPSFX_EMITCOMETTAIL;
ops.nNumParticles = 1;
ops.fDensity = 10.0f;
ops.fAlpha = 0.5f;
VEC_SET(ops.vMinColor, 196.0f, 196.0f, 0.0f);
VEC_SET(ops.vMaxColor, 255.0f, 255.0f, 0.0f);
ops.fMinLifetime = 0.25f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_REMOVESTOPPED | OBJPSFX_RAMPDOWNSTOPPED | OBJPSFX_MOVINGSOURCE | OBJPSFX_MOVINGSTREAM;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\Lensflare32_1.dtx");
break;
}
case OBJFX_SPARKS_1:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fRampDownTime = 0.25f;
ops.nRampDownType = OBJPSFX_RAMPALPHA;
ops.fAddDelay = 0.01f;
ops.fRadius = 350.0f;
ops.fPosRadius = 5.0f;
ops.fGravity = -250.0f;
ops.nNumParticles = 4;
ops.nEmitType = OBJPSFX_EMITFILLEDSPHERE;
ops.fDensity = 2.5f;
ops.fAlpha = 1.0f;
VEC_SET(ops.vMinColor, 192.0f, 192.0f, 0.0f);
VEC_SET(ops.vMaxColor, 255.0f, 255.0f, 0.0f);
ops.fMinVelocity = 25.0f;
ops.fMaxVelocity = 50.0f;
ops.fMinLifetime = 0.5f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_REMOVESTOPPED | OBJPSFX_RAMPDOWNSTOPPED | OBJPSFX_MOVINGSOURCE;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\Lensflare32_1.dtx");
break;
}
case OBJFX_SPARKS_2:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fAddDelay = 0.01f;
ops.fRadius = 500.0f;
ops.fPosRadius = 5.0f;
ops.fGravity = -250.0f;
ops.nNumParticles = 7;
ops.nEmitType = OBJPSFX_EMITFILLEDSPHERE;
ops.fDensity = 2.5f;
ops.fAlpha = 1.0f;
VEC_SET(ops.vMinColor, 192.0f, 192.0f, 0.0f);
VEC_SET(ops.vMaxColor, 255.0f, 255.0f, 0.0f);
ops.fMinVelocity = 35.0f;
ops.fMaxVelocity = 60.0f;
ops.fMinLifetime = 0.5f;
ops.fMaxLifetime = 0.75f;
ops.nFXFlags = OBJPSFX_REMOVESTOPPED | OBJPSFX_RAMPDOWNSTOPPED | OBJPSFX_MOVINGSOURCE;
ops.szParticle = pClientDE->CreateString("SpriteTextures\\Lensflare32_1.dtx");
break;
}
case OBJFX_SPARKS_3:
{
ops.hServerObj = m_hObj;
ops.hObj = m_hObj;
ops.fRampDownTime = 0.25f;
ops.nRampDownType = OBJPSFX_RAMPALPHA;
ops.fAddDelay = 0.01f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -