phibao37
phibao37

Reputation: 2350

Draw shape with GLUT_DOUBLE mode

I have a code:

#include <gl/glut.h>
#include <stdio.h>

#define WinW 1000
#define WinH 500
/* ----------------------------------------------------------------------- */

bool mousedown = false;

void myInit(void)  {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(1.0, 0.0, 0.0);
    glPointSize(5.0);
    glShadeModel(GL_SMOOTH);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, WinW, WinH, 0.0, -1.0, 1.0);
}

void myDisplay(void)  {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_POINTS);
    glColor3f(1.0, 0.0, 0.0);
    glVertex2i(50, 50);
    glEnd();

    //glFlush();
    glutSwapBuffers();
}
void myMouse(int button, int state, int x, int y){
    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
        mousedown = true;
    }
    else
        mousedown = false;
}
void myMovedMouse(int mouseX, int mouseY){
    if (mousedown){
        //printf("%d %d\n", mouseX, mouseY);
        glBegin(GL_POINTS);
        glColor3f(0.0, 1.0, 0.0);
        glVertex2i(mouseX, mouseY);
        glEnd();

        //glFlush();
        glutSwapBuffers();
    }
}

/* ----------------------------------------------------------------------- */

int main(int argc, char *argv[])  {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(WinW, WinH);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("Computer Graphic");

    myInit();
    glutDisplayFunc(myDisplay);
    glutMouseFunc(myMouse);
    glutMotionFunc(myMovedMouse);

    glutMainLoop();
}

I want to draw free shape by mouse dragging.
I have try with glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)and glFlush(), it work for me.
But when I use GLUT_DOUBLE and glutSwapBuffers() in myMovedMouse(), the screen is blinking (black-white-black-white...)
I am new in OpenGL, anyone have solution for this.
Thanks for help!

Upvotes: 0

Views: 465

Answers (1)

Reto Koradi
Reto Koradi

Reputation: 54562

When using double buffering, you have to draw all your points on each redraw. So you have to maintain a list of all the points. The steps are then:

  1. On startup, create an empty point list. If you want nice code, define a class/struct that contains two values for the x and y position, and use a C++ container like std::vector for your list of points.

  2. When you get a new point from mouse input, add that point to the point list, and call glutPostRedisplay().

  3. In the myDisplay() function, draw all the points in the list.

Having to maintain a list of points may seem to add complexity compared to using single buffering. But as soon as you go a little farther, you will probably need it anyway. For example, if the user resizes the window, you will have to be able to redraw all the points anyway. So drawing the points one by one in single buffering mode will not get you very far.

Upvotes: 1

Related Questions