TommyGhat
TommyGhat

Reputation: 11

How can I display text and some points using OpenGL/GLUT?

This project compiles and runs, but there is nothing appearing in the window.

It is supposed to display some text and an area with some points. Could anyone help me fix this?

Here is my code:

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

#define KEY_ESCAPE 27

#define PROJECTION_WIDTH 150
#define NUMBER_OF_FLIES 50

float xpos[NUMBER_OF_FLIES];
float ypos[NUMBER_OF_FLIES];


typedef struct {
    int width;
    int height;
    char* title;
    float field_of_view_angle;
    float z_near;
    float z_far;
} glutWindow;

glutWindow win;

// To display the text
void renderBitmapString(float x, float y, void *font, const char *string)
{
    const char *c;
    glRasterPos3f(x, y, 0);
    for (c = string; *c != '\0'; c++)
    {
        glutBitmapCharacter(font, *c);
    }
}

void displayText()
{

    glPushMatrix();
    //glTranslatef(1.0, 0.50, 0.5);
        //const int font = (int)GLUT_BITMAP_9_BY_15;
        const int font = (int)GLUT_BITMAP_HELVETICA_12;
        glColor3f(0.0f, 0.0f, 0.0f);                                // black color
        renderBitmapString(-1.7, 1.3, (void *)font, "1. Load Measured projections");
        renderBitmapString(-1.7, 1.2, (void *)font, "2. Set the position of flies, i.e. create initial guess");
        renderBitmapString(-1.7, 1.1, (void *)font, "3. Compute projections from the current reconstruction");
        renderBitmapString(-1.7, 1, (void *)font, "4. Compute the population's perfomance, i.e. the global fitness");
        renderBitmapString(-1.7, 0.9, (void *)font, "5. Select a random fly (fly_to_kill)");
        renderBitmapString(-1.7, 0.8, (void *)font, "6. Remove the fly's contribution");
        renderBitmapString(-1.7, 0.7, (void *)font, "7. Compute the population's performance without the selected fly");
        renderBitmapString(-1.7, 0.6, (void *)font, "8. Compare the performances, i.e. compute the fly's local fitness");
        renderBitmapString(-1.7, 0.5, (void *)font, "9. If the local fitness is equal to or greater than the selection threshold,");
        renderBitmapString(-1.5, 0.4, (void *)font, "then go to Step 10, ");
        renderBitmapString(-1.5, 0.3, (void *)font, "else go to Step 11");
        renderBitmapString(-1.7, 0.2, (void *)font, "10. Restore the fly's contribution, then go to Step 5");
        renderBitmapString(-1.7, 0.1, (void *)font, "11. Select a genetic operator");
        renderBitmapString(-1.7, 0.0, (void *)font, "12. If the genetic operator is mutation,");
        renderBitmapString(-1.5, -0.1, (void *)font, "then go to Step 13, ");
        renderBitmapString(-1.5, -0.2, (void *)font, "else go to Step 19 ");
        renderBitmapString(-1.7, -0.3, (void *)font, "13. Select a random fly (fly_to_reproduce)");
        renderBitmapString(-1.7, -0.4, (void *)font, "14. Remove the fly's contribution");
        renderBitmapString(-1.7, -0.5, (void *)font, "15. Compute the population's performance without the selected fly");
        renderBitmapString(-1.7, -0.6, (void *)font, "16. Compare the performances, i.e. compute the fly's local fitness");
        renderBitmapString(-1.7, -0.7, (void *)font, "17. Restore the fly's contribution'");
        renderBitmapString(-1.7, -0.8, (void *)font, "18. If the local fitness is smaller than the selection threshold,");
        renderBitmapString(-1.5, -0.9, (void *)font, "then go to Step 13, ");
        renderBitmapString(-1.5, -1, (void *)font, "else go to Step 20 ");
        renderBitmapString(-1.7, -1.1, (void *)font, "19. Replace fly_to_kill by a new fly with a random position, go to Step 22");
        renderBitmapString(-1.7, -1.2, (void *)font, "20. Replace fly_to_kill by a new fly based on fly_to_reproduce");
        renderBitmapString(-1.7, -1.3, (void *)font, "21. Add the fly's contribution to the population");
        renderBitmapString(-1.7, -1.4, (void *)font, "22. If stop the reconstruction,");
        renderBitmapString(-1.5, -1.5, (void *)font, "then go to Step 23, ");
        renderBitmapString(-1.5, -1.6, (void *)font, "else go to Step 4 ");
        renderBitmapString(-1.7, -1.7, (void *)font, "23. Extract good flies");

        // the bottom left
        renderBitmapString(-3.9, -0.9, (void *)font, "Iterative paradigm for tomography reconstruction");
        renderBitmapString(-3.9, -1, (void *)font, "(click here to view the flowchart in full resolution)");
        // the top right
        renderBitmapString(1.8, 1.3, (void *)font, "Basic Fly algorithm for tomography reconstruction");
        renderBitmapString(1.8, 1.2, (void *)font, "(click here to view the flowchart in full resolution)");

    glPopMatrix();
    glutSwapBuffers();
}

void displayFlies()
{
    glPushMatrix();
        //glTranslatef(0.0, 0.50, 0.0);
        glColor3f(0.0f, 0.0f, 1.0f);       //blue color

        glPushAttrib(GL_POINT_BIT);
            glPointSize(5.0);

            // drawing the data
            for (int i = 0; i < NUMBER_OF_FLIES; i++){
                int DX = xpos[i];
                int DY = ypos[i];
                glPushMatrix();
                    //glTranslatef(- 0.85 + DX * 0.014, -1.2 + DY * 0.0135, 0.0);

                    glBegin(GL_POINTS); // drawing points 
                    glVertex3f(DX, DY, 0.0f);
                    glEnd();

                glPopMatrix();
            }

        glPopAttrib();

        // draw The display Area
        glBegin(GL_LINE_LOOP);             //start drawing a line loop
        glVertex3f(0.65f, 0.25f, 0.0f);    //left of window
        glVertex3f(0.65f, -1.20f, 0.0f);   //bottom of window
        glVertex3f(-0.85f, -1.20f, 0.0f);  //right of window
        glVertex3f(-0.85f, 0.25f, 0.0f);   //top of window
        glEnd();                           //end drawing of line loop
    glPopMatrix();
    glutSwapBuffers();
}

void displayProjection()
{
    glPushMatrix();
    //glTranslatef(1.20, 0.50, 0.0);

        // The upper rectangle
        glBegin(GL_LINE_LOOP);             //start drawing a line loop
        glVertex3f(0.65f, 0.60f, 0.0f);    //left of window
        glVertex3f(0.65f, 0.27f, 0.0f);    //bottom of window
        glVertex3f(-0.85f, 0.27f, 0.0f);   //right of window
        glVertex3f(-0.85f, 0.60f, 0.0f);   //top of window
        glEnd();

        //The right rectangle
        glBegin(GL_LINE_LOOP);             //start drawing a line loop
        glVertex3f(0.67f, 0.25f, 0.0f);    //left of window
        glVertex3f(0.67f, -1.20f, 0.0f);   //bottom of window
        glVertex3f(0.99f, -1.20f, 0.0f);  //right of window
        glVertex3f(0.99f, 0.25f, 0.0f);   //top of window
        glEnd();                           //end drawing of line loop

        // draw Horizontal RED lines
        glBegin(GL_LINES);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(-0.25f, 0.60f, 0.0f);
        glVertex3f(-0.25f, 0.27f, 0.0f);
        glVertex3f(0.1f, 0.27f, 0.0f);
        glVertex3f(0.1f, 0.60f, 0.0f);
        glEnd();

        // draw Upper RED lines
        glBegin(GL_LINES);
        glVertex3f(0.46f, 0.18f, 0.59f);  // origin of the Right line 
        glVertex3f(0.59f, 0.29f, -0.11f);  // ending point of the Right line

        glVertex3f(-0.37f, 0.18f, 0.59f);  // origin of the Left line
        glVertex3f(-0.33f, 0.29f, -0.11f);  // ending point of the Left line

        glVertex3f(0.37f, 0.40f, 0.92f);  // origin of the Upper line
        glVertex3f(0.40f, 0.49f, 0.50f);  // ending point of the Upper line
        glEnd();


        // draw Horizontal RED lines
        glBegin(GL_LINES);
        glVertex3f(-0.06f, 0.47f, -1.50f);    // Origin The Upper Horizontal line
        glVertex3f(-0.06f, -0.23f, -1.50f);   // Ending point of The Upper Horizontal line

        glVertex3f(-0.06f, -0.63f, -1.50f);   // Origin The bottom Horizontal line
        glVertex3f(-0.06f, -1.40f, -1.50f);   // Ending point of The bottom Horizontal line

        glVertex3f(0.36f, -0.23f, -1.50f);   // Origin The right Horizontal line
        glVertex3f(0.36f, -0.63f, -1.50f);   // Ending point of The right Horizontal line

        glVertex3f(0.78f, -0.30f, 0.21f);  // origin of the upper vartical line
        glVertex3f(0.95f, -0.29f, -0.11f);  // ending point of the upper vartical line

        glVertex3f(0.78f, -0.60f, 0.21f);  // origin of the bottom vartical line
        glVertex3f(0.95f, -0.61f, -0.11f);  // ending point of the bottom vartical line


        glEnd();

    glPopMatrix();

}


// intialization function
void initialize()
{
    glMatrixMode(GL_PROJECTION);                                            // select projection matrix
    glViewport(0, 0, win.width, win.height);                                // set the viewport
    glMatrixMode(GL_PROJECTION);                                            // set matrix mode
    glLoadIdentity();                                                       // reset projection matrix
    GLfloat aspect = (GLfloat)win.width / win.height;
    //gluPerspective(win.field_of_view_angle, aspect, win.z_near, win.z_far);   // set up a perspective projection matrix
    gluOrtho2D(0, win.width, 0, win.height);
    glMatrixMode(GL_MODELVIEW);                                             // specify which matrix is the current matrix
    glClearDepth(1.0f);                                                     // specify the clear value for the depth buffer
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);                      // specify implementation-specific hints
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);                               // specify clear values for the color buffers"background"

}

// keyboard control function
void keyboard(unsigned char key, int mousePositionX, int mousePositionY)
{
    switch (key)
    {
    case KEY_ESCAPE:
        exit(0);
        break;

    default:
        break;
    }
}

// the main function
int main(int argc, char **argv)
{
    // set window values
    win.width = 1350;
    win.height = 690;
    win.title = " The Project ";
    win.field_of_view_angle = 45;
    win.z_near = 1.0f;
    win.z_far = 500.0f;
    //initialing the data
    for (int i = 0; i < NUMBER_OF_FLIES; i++){
        xpos[i] = rand() % PROJECTION_WIDTH;
        ypos[i] = rand() % PROJECTION_WIDTH;
    }
    // initialize and run program
    glutInit(&argc, argv);                                      // GLUT initialization
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);   // Display Mode
    glutInitWindowSize(win.width, win.height);                  // set window size
    glutCreateWindow(win.title);                                // create Window
    glutDisplayFunc(displayText);                                   // register Display Function
    glutIdleFunc(displayText);                                      // register Idle Function
    glutDisplayFunc(displayFlies);                                  // register Display Function
    glutIdleFunc(displayFlies);
    glutDisplayFunc(displayProjection);                                 // register Display Function
    glutIdleFunc(displayProjection);
    glutKeyboardFunc(keyboard);                                 // register Keyboard Handler
    initialize();
    glutMainLoop();                                             // run GLUT mainloop
    return 0;
}

Upvotes: 1

Views: 2268

Answers (1)

vukung
vukung

Reputation: 1884

You have three different display functions, but glutDisplayFunc and glutIdleFunc use only the latest one you set, so displayText and displayFlies are unused.

The last one, displayProjection, needs a line at the end:

glutSwapBuffers();

Also, you may need to setup some lights to illuminate what you draw.

By the way, commenting out the other two, you can test displayFlies, which renders a bunch of blue dots, and displayText, that writes some text (in black on black background, several lines on top of each other), as well.

It may be better to try some tutorials first, for example NeHe... and yes, as other commentators have said, you may be better off learning shaders :)

Upvotes: 1

Related Questions