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

visor_cv.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= visor_g.cc                                               Agosto de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definicion de clase VISOR_CAMPO_VECTORIAL                               =
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 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00016 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00017 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00018 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00019 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00020 //===========================================================================
00021 
00022 #include <stdio.h>
00023 #include <stdlib.h>
00024 
00025 #include "framework/visual/visor_cv.h"
00026 #include "toolkits/geom/geometria.h"
00027 #include "matriz4.h"
00028 #include "lista.cc"
00029 
00030 #include "toolkits/media/jed_img.h"
00031 
00032 //===========================================================================
00033 //= Constantes y macros                                                     =
00034 //===========================================================================
00035 
00036 #define ESPERO(tipo, msg) \
00037     if ( tipo_token != (tipo) ) { \
00038         fprintf(stderr, "<VISOR_CAMPO_VECTORIAL> " \
00039           "ERROR: Esperaba %s y recibi [%s].\n", \
00040           (msg), cad); fflush(stderr);  return FALSE; \
00041     }
00042 
00043 #define VERIFICAR(c) \
00044     if ( !(c) ) {\
00045         fprintf(stderr, \
00046             "<VISOR_CAMPO_VECTORIAL> " \
00047             "ERROR: No se pudo crear un objeto dinamico!\n");\
00048         fflush(stderr);\
00049         exit(1);\
00050     }
00051 
00052 //===========================================================================
00053 //= CLASE VISOR_CAMPO_VECTORIAL                                             =
00054 //===========================================================================
00055 
00056 VISOR_CAMPO_VECTORIAL::VISOR_CAMPO_VECTORIAL(CAMPO_VECTORIAL *c)
00057 {
00058     Campo = c;
00059     init();
00060 }
00061 
00062 VISOR_CAMPO_VECTORIAL::VISOR_CAMPO_VECTORIAL()
00063 {
00064     Campo = NULL;
00065     init();
00066 }
00067 
00068 VISOR_CAMPO_VECTORIAL::~VISOR_CAMPO_VECTORIAL()
00069 {
00070     // OJO: El `campo` es responsabilidad de quien usa este visor, y aqui
00071     //      NO se borra!
00072     delete Material;
00073 }
00074 
00075 void
00076 VISOR_CAMPO_VECTORIAL::init(void)
00077 {
00078     _nombre_campo = NULL;
00079 
00080     // Mostrar el plano (z = 0)
00081     min.x = -5;  min.y = -5;  min.z = 0;
00082     max.x = 5;  max.y = 5;  max.z = 0;
00083     offset_plano = 0;
00084     luz.set_id(0);
00085 
00086     // Normalmente se tiene una camara mirando hacia el origen...
00087     VECTOR p(2.5, 0.5, 0.5);
00088     MATRIZ_4x4 R;
00089 
00090     camara.set_posicion(p);
00091     R.rotacion_angulos_euler(DEG2RAD(175), DEG2RAD(-25), 0);
00092     camara.set_orientacion(R.exportar_quaternion());
00093 
00094     // Las flechas son verde pastel   :-)
00095     COLOR col(0.5f, 0.7f, 0.5f);
00096 
00097     Material = new MATERIAL;
00098     Material->set_difusa(col);
00099 }
00100 
00101 char *
00102 VISOR_CAMPO_VECTORIAL::nombre_campo(void)
00103 {
00104     return _nombre_campo;
00105 }
00106 
00107 void
00108 VISOR_CAMPO_VECTORIAL::set_campo(CAMPO_VECTORIAL *c)
00109 {
00110     Campo = c;
00111 }
00112 
00113 #ifdef GL_ENABLED
00114 void
00115 VISOR_CAMPO_VECTORIAL::pintar_gl(void)
00116 {
00117     //- Configurar un entorno virtual ---------------------------------------
00118     glColor3f(0.5f, 0.5f, 0.5f);
00119     PINTAR_FONDO_VISOR();
00120     camara.activar_gl();
00121     glCullFace(GL_BACK);
00122     glEnable(GL_CULL_FACE);
00123     glEnable(GL_DEPTH_TEST);
00124     glClear(GL_DEPTH_BUFFER_BIT);
00125 
00126     //- Cuadrar modelo de iluminacion ---------------------------------------
00127     static VECTOR lp(90, 90, 150);
00128 
00129     glEnable(GL_LIGHTING);
00130     luz.set_posicion(lp);
00131     luz.activar_gl();
00132     Material->activar_gl();
00133     glShadeModel(GL_SMOOTH);
00134     glDisable(GL_TEXTURE_2D);
00135 
00136     //- Pintar las lineas de campo ------------------------------------------
00137     VECTOR p, deltav;
00138     double delta = 2;
00139 
00140     for ( p.x = min.x; p.x <= max.x; p.x += delta ) {
00141         for ( p.y = min.y; p.y <= max.y; p.y += delta ) {
00142             for ( p.z = min.z; p.z <= max.z; p.z += delta ) {
00143                 deltav = Campo->valor(p);
00144                 deltav = deltav * 0.1;
00145                 PINTAR_VECTOR_GL(p, p + deltav, 0.03, 0.3, 0.1);
00146             }
00147         }
00148     }
00149 
00150     //----------------------------------------------------------------------
00151     pintar_visores_subordinados_gl(&camara);
00152 }
00153 #endif // GL_ENABLED
00154 
00155 int
00156 VISOR_CAMPO_VECTORIAL::procesar_teclado(EVENTO_GUI *e)
00157 {
00158     static int modo = 1;
00159 
00160     switch( e->key_code ) {
00161       case JK_1: // Mostrar el plano (z = offset_plano)
00162         //printf("<VISOR_CAMPO_VECTORIAL>: Mostrando el plano z = %.2f.\n",
00163         //    offset_plano);
00164         //fflush(stdout);
00165         modo = 1;
00166         break;
00167       case JK_2: // Mostrar el plano (x = offset_plano)
00168         //printf("<VISOR_CAMPO_VECTORIAL>: Mostrando el plano x = %.2f.\n",
00169         //    offset_plano);
00170         //fflush(stdout);
00171         modo = 2;
00172         break;
00173       case JK_3: // Mostrar el plano (y = offset_plano)
00174         //printf("<VISOR_CAMPO_VECTORIAL>: Mostrando el plano y = %.2f.\n",
00175         //    offset_plano);
00176         //fflush(stdout);
00177         modo = 3;
00178         break;
00179       case JK_4: // Mostrar el volumen
00180         //printf("<VISOR_CAMPO_VECTORIAL>: Mostrando el volumen completo\n");
00181         //fflush(stdout);
00182         modo = 0;
00183         break;
00184       case JK_O:
00185         offset_plano += 1.0;
00186         //printf("<VISOR_CAMPO_VECTORIAL>: offset = %.2f\n", offset_plano);
00187         //fflush(stdout);
00188         break;
00189       case JK_o:
00190         offset_plano -= 1.0;
00191         //printf("<VISOR_CAMPO_VECTORIAL>: offset = %.2f\n", offset_plano);
00192         //fflush(stdout);
00193         break;
00194       default:
00195         return calidad.procesar_teclado(e) || camara.procesar_teclado(e);
00196     }
00197     min.x = -5;  min.y = -5;  min.z = -5;
00198     max.x = 5;  max.y = 5;  max.z = 5;
00199     switch ( modo ) {
00200       case 1: min.z = max.z = offset_plano; break;
00201       case 2: min.x = max.x = offset_plano; break;
00202       case 3: min.y = max.y = offset_plano; break;
00203       default: break;
00204     }
00205     return 1;
00206 }
00207 
00208 void
00209 VISOR_CAMPO_VECTORIAL::procesar_resize(int /*x*/, int /*y*/,
00210                                        int x_tam, int y_tam)
00211 {
00212     camara.procesar_resize(x_tam, y_tam);
00213 }
00214 
00215 //= SERVICIOS DE PERSISTENCIA ===============================================
00216 
00217 BOOLEAN
00218 VISOR_CAMPO_VECTORIAL::leer(TOKENIZADOR *Sabiondo)
00219 {
00220     char cad[1000];
00221     int tipo_token = TK_DESCONOCIDO, pos;
00222 
00223     //- Ejecute el parser especifico de la COSA_RIGIDA -----------------
00224     pos = 1;
00225     while ( tipo_token != TK_CERRAR) {
00226         tipo_token = Sabiondo->siguiente_token(cad);
00227         switch ( pos ) {
00228             case 1:
00229               ESPERO(TK_CADENA, "una cadena con un nombre de un VISOR");
00230               if ( strlen(cad) > MAX_CAD-1 ) cad[MAX_CAD-1] = '\0'; 
00231               des_comille(cad);
00232               //set_nombre(cad);
00233               pos++;
00234               break;
00235             case 2:  ESPERO(TK_ABRIR, "\"{\"");  pos++; break;
00236             default:
00237               if ( tipo_token == TK_CERRAR ) break;
00238               ESPERO(TK_IDENTIFICADOR, "un identificador (3)");
00239               if ( strcmp(cad, "objetivo") == 0 ) {
00240                   tipo_token = Sabiondo->siguiente_token(cad);
00241                   ESPERO(TK_CADENA, "una cadena con el nombre de una COSA");
00242                   des_comille(cad);
00243                   _nombre_campo = new char [strlen(cad) + 1];
00244                   VERIFICAR(_nombre_campo);
00245                   strcpy(_nombre_campo, cad);
00246                 }
00247                 else if ( !leer_visor_subordinado(Sabiondo, cad) ) {
00248                     return FALSE;
00249                 }
00250               ;
00251               break;
00252         }
00253     }
00254 
00255     return TRUE;
00256 }
00257 
00258 //===========================================================================
00259 //= EOF                                                                     =
00260 //===========================================================================
00261 

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.