Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

p_emitter.cpp

Go to the documentation of this file.
00001 // OMICRON ENGINE HEADER FILE
00002 //
00003 // --------------------------------------------------------------------------
00004 // Copyright (C) 2001-2002 by Bjoern Paetzel <kolrabi@gmx.de>
00005 //
00006 // This file is part of the Omicron Engine.
00007 //
00008 // The Omicron Engine is free software; you can redistribute it and/or modify
00009 // it under the terms of the  GNU General Public License  as published by the
00010 // Free Software Foundation;  either version  2  of the License,  or (at your
00011 // option) any later version.
00012 //
00013 // The Omicron Engine  is distributed in the hope that it will be useful, but
00014 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00015 // or  FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License
00016 // for more details.
00017 //
00018 // You should have  received a copy of the  GNU General Public License  along
00019 // with The Omicron Engine;  if not,  write to the  Free Software Foundation,
00020 // Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
00021 //
00022 // --------------------------------------------------------------------------
00023 // Last modified:       $Date: 2002/12/07 19:02:15 $
00024 // By           :       $Author: kolrabi $
00025 // $Id: p_emitter.cpp,v 1.1.1.1 2002/12/07 19:02:15 kolrabi Exp $ 
00026 
00027 /*
00028 
00029   $Log: p_emitter.cpp,v $
00030   Revision 1.1.1.1  2002/12/07 19:02:15  kolrabi
00031   initial release
00032 
00033 
00034 */
00035  
00040 #include            "omicron/internal.h"
00041 #include            "omicron/render.h"
00042 #include            "omicron/particle.h"
00043 #include            "omicron/array.h"
00044  
00045 /**************************************************************************** 
00046  **************************************************************************** 
00047  * PARTICLE SYSTEM ********************************************************** 
00048  **************************************************************************** 
00049  ****************************************************************************/ 
00050  
00051 particle_emitter_c::particle_emitter_c()
00052 {
00053     birthrate       = 1;
00054 
00055     minangles.set(-180, -90, 0);
00056     maxangles.set( 180,  90, 1);
00057 
00058     shape           = ES_POINT;
00059 
00060     pos.clear();
00061     lastpos.clear();
00062 
00063     newparts        = 0;
00064 
00065     starttime       = 0;
00066     endtime         = 0;
00067 //    selfdestruct    = false;
00068 }
00069 
00070 particle_emitter_c::~particle_emitter_c()
00071 {
00072     if (psystem)
00073         psystem->remove_emitter(this);
00074 }
00075 
00076 void
00077 particle_emitter_c::update
00078 ()
00079 {
00080     if (!starttime || gv.time<starttime || gv.time>endtime)
00081     {
00082         if (gv.time>endtime)
00083         {
00084             //delete this;
00085             return;
00086         }
00087 
00088         lastupdate = gv.time;
00089         newparts = 0;
00090 
00091         return;
00092     }
00093 
00094     newparts += (gv.time-lastupdate)*birthrate;
00095 
00096     while(newparts>=1)
00097     {
00098         particle_type_c *pt = psystem->types->get(particletype);
00099 
00100         if (pt)
00101         {
00102             vec3_c  speed;
00103             vec3_c  angle;
00104             vec3_c  tmp;
00105             vec3_c  p;
00106 
00107             angle.set(  frand(minangles[ANGLE_YAW], maxangles[ANGLE_YAW]), 
00108                         frand(minangles[ANGLE_PITCH], maxangles[ANGLE_PITCH]), 
00109                         frand(minangles[ANGLE_ROLL], maxangles[ANGLE_ROLL])     );
00110 
00111 
00112             angle.get_view_from_angles(speed, tmp, tmp);
00113 
00114             speed = speed * angle[ANGLE_ROLL];
00115 
00116             float r = 0.5f;
00117 
00118             switch(shape)
00119             {
00120                 case ES_BOX:
00121                     p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00122                     break;
00123 
00124                 case ES_BOX|ES_HOLLOW:
00125                     switch(rand()%6)
00126                     {
00127                         case 0:
00128                             p.set(-0.5f, frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00129                             break;
00130                         case 1:
00131                             p.set( 0.5f, frand(-0.5f, 0.5f), frand(-0.5f, 0.5f));
00132                             break;
00133 
00134                         case 2:
00135                             p.set(frand(-0.5f, 0.5f), -0.5f, frand(-0.5f, 0.5f));
00136                             break;
00137                         case 3:
00138                             p.set(frand(-0.5f, 0.5f),  0.5f, frand(-0.5f, 0.5f));
00139                             break;
00140 
00141                         case 4:
00142                             p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f), -0.5f);
00143                             break;
00144                         case 5:
00145                             p.set(frand(-0.5f, 0.5f), frand(-0.5f, 0.5f),  0.5f);
00146                             break;
00147                     }
00148                     break;
00149 
00150                 case ES_SPHERE:
00151                     r = frand(0, 0.5f);
00152 
00153                     // fallthrough
00154 
00155                 case ES_SPHERE|ES_HOLLOW:
00156                     {
00157                         p.set(r,0,0);
00158                         p = p.rotate_vec(frand(-180, 180), vec3_c(0,1,0)).rotate_vec(frand(-90, 90), vec3_c(0,0,1)).rotate_vec(frand(-90, 90), vec3_c(1,0,0));
00159 
00160                     }
00161                     break;
00162 
00163                 case ES_POINT:
00164                 default:
00165                     p.set(0,0,0);
00166                     break;
00167             }
00168 
00169             p = p * scale;
00170 
00171             pt->new_particle(pos+p, speed);
00172         }
00173         newparts--;
00174     }
00175 
00176     lastupdate = gv.time;
00177 }
00178 
00179 void
00180 particle_emitter_c::start
00181 ()
00182 {
00183     starttime = gv.time;
00184     endtime = starttime+duration;
00185     lastupdate = gv.time;
00186 }

Generated on Wed Dec 18 15:48:47 2002 for omicron engine by doxygen1.2.18