Ver Mensaje Individual
  #6 (permalink)  
Antiguo 23/10/2008, 17:07
Avatar de v4mp1r0
v4mp1r0
 
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;
}