00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "toolkits/util/cuadricula.h"
00024
00025
00026
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
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
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
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
00187
00188