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 "ExCParticule.h"
00025
00026 ExCParticule::ExCParticule(void)
00027 {
00028 Guard(ExCParticule::ExCParticule(void))
00029 m_LifeSpan=1000;
00030 m_Size=0.2;
00031 m_Weight=1;
00032 m_Mass=1;
00033 m_Type=PARTICULE_LINE;
00034 m_ColorR=255;
00035 m_ColorG=255;
00036 m_ColorB=255;
00037 m_Velocity.SetValue(0.0f,0.1f,0.0f);
00038 m_Position.SetValue(0.0f,0.0f,0.0f);
00039 m_Acceleration.SetValue(1.0f,1.0f,1.0f);
00040 m_Gravity.SetValue(0.0f,0.0f,0.0f);
00041 UnGuard
00042 }
00043
00044 ExCParticule::~ExCParticule(void)
00045 {
00046 Guard(ExCParticule::~ExCParticule(void))
00047 UnGuard
00048 }
00049
00050
00051 void ExCParticule::SetParticuleType(int type)
00052 {
00053 Guard(void ExCParticule::SetParticuleType(int type))
00054 m_Type=type;
00055 if(m_Type>3)m_Type=1;
00056 UnGuard
00057 }
00058
00059 void ExCParticule::SetParticuleTexture(int texture)
00060 {
00061 Guard(void ExCParticule::SetParticuleTexture(int texture))
00062 m_Texture=texture;
00063 UnGuard
00064 }
00065
00066
00067 void ExCParticule::Draw(void)
00068 {
00069 Guard(void ExCParticule::Draw(void))
00070
00071 float x,y,z,x1,y1,z1;
00072 float GravityX,GravityY,GravityZ;
00073 int TimeNow=(m_TotalLife-m_LifeSpan);
00074
00075 GLfloat no_mat[] = {0.0f,0.0f,0.0f,1.0f};
00076 GLfloat mat_ambient[] = {0.7f,0.7f,0.7f,1.0f};
00077 GLfloat mat_ambient_color[] = {0.8f,0.8f,0.2f,1.0f};
00078 GLfloat mat_diffuse[] = {0.1f,0.5f,0.8f,1.0f};
00079 GLfloat mat_specular[] = {1.0f,1.0f,1.0f,1.0f};
00080 GLfloat no_shininess[] = {0.0f};
00081 GLfloat low_shininess[] = {5.0f};
00082 GLfloat high_shininess[] = {100.0f};
00083 GLfloat mat_emission[] = {0.3f,0.2f,0.2f,0.0f};
00084
00085 switch(m_Type)
00086 {
00087 case PARTICULE_POINT:
00088
00089 glPushMatrix();
00090
00091 glTranslatef(m_Position.m_Vector[0],
00092 m_Position.m_Vector[1],
00093 m_Position.m_Vector[2]);
00094 m_Position=m_Position+m_Velocity;
00095
00096 glColor4ub(m_ColorR,m_ColorG,m_ColorB,m_Blending);
00097 glBegin(GL_POINT);
00098 glVertex3fv(m_Position.m_Vector);
00099 glEnd();
00100 glPopMatrix();
00101 break;
00102
00103 case PARTICULE_LINE:
00104 glPushMatrix();
00105
00106 GravityX=((TimeNow*TimeNow)*(m_Gravity.m_Vector[0])/20);
00107 GravityY=((TimeNow*TimeNow)*(m_Gravity.m_Vector[1])/20);
00108 GravityZ=((TimeNow*TimeNow)*(m_Gravity.m_Vector[2])/20);
00109
00110 x=m_Position.m_Vector[0]+(m_Velocity.m_Vector[0]*TimeNow)-GravityX;
00111 y=m_Position.m_Vector[1]+(m_Velocity.m_Vector[1]*TimeNow)-GravityY;
00112 z=m_Position.m_Vector[2]+(m_Velocity.m_Vector[2]*TimeNow)-GravityZ;
00113
00114 x1=m_Position.m_Vector[0]+(m_Velocity.m_Vector[0]*(TimeNow+m_Size))-GravityX;
00115 y1=m_Position.m_Vector[1]+(m_Velocity.m_Vector[1]*(TimeNow+m_Size))-GravityY;
00116 z1=m_Position.m_Vector[2]+(m_Velocity.m_Vector[2]*(TimeNow+m_Size))-GravityZ;
00117
00118 glTranslatef(x,y,z);
00119 glColor4ub(m_ColorR,m_ColorG,m_ColorB,m_Blending);
00120
00121 glEnable(GL_BLEND);
00122 glEnable(GL_ALPHA);
00123 glBlendFunc(GL_ONE,GL_ONE);
00124 glEnable(GL_ALPHA_TEST);
00125 glAlphaFunc(GL_GREATER,0);
00126 glLineWidth(2.0f);
00127
00128
00129 glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,no_mat);
00130 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
00131 glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
00132 glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,high_shininess);
00133 glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,no_mat);
00134
00135 glBegin(GL_LINES);
00136 glVertex3f(x,y,z);
00137 glVertex3f(x1,y1,z1);
00138 glEnd();
00139 glDisable(GL_LIGHTING);
00140 glDisable(GL_BLEND);
00141 glDisable(GL_ALPHA);
00142 glLineWidth(1.5);
00143 glPopMatrix();
00144 break;
00145
00146 case PARTICULE_TEXTURE:
00147 glPushMatrix();
00148 ExCVec3D position;
00149 if(TimeNow<m_TotalLife)
00150 {
00151 position=m_VecPosition.at(TimeNow);
00152 glTranslatef(position.m_Vector[0],position.m_Vector[1],position.m_Vector[2]);
00153
00154 GLfloat viewMatrix[16];
00155 glGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
00156 ExCVec3D right;
00157 ExCVec3D up;
00158
00159 right.SetValue(viewMatrix[0],viewMatrix[4],viewMatrix[8]);
00160 up.SetValue(viewMatrix[1],viewMatrix[5],viewMatrix[9]);
00161
00162 ExCVec3D v1,v2,v3,v4;
00163 v1=m_Position+(right+up)*-m_Size;
00164 v2=m_Position+(right-up)*m_Size;
00165 v3=m_Position+(right+up)*m_Size;
00166 v4=m_Position+(up-right)*m_Size;
00167
00168
00169
00170 glColor4ub(m_ColorR,m_ColorG,m_ColorB,m_Blending);
00171 glEnable(GL_BLEND);
00172 glEnable(GL_ALPHA);
00173 glEnable(GL_TEXTURE_2D);
00174 glBlendFunc(GL_ONE,GL_ONE);
00175 glEnable(GL_ALPHA_TEST);
00176 glAlphaFunc(GL_GREATER,0);
00177 glDisable(GL_LIGHTING);
00178 glBindTexture(GL_TEXTURE_2D,m_Texture);
00179 glBegin(GL_QUADS);
00180 glTexCoord2f(0.0f, 0.0f); glVertex3fv(v1.m_Vector);
00181 glTexCoord2f(1.0f, 0.0f); glVertex3fv(v2.m_Vector);
00182 glTexCoord2f(1.0f, 1.0f); glVertex3fv(v3.m_Vector);
00183 glTexCoord2f(0.0f, 1.0f); glVertex3fv(v4.m_Vector);
00184 glEnd();
00185 glDisable(GL_TEXTURE_2D);
00186 glDisable(GL_BLEND);
00187 glDisable(GL_ALPHA);
00188 glEnable(GL_LIGHTING);
00189 }
00190 glPopMatrix();
00191 break;
00192 }
00193
00194 UnGuard
00195 }
00196
00197 void ExCParticule::PrecalculeParticuleTrajectory(int start,int end)
00198 {
00199 Guard(void ExCParticule::PrecalculeParticuleTrajectory(int start,int end))
00200 float GravityX,GravityY,GravityZ;
00201 ExCVec3D Position;
00202 for(int i=start;i<end;i++)
00203 {
00204 GravityX=((i*i)*(m_Gravity.m_Vector[0])/2000);
00205 GravityY=((i*i)*(m_Gravity.m_Vector[1])/2000);
00206 GravityZ=((i*i)*(m_Gravity.m_Vector[2])/2000);
00207
00208 Position.m_Vector[0]=m_Position.m_Vector[0]+(m_Velocity.m_Vector[0]*i)-GravityX;
00209 Position.m_Vector[1]=m_Position.m_Vector[1]+(m_Velocity.m_Vector[1]*i)-GravityY;
00210 Position.m_Vector[2]=m_Position.m_Vector[2]+(m_Velocity.m_Vector[2]*i)-GravityZ;
00211 m_VecPosition.push_back(Position);
00212 }
00213 UnGuard
00214 }
00215
00216 void ExCParticule::ApplyForceToParitcule(ExCVec3D force)
00217 {
00218 Guard(void ExCParticule::ApplyForceToParitcule(ExCVec3D force))
00219
00220 UnGuard
00221 }