00001 #include "StdAfx.h" 00002 #include "excsdkparticulesyteme.h" 00003 00004 ExCSDKParticuleSyteme::ExCSDKParticuleSyteme(void) 00005 { 00006 m_MaxLifeSpan = 1000; 00007 m_MinLifeSpan = 100; 00008 m_MaxSize = 0.3f; 00009 m_MinSize = 0.00f; 00010 m_MaxWeight = 10; 00011 m_MinWeight = 1; 00012 m_MaxColorR = 255; 00013 m_MinColorR = 0; 00014 m_MaxColorG = 255; 00015 m_MinColorG = 0; 00016 m_MaxColorB = 255; 00017 m_MinColorB = 0; 00018 m_MaxBlending = 255; 00019 m_MinBlending = 200; 00020 m_MaxVelocity.SetValue(0.0f,1.0f,0.0f); 00021 m_MinVelocity.SetValue(0.0f,1.0f,0.0f); 00022 m_MaxAcceleration.SetValue(0.0f,0.0f,0.0f); 00023 m_MinAcceleration.SetValue(0.0f,0.0f,0.0f); 00024 m_MaxGravity.SetValue(0.0f,0.0f,0.0f); 00025 m_MinGravity.SetValue(0.0f,0.0f,0.0f); 00026 m_Type = PARTICULE_POINT; 00027 m_TimeLastParticule=0; 00028 00029 m_MaxParticule =10000; 00030 m_EmissionRate =10;//in particule by seconde 00031 m_Pause=false; 00032 m_State=true; 00033 m_angle=5; 00034 m_rayon=3.0f; 00035 m_ParticuleSystemeName = new char[20]; 00036 m_TypeEmmeteur=EMMETEUR_DISQUE; 00037 00038 m_P1.SetValue(0.0f,0.0f,0.0f); 00039 m_P2.SetValue(10.0f,0.0f,0.0f); 00040 00041 } 00042 00043 ExCSDKParticuleSyteme::~ExCSDKParticuleSyteme(void) 00044 { 00045 } 00046 00047 void ExCSDKParticuleSyteme::SetParticuleSystemeName(char * name) 00048 { 00049 m_ParticuleSystemeName=new char[strlen(name)]; 00050 strcpy(m_ParticuleSystemeName,name); 00051 } 00052 00053 void ExCSDKParticuleSyteme::SetParticuleType(int type) 00054 { 00055 m_Type=type; 00056 if(m_Type>3)m_Type=1; 00057 } 00058 00059 void ExCSDKParticuleSyteme::SetParticuleTexture(char *texture) 00060 { 00061 LoadTexture(texture); 00062 } 00063 00064 void ExCSDKParticuleSyteme::Draw(void) 00065 { 00066 /* ExCRandomNumber Randomnum; 00067 double a,c; 00068 unsigned int i; 00069 00070 glPushMatrix(); 00071 00072 ExCVec3D Position; 00073 00074 switch(m_TypeEmmeteur) 00075 { 00076 case EMMETEUR_POINT : 00077 Position=m_Position+m_P1; 00078 break; 00079 00080 case EMMETEUR_LIGNE : 00081 case EMMETEUR_RECTANGLE : 00082 case EMMETEUR_CUBE : 00083 Position.SetValue(Randomnum.getFloat(m_P1.m_Vector[0],m_P2.m_Vector[0]), 00084 Randomnum.getFloat(m_P1.m_Vector[1],m_P2.m_Vector[1]), 00085 Randomnum.getFloat(m_P1.m_Vector[2],m_P2.m_Vector[2])); 00086 Position=m_Position+Position; 00087 break; 00088 00089 case EMMETEUR_CERCLE : 00090 a=Cos[m_angle]*m_rayon; 00091 c=Sin[m_angle]*m_rayon; 00092 m_angle=Randomnum.getInt(0,360); 00093 Position.SetValue(a,0.0f,c); 00094 Position=m_Position+Position; 00095 break; 00096 00097 case EMMETEUR_DISQUE : 00098 a=Cos[m_angle]*(Randomnum.getFloat(0.0f,m_rayon)); 00099 c=Sin[m_angle]*(Randomnum.getFloat(0.0f,m_rayon)); 00100 m_angle++; 00101 if(m_angle>360)m_angle=0; 00102 Position.SetValue(a,0.0f,c); 00103 Position=m_Position+Position; 00104 break; 00105 00106 case EMMETEUR_SPIRAL : 00107 a=Cos[m_angle]*m_rayon; 00108 c=Sin[m_angle]*m_rayon; 00109 m_angle+=m_vitesseangle; 00110 if(m_angle>360)m_angle=0; 00111 Position.SetValue(a,0.0f,c); 00112 Position=m_Position+Position; 00113 break; 00114 } 00115 00116 time_t ltime; 00117 time( <ime ); 00118 00119 // create new particule 00120 if(!m_Pause) 00121 { 00122 if(m_TimeLastParticule<ltime) 00123 { 00124 ExCSDKParticule Particule; 00125 ExCVec3D Velocity,Acceleration,Gravity; 00126 Particule.SetParticuleTexture(m_Texture); 00127 Particule.SetParticuleType(m_Type); 00128 Particule.SetParticulePosition(Position); 00129 Particule.SetParticuleLife(Randomnum.getInt(m_MinLifeSpan,m_MaxLifeSpan)); 00130 Particule.SetParticuleWeight(Randomnum.getInt(m_MinWeight,m_MaxWeight)); 00131 Particule.SetParticuleColorB(Randomnum.getInt(m_MinColorB,m_MaxColorB)); 00132 Particule.SetParticuleColorG(Randomnum.getInt(m_MinColorG,m_MaxColorG)); 00133 Particule.SetParticuleColorR(Randomnum.getInt(m_MinColorR,m_MaxColorR)); 00134 Particule.SetParticuleBlending(Randomnum.getInt(m_MinBlending,m_MaxBlending)); 00135 Particule.SetParticuleMass(1.0f); 00136 //Particule.SetParticuleSize(Randomnum.getFloat (m_MinSize,m_MaxSize)); 00137 Velocity.m_Vector[0]=Randomnum.getFloat(m_MaxVelocity.m_Vector[0],m_MinVelocity.m_Vector[0]); 00138 Velocity.m_Vector[1]=Randomnum.getFloat(m_MaxVelocity.m_Vector[1],m_MinVelocity.m_Vector[1]); 00139 Velocity.m_Vector[2]=Randomnum.getFloat(m_MaxVelocity.m_Vector[2],m_MinVelocity.m_Vector[2]); 00140 Particule.SetParticuleVelocity(Velocity); 00141 Acceleration.m_Vector[0]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[0],m_MinAcceleration.m_Vector[0]); 00142 Acceleration.m_Vector[1]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[1],m_MinAcceleration.m_Vector[1]); 00143 Acceleration.m_Vector[2]=Randomnum.getFloat(m_MaxAcceleration.m_Vector[2],m_MinAcceleration.m_Vector[2]); 00144 Particule.SetParticuleAcceleration(Acceleration); 00145 Gravity.m_Vector[0]=Randomnum.getFloat(m_MaxGravity.m_Vector[0],m_MinGravity.m_Vector[0]); 00146 Gravity.m_Vector[1]=Randomnum.getFloat(m_MaxGravity.m_Vector[1],m_MinGravity.m_Vector[1]); 00147 Gravity.m_Vector[2]=Randomnum.getFloat(m_MaxGravity.m_Vector[2],m_MinGravity.m_Vector[2]); 00148 Particule.SetParticuleGravity(Gravity); 00149 Particule.PrecalculeParticuleTrajectory(0,Particule.GetParticuleLife()); 00150 m_VecParticule.push_back(Particule); 00151 } 00152 } 00153 glPopMatrix(); 00154 00155 if(m_VecParticule.size()>0) 00156 { 00157 00158 for(i=0,m_ItVecParticule=m_VecParticule.begin();i<m_VecParticule.size();m_ItVecParticule++,i++) 00159 { 00160 m_ItVecParticule->Draw(); 00161 if(!m_Pause)m_ItVecParticule->DecreaseLifeSpan(); 00162 if(!m_State)m_ItVecParticule->DecreaseLifeSpan(); 00163 if(m_ItVecParticule->GetParticuleLife()<0) 00164 { 00165 m_VecParticule.erase(m_ItVecParticule); 00166 } 00167 } 00168 }*/ 00169 } 00170 00171 void ExCSDKParticuleSyteme::Start(void) 00172 { 00173 m_State=true; 00174 m_Pause=false; 00175 } 00176 00177 void ExCSDKParticuleSyteme::Pause(void) 00178 { 00179 m_Pause=true; 00180 } 00181 00182 void ExCSDKParticuleSyteme::Stop(void) 00183 { 00184 m_Pause=true; 00185 m_State=false; 00186 } 00187 00188 bool ExCSDKParticuleSyteme::LoadTexture(const char * name) 00189 { 00190 return true; 00191 } 00192 bool ExCSDKParticuleSyteme::LoadParticuleSysteme(const char * FileName) 00193 { 00194 /* SetParticuleTexture("star"); 00195 m_Type=PARTICULE_TEXTURE; 00196 00197 int i=0; 00198 char ch; 00199 int FileSize; 00200 FILE *MyFile; 00201 bool endfile=false; 00202 std::string StBuffer; 00203 char buffer[255],bufferbis[255]; 00204 std::vector<float> vecvalue; 00205 00206 00207 sprintf(buffer,"../Data/ParticuleSystem/%s",FileName); 00208 m_ParticuleSystemeName=new char[strlen(FileName)]; 00209 sprintf(m_ParticuleSystemeName,"%s",FileName); 00210 00211 MyFile=fopen (buffer,"r"); 00212 if(!MyFile) 00213 { 00214 sprintf(bufferbis,"Particule syteme File not found:%s",buffer); 00215 AfxMessageBox(bufferbis); 00216 return false; 00217 }else 00218 { 00219 sprintf(buffer,"Loading Particule systeme file :%s",FileName); 00220 AfxMessageBox(buffer); 00221 00222 fseek(MyFile,0,SEEK_END); 00223 FileSize=ftell(MyFile); 00224 sprintf(bufferbis,"Size:%d",FileSize); 00225 AfxMessageBox(bufferbis); 00226 //Start of file 00227 fseek(MyFile,0,SEEK_SET); 00228 do 00229 { 00230 fread(&ch,sizeof(char),1,MyFile); 00231 }while(ch!='#'); 00232 //reading file type; 00233 do 00234 { 00235 fread(&ch,sizeof(char),1,MyFile); 00236 StBuffer=StBuffer+ch; 00237 }while(ch!='#'); 00238 if(strcmp(StBuffer.data(),"particulesystem#")==0) 00239 { 00240 for(i=0;i<44;i++) 00241 { 00242 StBuffer.erase(StBuffer.begin(),StBuffer.end()); 00243 do 00244 { 00245 fread(&ch,sizeof(char),1,MyFile); 00246 StBuffer=StBuffer+ch; 00247 }while(ch!='#'); 00248 StBuffer.erase(StBuffer.begin(),StBuffer.end()); 00249 do 00250 { 00251 fread(&ch,sizeof(char),1,MyFile); 00252 StBuffer=StBuffer+ch; 00253 }while(ch!='#'); 00254 00255 StBuffer.erase(StBuffer.end()-1,StBuffer.end()); 00256 00257 try 00258 { 00259 vecvalue.push_back(atof(StBuffer.data())); 00260 }catch(...) 00261 { 00262 vecvalue.push_back(0); 00263 } 00264 } 00265 00266 00267 //read texture for particule 00268 StBuffer.erase(StBuffer.begin(),StBuffer.end()); 00269 do 00270 { 00271 fread(&ch,sizeof(char),1,MyFile); 00272 StBuffer=StBuffer+ch; 00273 }while(ch!='#'); 00274 00275 StBuffer.erase(StBuffer.begin(),StBuffer.end()); 00276 do 00277 { 00278 fread(&ch,sizeof(char),1,MyFile); 00279 StBuffer=StBuffer+ch; 00280 }while(ch!='#'); 00281 StBuffer.erase(StBuffer.end()-1,StBuffer.end()); 00282 00283 SetParticuleTexture((char *)StBuffer.data()); 00284 //----------------------------------- 00285 m_EmissionRate =vecvalue.at(0); 00286 m_MaxParticule =vecvalue.at(1); 00287 m_TypeEmmeteur=vecvalue.at(2); 00288 m_P1.SetValue(vecvalue.at(3),vecvalue.at(4),vecvalue.at(5)); 00289 m_P2.SetValue(vecvalue.at(6),vecvalue.at(7),vecvalue.at(8)); 00290 m_rayon=vecvalue.at(9); 00291 m_vitesseangle=vecvalue.at(10); 00292 m_MaxLifeSpan = vecvalue.at(11); 00293 m_MinLifeSpan = vecvalue.at(12); 00294 m_MaxSize = vecvalue.at(13); 00295 m_MinSize = vecvalue.at(14); 00296 m_MaxWeight = vecvalue.at(15); 00297 m_MinWeight = vecvalue.at(16); 00298 m_MaxColorR = vecvalue.at(17); 00299 m_MinColorR = vecvalue.at(18); 00300 m_MaxColorG = vecvalue.at(19); 00301 m_MinColorG = vecvalue.at(20); 00302 m_MaxColorB = vecvalue.at(21); 00303 m_MinColorB = vecvalue.at(22); 00304 m_MaxBlending = vecvalue.at(23); 00305 m_MinBlending = vecvalue.at(24); 00306 m_MaxVelocity.SetValue(vecvalue.at(25),vecvalue.at(26),vecvalue.at(27)); 00307 m_MinVelocity.SetValue(vecvalue.at(28),vecvalue.at(29),vecvalue.at(30)); 00308 m_MaxAcceleration.SetValue(vecvalue.at(31),vecvalue.at(32),vecvalue.at(33)); 00309 m_MinAcceleration.SetValue(vecvalue.at(34),vecvalue.at(35),vecvalue.at(36)); 00310 m_MaxGravity.SetValue(vecvalue.at(37),vecvalue.at(38),vecvalue.at(39)); 00311 m_MinGravity.SetValue(vecvalue.at(40),vecvalue.at(41),vecvalue.at(42)); 00312 00313 m_Type = vecvalue.at(43); 00314 00315 return true; 00316 }else 00317 { 00318 sprintf(buffer,"%s is not a valide particule syteme file",FileName); 00319 AfxMessageBox(buffer); 00320 return false; 00321 } 00322 fclose(MyFile); 00323 }*/ 00324 return false; 00325 }