AndroidDev
AndroidDev

Reputation: 21237

3d drawing in OpenGL

I'm trying to draw a chess board in OpenGL. I can draw the squares of the game board exactly as I want. But I also want to add a small boarder around the perimeter of the game board. Somehow, my perimeter is way bigger than I want. In fact, each edge of the border is the exact width of the entire game board itself.

My approach is to draw a neutral gray rectangle to represent the entire "slab" of wood that would be cut to make the board. Then, inside of this slab, I place the 64 game squares, which should be exactly centered and take up just slightly less 2d space as the slab does. I'm open to better ways, but keep in mind that I'm not very bright.

EDIT: in the image below all that gray area should be about 1/2 the size of a single square. But as you can see, each edge is the size of the entire game board. Clearly I'm not understanding something.

enter image description here

Here is the display function that I wrote. Why is my "slab" so much too large?

void display()
{
    // Clear the image
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Reset any previous transformations
    glLoadIdentity();

    // define the slab
    float square_edge = 8;
    float border = 4;
    float slab_thickness = 2;
    float slab_corner = 4*square_edge+border;

    // Set the view angle
    glRotated(ph,1,0,0);
    glRotated(th,0,1,0);
    glRotated(zh,0,0,1);

    float darkSquare[3] = {0,0,1};
    float lightSquare[3] = {1,1,1};

    // Set the viewing matrix
    glOrtho(-slab_corner, slab_corner, slab_corner, -slab_corner, -slab_corner, slab_corner);

    GLfloat board_vertices[8][3] = {
        {-slab_corner, slab_corner, 0},
        {-slab_corner, -slab_corner, 0},
        {slab_corner, -slab_corner, 0},
        {slab_corner, slab_corner, 0},
        {-slab_corner, slab_corner, slab_thickness},
        {-slab_corner, -slab_corner, slab_thickness},
        {slab_corner, -slab_corner, slab_thickness},
        {slab_corner, slab_corner, slab_thickness}
    };

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_INT, 0, board_vertices);

    // this defines each of the six faces in counter clockwise vertex order
    GLubyte slabIndices[] = {0,3,2,1,2,3,7,6,0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};

    glColor3f(0.3,0.3,0.3); //upper left square is always light
    glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, slabIndices);

    // draw the individual squares on top and centered inside of the slab
    for(int x = -4; x < 4; x++) {
        for(int y = -4; y < 4; y++) {
            //set the color of the square
            if ( (x+y)%2 ) glColor3fv(darkSquare);
            else glColor3fv(lightSquare);

            glBegin(GL_QUADS);
                glVertex2i(x*square_edge, y*square_edge);
                glVertex2i(x*square_edge+square_edge, y*square_edge);
                glVertex2i(x*square_edge+square_edge, y*square_edge+square_edge);
                glVertex2i(x*square_edge, y*square_edge+square_edge);
            glEnd();
        }
    }

    glFlush();
    glutSwapBuffers();
}

Upvotes: 0

Views: 600

Answers (1)

cobbal
cobbal

Reputation: 70785

glVertexPointer(3, GL_INT, 0, board_vertices);

specifies that board_vertices contains integers, but it's actually of type GLfloat. Could this be the problem?

Upvotes: 1

Related Questions