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

 glShadeModel(GL_SMOOTH); // Enable Smooth Shading

 glClearColor(0.05f, 0.05f, 0.05f, 0.5f); // Black Background

 glClearDepth(1.0f); // Depth Buffer Setup

 glEnable(GL_DEPTH_TEST); // Enables Depth Testing

 glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do

 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

 initBezier(); // Initialize the Bezier's Control Grid ( NEW )

 LoadGLTexture(&(mybezier.texture), "./Data/NeHe.bmp"); // Load The Texture ( NEW )

 mybezier.dlBPatch = genBezier(mybezier, divs); // Generate The Patch ( NEW )

 return TRUE; // Initialization Went OK

}

First call the bezier's display list. Then (if the outlines are on) draw the lines connecting the control points. You can toggle these by pressing SPACE.

int DrawGLScene(GLvoid) { // Here's Where We Do All The Drawing

 int i, j;

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer

 glLoadIdentity(); // Reset The Current Modelview Matrix

 glTranslatef(0.0f,0.0f,-4.0f); // Move Left 1.5 Units And Into The Screen 6.0

 glRotatef(-75.0f,1.0f,0.0f,0.0f);

 glRotatef(rotz,0.0f,0.0f,1.0f); // Rotate The Triangle On The Z-Axis

 glCallList(mybezier.dlBPatch); // Call The Bezier's Display List

 // This Need Only Be Updated When The Patch Changes

 if (showCPoints) { // If Drawing The Grid Is Toggled On

  glDisable(GL_TEXTURE_2D);

  glColor3f(1.0f,0.0f,0.0f);

  for(i=0;i<4;i++) { // Draw The Horizontal Lines

   glBegin(GL_LINE_STRIP);

   for(j=0;j<4;j++) glVertex3d(mybezier.anchors[i][j].x, mybezier.anchors[i][j].y, mybezier.anchors[i][j].z);

   glEnd();

  }

  for(i=0;i<4;i++) { // Draw The Vertical Lines

   glBegin(GL_LINE_STRIP);

   for(j=0;j<4;j++) glVertex3d(mybezier.anchors[j][i].x, mybezier.anchors[j][i].y, mybezier.anchors[j][i].z);

   glEnd();

  }

  glColor3f(1.0f,1.0f,1.0f);

  glEnable(GL_TEXTURE_2D);

 }

 return TRUE; // Keep Going

}

This function contains some modified code to make your projects more compatable. It doesn't have anything to do with Bezier curves, but it does fix a problem with switching back the resolution after fullscreen mode with some video cards (including mine, a crappy old ATI Rage PRO, and a few others). I hope, you'll use this from now on so me and others with similar cards can view your cool examples GL code properly. To make these modifications make the changes in KillGLWindow(), make sure and define DMsaved, and make the one line change in CreateGLWindow() (it's marked).

GLvoid KillGLWindow(GLvoid) // Properly Kill The Window

{

 if (fullscreen) // Are We In Fullscreen Mode?

 {

  if (!ChangeDisplaySettings(NULL,CDS_TEST)) { // If The Shortcut Doesn't Work ( NEW )

   ChangeDisplaySettings(NULL,CDS_RESET); // Do It Anyway (To Get The Values Out Of The Registry) ( NEW )

   ChangeDisplaySettings(&DMsaved,CDS_RESET); // Change It To The Saved Settings ( NEW )

  } else {

   ChangeDisplaySettings(NULL,CDS_RESET); // If It Works, Go Right Ahead ( NEW )

  }

  ShowCursor(TRUE); // Show Mouse Pointer

 }

 if (hRC) // Do We Have A Rendering Context?

 {

  if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?

  {

   MessageBox(NULL,"Release Of DC And RC Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  }

  if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?

  {

   MessageBox(NULL, "Release Rendering Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  }

  hRC=NULL; // Set RC To NULL

 }

 if (hDC && !ReleaseDC(hWnd, hDC)) // Are We Able To Release The DC

 {

  MessageBox(NULL, "Release Device Context Failed.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hDC=NULL; // Set DC To NULL

 }

 if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?

 {

  MessageBox(NULL, "Could Not Release hWnd.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hWnd=NULL; // Set hWnd To NULL

 }

 if (!UnregisterClass("OpenGL", hInstance)) // Are We Able To Unregister Class

 {

  MessageBox(NULL, "Could Not Unregister Class.", "SHUTDOWN ERROR", MB_OK | MB_ICONINFORMATION);

  hInstance=NULL; // Set hInstance To NULL

 }

}

Just added the EnumDisplaySettings() command here to save the old display settings. (part of the old graphics card fix).

// This Code Creates Our OpenGL Window. Parameters Are: *

// title – Title To Appear At The Top Of The Window *

// width – Width Of The GL Window Or Fullscreen Mode *

// height – Height Of The GL Window Or Fullscreen Mode *

// bits – Number Of Bits To Use For Color (8/16/24/32) *

// fullscreenflag – Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */

BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) {

 GLuint PixelFormat; // Holds The Results After Searching For A Match

 WNDCLASS wc; // Windows Class Structure

 DWORD dwExStyle; // Window Extended Style

 DWORD dwStyle; // Window Style

 RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values

 WindowRect.left=(long)0; // Set Left Value To 0

 WindowRect.right=(long)width; // Set Right Value To Requested Width

 WindowRect.top=(long)0; // Set Top Value To 0

 WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height

 fullscreen=fullscreenflag; // Set The Global Fullscreen Flag

 hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window

 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window

 wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages

 wc.cbClsExtra = 0; // No Extra Window Data

 wc.cbWndExtra = 0; // No Extra Window Data

 wc.hInstance = hInstance; // Set The Instance

 wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon

 wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer

 wc.hbrBackground = NULL; // No Background Required For GL

 wc.lpszMenuName = NULL; // We Don't Want A Menu