基于openGl的三维旋转魔方源代码
基于openGl的三旋魔方源代维维维维维维维维
/*
*This Code Was Created By Jeff Molofee 2000
*A HUGE Thanks To Fredric Echols For Cleaning Up
*And Optimizing The Base Code, Making It More Flexible!
*If You've Found This Code Useful, Please Let Me Know.
*Visit My Site At nehe.gamedev.net
*/
// Header File For Standard Input/Output
#include "MoFang.h"
HDChDC=NULL;// Private GDI Device Context
HGLRChRC=NULL;// Permanent Rendering ContextHWNDhWnd=NULL;// Holds Our Window Handle
HINSTANCEhInstance;// Holds The Instance Of The Applicationboolkeys[256];// Array Used For The Keyboard Routineboolactive=TRUE;// Window Active Flag Set To TRUE By Defaultboolfullscreen=TRUE;// Fullscreen Flag Set To Fullscreen Mode By Default
GLfloatxrot;// X Rotation ( NEW )
GLfloatyrot;// Y Rotation ( NEW )
GLfloatzrot;// Z Rotation ( NEW )
GLfloat RX;
GLfloat RY;
GLuinttexture[24];// Storage For One Texture ( NEW )GLboolean b_RX,b_RY;
LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// Declaration For
WndProc
AUX_RGBImageRec *LoadBMP(char *Filename)// Loads A Bitmap Image{
FILE *File=NULL;
// File Handle
if (!Filename)
// Make Sure A Filename Was Given
{
return NULL;
// If Not Return NULL
}
File=fopen(Filename,"r");// Check To See If The File Exists
if (File)
// Does The File Exist?
{
fclose(File);
// Close The Handle
return auxDIBImageLoad(Filename);// Load The Bitmap And
Return A Pointer
}
return NULL;
// If Load Failed Return NULL
}
int LoadGLTextures()//
Load Bitmaps And Convert To Textures
{
int Status=FALSE;//
Status Indicator
AUX_RGBImageRec *TextureImage[1];// Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE;
// Set The Status To TRUE
glGenTextures(1, &texture[0]);// Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0])
// If Texture Exists
{
if (TextureImage[0]->data)// If
Texture Image Exists
{
free(TextureImage[0]->data);// Free The Texture Image Memory
}
free(TextureImage[0]);
// Free The Image Structure
}
return Status;
// Return The Status
}
int LoadGLTextures(char *file,int index)
// Load Bitmaps And Convert To Textures{
int Status=FALSE;//
Status Indicator
AUX_RGBImageRec *TextureImage[1];// Create Storage Space For The Texture
memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
if (TextureImage[0]=LoadBMP(file))
{
Status=TRUE;
// Set The Status To TRUE
glGenTextures(1, &texture[index]);// Create The Texture
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texture[index]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0])
// If Texture Exists
{
if (TextureImage[0]->data)// If
Texture Image Exists
{
free(TextureImage[0]->data);// Free The Texture Image Memory
}
free(TextureImage[0]);
// Free The Image Structure
}
return Status;
// Return The Status
}
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
{
if (!LoadGLTextures("Data/y1.bmp",0))
// Jump To Texture Loading Routine ( NEW )
{
return FALSE;
// If Texture Didn't Load Return FALSE
}
if (!LoadGLTextures("Data/y2.bmp",1))
// Jump To Texture Loading Routine ( NEW )
{
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y3.bmp",2))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y4.bmp",3))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y5.bmp",4))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y6.bmp",5))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y7.bmp",6))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
if (!LoadGLTextures("Data/y8.bmp",7))
// Jump To Texture Loading Routine ( NEW ){
return FALSE;
// If Texture Didn't Load Return FALSE}
glEnable(GL_TEXTURE_2D);//
Enable Texture Mapping ( NEW )
glShadeModel(GL_SMOOTH);//
Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);// Black Background
glClearDepth(1.0f);
// Depth Buffer Setup
glEnable(GL_DEPTH_TEST);//
Enables Depth Testing
glDepthFunc(GL_LEQUAL);
// The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// Really Nice Perspective
Calculations
return TRUE;
// Initialization Went OK
}
void DrawObject1(GLfloat X,GLfloat Y,GLfloat Z)
{
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, -1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f + X, -1.0f + Y, 1.0f + Z);// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, -1.0f + Z);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f + X, -1.0f + Y, 1.0f + Z);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, 1.0f + Z);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f + X, 1.0f + Y, -1.0f + Z);glEnd();
}
void DrawObject(int ID)
{
stPoint *CubePoint = Cube[ID].CubePoint;
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[0].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[1].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[3].p);
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[6].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[7].p);
// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[3].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p);
// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[7].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p);
// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[7].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[6].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[2].p);
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[1].p);
// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3fv( CubePoint[4].p);
glTexCoord2f(1.0f, 0.0f); glVertex3fv( CubePoint[0].p);
glTexCoord2f(1.0f, 1.0f); glVertex3fv( CubePoint[3].p);
glTexCoord2f(0.0f, 1.0f); glVertex3fv( CubePoint[5].p);
glEnd();
}
int 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(0.0f,0.0f,-12.0f);
glTranslatef(RX,0.0f,0.0f);
glTranslatef(0.0,RY,0.0);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
//
glBindTexture(GL_TEXTURE_2D, texture[0]);
DrawObject(0);
glBindTexture(GL_TEXTURE_2D, texture[1]);
DrawObject(1);
glBindTexture(GL_TEXTURE_2D, texture[2]);
DrawObject(2);
glBindTexture(GL_TEXTURE_2D, texture[3]);
DrawObject(3);
glBindTexture(GL_TEXTURE_2D, texture[4]);
DrawObject(4);
glBindTexture(GL_TEXTURE_2D, texture[5]);
DrawObject(5);
glBindTexture(GL_TEXTURE_2D, texture[6]);
DrawObject(6);
glBindTexture(GL_TEXTURE_2D, texture[7]);
DrawObject(7);/**/
xrot+=0.15f;
yrot+=0.1f;
zrot+=0.2f;
return TRUE;
// Keep Going
}
GLvoid KillGLWindow(GLvoid)//
Properly Kill The Window
{
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)
{
GLuintPixelFormat;// Holds The Results After Searching For A Match
WNDCLASSwc;// Windows Class
Structure
DWORDdwExStyle;// Window Extended Style
DWORDdwStyle;// Window Style
RECTWindowRect;// 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
}
staticPIXELFORMATDESCRIPTOR 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,
// Select Our Color Depth
0, 0, 0, 0, 0, 0,// Color Bits Ignored
0,
// No Alpha Buffer
0,
// Shift Bit Ignored
0,
// No Accumulation Buffer
0, 0, 0, 0,//
Accumulation Bits Ignored
16,
// 16Bit Z-Buffer (Depth Buffer)
0,
// No Stencil Buffer
0,
// No Auxiliary Buffer
PFD_MAIN_PLANE,
// Main Drawing Layer
0,
// Reserved
0, 0, 0
// Layer Masks Ignored
};
if (!(hDC=GetDC(hWnd)))// Did We Get A
Device Context?
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))// Did Windows Find A Matching Pixel
Format?
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))// Are We Able To Set The Pixel Format?
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
if (!(hRC=wglCreateContext(hDC)))// Are We Able To Get A Rendering
Context?
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
if(!wglMakeCurrent(hDC,hRC))// Try To Activate The
Rendering Context
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|
MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
ShowWindow(hWnd,SW_SHOW);// Show The Window
SetForegroundWindow(hWnd);// Slightly Higher Priority
SetFocus(hWnd);// Sets
Keyboard Focus To The Window
ReSizeGLScene(width, height);// Set Up Our Perspective
GL Screen
reset_model();
if (!InitGL())//
Initialize Our Newly Created GL Window
{
KillGLWindow();//
Reset The Display
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;//
Return FALSE
}
return TRUE;//
Success
}
static int iii=0;
LRESULT CALLBACK WndProc(HWNDhWnd,// Handle For This Window
UINTuMsg,// Message For This Window
WPARAMwParam,
// Additional Message Information
LPARAMlParam)
// Additional Message Information{
switch (uMsg)//
Check For Windows Messages
{
case WM_ACTIVATE:// Watch For Window Activate Message
{
if (!HIWORD(wParam))// Check
Minimization State
{
active=TRUE;// Program Is Active
}
else
{
active=FALSE;// Program Is No Longer Active
}
return 0;//
Return To The Message Loop
}
case WM_SYSCOMMAND:// Intercept System Commands
{
switch (wParam)// Check System Calls
{
case SC_SCREENSAVE:// Screensaver Trying To Start?
case SC_MONITORPOWER://
Monitor Trying To Enter Powersave?
return 0;// Prevent From Happening
}
break;
// Exit
}
case WM_CLOSE:// Did We Receive A Close Message?
{
PostQuitMessage(0);// Send A Quit Message
return 0;//
Jump Back
}
case WM_KEYDOWN:// Is A Key Being Held Down?
{
keys[wParam] = TRUE;// If So, Mark It
As TRUE
return 0;//
Jump Back
}
case WM_KEYUP:
// Has A Key Been Released?
{
keys[wParam] = FALSE;// If So, Mark It
As FALSE
return 0;//
Jump Back
}
case WM_SIZE://
Resize The OpenGL Window
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width,
HiWord=Height
return 0;//
Jump Back
}
case WM_TIMER:
{
if(rotAngle != 0)
{
if(rotZ)
Rotate_ZM();
if(rotY)
Rotate_YM();
if(rotX)
Rotate_XM();
}
}
}
// Pass All Unhandled Messages To DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer
messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
if( idEvent==2)
{
srand(dwTime);
int r = rand();
if( r%6==0)
enable_X_roatate(1);
else if( r%6==1)
enable_Y_roatate(1);
else if( r%6==2)
enable_Z_roatate(1);
else if( r%6==3)
enable_X_roatate(-1);
else if( r%6==4)
enable_Y_roatate(-1);
else if( r%6==5)
enable_Z_roatate(-1);
}
}
VOID CALLBACK CubeWalk(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
if( idEvent==3)
{
/*
int i = RX*100;
if( i==560)
Vx = -0.02;
else if( i==-560)
Vx = 0.02;
RX += Vx;*/
}
}
int WINAPI WinMain(HINSTANCEhInstance,// Instance
HINSTANCEhPrevInstance,// Previous Instance
LPSTRlpCmdLine,//
Command Line Parameters
intnCmdShow)
// Window Show State
{
MSGmsg;
// Windows Message Structure
BOOLdone=FALSE;// Bool
Variable To Exit Loop
// Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|
MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE;// Windowed
Mode
}
// Create Our OpenGL Window
if (!CreateGLWindow("3D MagicCube-杨文涛",1280,768,16,fullscreen))
{
return 0;// Quit
If Window Was Not Created
}
::SetTimer(hWnd,1,10,NULL);
::SetTimer(hWnd,2,1500,TimerProc);
::SetTimer(hWnd,3,10,CubeWalk);
while(!done)//
Loop That Runs While done=FALSE
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))// Is There A Message Waiting?
{
if (msg.message==WM_QUIT)// Have We Received A Quit Message?
{
done=TRUE;
// If So done=TRUE
}
else
// If Not, Deal With Window Messages
{
TranslateMessage(&msg);// Translate The
Message
DispatchMessage(&msg);// Dispatch The
Message
}
}
else
// If There Are No Messages
{
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
if ((active && !DrawGLScene()) || keys[VK_ESCAPE])// Active? Was There A
Quit Received?
{
done=TRUE;
// ESC or DrawGLScene Signalled A Quit
}
else
// Not Time To Quit, Update Screen
{
SwapBuffers(hDC);// Swap Buffers (Double Buffering)
}
if (keys[VK_F1])// Is F1 Being Pressed?
{
keys[VK_F1]=FALSE;// If So Make Key FALSE
KillGLWindow();// Kill Our Current Window
fullscreen=!fullscreen;// Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window
if (!CreateGLWindow("NeHe's Texture Mapping
Tutorial",640,480,16,fullscreen))
{
return 0;// Quit If Window Was Not Created
}
}
if(keys[VK_LEFT])
{
keys[VK_LEFT]=FALSE;
RX -= 0.05f;
b_RY = true;
}
if(keys[VK_RIGHT])
{
keys[VK_RIGHT]=FALSE;
RX += 0.05f;
b_RY = true;
}
if(keys[VK_UP])
{
keys[VK_UP]=FALSE;
RY += 0.05f;
b_RX = true;
}
if(keys[VK_DOWN])
{
keys[VK_DOWN]=FALSE;
RY -= 0.05f;
b_RX = true;
}
if(keys[VK_F2])
{
keys[VK_F2] = FALSE;
enable_X_roatate(1);
}
if(keys[VK_F3])
{
keys[VK_F3] = FALSE;
enable_Y_roatate(1);
}
if(keys[VK_F4]) //control Z direction
{
keys[VK_F4] = FALSE;
enable_Z_roatate(1);
}
}
}
// Shutdown
KillGLWindow();// Kill
The Window
return (msg.wParam);// Exit The
Program
}
本文档为【基于openGl的三维旋转魔方源代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。