00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ExCSystemeParticule.h"
00025
00026 ExCSystemeParticule::ExCSystemeParticule(void)
00027 {
00028 Guard(ExCSystemeParticule::ExCSystemeParticule(void))
00029 m_MaxLifeSpan = 100;
00030 m_MinLifeSpan = 10;
00031 m_MaxSize = 0.3f;
00032 m_MinSize = 0.00f;
00033 m_MaxWeight = 10;
00034 m_MinWeight = 1;
00035 m_MaxColorR = 255;
00036 m_MinColorR = 0;
00037 m_MaxColorG = 255;
00038 m_MinColorG = 0;
00039 m_MaxColorB = 255;
00040 m_MinColorB = 0;
00041 m_MaxBlending = 255;
00042 m_MinBlending = 200;
00043 m_MaxVelocity.SetValue(0.0f,1.0f,0.0f);
00044 m_MinVelocity.SetValue(0.0f,1.0f,0.0f);
00045 m_MaxAcceleration.SetValue(0.0f,0.0f,0.0f);
00046 m_MinAcceleration.SetValue(0.0f,0.0f,0.0f);
00047 m_MaxGravity.SetValue(0.0f,0.0f,0.0f);
00048 m_MinGravity.SetValue(0.0f,0.0f,0.0f);
00049 m_Type = PARTICULE_TEXTURE;
00050 m_TimeLastParticule=0;
00051
00052 m_MaxParticule =100;
00053 m_EmissionRate =10;
00054 m_Pause=false;
00055 m_State=true;
00056 m_angle=5;
00057 m_rayon=3.0f;
00058 m_vitesseangle=1.0f;
00059 m_ParticuleSystemeName = new char[20];
00060 m_TypeEmmeteur=EMMETEUR_POINT;
00061 m_TextureID=-1;
00062
00063 m_P1.SetValue(0.0f,0.0f,0.0f);
00064 m_P2.SetValue(10.0f,0.0f,0.0f);
00065
00066 SetName("ExCSystemeParticule");
00067 SetType(typeid(this).name());
00068
00069 UnGuard
00070 }
00071
00072 ExCSystemeParticule::~ExCSystemeParticule(void)
00073 {
00074 Guard(ExCSystemeParticule::~ExCSystemeParticule(void))
00075 UnGuard
00076 }
00077
00078 void ExCSystemeParticule::SetParticuleSystemeName(char * name)
00079 {
00080 Guard(void ExCParticule::SetParticuleSystemeName(char * name))
00081 m_ParticuleSystemeName=new char[strlen(name)];
00082 strcpy(m_ParticuleSystemeName,name);
00083 UnGuard
00084 }
00085
00086 void ExCSystemeParticule::SetParticuleType(int type)
00087 {
00088 Guard(void ExCParticule::SetParticuleType(int type))
00089 m_Type=type;
00090 if(m_Type>3)m_Type=1;
00091 UnGuard
00092 }
00093
00094 void ExCSystemeParticule::Start(void)
00095 {
00096 Guard(void ExCSystemeParticule::Start(void))
00097 m_State=true;
00098 m_Pause=false;
00099 UnGuard
00100 }
00101
00102 void ExCSystemeParticule::Pause(void)
00103 {
00104 Guard(void ExCSystemeParticule::Pause(void))
00105 m_Pause=true;
00106 UnGuard
00107 }
00108
00109 void ExCSystemeParticule::Stop(void)
00110 {
00111 Guard(void ExCSystemeParticule::Stop(void))
00112 m_Pause=true;
00113 m_State=false;
00114 UnGuard
00115 }
00116
00117 void ExCSystemeParticule::SetParticuleTexture(std::string Name)
00118 {
00119 Guard(void ExCParticule::SetParticuleTexture(std::string Name))
00120 ManagerTexture->Load(Name);
00121 m_TextureName=Name;
00122 m_TextureID=ManagerTexture->GetTextureId(m_TextureName);
00123 UnGuard
00124 }
00125
00126 void ExCSystemeParticule::CreateNewParticle(void)
00127 {
00128 Guard(void ExCParticule::CreateNewParticle(void))
00129 ExCParticule Particule;
00130 ExCRandomNumber Randomnum;
00131 ExCVec3D Velocity,Acceleration,Gravity;
00132 Particule.SetParticuleTexture(m_TextureID);
00133 Particule.SetParticuleType(m_Type);
00134 Particule.SetParticulePosition(m_CurrentEmitPosition);
00135 Particule.SetParticuleLife(Randomnum.getInt(m_MinLifeSpan,m_MaxLifeSpan));
00136 Particule.SetParticuleWeight(Randomnum.getInt(m_MinWeight,m_MaxWeight));
00137 Particule.SetParticuleColorB(Randomnum.getInt(m_MinColorB,m_MaxColorB));
00138 Particule.SetParticuleColorG(Randomnum.getInt(m_MinColorG,m_MaxColorG));
00139 Particule.SetParticuleColorR(Randomnum.getInt(m_MinColorR,m_MaxColorR));
00140 Particule.SetParticuleBlending(Randomnum.getInt(m_MinBlending,m_MaxBlending));
00141 Particule.SetParticuleMass(1.0f);
00142 Particule.SetParticuleSize(Randomnum.getFloat (m_MinSize,m_MaxSize));
00143 Particule.SetParticuleGrowth(Randomnum.getFloat (m_MinGrowth,m_MaxGrowth));
00144 Velocity.m_Vector[0]=Randomnum.getFloat(m_MaxVelocity.m_Vector[0],m_MinVelocity.m_Vector[0]);
00145 Velocity.m_Vector[1]=Randomnum.getFloat(m_MaxVelocity.m_Vector[1],m_MinVelocity.m_Vector[1]);
00146 Velocity.m_Vector[2]=Randomnum.getFloat(m_MaxVelocity.m_Vector[2],m_MinVelocity.m_Vector[2]);
00147 Particule.SetParticuleVelocity(Velocity);
00148 Acceleration.m_Vector[0]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[0],m_MinAcceleration.m_Vector[0]);
00149 Acceleration.m_Vector[1]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[1],m_MinAcceleration.m_Vector[1]);
00150 Acceleration.m_Vector[2]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[2],m_MinAcceleration.m_Vector[2]);
00151 Particule.SetParticuleAcceleration(Acceleration);
00152 Gravity.m_Vector[0]=Randomnum.getFloat(m_MaxGravity.m_Vector[0],m_MinGravity.m_Vector[0]);
00153 Gravity.m_Vector[1]=Randomnum.getFloat(m_MaxGravity.m_Vector[1],m_MinGravity.m_Vector[1]);
00154 Gravity.m_Vector[2]=Randomnum.getFloat(m_MaxGravity.m_Vector[2],m_MinGravity.m_Vector[2]);
00155 Particule.SetParticuleGravity(Gravity);
00156 Particule.PrecalculeParticuleTrajectory(0,Particule.GetParticuleLife());
00157 m_VecParticule.push_back(Particule);
00158 UnGuard
00159 }
00160
00161 void ExCSystemeParticule::CalculateEmitPosition(void)
00162 {
00163 Guard(void ExCParticule::CalculateEmitPosition(void))
00164 ExCRandomNumber Randomnum;
00165
00166 switch(m_TypeEmmeteur)
00167 {
00168 case EMMETEUR_POINT :
00169 m_CurrentEmitPosition=m_Position+m_P1;
00170 break;
00171
00172 case EMMETEUR_LIGNE :
00173 case EMMETEUR_RECTANGLE :
00174 case EMMETEUR_CUBE :
00175 m_CurrentEmitPosition.SetValue(Randomnum.getFloat(m_P1.m_Vector[0],m_P2.m_Vector[0]),
00176 Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]),
00177 Randomnum.getFloat(m_P1.m_Vector[2],m_P2.m_Vector[2]));
00178 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00179 break;
00180
00181 case EMMETEUR_CERCLE :
00182 m_angle=Randomnum.getInt(0,360);
00183 m_CurrentEmitPosition.SetValue(Cos[m_angle]*m_rayon,0.0f,Sin[m_angle]*m_rayon);
00184 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00185 break;
00186
00187 case EMMETEUR_DISQUE :
00188 m_angle++;
00189 if(m_angle>360)m_angle=0;
00190 m_CurrentEmitPosition.SetValue(Sin[m_angle]*m_rayon,0.0f,Sin[m_angle]*(Randomnum.getFloat(0.0f,m_rayon)));
00191 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00192 break;
00193
00194 case EMMETEUR_SPIRAL :
00195 m_angle+=m_vitesseangle;
00196 if(m_angle>360)m_angle=0;
00197 m_CurrentEmitPosition.SetValue(Cos[m_angle]*m_rayon,0.0f,Sin[m_angle]*m_rayon);
00198 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00199 break;
00200 }
00201 UnGuard
00202 }
00203
00204 void ExCSystemeParticule::Draw(void)
00205 {
00206 Guard(void ExCSystemeParticule::Draw(void))
00207 int i;
00208
00209
00210
00211 glPushMatrix();
00212 glRotatef(m_AngleX,1,0,0);
00213 glRotatef(m_AngleY,0,1,0);
00214 glRotatef(m_AngleZ,0,0,1);
00215 if(m_VecParticule.size()>0)
00216 {
00217 for(i=0,m_ItVecParticule=m_VecParticule.begin();(unsigned)i<m_VecParticule.size();m_ItVecParticule++,i++)
00218 {
00219 m_ItVecParticule->Draw();
00220 if(!m_Pause)m_ItVecParticule->DecreaseLifeSpan();
00221 if(!m_State)m_ItVecParticule->DecreaseLifeSpan();
00222 if(m_ItVecParticule->GetParticuleLife()<=0)m_VecParticule.erase(m_ItVecParticule);
00223 }
00224 }
00225 glPopMatrix();
00226 if(m_Pause)return;
00227
00228
00229
00230 for(int j=0;j<m_EmissionRate;j++)
00231 {
00232 if(m_VecParticule.size()<m_MaxParticule)
00233 {
00234 CalculateEmitPosition();
00235 CreateNewParticle();
00236 }else return;
00237 }
00238 UnGuard
00239 }
00240
00241
00242
00243
00244 bool ExCSystemeParticule::Load(std::string FileName)
00245 {
00246 Guard(bool ExCParticule::Load(std::string FileName))
00247 SetName(ExNihilo::ExtracValueFromSring(FileName,"/Data/ParticuleSystem/",".part"));
00248 m_EmissionRate = ExNihilo::ExtractIntValueFromFile(FileName,"<EmissionRate>","<#EmissionRate>");
00249 m_MaxParticule = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxParticule>","<#MaxParticule>");
00250 m_TypeEmmeteur = ExNihilo::ExtractIntValueFromFile(FileName,"<TypeEmmeteur>","<#TypeEmmeteur>");
00251 m_rayon = ExNihilo::ExtractFloatValueFromFile(FileName,"<Rayon>","<#Rayon>");
00252 m_vitesseangle = ExNihilo::ExtractFloatValueFromFile(FileName,"<VitessAngle>","<#VitessAngle>");
00253 m_MaxLifeSpan = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxLifeSpan>","<#MaxLifeSpan>");
00254 m_MinLifeSpan = ExNihilo::ExtractIntValueFromFile(FileName,"<MinLifeSpan>","<#MinLifeSpan>");
00255 m_MinGrowth = ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGrowth>","<#MinGrowth>");
00256 m_MaxGrowth = ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGrowth>","<#MaxGrowth>");
00257 m_MaxSize = ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxSize>","<#MaxSize>");
00258 m_MinSize = ExNihilo::ExtractFloatValueFromFile(FileName,"<MinSize>","<#MinSize>");
00259 m_MaxWeight = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxWeight>","<#MaxWeight>");
00260 m_MinWeight = ExNihilo::ExtractIntValueFromFile(FileName,"<MinWeight>","<#MinWeight>");
00261 m_MaxColorR = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorR>","<#MaxColorR>");
00262 m_MinColorR = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorR>","<#MinColorR>");
00263 m_MaxColorG = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorG>","<#MaxColorG>");
00264 m_MinColorG = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorG>","<#MinColorG>");
00265 m_MaxColorB = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorB>","<#MaxColorB>");
00266 m_MinColorB = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorB>","<#MinColorB>");
00267 m_MaxBlending = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxBlending>","<#MaxBlending>");
00268 m_MinBlending = ExNihilo::ExtractIntValueFromFile(FileName,"<MinBlending>","<#MinBlending>");
00269 m_Type = ExNihilo::ExtractIntValueFromFile(FileName,"<Type>","<#Type>");
00270 m_P1.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1X>","<#Point1X>"));
00271 m_P1.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1y>","<#Point1y>"));
00272 m_P1.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1z>","<#Point1z>"));
00273 m_P2.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2X>","<#Point2X>"));
00274 m_P2.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2y>","<#Point2y>"));
00275 m_P2.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2z>","<#Point2z>"));
00276 m_MaxVelocity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityX>","<#MaxVelocityX>"));
00277 m_MaxVelocity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityY>","<#MaxVelocityY>"));
00278 m_MaxVelocity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityZ>","<#MaxVelocityZ>"));
00279 m_MinVelocity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityX>","<#MinVelocityX>"));
00280 m_MinVelocity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityY>","<#MinVelocityY>"));
00281 m_MinVelocity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityZ>","<#MinVelocityZ>"));
00282 m_MaxAcceleration.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationX>","<#MaxAccelerationX>"));
00283 m_MaxAcceleration.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationY>","<#MaxAccelerationY>"));
00284 m_MaxAcceleration.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationZ>","<#MaxAccelerationZ>"));
00285 m_MinAcceleration.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationX>","<#MinAccelerationX>"));
00286 m_MinAcceleration.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationY>","<#MinAccelerationY>"));
00287 m_MinAcceleration.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationZ>","<#MinAccelerationZ>"));
00288 m_MaxGravity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityX>","<#MaxGravityX>"));
00289 m_MaxGravity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityY>","<#MaxGravityY>"));
00290 m_MaxGravity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityZ>","<#MaxGravityZ>"));
00291 m_MinGravity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityX>","<#MinGravityX>"));
00292 m_MinGravity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityY>","<#MinGravityY>"));
00293 m_MinGravity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityZ>","<#MinGravityZ>"));
00294 if(m_Type==3)
00295 {
00296 SetParticuleTexture(ExNihilo::ExtracStringValueFromFile(FileName,"<Texture>","<#Texture>"));
00297 }
00298 return true;
00299 UnGuard
00300 }
00301