Page principale | Liste des namespaces | Hiérarchie des classes | Liste par ordre alphabétique | Liste des composants | Liste des fichiers | Membres des namespaces | Composants | Déclarations

ExCSystemeParticule.cpp

Aller à la documentation de ce fichier.
00001 /*
00002  * ExNihilo 3D Engine
00003  * 
00004  *  This program is free software; you can redistribute it and/or modify
00005  *  it under the terms of the GNU General Public License as published by
00006  *  the Free Software Foundation; either version 2 of the License, or
00007  *  (at your option) any later version.
00008  *
00009  *  This program is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *  GNU Library General Public License for more details.
00013  *
00014  *  You should have received a copy of the GNU General Public License
00015  *  along with this program; if not, write to the Free Software
00016  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017  *
00018  * Please read AUTHORS file !!!
00019  * 
00020  * $Id: ExCSystemeParticule.cpp,v 1.35 2002/12/13 11:45:03 data Exp $
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;//in particule by seconde
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         //DRAW AND DESTROY PARTICULE
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         //CREATE NEW PARTICULE
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 

Généré le Tue Oct 28 12:43:32 2003 pour ExNihilo par doxygen 1.3.4