diff --git a/JGE/include/JTypes.h b/JGE/include/JTypes.h index a874a6275..5e48ee813 100644 --- a/JGE/include/JTypes.h +++ b/JGE/include/JTypes.h @@ -250,7 +250,7 @@ typedef enum Buttons JGE_BTN_NEXT, // Right trigger JGE_BTN_FULLSCREEN, // Switch to fullscreen (obviously, PC only) - JGE_BTN_MAX = JGE_BTN_NEXT + 1 + JGE_BTN_MAX = JGE_BTN_FULLSCREEN + 1 } JButton; diff --git a/JGE/src/JGE.cpp b/JGE/src/JGE.cpp index 7f403e025..b21e57ecd 100644 --- a/JGE/src/JGE.cpp +++ b/JGE/src/JGE.cpp @@ -118,7 +118,11 @@ void JGE::HoldKey_NoRepeat(const LocalKeySym sym) else for (keycodes_it it = rng.first; it != rng.second; ++it) { #if defined (WIN32) || defined (LINUX) - if (JGE_BTN_FULLSCREEN == it->second) JGEToggleFullscreen(); + if (JGE_BTN_FULLSCREEN == it->second) + { + JGEToggleFullscreen(); + return; + } #endif keyBuffer.push(triplet(*it, true)); if (!held(it->second)) diff --git a/JGE/src/winmain.cpp b/JGE/src/winmain.cpp index f6fa591cd..da52b7806 100644 --- a/JGE/src/winmain.cpp +++ b/JGE/src/winmain.cpp @@ -135,8 +135,15 @@ HWND hWnd=NULL; // Holds Our Window Handle HINSTANCE hInstance; // Holds The Instance Of The Application bool active=TRUE; // Window Active Flag Set To TRUE By Default -bool fullscreen=FALSE; // Windowed Mode By Default +enum eDisplayMode +{ + DisplayMode_lowRes = 0, + DisplayMode_hiRes, + DisplayMode_fullscreen +}; + +unsigned int gDisplayMode = DisplayMode_lowRes; DWORD lastTickCount; @@ -156,8 +163,10 @@ JGameLauncher* g_launcher = NULL; static u32 gButtons = 0; static u32 gOldButtons = 0; -static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] = - { +static const struct { LocalKeySym keysym; JButton keycode; } + +gDefaultBindings[] = +{ { VK_CONTROL, JGE_BTN_CTRL }, { VK_RETURN, JGE_BTN_MENU }, { VK_ESCAPE, JGE_BTN_MENU }, @@ -176,107 +185,108 @@ static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] { VK_SPACE, JGE_BTN_OK }, { 'K', JGE_BTN_SEC }, { 'J', JGE_BTN_PRI }, - }; + { 'F', JGE_BTN_FULLSCREEN }, +}; void JGECreateDefaultBindings() { - for (signed int i = sizeof(gDefaultBindings)/sizeof(gDefaultBindings[0]) - 1; i >= 0; --i) - g_engine->BindKey(gDefaultBindings[i].keysym, gDefaultBindings[i].keycode); + for (signed int i = sizeof(gDefaultBindings)/sizeof(gDefaultBindings[0]) - 1; i >= 0; --i) + g_engine->BindKey(gDefaultBindings[i].keysym, gDefaultBindings[i].keycode); } int JGEGetTime() { - return (int)GetTickCount(); + return (int)GetTickCount(); } LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc 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 + if (height==0) // Prevent A Divide By Zero By + height=1; // Making Height Equal One - JRenderer::GetInstance()->SetActualWidth(static_cast(width)); - JRenderer::GetInstance()->SetActualHeight(static_cast(height)); + JRenderer::GetInstance()->SetActualWidth(static_cast(width)); + JRenderer::GetInstance()->SetActualHeight(static_cast(height)); - glScissor(0, 0, width, height); - glViewport (0, 0, width, height); // Reset The Current Viewport - glMatrixMode (GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity (); // Reset The Projection Matrix + glScissor(0, 0, width, height); + glViewport (0, 0, width, height); // Reset The Current Viewport + glMatrixMode (GL_PROJECTION); // Select The Projection Matrix + glLoadIdentity (); // Reset The Projection Matrix - gluOrtho2D(0.0f, (float) width-1.0f, 0.0f, (float) height -1.0f); + gluOrtho2D(0.0f, (float) width-1.0f, 0.0f, (float) height -1.0f); - glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity (); // Reset The Modelview Matrix + glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix + glLoadIdentity (); // Reset The Modelview Matrix - glDisable (GL_DEPTH_TEST); + glDisable (GL_DEPTH_TEST); } int InitGL(void) // All Setup For OpenGL Goes Here { - glClearColor (0.0f, 0.0f, 0.0f, 0.0f); // Black Background - glClearDepth (1.0f); // Depth Buffer Setup - glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal) - glEnable (GL_DEPTH_TEST); // Enable Depth Testing - glShadeModel (GL_SMOOTH); // Select Smooth Shading - glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate + glClearColor (0.0f, 0.0f, 0.0f, 0.0f); // Black Background + glClearDepth (1.0f); // Depth Buffer Setup + glDepthFunc (GL_LEQUAL); // The Type Of Depth Testing (Less Or Equal) + glEnable (GL_DEPTH_TEST); // Enable Depth Testing + glShadeModel (GL_SMOOTH); // Select Smooth Shading + glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Set Perspective Calculations To Most Accurate - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing - //glEnable(GL_LINE_SMOOTH); // Enable it! + glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Set Line Antialiasing + //glEnable(GL_LINE_SMOOTH); // Enable it! - glEnable(GL_CULL_FACE); // do not calculate inside of poly's - glFrontFace(GL_CCW); // counter clock-wise polygons are out + glEnable(GL_CULL_FACE); // do not calculate inside of poly's + glFrontFace(GL_CCW); // counter clock-wise polygons are out - glEnable(GL_TEXTURE_2D); + glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_SCISSOR_TEST); // Enable Clipping - //glScissor(20, 20, 320, 240); + glEnable(GL_SCISSOR_TEST); // Enable Clipping + //glScissor(20, 20, 320, 240); - return TRUE; // Initialization Went OK + return TRUE; // Initialization Went OK } int InitGame(void) { - g_engine = JGE::GetInstance(); + g_engine = JGE::GetInstance(); - //JGameLauncher *launcher = new JGameLauncher(); - g_app = g_launcher->GetGameApp(); - g_app->Create(); - g_engine->SetApp(g_app); + //JGameLauncher *launcher = new JGameLauncher(); + g_app = g_launcher->GetGameApp(); + g_app->Create(); + g_engine->SetApp(g_app); - JRenderer::GetInstance()->Enable2D(); + JRenderer::GetInstance()->Enable2D(); - lastTickCount = GetTickCount(); + lastTickCount = GetTickCount(); - ZeroMemory(g_keys, 256); - ZeroMemory(g_holds, 256); + ZeroMemory(g_keys, 256); + ZeroMemory(g_holds, 256); - //delete launcher; + //delete launcher; - return TRUE; + return TRUE; } void DestroyGame(void) { - // JParticleSystem::Destroy(); - // JMotionSystem::Destroy(); + // JParticleSystem::Destroy(); + // JMotionSystem::Destroy(); - g_engine->SetApp(NULL); - if (g_app) + g_engine->SetApp(NULL); + if (g_app) { - g_app->Destroy(); - delete g_app; - g_app = NULL; + g_app->Destroy(); + delete g_app; + g_app = NULL; } - JGE::Destroy(); + JGE::Destroy(); - g_engine = NULL; + g_engine = NULL; } @@ -284,449 +294,485 @@ void DestroyGame(void) int DrawGLScene(void) // Here's Where We Do All The Drawing { - // glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer - // glLoadIdentity (); // Reset The Modelview Matrix + // glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer + // glLoadIdentity (); // Reset The Modelview Matrix - //if (g_app) - // g_app->Render(); - g_engine->Render(); + //if (g_app) + // g_app->Render(); + g_engine->Render(); - // glFlush (); + // glFlush (); - return TRUE; // Everything Went OK + return TRUE; // Everything Went OK } void Update(float dt) { - g_engine->SetDelta(dt); - g_engine->Update(dt); + g_engine->SetDelta(dt); + g_engine->Update(dt); } void KillGLWindow(void) // Properly Kill The Window { - DestroyGame(); - - if (fullscreen) // Are We In Fullscreen Mode? + if (gDisplayMode == DisplayMode_fullscreen) { - ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop - ShowCursor(TRUE); // Show Mouse Pointer + ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop + ShowCursor(TRUE); // Show Mouse Pointer } - if (hRC) // Do We Have A Rendering Context? + 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 (!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 + 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 + 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? + 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 + 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 + 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 + 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) + * bits - Number Of Bits To Use For Color (8/16/24/32) */ +BOOL CreateGLWindow(char* title, int width, int height, int bits) { + int actualScreenWidth = ::GetSystemMetrics(SM_CXSCREEN); + int actualScreenHeight = ::GetSystemMetrics(SM_CYSCREEN); - JRenderer::GetInstance()->SetActualWidth(static_cast(width)); - JRenderer::GetInstance()->SetActualWidth(static_cast(height)); + JRenderer::GetInstance()->SetActualWidth(static_cast(width)); + JRenderer::GetInstance()->SetActualHeight(static_cast(height)); - 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 + 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; - windowRect.top = (long) 0; + windowRect.left = (long) 0; + windowRect.top = (long) 0; - if (fullscreenflag == false) - { - windowRect.left = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2; - windowRect.top = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2; - } - - windowRect.right = windowRect.left + (long)width; // Set Right Value To Requested Width - windowRect.bottom = windowRect.top + (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 (gDisplayMode != DisplayMode_fullscreen) { - // 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 - } + windowRect.left = (actualScreenWidth - width) / 2; + windowRect.top = (actualScreenHeight - height) / 2; } - } - 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 - dwStyle= WS_OVERLAPPED | \ - WS_CAPTION | \ - WS_MINIMIZEBOX | - WS_SIZEBOX | - WS_MAXIMIZEBOX | - //WS_MINIMIZE | - WS_SYSMENU;// | - //WS_THICKFRAME ; - } + windowRect.right = windowRect.left + (long)width; // Set Right Value To Requested Width + windowRect.bottom = windowRect.top + (long)height; // Set Bottom Value To Requested Height - AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size + 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 - // 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 - windowRect.left, windowRect.top, // 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 - } + 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 + } - 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 (gDisplayMode == DisplayMode_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 = actualScreenWidth; // Selected Screen Width + dmScreenSettings.dmPelsHeight = actualScreenHeight; // Selected Screen Height + dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel + dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; - 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 - } + // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. + LONG result = ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN); + if (result != 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) + { + gDisplayMode = DisplayMode_lowRes; // Windowed Mode Selected. + } + 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 (!(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 (gDisplayMode == DisplayMode_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 + dwStyle= WS_OVERLAPPED | \ + WS_CAPTION | \ + WS_MINIMIZEBOX | + WS_SIZEBOX | + WS_MAXIMIZEBOX | + //WS_MINIMIZE | + WS_SYSMENU;// | + //WS_THICKFRAME ; + } - 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 - } + AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size - 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 - } + // Create The Window - 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 - } + if (hWnd == NULL) + { + 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 + windowRect.left, windowRect.top, // 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 + } + } - 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 + 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 (!InitGL()) // Initialize Our Newly Created GL Window - { - KillGLWindow(); // Reset The Display - MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); - return FALSE; // Return FALSE - } + 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 (!InitGame()) // Initialize Our Game - { - KillGLWindow(); // Reset The Display - MessageBox(NULL,"Game Initialization Failed.","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 + } - return TRUE; // Success + 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 + + 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 } -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 +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 { - switch (uMsg) // Check For Windows Messages + 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 - if (g_engine != NULL) - g_engine->Resume(); - } - else - { - active=FALSE; // Program Is No Longer Active - if (g_engine != NULL) - g_engine->Pause(); - } + { + if (!HIWORD(wParam)) // Check Minimization State + { + active=TRUE; // Program Is Active + if (g_engine != NULL) + g_engine->Resume(); + } + else + { + active=FALSE; // Program Is No Longer Active + if (g_engine != NULL) + g_engine->Pause(); + } - return 0; // Return To The Message Loop - } + 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 - } + { + 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 - } + { + PostQuitMessage(0); // Send A Quit Message + return 0; // Jump Back + } case WM_KEYDOWN: // Update Keyboard Buffers For Keys Pressed - if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range? - { - g_engine->HoldKey_NoRepeat(wParam); - return 0; - } - break; // Break + if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range? + { + g_engine->HoldKey_NoRepeat(wParam); + return 0; + } + break; // Break case WM_KEYUP: // Update Keyboard Buffers For Keys Released - if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range? - { - g_engine->ReleaseKey(wParam); - return 0; // Return - } - break; + if ((wParam >= 0) && (wParam <= 255)) // Is Key (wParam) In A Valid Range? + { + g_engine->ReleaseKey(wParam); + return 0; // Return + } + break; case WM_LBUTTONDOWN: - { - return 0; - } + { + return 0; + } case WM_LBUTTONUP: - { - return 0; - } + { + return 0; + } case WM_RBUTTONDOWN: - { - return 0; - } + { + return 0; + } case WM_RBUTTONUP: - { - return 0; - } + { + return 0; + } case WM_MOUSEMOVE: - { - // Mint2D::SetMousePosition(LOWORD(lParam), HIWORD(lParam)); - return 0; - } + { + // Mint2D::SetMousePosition(LOWORD(lParam), HIWORD(lParam)); + return 0; + } case WM_SIZE: // Resize The OpenGL Window - { - - ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height - return 0; // Jump Back - } + { + ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); // LoWord=Width, HiWord=Height + return 0; // Jump Back + } } - // Pass All Unhandled Messages To DefWindowProc - return DefWindowProc(hWnd,uMsg,wParam,lParam); + // Pass All Unhandled Messages To DefWindowProc + return DefWindowProc(hWnd,uMsg,wParam,lParam); } bool JGEToggleFullscreen() { - return false; // Not implemented under windows + //cycle between the display modes + ++gDisplayMode; + if (gDisplayMode > DisplayMode_fullscreen) + gDisplayMode = DisplayMode_lowRes; + + int width = 0, height = 0; + RECT workArea; + // get the useable screen area (ie not including the windows taskbar, etc + SystemParametersInfo( SPI_GETWORKAREA, 0, (PVOID)&workArea, 0); + int actualScreenWidth = workArea.right - workArea.left; + int actualScreenHeight = workArea.bottom - workArea.top; + + switch (gDisplayMode) + { + case DisplayMode_fullscreen: + width = actualScreenWidth; + height = actualScreenHeight; + break; + + case DisplayMode_hiRes: + width = SCREEN_WIDTH * 2; + height = SCREEN_HEIGHT * 2; + break; + + case DisplayMode_lowRes: + default: + width = SCREEN_WIDTH; + height = SCREEN_HEIGHT; + break; + } + + int x = workArea.left + ((actualScreenWidth - width) / 2); + int y = workArea.top + ((actualScreenHeight - height) / 2); + + DWORD dwStyle; + DWORD dwExStyle = WS_EX_APPWINDOW; + if (gDisplayMode != DisplayMode_fullscreen) + { + dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_MINIMIZEBOX | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; + dwExStyle |= WS_EX_WINDOWEDGE; + } + + RECT windowRect; + windowRect.left = x; + windowRect.top = y; + + windowRect.right = windowRect.left + width; + windowRect.bottom = windowRect.top + height; + + AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); + + SetWindowPos(hWnd, NULL, windowRect.left, windowRect.top, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, 0); + ReSizeGLScene(width, height); + + return true; } -int WINAPI WinMain( HINSTANCE hInstance, // Instance - HINSTANCE hPrevInstance, // Previous Instance - LPSTR lpCmdLine, // Command Line Parameters - int nCmdShow) // Window Show State +int WINAPI WinMain( + HINSTANCE hInstance, // Instance + HINSTANCE hPrevInstance, // Previous Instance + LPSTR lpCmdLine, // Command Line Parameters + int nCmdShow) // Window Show State { - MSG msg; // Windows Message Structure - BOOL done=FALSE; // Bool Variable To Exit Loop + MSG msg; // Windows Message Structure + BOOL done=FALSE; // Bool Variable To Exit Loop - DWORD tickCount; - int dt; + DWORD tickCount; + int dt; - // 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 - // } + g_launcher = new JGameLauncher(); - g_launcher = new JGameLauncher(); + u32 flags = g_launcher->GetInitFlags(); - u32 flags = g_launcher->GetInitFlags(); + JGECreateDefaultBindings(); - JGECreateDefaultBindings(); + if ((flags&JINIT_FLAG_ENABLE3D)!=0) + JRenderer::Set3DFlag(true); - if ((flags&JINIT_FLAG_ENABLE3D)!=0) - JRenderer::Set3DFlag(true); - - // Create Our OpenGL Window - if (!CreateGLWindow(g_launcher->GetName(),SCREEN_WIDTH,SCREEN_HEIGHT,32,fullscreen)) + // Create Our OpenGL Window + if (!CreateGLWindow(g_launcher->GetName(),SCREEN_WIDTH,SCREEN_HEIGHT,32)) { - return 0; // Quit If Window Was Not Created + return 0; // Quit If Window Was Not Created } - while(!done) // Loop That Runs While done=FALSE + if (!InitGame()) // Initialize Our Game { - 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) // Program Active? - { - if (g_engine->IsDone()) - done=TRUE; // ESC Signalled A Quit - else // Not Time To Quit, Update Screen - { - tickCount = GetTickCount(); // Get The Tick Count - dt = (tickCount - lastTickCount); - lastTickCount = tickCount; - Update((float)dt/1000.0f); // Update frame - - //Mint2D::BackupKeys(); - - DrawGLScene(); // Draw The Scene - 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 OpenGL Framework",640,480,16,fullscreen)) - // { - // return 0; // Quit If Window Was Not Created - // } - // } - } + KillGLWindow(); // Reset The Display + MessageBox(NULL,"Game Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); + return FALSE; // Return FALSE } - if (g_launcher) - delete g_launcher; + 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) // Program Active? + { + if (g_engine->IsDone()) + done=TRUE; // ESC Signalled A Quit + else // Not Time To Quit, Update Screen + { + tickCount = GetTickCount(); // Get The Tick Count + dt = (tickCount - lastTickCount); + lastTickCount = tickCount; + Update((float)dt/1000.0f); // Update frame - // Shutdown - KillGLWindow(); // Kill The Window - return (msg.wParam); // Exit The Program + //Mint2D::BackupKeys(); + + DrawGLScene(); // Draw The Scene + SwapBuffers(hDC); // Swap Buffers (Double Buffering) + } + } + } + } + + if (g_launcher) + delete g_launcher; + + // Shutdown + DestroyGame(); + KillGLWindow(); // Kill The Window + return (msg.wParam); // Exit The Program }