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

vista.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= vista.cc                                                  Julio de 1998 =
00003 //=-------------------------------------------------------------------------=
00004 //= Definicion de clase VISTA.  Esta clase juega el rol de "Abstraction" en =
00005 //= un patron "BRIDGE" (ver [GAMMA95] - "Design patterns, elements of       =
00006 //= reusable object-oriented software"), en donde el "Implementor" es la    =
00007 //= clase VISOR.                                                            =
00008 //=-------------------------------------------------------------------------=
00009 //= APLICACIONES DE LA CLASE:                                               =
00010 //= Para una aplicacion basada en OpenGL, y dado un contexto OpenGL, esta   =
00011 //= clase permite que en dicho contexto evolucione un VISOR, el cual puede  =
00012 //= ser cambiado por otro dinamicamente en cualquier momento.  Esto se      =
00013 //= traduce en poder usar un mismo contexto OpenGL para mostrar distintas   =
00014 //= vistas de la informacion de una aplicacion.                             =
00015 //= Por otro lado, al proveer un identificador, la VISTA facilita la        =
00016 //= creacion de aplicaciones que tienen varios contextos OpenGL.            =
00017 //=-------------------------------------------------------------------------=
00018 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00019 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00020 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00021 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00022 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00023 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00024 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00025 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00026 //=-------------------------------------------------------------------------=
00027 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00028 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00029 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00030 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00031 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00032 //===========================================================================
00033 
00034 #include "framework/visual/vista.h"
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 
00038 //===========================================================================
00039 //= Macros utilitarias                                                      =
00040 //===========================================================================
00041 
00042 #define COLOCAR_IMAGEN_GL()                 \
00043     if ( !modo_offline ) {                  \
00044         glViewport(_x, _y, _x_tam, _y_tam); \
00045         glMatrixMode(GL_MODELVIEW);         \
00046         glPushMatrix();                     \
00047         glLoadIdentity();                   \
00048         glMatrixMode(GL_PROJECTION);        \
00049         glPushMatrix();                     \
00050         glLoadIdentity();                   \
00051         glMatrixMode(GL_MODELVIEW);         \
00052         glClear(GL_DEPTH_BUFFER_BIT);       \
00053         Imagen->pintar_gl();                \
00054         glMatrixMode(GL_PROJECTION);        \
00055         glPopMatrix();                      \
00056         glLoadIdentity();                   \
00057         glMatrixMode(GL_MODELVIEW);         \
00058         glPopMatrix();                      \
00059         glLoadIdentity();                   \
00060     }
00061 
00062 #define INICIALIZAR_IMAGEN(tipo)                                        \
00063 {   Imagen = new tipo();                                                \
00064     if ( !Imagen || !Imagen->init(_x_tam, _y_tam) ) {                   \
00065         fprintf(stderr,"<VISTA> - Error: "                              \
00066             "no hay memoria para una IMAGEN de %d x %d pixels!\n",      \
00067             _x_tam, _y_tam);                                            \
00068         fflush(stderr);                                                 \
00069         return;                                                         \
00070     }}
00071 
00072 #ifdef GL_ENABLED
00073 #define GENERAR_VISTA_VACIA()                   \
00074     _metodo_de_visualizacion = MDV_ZBUFFER;     \
00075     delete Imagen; Imagen = NULL;               \
00076     if ( !modo_offline ) {                      \
00077         pintar_nucleo();                        \
00078         return;                                 \
00079     }                                           \
00080     INICIALIZAR_IMAGEN(IMAGEN_RGBA);            \
00081     ((IMAGEN_RGBA *)Imagen)->activar_como_contexto_gl();         \
00082     pintar_nucleo();                            \
00083     return;
00084 #endif
00085 
00086 #ifndef GL_ENABLED
00087 #define GENERAR_VISTA_VACIA()                   \
00088     _metodo_de_visualizacion = MDV_ZBUFFER;     \
00089     delete Imagen; Imagen = NULL;               \
00090     if ( !modo_offline ) {                      \
00091         pintar_nucleo();                        \
00092         return;                                 \
00093     }                                           \
00094     INICIALIZAR_IMAGEN(IMAGEN_RGBA);            \
00095     pintar_nucleo();                            \
00096     return;
00097 #endif
00098 
00099 //===========================================================================
00100 //= CLASE VISTA                                                             =
00101 //===========================================================================
00102 
00103 VISTA::VISTA(VISOR *v, int el_id)
00104 {
00105     Imagen = NULL;
00106     modo_offline = FALSE;
00107     //_metodo_de_visualizacion = MDV_ZBUFFER;
00108     //_metodo_de_visualizacion = MDV_RAYTRACING_CRIOLLO;
00109     //_metodo_de_visualizacion = MDV_RAYTRACER_POVRAY;
00110 
00111     _metodo_de_visualizacion = v->metodo_de_visualizacion();
00112 
00113     _x = _y = 0;    _x_tam = 320;    _y_tam = 240;
00114     mi_visor = v;
00115     _id = el_id;
00116 }
00117 
00118 VISTA::~VISTA()
00128 {
00129     if ( mi_visor ) delete mi_visor;
00130 }
00131 
00132 int VISTA::id(void) {    return _id; }
00133 int VISTA::x(void) {    return _x; }
00134 int VISTA::y(void) {    return _y; }
00135 int VISTA::xtam(void) {    return _x_tam; }
00136 int VISTA::ytam(void) {    return _y_tam; }
00137 void VISTA::set_x(int x) { _x = x; }
00138 void VISTA::set_y(int y) { _y = y; }
00139 void VISTA::set_xtam(int x_tam) { _x_tam = x_tam; }
00140 void VISTA::set_ytam(int y_tam) { _y_tam = y_tam; }
00141 void VISTA::set_id(int i) { _id = i; }
00142 VISOR * VISTA::visor(void) {  return mi_visor; }
00143 
00144 void VISTA::set_metodo_de_visualizacion(int metodo)
00145     { _metodo_de_visualizacion = metodo; }
00146 
00147 int
00148 VISTA::metodo_de_visualizacion(void)
00149 {
00150     return _metodo_de_visualizacion;
00151 }
00152 
00153 void
00154 VISTA::pintar_nucleo(void)
00175 {
00176     switch ( _metodo_de_visualizacion ) {
00177       //----------------------------------------------------------------------
00178       case MDV_RAYTRACING_CRIOLLO:
00179         if ( !modo_offline && !Imagen ) INICIALIZAR_IMAGEN(IMAGEN_RGB);
00180         if ( mi_visor ) {
00181             if ( !mi_visor->pintar_raytracing_criollo((IMAGEN_RGB*)Imagen) ) {
00182                 GENERAR_VISTA_VACIA();
00183             }
00184         }
00185       #ifdef GL_ENABLED
00186         COLOCAR_IMAGEN_GL();
00187       #endif
00188         break;
00189 
00190       //----------------------------------------------------------------------
00191       case MDV_RAYTRACER_POVRAY:
00192         if ( !modo_offline && !Imagen ) INICIALIZAR_IMAGEN(IMAGEN_RGB);
00193         if ( mi_visor ) {
00194             if ( modo_offline ) { 
00195                 INICIALIZAR_IMAGEN(IMAGEN_RGB);
00196                 if ( !mi_visor->pintar_povray((IMAGEN_RGB *)Imagen,
00197                                               "output/test.pov", FALSE) ) {
00198                     GENERAR_VISTA_VACIA();
00199                 }
00200                 delete Imagen;
00201                 Imagen = NULL;
00202               }
00203               else {
00204                 if ( !mi_visor->pintar_povray((IMAGEN_RGB *)Imagen,
00205                                               "output/test.pov", TRUE) ) {
00206                     GENERAR_VISTA_VACIA();
00207                 }
00208             }
00209         }
00210       #ifdef GL_ENABLED
00211         COLOCAR_IMAGEN_GL();
00212       #endif
00213         break;
00214 
00215       //----------------------------------------------------------------------
00216       case MDV_ZBUFFER: default:
00217       #ifdef GL_ENABLED
00218         glViewport(_x, _y, _x_tam, _y_tam);
00219         if ( mi_visor ) mi_visor->pintar_gl();
00220       #endif
00221 
00222         break;
00223     }
00224 }
00225 
00226 void
00227 VISTA::pintar_online(void)
00232 {
00233 #ifdef GL_ENABLED
00234     if ( modo_offline && Imagen &&
00235          _metodo_de_visualizacion == MDV_RAYTRACING_CRIOLLO ) {
00236         ((IMAGEN_RGBA *)Imagen)->desactivar_como_contexto_gl();
00237     }
00238 
00239     modo_offline = FALSE;
00240     pintar_nucleo();
00241 #endif
00242 }
00243 
00244 void
00245 VISTA::pintar_offline(char *archivo)
00253 {
00254     //- 1. Si no tengo una IMAGEN de trabajo, la creo ----------------------
00255     // Notese que en modo offline con raytracers externos no se usa la imagen!
00256 
00257     if ( !Imagen &&
00258          _metodo_de_visualizacion != MDV_RAYTRACER_POVRAY ) {
00259         if ( _metodo_de_visualizacion == MDV_RAYTRACING_CRIOLLO ) {
00260             INICIALIZAR_IMAGEN(IMAGEN_RGB);
00261           }
00262           else {
00263             INICIALIZAR_IMAGEN(IMAGEN_RGBA);
00264         }
00265     }
00266 
00267     //- 2. Dependiendo del modo, activo la IMAGEN como contexto OpenGL ------
00268     //-    pero solo cada que se crea una imagen nueva ----------------------
00269     if ( !modo_offline && _metodo_de_visualizacion == MDV_ZBUFFER ){
00270 #ifdef GL_ENABLED
00271         ((IMAGEN_RGBA *)Imagen)->activar_como_contexto_gl();
00272 #endif
00273     }
00274     modo_offline = TRUE;
00275 
00276     //- 3. Aqui se llama el algoritmo de visualizacion! ---------------------
00277     pintar_nucleo();
00278 
00279     //- 4. Exporto la imagen al archivo solicitado --------------------------
00280     if ( _metodo_de_visualizacion != MDV_RAYTRACER_POVRAY ) {
00281         FILE *fd = fopen(archivo, "wb");
00282         if ( !fd ) {
00283             fprintf(stderr, 
00284             "<VISTA> ERROR: No se puede escribir una imagen en %s.\n",archivo);
00285             exit(-2);
00286         }
00287         if ( _metodo_de_visualizacion == MDV_RAYTRACING_CRIOLLO ) {
00288             ((IMAGEN_RGB *)Imagen)->exportar_ppm(fd);
00289           }
00290           else {
00291             ((IMAGEN_RGBA *)Imagen)->exportar_ppm(fd);
00292         }
00293         fclose(fd);
00294     }
00295     if ( _metodo_de_visualizacion == MDV_RAYTRACER_POVRAY ) {
00296         char comando[2048];
00297         sprintf(comando, "mv ./output/test.ppm %s", archivo);
00298 //        printf("===========================================================================\n");
00299         system(comando);
00300 //        printf("\n===========================================================================\n");
00301     }
00302 }
00303 
00304 void
00305 VISTA::procesar_resize(int x, int y, int x_tam, int y_tam)
00306 {
00307     if ( modo_offline && Imagen &&
00308         _metodo_de_visualizacion != MDV_RAYTRACER_POVRAY ) {
00309 #ifdef GL_ENABLED
00310         ((IMAGEN_RGBA *)Imagen)->desactivar_como_contexto_gl();
00311 #endif
00312         delete Imagen;
00313         Imagen = NULL;
00314     }
00315 
00316     if ( _metodo_de_visualizacion == MDV_RAYTRACING_CRIOLLO && Imagen ) {
00317         delete Imagen;
00318         Imagen = NULL;
00319     }
00320     if ( _metodo_de_visualizacion == MDV_RAYTRACER_POVRAY && Imagen 
00321          && !modo_offline ) {
00322         delete Imagen;
00323         Imagen = NULL;
00324     }
00325 
00326     _x = x;
00327     _y = y;
00328     _x_tam = x_tam;
00329     _y_tam = y_tam;
00330     if ( mi_visor ) mi_visor->procesar_resize(_x, _y, _x_tam, _y_tam);
00331 }
00332 
00333 int
00334 VISTA::procesar_teclado(EVENTO_GUI *e)
00335 {
00336     if ( mi_visor ) return mi_visor->procesar_teclado(e);
00337     else return 0;
00338 }
00339 
00340 int
00341 VISTA::procesar_mouse(EVENTO_GUI *e)
00342 {
00343     if ( mi_visor ) return mi_visor->procesar_mouse(e);
00344     else return 0;
00345 }
00346 
00347 int
00348 VISTA::procesar_comando(int idc)
00349 {
00350     if ( mi_visor ) return mi_visor->procesar_comando(idc);
00351     else return 0;
00352 }
00353 
00354 char *
00355 VISTA::reportar_menu(void)
00356 {
00357     if ( mi_visor ) return mi_visor->reportar_menu();
00358     return NULL;
00359 }
00360 
00361 char *
00362 VISTA::reportar_botonera(void)
00363 {
00364     if ( mi_visor ) return mi_visor->reportar_botonera();
00365     return NULL;
00366 }
00367 
00368 void
00369 VISTA::grabar(FILE *fd)
00370 {
00371     if ( mi_visor ) mi_visor->grabar(fd);
00372 }
00373 
00374 //===========================================================================
00375 //= EOF                                                                     =
00376 //===========================================================================
00377 

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.