Jump to content

  • Log In with Google      Sign In   
  • Create Account

oce

Member Since 17 Apr 2012
Offline Last Active Apr 17 2012 08:27 PM

Topics I've Started

Add new shapes in lesson 25

17 April 2012 - 08:18 PM

Hello,
I am having trouble adding a new shape to morph to along with the original shapes in lesson 25. If you could give an example of how to add a cube or a pyramid it would clarify as to how to go about adding new shapes.

Here is my code (with new portions in red):
#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
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=10; // Step Counter And Maximum Number Of Steps
bool

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

struct // Structure For 3D Points
{

float x, y, z; // X, Y & Z Points
} VERTEX;
// Called VERTEX
typedef

struct // Structure For An Object
{

int verts; // Number Of Vertices For The Object
VERTEX *points;
// One Vertice (Vertex x,y & z)
} OBJECT;
// Called OBJECT
int

maxver; // Will Eventually Hold The Maximum Number Of Vertices
OBJECT morph1,morph2,morph3,morph4,morph5, //new morph object
// Our 4 Morphable Objects (morph1,2,3 & 4)
helper,*sour,*dest;
// Helper Object, Source Object, Destination Object
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// Declaration
void

objallocate(OBJECT *k,int n) // Allocate Memory For Each Object
{
// And Defines points
k->points=(VERTEX*)malloc(
sizeof(VERTEX)*n); // Sets points Equal To VERTEX * Number Of Vertices
}
// (3 Points For Each Vertice)
void

objfree(OBJECT *k) // Frees The Object (Releasing The Memory)
{
free(k->points);
// Frees Points
}
void

readstr(FILE *f,char *string) // Reads A String From File (f)
{

do // Do This
{
fgets(string, 255, f);
// Gets A String Of 255 Chars Max From f (File)
}
while ((string[0] == '/') || (string[0] == '\n'));// Until End Of Line Is Reached

return; // Return
}
void

objload(char *name,OBJECT *k) // Loads Object From File (name)
{

int ver; // Will Hold Vertice Count

float rx,ry,rz; // Hold Vertex X, Y & Z Position
FILE *filein;
// Filename To Open

char oneline[255]; // Holds One Line Of Text (255 Chars Max)
filein = fopen(name,
"rt"); // Opens The File For Reading Text In Translated Mode

// CTRL Z Symbolizes End Of File In Translated Mode
readstr(filein,oneline);
// Jumps To Code That Reads One Line Of Text From The File
sscanf(oneline,
"Vertices: %d\n", &ver); // Scans Text For "Vertices: ". Number After Is Stored In ver
k->verts=ver;
// Sets Objects verts Variable To Equal The Value Of ver
objallocate(k,ver);
// Jumps To Code That Allocates Ram To Hold The Object

for (int i=0;i<ver;i++) // Loops Through The Vertices
{
readstr(filein,oneline);
// Reads In The Next Line Of Text
sscanf(oneline,
"%f %f %f", &rx, &ry, &rz); // Searches For 3 Floating Point Numbers, Store In rx,ry & rz
k->points[i].x = rx;
// Sets Objects (k) points.x Value To rx
k->points[i].y = ry;
// Sets Objects (k) points.y Value To ry
k->points[i].z = rz;
// Sets Objects (k) points.z Value To rz
}
fclose(filein);
// Close The File

if(ver>maxver) maxver=ver; // If ver Is Greater Than maxver Set maxver Equal To ver
}
// Keeps Track Of Highest Number Of Vertices Used In Any Of The

// Objects
VERTEX calculate(
int i) // Calculates Movement Of Points During Morphing
{
VERTEX a;
// Temporary Vertex Called a
a.x=(sour->points[i].x-dest->points[i].x)/steps;
// a.x Value Equals Source x - Destination x Divided By Steps
a.y=(sour->points[i].y-dest->points[i].y)/steps;
// a.y Value Equals Source y - Destination y Divided By Steps
a.z=(sour->points[i].z-dest->points[i].z)/steps;
// a.z Value Equals Source z - Destination z Divided By Steps

return a; // Return The Results
}
// This Makes Points Move At A Speed So They All Get To Their

// Destination At The Same Time
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
// Resize And Initialize The GL Window
{

if (height==0) // Prevent A Divide By Zero By
{
height=1;
// Making Height Equal One
}
glViewport(0,0,width,height);
// Reset The Current Viewport
glMatrixMode(GL_PROJECTION);
// Select The Projection Matrix
glLoadIdentity();
// Reset The Projection Matrix

// Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
// Select The Modelview Matrix
glLoadIdentity();
// Reset The Modelview Matrix
}
int

InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
// Set The Blending Function For Translucency
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// This Will Clear The Background Color To Black
glClearDepth(1.0);
// Enables Clearing Of The Depth Buffer
glDepthFunc(GL_LESS);
// The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST);
// Enables Depth Testing
glShadeModel(GL_SMOOTH);
// Enables Smooth Color Shading
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// Really Nice Perspective Calculations
maxver=0;
// Sets Max Vertices To 0 By Default
objload(
"data/sphere.txt",&morph1); // Load The First Object Into morph1 From File sphere.txt
objload(
"data/torus.txt",&morph2); // Load The Second Object Into morph2 From File torus.txt
objload(
"data/tube.txt",&morph3); // Load The Third Object Into morph3 From File tube.txt
objload(
"data/tube2.txt",&morph5); //new call for loading of vertices from file (note: vertices were copied from 1 of the original files to see if object would appear but failed
objallocate(&morph4,24);
// Manually Reserver Ram For A 4th 468 Vertice Object (morph4)

for(int i=0;i<24;i++) // Loop Through All 468 Vertices
{
morph4.points[i].x=((
float)(rand()%14000)/1000)-7; // morph4 x Point Becomes A Random Float Value From -7 to 7
morph4.points[i].y=((
float)(rand()%14000)/1000)-7; // morph4 y Point Becomes A Random Float Value From -7 to 7
morph4.points[i].z=((
float)(rand()%14000)/1000)-7; // morph4 z Point Becomes A Random Float Value From -7 to 7
}
objload(
"data/sphere.txt",&helper); // Load sphere.txt Object Into Helper (Used As Starting Point)
sour=dest=&morph1;
// Source & Destination Are Set To Equal First Object (morph1)

return TRUE; // Initialization Went OK
}
void

DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Clear The Screen And The Depth Buffer
glLoadIdentity();
// Reset The View
glTranslatef(cx,cy,cz);
// Translate The The Current Position To Start Drawing
glRotatef(xrot,1,0,0);
// Rotate On The X Axis By xrot
glRotatef(yrot,0,1,0);
// Rotate On The Y Axis By yrot
glRotatef(zrot,0,0,1);
// Rotate On The Z Axis By zrot
xrot+=xspeed; yrot+=yspeed; zrot+=zspeed;
// Increase xrot,yrot & zrot by xspeed, yspeed & zspeed
GLfloat tx,ty,tz;
// Temp X, Y & Z Variables
VERTEX q;
// Holds Returned Calculated Values For One Vertex
glBegin(GL_POINTS);
// Begin Drawing Points

for(int i=0;i<morph1.verts;i++) // Loop Through All The Verts Of morph1 (All Objects Have
{
// The Same Amount Of Verts For Simplicity, Could Use maxver Also)

if(morph) q=calculate(i); else q.x=q.y=q.z=0; // If morph Is True Calculate Movement Otherwise Movement=0
helper.points[i].x-=q.x;
// Subtract q.x Units From helper.points[i].x (Move On X Axis)
helper.points[i].y-=q.y;
// Subtract q.y Units From helper.points[i].y (Move On Y Axis)
helper.points[i].z-=q.z;
// Subtract q.z Units From helper.points[i].z (Move On Z Axis)
tx=helper.points[i].x;
// Make Temp X Variable Equal To Helper's X Variable
ty=helper.points[i].y;
// Make Temp Y Variable Equal To Helper's Y Variable
tz=helper.points[i].z;
// Make Temp Z Variable Equal To Helper's Z Variable
glColor3f(0,1,1);
// Set Color To A Bright Shade Of Off Blue
glVertex3f(tx,ty,tz);
// Draw A Point At The Current Temp Values (Vertex)
glColor3f(0,0.5f,1);
// Darken Color A Bit
tx-=2*q.x; ty-=2*q.y; ty-=2*q.y;
// Calculate Two Positions Ahead
glVertex3f(tx,ty,tz);
// Draw A Second Point At The Newly Calculate Position
glColor3f(0,0,1);
// Set Color To A Very Dark Blue
tx-=2*q.x; ty-=2*q.y; ty-=2*q.y;
// Calculate Two More Positions Ahead
glVertex3f(tx,ty,tz);
// Draw A Third Point At The Second New Position

}
// This Creates A Ghostly Tail As Points Move
glEnd();
// Done Drawing Points

// If We're Morphing And We Haven't Gone Through All 200 Steps Increase Our Step Counter

// Otherwise Set Morphing To False, Make Source=Destination And Set The Step Counter Back To Zero.

if(morph && step<=steps)step++; else { morph=FALSE; sour=dest; step=0;}
}
GLvoid KillGLWindow(GLvoid)
// Properly Kill The Window
{
objfree(&morph1);
// Jump To Code To Release morph1 Allocated Ram
objfree(&morph2);
// Jump To Code To Release morph2 Allocated Ram
objfree(&morph3);
// Jump To Code To Release morph3 Allocated Ram
objfree(&morph4);
// Jump To Code To Release morph4 Allocated Ram
objfree(&morph5);
objfree(&helper);
// Jump To Code To Release helper Allocated Ram

if (fullscreen) // Are We In Fullscreen Mode?
{
ChangeDisplaySettings(NULL,0);
// If So Switch Back To The Desktop
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
}
}
/* 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
wc.lpszClassName =
"OpenGL"; // Set The Class Name

if (!RegisterClass(&wc)) // Attempt To Register The Window Class
{
MessageBox(NULL,
"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE; // Return FALSE
}

if (fullscreen) // Attempt Fullscreen Mode?
{
DEVMODE dmScreenSettings;
// Device Mode
memset(&dmScreenSettings,0,
sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
dmScreenSettings.dmSize=
sizeof(dmScreenSettings); // Size Of The Devmode Structure
dmScreenSettings.dmPelsWidth = width;
// Selected Screen Width
dmScreenSettings.dmPelsHeight = height;
// Selected Screen Height
dmScreenSettings.dmBitsPerPel = bits;
// Selected Bits Per Pixel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.

if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{

// If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.

if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{
fullscreen=FALSE;
// Windowed Mode Selected. Fullscreen = FALSE
}

else
{

// Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,
"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);

return FALSE; // Return FALSE
}
}
}

if (fullscreen) // Are We Still In Fullscreen Mode?
{
dwExStyle=WS_EX_APPWINDOW;
// Window Extended Style
dwStyle=WS_POPUP;
// Windows Style
ShowCursor(FALSE);
// Hide Mouse Pointer
}

else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
// Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW;
// Windows Style
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
// Adjust Window To True Requested Size

// Create The Window

if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window

"OpenGL", // Class Name
title,
// Window Title
dwStyle |
// Defined Window Style
WS_CLIPSIBLINGS |
// Required Window Style
WS_CLIPCHILDREN,
// Required Window Style
0, 0,
// Window Position
WindowRect.right-WindowRect.left,
// Calculate Window Width
WindowRect.bottom-WindowRect.top,
// Calculate Window Height
NULL,
// No Parent Window
NULL,
// No Menu
hInstance,
// Instance
NULL)))
// Dont Pass Anything To WM_CREATE
{
KillGLWindow();
// Reset The Display
MessageBox(NULL,
"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);

return FALSE; // Return FALSE
}

static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
{

sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1,
// Version Number
PFD_DRAW_TO_WINDOW |
// Format Must Support Window
PFD_SUPPORT_OPENGL |
// Format Must Support OpenGL
PFD_DOUBLEBUFFER,
// Must Support Double Buffering
PFD_TYPE_RGBA,
// Request An RGBA Format
bits,
[size="2"][size="2"]// Select Our Color Depth[/size][/size]
[size="2"]0, 0, 0, 0, 0, 0, [/size]
[size="2"][size="2"]// Color Bits Ignored[/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// No Alpha Buffer[/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// Shift Bit Ignored[/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// No Accumulation Buffer[/size][/size]
[size="2"]0, 0, 0, 0, [/size]
[size="2"][size="2"]// Accumulation Bits Ignored[/size][/size]
[size="2"]16, [/size]
[size="2"][size="2"]// 16Bit Z-Buffer (Depth Buffer) [/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// No Stencil Buffer[/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// No Auxiliary Buffer[/size][/size]
[size="2"]PFD_MAIN_PLANE, [/size]
[size="2"][size="2"]// Main Drawing Layer[/size][/size]
[size="2"]0, [/size]
[size="2"][size="2"]// Reserved[/size][/size]
[size="2"]0, 0, 0 [/size]
[size="2"][size="2"]// Layer Masks Ignored[/size][/size]
[size="2"]};[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!(hDC=GetDC(hWnd))) [/size][size="2"][size="2"]// Did We Get A Device Context?[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Can't Create A GL Device Context."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) [/size][size="2"][size="2"]// Did Windows Find A Matching Pixel Format?[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Can't Find A Suitable PixelFormat."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]if[/size][/size][size="2"](!SetPixelFormat(hDC,PixelFormat,&pfd)) [/size][size="2"][size="2"]// Are We Able To Set The Pixel Format?[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Can't Set The PixelFormat."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!(hRC=wglCreateContext(hDC))) [/size][size="2"][size="2"]// Are We Able To Get A Rendering Context?[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Can't Create A GL Rendering Context."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]if[/size][/size][size="2"](!wglMakeCurrent(hDC,hRC)) [/size][size="2"][size="2"]// Try To Activate The Rendering Context[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Can't Activate The GL Rendering Context."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]
[size="2"]ShowWindow(hWnd,SW_SHOW); [/size]
[size="2"][size="2"]// Show The Window[/size][/size]
[size="2"]SetForegroundWindow(hWnd); [/size]
[size="2"][size="2"]// Slightly Higher Priority[/size][/size]
[size="2"]SetFocus(hWnd); [/size]
[size="2"][size="2"]// Sets Keyboard Focus To The Window[/size][/size]
[size="2"]ReSizeGLScene(width, height); [/size]
[size="2"][size="2"]// Set Up Our Perspective GL Screen[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!InitGL()) [/size][size="2"][size="2"]// Initialize Our Newly Created GL Window[/size][/size]
[size="2"]{[/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][size="2"]// Reset The Display[/size][/size]
[size="2"]MessageBox(NULL,[/size]
[size="2"][size="2"]"Initialization Failed."[/size][/size][size="2"],[/size][size="2"][size="2"]"ERROR"[/size][/size][size="2"],MB_OK|MB_ICONEXCLAMATION);[/size]

[size="2"][size="2"]return[/size][/size][size="2"] FALSE; [/size][size="2"][size="2"]// Return FALSE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]return[/size][/size][size="2"] TRUE; [/size][size="2"][size="2"]// Success[/size][/size]
[size="2"]}[/size]
[size="2"]LRESULT CALLBACK WndProc( HWND hWnd, [/size]
[size="2"][size="2"]// Handle For This Window[/size][/size]
[size="2"]UINT uMsg, [/size]
[size="2"][size="2"]// Message For This Window[/size][/size]
[size="2"]WPARAM wParam, [/size]
[size="2"][size="2"]// Additional Message Information[/size][/size]
[size="2"]LPARAM lParam) [/size]
[size="2"][size="2"]// Additional Message Information[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]switch[/size][/size][size="2"] (uMsg) [/size][size="2"][size="2"]// Check For Windows Messages[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_ACTIVATE: [/size][size="2"][size="2"]// Watch For Window Activate Message[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!HIWORD(wParam)) [/size][size="2"][size="2"]// Check Minimization State[/size][/size]
[size="2"]{[/size]
[size="2"]active=TRUE; [/size]
[size="2"][size="2"]// Program Is Active[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]else[/size][/size] [size="2"][size="2"]// Otherwise[/size][/size]
[size="2"]{[/size]
[size="2"]active=FALSE; [/size]
[size="2"][size="2"]// Program Is No Longer Active[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Return To The Message Loop[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_SYSCOMMAND: [/size][size="2"][size="2"]// Intercept System Commands[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]switch[/size][/size][size="2"] (wParam) [/size][size="2"][size="2"]// Check System Calls[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]case[/size][/size][size="2"] SC_SCREENSAVE: [/size][size="2"][size="2"]// Screensaver Trying To Start?[/size][/size]

[size="2"][size="2"]case[/size][/size][size="2"] SC_MONITORPOWER: [/size][size="2"][size="2"]// Monitor Trying To Enter Powersave?[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Prevent From Happening[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]break[/size][/size][size="2"]; [/size][size="2"][size="2"]// Exit[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_CLOSE: [/size][size="2"][size="2"]// Did We Receive A Close Message?[/size][/size]
[size="2"]{[/size]
[size="2"]PostQuitMessage(0); [/size]
[size="2"][size="2"]// Send A Quit Message[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Jump Back[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_KEYDOWN: [/size][size="2"][size="2"]// Is A Key Being Held Down?[/size][/size]
[size="2"]{[/size]
[size="2"]keys[wParam] = TRUE; [/size]
[size="2"][size="2"]// If So, Mark It As TRUE[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Jump Back[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_KEYUP: [/size][size="2"][size="2"]// Has A Key Been Released?[/size][/size]
[size="2"]{[/size]
[size="2"]keys[wParam] = FALSE; [/size]
[size="2"][size="2"]// If So, Mark It As FALSE[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Jump Back[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]case[/size][/size][size="2"] WM_SIZE: [/size][size="2"][size="2"]// Resize The OpenGL Window[/size][/size]
[size="2"]{[/size]
[size="2"]ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); [/size]
[size="2"][size="2"]// LoWord=Width, HiWord=Height[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Jump Back[/size][/size]
[size="2"]}[/size]
[size="2"]}[/size]

[size="2"][size="2"]// Pass All Unhandled Messages To DefWindowProc[/size][/size]

[size="2"][size="2"]return[/size][/size][size="2"] DefWindowProc(hWnd,uMsg,wParam,lParam);[/size]
[size="2"]}[/size]
[size="2"][size="2"]int[/size][/size]

[size="2"]WINAPI WinMain( HINSTANCE hInstance, [/size][size="2"][size="2"]// Instance[/size][/size]
[size="2"]HINSTANCE hPrevInstance, [/size]
[size="2"][size="2"]// Previous Instance[/size][/size]
[size="2"]LPSTR lpCmdLine, [/size]
[size="2"][size="2"]// Command Line Parameters[/size][/size]

[size="2"][size="2"]int[/size][/size][size="2"] nCmdShow) [/size][size="2"][size="2"]// Window Show State[/size][/size]
[size="2"]{[/size]
[size="2"]MSG msg; [/size]
[size="2"][size="2"]// Windows Message Structure[/size][/size]
[size="2"]BOOL done=FALSE; [/size]
[size="2"][size="2"]// Bool Variable To Exit Loop[/size][/size]

[size="2"][size="2"]// Ask The User Which Screen Mode They Prefer[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"] (MessageBox(NULL,[/size][size="2"][size="2"]"Would You Like To Run In Fullscreen Mode?"[/size][/size][size="2"], [/size][size="2"][size="2"]"Start FullScreen?"[/size][/size][size="2"],MB_YESNO|MB_ICONQUESTION)==IDNO)[/size]
[size="2"]{[/size]
[size="2"]fullscreen=FALSE; [/size]
[size="2"][size="2"]// Windowed Mode[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]// Create Our OpenGL Window[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"] (!CreateGLWindow([/size][size="2"][size="2"]"Piotr Cieslak & NeHe's Morphing Points Tutorial"[/size][/size][size="2"],640,480,16,fullscreen))[/size]
[size="2"]{[/size]

[size="2"][size="2"]return[/size][/size][size="2"] 0; [/size][size="2"][size="2"]// Quit If Window Was Not Created[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]while[/size][/size][size="2"](!done) [/size][size="2"][size="2"]// Loop That Runs While done=FALSE[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) [/size][size="2"][size="2"]// Is There A Message Waiting?[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]if[/size][/size][size="2"] (msg.message==WM_QUIT) [/size][size="2"][size="2"]// Have We Received A Quit Message?[/size][/size]
[size="2"]{[/size]
[size="2"]done=TRUE; [/size]
[size="2"][size="2"]// If So done=TRUE[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]else[/size][/size] [size="2"][size="2"]// If Not, Deal With Window Messages[/size][/size]
[size="2"]{[/size]
[size="2"]TranslateMessage(&msg); [/size]
[size="2"][size="2"]// Translate The Message[/size][/size]
[size="2"]DispatchMessage(&msg); [/size]
[size="2"][size="2"]// Dispatch The Message[/size][/size]
[size="2"]}[/size]
[size="2"]}[/size]

[size="2"][size="2"]else[/size][/size] [size="2"][size="2"]// If There Are No Messages[/size][/size]
[size="2"]{[/size]

[size="2"][size="2"]// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"] (active && keys[VK_ESCAPE]) [/size][size="2"][size="2"]// Active? Was There A Quit Received?[/size][/size]
[size="2"]{[/size]
[size="2"]done=TRUE; [/size]
[size="2"][size="2"]// ESC or DrawGLScene Signalled A Quit[/size][/size]
[size="2"]}[/size]

[size="2"][size="2"]else[/size][/size] [size="2"][size="2"]// Not Time To Quit, Update Screen[/size][/size]
[size="2"]{[/size]
[size="2"]DrawGLScene(); [/size]
[size="2"][size="2"]// Draw The Scene (Don't Draw When Inactive 1% CPU Use)[/size][/size]
[size="2"]SwapBuffers(hDC); [/size]
[size="2"][size="2"]// Swap Buffers (Double Buffering)[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"](keys[VK_PRIOR]) [/size][size="2"][size="2"]// Is Page Up Being Pressed?[/size][/size]
[size="2"]zspeed+=0.01f; [/size]
[size="2"][size="2"]// Increase zspeed[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"](keys[VK_NEXT]) [/size][size="2"][size="2"]// Is Page Down Being Pressed?[/size][/size]
[size="2"]zspeed-=0.01f; [/size]
[size="2"][size="2"]// Decrease zspeed[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"](keys[VK_DOWN]) [/size][size="2"][size="2"]// Is Down Arrow Being Pressed?[/size][/size]
[size="2"]xspeed+=0.01f; [/size]
[size="2"][size="2"]// Increase xspeed[/size][/size]

[size="2"][size="2"]if[/size][/size][size="2"](keys[VK_UP]) [/size][size="2"][size="2"]// Is Up Arrow Being Pressed?[/size][/size]
[size="2"]xspeed-=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Decrease xspeed[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"](keys[VK_RIGHT]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is Right Arrow Being Pressed?[/color][/size][/color][/size]
[size="2"]yspeed+=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Increase yspeed[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"](keys[VK_LEFT]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is Left Arrow Being Pressed?[/color][/size][/color][/size]
[size="2"]yspeed-=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Decrease yspeed[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'Q'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is Q Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cz-=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Away From Viewer[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'Z'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is Z Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cz+=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Towards Viewer[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'W'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is W Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cy+=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Up[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'S'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is S Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cy-=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Down[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'D'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is D Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cx+=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Right[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'A'[/color][/size][/color][/size][size="2"]]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is A Key Being Pressed?[/color][/size][/color][/size]
[size="2"]cx-=0.01f; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Move Object Left[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'1'[/color][/size][/color][/size][size="2"]] && (key!=1) && !morph) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is 1 Pressed, key Not Equal To 1 And Morph False?[/color][/size][/color][/size]
[size="2"]{[/size]
[size="2"]key=1; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Sets key To 1 (To Prevent Pressing 1 2x In A Row)[/color][/size][/color][/size]
[size="2"]morph=TRUE; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Set morph To True (Starts Morphing Process)[/color][/size][/color][/size]
[size="2"]dest=&morph1; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Destination Object To Morph To Becomes morph1[/color][/size][/color][/size]
[size="2"]}[/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'2'[/color][/size][/color][/size][size="2"]] && (key!=2) && !morph) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is 2 Pressed, key Not Equal To 2 And Morph False?[/color][/size][/color][/size]
[size="2"]{[/size]
[size="2"]key=2; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Sets key To 2 (To Prevent Pressing 2 2x In A Row)[/color][/size][/color][/size]
[size="2"]morph=TRUE; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Set morph To True (Starts Morphing Process)[/color][/size][/color][/size]
[size="2"]dest=&morph2; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Destination Object To Morph To Becomes morph2[/color][/size][/color][/size]
[size="2"]}[/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'3'[/color][/size][/color][/size][size="2"]] && (key!=3) && !morph) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is 3 Pressed, key Not Equal To 3 And Morph False?[/color][/size][/color][/size]
[size="2"]{[/size]
[size="2"]key=3; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Sets key To 3 (To Prevent Pressing 3 2x In A Row)[/color][/size][/color][/size]
[size="2"]morph=TRUE; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Set morph To True (Starts Morphing Process)[/color][/size][/color][/size]
[size="2"]dest=&morph3; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Destination Object To Morph To Becomes morph3[/color][/size][/color][/size]
[size="2"]}[/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[[/size][size="2"][color="#a31515"][size="2"][color="#a31515"]'4'[/color][/size][/color][/size][size="2"]] && (key!=4) && !morph) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is 4 Pressed, key Not Equal To 4 And Morph False?[/color][/size][/color][/size]
[size="2"]{[/size]
[size="2"]key=4; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Sets key To 4 (To Prevent Pressing 4 2x In A Row)[/color][/size][/color][/size]
[size="2"]morph=TRUE; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Set morph To True (Starts Morphing Process)[/color][/size][/color][/size]
[size="2"]dest=&morph4; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Destination Object To Morph To Becomes morph4[/color][/size][/color][/size]
[size="2"]}[/size]

[color=#FF0000][size="2"][size="2"]if[/size][/size][size="2"] (keys[[/size][size="2"][size="2"]'5'[/size][/size][size="2"]] && (key!=5) && !morph)[/size][/color]
[color=#FF0000][size="2"]{[/size][/color]
[color=#FF0000][size="2"]key=5;[/size][/color]
[color=#FF0000][size="2"]morph=TRUE;[/size][/color]
[color=#FF0000][size="2"]dest=&morph5;[/size][/color]
[color=#FF0000][size="2"]}[/size][/color]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (keys[VK_F1]) [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Is F1 Being Pressed?[/color][/size][/color][/size]
[size="2"]{[/size]
[size="2"]keys[VK_F1]=FALSE; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// If So Make Key FALSE[/color][/size][/color][/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Kill Our Current Window[/color][/size][/color][/size]
[size="2"]fullscreen=!fullscreen; [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Toggle Fullscreen / Windowed Mode[/color][/size][/color][/size]

[size="2"][color="#008000"][size="2"][color="#008000"]// Recreate Our OpenGL Window[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[/color][/size][/color][/size][size="2"] (!CreateGLWindow([/size][size="2"][color="#a31515"][size="2"][color="#a31515"]"Piotr Cieslak & NeHe's Morphing Points Tutorial"[/color][/size][/color][/size][size="2"],640,480,16,fullscreen))[/size]
[size="2"]{[/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[/color][/size][/color][/size][size="2"] 0; [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Quit If Window Was Not Created[/color][/size][/color][/size]
[size="2"]}[/size]
[size="2"]}[/size]
[size="2"]}[/size]
[size="2"]}[/size]
[size="2"]}[/size]

[size="2"][color="#008000"][size="2"][color="#008000"]// Shutdown[/color][/size][/color][/size]
[size="2"]KillGLWindow(); [/size]
[size="2"][color="#008000"][size="2"][color="#008000"]// Kill The Window[/color][/size][/color][/size]

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[/color][/size][/color][/size][size="2"] (msg.wParam); [/size][size="2"][color="#008000"][size="2"][color="#008000"]// Exit The Program[/color][/size][/color][/size]
[size="2"]}[/size]


[size=5][color=#FF0000]// When I run the code as is above all other objects appear and morph properly but when I press the '5' key in an attempt to morph to the object by reading the file of vertices (that I copied from one of the originals) it gives me an error [/color]"Unhandled exception at 0x004370cf in Lesson25.exe: 0xC0000005: Access violation reading location 0x00000000." [color="#ff0000"]And it places an arrow at the line[/color][/size]
[size=5]"a.x=(sour->points[i].x-dest->points[i].x)/steps;" [color=#FF0000]If you could help it would be greatly appreciated!![/color][/size]

PARTNERS