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

cuadricula.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= cuadricula.cc                                         Diciembre de 1999 =
00003 //=-------------------------------------------------------------------------=
00004 //= Una clase que ayuda en la creacion de cuadriculas y descomposicion      =
00005 //= automatica de imagenes en parches                                       =
00006 //=-------------------------------------------------------------------------=
00007 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00008 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00009 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00010 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00011 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00012 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00013 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00014 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00015 //=-------------------------------------------------------------------------=
00016 //= Autor original: Oscar J. Chavarro G.  A.K.A. JEDILINK. Copyright (c),   =
00017 //= 1997 - 2003, oscarchavarro@hotmail.com                                  =
00018 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia   =
00019 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la  =
00020 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. =
00021 //===========================================================================
00022 
00023 #include "toolkits/util/cuadricula.h"
00024 
00025 //===========================================================================
00026 //= Clase CUADRICULA                                                        =
00027 //===========================================================================
00028 
00029 CUADRICULA::CUADRICULA(int n, int m)
00040 {
00041     num_columnas = n;
00042     num_filas = m;
00043     parches = new IMAGEN_RGB[num_columnas * num_filas];
00044 }
00045 
00046 void
00047 CUADRICULA::extraer_sub_imagen(IMAGEN_RGB *Origen, IMAGEN_RGB *Destino,
00048                    int base_x, int base_y)
00052 {
00053     int x, y, xt, yt;
00054     BYTE r, g, b;
00055 
00056     xt = Destino->xtam();
00057     yt = Destino->ytam();
00058     for ( x = 0; x < xt; x++ ) {
00059         for ( y = 0; y < yt; y++ ) {
00060             Origen->getpixel(x+base_x, y+base_y, r, g, b);
00061             Destino->putpixel(x, y, r, g, b);
00062         }
00063     }
00064 }
00065 
00066 #ifdef GL_ENABLED
00067 void
00068 CUADRICULA::pintar_nucleo_gl(CALIDAD_VISUAL *Calidad, MATERIAL *Material)
00069 {
00070     double ancho, alto;
00071     int i = 0, j = 0;
00072 
00073     COLOR blanco(1, 1, 1);
00074 
00075     Calidad->activar_caras_gl(blanco, Material);
00076     Calidad->interpolacion_mintex = GL_NEAREST;
00077     Calidad->interpolacion_magtex = GL_NEAREST;
00078     Calidad->funcion_combinacion_textura = GL_REPLACE;
00079 
00080     ancho = 1 / (double)num_columnas;
00081     alto = 1 / (double)num_filas;
00082 
00083     for ( i = 0; i < num_columnas; i++ ) {
00084         for ( j = 0; j < num_filas; j++ ) {
00085             glDisable(GL_TEXTURE_2D);
00086             if ( Calidad->con_textura ) {
00087                 parches[i*num_filas + j].activar_gl();
00088                 glEnable(GL_TEXTURE_2D);
00089                 Calidad->activar_textura_gl();
00090             }
00091             glPushMatrix();
00092             glTranslated(-1 + ancho + 2*ancho * i,
00093                          -1 + alto + 2*alto * j,
00094                          0);
00095             glScaled(ancho, alto, 1);
00096 
00097             glNormal3d(0, 0, 1);
00098             glBegin(GL_TRIANGLE_STRIP);
00099                 glTexCoord2d(0, 0);       glVertex2f(-1, -1);
00100                 glTexCoord2d(1, 0);       glVertex2f(1, -1);
00101                 glTexCoord2d(0, 1);       glVertex2f(-1, 1);
00102                 glTexCoord2d(1, 1);       glVertex2f(1, 1);
00103             glEnd();
00104 
00105             glPopMatrix();
00106         }
00107     }
00108 }
00109 
00110 void
00111 CUADRICULA::pintar_gl(CALIDAD_VISUAL *Calidad, MATERIAL *Material)
00112 {
00113     glPushMatrix();
00114 
00115     Material->set_doble_cara(FALSE);
00116     //- Pintado de bordes --------------------------------------------------
00117     COLOR cb(1, 0, 0);
00118 
00119     if ( Calidad->con_bordes ) {
00120         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
00121         if ( !Calidad->con_caras ) glDisable(GL_CULL_FACE);
00122         Calidad->activar_bordes_gl(cb, Material);
00123         pintar_nucleo_gl(Calidad, Material);
00124     }
00125 
00126     //- Pintado de caras ---------------------------------------------------
00127     COLOR c(1, 1, 1);
00128 
00129     if ( Calidad->con_caras ) {
00130         glEnable(GL_CULL_FACE);
00131         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00132         Calidad->activar_caras_gl(c, Material);
00133 
00134         ACTIVAR_POLYGON_OFFSET();
00135         pintar_nucleo_gl(Calidad, Material);
00136         DESACTIVAR_POLYGON_OFFSET();
00137     }
00138 
00139     glPopMatrix();
00140 }
00141 #endif // GL_ENABLED
00142 
00143 BOOLEAN
00144 CUADRICULA::copiar_textura(IMAGEN_RGB *Origen)
00155 {
00156     //- Chequeo de sanidad --------------------------------------------------
00157     if ( (Origen->xtam() % num_columnas) || 
00158          (Origen->ytam() % num_filas) ) {
00159         fprintf(stderr,
00160             "<CUADRICULA> ERROR: Tamanno de imagen incompatible.\n");
00161         fflush(stderr);
00162         return FALSE;
00163     }
00164     //-----------------------------------------------------------------------
00165     int i, j;
00166     int dx, dy;
00167 
00168     dx = Origen->xtam() / num_columnas;
00169     dy = Origen->ytam() / num_filas;
00170     for ( i = 0; i < num_columnas; i++ ) {
00171         for ( j = 0; j < num_filas; j++ ) {
00172             if ( !parches[i*num_filas + j].init(dx, dy) ) {
00173                 fprintf(stderr, "ERROR: No puedo leer mi fondo!\n");
00174                 fflush(stderr);
00175                 return FALSE;
00176             }
00177             extraer_sub_imagen(Origen, &parches[i*num_filas+j],
00178                 i * dx, (num_filas - j - 1) * dy);
00179         }
00180     }
00181 
00182     return TRUE;
00183 }
00184 
00185 //===========================================================================
00186 //= EOF                                                                     =
00187 //===========================================================================
00188 

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.