client/GameLib/SnowParticle.cpp

104 lines
2.6 KiB
C++
Raw Normal View History

#include "StdAfx.h"
#include "SnowParticle.h"
const float c_fSnowDistance = 70000.0f;
std::vector<CSnowParticle*> CSnowParticle::ms_kVct_SnowParticlePool;
void CSnowParticle::SetCameraVertex(const D3DXVECTOR3 & rv3Up, const D3DXVECTOR3 & rv3Cross)
{
m_v3Up = rv3Up*m_fHalfWidth;
m_v3Cross = rv3Cross*m_fHalfHeight;
}
bool CSnowParticle::IsActivate()
{
return m_bActivate;
}
void CSnowParticle::Update(float fElapsedTime, const D3DXVECTOR3 & c_rv3Pos)
{
m_v3Position += m_v3Velocity * fElapsedTime;
m_v3Position.x += m_v3Cross.x * sin(m_fcurRadian) / 10.0f;
m_v3Position.y += m_v3Cross.y * sin(m_fcurRadian) / 10.0f;
m_fcurRadian += m_fPeriod * fElapsedTime;
if (m_v3Position.z < c_rv3Pos.z - 500.0f)
m_bActivate = false;
else if (abs(m_v3Position.x - c_rv3Pos.x) > c_fSnowDistance)
m_bActivate = false;
else if (abs(m_v3Position.y - c_rv3Pos.y) > c_fSnowDistance)
m_bActivate = false;
}
void CSnowParticle::GetVerticies(SParticleVertex & rv3Vertex1, SParticleVertex & rv3Vertex2,
SParticleVertex & rv3Vertex3, SParticleVertex & rv3Vertex4)
{
rv3Vertex1.v3Pos = m_v3Position - m_v3Cross - m_v3Up;
rv3Vertex1.u = 0.0f;
rv3Vertex1.v = 0.0f;
rv3Vertex2.v3Pos = m_v3Position + m_v3Cross - m_v3Up;
rv3Vertex2.u = 1.0f;
rv3Vertex2.v = 0.0f;
rv3Vertex3.v3Pos = m_v3Position - m_v3Cross + m_v3Up;
rv3Vertex3.u = 0.0f;
rv3Vertex3.v = 1.0f;
rv3Vertex4.v3Pos = m_v3Position + m_v3Cross + m_v3Up;
rv3Vertex4.u = 1.0f;
rv3Vertex4.v = 1.0f;
}
void CSnowParticle::Init(const D3DXVECTOR3 & c_rv3Pos)
{
float fRot = frandom(0.0f, 36000.0f) / 100.0f;
float fDistance = frandom(0.0f, c_fSnowDistance) / 10.0f;
m_v3Position.x = c_rv3Pos.x + fDistance*sin((double)D3DXToRadian(fRot));
m_v3Position.y = c_rv3Pos.y + fDistance*cos((double)D3DXToRadian(fRot));
m_v3Position.z = c_rv3Pos.z + frandom(1500.0f, 2000.0f);
m_v3Velocity.x = 0.0f;
m_v3Velocity.y = 0.0f;
m_v3Velocity.z = frandom(-50.0f, -200.0f);
m_fHalfWidth = frandom(2.0f, 7.0f);
m_fHalfHeight = m_fHalfWidth;
m_bActivate = true;
m_bChangedSize = false;
m_fPeriod = frandom(1.5f, 5.0f);
m_fcurRadian = frandom(-1.6f, 1.6f);
m_fAmplitude = frandom(1.0f, 3.0f);
}
CSnowParticle * CSnowParticle::New()
{
if (ms_kVct_SnowParticlePool.empty())
{
return new CSnowParticle;
}
CSnowParticle * pParticle = ms_kVct_SnowParticlePool.back();
ms_kVct_SnowParticlePool.pop_back();
return pParticle;
}
void CSnowParticle::Delete(CSnowParticle * pSnowParticle)
{
ms_kVct_SnowParticlePool.push_back(pSnowParticle);
}
void CSnowParticle::DestroyPool()
{
stl_wipe(ms_kVct_SnowParticlePool);
}
CSnowParticle::CSnowParticle()
{
}
CSnowParticle::~CSnowParticle()
{
}