Main Page   Namespace List   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

ExCParticule.cpp

Go to the documentation of this file.
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: ExCParticule.cpp,v 1.21 2002/07/23 11:19:01 data Exp $
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                 //glEnable(GL_LIGHTING);
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                         // Orienation of particule
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                         //DRAW PARTICULE
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 }

Generated on Tue Aug 6 20:27:09 2002 for ExNihilo by doxygen1.2.17