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

    if (keys[VK_F1]) // Is F1 Being Pressed?

    {

     keys[VK_F1]=FALSE; // If So Make Key FALSE

     KillGLWindow(); // Kill Our Current Window

     fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode

     // Recreate Our OpenGL Window

     if (!CreateGLWindow("NeHe's Token, Extensions, Scissoring & TGA Loading Tutorial", 640, 480, 16, fullscreen)) {

      return 0; // Quit If Window Was Not Created

     }

    }

The code below checks to see if the up arrow is being pressed if it is, and scroll is greater than 0, we decrease scroll by 2. This causes the text to move down the screen.

    if (keys[VK_UP] && (scroll>0)) // Is Up Arrow Being Pressed?

    {

     scroll-=2; // If So, Decrease 'scroll' Moving Screen Down

    }

If the down arrow is being pressed and scroll is less than (32*(maxtokens-9)) scroll will be increased by 2, andd the text on the screen will scroll upwards.

32 is the number of lines that each letter takes up. Maxtokens is the total amount of extensions that your video card supports. We subtract 9, because 9 lines can be shown on the screen at once. If we did not subtract 9, we could scroll past the end of the list, causing the list to scroll completely off the screen. Try leaving the –9 out if you're not sure what I mean.

   if (keys[VK_DOWN] && (scroll<32*(maxtokens-9))) // Is Down Arrow Being Pressed?

   {

    scroll+=2; // If So, Increase 'scroll' Moving Screen Up

    }

   }

  }

 }

 // Shutdown

 KillGLWindow(); // Kill The Window

 return (msg.wParam); // Exit The Program

}

I hope that you found this tutorial interesting. By the end of this tutorial you should know how to read the vendor name, renderer and version number from your video card. You should also know how to find out what extensions are supported on any video card that supports OpenGL. You should know what scissor testing is, and how it can be used in OpenGL projects of your own, and lastly, you should know how to load TGA Images instead of Bitmap Images for use as textures.

If you find any problems with the tutorial, or you find the information to hard to understand, let me know. I want the tutorials to be the best they can be. Your feedback is important!

Jeff Molofee (NeHe)

* DOWNLOAD Visual C++ Code For This Lesson.

* DOWNLOAD Linux Code For This Lesson. (Conversion by Jay Groven)

* DOWNLOAD Mac OS X/Cocoa Code For This Lesson. (Conversion by Bryan Blackburn

Lesson 25

Welcome to yet another exciting tutorial! This time we will focus on the effect rather than the graphics, although the final result is pretty cool looking! In this tutorial you will learn how to morph seamlessly from one object to another. Similar to the effect I use in the dolphin demo. Although there are a few catches. First thing to note is that each object must have the same amount of points. Very rare to luck out and get 3 object made up of exactly the same amount of vertices, but it just so happens, in this tutorial we have 3 objects with exactly the same amount of points :) Don't get me wrong, you can use objects with different values, but the transition from one object to another is odd looking and not as smooth.

You will also learn how to read object data from a file. Similar to the format used in lesson 10, although it shouldn't be hard to modify the code to read .ASC files or some other text type data files. In general, it's a really cool effect, a really cool tutorial, so lets begin!

We start off as usual. Including all the required header files, along with the math and standard input / output headers. Notice we don't include glaux. That's because we'll be drawing points rather than textures in this tutorial. After you've got the tutorial figured out, you can try playing with Polygons, Lines, and Textures!

#include <windows.h> // Header File For Windows

#include <math.h> // Math Library Header File

#include <stdio.h> // Header File For Standard Input/Output

#include <gl\gl.h> // Header File For The OpenGL32 Library

#include <gl\glu.h> // Header File For The GLu32 Library

HDC hDC=NULL; // Device Context Handle

HGLRC hRC=NULL; // Rendering Context Handle

HWND hWnd=NULL; // Window Handle HINSTANCE hInstance; // Instance Handle

bool keys[256]; // Key Array

bool active=TRUE; // Program's Active

bool fullscreen=TRUE; // Default Fullscreen To True

After setting up all the standard variables, we will add some new variables. xrot, yrot and zrot will hold the current rotation values for the x, y and z axes of the onscreen object. xspeed, yspeed and zspeed will control how fast the object is rotating on each axis. cx, cy and cz control the position of the object on the screen (where it's drawn left to right cx, up and down cy and into and out of the screen cz)

The variable key is a variable that I have included to make sure the user doesn't try to morph from the first shape back into the first shape. This would be pretty pointless and would cause a delay while the points were trying to morph to the position they're already in.

step is a counter variable that counts through all the steps specified by steps. If you increase the value of steps it will take longer for the object to morph, but the movement of the points as they morph will be smoother. Once step is equal to steps we know the morphing has been completed.

The last variable morph lets our program know if it should be morphing the points or leaving them where they are. If it's TRUE, the object is in the process of morphing from one shape to another.

GLfloat xrot, yrot, zrot, // X, Y & Z Rotation

 xspeed, yspeed, zspeed, // X, Y & Z Spin Speed

 cx, cy, cz=-15; // X, Y & Z Position

int key=1; // Used To Make Sure Same Morph Key Is Not Pressed

int step=0, steps=200; // Step Counter And Maximum Number Of Steps

bool morph=FALSE; // Default morph To False (Not Morphing)

Now we create a structure to keep track of a vertex. The structure will hold the x, y and z values of any point on the screen. The variables x, y & z are all floating point so we can position the point anywhere on the screen with great accuracy. The structure name is VERTEX.

typedef struct // Structure For 3D Points

{

 float x, y, z; // X, Y & Z Points

} VERTEX; // Called VERTEX

We already have a structure to keep track of vertices, and we know that an object is made up of many vertices so lets create an OBJECT structure. The first variable verts is an integer value that will hold the number of vertices required to make up an object. So if our object has 5 points, the value of verts will be equal to 5. We will set the value later in the code. For now, all you need to know is that verts keeps track of how many points we use to create the object.