📄 baseparticlesystemfx.cpp
字号:
// ----------------------------------------------------------------------- //
//
// MODULE : BaseParticleSystemFX.cpp
//
// PURPOSE : BaseParticleSystem special FX - Implementation
//
// CREATED : 10/21/97
//
// ----------------------------------------------------------------------- //
#include "BaseParticleSystemFX.h"
#include "cpp_client_de.h"
#include "ClientUtilities.h"
// ----------------------------------------------------------------------- //
//
// ROUTINE: CBaseParticleSystemFX::Init
//
// PURPOSE: Init the base particle system
//
// ----------------------------------------------------------------------- //
DBOOL CBaseParticleSystemFX::Init(SFXCREATESTRUCT* psfxCreateStruct)
{
if (!CSpecialFX::Init(psfxCreateStruct)) return DFALSE;
m_fGravity = PSFX_DEFAULT_GRAVITY;
m_fRadius = PSFX_DEFAULT_RADIUS;
m_dwFlags = 0;
m_pTextureName = "SpecialFX\\ParticleTextures\\particle.dtx";
VEC_INIT(m_vPos);
ROT_INIT(m_rRot);
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CBaseParticleSystemFX::CreateObject
//
// PURPOSE: Create object associated the particle system.
//
// ----------------------------------------------------------------------- //
DBOOL CBaseParticleSystemFX::CreateObject(CClientDE *pClientDE)
{
if (!CSpecialFX::CreateObject(pClientDE)) return DFALSE;
DVector vPos;
DRotation rRot;
ROT_INIT(rRot);
// Use server object position if a position wasn't specified...
if (m_vPos.x == 0.0f && m_vPos.y == 0.0f && m_vPos.z == 0.0f)
{
if (m_hServerObject)
{
pClientDE->GetObjectPos(m_hServerObject, &vPos);
}
}
else
{
VEC_COPY(vPos, m_vPos);
}
// Use the specified rotation if applicable
if (m_rRot.m_Vec.x != 0.0f || m_rRot.m_Vec.y != 0.0f ||
m_rRot.m_Vec.z != 0.0f || m_rRot.m_Spin != 1.0f)
{
ROT_COPY(rRot, m_rRot);
}
// Setup the ParticleSystem...
ObjectCreateStruct createStruct;
INIT_OBJECTCREATESTRUCT(createStruct);
createStruct.m_ObjectType = OT_PARTICLESYSTEM;
createStruct.m_Flags = FLAG_VISIBLE | FLAG_UPDATEUNSEEN;
VEC_COPY(createStruct.m_Pos, vPos);
ROT_COPY(createStruct.m_Rotation, rRot);
m_hObject = m_pClientDE->CreateObject(&createStruct);
m_pClientDE->SetupParticleSystem(m_hObject, m_pTextureName,
m_fGravity, m_dwFlags, m_fRadius / 640.0f);
VEC_SET(m_vColorRange, m_vColor2.x - m_vColor1.x,
m_vColor2.y - m_vColor1.y,
m_vColor2.z - m_vColor1.z);
if (m_vColorRange.x < 0.0f) m_vColorRange.x = 0.0f;
if (m_vColorRange.y < 0.0f) m_vColorRange.y = 0.0f;
if (m_vColorRange.z < 0.0f) m_vColorRange.z = 0.0f;
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CBaseParticleSystemFX::Update
//
// PURPOSE: Update the particle system
//
// ----------------------------------------------------------------------- //
DBOOL CBaseParticleSystemFX::Update()
{
if(!m_hObject || !m_pClientDE) return DFALSE;
// See if we should rotate this bad-boy...
if (m_vRotVel.x != 0.0f || m_vRotVel.y != 0.0f || m_vRotVel.z != 0.0f)
{
DFLOAT fDelta = m_pClientDE->GetFrameTime();
DRotation rRot;
m_pClientDE->GetObjectRotation(m_hObject, &rRot);
DVector vTemp;
VEC_MULSCALAR(vTemp, m_vRotVel, fDelta);
VEC_ADD(m_vRotAmount, m_vRotAmount, vTemp);
if (m_vRotVel.x != 0.0f) m_pClientDE->EulerRotateX(&rRot, m_vRotAmount.x);
if (m_vRotVel.y != 0.0f) m_pClientDE->EulerRotateY(&rRot, m_vRotAmount.y);
if (m_vRotVel.z != 0.0f) m_pClientDE->EulerRotateZ(&rRot, m_vRotAmount.z);
m_pClientDE->SetObjectRotation(m_hObject, &rRot);
}
return DTRUE;
}
// ----------------------------------------------------------------------- //
//
// ROUTINE: CBaseParticleSystemFX::GetRandomColorInRange
//
// PURPOSE: Get a random color in our color range
//
// ----------------------------------------------------------------------- //
void CBaseParticleSystemFX::GetRandomColorInRange(DVector & vColor)
{
DFLOAT fColorR = GetRandom(m_vColor1.x, m_vColor2.x);
// Kludge the color for software...
if (m_bSetSoftwareColor)
{
m_pClientDE->SetSoftwarePSColor(m_hObject, m_vColor1.x/255.0f, m_vColor1.y/255.0f, m_vColor1.z/255.0f);
}
if (m_vColorRange.x <= 0.0f)
{
VEC_COPY(vColor, m_vColor1);
}
else
{
vColor.x = fColorR;
vColor.y = (m_vColorRange.y * fColorR) / m_vColorRange.x;
vColor.z = (m_vColorRange.z * fColorR) / m_vColorRange.x;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -