miércoles, noviembre 15, 2006

Ejemplo GLUT : Dibujado de Primitivas utilizando GLUT




















Este ejercicio consta de dibujar primitivas al estilo de paint de Windows, pero con menos opciones obviamente, la tarea integra a través de GLUT la captura del mouse para el posterior dibujado de las figuras geométricas.

#include windows.h //agregar < >
#include GL/glut.h //agregar < >

void mouse(int btn, int state , int x, int y);
void key(unsigned char k, int, int);
void desplegar(void);
void inicio(void); // funcion de inicialización
void crear_cuadros(int x, int y, int s); // crea los cuadros del menu
int seleccion(int x, int y); //selecciona figura a dibujar
void menu_derecho(int id); //opciones de menu con boton derecho del mouse
void menu_line(int id);
void menu_sizepunto(int id);
void menu_relleno(int id);

GLsizei alto_default=480, ancho_default=640; // tamaño inicial de la ventana
int fill=0; // flag de relleno
int figura=0; // seleccion de primitivas
int contar_click=0; // variable de conteo de vertices
GLfloat tamano_punto=4.0, grosor_linea=2.0;// tamaño de puntos y lineas
GLfloat bgcolor[4]={0.0,0.0,0.0,0.0}; // color de fondo

int main(int argc, char **argv){

int c_menu, menu_punto, menu_linea, f_menu; // variables para trabajar con los menus
glutInit(&argc,argv); // inicio de ventanas GLUT
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // especifica tipo de display GLUT
glutCreateWindow(" Ejemplo - Dibujado de Primitivas utilizando GLUT "); // nombre de la ventana
glutDisplayFunc(desplegar); // funcion de despliegue
menu_punto = glutCreateMenu(menu_sizepunto);// menu de tamaño de punto
glutAddMenuEntry("Aumentar", 1); // aumentar tamaño de punto
glutAddMenuEntry("Disminuir", 2); // disminuir tamaño de punto
menu_linea = glutCreateMenu(menu_line); // menu de grosor de linea
glutAddMenuEntry("Aumentar", 1); // aumentar grosor de linea
glutAddMenuEntry("Disminuir", 2); // disminuir grosor de linea
f_menu = glutCreateMenu(menu_relleno); // menu de relleno
glutAddMenuEntry("Si", 1); // activar relleno
glutAddMenuEntry("No", 2); // desactivar relleno
glutCreateMenu(menu_derecho); // menu del boton derecho del mouse
glutAddSubMenu("Tamaño Punto", menu_punto);// asignar a menu de tamaño de punto
glutAddSubMenu("Grosor Linea", menu_linea); // asignar a menu de grosor de linea
glutAddSubMenu("Relleno", f_menu); // asignar a menu de relleno
glutAddMenuEntry("Borrar",1); // borrar la pantalla
glutAddMenuEntry("Salir",2); // salir del programa
glutAttachMenu(GLUT_RIGHT_BUTTON); // relacionar menu al boton derecho del mouse

inicio(); // inicializar programa
glutMouseFunc(mouse); // especificar callback de mouse
glutMainLoop(); // iniciar ciclo principal de GLUT
}

/* funcion de inicializacion */
void inicio(void)
{
glMatrixMode(GL_PROJECTION); // especificar matriz de projeccion
glLoadIdentity(); // cargar identidad
glOrtho(0.0, (GLdouble) ancho_default , 0.0, (GLdouble) alto_default , -1.0, 1.0);
// ajustar perspectiva ortogonal al tamaño establecido de la ventana

glClear(GL_COLOR_BUFFER_BIT); // limpiar pantalla
glColor3f(1.0,1.0,1.0); // color de dibujo blanco
glPointSize(3.0); // tamaño predeterminado de punto = 3
glEnable(GL_LINE_STIPPLE); // tipo de linea
glLineStipple(1,0xFFFF); // linea continua
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //especificar que solo se dibujen lineas
glutReshapeWindow(ancho_default,alto_default); //tamaño de ventana establecido 480x640
glFlush(); // enviar al servidor grafico
}


void menu_derecho(int id){ //boton derecho del mouse
if(id==1) glutPostRedisplay(); // limpiar la pantalla
if(id==2) exit(1); //salir del programa
}


void menu_sizepunto(int id){ // menu de tamaño de punto
if(contar_click==0){
if(id==1) tamano_punto=tamano_punto+1; //aumentar tamaño a punto
else if(tamano_punto > 1) tamano_punto=tamano_punto-1;//disminuir tamaño a punto
glPointSize(tamano_punto); // guardar cambios del tamaño del punto
}
}


void menu_line(int id){ //grosor de linea
if(contar_click==0){
if(id==1) grosor_linea=grosor_linea+1; //aumentar grosor de la linea
else if(tamano_punto > 1) grosor_linea=grosor_linea-1;//disminuir grosor de linea
glLineWidth(grosor_linea); // cambiar el grosor de linea
}
}

void menu_relleno(int id){ //menu de relleno

if(contar_click==0){
if(id==1) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);// activar relleno
else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // desactivar relleno
}
}


int seleccion(int x, int y){ //seleccionar la opcion requerida del menu

y=alto_default-y;
if(y>64)return 0; //si se encuentra en el cuadro para dibujar

else if(y <>448 &&amp;amp;amp;amp; x<640> 320 &&amp; x < btn="=" state="=" opcion="seleccion(x,y);"> 0 &&amp;amp;amp; opcion <6) figura="opcion;" opcion ="=" contar_click ="=" opcion="=" opcion="=" opcion="=" opcion ="=" figura ="=" figura ="=" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="0;" figura="=" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="0;" figura ="=" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="contar_click+1;" contar_click ="=" contar_click="0;" figura ="=" contar_click ="=" contar_click="contar_click+1;"> 0){
contar_click=contar_click+1;
glVertex2i(x,alto_default-y);
if(glutGetModifiers() == GLUT_ACTIVE_CTRL){ // unir el ultimo punto al primero con Ctrl presionado
glEnd();
contar_click=0;
}
}
}

}
glFlush(); // enviar al servidor grafico
}
}//fin mouse



/* Funcion que dibuja los cradrados del menu */
void crear_cuadros(int x, int y, int s ){

glBegin(GL_LINE_LOOP);
glVertex2i(x, y);
glVertex2i(x+s,y);
glVertex2i(x+s,y+s);
glVertex2i(x, y+s);
glEnd();

}//fin crear_cuadros

/* Funcion de despliegue */
void desplegar(void){

glPushAttrib(GL_ALL_ATTRIB_BITS); // guardar los atributos
glClearColor(bgcolor[0], bgcolor[1], bgcolor[2], bgcolor[3]); // color de fondo
glClear(GL_COLOR_BUFFER_BIT); // limpiar pantalla
glLineWidth(1.0); // lineas de grosor 1
glPointSize(3.0); // puntos de tamaño 3
glLineStipple(1, 0xFFFF);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);// dibujar los poligonos con relleno

glBegin(GL_QUADS);
glColor3f(1.0,0.0,0.0); //rojo
glVertex2i(448,64);
glVertex2i(472,64);
glVertex2i(472,48);
glVertex2i(448,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,1.0,0.0); //verde
glVertex2i(472,64);
glVertex2i(496,64);
glVertex2i(496,48);
glVertex2i(472,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.0,1.0); //azul
glVertex2i(496,64);
glVertex2i(520,64);
glVertex2i(520,48);
glVertex2i(496,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,1.0,1.0); //celeste
glVertex2i(520,64);
glVertex2i(544,64);
glVertex2i(544,48);
glVertex2i(520,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(1.0,0.0,1.0); //rosado
glVertex2i(544,64);
glVertex2i(568,64);
glVertex2i(568,48);
glVertex2i(544,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(1.0,0.5,0.0); //naranjo
glVertex2i(568,64);
glVertex2i(592,64);
glVertex2i(592,48);
glVertex2i(568,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(1.0,1.0,0.0); //amarillo
glVertex2i(592,64);
glVertex2i(616,64);
glVertex2i(616,48);
glVertex2i(592,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(1.0,1.0,1.0); //blanco
glVertex2i(616,64);
glVertex2i(640,64);
glVertex2i(640,48);
glVertex2i(616,48);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.7,0.0,0.0); //derivado del rojo
glVertex2i(448,48);
glVertex2i(472,48);
glVertex2i(472,32);
glVertex2i(448,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.7,0.0); //derivado del verde
glVertex2i(472,48);
glVertex2i(496,48);
glVertex2i(496,32);
glVertex2i(472,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.0,0.7); //derivado del azul
glVertex2i(496,48);
glVertex2i(520,48);
glVertex2i(520,32);
glVertex2i(496,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.7,0.7); //celeste oscuro
glVertex2i(520,48);
glVertex2i(544,48);
glVertex2i(544,32);
glVertex2i(520,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.7,0.0,0.7); //rosado oscuro
glVertex2i(544,48);
glVertex2i(568,48);
glVertex2i(568,32);
glVertex2i(544,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.7,0.3,0.0); //naranjo oscuro
glVertex2i(568,48);
glVertex2i(592,48);
glVertex2i(592,32);
glVertex2i(568,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.7,0.7,0.0); //amarillo oscuro
glVertex2i(592,48);
glVertex2i(616,48);
glVertex2i(616,32);
glVertex2i(592,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.7,0.7,0.7); //plomo
glVertex2i(616,48);
glVertex2i(640,48);
glVertex2i(640,32);
glVertex2i(616,32);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.5,0.0,0.0);
glVertex2i(448,32);
glVertex2i(472,32);
glVertex2i(472,16);
glVertex2i(448,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.5,0.0);
glVertex2i(472,32);
glVertex2i(496,32);
glVertex2i(496,16);
glVertex2i(472,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.0,0.5);
glVertex2i(496,32);
glVertex2i(520,32);
glVertex2i(520,16);
glVertex2i(496,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.5,0.5);
glVertex2i(520,32);
glVertex2i(544,32);
glVertex2i(544,16);
glVertex2i(520,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.5,0.0,0.5);
glVertex2i(544,32);
glVertex2i(568,32);
glVertex2i(568,16);
glVertex2i(544,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.5,0.3,0.0);
glVertex2i(568,32);
glVertex2i(592,32);
glVertex2i(592,16);
glVertex2i(568,16);
glEnd();


glBegin(GL_QUADS);
glColor3f(0.5,0.5,0.0);
glVertex2i(592,32);
glVertex2i(616,32);
glVertex2i(616,16);
glVertex2i(592,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.4,0.4,0.4); //plomo oscuro
glVertex2i(616,32);
glVertex2i(640,32);
glVertex2i(640,16);
glVertex2i(616,16);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.3,0.0,0.0);
glVertex2i(448,16);
glVertex2i(472,16);
glVertex2i(472,0);
glVertex2i(448,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.3,0.0);
glVertex2i(472,16);
glVertex2i(496,16);
glVertex2i(496,0);
glVertex2i(472,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.0,0.3);
glVertex2i(496,16);
glVertex2i(520,16);
glVertex2i(520,0);
glVertex2i(496,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.0,0.3,0.3);
glVertex2i(520,16);
glVertex2i(544,16);
glVertex2i(544,0);
glVertex2i(520,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.3,0.0,0.3);
glVertex2i(544,16);
glVertex2i(568,16);
glVertex2i(568,0);
glVertex2i(544,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.4,0.3,0.0);
glVertex2i(568,16);
glVertex2i(592,16);
glVertex2i(592,0);
glVertex2i(568,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.3,0.3,0.0);
glVertex2i(592,16);
glVertex2i(616,16);
glVertex2i(616,0);
glVertex2i(592,0);
glEnd();

glBegin(GL_QUADS);
glColor3f(0.1,0.1,0.1);
glVertex2i(616,16);
glVertex2i(640,16);
glVertex2i(640,0);
glVertex2i(616,0);
glEnd();

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// dibujar solo las lineas de los poligonos
glColor4f(1,1,1,1); // color inverso al del fondo de la pantalla

glBegin(GL_QUADS); // marco de los colores
glVertex2i(448,64);
glVertex2i(640,64);
glVertex2i(640,0);
glVertex2i(448,0);
glEnd();

crear_cuadros(0,0,64);
glBegin(GL_POINTS);
glVertex2i(32,32);
glEnd();

crear_cuadros(64,0,64);
glBegin(GL_LINES);
glVertex2i(120,54);
glVertex2i(77,11);
glEnd();

crear_cuadros(128,0,64); //3era. caja de menu
glBegin(GL_TRIANGLES);
glVertex2i(160,54);
glVertex2i(184,10);
glVertex2i(136,10);
glEnd();

crear_cuadros(192,0,64); //4ta. caja de menu
glBegin(GL_QUADS);
glVertex2i(200,54);
glVertex2i(248,54);
glVertex2i(248,10);
glVertex2i(200,10);
glEnd();


crear_cuadros(256,0,64); //5ta. caja de menu
glBegin(GL_LINE_LOOP);
glVertex2i(264,32);
glVertex2i(288,56);
glVertex2i(312,32);
glVertex2i(304,8);
glVertex2i(272,8);
glEnd();


glBegin(GL_QUADS); // marcos de los tipos de lineas
glVertex2i(320,64);
glVertex2i(448,64);
glVertex2f(448.0,42.6);
glVertex2f(320.0,42.6);

glVertex2f(320.0,42.6);
glVertex2f(448.0,42.6);
glVertex2f(448.0,21.3);
glVertex2f(320.0,21.3);

glVertex2f(320.0,21.3);
glVertex2f(448.0,21.3);
glVertex2f(448.0,0);
glVertex2f(320.0,0);

glEnd(); // fin marcos de los tipos de lineas


glEnable(GL_LINE_STIPPLE); // tipos de lineas

glLineStipple(1, 0xFFFF);
glBegin(GL_LINES);
glVertex2i(328,53);
glVertex2i(440,53);
glEnd();

glLineStipple(1, 0xF0F0);
glBegin(GL_LINES);
glVertex2i(328,32);
glVertex2i(440,32);
glEnd();

glLineStipple(1, 0xAAAA);
glBegin(GL_LINES);
glVertex2i(328,10);
glVertex2i(440,10);
glEnd();

glDisable(GL_LINE_STIPPLE); // fin tipos de lineas

glFlush(); // enviar al servidor grafico
//glPopAttrib(); // recuperar atributos previamente guardados
}

No hay comentarios: