23/10/2008, 17:07
|
| | | Fecha de Ingreso: febrero-2008
Mensajes: 36
Antigüedad: 16 años, 11 meses Puntos: 0 | |
Respuesta: Problema, opengl, Glut y Rubberband ok... dadas diversas correcciones y preguntas al profe al respecto publico el codigo por si a alguien mas le puede servir.
salu2! Gracias por sus respuestas
Código:
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>
int h=449, w=645;
float xf, yf,xm,ym; /*Guarda las sucesivas posiciones del mouse*/
int moving=0;
float sizex, sizey, antx=0, anty=0;
void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_COLOR_LOGIC_OP);
glLogicOp(GL_COPY);
}
/*Funcion Callback:
Dibujara un cuadrado cuando el mouse de click*/
void drawSquare(int x, int y)
{
y=h-y;
sizey=((float)(h-yf-y)/h);
sizex=((float)(x-xf)/w);
glColor3f(1.0,0.0,1.0);
glLogicOp(GL_XOR);
if(moving)
{
glColor3f(1.0,1.0,1.0);
glBegin(GL_POLYGON);
glVertex2f(xm+antx,ym-anty);
glVertex2f(xm,ym-anty);
glVertex2f(xm,ym);
glVertex2f(xm+antx,ym);
glEnd();
glFlush();
glBegin(GL_POLYGON);
glVertex2f(xm+sizex,ym-sizey);
glVertex2f(xm,ym-sizey);
glVertex2f(xm,ym);
glVertex2f(xm+sizex,ym);
glEnd();
glFlush();
antx=sizex;
anty=sizey;
}
}
/*Funcion Callback:
Genera la ventana donde se haran los dibujos*/
void generaWin()
{
glClear(GL_COLOR_BUFFER_BIT); /*Limpia la pantalla*/
glBegin(GL_POLYGON); /*Dibuja un poligono, triangulo especificamente.*/
glColor3f(1.0,0.0,0.0);
glVertex2f(0.2,0.2);
glColor3f(0.0,1.0,0.0);
glVertex2f(0.8,0.2);
glColor3f(0.0,0.0,1.0);
glVertex2f(0.48,0.9);
glEnd();
glFlush();
}
/*Funcion Callback:
Permite reescalar la figura si se reescala la ventana */
void reshape(int w, int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D (0.0, 1.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
/*Funcion Callback:
Uso del mouse sobre ventana*/
void mouse(int btn, int state, int x, int y)
{
if(btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
if(moving == 0)
{
xf=x;
yf=y;
moving=1;
xm=((float)x/w);
ym=((float)(h-y)/h);
}
drawSquare(x,y);
}
if(btn == GLUT_LEFT_BUTTON && state == GLUT_UP)
{
moving = 0;
antx = 0;
anty = 0;
}
}
/*Funcion Callback:
Permite usar el teclado en el programa*/
void keyboard(unsigned char key, int x, int y)
{
if(key==27)
exit(0);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv); /*Negocia con el gestor de ventanas*/
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /*Modo de dibujo de la ventana*
glutInitWindowSize(645,449); /*Taman~o de la ventana*/
glutInitWindowPosition(0,0); /*Posicion de la ventana en la pantalla
glutCreateWindow("Dibujando"); /*Nombre de la ventana*/
glutDisplayFunc(generaWin); /*Callback de Dysplay*/
glutReshapeFunc(reshape); /*Funcion para el re-size de una ventana, manti
glutMouseFunc(mouse); /*Funcion del Mouse*/
glutMotionFunc(drawSquare);
glutPassiveMotionFunc(drawSquare);
glutKeyboardFunc(keyboard); /*Funcion para el teclado*/
init(); /*Funcion que me inicializa parametros de la ventana*/
glutMainLoop(); /*Loop de eventos de aplicacion */
return 0;
}
|