domingo, 9 de marzo de 2014

Mouse Button y Motion in OpenGL(glut)




Código Fuente:

#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>

using namespace std;

#define NP 4000
#define AGE 200

float winWid,winHeight;
float rx,ry;

void redraw( void ){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,0.0); //Función para seleccionar el color
    glRectf(-10.0+rx,-10.0+ry,10.0+rx,10.0+ry);
    glutSwapBuffers(); //Realiza un intercambio en la capa en uso para la ventana actual.
                       //Específicamente, glutSwapBuffers promueve el contenido de la memoria
                       //intermedia posterior de la capa en el uso de la ventana actual para convertirse
                       // en el contenido del búfer frontal.
}

void motion(int x, int y){
    cerr << "motion. x:" << x << ", y:" << y << " \n";
     rx = float(x);
     ry = winHeight - float(y);
}


void mousebutton(int button, int state, int x, int y){
    cerr << "mousebutton. x:" << x << ", y:" << y << " \n";
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        rx = float(x);
        ry = winHeight - float(y);
        redraw();
    }
}



int main(int argc, char *argv[]){
    winWid = 600.0;
    winHeight = 400.0;

    glutInit(&argc, argv);/*glutInit inicializará la biblioteca GLUT y negociar una sesión con el
     sistema de ventanas. Durante este proceso, glutInit puede causar la terminación del programa de
      GLUT con un mensaje de error al usuario si GLUT no puede ser inicializado correctamente. Ejemplos
      de esta situación son la falta de conexión con el sistema de ventanas, la falta de apoyo del sistema
       de ventanas para OpenGL y las opciones de línea de comandos no válidos.
    */

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutCreateWindow(" "); //Crea la ventana, entre las comillas puedes incluir un titulo de la ventana.
    glutPositionWindow(200,100); //Posición inicial de la ventana.

    glutReshapeWindow(int(winWid),int(winHeight));/*glutReshapeWindow solicita un cambio en el tamaño de la
    ventana actual. Los parámetros width y height son las extensiones de tamaño en píxeles. La anchura y la
    altura deben ser valores positivos.
    */

    glClearColor(0.0,0.0,0.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho(0.0,winWid,0.0,winHeight, -100.0, 100.0);/*glOrtho describe una transformación que produce una proyección paralela.
     La matriz actual (ver glMatrixMode) se multiplica por esta matriz y el resultado reemplaza la matriz actual.
    */


    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glutDisplayFunc(redraw);


    glutIdleFunc(redraw);/*glutIdleFunc establece la devolución de llamada ociosa mundial que se FUNC así que un programa GLUT
     pueda realizar tareas de procesamiento de fondo o la animación continua cuando no se están recibiendo los eventos del
     sistema de la ventana. Si se habilita, el callback de inactividad se llama continuamente cuando no se reciben eventos.
    */


    glutMotionFunc(motion);/*glutMotionFunc y glutPassiveMotionFunc establecen el
    movimiento y la devolución de llamada de movimiento pasivo, respectivamente, para la ventana actual.
    La devolución de llamada propuesta de la ventana se llama cuando el ratón se mueve dentro de la ventana,
     mientras que uno o más botones del ratón se presionan. La devolución de llamada de movimiento pasivo de una
     ventana se llama cuando el ratón se mueve dentro de la ventana, mientras que no hay botones del ratón se presionan.
    */


    glutMouseFunc(mousebutton);/*glutMouseFunc establece la devolución de llamada del ratón para la ventana actual.
     Cuando un usuario pulsa y botones de comunicados de ratón en la ventana, cada pulsación y cada versión genera
     una devolución de llamada de ratón. El parámetro de botón es uno de GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON o
     GLUT_RIGHT_BUTTON. Para los sistemas con sólo dos botones del ratón, puede no ser posible generar GLUT_MIDDLE_BUTTON
      devolución de llamada.
    */


    glutMainLoop();
    return 0;
}

No hay comentarios:

Publicar un comentario