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 ManagerTexture->SetCurrentObject(Name);
00124 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00125 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00126
00127 UnGuard
00128 }
00129
00130 void ExCSystemeParticule::CreateNewParticle(void)
00131 {
00132 Guard(void ExCParticule::CreateNewParticle(void))
00133 ExCParticule Particule;
00134 Particule.SetId(GetId());
00135 Particule.SetManagerCollision(ManagerCollision);
00136 ExCRandomNumber Randomnum;
00137 ExCVec3D Velocity,Acceleration,Gravity;
00138 Particule.SetParticuleTexture(m_TextureID);
00139 Particule.SetParticuleType(m_Type);
00140 Particule.SetParticulePosition(m_CurrentEmitPosition);
00141 Particule.SetParticuleLife(Randomnum.getInt(m_MinLifeSpan,m_MaxLifeSpan));
00142 Particule.SetParticuleWeight(Randomnum.getInt(m_MinWeight,m_MaxWeight));
00143 Particule.SetParticuleColorB(Randomnum.getInt(m_MinColorB,m_MaxColorB));
00144 Particule.SetParticuleColorG(Randomnum.getInt(m_MinColorG,m_MaxColorG));
00145 Particule.SetParticuleColorR(Randomnum.getInt(m_MinColorR,m_MaxColorR));
00146 Particule.SetParticuleBlending(Randomnum.getInt(m_MinBlending,m_MaxBlending));
00147 Particule.SetParticuleMass(1.0f);
00148 Particule.SetParticuleSize(Randomnum.getFloat (m_MinSize,m_MaxSize));
00149 Particule.SetParticuleGrowth(Randomnum.getFloat (m_MinGrowth,m_MaxGrowth));
00150 Velocity.m_Vector[0]=Randomnum.getFloat(m_MaxVelocity.m_Vector[0],m_MinVelocity.m_Vector[0]);
00151 Velocity.m_Vector[1]=Randomnum.getFloat(m_MaxVelocity.m_Vector[1],m_MinVelocity.m_Vector[1]);
00152 Velocity.m_Vector[2]=Randomnum.getFloat(m_MaxVelocity.m_Vector[2],m_MinVelocity.m_Vector[2]);
00153 Particule.SetParticuleVelocity(Velocity);
00154 Acceleration.m_Vector[0]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[0],m_MinAcceleration.m_Vector[0]);
00155 Acceleration.m_Vector[1]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[1],m_MinAcceleration.m_Vector[1]);
00156 Acceleration.m_Vector[2]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[2],m_MinAcceleration.m_Vector[2]);
00157 Particule.SetParticuleAcceleration(Acceleration);
00158 Gravity.m_Vector[0]=Randomnum.getFloat(m_MaxGravity.m_Vector[0],m_MinGravity.m_Vector[0]);
00159 Gravity.m_Vector[1]=Randomnum.getFloat(m_MaxGravity.m_Vector[1],m_MinGravity.m_Vector[1]);
00160 Gravity.m_Vector[2]=Randomnum.getFloat(m_MaxGravity.m_Vector[2],m_MinGravity.m_Vector[2]);
00161 Particule.SetParticuleGravity(Gravity);
00162 Particule.PrecalculeParticuleTrajectory(0,Particule.GetParticuleLife());
00163 m_VecParticule.push_back(Particule);
00164 UnGuard
00165 }
00166
00167 void ExCSystemeParticule::CalculateEmitPosition(void)
00168 {
00169 Guard(void ExCParticule::CalculateEmitPosition(void))
00170 ExCRandomNumber Randomnum;
00171
00172 switch(m_TypeEmmeteur)
00173 {
00174 case EMMETEUR_POINT :
00175 m_CurrentEmitPosition=m_Position+m_P1;
00176 break;
00177
00178 case EMMETEUR_LIGNE :
00179 case EMMETEUR_RECTANGLE :
00180 case EMMETEUR_CUBE :
00181 m_CurrentEmitPosition.SetValue(Randomnum.getFloat(m_P1.m_Vector[0],m_P2.m_Vector[0]),
00182 Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]),
00183 Randomnum.getFloat(m_P1.m_Vector[2],m_P2.m_Vector[2]));
00184 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00185 break;
00186
00187 case EMMETEUR_CERCLE :
00188 m_angle=Randomnum.getInt(0,360);
00189 m_CurrentEmitPosition.SetValue(Cos[m_angle]*m_rayon,Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]),Sin[m_angle]*m_rayon);
00190 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00191 break;
00192
00193 case EMMETEUR_DISQUE :
00194 m_angle++;
00195 if(m_angle>360)m_angle=0;
00196 m_CurrentEmitPosition.SetValue(Sin[m_angle]*m_rayon,Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]),Sin[m_angle]*(Randomnum.getFloat(0.0f,m_rayon)));
00197 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00198 break;
00199
00200 case EMMETEUR_SPIRAL :
00201 m_angle+=m_vitesseangle;
00202 if(m_angle>360)m_angle=0;
00203 m_CurrentEmitPosition.SetValue(Cos[m_angle]*m_rayon,Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]),Sin[m_angle]*m_rayon);
00204 m_CurrentEmitPosition=m_Position+m_CurrentEmitPosition;
00205 break;
00206 }
00207 UnGuard
00208 }
00209
00210 void ExCSystemeParticule::Draw(void)
00211 {
00212 Guard(void ExCSystemeParticule::Draw(void))
00213 int i;
00214
00215
00216
00217 ExCFrustum Frustrum;
00218 Frustrum.CalculateFrustum();
00219 glPushMatrix();
00220 glPushAttrib(GL_ALL_ATTRIB_BITS);
00221 glRotatef(m_Angle.GetX(),1,0,0);
00222 glRotatef(m_Angle.GetY(),0,1,0);
00223 glRotatef(m_Angle.GetZ(),0,0,1);
00224 if(m_VecParticule.size()>0)
00225 {
00226 for(i=0,m_ItVecParticule=m_VecParticule.begin();(unsigned)i<m_VecParticule.size();m_ItVecParticule++,i++)
00227 {
00228
00229 if(Frustrum.PointInFrustum(m_ItVecParticule->GetPositionNow().GetX(),m_ItVecParticule->GetPositionNow().GetY(),m_ItVecParticule->GetPositionNow().GetZ()))
00230 {
00231 m_ItVecParticule->Draw();
00232
00233 }
00234 if(!m_Pause)m_ItVecParticule->DecreaseLifeSpan();
00235 if(!m_State)m_ItVecParticule->DecreaseLifeSpan();
00236 if(m_ItVecParticule->GetParticuleLife()<=0)m_VecParticule.erase(m_ItVecParticule);
00237 }
00238 }
00239 glPopAttrib();
00240 glPopMatrix();
00241 if(m_Pause)return;
00242
00243
00244
00245 for(unsigned int j=0;j<m_EmissionRate;j++)
00246 {
00247 if(m_VecParticule.size()<m_MaxParticule)
00248 {
00249 CalculateEmitPosition();
00250 CreateNewParticle();
00251 }else return;
00252 }
00253 UnGuard
00254 }
00255
00256
00257
00258
00259 bool ExCSystemeParticule::Load(std::string FileName)
00260 {
00261 Guard(bool ExCParticule::Load(std::string FileName))
00262 SetName(ExNihilo::ExtracValueFromSring(FileName,"/Data/ParticuleSystem/",".part"));
00263 m_EmissionRate = ExNihilo::ExtractIntValueFromFile(FileName,"<EmissionRate>","<#EmissionRate>");
00264 m_MaxParticule = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxParticule>","<#MaxParticule>");
00265 m_TypeEmmeteur = ExNihilo::ExtractIntValueFromFile(FileName,"<TypeEmmeteur>","<#TypeEmmeteur>");
00266 m_rayon = ExNihilo::ExtractFloatValueFromFile(FileName,"<Rayon>","<#Rayon>");
00267 m_vitesseangle = ExNihilo::ExtractFloatValueFromFile(FileName,"<VitessAngle>","<#VitessAngle>");
00268 m_MaxLifeSpan = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxLifeSpan>","<#MaxLifeSpan>");
00269 m_MinLifeSpan = ExNihilo::ExtractIntValueFromFile(FileName,"<MinLifeSpan>","<#MinLifeSpan>");
00270 m_MinGrowth = ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGrowth>","<#MinGrowth>");
00271 m_MaxGrowth = ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGrowth>","<#MaxGrowth>");
00272 m_MaxSize = ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxSize>","<#MaxSize>");
00273 m_MinSize = ExNihilo::ExtractFloatValueFromFile(FileName,"<MinSize>","<#MinSize>");
00274 m_MaxWeight = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxWeight>","<#MaxWeight>");
00275 m_MinWeight = ExNihilo::ExtractIntValueFromFile(FileName,"<MinWeight>","<#MinWeight>");
00276 m_MaxColorR = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorR>","<#MaxColorR>");
00277 m_MinColorR = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorR>","<#MinColorR>");
00278 m_MaxColorG = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorG>","<#MaxColorG>");
00279 m_MinColorG = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorG>","<#MinColorG>");
00280 m_MaxColorB = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxColorB>","<#MaxColorB>");
00281 m_MinColorB = ExNihilo::ExtractIntValueFromFile(FileName,"<MinColorB>","<#MinColorB>");
00282 m_MaxBlending = ExNihilo::ExtractIntValueFromFile(FileName,"<MaxBlending>","<#MaxBlending>");
00283 m_MinBlending = ExNihilo::ExtractIntValueFromFile(FileName,"<MinBlending>","<#MinBlending>");
00284 m_Type = ExNihilo::ExtractIntValueFromFile(FileName,"<Type>","<#Type>");
00285 m_P1.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1X>","<#Point1X>"));
00286 m_P1.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1y>","<#Point1y>"));
00287 m_P1.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point1z>","<#Point1z>"));
00288 m_P2.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2X>","<#Point2X>"));
00289 m_P2.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2y>","<#Point2y>"));
00290 m_P2.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<Point2z>","<#Point2z>"));
00291 m_MaxVelocity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityX>","<#MaxVelocityX>"));
00292 m_MaxVelocity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityY>","<#MaxVelocityY>"));
00293 m_MaxVelocity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxVelocityZ>","<#MaxVelocityZ>"));
00294 m_MinVelocity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityX>","<#MinVelocityX>"));
00295 m_MinVelocity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityY>","<#MinVelocityY>"));
00296 m_MinVelocity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinVelocityZ>","<#MinVelocityZ>"));
00297 m_MaxAcceleration.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationX>","<#MaxAccelerationX>"));
00298 m_MaxAcceleration.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationY>","<#MaxAccelerationY>"));
00299 m_MaxAcceleration.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxAccelerationZ>","<#MaxAccelerationZ>"));
00300 m_MinAcceleration.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationX>","<#MinAccelerationX>"));
00301 m_MinAcceleration.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationY>","<#MinAccelerationY>"));
00302 m_MinAcceleration.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinAccelerationZ>","<#MinAccelerationZ>"));
00303 m_MaxGravity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityX>","<#MaxGravityX>"));
00304 m_MaxGravity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityY>","<#MaxGravityY>"));
00305 m_MaxGravity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MaxGravityZ>","<#MaxGravityZ>"));
00306 m_MinGravity.SetX(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityX>","<#MinGravityX>"));
00307 m_MinGravity.SetY(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityY>","<#MinGravityY>"));
00308 m_MinGravity.SetZ(ExNihilo::ExtractFloatValueFromFile(FileName,"<MinGravityZ>","<#MinGravityZ>"));
00309 if(m_Type>2)
00310 {
00311 SetParticuleTexture(ExNihilo::ExtracStringValueFromFile(FileName,"<Texture>","<#Texture>"));
00312 }
00313 return true;
00314 UnGuard
00315 }
00316