00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <stdlib.h>
00026
00027 #include "core/cosas/particulas.h"
00028 #include "arreglo.cc"
00029
00030
00031
00032
00033
00034 #define ESPERO(tipo, msg) \
00035 if ( tipo_token != (tipo) ) { \
00036 fprintf(stderr, "<SISTEMA_DE_PARTICULAS> " \
00037 "ERROR: Esperaba %s y recibi [%s].\n", \
00038 (msg), cad); fflush(stderr); return FALSE; \
00039 }
00040
00041
00042
00043
00044
00045
00046
00047 VECTOR PARTICULA::LIMITE_min;
00048 VECTOR PARTICULA::LIMITE_max;
00049 double PARTICULA::LONGITUD_raya=0.1;
00050
00051
00052
00053
00054
00055 SISTEMA_DE_PARTICULAS::SISTEMA_DE_PARTICULAS(int num_particulas,
00056 double largo_particulas, VECTOR min, VECTOR max)
00057 : arr_particulas(100)
00058 {
00059 PARTICULA *p;
00060 int i;
00061
00062 PARTICULA::set_limites(min, max);
00063 PARTICULA::set_largo(largo_particulas);
00064
00065 for( i = 0; i < num_particulas; i++ ) {
00066 p = new PARTICULA;
00067 arr_particulas.anx(p);
00068 }
00069
00070 t = 0.0f;
00071 }
00072
00073 SISTEMA_DE_PARTICULAS::~SISTEMA_DE_PARTICULAS()
00074 {
00075 int i;
00076
00077 for ( i = 0; i < arr_particulas.tam(); i++ ) {
00078 delete arr_particulas[i];
00079 }
00080 arr_particulas.elim();
00081 t = 0.0f;
00082 }
00083
00084 #ifdef GL_ENABLED
00085
00086 void
00087 SISTEMA_DE_PARTICULAS::pintar_gl(CAMARA *Camara)
00088 {
00089
00090 VECTOR p, min, max;
00091 p = Camara->posicion();
00092 min.x = p.x - 7; min.y = p.y - 7; min.z = -0.2;
00093 max.x = p.x + 7; max.y = p.y + 7; max.z = 8;
00094 PARTICULA::set_limites(min, max);
00095
00096
00097 int i;
00098
00099 glDisable(GL_LIGHTING);
00100 glEnable(GL_DEPTH_TEST);
00101 glShadeModel(GL_SMOOTH);
00102
00103 glBegin(GL_LINES);
00104 for( i = 0; i < arr_particulas.tam(); i++ ) {
00105 arr_particulas[i]->pintar_gl();
00106 }
00107 glEnd();
00108 }
00109
00110 #endif
00111
00112 void
00113 SISTEMA_DE_PARTICULAS::actualizar(double dt)
00114 {
00115 int i;
00116
00117 for( i = 0; i < arr_particulas.tam(); i++ ) {
00118 arr_particulas[i]->actualizar(dt);
00119 }
00120 }
00121
00122 BOOLEAN
00123 SISTEMA_DE_PARTICULAS::leer(TOKENIZADOR *Sabiondo)
00124 {
00125 char cad[1000];
00126 int tipo_token = TK_DESCONOCIDO, pos;
00127
00128
00129 pos = 2;
00130 while ( tipo_token != TK_CERRAR) {
00131 tipo_token = Sabiondo->siguiente_token(cad);
00132 switch ( pos ) {
00133 case 2: ESPERO(TK_ABRIR, "\"{\""); pos++; break;
00134 default:
00135 if ( tipo_token == TK_CERRAR ) break;
00136 ESPERO(TK_IDENTIFICADOR, "un identificador (3)");
00137
00138 break;
00139 }
00140 }
00141
00142 return TRUE;
00143 }
00144
00145
00146
00147
00148
00149 PARTICULA::PARTICULA()
00150 {
00151 init();
00152
00153
00154 pos.z = (LIMITE_max.z-LIMITE_min.z)*RANDOM()*2 + LIMITE_min.z;
00155 oldpos.z = pos.z-LONGITUD_raya*vel.z;
00156 }
00157
00158 void
00159 PARTICULA::set_limites(VECTOR _min, VECTOR _max)
00160 {
00161 LIMITE_min = _min;
00162 LIMITE_max = _max;
00163 }
00164
00165 void
00166 PARTICULA::set_largo(double l)
00167 {
00168 LONGITUD_raya=l;
00169 }
00170
00171 void
00172 PARTICULA::init(void)
00177 {
00178 acc.x = 0; acc.y = 0; acc.z = -0.98;
00179 vel.x = 0; vel.y = 0; vel.z = 0;
00180
00181 oldpos.x = pos.x = LIMITE_min.x + (LIMITE_max.x-LIMITE_min.x)*RANDOM();
00182 oldpos.y = pos.y = LIMITE_min.y + (LIMITE_max.y-LIMITE_min.y)*RANDOM();
00183 oldpos.z = pos.z = LIMITE_max.z + 0.2*LIMITE_max.z*RANDOM();
00184 }
00185
00186 #ifdef GL_ENABLED
00187
00188 void
00189 PARTICULA::pintar_gl(void)
00190 {
00191 glColor4f(0.7f,0.95f,1.0f,0.0f);
00192 glVertex3d(oldpos.x, oldpos.y, oldpos.z);
00193
00194 glColor4f(0.3f,0.7f,1.0f,1.0f);
00195 glVertex3d(pos.x, pos.y, pos.z);
00196 }
00197
00198 #endif
00199
00200 void
00201 PARTICULA::actualizar(double dt)
00205 {
00206
00207 vel = vel + acc*dt;
00208 pos = pos + vel*dt;
00209
00210 if( pos.x < LIMITE_min.x ) pos.x = LIMITE_max.x - (LIMITE_min.x - pos.x);
00211 if( pos.y < LIMITE_min.y ) pos.y = LIMITE_max.y - (LIMITE_min.y - pos.y);
00212 if( pos.x > LIMITE_max.x ) pos.x = LIMITE_min.x + (pos.x - LIMITE_max.x);
00213 if( pos.y > LIMITE_max.y ) pos.y = LIMITE_min.y + (pos.y - LIMITE_max.y);
00214
00215 oldpos = pos - vel*LONGITUD_raya;
00216
00217
00218 if( pos.z < LIMITE_min.z ) init();
00219 }
00220
00221
00222
00223
00224
00225