//----------------------------------------------------------------------------- bool Init() { try { InitGL(); CGE_LoadLibrary(); CGE_Open(0); CGE_Resize(g_windowWidth, g_windowHeight); CGE_SetLibraryCallbackProc(OpenGlLibraryCallback); CGE_SetUserInterface(true, 96); //CGE_LoadSceneFromFile("c:\\projects\\humanoid_stand.wrl"); ShowOpenFileDialog(); return true; } catch (const std::exception &e) { std::ostringstream msg; msg << "Application initialization failed!" << std::endl << std::endl; msg << e.what(); MessageBox(g_hWnd, msg.str().c_str(), "Error", MB_ICONERROR); return false; } }
//----------------------------------------------------------------------------- void ToggleFullScreen() { static DWORD savedExStyle; static DWORD savedStyle; static RECT rcSaved; g_isFullScreen = !g_isFullScreen; if (g_isFullScreen) { // Moving to full screen mode. savedExStyle = GetWindowLong(g_hWnd, GWL_EXSTYLE); savedStyle = GetWindowLong(g_hWnd, GWL_STYLE); GetWindowRect(g_hWnd, &rcSaved); SetWindowLong(g_hWnd, GWL_EXSTYLE, 0); SetWindowLong(g_hWnd, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); SetWindowPos(g_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_SHOWWINDOW); g_windowWidth = GetSystemMetrics(SM_CXSCREEN); g_windowHeight = GetSystemMetrics(SM_CYSCREEN); SetWindowPos(g_hWnd, HWND_TOPMOST, 0, 0, g_windowWidth, g_windowHeight, SWP_SHOWWINDOW); } else { // Moving back to windowed mode. SetWindowLong(g_hWnd, GWL_EXSTYLE, savedExStyle); SetWindowLong(g_hWnd, GWL_STYLE, savedStyle); SetWindowPos(g_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_SHOWWINDOW); g_windowWidth = rcSaved.right - rcSaved.left; g_windowHeight = rcSaved.bottom - rcSaved.top; SetWindowPos(g_hWnd, HWND_NOTOPMOST, rcSaved.left, rcSaved.top, g_windowWidth, g_windowHeight, SWP_SHOWWINDOW); } CGE_Resize(g_windowWidth, g_windowHeight); }
//----------------------------------------------------------------------------- LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_ACTIVATE: switch (wParam) { default: break; case WA_ACTIVE: case WA_CLICKACTIVE: g_hasFocus = true; break; case WA_INACTIVE: if (g_isFullScreen) ShowWindow(hWnd, SW_MINIMIZE); g_hasFocus = false; break; } break; case WM_ERASEBKGND: if (IsWindowEnabled(hWnd)) { wglMakeCurrent(g_hDC, g_hRC); CGE_Render(); // do not draw in WM_PAINT (inspired in CastleWindow) SwapBuffers(g_hDC); } return TRUE; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: CGE_MouseDown(GET_X_LPARAM(lParam), g_windowHeight-1-GET_Y_LPARAM(lParam), msg==WM_LBUTTONDOWN, 0); SetCapture(hWnd); break; case WM_MOUSEMOVE: CGE_Motion(GET_X_LPARAM(lParam), g_windowHeight-1-GET_Y_LPARAM(lParam), 0); break; case WM_LBUTTONUP: case WM_RBUTTONUP: CGE_MouseUp(GET_X_LPARAM(lParam), g_windowHeight-1-GET_Y_LPARAM(lParam), msg==WM_LBUTTONUP, 0, true); if (GetCapture()==hWnd) ReleaseCapture(); break; case WM_MOUSEWHEEL: CGE_MouseWheel(GET_WHEEL_DELTA_WPARAM(wParam), true); break; case WM_CHAR: switch (wParam) { case VK_ESCAPE: PostMessage(hWnd, WM_CLOSE, 0, 0); break; case 's': CGE_SaveScreenshotToFile("screenshot.jpg"); break; case 'f': CGE_SetNavigationType(ecgenavFly); break; case 'e': { int nVal = CGE_GetVariableInt(ecgevarEffectSSAO); if (nVal < 0) nVal = 0; CGE_SetVariableInt(ecgevarEffectSSAO, 1-nVal); } break; case 'h': { int nVal = CGE_GetVariableInt(ecgevarWalkHeadBobbing); if (nVal < 0) nVal = 0; CGE_SetVariableInt(ecgevarWalkHeadBobbing, 1-nVal); } break; default: break; } break; case WM_KEYDOWN: switch (wParam) { case VK_PRIOR: // PageUp - move to previous viewpoint if (g_nViewpointCount > 0) { if (g_nCurrentViewpoint > 0) g_nCurrentViewpoint--; else g_nCurrentViewpoint = g_nViewpointCount-1; CGE_MoveToViewpoint(g_nCurrentViewpoint, true); } break; case VK_NEXT: // PageDown - move to next viewpoint if (g_nViewpointCount > 0) { if (g_nCurrentViewpoint < g_nViewpointCount-1) g_nCurrentViewpoint++; else g_nCurrentViewpoint = 0; CGE_MoveToViewpoint(g_nCurrentViewpoint, true); } break; default: break; } break; case WM_DESTROY: Cleanup(); PostQuitMessage(0); return 0; case WM_SIZE: g_windowWidth = LOWORD(lParam); g_windowHeight = HIWORD(lParam); CGE_Resize(g_windowWidth, g_windowHeight); break; case WM_SYSKEYDOWN: if (wParam == VK_RETURN) // Alt + Enter ToggleFullScreen(); break; default: break; } return DefWindowProc(hWnd, msg, wParam, lParam); }