Выбрать главу

  // Front Face

  glNormal3f( 0.0f, 0.0f, 1.0f); // Normal Pointing Towards Viewer

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, –1.0f, 1.0f); // Point 1 (Front)

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, –1.0f, 1.0f); // Point 2 (Front)

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Point 3 (Front)

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Point 4 (Front)

  // Back Face

  glNormal3f( 0.0f, 0.0f,-1.0f); // Normal Pointing Away From Viewer

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, –1.0f, –1.0f); // Point 1 (Back)

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, –1.0f); // Point 2 (Back)

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, –1.0f); // Point 3 (Back)

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, –1.0f, –1.0f); // Point 4 (Back)

  // Top Face

  glNormal3f( 0.0f, 1.0f, 0.0f); // Normal Pointing Up

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, –1.0f); // Point 1 (Top)

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Point 2 (Top)

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Point 3 (Top)

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, –1.0f); // Point 4 (Top)

  // Bottom Face

  glNormal3f( 0.0f,-1.0f, 0.0f); // Normal Pointing Down

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, –1.0f, –1.0f); // Point 1 (Bottom)

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, –1.0f, –1.0f); // Point 2 (Bottom)

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, –1.0f, 1.0f); // Point 3 (Bottom)

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, –1.0f, 1.0f); // Point 4 (Bottom)

  // Right face

  glNormal3f( 1.0f, 0.0f, 0.0f); // Normal Pointing Right

  glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, –1.0f, –1.0f); // Point 1 (Right)

  glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, –1.0f); // Point 2 (Right)

  glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Point 3 (Right)

  glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, –1.0f, 1.0f); // Point 4 (Right)

  // Left Face

  glNormal3f(-1.0f, 0.0f, 0.0f); // Normal Pointing Left

  glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, –1.0f, –1.0f); // Point 1 (Left)

  glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, –1.0f, 1.0f); // Point 2 (Left)

  glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Point 3 (Left)

  glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, –1.0f); // Point 4 (Left)

 glEnd(); // Done Drawing Quads

The next two lines increase xrot and yrot by the amount stored in xspeed, and yspeed. If the value in xspeed or yspeed is high, xrot and yrot will increase quickly. The faster xrot, or yrot increases, the faster the cube spins on that axis.

 xrot+=xspeed; // Add xspeed To xrot

 yrot+=yspeed; // Add yspeed To yrot

 return TRUE; // Keep Going

}

Now we move down to WinMain(). Were going to add code to turn lighting on and off, spin the crate, change the filter and move the crate into and out of the screen. Closer to the bottom of WinMain() you will see the command SwapBuffers(hDC). Immediately after this line, add the following code.

This code checks to see if the letter 'L' has been pressed on the keyboard. The first line checks to see if 'L' is being pressed. If 'L' is being pressed, but lp isn't false, meaning 'L' has already been pressed once or it's being held down, nothing will happen.

    SwapBuffers(hDC); // Swap Buffers (Double Buffering)

    if (keys['L'] && !lp) // L Key Being Pressed Not Held?

    {

If lp was false, meaning the 'L' key hasn't been pressed yet, or it's been released, lp becomes true. This forces the person to let go of the 'L' key before this code will run again. If we didn't check to see if the key was being held down, the lighting would flicker off and on over and over, because the program would think you were pressing the 'L' key over and over again each time it came to this section of code.

Once lp has been set to true, telling the computer that 'L' is being held down, we toggle lighting off and on. The variable light can only be true of false. So if we say light=!light, what we are actually saying is light equals NOT light. Which in english translates to if light equals true make light not true (false), and if light equals false, make light not false (true). So if light was true, it becomes false, and if light was false it becomes true.

     lp=TRUE; // lp Becomes TRUE

     light=!light; // Toggle Light TRUE/FALSE

Now we check to see what light ended up being. The first line translated to english means: If light equals false. So if you put it all together, the lines do the following: If light equals false, disable lighting. This turns all lighting off. The command 'else' translates to: if it wasn't false. So if light wasn't false, it must have been true, so we turn lighting on.

     if (!light) // If Not Light

     {

      glDisable(GL_LIGHTING); // Disable Lighting

     } else // Otherwise

     {

      glEnable(GL_LIGHTING); // Enable Lighting

     }

    }

The following line checks to see if we stopped pressing the 'L' key. If we did, it makes the variable lp equal false, meaning the 'L' key isn't pressed. If we didn't check to see if the key was released, we'd be able to turn lighting on once, but because the computer would always think 'L' was being held down so it wouldn't let us turn it back off.

    if (!keys['L']) // Has L Key Been Released?

    {

     lp=FALSE; // If So, lp Becomes FALSE

    }

Now we do something similar with the 'F' key. if the key is being pressed, and it's not being held down or it's never been pressed before, it will make the variable fp equal true meaning the key is now being held down. It will then increase the variable called filter. If filter is greater than 2 (which would be texture[3], and that texture doesn't exist), we reset the variable filter back to zero.

    if (keys['F'] && !fp) // Is F Key Being Pressed?

    {

     fp=TRUE; // fp Becomes TRUE

     filter+=1; // filter Value Increases By One

     if (filter>2) // Is Value Greater Than 2?

     {

      filter=0; // If So, Set filter To 0

     }

    }