diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..257d719 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION "3.5" FATAL_ERROR) +project(Lesson10 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 98) + +find_package(SDL2 REQUIRED) +find_package(OpenGL REQUIRED) + +add_executable(Lesson10 Lesson10.cpp) +target_link_libraries(Lesson10 SDL2::SDL2 OpenGL::GL) +target_compile_options(Lesson10 PRIVATE -Wall -Wextra -pedantic) diff --git a/Lesson10.cpp b/Lesson10.cpp index 3c4a1d4..bfcf6af 100644 --- a/Lesson10.cpp +++ b/Lesson10.cpp @@ -6,24 +6,39 @@ * Visit My Site At nehe.gamedev.net */ -#include // Header File For Windows -#include // Math Library Header File -#include // Header File For Standard Input/Output -#include // Header File For The OpenGL32 Library -#include // Header File For The GLu32 Library -#include // Header File For The Glaux Library +#include // Math Library Header File +#include // Header File For Standard Input/Output +#include +#include // Header File For The OpenGL32 Library +#ifdef __APPLE__ +#include // Header File For The GLu32 Library +#else +#include // Header File For The GLu32 Library +#endif -HDC hDC=NULL; // Private GDI Device Context -HGLRC hRC=NULL; // Permanent Rendering Context -HWND hWnd=NULL; // Holds Our Window Handle -HINSTANCE hInstance; // Holds The Instance Of The Application +SDL_Window* hWnd=NULL; // Holds Our Window Handle +SDL_GLContext hRC=NULL; // Permanent Rendering Context -bool keys[256]; // Array Used For The Keyboard Routine -bool active=TRUE; // Window Active Flag Set To TRUE By Default -bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default -bool blend; // Blending ON/OFF -bool bp; // B Pressed? -bool fp; // F Pressed? +bool keys[SDL_NUM_SCANCODES]; // Array Used For The Keyboard Routine +bool active=true; // Window Active Flag Set To TRUE By Default +bool fullscreen=true; // Fullscreen Flag Set To Fullscreen Mode By Default +bool blend; // Blending ON/OFF +bool bp; // B Pressed? +bool fp; // F Pressed? + +static const SDL_MessageBoxButtonData yesnobttns[2] = +{ + { + /*flags */ 0, + /*buttonid */ 0, + /*text */ "Yes" + }, + { + /*flags */ SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT | SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, + /*buttonid */ 1, + /*text */ "No" + } +}; const float piover180 = 0.0174532925f; float heading; @@ -58,8 +73,6 @@ typedef struct tagSECTOR SECTOR sector1; // Our Model Goes Here: -LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc - void readstr(FILE *f,char *string) { do @@ -99,37 +112,44 @@ void SetupWorld() return; } -AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image +bool FlipSurface(SDL_Surface *surface) { - FILE *File=NULL; // File Handle + if (!surface) return false; + if (SDL_LockSurface(surface) < 0) return false; - if (!Filename) // Make Sure A Filename Was Given - { - return NULL; // If Not Return NULL - } + const int pitch = surface->pitch; + const int numrows = surface->h; + unsigned char *pixels = (unsigned char*)surface->pixels; + unsigned char *tmprow = new unsigned char[pitch]; - File=fopen(Filename,"r"); // Check To See If The File Exists + unsigned char *row1 = pixels; + unsigned char *row2 = pixels + (numrows- 1) * pitch; + for (int i = 0; i < numrows / 2; ++i) + { + // Swap rows + memcpy(tmprow, row1, pitch); + memcpy(row1, row2, pitch); + memcpy(row2, tmprow, pitch); - 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 + row1 += pitch; + row2 -= pitch; + } + + delete[] tmprow; + SDL_UnlockSurface(surface); + return true; } int LoadGLTextures() // Load Bitmaps And Convert To Textures { - int Status=FALSE; // Status Indicator + int Status=SDL_FALSE; // Status Indicator - AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texture - - memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL + SDL_Surface *TextureImage = NULL; // Create Storage Space For The Texture // Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit - if (TextureImage[0]=LoadBMP("Data/Mud.bmp")) + if ((TextureImage=SDL_LoadBMP("Data/Mud.bmp")) && FlipSurface(TextureImage)) { - Status=TRUE; // Set The Status To TRUE + Status=SDL_TRUE; // Set The Status To TRUE glGenTextures(3, &texture[0]); // Create Three Textures @@ -137,31 +157,23 @@ int LoadGLTextures() // Load Bitmaps And Conv glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); - glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); + glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->w, TextureImage->h, 0, GL_BGR, GL_UNSIGNED_BYTE, TextureImage->pixels); // Create Linear Filtered Texture glBindTexture(GL_TEXTURE_2D, texture[1]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); + glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->w, TextureImage->h, 0, GL_BGR, GL_UNSIGNED_BYTE, TextureImage->pixels); // Create MipMapped Texture glBindTexture(GL_TEXTURE_2D, texture[2]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); - gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); + gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage->w, TextureImage->h, GL_BGR, GL_UNSIGNED_BYTE, TextureImage->pixels); } - if (TextureImage[0]) // If Texture Exists - { - if (TextureImage[0]->data) // If Texture Image Exists - { - free(TextureImage[0]->data); // Free The Texture Image Memory - } + SDL_FreeSurface(TextureImage); // Free The Image Structure - free(TextureImage[0]); // Free The Image Structure - } - - return Status; // Return The Status + return Status; // Return The Status } GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window @@ -187,7 +199,7 @@ int InitGL(GLvoid) // All Setup For OpenGL Goes Here { if (!LoadGLTextures()) // Jump To Texture Loading Routine { - return FALSE; // If Texture Didn't Load Return FALSE + return 0; // If Texture Didn't Load Return FALSE } glEnable(GL_TEXTURE_2D); // Enable Texture Mapping @@ -201,7 +213,7 @@ int InitGL(GLvoid) // All Setup For OpenGL Goes Here SetupWorld(); - return TRUE; // Initialization Went OK + return 1; // Initialization Went OK } int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing @@ -252,295 +264,192 @@ int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing glTexCoord2f(u_m,v_m); glVertex3f(x_m,y_m,z_m); glEnd(); } - return TRUE; // Everything Went OK + return 1; // Everything Went OK } 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 + SDL_SetWindowFullscreen(hWnd, 0); // If So Switch Back To The Desktop + SDL_ShowCursor(SDL_ENABLE); // 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? + if (SDL_GL_MakeCurrent(hWnd,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); + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "SHUTDOWN ERROR", "Release Of RC Failed.", NULL); } - if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC? - { - MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); - } + SDL_GL_DeleteContext(hRC); // Delete The RC 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 - } + SDL_DestroyWindow(hWnd); // Destroy The Window + hWnd=NULL; // Set hWnd 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) + + +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 + SDL_Rect WindowRect; // Grabs Rectangle Upper Left / Lower Right Values + WindowRect.x=0; // Set Left Value To 0 + WindowRect.w=width; // Set Right Value To Requested Width + WindowRect.y=0; // Set Top Value To 0 + WindowRect.h=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 + // Create The Window + if (!(hWnd = SDL_CreateWindow(title, + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, // Window Position + WindowRect.w, // Window Width + WindowRect.h, // Window Height + SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE))) { - MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); - return FALSE; // Return FALSE + KillGLWindow(); // Reset The Display + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", "Window Creation Error.", NULL); + 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 (SDL_SetWindowFullscreen(hWnd, SDL_WINDOW_FULLSCREEN_DESKTOP) < 0) // Try To Set Selected Mode And Get Results. { // 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) + const SDL_MessageBoxData msgbox = { - fullscreen=FALSE; // Windowed Mode Selected. Fullscreen = FALSE + SDL_MESSAGEBOX_INFORMATION, + hWnd, + "NeHe GL", + "The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?", + 2, + yesnobttns, + NULL + }; + int bttnid = 0; + SDL_ShowMessageBox(&msgbox, &bttnid); + if (bttnid == 0) + { + 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 + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, "ERROR", "Program Will Now Close.", NULL); + 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 - } + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); // Must Support Double Buffering + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); // Select Our Color Depth + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 0); // Color Bits Ignored + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 0); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 0); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 0); // No Alpha Buffer + SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE, 0); // No Accumulation Buffer + SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE, 0); // Accumulation Bits Ignored + SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE, 0); + SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE, 0); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); // 16Bit Z-Buffer (Depth Buffer) + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 0); // No Stencil Buffer - 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 + if (!(hRC=SDL_GL_CreateContext(hWnd))) // Are We Able To Get A Rendering Context? { KillGLWindow(); // Reset The Display - MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); - return FALSE; // Return FALSE + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", "Can't Create A GL Rendering Context.", NULL); + 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, // 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? + if(SDL_GL_MakeCurrent(hWnd, hRC)) // Try To Activate The Rendering Context { KillGLWindow(); // Reset The Display - MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); - return FALSE; // Return FALSE + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", "Can't Activate The GL Rendering Context.", NULL); + 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 + SDL_ShowWindow(hWnd); + SDL_GL_SetSwapInterval(1); ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen 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 + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "ERROR", "Initialization Failed.", NULL); + return false; // Return FALSE } - return TRUE; // Success + return true; // Success } -LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window - UINT uMsg, // Message For This Window - WPARAM wParam, // Additional Message Information - LPARAM lParam) // Additional Message Information +void WndProc(SDL_Event* uMsg) { - switch (uMsg) // Check For Windows Messages + switch (uMsg->type) // Check For Windows Messages { - case WM_ACTIVATE: // Watch For Window Activate Message + case SDL_KEYDOWN: // Is A Key Being Held Down? { - if (!HIWORD(wParam)) // Check Minimization State + keys[uMsg->key.keysym.scancode] = true; // If So, Mark It As TRUE + break; // Jump Back + } + + case SDL_KEYUP: // Has A Key Been Released? + { + keys[uMsg->key.keysym.scancode] = false; // If So, Mark It As FALSE + break; // Jump Back + } + + case SDL_WINDOWEVENT: + { + switch (uMsg->window.event) { - active=TRUE; // Program Is Active + case SDL_WINDOWEVENT_SIZE_CHANGED: // Resize The OpenGL Window + { + ReSizeGLScene(uMsg->window.data1,uMsg->window.data2); // LoWord=Width, HiWord=Height + break; // Jump Back + } } - 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 + break; } } - - // Pass All Unhandled Messages To DefWindowProc - return DefWindowProc(hWnd,uMsg,wParam,lParam); } -int WINAPI WinMain( HINSTANCE hInstance, // Instance - HINSTANCE hPrevInstance, // Previous Instance - LPSTR lpCmdLine, // Command Line Parameters - int nCmdShow) // Window Show State +int main(int argc, char* argv[]) { - MSG msg; // Windows Message Structure - BOOL done=FALSE; // Bool Variable To Exit Loop + SDL_Event msg; // Windows Message Structure + bool done=false; // Bool Variable To Exit Loop + + SDL_Init(SDL_INIT_VIDEO); // 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) + const SDL_MessageBoxData msgbox = { - fullscreen=FALSE; // Windowed Mode + /* flags */ SDL_MESSAGEBOX_INFORMATION, + /* window */ hWnd, + /* title */ "Start FullScreen?", + /* message */ "Would You Like To Run In Fullscreen Mode?", + /* numbuttons */ 2, + /* buttons */ yesnobttns, + /* colorScheme */ NULL + }; + int bttnid = 1; + SDL_ShowMessageBox(&msgbox, &bttnid); + if (bttnid == 1) + { + fullscreen=false; // Windowed Mode } // Create Our OpenGL Window @@ -551,31 +460,30 @@ int WINAPI WinMain( HINSTANCE hInstance, // Instance while(!done) // Loop That Runs While done=FALSE { - if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting? + if (SDL_PollEvent(&msg) > 0) // Is There A Message Waiting? { - if (msg.message==WM_QUIT) // Have We Received A Quit Message? + if (msg.type==SDL_QUIT) // Have We Received A Quit Message? { - done=TRUE; // If So done=TRUE + done=true; // If So done=TRUE } else // If Not, Deal With Window Messages { - TranslateMessage(&msg); // Translate The Message - DispatchMessage(&msg); // Dispatch The Message + WndProc(&msg); } } 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? + if ((active && !DrawGLScene()) || keys[SDL_SCANCODE_ESCAPE]) // Active? Was There A Quit Received? { - done=TRUE; // ESC or DrawGLScene Signalled A Quit + done=true; // ESC or DrawGLScene Signalled A Quit } else // Not Time To Quit, Update Screen { - SwapBuffers(hDC); // Swap Buffers (Double Buffering) - if (keys['B'] && !bp) + SDL_GL_SwapWindow(hWnd); // Swap Buffers (Double Buffering) + if (keys[SDL_SCANCODE_B] && !bp) { - bp=TRUE; + bp=true; blend=!blend; if (!blend) { @@ -588,36 +496,36 @@ int WINAPI WinMain( HINSTANCE hInstance, // Instance glDisable(GL_DEPTH_TEST); } } - if (!keys['B']) + if (!keys[SDL_SCANCODE_B]) { - bp=FALSE; + bp=false; } - if (keys['F'] && !fp) + if (keys[SDL_SCANCODE_F] && !fp) { - fp=TRUE; + fp=true; filter+=1; if (filter>2) { filter=0; } } - if (!keys['F']) + if (!keys[SDL_SCANCODE_F]) { - fp=FALSE; + fp=false; } - if (keys[VK_PRIOR]) + if (keys[SDL_SCANCODE_PAGEUP]) { z-=0.02f; } - if (keys[VK_NEXT]) + if (keys[SDL_SCANCODE_PAGEDOWN]) { z+=0.02f; } - if (keys[VK_UP]) + if (keys[SDL_SCANCODE_UP]) { xpos -= (float)sin(heading*piover180) * 0.05f; @@ -633,7 +541,7 @@ int WINAPI WinMain( HINSTANCE hInstance, // Instance walkbias = (float)sin(walkbiasangle * piover180)/20.0f; } - if (keys[VK_DOWN]) + if (keys[SDL_SCANCODE_DOWN]) { xpos += (float)sin(heading*piover180) * 0.05f; zpos += (float)cos(heading*piover180) * 0.05f; @@ -648,31 +556,31 @@ int WINAPI WinMain( HINSTANCE hInstance, // Instance walkbias = (float)sin(walkbiasangle * piover180)/20.0f; } - if (keys[VK_RIGHT]) + if (keys[SDL_SCANCODE_RIGHT]) { heading -= 1.0f; yrot = heading; } - if (keys[VK_LEFT]) + if (keys[SDL_SCANCODE_LEFT]) { - heading += 1.0f; + heading += 1.0f; yrot = heading; } - if (keys[VK_PRIOR]) + if (keys[SDL_SCANCODE_PAGEUP]) { lookupdown-= 1.0f; } - if (keys[VK_NEXT]) + if (keys[SDL_SCANCODE_PAGEDOWN]) { lookupdown+= 1.0f; } - if (keys[VK_F1]) // Is F1 Being Pressed? + if (keys[SDL_SCANCODE_F1]) // Is F1 Being Pressed? { - keys[VK_F1]=FALSE; // If So Make Key FALSE + keys[SDL_SCANCODE_F1]=false; // If So Make Key FALSE KillGLWindow(); // Kill Our Current Window fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode // Recreate Our OpenGL Window @@ -687,5 +595,6 @@ int WINAPI WinMain( HINSTANCE hInstance, // Instance // Shutdown KillGLWindow(); // Kill The Window - return (msg.wParam); // Exit The Program + SDL_Quit(); + return EXIT_SUCCESS; // Exit The Program }