Add new shapes in lesson 25

Started by
-1 comments, last by oce 12 years ago
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):
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]#include

[size="2"][color="#a31515"][size="2"][color="#a31515"]<windows.h> [size="2"][color="#008000"][size="2"][color="#008000"]// Header File For Windows
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]#include

[size="2"][color="#a31515"][size="2"][color="#a31515"]<math.h> [size="2"][color="#008000"][size="2"][color="#008000"]// Math Library Header File
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]#include

[size="2"][color="#a31515"][size="2"][color="#a31515"]<stdio.h> [size="2"][color="#008000"][size="2"][color="#008000"]// Header File For Standard Input/Output
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]#include

[size="2"][color="#a31515"][size="2"][color="#a31515"]<gl\gl.h> [size="2"][color="#008000"][size="2"][color="#008000"]// Header File For The OpenGL32 Library
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]#include

[size="2"][color="#a31515"][size="2"][color="#a31515"]<gl\glu.h> [size="2"][color="#008000"][size="2"][color="#008000"]// Header File For The GLu32 Library
[size="2"]HDC hDC=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Device Context Handle
[size="2"]HGLRC hRC=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Rendering Context Handle
[size="2"]HWND hWnd=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Window Handle
[size="2"]HINSTANCE hInstance;
[size="2"][color="#008000"][size="2"][color="#008000"]// Instance Handle
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]bool

[size="2"]keys[256]; [size="2"][color="#008000"][size="2"][color="#008000"]// Key Array
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]bool

[size="2"]active=TRUE; [size="2"][color="#008000"][size="2"][color="#008000"]// Program's Active
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]bool

[size="2"]fullscreen=TRUE; [size="2"][color="#008000"][size="2"][color="#008000"]// Default Fullscreen To True
[size="2"]GLfloat xrot,yrot,zrot,
[size="2"][color="#008000"][size="2"][color="#008000"]// X, Y & Z Rotation
[size="2"]xspeed,yspeed,zspeed,
[size="2"][color="#008000"][size="2"][color="#008000"]// X, Y & Z Spin Speed
[size="2"]cx,cy,cz=-15;
[size="2"][color="#008000"][size="2"][color="#008000"]// X, Y & Z Position
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int

[size="2"]key=1; [size="2"][color="#008000"][size="2"][color="#008000"]// Used To Make Sure Same Morph Key Is Not Pressed
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int

[size="2"]step=0,steps=10; [size="2"][color="#008000"][size="2"][color="#008000"]// Step Counter And Maximum Number Of Steps
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]bool

[size="2"]morph=FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Default morph To False (Not Morphing)
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]typedef

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]struct [size="2"][color="#008000"][size="2"][color="#008000"]// Structure For 3D Points
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]float[size="2"] x, y, z; [size="2"][color="#008000"][size="2"][color="#008000"]// X, Y & Z Points
[size="2"]} VERTEX;
[size="2"][color="#008000"][size="2"][color="#008000"]// Called VERTEX
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]typedef

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]struct [size="2"][color="#008000"][size="2"][color="#008000"]// Structure For An Object
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] verts; [size="2"][color="#008000"][size="2"][color="#008000"]// Number Of Vertices For The Object
[size="2"]VERTEX *points;
[size="2"][color="#008000"][size="2"][color="#008000"]// One Vertice (Vertex x,y & z)
[size="2"]} OBJECT;
[size="2"][color="#008000"][size="2"][color="#008000"]// Called OBJECT
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int

[size="2"]maxver; [size="2"][color="#008000"][size="2"][color="#008000"]// Will Eventually Hold The Maximum Number Of Vertices
[size="2"]OBJECT morph1,morph2,morph3,morph4,[color=#FF0000]morph5, [color="#ff0000"]//new morph object
[size="2"][color="#008000"][size="2"][color="#008000"]// Our 4 Morphable Objects (morph1,2,3 & 4)
[size="2"]helper,*sour,*dest;
[size="2"][color="#008000"][size="2"][color="#008000"]// Helper Object, Source Object, Destination Object
[size="2"]LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
[size="2"][color="#008000"][size="2"][color="#008000"]// Declaration
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]void

[size="2"]objallocate(OBJECT *k,[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] n) [size="2"][color="#008000"][size="2"][color="#008000"]// Allocate Memory For Each Object
[size="2"]{
[size="2"][color="#008000"][size="2"][color="#008000"]// And Defines points
[size="2"]k->points=(VERTEX*)malloc(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]sizeof[size="2"](VERTEX)*n); [size="2"][color="#008000"][size="2"][color="#008000"]// Sets points Equal To VERTEX * Number Of Vertices
[size="2"]}
[size="2"][color="#008000"][size="2"][color="#008000"]// (3 Points For Each Vertice)
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]void

[size="2"]objfree(OBJECT *k) [size="2"][color="#008000"][size="2"][color="#008000"]// Frees The Object (Releasing The Memory)
[size="2"]{
[size="2"]free(k->points);
[size="2"][color="#008000"][size="2"][color="#008000"]// Frees Points
[size="2"]}
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]void

[size="2"]readstr(FILE *f,[size="2"][color="#0000ff"][size="2"][color="#0000ff"]char[size="2"] *string) [size="2"][color="#008000"][size="2"][color="#008000"]// Reads A String From File (f)
[size="2"]{

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"]; [size="2"][color="#008000"][size="2"][color="#008000"]// Return
[size="2"]}
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]void

[size="2"]objload([size="2"][color="#0000ff"][size="2"][color="#0000ff"]char[size="2"] *name,OBJECT *k) [size="2"][color="#008000"][size="2"][color="#008000"]// Loads Object From File (name)
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] ver; [size="2"][color="#008000"][size="2"][color="#008000"]// Will Hold Vertice Count

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]float[size="2"] rx,ry,rz; [size="2"][color="#008000"][size="2"][color="#008000"]// Hold Vertex X, Y & Z Position
[size="2"]FILE *filein;
[size="2"][color="#008000"][size="2"][color="#008000"]// Filename To Open

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]char[size="2"] oneline[255]; [size="2"][color="#008000"][size="2"][color="#008000"]// Holds One Line Of Text (255 Chars Max)
[size="2"]filein = fopen(name,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"rt"[size="2"]); [size="2"][color="#008000"][size="2"][color="#008000"]// Opens The File For Reading Text In Translated Mode

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

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"](ver>maxver) maxver=ver; [size="2"][color="#008000"][size="2"][color="#008000"]// If ver Is Greater Than maxver Set maxver Equal To ver
[size="2"]}
[size="2"][color="#008000"][size="2"][color="#008000"]// Keeps Track Of Highest Number Of Vertices Used In Any Of The

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] a; [size="2"][color="#008000"][size="2"][color="#008000"]// Return The Results
[size="2"]}
[size="2"][color="#008000"][size="2"][color="#008000"]// This Makes Points Move At A Speed So They All Get To Their

[size="2"][color="#008000"][size="2"][color="#008000"]// Destination At The Same Time
[size="2"]GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
[size="2"][color="#008000"][size="2"][color="#008000"]// Resize And Initialize The GL Window
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (height==0) [size="2"][color="#008000"][size="2"][color="#008000"]// Prevent A Divide By Zero By
[size="2"]{
[size="2"]height=1;
[size="2"][color="#008000"][size="2"][color="#008000"]// Making Height Equal One
[size="2"]}
[size="2"]glViewport(0,0,width,height);
[size="2"][color="#008000"][size="2"][color="#008000"]// Reset The Current Viewport
[size="2"]glMatrixMode(GL_PROJECTION);
[size="2"][color="#008000"][size="2"][color="#008000"]// Select The Projection Matrix
[size="2"]glLoadIdentity();
[size="2"][color="#008000"][size="2"][color="#008000"]// Reset The Projection Matrix

[size="2"][color="#008000"][size="2"][color="#008000"]// Calculate The Aspect Ratio Of The Window
[size="2"]gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
[size="2"]glMatrixMode(GL_MODELVIEW);
[size="2"][color="#008000"][size="2"][color="#008000"]// Select The Modelview Matrix
[size="2"]glLoadIdentity();
[size="2"][color="#008000"][size="2"][color="#008000"]// Reset The Modelview Matrix
[size="2"]}
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int

[size="2"]InitGL(GLvoid) [size="2"][color="#008000"][size="2"][color="#008000"]// All Setup For OpenGL Goes Here
[size="2"]{
[size="2"]glBlendFunc(GL_SRC_ALPHA,GL_ONE);
[size="2"][color="#008000"][size="2"][color="#008000"]// Set The Blending Function For Translucency
[size="2"]glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
[size="2"][color="#008000"][size="2"][color="#008000"]// This Will Clear The Background Color To Black
[size="2"]glClearDepth(1.0);
[size="2"][color="#008000"][size="2"][color="#008000"]// Enables Clearing Of The Depth Buffer
[size="2"]glDepthFunc(GL_LESS);
[size="2"][color="#008000"][size="2"][color="#008000"]// The Type Of Depth Test To Do
[size="2"]glEnable(GL_DEPTH_TEST);
[size="2"][color="#008000"][size="2"][color="#008000"]// Enables Depth Testing
[size="2"]glShadeModel(GL_SMOOTH);
[size="2"][color="#008000"][size="2"][color="#008000"]// Enables Smooth Color Shading
[size="2"]glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
[size="2"][color="#008000"][size="2"][color="#008000"]// Really Nice Perspective Calculations
[size="2"]maxver=0;
[size="2"][color="#008000"][size="2"][color="#008000"]// Sets Max Vertices To 0 By Default
[size="2"]objload(
[size="2"][color="#a31515"][size="2"][color="#a31515"]"data/sphere.txt"[size="2"],&morph1); [size="2"][color="#008000"][size="2"][color="#008000"]// Load The First Object Into morph1 From File sphere.txt
[size="2"]objload(
[size="2"][color="#a31515"][size="2"][color="#a31515"]"data/torus.txt"[size="2"],&morph2); [size="2"][color="#008000"][size="2"][color="#008000"]// Load The Second Object Into morph2 From File torus.txt
[size="2"]objload(
[size="2"][color="#a31515"][size="2"][color="#a31515"]"data/tube.txt"[size="2"],&morph3); [size="2"][color="#008000"][size="2"][color="#008000"]// Load The Third Object Into morph3 From File tube.txt
[color=#FF0000][size="2"]objload(
[color=#FF0000][size="2"][size="2"]"data/tube2.txt"[size="2"],&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
[size="2"]objallocate(&morph4,24);
[size="2"][color="#008000"][size="2"][color="#008000"]// Manually Reserver Ram For A 4th 468 Vertice Object (morph4)

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] TRUE; [size="2"][color="#008000"][size="2"][color="#008000"]// Initialization Went OK
[size="2"]}
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]void

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]for[size="2"]([size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] i=0;i<morph1.verts;i++) [size="2"][color="#008000"][size="2"][color="#008000"]// Loop Through All The Verts Of morph1 (All Objects Have
[size="2"]{
[size="2"][color="#008000"][size="2"][color="#008000"]// The Same Amount Of Verts For Simplicity, Could Use maxver Also)

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

[size="2"]}
[size="2"][color="#008000"][size="2"][color="#008000"]// This Creates A Ghostly Tail As Points Move
[size="2"]glEnd();
[size="2"][color="#008000"][size="2"][color="#008000"]// Done Drawing Points

[size="2"][color="#008000"][size="2"][color="#008000"]// If We're Morphing And We Haven't Gone Through All 200 Steps Increase Our Step Counter

[size="2"][color="#008000"][size="2"][color="#008000"]// Otherwise Set Morphing To False, Make Source=Destination And Set The Step Counter Back To Zero.

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"](morph && step<=steps)step++; [size="2"][color="#0000ff"][size="2"][color="#0000ff"]else[size="2"] { morph=FALSE; sour=dest; step=0;}
[size="2"]}
[size="2"]GLvoid KillGLWindow(GLvoid)
[size="2"][color="#008000"][size="2"][color="#008000"]// Properly Kill The Window
[size="2"]{
[size="2"]objfree(&morph1);
[size="2"][color="#008000"][size="2"][color="#008000"]// Jump To Code To Release morph1 Allocated Ram
[size="2"]objfree(&morph2);
[size="2"][color="#008000"][size="2"][color="#008000"]// Jump To Code To Release morph2 Allocated Ram
[size="2"]objfree(&morph3);
[size="2"][color="#008000"][size="2"][color="#008000"]// Jump To Code To Release morph3 Allocated Ram
[size="2"]objfree(&morph4);
[size="2"][color="#008000"][size="2"][color="#008000"]// Jump To Code To Release morph4 Allocated Ram
[color=#FF0000][size="2"]objfree(&morph5);
[size="2"]objfree(&helper);
[size="2"][color="#008000"][size="2"][color="#008000"]// Jump To Code To Release helper Allocated Ram

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (fullscreen) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We In Fullscreen Mode?
[size="2"]{
[size="2"]ChangeDisplaySettings(NULL,0);
[size="2"][color="#008000"][size="2"][color="#008000"]// If So Switch Back To The Desktop
[size="2"]ShowCursor(TRUE);
[size="2"][color="#008000"][size="2"][color="#008000"]// Show Mouse Pointer
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (hRC) [size="2"][color="#008000"][size="2"][color="#008000"]// Do We Have A Rendering Context?
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (!wglMakeCurrent(NULL,NULL)) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Able To Release The DC And RC Contexts?
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Release Of DC And RC Failed."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"SHUTDOWN ERROR"[size="2"],MB_OK | MB_ICONINFORMATION);
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (!wglDeleteContext(hRC)) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Able To Delete The RC?
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Release Rendering Context Failed."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"SHUTDOWN ERROR"[size="2"],MB_OK | MB_ICONINFORMATION);
[size="2"]}
[size="2"]hRC=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set RC To NULL
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (hDC && !ReleaseDC(hWnd,hDC)) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Able To Release The DC
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Release Device Context Failed."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"SHUTDOWN ERROR"[size="2"],MB_OK | MB_ICONINFORMATION);
[size="2"]hDC=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set DC To NULL
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (hWnd && !DestroyWindow(hWnd)) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Able To Destroy The Window?
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Could Not Release hWnd."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"SHUTDOWN ERROR"[size="2"],MB_OK | MB_ICONINFORMATION);
[size="2"]hWnd=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set hWnd To NULL
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (!UnregisterClass([size="2"][color="#a31515"][size="2"][color="#a31515"]"OpenGL"[size="2"],hInstance)) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Able To Unregister Class
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Could Not Unregister Class."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"SHUTDOWN ERROR"[size="2"],MB_OK | MB_ICONINFORMATION);
[size="2"]hInstance=NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set hInstance To NULL
[size="2"]}
[size="2"]}
[size="2"][color="#008000"][size="2"][color="#008000"]/* This Code Creates Our OpenGL Window. Parameters Are: *
[size="2"][color="#008000"][size="2"][color="#008000"]* title - Title To Appear At The Top Of The Window *
[size="2"][color="#008000"][size="2"][color="#008000"]* width - Width Of The GL Window Or Fullscreen Mode *
[size="2"][color="#008000"][size="2"][color="#008000"]* height - Height Of The GL Window Or Fullscreen Mode *
[size="2"][color="#008000"][size="2"][color="#008000"]* bits - Number Of Bits To Use For Color (8/16/24/32) *
[size="2"][color="#008000"][size="2"][color="#008000"]* fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
[size="2"]BOOL CreateGLWindow(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]char[size="2"]* title, [size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] width, [size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] height, [size="2"][color="#0000ff"][size="2"][color="#0000ff"]int[size="2"] bits, [size="2"][color="#0000ff"][size="2"][color="#0000ff"]bool[size="2"] fullscreenflag)
[size="2"]{
[size="2"]GLuint PixelFormat;
[size="2"][color="#008000"][size="2"][color="#008000"]// Holds The Results After Searching For A Match
[size="2"]WNDCLASS wc;
[size="2"][color="#008000"][size="2"][color="#008000"]// Windows Class Structure
[size="2"]DWORD dwExStyle;
[size="2"][color="#008000"][size="2"][color="#008000"]// Window Extended Style
[size="2"]DWORD dwStyle;
[size="2"][color="#008000"][size="2"][color="#008000"]// Window Style
[size="2"]RECT WindowRect;
[size="2"][color="#008000"][size="2"][color="#008000"]// Grabs Rectangle Upper Left / Lower Right Values
[size="2"]WindowRect.left=(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]long[size="2"])0; [size="2"][color="#008000"][size="2"][color="#008000"]// Set Left Value To 0
[size="2"]WindowRect.right=(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]long[size="2"])width; [size="2"][color="#008000"][size="2"][color="#008000"]// Set Right Value To Requested Width
[size="2"]WindowRect.top=(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]long[size="2"])0; [size="2"][color="#008000"][size="2"][color="#008000"]// Set Top Value To 0
[size="2"]WindowRect.bottom=(
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]long[size="2"])height; [size="2"][color="#008000"][size="2"][color="#008000"]// Set Bottom Value To Requested Height
[size="2"]fullscreen=fullscreenflag;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set The Global Fullscreen Flag
[size="2"]hInstance = GetModuleHandle(NULL);
[size="2"][color="#008000"][size="2"][color="#008000"]// Grab An Instance For Our Window
[size="2"]wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
[size="2"][color="#008000"][size="2"][color="#008000"]// Redraw On Size, And Own DC For Window.
[size="2"]wc.lpfnWndProc = (WNDPROC) WndProc;
[size="2"][color="#008000"][size="2"][color="#008000"]// WndProc Handles Messages
[size="2"]wc.cbClsExtra = 0;
[size="2"][color="#008000"][size="2"][color="#008000"]// No Extra Window Data
[size="2"]wc.cbWndExtra = 0;
[size="2"][color="#008000"][size="2"][color="#008000"]// No Extra Window Data
[size="2"]wc.hInstance = hInstance;
[size="2"][color="#008000"][size="2"][color="#008000"]// Set The Instance
[size="2"]wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
[size="2"][color="#008000"][size="2"][color="#008000"]// Load The Default Icon
[size="2"]wc.hCursor = LoadCursor(NULL, IDC_ARROW);
[size="2"][color="#008000"][size="2"][color="#008000"]// Load The Arrow Pointer
[size="2"]wc.hbrBackground = NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// No Background Required For GL
[size="2"]wc.lpszMenuName = NULL;
[size="2"][color="#008000"][size="2"][color="#008000"]// We Don't Want A Menu
[size="2"]wc.lpszClassName =
[size="2"][color="#a31515"][size="2"][color="#a31515"]"OpenGL"[size="2"]; [size="2"][color="#008000"][size="2"][color="#008000"]// Set The Class Name

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (!RegisterClass(&wc)) [size="2"][color="#008000"][size="2"][color="#008000"]// Attempt To Register The Window Class
[size="2"]{
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Failed To Register The Window Class."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"ERROR"[size="2"],MB_OK|MB_ICONEXCLAMATION);

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

[size="2"][color="#008000"][size="2"][color="#008000"]// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
[size="2"]{

[size="2"][color="#008000"][size="2"][color="#008000"]// If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (MessageBox(NULL,[size="2"][color="#a31515"][size="2"][color="#a31515"]"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"NeHe GL"[size="2"],MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
[size="2"]{
[size="2"]fullscreen=FALSE;
[size="2"][color="#008000"][size="2"][color="#008000"]// Windowed Mode Selected. Fullscreen = FALSE
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]else
[size="2"]{

[size="2"][color="#008000"][size="2"][color="#008000"]// Pop Up A Message Box Letting User Know The Program Is Closing.
[size="2"]MessageBox(NULL,
[size="2"][color="#a31515"][size="2"][color="#a31515"]"Program Will Now Close."[size="2"],[size="2"][color="#a31515"][size="2"][color="#a31515"]"ERROR"[size="2"],MB_OK|MB_ICONSTOP);

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}
[size="2"]}
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (fullscreen) [size="2"][color="#008000"][size="2"][color="#008000"]// Are We Still In Fullscreen Mode?
[size="2"]{
[size="2"]dwExStyle=WS_EX_APPWINDOW;
[size="2"][color="#008000"][size="2"][color="#008000"]// Window Extended Style
[size="2"]dwStyle=WS_POPUP;
[size="2"][color="#008000"][size="2"][color="#008000"]// Windows Style
[size="2"]ShowCursor(FALSE);
[size="2"][color="#008000"][size="2"][color="#008000"]// Hide Mouse Pointer
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]else
[size="2"]{
[size="2"]dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
[size="2"][color="#008000"][size="2"][color="#008000"]// Window Extended Style
[size="2"]dwStyle=WS_OVERLAPPEDWINDOW;
[size="2"][color="#008000"][size="2"][color="#008000"]// Windows Style
[size="2"]}
[size="2"]AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);
[size="2"][color="#008000"][size="2"][color="#008000"]// Adjust Window To True Requested Size

[size="2"][color="#008000"][size="2"][color="#008000"]// Create The Window

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]if[size="2"] (!(hWnd=CreateWindowEx( dwExStyle, [size="2"][color="#008000"][size="2"][color="#008000"]// Extended Style For The Window

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]static[size="2"] PIXELFORMATDESCRIPTOR pfd= [size="2"][color="#008000"][size="2"][color="#008000"]// pfd Tells Windows How We Want Things To Be
[size="2"]{

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

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

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

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] FALSE; [size="2"][color="#008000"][size="2"][color="#008000"]// Return FALSE
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]switch[size="2"] (uMsg) [size="2"][color="#008000"][size="2"][color="#008000"]// Check For Windows Messages
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]case[size="2"] WM_ACTIVATE: [size="2"][color="#008000"][size="2"][color="#008000"]// Watch For Window Activate Message
[size="2"]{

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]else [size="2"][color="#008000"][size="2"][color="#008000"]// Otherwise
[size="2"]{
[size="2"]active=FALSE;
[size="2"][color="#008000"][size="2"][color="#008000"]// Program Is No Longer Active
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Return To The Message Loop
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]case[size="2"] WM_SYSCOMMAND: [size="2"][color="#008000"][size="2"][color="#008000"]// Intercept System Commands
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]switch[size="2"] (wParam) [size="2"][color="#008000"][size="2"][color="#008000"]// Check System Calls
[size="2"]{

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]case[size="2"] SC_SCREENSAVE: [size="2"][color="#008000"][size="2"][color="#008000"]// Screensaver Trying To Start?

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]case[size="2"] SC_MONITORPOWER: [size="2"][color="#008000"][size="2"][color="#008000"]// Monitor Trying To Enter Powersave?

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Prevent From Happening
[size="2"]}

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]break[size="2"]; [size="2"][color="#008000"][size="2"][color="#008000"]// Exit
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Jump Back
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Jump Back
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Jump Back
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] 0; [size="2"][color="#008000"][size="2"][color="#008000"]// Jump Back
[size="2"]}
[size="2"]}

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]return[size="2"] DefWindowProc(hWnd,uMsg,wParam,lParam);
[size="2"]}
[size="2"][color="#0000ff"][size="2"][color="#0000ff"]int

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

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

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

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

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

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

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]while[size="2"](!done) [size="2"][color="#008000"][size="2"][color="#008000"]// Loop That Runs While done=FALSE
[size="2"]{

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

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

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

[size="2"][color="#0000ff"][size="2"][color="#0000ff"]else [size="2"][color="#008000"][size="2"][color="#008000"]// If There Are No Messages
[size="2"]{

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


[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 "Unhandled exception at 0x004370cf in Lesson25.exe: 0xC0000005: Access violation reading location 0x00000000." [color="#ff0000"]And it places an arrow at the line

"a.x=(sour->points.x-dest->points.x)/steps;" [color=#FF0000]If you could help it would be greatly appreciated!!

This topic is closed to new replies.

Advertisement