Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

particulas.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= particulas.h                                             Abril del 2000 =
00003 //=-------------------------------------------------------------------------=
00004 //= Modelo de un sistema de particulas que simula un efecto de lluvia.      =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Este programa esta basado en el modelo del ejemplo "rain" de Mesa, por  =
00016 //= David Bucciarelli (tech.hmw@plus.it)                                    =
00017 //=-------------------------------------------------------------------------=
00018 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00019 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00020 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00021 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00022 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00023 //===========================================================================
00024 
00025 #include <stdlib.h>
00026 
00027 #include "core/cosas/particulas.h"
00028 #include "arreglo.cc"
00029 
00030 //===========================================================================
00031 //= VARIABLES GLOBALES Y MACROS                                             =
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 OJO: Esto NO es nada bueno... debe pensarse en alguna manera efectiva de
00044      reemplazar estas variables estaticas...
00045 */
00046 
00047 VECTOR PARTICULA::LIMITE_min;
00048 VECTOR PARTICULA::LIMITE_max;
00049 double PARTICULA::LONGITUD_raya=0.1;
00050 
00051 //===========================================================================
00052 //= Clase SISTEMA_DE_PARTICULAS                                             =
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     //- Ejecute el parser especifico de la COSA_RIGIDA -----------------
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 /* OJO: Esto hace falta! */
00138               break;
00139         }
00140     }
00141 
00142     return TRUE;
00143 }
00144 
00145 //===========================================================================
00146 //= Clase PARTICULA                                                         =
00147 //===========================================================================
00148 
00149 PARTICULA::PARTICULA()
00150 { 
00151     init();
00152 
00153     // Inicialmente tengo una altura al azar
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     // Evaluo mi dinamica!
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     // Si me pase del piso, "reencarno" en otra gotica...
00218     if( pos.z < LIMITE_min.z ) init();
00219 }
00220 
00221 //===========================================================================
00222 //= EOF                                                                     =
00223 //===========================================================================
00224 
00225 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.