problem in address passing

hi i have a problem in understanding a code
for (i = 0; i < 6; ++i) {
glNormal3fv(&cube_normals[i][0]);
glBegin(GL_POLYGON);
glVertex4fv(&cube_vertexes[i][0][0]);
glVertex4fv(&cube_vertexes[i][1][0]);
glVertex4fv(&cube_vertexes[i][2][0]);
glVertex4fv(&cube_vertexes[i][3][0]);
glEnd();

here address of the array has been passed in the glVertex4fv and the cube vertices r defined as shown below,wat is dat exactly happening here how the cube is drawn???

static float cube_vertexes[6][4][4] =
{
{
{-1.0, -1.0, -1.0, 1.0},
{-1.0, -1.0, 1.0, 1.0},
{-1.0, 1.0, 1.0, 1.0},
{-1.0, 1.0, -1.0, 1.0}},

{
{1.0, 1.0, 1.0, 1.0},
{1.0, -1.0, 1.0, 1.0},
{1.0, -1.0, -1.0, 1.0},
{1.0, 1.0, -1.0, 1.0}},

{
{-1.0, -1.0, -1.0, 1.0},
{1.0, -1.0, -1.0, 1.0},
{1.0, -1.0, 1.0, 1.0},
{-1.0, -1.0, 1.0, 1.0}},

{
{1.0, 1.0, 1.0, 1.0},
{1.0, 1.0, -1.0, 1.0},
{-1.0, 1.0, -1.0, 1.0},
{-1.0, 1.0, 1.0, 1.0}},

{
{-1.0, -1.0, -1.0, 1.0},
{-1.0, 1.0, -1.0, 1.0},
{1.0, 1.0, -1.0, 1.0},
{1.0, -1.0, -1.0, 1.0}},

{
{1.0, 1.0, 1.0, 1.0},
{-1.0, 1.0, 1.0, 1.0},
{-1.0, -1.0, 1.0, 1.0},
{1.0, -1.0, 1.0, 1.0}}
};

Each call toglVertex4fv specifies a point (it takes 4 floats: 3 coordinates and fourth is always 1.0, to multiply by the current 4x4 GL_MODELVIEW matrix)
So, every 4 calls define a polygon of the cube. It’s simple.

hi thanks for the reply but glVertex4fv(&cube_vertexes[i][0][0]);
here how does it take the vertices ??? means it takes if i=0…[0][0][0] element of the array or takes the complete row of the 0th array??

hi can u help me on another concept in the vertex array its [6][4][4] which represents 6 faces of the cube and each set of 4 vertices corresponds to 4 vertices of a face… can u tell me how those points are defined???

There are 6 faces of the cube, each containing 4 vertices, with each vertex’s position stored as 4 floats, representing cartesian coordinates (X,Y,Z + W).

if you call


glVertex4fv(&cube_vertexes[0][0][0]);

it will grab 4 floats from that address (hence the entire row)


{-1.0, -1.0, -1.0, 1.0}

and feed it into OpenGL as a new vertex.

calling glVertex## between glBegin(primitiveMode) + glEnd() causes all the vertices issued between glBegin + glEnd to be treated differently depending on the primitive mode chosen in the glBegin call. In your case, all the primitives issued between glBegin + glEnd are merged into one single polygon primitive. If you were to choose GL_TRIANGLES instead, then every 3 vertices you issue would be merged into one triangle primitive.

http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml

There are certain instructions that change the current values that will be issued alongside each glVertex## call, in your example


glNormal3fv(&cube_normals[i][0]);

is used to set the normal direction per face of the cube, then all glVertex## calls following this will use the same value. You could also set the color per-vertex by calling glColor## before each glVertex## call.

More help on OpenGL instructions can be found at:
http://www.opengl.org/sdk/docs/man/