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 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 #include "framework/visual/vista.h"
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 
00038 
00039 
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 
00101 
00102 
00103 VISTA::VISTA(VISOR *v, int el_id)
00104 {
00105     Imagen = NULL;
00106     modo_offline = FALSE;
00107     
00108     
00109     
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     
00255     
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     
00268     
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     
00277     pintar_nucleo();
00278 
00279     
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 
00299         system(comando);
00300 
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 
00376 
00377