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.34 2002/12/08 17:57:07 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 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         //DRAW AND DESTROY PARTICULE
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         //CREATE NEW PARTICULE
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 

Généré le Tue Dec 10 18:18:10 2002 pour ExNihilo par doxygen1.3-rc1