📄 particlesystem.cpp
字号:
#include "StdAfx.h"
#include ".\particlesystem.h"
#include "ParticleEmitter.h"
CParticleSystem::CParticleSystem(LPDIRECT3DDEVICE9 device)
{
m_pDevice=device;
m_look=m_up=D3DXVECTOR3(0,0,0);
m_EmitterMap.clear();
m_vecPosition = D3DXVECTOR3(0,0,0);
m_renderRect.bottom=m_renderRect.left=m_renderRect.right=m_renderRect.top=0;
}
CParticleSystem::~CParticleSystem()
{
Destroy();
}
void CParticleSystem::SetRenderRect(RECT rect){
m_renderRect=rect;
}
RECT CParticleSystem::GetRenderRect(){
return m_renderRect;
}
CParticleEmitter* CParticleSystem::PushEmitter( const string& name , long maxparticle , long emit_ps , float spd , float size , D3DCOLOR clr )
{
// 注册
CParticleEmitter* emit = new CParticleEmitter( m_pDevice,this , name , maxparticle , emit_ps , spd , size , clr );
m_EmitterMap.insert( make_pair(name , emit) );
EmitParameter para;
para.name=name;
para.maxnumber=maxparticle;
para.productPS=emit_ps;
para.size=size;
para.sizeVar=0;
para.color=clr;
para.colorVar=0;
para.life=0;
para.lifeVar=0;
para.relativePos=D3DXVECTOR3(0,0,0);
para.speedDir=D3DXVECTOR3(0,0,0);
para.speedDirVar=D3DXVECTOR3(0,0,0);
para.texture="";
para.speed=0;
m_ParameterVector.push_back(para);
emit->Initialize();
return emit;
}
CParticleEmitter* CParticleSystem::GetEmitter( const string& name )
{
EmitterMap::iterator it = m_EmitterMap.find( name );
if ( it == m_EmitterMap.end() )
{
return NULL;
}
return it->second;
}
long CParticleSystem::GetEmitterNumber()
{
return (long)m_EmitterMap.size();
}
void CParticleSystem::RemoveEmitter( const string& name )
{
EmitterMap::iterator it = m_EmitterMap.find( name );
if ( it == m_EmitterMap.end() )
{
return;
}
SAFE_DELETE( it->second );
m_EmitterMap.erase( it );
}
void CParticleSystem::RemoveEmitter( CParticleEmitter* emit )
{
RemoveEmitter(emit->GetName());
}
void CParticleSystem::Initialize()
{
EmitterMap::iterator it = m_EmitterMap.begin();
for ( ; it != m_EmitterMap.end() ; ++it )
{
it->second->Initialize();
}
}
void CParticleSystem::Update( float fElapsed )
{
EmitterMap::iterator it = m_EmitterMap.begin();
for ( ; it != m_EmitterMap.end() ; ++it )
{
it->second->Update( fElapsed );
}
}
void CParticleSystem::SetEmitParameter(CParticleEmitter *emit,EmitParameter *parameter){
emit->SetColor(parameter->color,parameter->colorVar);
emit->SetEmitRate(parameter->productPS);
emit->SetLifeSpan(parameter->life,parameter->lifeVar);
emit->SetRelativePos(parameter->relativePos);
emit->SetSize(parameter->size,parameter->sizeVar);
emit->SetSpeed(parameter->speedDir,parameter->speedDirVar);
emit->SetName(parameter->name);
emit->SetTexture(parameter->texture._Myptr());
}
void CParticleSystem::Render(CCamera *camera)
{
m_cameraDirection=camera->GetDirection();
m_look=*(camera->GetLookat());
m_up=*(camera->GetUp());
EmitterMap::iterator it = m_EmitterMap.begin();
int pos=0;
for ( ; it != m_EmitterMap.end() ; ++it,++pos)
{
bool find=false;
for (int i=0;i<(int)(m_ParameterVector.size())&&find==false;i++)
{
EmitParameter parame=m_ParameterVector.at(i);
if(strcmp(parame.name._Myptr(),it->second->GetName()._Myptr())==0)
{
SetEmitParameter(it->second,&m_ParameterVector.at(i));
it->second->Render(m_cameraDirection);
find=true;
}
}
}
}
void CParticleSystem::Destroy()
{
EmitterMap::iterator it = m_EmitterMap.begin();
for ( ; it != m_EmitterMap.end() ; ++it )
{ SAFE_DELETE( it->second ); }
m_EmitterMap.clear();
SAFE_RELEASE(m_pDevice);
}
void CParticleSystem::SetActive( bool act )
{
EmitterMap::iterator it = m_EmitterMap.begin();
for ( ; it != m_EmitterMap.end() ; ++it )
{
it->second->SetActive( act );
}
}
bool CParticleSystem::GetActive()
{
bool act = false;
EmitterMap::iterator it = m_EmitterMap.begin();
for ( ; it != m_EmitterMap.end() ; ++it )
{
act |= it->second->GetActive();
}
return act;
}
void CParticleSystem::SetPosition( const D3DXVECTOR3& pos )
{
// 各个子Emitter的Pos变化由他们自己去做
m_vecPosition = pos;
}
D3DXVECTOR3& CParticleSystem::GetPosition()
{
return m_vecPosition;
}
void CParticleSystem::Read(char* filename,char* section,char* property,char *value){
sprintf(value,"%s","");//清空记录
GetPrivateProfileString(section,property,Error,
value,FILESIZE,filename);
}
void CParticleSystem::Write(char *filename,char*section,char* property,char* value){
int ret=WritePrivateProfileString(section,property,value,filename);
}
bool CParticleSystem::ExportConfigFile(char *filename)
{
char* section=new char[FILESIZE];
char* value=new char[FILESIZE];
char* property=new char[FILESIZE];
//配置文件标识符
Write(filename,"FileType","Type","ParticleSystem");
//写粒子池的个数
sprintf(value,"%d",(int)(m_EmitterMap.size()));
Write(filename,"EmitNumber","EmitNum",value);
EmitterMap::iterator it = m_EmitterMap.begin();
int pos=0;
for ( ; it != m_EmitterMap.end() ; ++it,++pos)
{
//写特定粒子池的段名
sprintf(section,"%s%d","Emit",pos+1);
EmitParameter parame=m_ParameterVector.at(pos);
//写粒子池的名字
Write(filename,section,"EmitName",(parame.name)._Myptr());
//粒子池的最大粒子数
sprintf(value,"%d",parame.maxnumber);
Write(filename,section,"EmitPoolSize",value);
//粒子池的发射频率
sprintf(value,"%d",parame.productPS);
Write(filename,section,"EmitPS",value);
//粒子池的纹理
if(strlen(parame.texture._Myptr())<=0)
Write(filename,section,"EmitTexture","NULL");
else
Write(filename,section,"EmitTexture",(parame.texture)._Myptr());
//粒子池对发射中心的相对位置
//X
sprintf(value,"%f",parame.relativePos.x);
Write(filename,section,"EmitPosX",value);
//Y
sprintf(value,"%f",parame.relativePos.y);
Write(filename,section,"EmitPosY",value);
//Z
sprintf(value,"%f",parame.relativePos.z);
Write(filename,section,"EmitPosZ",value);
//粒子池的颜色属性
//基本颜色
sprintf(value,"%d",parame.color);
Write(filename,section,"EmitColorBase",value);
//变量颜色
sprintf(value,"%d",parame.colorVar);
Write(filename,section,"EmitColorVar",value);
//粒子池的生命周期属性
//基本生命
sprintf(value,"%f",parame.life);
Write(filename,section,"EmitLife",value);
//变量生命
sprintf(value,"%f",parame.lifeVar);
Write(filename,section,"EmitLifeVar",value);
//粒子池的大小属性
//基本大小
sprintf(value,"%f",parame.size);
Write(filename,section,"EmitSize",value);
//变量大小
sprintf(value,"%f",parame.sizeVar);
Write(filename,section,"EmitSizeVar",value);
//粒子池对发射方向
//X
sprintf(value,"%f",parame.speedDir.x);
Write(filename,section,"EmitDirX",value);
//Y
sprintf(value,"%f",parame.speedDir.y);
Write(filename,section,"EmitDirY",value);
//Z
sprintf(value,"%f",parame.speedDir.z);
Write(filename,section,"EmitDirZ",value);
//粒子池对发射方向变量
//X
sprintf(value,"%f",parame.speedDirVar.x);
Write(filename,section,"EmitDirVarX",value);
//Y
sprintf(value,"%f",parame.speedDirVar.y);
Write(filename,section,"EmitDirVarY",value);
//Z
sprintf(value,"%f",parame.speedDirVar.z);
Write(filename,section,"EmitDirVarZ",value);
//粒子池的外力参数
int a=0;//轴向外力标记
int b=0;//区域影响标记
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -