Search code examples
c++openglglut

adding mouse event to change the color of simple circle


I draw a circle and trying to add mouse event, that change the color of the circle i cannot find good sources

Here is the whole code:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define window_width  1080  
#define window_height 720 
void drawFilledSun() {
    //static float angle;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    //glColor3ub(253, 184, 19);     
    glColor3ub(255, 0, 0);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++) {
        glVertex2f(
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
        );
    }
    glEnd(); //END
}
void main_loop_function() {
    int c;
    drawFilledSun();
    glutSwapBuffers();
    c = getchar();
}
void GL_Setup(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutIdleFunc(main_loop_function);
    GL_Setup(window_width, window_height);
    glutMainLoop();
}

Solution

  • Add an array for the red green and blue color components of the sun and a color index:

    int color_i = 0;
    GLubyte color[][3] = { {255, 0, 0 }, {253, 184, 19} };
    

    Use the color arrays to set the color attribute

    void drawFilledSun() {
         // [...]
    
         glColor3ubv(color[color_i]);
    

    Get rid of the getchar in main_loop_function, it prevents the window from responding. But call glutPostRedisplay for continuously updating the window:

    void main_loop_function() {
        drawFilledSun();
        glutSwapBuffers();
        glutPostRedisplay();
    }
    

    Use glutDisplayFunc rather than glutIdleFunc and add a glutMouseFunc callback:

    int main(int argc, char** argv) {
        // [...]
    
        glutDisplayFunc(main_loop_function);
        glutMouseFunc( mouseFunc );
    
    

    Change the color index in the mouse callback:

    void mouseFunc(int button, int state, int x, int y)
    {
        if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
            color_i = (color_i == 0) ? 1 : 0;
        }
    }
    

    See the example:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    #define window_width  1080  
    #define window_height 720
    
    int color_i = 0;
    GLubyte color[][3] = { {255, 0, 0 }, {253, 184, 19} };
    
    void drawFilledSun() {
        //static float angle;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glTranslatef(0, 0, -10);
        int i, x, y;
        double radius = 0.30;
        glColor3ubv(color[color_i]);
        double twicePi = 2.0 * 3.142;
        x = 0, y = 0;
        glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
        glVertex2f(x, y); // center of circle
        for (i = 0; i <= 20; i++) {
            glVertex2f(
                (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
            );
        }
        glEnd(); //END
    }
    
    void main_loop_function() {
        drawFilledSun();
        glutSwapBuffers();
        glutPostRedisplay();
    }
    
    void GL_Setup(int width, int height) {
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glEnable(GL_DEPTH_TEST);
        gluPerspective(45, (float)width / height, .1, 100);
        glMatrixMode(GL_MODELVIEW);
    }
    
    void mouseFunc(int button, int state, int x, int y)
    {
        if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
            color_i = (color_i == 0) ? 1 : 0;
        }
    }
    
    int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitWindowSize(window_width, window_height);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        glutCreateWindow("GLUT Example!!!");
        glutDisplayFunc(main_loop_function);
        glutMouseFunc( mouseFunc );
        GL_Setup(window_width, window_height);
        glutMainLoop();
    }